From: Jiri Pirko <jiri@resnulli.us>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org,
linux-api@vger.kernel.org, x86@kernel.org, kvm@vger.kernel.org,
linux-doc@vger.kernel.org, jgg@ziepe.ca,
david.quigley@intel.com, lukas@wunner.de, ksinyuk@kernel.org,
rodrigo.vivi@intel.com, cedric.xing@intel.com, sameo@meta.com,
drdeeglaze@gmail.com, James.Bottomley@hansenpartnership.com,
aik@amd.com, jpiotrowski@nvidia.com, qinkun@google.com,
pgonda@google.com, jic23@kernel.org, alistair.francis@wdc.com,
ankita@nvidia.com, suzuki.poulose@arm.com, kas@kernel.org,
rick.p.edgecombe@intel.com, elena.reshetova@intel.com,
dave.hansen@linux.intel.com,
sathyanarayanan.kuppuswamy@linux.intel.com,
peter.fang@intel.com
Subject: Re: [PATCH RFC 13/20] Documentation: ctlv: Describe how to write a family
Date: Wed, 21 Oct 2026 16:23:17 +0200 [thread overview]
Message-ID: <atjEgLYpgbZNzfkZ@FV6GYCPJ69> (raw)
In-Reply-To: <179245258505.58760.3972297562218204862.b4-review@b4>
Tue, Oct 20, 2026 at 01:29:45AM +0200, jgg@nvidia.com wrote:
>> [ ... 34 lines skipped ... ]
>> +Add the specification, registry entry, and output manifest entry in one change::
>> +
>> + Documentation/ctlv/specs/ctlv-example.yaml
>> + Documentation/ctlv/families.yaml
>> + Documentation/ctlv/generated-files.yaml
>> +
>> +``families.yaml`` is append-only. Its array index is the family ID and is part
>> +of every generated attribute and operation ID. Never reorder, remove, rename,
>> +or reuse an entry. ``Documentation/ctlv/abi/families.registry.yaml`` is the
>> +checked-in registry ABI. The output manifest selects the generated UAPI,
>> +kernel and userspace paths and generation modes.
>> +
>> +Generate and verify them with::
>> +
>> + make -C tools/ctlv regen
>> + make -C tools/ctlv all
>> +
>
>Maybe mention to inspect git diff and ensure nothing unexpected
>changed?
Okay.
>
>> +Never edit a generated output. Change the YAML or generator and regenerate it.
>> +Optional RST reference pages are written to
>> +``Documentation/output/ctlv/families`` by::
>> +
>> + make -C tools/ctlv docs
>> +
>> +Write the specification
>> +=======================
>> +
>
>Before introducing the YAML, write out in a more plain text form
>exactly what system calls the example is aiming to create with. I came
>up with:
>
>For an example, define two system calls from userspace that look like this::
>
> item_set_action(u64 index, string label?, blob data?) -> status;
> items_dump_query() -> { u64 index; string label?; }[];
>
>And one event::
>
> item_changed_event -> { u64 index; string label?; };
>
>``index`` is 0..4095, ``label`` is at most 63 bytes excluding NUL, and ``data``
>is at most 1 MiB with 8-byte alignment.
Okay.
>
>> +.. code-block:: yaml
>> +
>> + # SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
>> + %YAML 1.2
>> + ---
>> + family:
>> + name: ctlv-example
>> + inherits: ctlv
>> + post-init: true
>> + pre-fini: true
>> +
>> + attr-groups:
>> + - name: item
>> + attrs:
>> + - name: index
>> + type: uint
>> + max: 4095
>> + - name: label
>> + type: string
>> + max-length: 63
>> + - name: data
>> + blob:
>> + direction: input
>> + allowed-backings: [ va ]
>> + max-length: 1048576
>> + alignment: 8
>> + - name: list
>> + attrs:
>> + - name: item
>> + attrs: item-reply
>> + max-occurrences: unlimited
>> +
>> + attr-sets:
>> + - name: item-request
>> + attrs: item.index
>> + optional-attrs:
>> + - item.label
>> + - item.data
>> + - name: item-reply
>> + attrs: item.index
>> + optional-attrs: item.label
>> + - name: items-reply
>> + optional-attrs: list.item
>
>I haven't quite figured out what attr-sets is about. I think these
>blocks should have some # comments with more guidance what is going on.
"group" defines attrs with all the description once. "set" just puts
together multiple atrrs from multiple groups. Will try to document it
more clearly.
>
>> +
>> + ops:
>> + - name: item-set
>> + type: action
>> + optional: true
>> + request:
>> + attrs: item-request
>> + - name: items-dump
>> + type: query
>> + availability: dynamic
>> + pre-post: true
>> + reply:
>> + attrs: items-reply
>> + suggested-reply-length: 4096
>> + - name: item-changed
>> + type: event
>> + reply:
>> + attrs: item-reply
>> +
>> +An attribute has one payload form: ``type``, ``enum``, ``flags``, ``attrs``, or
>> +``blob``. An attr set names one message level. ``attrs`` are required and
>> +``optional-attrs`` are optional. Its bounds and membership are ABI.
>
>The attribute first point of view is maybe a little too netlinky, I
>prefer to think of this as a system call first, with a first class
>'query' to get a list of things
>
>Alot of stuff this is going to deal with won't be the netlink esque
>'dump a table, set a table' kind of flow, but a bunch of different
>system calls with arguments.
Can you elaborate a bit more about this please? I'm not clear about what
you mean by this. "'query' to get a list of things" sound cryptic to me.
Are you talking about doc or about family yaml as well?
>
>> +
>> +Inheritance and extension points
>> +================================
>> +
>> +A descendant implements only the operations it declares. Inherited operations
>> +keep the callbacks and operation hooks of their declaring family. Every module
>> +therefore depends on the module containing its parent implementation.
>> +
>
>This section seems hard to understand, it is missing something
>explaining the purpose an intended usage of this mechanism. I think I
>get it..
>
>Maybe structure this to be an improvement to the first example solving
>a specific problem 'like the HW driver need to add per-driver
>things to the scheme'
Okay.
>
>Also please use a more neutral term like "HW driver" not vendor
>throughout.
Okay.
>
>> +A parent reserves an extension point with an empty stub set:
>> +
>> +.. code-block:: yaml
>> +
>> + attr-groups:
>> + - name: device
>> + attrs:
>> + - name: details
>> + attrs: details-extension
>> +
>> + attr-sets:
>> + - name: details-extension
>> + stub: true
>> + - name: device-reply
>> + optional-attrs: device.details
>> +
>> +A child fills that same set:
>> +
>> +.. code-block:: yaml
>> +
>> + family:
>> + name: ctlv-example-vendor
>> + inherits: ctlv-example
>> + pre-init: true
>> +
>> + attr-groups:
>> + - name: vendor
>> + attrs:
>> + - name: serial
>> + type: uint
>> +
>> + attr-sets:
>> + - name: details-extension
>> + optional-attrs: vendor.serial
>> +
>> +The parent implementation opens the physical nest and delegates its members:
>> +
>> +.. code-block:: c
>> +
>> + if (ctlv_example_device_details_start(reply, &details)) {
>> + ret = ctlv_stub_fill(ctx, request_details, &details);
>> + ctlv_nest_end(&details);
>> + if (ret)
>> + return ret;
>> + }
>> +
>> +The generated child callback fills it:
>> +
>> +.. code-block:: c
>> +
>> + int ctlv_example_vendor_details_extension_fill(
>> + void *priv, struct ctlv_op_ctx *ctx,
>> + const struct ctlv_cursor *request,
>> + struct ctlv_cursor *nest)
>> + {
>> + ctlv_example_vendor_vendor_serial_put(nest,
>> + example_serial(priv));
>> + return 0;
>> + }
>
>I suppose this like RDMA and each HW driver using this gets its own
>full scheme tree that only has its own stuff in it?
It's the "family". Each child inheriting a subsystem family. It fills
up the subsystem family defines stubs/extensions. It can add ops too.
>
>What about userspace, it "knows" somehow what to do?
Userspace sees the family chain. It also has ability to do introspection
seeing right away which op supports with attrs in which nests.
>
>> +
>> +An unfilled stub contributes no nest or message length. Neither side names the
>> +family on the other side.
>
>One of the things I feel strongly about from iommufd is that it should
>be really obvious what HW drivers is being affiliated with these
>operations that have a HW driver struct linked to them.
>
>So, like, if userspace does a query and gets back an item that has one
>of these extended structs it should have a trivial way to branch to
>the right handler for it. Inspecting the attributes doesn't seem like
>a great way to go about that?
>
>Is there some place to put an ID of 'ctlv-example-vendor' someplace?
>Like in the nest start somehow?
Already there. Each attr including nest contains family id. So a fill
of a parent stub/extension by HW driver contains a family id of that
family.
next prev parent reply other threads:[~2026-10-21 14:23 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 14:50 [PATCH RFC 00/20] attestation: Add a common subsystem and TDX support Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 01/20] ctlv: Add the schema language and generator Jiri Pirko
2026-10-15 14:58 ` sashiko-bot
2026-10-20 22:31 ` Jonathan Cameron
2026-10-21 13:23 ` Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 02/20] ctlv: Add the UAPI wire format and family API Jiri Pirko
2026-10-19 23:29 ` Jason Gunthorpe
2026-10-20 12:26 ` Jiri Pirko
2026-10-20 23:00 ` Jonathan Cameron
2026-10-20 23:39 ` Jonathan Cameron
2026-10-21 13:54 ` Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 03/20] ctlv: Add the root family specification and generated files Jiri Pirko
2026-10-19 23:29 ` Jason Gunthorpe
2026-10-20 12:28 ` Jiri Pirko
2026-10-20 12:55 ` Jason Gunthorpe
2026-10-20 14:07 ` Jiri Pirko
2026-10-20 23:30 ` Jonathan Cameron
2026-10-21 16:25 ` Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 04/20] Documentation: ctlv: Add userspace ABI Jiri Pirko
2026-10-19 23:29 ` Jason Gunthorpe
2026-10-20 14:06 ` Jiri Pirko
2026-10-21 0:11 ` Jonathan Cameron
2026-10-15 14:50 ` [PATCH RFC 05/20] ctlv: Prepare message input handling Jiri Pirko
2026-10-15 15:06 ` sashiko-bot
2026-10-21 0:43 ` Jonathan Cameron
2026-10-15 14:50 ` [PATCH RFC 06/20] ctlv: Prepare blob descriptor validation Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 07/20] ctlv: Prepare schema validation Jiri Pirko
2026-10-15 15:14 ` sashiko-bot
2026-10-15 14:50 ` [PATCH RFC 08/20] ctlv: Prepare message output handling Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 09/20] ctlv: Prepare VA blob handling Jiri Pirko
2026-10-15 15:14 ` sashiko-bot
2026-10-15 14:50 ` [PATCH RFC 10/20] ctlv: Prepare event queue support Jiri Pirko
2026-10-15 15:22 ` sashiko-bot
2026-10-21 1:12 ` Jonathan Cameron
2026-10-15 14:50 ` [PATCH RFC 11/20] ctlv: Prepare runtime introspection Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 12/20] ctlv: Add device and operation dispatch Jiri Pirko
2026-10-15 15:28 ` sashiko-bot
2026-10-21 1:25 ` Jonathan Cameron
2026-10-15 14:50 ` [PATCH RFC 13/20] Documentation: ctlv: Describe how to write a family Jiri Pirko
2026-10-15 15:20 ` sashiko-bot
2026-10-19 23:29 ` Jason Gunthorpe
2026-10-21 14:23 ` Jiri Pirko [this message]
2026-10-21 14:49 ` Jason Gunthorpe
2026-10-21 16:24 ` Jiri Pirko
2026-10-21 16:48 ` Jason Gunthorpe
2026-10-15 14:50 ` [PATCH RFC 14/20] attestation: Add the base family specification and generated files Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 15/20] attestation: Prepare provider and instance core Jiri Pirko
2026-10-15 15:30 ` sashiko-bot
2026-10-19 23:29 ` Jason Gunthorpe
2026-10-21 13:04 ` Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 16/20] attestation: Prepare measurement register journal Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 17/20] attestation: Add CTLV operation handling Jiri Pirko
2026-10-15 15:33 ` sashiko-bot
2026-10-15 14:50 ` [PATCH RFC 18/20] tdx-guest: Expose the native attestation service API Jiri Pirko
2026-10-15 15:40 ` sashiko-bot
2026-10-15 14:50 ` [PATCH RFC 19/20] attestation: Add the TDX family specification and generated files Jiri Pirko
2026-10-15 14:50 ` [PATCH RFC 20/20] attestation: Add the TDX family implementation Jiri Pirko
2026-10-15 15:40 ` sashiko-bot
2026-10-16 23:43 ` [PATCH RFC 00/20] attestation: Add a common subsystem and TDX support Jason Gunthorpe
2026-10-17 18:16 ` Dionna Glaze
2026-10-17 19:06 ` Jarkko Sakkinen
2026-10-17 19:08 ` Jarkko Sakkinen
2026-10-17 19:22 ` Jarkko Sakkinen
2026-10-17 20:55 ` Jason Gunthorpe
2026-10-17 21:14 ` Jarkko Sakkinen
2026-10-17 20:34 ` Jason Gunthorpe
2026-10-17 20:55 ` Jarkko Sakkinen
2026-10-17 23:10 ` Jason Gunthorpe
2026-10-18 23:53 ` Dionna Glaze
2026-10-19 12:08 ` Jiri Pirko
2026-10-19 16:10 ` Dionna Glaze
2026-10-19 22:56 ` Jason Gunthorpe
2026-10-21 8:33 ` Jiri Pirko
2026-10-21 14:12 ` Mimi Zohar
2026-10-21 14:35 ` Jason Gunthorpe
2026-10-20 9:26 ` Jiri Pirko
2026-10-20 13:45 ` Mimi Zohar
2026-10-20 14:06 ` Jason Gunthorpe
2026-10-20 15:22 ` Mimi Zohar
2026-10-20 16:11 ` Yeoreum Yun
2026-10-20 16:52 ` Jason Gunthorpe
2026-10-21 12:23 ` Mimi Zohar
2026-10-21 13:18 ` Jarkko Sakkinen
2026-10-21 13:50 ` Yeoreum Yun
2026-10-21 13:51 ` Jason Gunthorpe
2026-10-21 14:31 ` Mimi Zohar
2026-10-21 14:39 ` Jason Gunthorpe
2026-10-21 12:48 ` James Bottomley
2026-10-21 13:55 ` Jason Gunthorpe
2026-10-19 12:40 ` Jarkko Sakkinen
2026-10-19 23:11 ` Jason Gunthorpe
2026-10-20 12:49 ` James Bottomley
2026-10-20 13:13 ` Jason Gunthorpe
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=atjEgLYpgbZNzfkZ@FV6GYCPJ69 \
--to=jiri@resnulli.us \
--cc=James.Bottomley@hansenpartnership.com \
--cc=aik@amd.com \
--cc=alistair.francis@wdc.com \
--cc=ankita@nvidia.com \
--cc=cedric.xing@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=david.quigley@intel.com \
--cc=drdeeglaze@gmail.com \
--cc=elena.reshetova@intel.com \
--cc=jgg@nvidia.com \
--cc=jgg@ziepe.ca \
--cc=jic23@kernel.org \
--cc=jpiotrowski@nvidia.com \
--cc=kas@kernel.org \
--cc=ksinyuk@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=peter.fang@intel.com \
--cc=pgonda@google.com \
--cc=qinkun@google.com \
--cc=rick.p.edgecombe@intel.com \
--cc=rodrigo.vivi@intel.com \
--cc=sameo@meta.com \
--cc=sathyanarayanan.kuppuswamy@linux.intel.com \
--cc=suzuki.poulose@arm.com \
--cc=x86@kernel.org \
/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