[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [virtio-dev] Re: [PATCH v8 08/16] packed virtqueues: more efficient virtqueue layout
On Mon, Feb 26, 2018 at 11:05:14PM +0200, Michael S. Tsirkin wrote:
On Mon, Feb 26, 2018 at 06:19:21PM +0100, Halil Pasic wrote:> + vq->driver_event.flags = 0x1; > + memory_barrier(); > + > + flags = d->flags; > + bool avail = flags & (1 << VIRTQ_DESC_F_AVAIL); > + bool used = flags & (1 << VIRTQ_DESC_F_USED); > + if (avail != used) { > + break; > + } > + > + vq->driver_event.flags = 0x2; > + } > + > + read_memory_barrier(); Now with the condition avail != used a freshly (that is zero initialized) ring would appear all used. And we would do process_buffer(d) for the whole ring if this code happens to get executed. Do we have to make sure that this does not happen?I'll have to think about this.
With the wrap counter initialized to 1 descriptors would not be seenas used.
I was under the impression that this whole wrap counter exercise is to be able to distinguish these cases. BTW tools/virtio/ringtest/ring.c has a single flag bit to indicate available/used and does not have these wrap counters AFAIR.A single flag is fine if there's not s/g support and all descriptors are written out. Wrap counters are needed if we are to support skipping descriptors because of s/g or in order.Also for split virtqueues a descriptor has three possible states: * available * used * free I wonder if it's the same for packed, and if, how do I recognize free descriptors (that is descriptors that are neither available nor used.I'll think about this.I'm pretty much confused on how this scheme with the available and used wrap counters (or device and driver wrap counters is supposed to work). A working implementation in C would really help me to understand this.DPDK based implementation has been posted.
vhost and guest drivers have also been posted. guest: https://lkml.org/lkml/2018/2/23/242 vhost: https://lkml.org/lkml/2018/2/13/1102 regards,Jens
> + process_buffer(d); > + vq->next_used++; > + if (vq->next_used >= vq->size) { > + vq->next_used = 0; > + } > +} > +\end{lstlisting} >--------------------------------------------------------------------- To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]