From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 14357A0544; Fri, 23 Sep 2022 08:53:15 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B0407400D7; Fri, 23 Sep 2022 08:53:14 +0200 (CEST) Received: from out30-131.freemail.mail.aliyun.com (out30-131.freemail.mail.aliyun.com [115.124.30.131]) by mails.dpdk.org (Postfix) with ESMTP id 3709540150 for ; Fri, 23 Sep 2022 03:42:56 +0200 (CEST) X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R191e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=ay29a033018046059; MF=xuanzhuo@linux.alibaba.com; NM=1; PH=DS; RN=7; SR=0; TI=SMTPD_---0VQUXSg5_1663897373; Received: from localhost(mailfrom:xuanzhuo@linux.alibaba.com fp:SMTPD_---0VQUXSg5_1663897373) by smtp.aliyun-inc.com; Fri, 23 Sep 2022 09:42:54 +0800 Message-ID: <1663897297.0251951-1-xuanzhuo@linux.alibaba.com> Subject: Re: RE: [PATCH v2 2/2] vhost: introduce VHOST_USER_RESET_VRING Date: Fri, 23 Sep 2022 09:41:37 +0800 From: Xuan Zhuo To: "Xia, Chenbo" Cc: "dev@dpdk.org" , "hengqi@linux.alibaba.com" , "jasonwang@redhat.com" , "mst@redhat.com" , Kangjie Xu , "maxime.coquelin@redhat.com" References: In-Reply-To: X-Mailman-Approved-At: Fri, 23 Sep 2022 08:53:14 +0200 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Thu, 22 Sep 2022 09:35:35 +0000, "Xia, Chenbo" wrote: > > -----Original Message----- > > From: Kangjie Xu > > Sent: Monday, September 5, 2022 11:48 AM > > To: maxime.coquelin@redhat.com; Xia, Chenbo > > Cc: dev@dpdk.org; xuanzhuo@linux.alibaba.com; hengqi@linux.alibaba.com; > > jasonwang@redhat.com; mst@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 > > Signed-off-by: Xuan Zhuo > > --- > > 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? Yes, we are simultaneously pushing this feature to QEMU. We have a patch for v3, maybe you missed it. Thanks. > > 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 >