Have just one ring, no indexes. The producer places descriptors intoThis could definitely work. The original reason for the page boundaries
the ring and updates the head, The consumer copies out descriptors to
be processed and copies back in completed descriptors. Chaining is
always linear. The descriptors contain a tag that allow the producer to
identify the completion.
was for untrusted inter-guest communication: with appropriate page protections
they could see each other's rings and a simply inter-guest copy hypercall
could verify that the other guest really exposed that data via virtio ring.
But, cute as that is, we never did that. And it's not clear that it wins
much over simply having the hypervisor read both rings directly.
I was thinking a separate magic "invalid" entry. To publish an 3 descriptorCan we do better? The obvious idea is to try to get rid of last_used andInteresting! So a peer will read until it hits a wall. But how to
used, and use the ring itself. We would use an invalid entry to mark the
head of the ring.
update the wall atomically?
Maybe we can have a flag in the descriptor indicate headness or
tailness. Update looks ugly though: write descriptor with head flag,
write next descriptor with head flag, remove flag from previous descriptor.
chain, you would write descriptors 2 and 3, write an invalid entry at 4,
barrier, write entry 1. It is a bit ugly, yes, but not terrible.
I think that a simple simulator for this is worth writing, which tracks
cacheline moves under various fullness scenarios...