Re: [PATCH v2 02/24] virtio: Use weaker barriers
From: Ouyang, Changchun <hidden>
Date: 2015-01-28 06:12:59
-----Original Message----- From: Xie, Huawei Sent: Wednesday, January 28, 2015 12:16 AM To: Stephen Hemminger Cc: Ouyang, Changchun; dev-VfR2kkLFssw@public.gmane.org Subject: RE: [dpdk-dev] [PATCH v2 02/24] virtio: Use weaker barriersquoted
-----Original Message----- From: Stephen Hemminger [mailto:stephen-OTpzqLSitTUnbdJkjeBofR2eb7JE58TQ@public.gmane.org] Sent: Tuesday, January 27, 2015 5:59 PM To: Xie, Huawei Cc: Ouyang, Changchun; dev-VfR2kkLFssw@public.gmane.org Subject: Re: [dpdk-dev] [PATCH v2 02/24] virtio: Use weaker barriersquoted
I recall our original code is virtio_wmb(). Use store fence to ensure all updates to entries before updating theindex.quoted
quoted
Why do we need virtio_rmb() here and add virtio_wmb aftervq_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 stallI 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++;
Yes, use virtio_wmb is better here, will change it in next version. Thanks Changchun