On Thu, Sep 28, 2017 at 02:49:15AM +0300, Michael S. Tsirkin wrote: > 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 Note: I made a mistake in the email. Instead of DESC_NEXT it should read DESC_MORE everywhere. I corrected the quoted text below for simplicity. > 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_MORE | 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_MORE > > > 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