On Wed, 30 Jan 2019 at 10:32, Jason Wang <jasow...@redhat.com> 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. >
The cache line should have been flushed during crash. So we can see the correct value when backend reconnecting. If so, compile barrier should be enough here, right? Thanks, Yongji