> -----Original Message----- > From: Kangjie Xu <kangjie...@linux.alibaba.com> > Sent: Monday, September 5, 2022 11:48 AM > To: maxime.coque...@redhat.com; Xia, Chenbo <chenbo....@intel.com> > Cc: dev@dpdk.org; xuanz...@linux.alibaba.com; hen...@linux.alibaba.com; > jasonw...@redhat.com; m...@redhat.com > Subject: [PATCH v2 2/2] vhost: introduce VHOST_USER_RESET_VRING > > To support the reset operation for an individual virtqueue, we > introduce a new message VHOST_USER_RESET_VRING. When the feature > VIRTIO_F_RING_RESET feature has been successfully negotiated, This > message is submitted by the front-end to reset an individual > virtqueue to initial states in the back-end. The reply is needed > to ensure that the reset operation is complete.
completed > > Signed-off-by: Kangjie Xu <kangjie...@linux.alibaba.com> > Signed-off-by: Xuan Zhuo <xuanz...@linux.alibaba.com> > --- > lib/vhost/vhost.c | 2 +- > lib/vhost/vhost.h | 1 + > lib/vhost/vhost_user.c | 27 ++++++++++++++++++++++++++- > lib/vhost/vhost_user.h | 1 + > 4 files changed, 29 insertions(+), 2 deletions(-) > > diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c > index 60cb05a0ff..215a1ca355 100644 > --- a/lib/vhost/vhost.c > +++ b/lib/vhost/vhost.c > @@ -610,7 +610,7 @@ init_vring_queue(struct virtio_net *dev, uint32_t > vring_idx) > vhost_user_iotlb_init(dev, vring_idx); > } > > -static void > +void > reset_vring_queue(struct virtio_net *dev, uint32_t vring_idx) > { > struct vhost_virtqueue *vq; > diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h > index 76461a3406..eccb52842d 100644 > --- a/lib/vhost/vhost.h > +++ b/lib/vhost/vhost.h > @@ -791,6 +791,7 @@ get_device(int vid) > > int vhost_new_device(void); > void cleanup_device(struct virtio_net *dev, int destroy); > +void reset_vring_queue(struct virtio_net *dev, uint32_t vring_idx); > void reset_device(struct virtio_net *dev); > void vhost_destroy_device(int); > void vhost_destroy_device_notify(struct virtio_net *dev); > diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c > index 4ad28bac45..5f7743d9d9 100644 > --- a/lib/vhost/vhost_user.c > +++ b/lib/vhost/vhost_user.c > @@ -2771,6 +2771,30 @@ vhost_user_set_status(struct virtio_net **pdev, > return RTE_VHOST_MSG_RESULT_OK; > } > > +static int > +vhost_user_reset_vring(struct virtio_net **pdev, > + struct vhu_msg_context *ctx __rte_unused, > + int main_fd __rte_unused) > +{ > + struct virtio_net *dev = *pdev; > + int index = (int)ctx->msg.payload.state.index; Why not just use unsigned int? > + > + VHOST_LOG_CONFIG(dev->ifname, INFO, "reset queue: queue idx: %d\n", > index); > + > + if (!(dev->features & (1ULL << VIRTIO_F_RING_RESET))) { > + return RTE_VHOST_MSG_RESULT_ERR; > + } braces {} are not necessary for single statement blocks > + > + dev->virtqueue[index]->enabled = false; > + reset_vring_queue(dev, index); > + > + ctx->msg.payload.state.num = 0; > + ctx->msg.size = sizeof(ctx->msg.payload.u64); > + ctx->fd_num = 0; > + > + return RTE_VHOST_MSG_RESULT_REPLY; > +} IIUC, before this handler, we need to lock the queue? Using vhost_user_lock_all_queue_pairs BTW, is this support merged in QEMU now? I remember for similar cases, we wait for QEMU to merge first and then merge in DPDK. Maxime, do I remember this correctly? Thanks, Chenbo > + > #define VHOST_MESSAGE_HANDLERS \ > VHOST_MESSAGE_HANDLER(VHOST_USER_NONE, NULL, false) \ > VHOST_MESSAGE_HANDLER(VHOST_USER_GET_FEATURES, vhost_user_get_features, > false) \ > @@ -2803,7 +2827,8 @@ VHOST_MESSAGE_HANDLER(VHOST_USER_POSTCOPY_END, > vhost_user_postcopy_end, false) \ > VHOST_MESSAGE_HANDLER(VHOST_USER_GET_INFLIGHT_FD, > vhost_user_get_inflight_fd, false) \ > VHOST_MESSAGE_HANDLER(VHOST_USER_SET_INFLIGHT_FD, > vhost_user_set_inflight_fd, true) \ > VHOST_MESSAGE_HANDLER(VHOST_USER_SET_STATUS, vhost_user_set_status, false) > \ > -VHOST_MESSAGE_HANDLER(VHOST_USER_GET_STATUS, vhost_user_get_status, false) > +VHOST_MESSAGE_HANDLER(VHOST_USER_GET_STATUS, vhost_user_get_status, false) > \ > +VHOST_MESSAGE_HANDLER(VHOST_USER_RESET_VRING, vhost_user_reset_vring, > false) > > #define VHOST_MESSAGE_HANDLER(id, handler, accepts_fd) \ > [id] = { #id, handler, accepts_fd }, > diff --git a/lib/vhost/vhost_user.h b/lib/vhost/vhost_user.h > index 8ecca68597..51cb2fc74a 100644 > --- a/lib/vhost/vhost_user.h > +++ b/lib/vhost/vhost_user.h > @@ -60,6 +60,7 @@ typedef enum VhostUserRequest { > VHOST_USER_SET_INFLIGHT_FD = 32, > VHOST_USER_SET_STATUS = 39, > VHOST_USER_GET_STATUS = 40, > + VHOST_USER_RESET_VRING = 41 > } VhostUserRequest; > > typedef enum VhostUserSlaveRequest { > -- > 2.32.0