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