V [ ]<- first available entry /-[x]-/ A [ ] -[x]-
I [ ] [ ] | L [ ] [ ] | [ ] [ ] | R [ ] [x]-/ I [ ] [ ] N [ ] [ ] G [ ] [ ] [ ] [ ] U [ ]<- first available entry [ ] S [ ] [ ] E [ ] [ ] D [ ] [ ] [ ] [ ] R [ ] [ ] I [ ] [ ] N [ ] [ ] G [ ] [ ] [ ] [ ]
The device pops the available entry and gets a handle which links to the head of the list of buffers, through which it can iterate.
A [ ] handle ------------>[x]-
V [ ]<- first available entry /-[x]-/ A [ ] -[x]-
I [ ] [ ] | L [ ] [ ] | [ ] [ ] | R [ ] [x]-/ I [ ] [ ] N [ ] [ ] G [ ] [ ] [ ] [ ] U [ ]<- first available entry [ ] S [ ] [ ] E [ ] [ ] D [ ] [ ] [ ] [ ] R [ ] [ ] I [ ] [ ] N [ ] [ ] G [ ] [ ] [ ] [ ]
It pushes it back into the used ring.
A [ ] /------------>[x]-
V [ ]<- first available entry | /-[x]-/ A [ ] | -[x]-
I [ ] | [ ] | L [ ] | [ ] | [ ] | [ ] | R [ ] | [x]-/ I [ ] | [ ] N [ ] | [ ] G [ ] | [ ] | [ ] | [ ] U [x]-----------------------------------/ [ ] S [ ]<- first available entry [ ] E [ ] [ ] D [ ] [ ] [ ] [ ] R [ ] [ ] I [ ] [ ] N [ ] [ ] G [ ] [ ] [ ] [ ]
The driver side then pops the used entry and frees the buffers.