Get it now. Please correct me if I missing something. Flags status hints, - DESC_DRIVER only: driver owns the descriptor w/o available info ready for device to use - DESC_DRIVER | DESC_WRAP: driver has prepared an available descriptor, device hasn't used it yet - None: device has used the descriptor, and write descriptor out - DESC_WRAP only: shall not happen, device make sure to clear it Polling behavior is, - Device monitor DESC_WRAP bit set or not; If set, go to use descriptor and clear DESC_DRIVER bit in the end (note: always need to clear DESC_WRAP) - Driver monitor DESC_DRIVER bit cleared or not; If cleared, reclaim descriptor(set DESC_DRIVER) and set DESC_WRAP once new available descriptor get ready to go -- Steve > -----Original Message----- > From: Michael S. Tsirkin [mailto:mst@xxxxxxxxxx] > Sent: Thursday, September 28, 2017 7:49 AM > To: Steven Luong (sluong) > Cc: Liang, Cunming; virtio-dev@xxxxxxxxxxxxxxxxxxxx; > virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [virtio-dev] packed ring layout proposal v3 > > On Tue, Sep 26, 2017 at 11:38:18PM +0000, Steven Luong (sluong) wrote: > > Michael, > > > > Would you please give an example or two how these two flags > DESC_DRIVER and DESC_WRAP are used together? Like others, I am > confused by the description and still don’t quite grok it. > > > > Steven > > My bad, I will need to work on it. Here is an example: > > Let's assume device promised to consume packets in order > > ring size = 2 > > Ring is 0 initialized. > > Device initially polls DESC[0].flags for WRAP bit to change. > > driver adds: > > DESC[0].addr = 1234 > DESC[0].id = 0 > DESC[0].flags = DESC_DRIVER | DESC_NEXT | DESC_WRAP > > and > > DESC[0].addr = 5678 > DESC[1].id = 1 > DESC[1].flags = DESC_DRIVER | DESC_WRAP > > > it now starts polling DESC[0] flags. > > > Device reads 1234, executes it, does not use it. > > Device reads 5678, executes it, and uses it: > > DESC[0].id = 1 > DESC[0].flags = 0 > > Device now polls DESC[0].flags for WRAP bit to change. > > Now driver sees that DRIVER bit has been cleared, so it nows that id is valid. I > sees id 1, therefore id 0 and 1 has been read and are safe to overwrite. > > So it writes it out. It wrapped around to beginning of ring, so it flips the > WRAP bit to 0 on all descriptors now: > > DESC[0].addr = 9ABC > DESC[0].id = 0 > DESC[0].flags = DESC_DRIVER | DESC_NEXT > > > DESC[0].addr = DEF0 > DESC[0].id = 1 > DESC[0].flags = DESC_DRIVER > > > Next round wrap will be 1 again. > > > To summarise: > > DRIVER bit is used by driver to detect device has used one or more > descriptors. WRAP is is used by device to detect driver has made a new > descriptor available. > > > -- > MST _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization