Linux CXL
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: John Snow <jsnow@redhat.com>
Cc: "Daniel P. Berrangé" <berrange@redhat.com>,
	qemu-devel@nongnu.org, "Alex Williamson" <alex@shazbot.org>,
	linux-cxl@vger.kernel.org, "Michael Tokarev" <mjt@tls.msk.ru>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>,
	"Peter Xu" <peterx@redhat.com>, "Eric Blake" <eblake@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"zhenwei pi" <zhenwei.pi@linux.dev>,
	qemu-trivial@nongnu.org, "Fabiano Rosas" <farosas@suse.de>,
	"Kevin Wolf" <kwolf@redhat.com>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Jiri Pirko" <jiri@resnulli.us>,
	qemu-block@nongnu.org, "Stefan Hajnoczi" <stefanha@redhat.com>,
	"Stefan Berger" <stefanb@linux.vnet.ibm.com>,
	linux-edac@vger.kernel.org,
	"Gonglei (Arei)" <arei.gonglei@huawei.com>,
	"Igor Mammedov" <imammedo@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Jonathan Cameron" <jic23@kernel.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Zhao Liu" <zhao1.liu@intel.com>,
	"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>,
	"Jason Wang" <jasowangio@gmail.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Ani Sinha" <anisinha@redhat.com>,
	"Philippe Mathieu-Daudé" <philmd@mailo.com>,
	"Lukas Straub" <lukasstraub2@web.de>,
	"Cédric Le Goater" <clg@redhat.com>
Subject: Re: [PATCH v3 01/43] qapi: convert trivial intro sections for error.json
Date: Tue, 01 Sep 2026 12:09:59 +0200	[thread overview]
Message-ID: <87a4q19tag.fsf@pond.sub.org> (raw)
In-Reply-To: <CAFn=p-bUTApw73Ddz-tH1FzY97Ct5rfFZ=domFhm-OO3G8COug@mail.gmail.com> (John Snow's message of "Mon, 31 Aug 2026 14:43:50 -0400")

John Snow <jsnow@redhat.com> writes:

> On Thu, Aug 27, 2026 at 9:39 AM Daniel P. Berrangé <berrange@redhat.com> wrote:
>>
>> On Thu, Aug 27, 2026 at 03:09:35PM +0200, Markus Armbruster wrote:
>> > Daniel P. Berrangé <berrange@redhat.com> writes:
>> >
>> > > On Wed, Aug 26, 2026 at 03:37:58PM -0400, John Snow wrote:
>> > >> Signed-off-by: John Snow <jsnow@redhat.com>
>> > >> ---
>> > >>  qapi/error.json | 3 +--
>> > >>  1 file changed, 1 insertion(+), 2 deletions(-)
>> > >>
>> > >> diff --git a/qapi/error.json b/qapi/error.json
>> > >> index 54cb02fb880..a53b13e55c9 100644
>> > >> --- a/qapi/error.json
>> > >> +++ b/qapi/error.json
>> > >> @@ -9,8 +9,7 @@
>> > >>
>> > >>  ##
>> > >>  # @QapiErrorClass:
>> > >> -#
>> > >> -# QEMU error classes
>> > >> +#     QEMU error classes
>> > >
>> > > Where is this need for indent coming from ?  From the POV of someone
>> > > writing comments, the need to indent the introductory text like this
>> > > feels very counter-intuitive, an exception from any other inline
>> > > docs syntax I've typically used. Is there any way we can avoid this ?
>> >
>> > The cover letter explains the need:
>>
>> Yes, I just didn't see the connection from that, to the use
>> of indent.

Writing good cover letters is hard.

>> >
>> >     This is being done primarily for the benefit of the forthcoming
>> >     "inliner", a feature for the rendered HTML QMP documentation that
>> >     seeks to "inline" QMP command argument documentation into the argument
>> >     list for each command.
>> >
>> >     There are two main motives here:
>> >
>> >     (1) We want the split between the "introduction" and "details"
>> >         sections to be mechanically obvious, so that auto-generated or
>> >         inlined documentation has a well-defined, obvious spot to go.
>> >
>> >     (2) We do not want to inline irrelevant, introductory text describing
>> >         structures to be copied into command documentation.
>>
>> So IIUC, you're saying that we are going to rely on indentation
>> to distinguish introduction from details ?

Yes.

We are already relying on indentation elsewhere.  For instance:

    # @fatal: if set, the image is marked corrupt and therefore unusable
    #     after this event and must be repaired (Since 2.2; before, every
    #     `BLOCK_IMAGE_CORRUPTED` event was fatal)
    #
    # .. note:: If action is "stop", a `STOP` event will eventually follow
    #    the `BLOCK_IO_ERROR` event.

The description of @fatal is indented.  A non-indented line ends it.
The non-indented line happens to be a Sphinx directive here, but that's
immaterial (the QAPI doc comment parser does not attempt to parse ReST).

>> > Note that the inliner elided Netdev's Intro "Captures the configuration
>> > of a network device."
>> >
>> > However, when Intro and Details bleed together, the inliner elides more
>> > than it should.  I consider that a fairly serious issue.
>> >
>> > I'm afraid forgetting to mark the end of Intro with "Details:" would be
>> > a common mistake, easy to miss in review.  So I explored possible
>> > alternatives:
>> >
>> >     Subject: Re: [PATCH v2 00/10] qapi: enforce section ordering
>> >     Date: Wed, 15 Apr 2026 11:43:45 +0200
>> >     Message-ID: <87zf341ru6.fsf@pond.sub.org>
>> >     https://lore.kernel.org/qemu-devel/87zf341ru6.fsf@pond.sub.org/
>> >
>> > John is working towards "3. Make the end of intro syntactically obvious"
>> > always, specifically "3c. Indent intro like descriptions and tagged
>> > sections" with the ultimate goal to reject unindented Intro.  That way,
>> > we cannot write an Intro with an unclear end.  John, correct me if I'm
>> > accidentally misrepresenting your work.
>> >
>> > Questions?  Better ideas?
>>
>> As an author, how substantive is "Intro" expected to be? I guess on
>> QAPI docs I've written I've not ever been aware of there even being
>> a distinct concept of Intro vs Details to think about. It is all just
>> some lines of prose to me.

That's deceptive :)

Consider

    ##
    # @HV_BALLOON_STATUS_REPORT:
    #
    # Emitted when the hv-balloon driver receives a "STATUS" message from
    # the guest.
    #
    # .. note:: This event is rate-limited.
    #
    # Since: 8.2
    #
    # .. qmp-example::
    #
    #     <- { "event": "HV_BALLOON_STATUS_REPORT",
    #          "data": { "committed": 816640000, "available": 3333054464 },
    #          "timestamp": { "seconds": 1600295492, "microseconds": 661044 } }
    ##
    { 'event': 'HV_BALLOON_STATUS_REPORT',
      'data': 'HvBalloonInfo' }

Rendered documentation looks like

    Event HV_BALLOON_STATUS_REPORT (Since: 8.2)

       Emitted when the hv-balloon driver receives a "STATUS" message from
       the guest.

       Note:

         This event is rate-limited.

       Members:
          * The members of "HvBalloonInfo".

       Example::

          <- { "event": "HV_BALLOON_STATUS_REPORT",
               "data": { "committed": 816640000, "available": 3333054464 },
               "timestamp": { "seconds": 1600295492, "microseconds": 661044 } }

Where does "Members:" come from?  Its generated.

If we move "Since:" to the end of the doc comment, we instead get

    Event HV_BALLOON_STATUS_REPORT (Since: 8.2)

       Emitted when the hv-balloon driver receives a "STATUS" message from
       the guest.

       Note:

         This event is rate-limited.

       Example::

          <- { "event": "HV_BALLOON_STATUS_REPORT",
               "data": { "committed": 816640000, "available": 3333054464 },
               "timestamp": { "seconds": 1600295492, "microseconds": 661044 } }

       Members:
          * The members of "HvBalloonInfo".

This one is clearly bad.  The fact that an innocent move of "Since:" can
make the rendered docs worse is a defect in the QAPI doc system.

But even the first version isn't quite what we want.  We want Members:
further up, like this:

    Event HV_BALLOON_STATUS_REPORT (Since: 8.2)

       Emitted when the hv-balloon driver receives a "STATUS" message from
       the guest.

       Members:
          * The members of "HvBalloonInfo".

       Note:

         This event is rate-limited.

       Example::

          <- { "event": "HV_BALLOON_STATUS_REPORT",
               "data": { "committed": 816640000, "available": 3333054464 },
               "timestamp": { "seconds": 1600295492, "microseconds": 661044 } }

Now we're ready to discuss "intro" vs. "details.  Their separation
matters in this example, because the generated "Members:" go right after
"intro".

The root of the problem is a syntactic ambiguity.  "Intro" is commonly
followed by some "@argument: ...", "Return:", "Error:", or similar.  But
these are all optional.  When they're absent, the what's "intro" and
what's "details" is syntactically ambiguous.

The doc comment I used as example abuses "Since:" to separate them.

> In most cases, not very substantial. For commands and events, it *can*
> be quite a bit more substantial. For structs, enums, etc it is almost
> always laughably trivial.
>
> When the syntactical delineation of intro is complete, further QAPI
> parser changes will make it even more obvious: any free text that
> exists between the intro and the other sections will be flagged as an
> error, where you will be urged to move any detail text to below the
> metadata fields. This physical relocation will help suggest to the
> documentation author what goes "above the fold" and what goes "below
> the fold", so to speak.

This is part of our slow move towards a standard doc comment structure,
ultimately enforced by the generator.  Standard structure helps readers.

>> My only alternative idea to indentation would be to declare that the
>> "Intro" is always the 1st paragraph of text and anything beyond that
>> is the "Details". That might match up with the way that contributors
>> naturally write text where the 1st paragraph conveys the key idea,
>> such that they dno't need to think about Intro vs Details as a
>> concept.
>
> Yeah, that's roughly the idea; and some prototypes used this idea in
> the past - but Markus wanted an explicit, obvious delineation
> precisely to *force* documentation authors to think about the split.
> It has implications for what gets generated into the documentation and
> in which scenarios.

"First paragraph is intro" is workable syntax.  It restricts "intro" to
a single paragraph", which is unlikely to be a serious problem.
However, the restriction is easy to forget.  If you write two paragraphs
(because "it is all just some lines of prose"), the rendering can
surprise you, in a bad way.

Having to indent "intro" forces you to be explicit, and avoids
surprises.

> I do usually try to make my upgrades "invisible" to the user, but in
> this case I believe we are erring on the side of "explicit is better
> than implicit" because of the implications of the text not always
> being copied in a precisely straightforward manner to the HTML docs.

Blame it on me: I pushed John towards explicit.

> I will address the subtleties of this issue when the inliner is being
> merged by updating a documentation writer's guide that covers what
> goes where and why. For now, we are just trying to do the bulk
> conversion.
>
>>
>> With regards,
>> Daniel
>
> --js


  reply	other threads:[~2026-09-01 10:10 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-26 19:37 [PATCH v3 00/43] qapi: convert (very) trivial intro sections John Snow
2026-08-26 19:37 ` [PATCH v3 01/43] qapi: convert trivial intro sections for error.json John Snow
2026-08-27  8:43   ` Philippe Mathieu-Daudé
2026-08-27  9:10   ` Daniel P. Berrangé
2026-08-27 13:09     ` Markus Armbruster
2026-08-27 13:39       ` Daniel P. Berrangé
2026-08-31 18:43         ` John Snow
2026-09-01 10:09           ` Markus Armbruster [this message]
2026-08-26 19:37 ` [PATCH v3 02/43] qapi: convert trivial intro sections for acpi-hest.json John Snow
2026-08-26 19:38 ` [PATCH v3 03/43] qapi: convert trivial intro sections for ebpf.json John Snow
2026-08-26 19:38 ` [PATCH v3 04/43] qapi: convert trivial intro sections for compat.json John Snow
2026-08-26 19:38 ` [PATCH v3 05/43] qapi: convert trivial intro sections for vfio.json John Snow
2026-08-31 14:07   ` Cédric Le Goater
2026-08-26 19:38 ` [PATCH v3 06/43] qapi: convert trivial intro sections for trace.json John Snow
2026-08-26 19:38 ` [PATCH v3 07/43] qapi: convert trivial intro sections for misc-arm.json John Snow
2026-08-26 19:38 ` [PATCH v3 08/43] qapi: convert trivial intro sections for cryptodev.json John Snow
2026-08-26 19:38 ` [PATCH v3 09/43] qapi: convert trivial intro sections for machine-common.json John Snow
2026-08-26 19:38 ` [PATCH v3 10/43] qapi: convert trivial intro sections for accelerator.json John Snow
2026-08-27  8:39   ` Philippe Mathieu-Daudé
2026-08-26 19:38 ` [PATCH v3 11/43] qapi: convert trivial intro sections for authz.json John Snow
2026-08-26 19:38 ` [PATCH v3 12/43] qapi: convert trivial intro sections for yank.json John Snow
2026-08-26 19:38 ` [PATCH v3 13/43] qapi: convert trivial intro sections for replay.json John Snow
2026-08-26 19:38 ` [PATCH v3 14/43] qapi: convert trivial intro sections for machine-s390x.json John Snow
2026-08-26 19:38 ` [PATCH v3 15/43] qapi: convert trivial intro sections for acpi.json John Snow
2026-08-26 19:38 ` [PATCH v3 16/43] qapi: convert trivial intro sections for tpm.json John Snow
2026-08-26 19:38 ` [PATCH v3 17/43] qapi: convert trivial intro sections for qdev.json John Snow
2026-08-27  8:39   ` Philippe Mathieu-Daudé
2026-08-26 19:38 ` [PATCH v3 18/43] qapi: convert trivial intro sections for control.json John Snow
2026-08-26 19:38 ` [PATCH v3 19/43] qapi: convert trivial intro sections for dump.json John Snow
2026-08-26 19:38 ` [PATCH v3 20/43] qapi: convert trivial intro sections for common.json John Snow
2026-08-26 19:38 ` [PATCH v3 21/43] qapi: convert trivial intro sections for sockets.json John Snow
2026-08-26 19:38 ` [PATCH v3 22/43] qapi: convert trivial intro sections for transaction.json John Snow
2026-08-26 19:38 ` [PATCH v3 23/43] qapi: convert trivial intro sections for stats.json John Snow
2026-08-26 19:38 ` [PATCH v3 24/43] qapi: convert trivial intro sections for job.json John Snow
2026-08-26 19:38 ` [PATCH v3 25/43] qapi: convert trivial intro sections for pci.json John Snow
2026-08-27  8:40   ` Philippe Mathieu-Daudé
2026-08-26 19:38 ` [PATCH v3 26/43] qapi: convert trivial intro sections for introspect.json John Snow
2026-08-26 19:38 ` [PATCH v3 27/43] qapi: convert trivial intro sections for rocker.json John Snow
2026-08-26 19:38 ` [PATCH v3 28/43] qapi: convert trivial intro sections for misc-i386.json John Snow
2026-08-26 19:38 ` [PATCH v3 29/43] qapi: convert trivial intro sections for block-export.json John Snow
2026-08-26 19:38 ` [PATCH v3 30/43] qapi: convert trivial intro sections for audio.json John Snow
2026-08-26 19:38 ` [PATCH v3 31/43] qapi: convert trivial intro sections for block.json John Snow
2026-08-31 13:52   ` Markus Armbruster
2026-08-31 18:55     ` John Snow
2026-08-26 19:38 ` [PATCH v3 32/43] qapi: convert trivial intro sections for misc.json John Snow
2026-08-26 19:38 ` [PATCH v3 33/43] qapi: convert trivial intro sections for crypto.json John Snow
2026-08-26 19:38 ` [PATCH v3 34/43] qapi: convert trivial intro sections for cxl.json John Snow
2026-08-26 19:38 ` [PATCH v3 35/43] qapi: convert trivial intro sections for run-state.json John Snow
2026-08-27  8:41   ` Philippe Mathieu-Daudé
2026-08-26 19:38 ` [PATCH v3 36/43] qapi: convert trivial intro sections for char.json John Snow
2026-08-26 19:38 ` [PATCH v3 37/43] qapi: convert trivial intro sections for virtio.json John Snow
2026-08-26 19:38 ` [PATCH v3 38/43] qapi: convert trivial intro sections for net.json John Snow
2026-08-26 19:38 ` [PATCH v3 39/43] qapi: convert trivial intro sections for qom.json John Snow
2026-08-27  8:42   ` Philippe Mathieu-Daudé
2026-08-26 19:38 ` [PATCH v3 40/43] qapi: convert trivial intro sections for ui.json John Snow
2026-08-26 19:38 ` [PATCH v3 41/43] qapi: convert trivial intro sections for migration.json John Snow
2026-08-26 19:38 ` [PATCH v3 42/43] qapi: convert trivial intro sections for machine.json John Snow
2026-08-27  8:42   ` Philippe Mathieu-Daudé
2026-08-31 13:36   ` Markus Armbruster
2026-08-31 13:50     ` Markus Armbruster
2026-08-26 19:38 ` [PATCH v3 43/43] qapi: convert trivial intro sections for block-core.json John Snow
2026-08-31 13:32   ` Markus Armbruster
2026-08-31 14:27 ` [PATCH v3 00/43] qapi: convert (very) trivial intro sections Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87a4q19tag.fsf@pond.sub.org \
    --to=armbru@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=alex@shazbot.org \
    --cc=anisinha@redhat.com \
    --cc=arei.gonglei@huawei.com \
    --cc=berrange@redhat.com \
    --cc=clg@redhat.com \
    --cc=eblake@redhat.com \
    --cc=farosas@suse.de \
    --cc=hreitz@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jasowangio@gmail.com \
    --cc=jic23@kernel.org \
    --cc=jiri@resnulli.us \
    --cc=jsnow@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=laurent@vivier.eu \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-edac@vger.kernel.org \
    --cc=lukasstraub2@web.de \
    --cc=marcandre.lureau@redhat.com \
    --cc=mchehab+huawei@kernel.org \
    --cc=mjt@tls.msk.ru \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterx@redhat.com \
    --cc=philmd@mailo.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-trivial@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=stefanb@linux.vnet.ibm.com \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@yandex-team.ru \
    --cc=zhao1.liu@intel.com \
    --cc=zhenwei.pi@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox