On Fri, 1 Feb 2019 at 10:28, Jason Wang <jasow...@redhat.com> wrote: > > > On 2019/1/30 下午1:48, Yongji Xie wrote: > > 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? > > > Maybe I worry too much but it's not about flushing cache, but about > whether or not compiler can generate mov to memory instead of mov to > registers. >
OK, I see. I will declare those variables as volatile in v6. Thank you. Thanks, Yongji