> -----Original Message----- > From: Stephen Hemminger [mailto:stephen at networkplumber.org] > Sent: Tuesday, January 27, 2015 5:59 PM > To: Xie, Huawei > Cc: Ouyang, Changchun; dev at dpdk.org > Subject: Re: [dpdk-dev] [PATCH v2 02/24] virtio: Use weaker barriers > > > > I recall our original code is virtio_wmb(). > > Use store fence to ensure all updates to entries before updating the index. > > Why do we need virtio_rmb() here and add virtio_wmb after > vq_update_avail_idx()? > > Store fence is unnecessary, Intel CPU's are cache coherent, please read > the virtio Linux ring header file for explanation. A full fence WMB > is more expensive and causes CPU stall >
I mean virtio_wmb rather than virtio_rmb should be used here, and both of them are defined as compiler barrier. The following code is linux virtio driver for adding buffer to vring. /* Put entry in available array (but don't update avail->idx until they * do sync). */ avail = (vq->vring.avail->idx & (vq->vring.num-1)); vq->vring.avail->ring[avail] = head; /* Descriptors and available array need to be set before we expose the * new available array entries. */ virtio_wmb(vq->weak_barriers); vq->vring.avail->idx++; > > > vq->vq_ring.avail->idx = vq->vq_avail_idx; > > > } > > > > > > @@ -255,7 +264,7 @@ static inline void > > > virtqueue_notify(struct virtqueue *vq) > > > { > > > /* > > > - * Ensure updated avail->idx is visible to host. mb() necessary? > > > + * Ensure updated avail->idx is visible to host. > > > * For virtio on IA, the notificaiton is through io port operation > > > * which is a serialization instruction itself. > > > */ > > > -- > > > 1.8.4.2 > >