Hi Maxime, > On 1/7/25 7:44 PM, Gowrishankar Muthukrishnan wrote: > > Move vhost-vdpa backend implementation into common folder. > > If we decided to have a common base for Virtio devices, which I think is a > good > idea to avoid needless duplication, we should do a deeper refactoring by > sharing all transport layers: PCI and Virtio-user. >
Yes, but our initial proposal in this RFC is to start with vDPA first. > I understand it is not realistic to do this for v25.03 release, so in the > mean time > I prefer you duplicate what you need from Vhost-vDPA implementation than > having an half-baked solution. > Ack. Thanks, Gowrishankar > Maintainers, what do you think? > > Thanks, > Maxime > > > Signed-off-by: Gowrishankar Muthukrishnan <gmuthukri...@marvell.com> > > --- > > Depends-on: patch-149672 ("vhost: include AKCIPHER algorithms in > > crypto_config") > > Depends-on: patch-148913 ("crypto/virtio: remove redundant crypto > > queue free") > > Depends-on: series-34293 ("crypto/virtio: add packed ring support") > > Depends-on: series-34291 ("crypto/virtio: add RSA support") > > > > > > drivers/common/virtio/meson.build | 13 +++++++++ > > drivers/common/virtio/version.map | 8 ++++++ > > .../virtio/virtio_user/vhost.h | 4 --- > > .../common/virtio/virtio_user/vhost_logs.h | 15 ++++++++++ > > .../virtio/virtio_user/vhost_vdpa.c | 28 ++++++++++++++++++- > > drivers/crypto/virtio/meson.build | 2 +- > > drivers/meson.build | 1 + > > drivers/net/virtio/meson.build | 3 +- > > drivers/net/virtio/virtio_user/vhost_kernel.c | 3 +- > > drivers/net/virtio/virtio_user/vhost_user.c | 3 +- > > .../net/virtio/virtio_user/virtio_user_dev.c | 5 ++-- > > .../net/virtio/virtio_user/virtio_user_dev.h | 24 +++++++++------- > > 12 files changed, 87 insertions(+), 22 deletions(-) > > create mode 100644 drivers/common/virtio/meson.build > > create mode 100644 drivers/common/virtio/version.map > > rename drivers/{net => common}/virtio/virtio_user/vhost.h (97%) > > create mode 100644 drivers/common/virtio/virtio_user/vhost_logs.h > > rename drivers/{net => common}/virtio/virtio_user/vhost_vdpa.c (97%) > > > > diff --git a/drivers/common/virtio/meson.build > > b/drivers/common/virtio/meson.build > > new file mode 100644 > > index 0000000000..a19db9e088 > > --- /dev/null > > +++ b/drivers/common/virtio/meson.build > > @@ -0,0 +1,13 @@ > > +# SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2025 Marvell > > + > > +if is_windows > > + build = false > > + reason = 'not supported on Windows' > > + subdir_done() > > +endif > > + > > +if is_linux > > + sources += files('virtio_user/vhost_vdpa.c') > > + deps += ['bus_vdev'] > > +endif > > diff --git a/drivers/common/virtio/version.map > > b/drivers/common/virtio/version.map > > new file mode 100644 > > index 0000000000..fb98a0ab2e > > --- /dev/null > > +++ b/drivers/common/virtio/version.map > > @@ -0,0 +1,8 @@ > > +INTERNAL { > > + global: > > + > > + virtio_ops_vdpa; > > + vhost_logtype_driver; > > + > > + local: *; > > +}; > > diff --git a/drivers/net/virtio/virtio_user/vhost.h > > b/drivers/common/virtio/virtio_user/vhost.h > > similarity index 97% > > rename from drivers/net/virtio/virtio_user/vhost.h > > rename to drivers/common/virtio/virtio_user/vhost.h > > index eee3a4bc47..adf6551681 100644 > > --- a/drivers/net/virtio/virtio_user/vhost.h > > +++ b/drivers/common/virtio/virtio_user/vhost.h > > @@ -11,10 +11,6 @@ > > > > #include <rte_errno.h> > > > > -#include "../virtio.h" > > -#include "../virtio_logs.h" > > -#include "../virtqueue.h" > > - > > struct vhost_vring_state { > > unsigned int index; > > unsigned int num; > > diff --git a/drivers/common/virtio/virtio_user/vhost_logs.h > > b/drivers/common/virtio/virtio_user/vhost_logs.h > > new file mode 100644 > > index 0000000000..653d4d0b5e > > --- /dev/null > > +++ b/drivers/common/virtio/virtio_user/vhost_logs.h > > @@ -0,0 +1,15 @@ > > +/* SPDX-License-Identifier: BSD-3-Clause > > + * Copyright(C) 2025 Marvell > > + */ > > + > > +#ifndef _VHOST_LOGS_H_ > > +#define _VHOST_LOGS_H_ > > + > > +#include <rte_log.h> > > + > > +extern int vhost_logtype_driver; > > +#define RTE_LOGTYPE_VHOST_DRIVER vhost_logtype_driver #define > > +PMD_DRV_LOG(level, ...) \ > > + RTE_LOG_LINE_PREFIX(level, VHOST_DRIVER, "%s(): ", __func__, > > +__VA_ARGS__) > > + > > +#endif /* _VHOST_LOGS_H_ */ > > diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c > > b/drivers/common/virtio/virtio_user/vhost_vdpa.c > > similarity index 97% > > rename from drivers/net/virtio/virtio_user/vhost_vdpa.c > > rename to drivers/common/virtio/virtio_user/vhost_vdpa.c > > index bc3e2a9af5..af5c4cbf33 100644 > > --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c > > +++ b/drivers/common/virtio/virtio_user/vhost_vdpa.c > > @@ -9,11 +9,12 @@ > > #include <fcntl.h> > > #include <stdlib.h> > > #include <unistd.h> > > +#include <inttypes.h> > > > > #include <rte_memory.h> > > > > #include "vhost.h" > > -#include "virtio_user_dev.h" > > +#include "vhost_logs.h" > > > > struct vhost_vdpa_data { > > int vhostfd; > > @@ -100,6 +101,29 @@ vhost_vdpa_ioctl(int fd, uint64_t request, void > *arg) > > return 0; > > } > > > > +struct virtio_hw { > > + struct virtqueue **vqs; > > +}; > > + > > +struct virtio_user_dev { > > + union { > > + struct virtio_hw hw; > > + uint8_t dummy[256]; > > + }; > > + > > + void *backend_data; > > + uint16_t **notify_area; > > + char path[PATH_MAX]; > > + bool hw_cvq; > > + uint16_t max_queue_pairs; > > + uint64_t device_features; > > + bool *qp_enabled; > > +}; > > + > > +#define VIRTIO_NET_F_CTRL_VQ 17 > > +#define VIRTIO_F_IOMMU_PLATFORM 33 > > +#define VIRTIO_ID_NETWORK 0x01 > > + > > static int > > vhost_vdpa_set_owner(struct virtio_user_dev *dev) > > { > > @@ -715,3 +739,5 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { > > .map_notification_area = vhost_vdpa_map_notification_area, > > .unmap_notification_area = vhost_vdpa_unmap_notification_area, > > }; > > + > > +RTE_LOG_REGISTER_SUFFIX(vhost_logtype_driver, driver, NOTICE); > > diff --git a/drivers/crypto/virtio/meson.build > > b/drivers/crypto/virtio/meson.build > > index d2c3b3ad07..8181c8296f 100644 > > --- a/drivers/crypto/virtio/meson.build > > +++ b/drivers/crypto/virtio/meson.build > > @@ -8,7 +8,7 @@ if is_windows > > endif > > > > includes += include_directories('../../../lib/vhost') > > -deps += 'bus_pci' > > +deps += ['bus_pci', 'common_virtio'] > > sources = files( > > 'virtio_cryptodev.c', > > 'virtio_cvq.c', > > diff --git a/drivers/meson.build b/drivers/meson.build index > > 495e21b54a..2f0d312479 100644 > > --- a/drivers/meson.build > > +++ b/drivers/meson.build > > @@ -17,6 +17,7 @@ subdirs = [ > > 'common/nitrox', # depends on bus. > > 'common/qat', # depends on bus. > > 'common/sfc_efx', # depends on bus. > > + 'common/virtio', # depends on bus. > > 'mempool', # depends on common and bus. > > 'dma', # depends on common and bus. > > 'net', # depends on common, bus, mempool > > diff --git a/drivers/net/virtio/meson.build > > b/drivers/net/virtio/meson.build index 02742da5c2..bbd73741f0 100644 > > --- a/drivers/net/virtio/meson.build > > +++ b/drivers/net/virtio/meson.build > > @@ -54,7 +54,6 @@ if is_linux > > 'virtio_user/vhost_kernel.c', > > 'virtio_user/vhost_kernel_tap.c', > > 'virtio_user/vhost_user.c', > > - 'virtio_user/vhost_vdpa.c', > > 'virtio_user/virtio_user_dev.c') > > - deps += ['bus_vdev'] > > + deps += ['bus_vdev', 'common_virtio'] > > endif > > diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c > > b/drivers/net/virtio/virtio_user/vhost_kernel.c > > index e42bb35935..3a95ce34d6 100644 > > --- a/drivers/net/virtio/virtio_user/vhost_kernel.c > > +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c > > @@ -11,9 +11,10 @@ > > > > #include <rte_memory.h> > > > > -#include "vhost.h" > > +#include "virtio_user/vhost.h" > > #include "virtio_user_dev.h" > > #include "vhost_kernel_tap.h" > > +#include "../virtqueue.h" > > > > struct vhost_kernel_data { > > int *vhostfds; > > diff --git a/drivers/net/virtio/virtio_user/vhost_user.c > > b/drivers/net/virtio/virtio_user/vhost_user.c > > index c10252506b..2a158aff7e 100644 > > --- a/drivers/net/virtio/virtio_user/vhost_user.c > > +++ b/drivers/net/virtio/virtio_user/vhost_user.c > > @@ -16,7 +16,8 @@ > > #include <rte_string_fns.h> > > #include <rte_fbarray.h> > > > > -#include "vhost.h" > > +#include "virtio_user/vhost_logs.h" > > +#include "virtio_user/vhost.h" > > #include "virtio_user_dev.h" > > > > struct vhost_user_data { > > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c > > b/drivers/net/virtio/virtio_user/virtio_user_dev.c > > index 2997d2bd26..7105c54b43 100644 > > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c > > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c > > @@ -20,10 +20,11 @@ > > #include <rte_malloc.h> > > #include <rte_io.h> > > > > -#include "vhost.h" > > -#include "virtio.h" > > +#include "virtio_user/vhost.h" > > #include "virtio_user_dev.h" > > +#include "../virtqueue.h" > > #include "../virtio_ethdev.h" > > +#include "../virtio_logs.h" > > > > #define VIRTIO_USER_MEM_EVENT_CLB_NAME > "virtio_user_mem_event_clb" > > > > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h > > b/drivers/net/virtio/virtio_user/virtio_user_dev.h > > index 66400b3b62..70604d6956 100644 > > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h > > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h > > @@ -25,26 +25,36 @@ struct virtio_user_queue { > > }; > > > > struct virtio_user_dev { > > - struct virtio_hw hw; > > + union { > > + struct virtio_hw hw; > > + uint8_t dummy[256]; > > + }; > > + > > + void *backend_data; > > + uint16_t **notify_area; > > + char path[PATH_MAX]; > > + bool hw_cvq; > > + uint16_t max_queue_pairs; > > + uint64_t device_features; /* supported features by device */ > > + bool *qp_enabled; > > + > > enum virtio_user_backend_type backend_type; > > bool is_server; /* server or client mode */ > > > > int *callfds; > > int *kickfds; > > int mac_specified; > > - uint16_t max_queue_pairs; > > + > > uint16_t queue_pairs; > > uint32_t queue_size; > > uint64_t features; /* the negotiated features with driver, > > * and will be sync with device > > */ > > - uint64_t device_features; /* supported features by device */ > > uint64_t frontend_features; /* enabled frontend features */ > > uint64_t unsupported_features; /* unsupported features mask > */ > > uint8_t status; > > uint16_t net_status; > > uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; > > - char path[PATH_MAX]; > > char *ifname; > > > > union { > > @@ -54,18 +64,12 @@ struct virtio_user_dev { > > } vrings; > > > > struct virtio_user_queue *packed_queues; > > - bool *qp_enabled; > > > > struct virtio_user_backend_ops *ops; > > pthread_mutex_t mutex; > > bool started; > > > > - bool hw_cvq; > > struct virtqueue *scvq; > > - > > - void *backend_data; > > - > > - uint16_t **notify_area; > > }; > > > > int virtio_user_dev_set_features(struct virtio_user_dev *dev);