[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] blkif: reconcile protocol specification with in-use implementations
On Wed, Sep 04, 2024 at 01:25:46PM +0000, Anthony PERARD wrote: > On Tue, Sep 03, 2024 at 04:19:23PM +0200, Roger Pau Monne wrote: > > Current blkif implementations (both backends and frontends) have all slight > > differences about how they handle the 'sector-size' xenstore node, and how > > other fields are derived from this value or hardcoded to be expressed in > > units > > of 512 bytes. > > > > To give some context, this is an excerpt of how different implementations > > use > > the value in 'sector-size' as the base unit for to other fields rather than > > just to set the logical sector size of the block device: > > > > │ sectors xenbus node │ requests sector_number │ > > requests {first,last}_sect > > ────────────────────────┼─────────────────────┼────────────────────────┼─────────────────────────── > > FreeBSD blk{front,back} │ sector-size │ sector-size │ > > 512 > > ────────────────────────┼─────────────────────┼────────────────────────┼─────────────────────────── > > Linux blk{front,back} │ 512 │ 512 │ > > 512 > > ────────────────────────┼─────────────────────┼────────────────────────┼─────────────────────────── > > QEMU blkback │ sector-size │ sector-size │ > > sector-size > > ────────────────────────┼─────────────────────┼────────────────────────┼─────────────────────────── > > Windows blkfront │ sector-size │ sector-size │ > > sector-size > > ────────────────────────┼─────────────────────┼────────────────────────┼─────────────────────────── > > MiniOS │ sector-size │ 512 │ > > 512 > > > > An attempt was made by 67e1c050e36b in order to change the base units of the > > request fields and the xenstore 'sectors' node. That however only lead to > > more > > confusion, as the specification now clearly diverged from the reference > > implementation in Linux. Such change was only implemented for QEMU Qdisk > > and Windows PV blkfront. > > > > Partially revert to the state before 67e1c050e36b: > > > > * Declare 'feature-large-sector-size' deprecated. Frontends should not > > expose > > the node, backends should not make decisions based on its presence. > > > > * Clarify that 'sectors' xenstore node and the requests fields are always > > in > > 512-byte units, like it was previous to 67e1c050e36b. > > > > All base units for the fields used in the protocol are 512-byte based, the > > xenbus 'sector-size' field is only used to signal the logic block size. > > When > > 'sector-size' is greater than 512, blkfront implementations must make sure > > that > > the offsets and sizes (even when expressed in 512-byte units) are aligned to > > the logical block size specified in 'sector-size', otherwise the backend > > will > > fail to process the requests. > > > > This will require changes to some of the frontends and backends in order to > > properly support 'sector-size' nodes greater than 512. > > > > Fixes: 67e1c050e36b ('public/io/blkif.h: try to fix the semantics of sector > > based quantities') > > Probably want to add: > Fixes: 2fa701e5346d ("blkif.h: Provide more complete documentation of the > blkif interface") > > > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > > --- > > xen/include/public/io/blkif.h | 23 ++++++++++++++--------- > > 1 file changed, 14 insertions(+), 9 deletions(-) > > > > diff --git a/xen/include/public/io/blkif.h b/xen/include/public/io/blkif.h > > index 22f1eef0c0ca..07708f4d08eb 100644 > > --- a/xen/include/public/io/blkif.h > > +++ b/xen/include/public/io/blkif.h > > @@ -240,10 +240,6 @@ > > * The logical block size, in bytes, of the underlying storage. This > > * must be a power of two with a minimum value of 512. > > Should we add that "sector-size" is to be used only for request length? Yes, that would be fine. What about: The logical block size, in bytes, of the underlying storage. This must be a power of two with a minimum value of 512. The sector size should only be used for request segment length and alignment. > > > - * NOTE: Because of implementation bugs in some frontends this must be > > - * set to 512, unless the frontend advertizes a non-zero value > > - * in its "feature-large-sector-size" xenbus node. (See below). > > - * > > * physical-sector-size > > * Values: <uint32_t> > > * Default Value: <"sector-size"> > > @@ -254,8 +250,8 @@ > > * sectors > > * Values: <uint64_t> > > * > > - * The size of the backend device, expressed in units of > > "sector-size". > > - * The product of "sector-size" and "sectors" must also be an integer > > + * The size of the backend device, expressed in units of 512b. > > + * The product of "sector-size" * 512 must also be an integer > > * multiple of "physical-sector-size", if that node is present. > > * > > > > ***************************************************************************** > > @@ -338,6 +334,7 @@ > > * feature-large-sector-size > > * Values: 0/1 (boolean) > > * Default Value: 0 > > + * Notes: DEPRECATED, 12 > > * > > * A value of "1" indicates that the frontend will correctly supply > > and > > Could you remove "correctly" from this sentence? It's misleading. The whole feature is deprecated, so I would rather leave it as-is for historical reference. The added note attempts to reflect that it should not be exposed by frontends, neither should backends make any decisions based on its presence. > > * interpret all sector-based quantities in terms of the "sector-size" > > @@ -411,6 +408,11 @@ > > *(10) The discard-secure property may be present and will be set to 1 if > > the > > * backing device supports secure discard. > > *(11) Only used by Linux and NetBSD. > > + *(12) Possibly only ever implemented by the QEMU Qdisk backend and the > > Windows > > + * PV block frontend. Other backends and frontends supported > > 'sector-size' > > + * values greater than 512 before such feature was added. Frontends > > should > > + * not expose this node, neither should backends make any decisions > > based > > + * on it being exposed by the frontend. > > */ > > > > /* > > @@ -621,9 +623,12 @@ > > /* > > * NB. 'first_sect' and 'last_sect' in blkif_request_segment, as well as > > * 'sector_number' in blkif_request, blkif_request_discard and > > - * blkif_request_indirect are sector-based quantities. See the description > > - * of the "feature-large-sector-size" frontend xenbus node above for > > - * more information. > > + * blkif_request_indirect are all in units of 512 bytes, regardless of > > whether the > > + * 'sector-size' xenstore node contains a value greater than 512. > > + * > > + * However the value in those fields must be properly aligned to the > > logical > > + * sector size reported by the 'sector-size' xenstore node, see 'Backend > > Device > > + * Properties' section. > > */ > > struct blkif_request_segment { > > Textually (that is without reading it) this comment seems to only apply > to `struct blkif_request_segment`. There is an other comment that > separate it from `struct blkif_request` (and it is far away from > blkif_request_discard and blkif_request_indirect). For `struct > blkif_request.sector_number`, the only comment is "start sector idx on > disk" but it's really hard to tell how to interpret it, it could be > interpreted as a "sector-size" quantity because that the size of a > sector on the disk, the underlying storage. > > So, I think we need to change the comment of > `blkif_request.sector_number`. OK, will trim a bit the comment in blkif_request_segment then sprinkle comments about the sectors base units in the different structures defined below. > > Another thing, there's a "type" `blkif_sector_t` defined at the beginning > of the file, would it be worth it to add a description to it? IMO it's better to add the description as close as possible to the field declaration, rather than the declaration of the field type. Thanks, Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |