On Wed, Jan 30, 2019 at 10:31:49AM +0800, Jason Wang wrote: > > On 2019/1/22 下午4:31, elohi...@gmail.com wrote: > > +static int > > +vu_queue_inflight_get(VuDev *dev, VuVirtq *vq, int desc_idx) > > +{ > > + if (!has_feature(dev->protocol_features, > > + VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD)) { > > + return 0; > > + } > > + > > + if (unlikely(!vq->inflight)) { > > + return -1; > > + } > > + > > + vq->inflight->desc[desc_idx].inuse = 1; > > + > > + vq->inflight->desc[desc_idx].avail_idx = vq->last_avail_idx; > > + > > + return 0; > > +} > > + > > +static int > > +vu_queue_inflight_pre_put(VuDev *dev, VuVirtq *vq, int desc_idx) > > +{ > > + if (!has_feature(dev->protocol_features, > > + VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD)) { > > + return 0; > > + } > > + > > + if (unlikely(!vq->inflight)) { > > + return -1; > > + } > > + > > + vq->inflight->desc[desc_idx].used_idx = vq->used_idx; > > + > > + barrier(); > > + > > + vq->inflight->desc[desc_idx].version++; > > + > > + return 0; > > +} > > > You probably need WRITE_ONCE() semantic (e.g volatile) to make sure the > value reach memory. > > Thanks >
WRITE_ONCE is literally volatile + dependency memory barrier. So unless compiler is a very agressive one, it does not buy you much. -- MST