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 58CBF41C32; Tue, 7 Feb 2023 19:07:17 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3A9434021F; Tue, 7 Feb 2023 19:07:17 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 8332640151 for ; Tue, 7 Feb 2023 19:07:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1675793236; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZyyN4xWfZuj5Gcj3YHU8CXzKIt8F2n63gtmhnkOps6U=; b=CqnvDi3tsVWnnRoAsR4eQ9U8H7vdzwktyl5nK6Pi/wwUyPFtSOBIuqZsV3XpbH7SnleKAu sMZwM1IoH/yGIwcang/dnt5LXXmpOdiuqvGSBiAlL9uGM06wdkqRLvcwmvDYb3Ty4AR1OO AQaHyqfu3QzZXfxtA9Rq/EF8JQA6wOY= Received: from mail-yw1-f198.google.com (mail-yw1-f198.google.com [209.85.128.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-166-zGVmMbpfN6eUf8EWYA5T8Q-1; Tue, 07 Feb 2023 13:07:15 -0500 X-MC-Unique: zGVmMbpfN6eUf8EWYA5T8Q-1 Received: by mail-yw1-f198.google.com with SMTP id 00721157ae682-4c11ae6ab25so151207567b3.8 for ; Tue, 07 Feb 2023 10:07:15 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZyyN4xWfZuj5Gcj3YHU8CXzKIt8F2n63gtmhnkOps6U=; b=cAYMTPSuyy1CZ/ZIHUoYi7Rk79g45YveL6/FJL5X12zvnTbJaQGoOrQV7ysr6kTUnM ENRW92CkIZQCvImRMzBpi1RdM67Hg4k91eJTCbvgYeLGAR3OwtU1+20WxY6/0f/bqyQI ifRxfwIZcyTX1/vNckDYWstkhBHFP/0lMY1xNfU3G2GtioTc0/6Fs9wVhzgAlB+phbHX I0icHR1TlCvWbTwXq8lsADuqJpHyuwb49eTO8Ua8wnWOAbIm6wgK/iHlzbdBHrDbUwxZ QW57aTMh0PG/8NxePOwf4PcsGcB/Wj+hNFFztq8zQjMbKDGH8aogMdD8x0vWGKXcinns dQmw== X-Gm-Message-State: AO0yUKXE06v4scHklg5Ec7tT7l43/znhLBew7hPNZGiVwAYmAZd3uZdH 9Q3Z8glqzphIpcj3bh/76TBGjpf2w15K++FiGlH3/o9NuS32ZpupPoRkkvoHRqxvduoAb1zdbCU vIOl/8S2lpRL+QPXTkLs= X-Received: by 2002:a0d:d9d5:0:b0:501:c848:f07a with SMTP id b204-20020a0dd9d5000000b00501c848f07amr360403ywe.2.1675793234043; Tue, 07 Feb 2023 10:07:14 -0800 (PST) X-Google-Smtp-Source: AK7set+ErkQhgbFNRuWPGJYg5+qX2yYMeH23FCrM1ukzYd4uMEBltTN3vAsCS+2s8iItacFtH2sm7TNfE18evw7k4KE= X-Received: by 2002:a0d:d9d5:0:b0:501:c848:f07a with SMTP id b204-20020a0dd9d5000000b00501c848f07amr360399ywe.2.1675793233788; Tue, 07 Feb 2023 10:07:13 -0800 (PST) MIME-Version: 1.0 References: <20230207151747.245808-1-maxime.coquelin@redhat.com> <20230207151747.245808-17-maxime.coquelin@redhat.com> In-Reply-To: <20230207151747.245808-17-maxime.coquelin@redhat.com> From: Eugenio Perez Martin Date: Tue, 7 Feb 2023 19:06:37 +0100 Message-ID: Subject: Re: [PATCH v2 16/21] net/virtio-user: allocate shadow control queue To: Maxime Coquelin Cc: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com, stephen@networkplumber.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 Tue, Feb 7, 2023 at 4:18 PM Maxime Coquelin wrote: > > If the backends supports control virtqueue, allocate a > shadow control virtqueue, and implement the notify callback > that writes into the kickfd. > > Signed-off-by: Maxime Coquelin > Reviewed-by: Chenbo Xia Even with the nitpick below, Acked-by: Eugenio P=C3=A9rez > --- > .../net/virtio/virtio_user/virtio_user_dev.c | 47 ++++++++++++++++++- > .../net/virtio/virtio_user/virtio_user_dev.h | 5 ++ > drivers/net/virtio/virtio_user_ethdev.c | 6 +++ > 3 files changed, 56 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/n= et/virtio/virtio_user/virtio_user_dev.c > index a3584e7735..16a0e07413 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c > @@ -146,8 +146,9 @@ virtio_user_dev_set_features(struct virtio_user_dev *= dev) > > /* Strip VIRTIO_NET_F_MAC, as MAC address is handled in vdev init= */ > features &=3D ~(1ull << VIRTIO_NET_F_MAC); > - /* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to k= now */ > - features &=3D ~(1ull << VIRTIO_NET_F_CTRL_VQ); > + /* Strip VIRTIO_NET_F_CTRL_VQ if the devices does not really supp= ort control VQ */ > + if (!dev->hw_cvq) > + features &=3D ~(1ull << VIRTIO_NET_F_CTRL_VQ); > features &=3D ~(1ull << VIRTIO_NET_F_STATUS); > ret =3D dev->ops->set_features(dev, features); > if (ret < 0) > @@ -911,6 +912,48 @@ virtio_user_handle_cq(struct virtio_user_dev *dev, u= int16_t queue_idx) > } > } > > +static void > +virtio_user_control_queue_notify(struct virtqueue *vq, void *cookie) > +{ > + struct virtio_user_dev *dev =3D cookie; > + uint64_t buf =3D 1; > + > + if (write(dev->kickfds[vq->vq_queue_index], &buf, sizeof(buf)) < = 0) > + PMD_DRV_LOG(ERR, "failed to kick backend: %s", > + strerror(errno)); > +} > + > +int > +virtio_user_dev_create_shadow_cvq(struct virtio_user_dev *dev, struct vi= rtqueue *vq) > +{ > + char name[VIRTQUEUE_MAX_NAME_SZ]; > + struct virtqueue *scvq; > + > + snprintf(name, sizeof(name), "port%d_shadow_cvq", vq->hw->port_id= ); > + scvq =3D virtqueue_alloc(&dev->hw, vq->vq_queue_index, vq->vq_nen= tries, > + VTNET_CQ, SOCKET_ID_ANY, name); > + if (!scvq) { > + PMD_INIT_LOG(ERR, "(%s) Failed to alloc shadow control vq= \n", dev->path); > + return -ENOMEM; > + } > + > + scvq->cq.notify_queue =3D &virtio_user_control_queue_notify; > + scvq->cq.notify_cookie =3D dev; > + dev->scvq =3D scvq; > + > + return 0; > +} > + > +void > +virtio_user_dev_destroy_shadow_cvq(struct virtio_user_dev *dev) > +{ > + if (!dev->scvq) > + return; > + > + virtqueue_free(dev->scvq); > + dev->scvq =3D NULL; > +} > + > int > virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status) > { > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/n= et/virtio/virtio_user/virtio_user_dev.h > index 3c5453eac0..e0db4faf3f 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h > @@ -58,6 +58,9 @@ struct virtio_user_dev { > pthread_mutex_t mutex; > bool started; > > + bool hw_cvq; > + struct virtqueue *scvq; > + > void *backend_data; > }; > > @@ -74,6 +77,8 @@ void virtio_user_handle_cq(struct virtio_user_dev *dev,= uint16_t queue_idx); > void virtio_user_handle_cq_packed(struct virtio_user_dev *dev, > uint16_t queue_idx); > uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pa= irs); > +int virtio_user_dev_create_shadow_cvq(struct virtio_user_dev *dev, struc= t virtqueue *vq); > +void virtio_user_dev_destroy_shadow_cvq(struct virtio_user_dev *dev); > int virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t stat= us); > int virtio_user_dev_update_status(struct virtio_user_dev *dev); > int virtio_user_dev_update_link_state(struct virtio_user_dev *dev); > diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio= /virtio_user_ethdev.c > index 6c3e875793..626bd95b62 100644 > --- a/drivers/net/virtio/virtio_user_ethdev.c > +++ b/drivers/net/virtio/virtio_user_ethdev.c > @@ -232,6 +232,9 @@ virtio_user_setup_queue(struct virtio_hw *hw, struct = virtqueue *vq) > else > virtio_user_setup_queue_split(vq, dev); > > + if (dev->hw_cvq && hw->cvq && (virtnet_cq_to_vq(hw->cvq) =3D=3D v= q)) > + return virtio_user_dev_create_shadow_cvq(dev, vq); > + > return 0; > } > > @@ -251,6 +254,9 @@ virtio_user_del_queue(struct virtio_hw *hw, struct vi= rtqueue *vq) > > close(dev->callfds[vq->vq_queue_index]); > close(dev->kickfds[vq->vq_queue_index]); > + > + if (hw->cvq && (virtnet_cq_to_vq(hw->cvq) =3D=3D vq) && dev->scvq= ) Not sure if intended, but check for dev->scvq is already in virtio_user_dev_destroy_shadow_cvq. > + virtio_user_dev_destroy_shadow_cvq(dev); > } > > static void > -- > 2.39.1 >