From: Michael Ellerman <mpe@ellerman.id.au>
To: "Michal Suchánek" <msuchanek@suse.de>, nathanl@linux.ibm.com
Cc: tyreld@linux.ibm.com, gcwilson@linux.ibm.com,
linuxppc-dev@lists.ozlabs.org,
Nicholas Piggin <npiggin@gmail.com>
Subject: Re: [PATCH RFC 1/2] powerpc/pseries: papr-vpd char driver for VPD retrieval
Date: Thu, 31 Aug 2023 15:34:37 +1000 [thread overview]
Message-ID: <8734zz3hci.fsf@mail.lhotse> (raw)
In-Reply-To: <20230830072801.GC8826@kitsune.suse.cz>
Michal Suchánek <msuchanek@suse.de> writes:
> Hello,
>
> thanks for working on this.
>
> On Tue, Aug 22, 2023 at 04:33:39PM -0500, Nathan Lynch via B4 Relay wrote:
>> From: Nathan Lynch <nathanl@linux.ibm.com>
>>
>> PowerVM LPARs may retrieve Vital Product Data (VPD) for system
>> components using the ibm,get-vpd RTAS function.
>>
>> We can expose this to user space with a /dev/papr-vpd character
>> device, where the programming model is:
>>
>> struct papr_location_code plc = { .str = "", }; /* obtain all VPD */
>> int devfd = open("/dev/papr-vpd", O_WRONLY);
>> int vpdfd = ioctl(devfd, PAPR_VPD_CREATE_HANDLE, &plc);
>> size_t size = lseek(vpdfd, 0, SEEK_END);
>> char *buf = malloc(size);
>> pread(devfd, buf, size, 0);
>>
>> When a file descriptor is obtained from ioctl(PAPR_VPD_CREATE_HANDLE),
>> the file contains the result of a complete ibm,get-vpd sequence. The
>
> Could this be somewhat less obfuscated?
>
> What the caller wants is the result of "ibm,get-vpd", which is a
> well-known string identifier of the rtas call.
Not really. What the caller wants is *the VPD*. Currently that's done
by calling the RTAS "ibm,get-vpd" function, but that could change in
future. There's RTAS calls that have been replaced with a "version 2" in
the past, that could happen here too. Or the RTAS call could be replaced
by a hypercall (though unlikely).
But hopefully if the underlying mechanism changed the kernel would be
able to hide that detail behind this new API, and users would not need
to change at all.
> Yet this identifier is never passed in. Instead we have this new
> PAPR_VPD_CREATE_HANDLE. This is a completely new identifier, specific to
> this call only as is the /dev/papr-vpd device name, another new
> identifier.
>
> Maybe the interface could provide a way to specify the service name?
>
>> file contents are immutable from the POV of user space. To get a new
>> view of VPD, clients must create a new handle.
>
> Which is basically the same as creating a file descriptor with open().
Sort of. But much cleaner becuase you don't need to create a file in the
filesystem and tell userspace how to find it.
This pattern of creating file descriptors from existing file descriptors
to model a hiearachy of objects is well established in eg. the KVM and
DRM APIs.
> Maybe creating a directory in sysfs or procfs with filenames
> corresponding to rtas services would do the same job without extra
> obfuscation?
It's not obfuscation, it's abstraction. The kernel talks to firmware to
do things, and provides an API to user space. Not all the details of how
the firmware works are relevant to user space, including the exact
firmware calls required to implement a certain feature.
>> This design choice insulates user space from most of the complexities
>> that ibm,get-vpd brings:
>>
>> * ibm,get-vpd must be called more than once to obtain complete
>> results.
>> * Only one ibm,get-vpd call sequence should be in progress at a time;
>> concurrent sequences will disrupt each other. Callers must have a
>> protocol for serializing their use of the function.
>> * A call sequence in progress may receive a "VPD changed, try again"
>> status, requiring the client to start over. (The driver does not yet
>> handle this, but it should be easy to add.)
>
> That certainly reduces the complexity of the user interface making it
> much saner.
Yes :)
>> The memory required for the VPD buffers seems acceptable, around 20KB
>> for all VPD on one of my systems. And the value of the
>> /rtas/ibm,vpd-size DT property (the estimated maximum size of VPD) is
>> consistently 300KB across various systems I've checked.
>>
>> I've implemented support for this new ABI in the rtas_get_vpd()
>> function in librtas, which the vpdupdate command currently uses to
>> populate its VPD database. I've verified that an unmodified vpdupdate
>> binary generates an identical database when using a librtas.so that
>> prefers the new ABI.
>>
>> Likely remaining work:
>>
>> * Handle RTAS call status -4 (VPD changed) during ibm,get-vpd call
>> sequence.
>> * Prevent ibm,get-vpd calls via rtas(2) from disrupting ibm,get-vpd
>> call sequences in this driver.
>> * (Maybe) implement a poll method for delivering notifications of
>> potential changes to VPD, e.g. after a partition migration.
>
> That sounds like something for netlink. If that is desired maybe it
> should be used in the first place?
I don't see why that is related to netlink. It's entirely normal for
file descriptor based APIs to implement poll.
netlink adds a lot of complexity for zero gain IMO.
cheers
next prev parent reply other threads:[~2023-08-31 5:35 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-22 21:33 [PATCH RFC 0/2] powerpc/pseries: new character devices for RTAS functions Nathan Lynch via B4 Relay
2023-08-22 21:33 ` [PATCH RFC 1/2] powerpc/pseries: papr-vpd char driver for VPD retrieval Nathan Lynch via B4 Relay
2023-08-30 7:29 ` Michal Suchánek
2023-08-31 5:34 ` Michael Ellerman [this message]
2023-08-31 10:38 ` Michal Suchánek
2023-08-31 11:37 ` Michael Ellerman
2023-08-31 11:44 ` Michal Suchánek
2023-08-31 17:59 ` Nathan Lynch
2023-09-04 7:20 ` Michal Suchánek
2023-09-05 2:42 ` Michael Ellerman
2023-09-05 8:24 ` Michal Suchánek
2023-08-31 11:35 ` Michal Suchánek
2023-09-04 7:48 ` Michal Suchánek
2023-08-31 15:52 ` Nathan Lynch
2023-09-06 9:19 ` Michal Suchánek
2023-08-22 21:33 ` [PATCH RFC 2/2] powerpc/selftests: add test for papr-vpd Nathan Lynch via B4 Relay
2023-08-24 6:20 ` Russell Currey
2023-08-24 11:51 ` Nathan Lynch
2023-09-06 9:30 ` [PATCH RFC 0/2] powerpc/pseries: new character devices for RTAS functions Michal Suchánek
2023-09-06 12:08 ` [PATCH RFC] powerpc/rtas: Make it possible to disable sys_rtas Michal Suchanek
2023-09-06 19:34 ` Nathan Lynch
2023-09-07 16:01 ` Michal Suchánek
2023-09-07 16:52 ` Nathan Lynch
2023-09-07 17:19 ` Michal Suchánek
2023-09-08 17:48 ` Nathan Lynch
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=8734zz3hci.fsf@mail.lhotse \
--to=mpe@ellerman.id.au \
--cc=gcwilson@linux.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=msuchanek@suse.de \
--cc=nathanl@linux.ibm.com \
--cc=npiggin@gmail.com \
--cc=tyreld@linux.ibm.com \
/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;
as well as URLs for NNTP newsgroup(s).