OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

virtio message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: [virtio-dev] [PATCH] message framing: make ANY_LAYOUT implicit


"Michael S. Tsirkin" <mst@redhat.com> writes:
> On Mon, Sep 16, 2013 at 05:12:34PM +0930, Rusty Russell wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> > This resolves issue VIRTIO-10
>> >
>> > This also creates a new section for legacy feature
>> > bits which will be handy for VIRTIO-13 if that is
>> > accepted.
>> >
>> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>> 
>> This is very similar to the patch I came up with: I'm too slow!
>> 
>> Pasted below, in particular the 2.4.2.5.1 header needs to move up a few
>> lines, too.
>> 
>> Cheers,
>> Rusty.
>
> Cool. A couple of comments below.

>> +2.1.4.2.1. Legacy Interface: Message Framing
>> +-----------------------
>>  
>>  Regrettably, initial driver implementations used simple layouts, and
>> -devices came to rely on it, despite this specification wording[10]. It
>> -is thus recommended that drivers be conservative in their assumptions,
>> -unless the VIRTIO_F_ANY_LAYOUT feature is accepted. In addition, some
>> -implementations may have large-but-reasonable restrictions on total
>> -descriptor size (such as based on IOV_MAX in the host OS). This has
>> -not been a problem in practice: little sympathy will be given to
>> -drivers which create unreasonably-sized descriptors such as by
>> -dividing a network packet into 1500 single-byte descriptors!
>> +devices came to rely on it, despite this specification wording.  In
>> +addition, the specification for virtio_blk SCSI commands required
>> +intuiting field lengths from frame boundaries (see "2.4.2.5.1 Legacy
>> +Interface: Device Operation")
>> +
>> +It is thus recommended that
>
> Maybe add:
> " when using legacy interfaces, transitional "
>
> to stress that it does not need to be checked in non legacy
> setting.

Yep, good idea.

>
>> drivers be conservative in their
>> +assumptions, unless the VIRTIO_F_ANY_LAYOUT feature is accepted.
>
>>  
>>  2.1.4.3. The Virtqueue Descriptor Table
>>  --------------------------------------
>> @@ -1193,7 +1201,7 @@ features.
>>    VIRTIO_NET_F_MAC (5) Device has given MAC address.
>>  
>>    VIRTIO_NET_F_GSO (6) (Deprecated) device handles packets with
>> -    any GSO type.[12]
>> +    any GSO type.[11]
>>  
>>    VIRTIO_NET_F_GUEST_TSO4 (7) Guest can receive TSOv4.
>>  
>
> This generated a huge diff because of renumbering.
> What I generally do is take out a chunk and commit,
> then make renumbering a separate
> commit, it does not need review :)
>
> If I add a chunk, and numbering does not fit naturally,
> I add it with a random huge number like 123 - this makes
> it possible to add cross-references directly.
> Again commit then re-number separately.

Right, I'll start doing the same.

>>  2.4.5.6.1. Memory Statistics
>>  ---------------------------
>> @@ -2577,10 +2585,7 @@ contents of the event field. The following events are defined:
>>  2.5. Reserved Feature Bits
>>  =========================
>>  
>> -Currently there are four device-independent feature bits defined:
>> -
>> -  VIRTIO_F_ANY_LAYOUT (27) This feature indicates that the device accepts arbitrary
>> -  descriptor layouts, as described in Section "2.1.4.2. Message Framing".
>> +Currently there are three device-independent feature bits defined:
>>  
>>    VIRTIO_F_RING_INDIRECT_DESC (28) Negotiating this feature indicates
>>    that the driver can use descriptors with the VRING_DESC_F_INDIRECT
>> @@ -2621,6 +2626,10 @@ VIRTIO_F_NOTIFY_ON_EMPTY (24) Negotiating this feature
>>    using a timer if the device interrupts it when all the packets
>>    are transmitted.
>>  
>> +VIRTIO_F_ANY_LAYOUT (27) This feature indicates that the device
>> +  accepts arbitrary descriptor layouts, as described in Section
>> +  "2.1.4.2.1. Legacy Interface: Message Framing".
>> +
>
> Is this on top of a patch making NOTIFY_ON_EMPTY legacy?
>
> We should also move BAD_FEATURE here.

Yes, I have a working tree.  I'm switching to per-topic branches, since
merge order isn't determinate.

Here is the result:

commit b245c20be903005dd79dc5a23abb54d56ead73ca
Author: Rusty Russell <rusty@au1.ibm.com>
Date:   Mon Sep 9 17:40:32 2013 +0930

    Any layout is allowed (deprecate VIRTIO_F_ANY_LAYOUT)
    
    As per issue virtio-10.
    
    Signed-off-by: Rusty Russell <rusty@au1.ibm.com>

diff --git a/virtio-v1.0-wd01-part1-specification.txt b/virtio-v1.0-wd01-part1-specification.txt
index 743467a..02bb789 100644
--- a/virtio-v1.0-wd01-part1-specification.txt
+++ b/virtio-v1.0-wd01-part1-specification.txt
@@ -268,25 +268,34 @@ is not a significant issue.
 
 2.1.4.2. Message Framing
 -----------------------
-The original intent of the specification was that message framing (the
-particular layout of descriptors) be independent of the contents of
-the buffers. For example, a network transmit buffer consists of a 12
-byte header followed by the network packet. This could be most simply
-placed in the descriptor table as a 12 byte output descriptor followed
-by a 1514 byte output descriptor, but it could also consist of a
-single 1526 byte output descriptor in the case where the header and
-packet are adjacent, or even three or more descriptors (possibly with
-loss of efficiency in that case).
+The message framing (the particular layout of descriptors) is
+independent of the contents of the buffers. For example, a network
+transmit buffer consists of a 12 byte header followed by the network
+packet. This could be most simply placed in the descriptor table as a
+12 byte output descriptor followed by a 1514 byte output descriptor,
+but it could also consist of a single 1526 byte output descriptor in
+the case where the header and packet are adjacent, or even three or
+more descriptors (possibly with loss of efficiency in that case).
+
+Note that, some implementations may have large-but-reasonable
+restrictions on total descriptor size (such as based on IOV_MAX in the
+host OS). This has not been a problem in practice: little sympathy
+will be given to drivers which create unreasonably-sized descriptors
+such as by dividing a network packet into 1500 single-byte
+descriptors!
+
+2.1.4.2.1. Legacy Interface: Message Framing
+-----------------------
 
 Regrettably, initial driver implementations used simple layouts, and
-devices came to rely on it, despite this specification wording[10]. It
-is thus recommended that drivers be conservative in their assumptions,
-unless the VIRTIO_F_ANY_LAYOUT feature is accepted. In addition, some
-implementations may have large-but-reasonable restrictions on total
-descriptor size (such as based on IOV_MAX in the host OS). This has
-not been a problem in practice: little sympathy will be given to
-drivers which create unreasonably-sized descriptors such as by
-dividing a network packet into 1500 single-byte descriptors!
+devices came to rely on it, despite this specification wording.  In
+addition, the specification for virtio_blk SCSI commands required
+intuiting field lengths from frame boundaries (see "2.4.2.5.1 Legacy
+Interface: Device Operation")
+
+It is thus recommended that when using legacy interfaces, transitional
+drivers be conservative in their assumptions, unless the
+VIRTIO_F_ANY_LAYOUT feature is accepted.
 
 2.1.4.3. The Virtqueue Descriptor Table
 --------------------------------------
@@ -1729,6 +1738,9 @@ error or VIRTIO_BLK_S_UNSUPP for a request unsupported by host:
 	#define VIRTIO_BLK_S_IOERR     1
 	#define VIRTIO_BLK_S_UNSUPP    2
 
+2.4.2.5.1 Legacy Interface: Device Operation
+------------------------
+
 Historically, devices assumed that the fields type, ioprio and
 sector reside in a single, separate read-only buffer; the fields
 errors, data_len, sense_len and residual reside in a single,
@@ -2583,9 +2595,6 @@ Currently there are five device-independent feature bits defined:
   using a timer if the device interrupts it when all the packets
   are transmitted.
 
-  VIRTIO_F_ANY_LAYOUT (27) This feature indicates that the device accepts arbitrary
-  descriptor layouts, as described in Section "2.1.4.2. Message Framing".
-
   VIRTIO_F_RING_INDIRECT_DESC (28) Negotiating this feature indicates
   that the driver can use descriptors with the VRING_DESC_F_INDIRECT
   flag set, as described in "2.1.4.3.1. Indirect Descriptors".
@@ -2609,6 +2618,16 @@ In addition, bit 30 is used by qemu's implementation to check for experimental
 early versions of virtio which did not perform correct feature negotiation,
 and should not be used.
 
+2.5.1 Legacy Interface: Reserved Feature Bits
+--------------------------------------------
+
+Legacy or transitional devices may offer the following:
+
+VIRTIO_F_ANY_LAYOUT (27) This feature indicates that the device
+  accepts arbitrary descriptor layouts, as described in Section
+  "2.1.4.2.1. Legacy Interface: Message Framing".
+
+
 2.6. virtio_ring.h
 =================
 
@@ -2883,12 +2902,6 @@ of this expected condition is necessary.
 
 [9] https://lists.linux-foundation.org/mailman/listinfo/virtualization
 
-[10] It was previously asserted that framing should be independent of message
-contents, yet invariably drivers layed out messages in reliable ways and
-devices assumed it.
-In addition, the specifications for virtio_blk and virtio_scsi require
-intuiting field lengths from frame boundaries.
-
 [11] Even if it does mean documenting design or implementation
 mistakes!
 



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]