> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Wednesday, September 30, 2020 12:14 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; Fu, Patrick > <patrick...@intel.com>; amore...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH v3 4/8] net/virtio: introduce Vhost-vDPA backend type > > Backend type is determined by checking char-device major numbers > > Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com> > Signed-off-by: Adrian Moreno <amore...@redhat.com> > --- > .../net/virtio/virtio_user/virtio_user_dev.h | 1 + > drivers/net/virtio/virtio_user_ethdev.c | 48 +++++++++++++++++-- > 2 files changed, 45 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h > b/drivers/net/virtio/virtio_user/virtio_user_dev.h > index 575bf430c0..1c8c98b1cd 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h > @@ -14,6 +14,7 @@ enum virtio_user_backend_type { > VIRTIO_USER_BACKEND_UNKNOWN, > VIRTIO_USER_BACKEND_VHOST_USER, > VIRTIO_USER_BACKEND_VHOST_KERNEL, > + VIRTIO_USER_BACKEND_VHOST_VDPA, > }; > > struct virtio_user_queue { > diff --git a/drivers/net/virtio/virtio_user_ethdev.c > b/drivers/net/virtio/virtio_user_ethdev.c > index 38b49bad5f..3a51afd711 100644 > --- a/drivers/net/virtio/virtio_user_ethdev.c > +++ b/drivers/net/virtio/virtio_user_ethdev.c > @@ -6,7 +6,9 @@ > #include <sys/types.h> > #include <unistd.h> > #include <fcntl.h> > +#include <linux/major.h> > #include <sys/stat.h> > +#include <sys/sysmacros.h> > #include <sys/socket.h> > > #include <rte_malloc.h> > @@ -519,17 +521,55 @@ get_integer_arg(const char *key __rte_unused, > return -errno; > } > > +static uint32_t > +vdpa_dynamic_major_num(void) > +{ > + FILE *fp; > + char *line = NULL; > + size_t size; > + char name[11]; > + bool found = false; > + uint32_t num; > + > + fp = fopen("/proc/devices", "r"); > + if (fp == NULL) { > + PMD_INIT_LOG(ERR, "Cannot open /proc/devices: %s", > + strerror(errno)); > + return UNNAMED_MAJOR; > + } > + > + while (getline(&line, &size, fp) > 0) { > + char *stripped = line + strspn(line, " "); > + if ((sscanf(stripped, "%u %10s", &num, name) == 2) && > + (strncmp(name, "vhost-vdpa", 10) == 0)) { > + found = true; > + break; > + } > + } > + fclose(fp); > + return found ? num : UNNAMED_MAJOR; > +} > + > static enum virtio_user_backend_type > virtio_user_backend_type(const char *path) > { > struct stat sb; > > - if (stat(path, &sb) == -1) > + if (stat(path, &sb) == -1) { > + PMD_INIT_LOG(ERR, "Stat fails: %s (%s)\n", path, > + strerror(errno)); > return VIRTIO_USER_BACKEND_UNKNOWN; > + } > > - return S_ISSOCK(sb.st_mode) ? > - VIRTIO_USER_BACKEND_VHOST_USER : > - VIRTIO_USER_BACKEND_VHOST_KERNEL; > + if (S_ISSOCK(sb.st_mode)) { > + return VIRTIO_USER_BACKEND_VHOST_USER; > + } else if (S_ISCHR(sb.st_mode)) { > + if (major(sb.st_rdev) == MISC_MAJOR) > + return VIRTIO_USER_BACKEND_VHOST_KERNEL; > + if (major(sb.st_rdev) == vdpa_dynamic_major_num()) > + return VIRTIO_USER_BACKEND_VHOST_VDPA; > + } > + return VIRTIO_USER_BACKEND_UNKNOWN; > } > > static struct rte_eth_dev * > -- > 2.26.2
Reviewed-by: Chenbo Xia <chenbo....@intel.com>