[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC v1 3/4] vhost-vdpa: implement vhost-vdpa backend
From: |
Maxime Coquelin |
Subject: |
Re: [RFC v1 3/4] vhost-vdpa: implement vhost-vdpa backend |
Date: |
Thu, 7 May 2020 17:12:37 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 |
On 4/20/20 11:32 AM, Cindy Lu wrote:
> Currently we have 2 types of vhost backends in QEMU: vhost kernel and
> vhost-user. The above patch provides a generic device for vDPA purpose,
> this vDPA device exposes to user space a non-vendor-specific configuration
> interface for setting up a vhost HW accelerator, this patch set introduces
> a third vhost backend called vhost-vdpa based on the vDPA interface.
>
> Vhost-vdpa usage:
>
> qemu-system-x86_64 -cpu host -enable-kvm \
> ......
> -netdev type=vhost-vdpa,vhostdev=/dev/vhost-vdpa-id,id=vhost-vdpa0 \
> -device virtio-net-pci,netdev=vhost-vdpa0,page-per-vq=on \
>
> Author: Tiwei Bie
> Signed-off-by: Cindy Lu <address@hidden>
> ---
> hw/net/vhost_net.c | 43 ++++
> hw/net/virtio-net.c | 9 +
> hw/virtio/Makefile.objs | 2 +-
> hw/virtio/vhost-backend.c | 3 +
> hw/virtio/vhost-vdpa.c | 379 ++++++++++++++++++++++++++++++
> hw/virtio/vhost.c | 5 +
> include/hw/virtio/vhost-backend.h | 6 +-
> include/hw/virtio/vhost-vdpa.h | 14 ++
> 8 files changed, 459 insertions(+), 2 deletions(-)
> create mode 100644 hw/virtio/vhost-vdpa.c
> create mode 100644 include/hw/virtio/vhost-vdpa.h
>
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 4096d64aaf..0d13fda2fc 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -17,8 +17,10 @@
> #include "net/net.h"
> #include "net/tap.h"
> #include "net/vhost-user.h"
> +#include "net/vhost-vdpa.h"
>
> #include "standard-headers/linux/vhost_types.h"
> +#include "linux-headers/linux/vhost.h"
> #include "hw/virtio/virtio-net.h"
> #include "net/vhost_net.h"
> #include "qemu/error-report.h"
> @@ -85,6 +87,29 @@ static const int user_feature_bits[] = {
> VHOST_INVALID_FEATURE_BIT
> };
>
> +static const int vdpa_feature_bits[] = {
> + VIRTIO_F_NOTIFY_ON_EMPTY,
> + VIRTIO_RING_F_INDIRECT_DESC,
> + VIRTIO_RING_F_EVENT_IDX,
> + VIRTIO_F_ANY_LAYOUT,
> + VIRTIO_F_VERSION_1,
> + VIRTIO_NET_F_CSUM,
> + VIRTIO_NET_F_GUEST_CSUM,
> + VIRTIO_NET_F_GSO,
> + VIRTIO_NET_F_GUEST_TSO4,
> + VIRTIO_NET_F_GUEST_TSO6,
> + VIRTIO_NET_F_GUEST_ECN,
> + VIRTIO_NET_F_GUEST_UFO,
> + VIRTIO_NET_F_HOST_TSO4,
> + VIRTIO_NET_F_HOST_TSO6,
> + VIRTIO_NET_F_HOST_ECN,
> + VIRTIO_NET_F_HOST_UFO,
> + VIRTIO_NET_F_MRG_RXBUF,
> + VIRTIO_NET_F_MTU,
> + VIRTIO_F_IOMMU_PLATFORM,
> + VIRTIO_NET_F_GUEST_ANNOUNCE,
> + VHOST_INVALID_FEATURE_BIT
> +};
> static const int *vhost_net_get_feature_bits(struct vhost_net *net)
> {
> const int *feature_bits = 0;
> @@ -96,6 +121,9 @@ static const int *vhost_net_get_feature_bits(struct
> vhost_net *net)
> case NET_CLIENT_DRIVER_VHOST_USER:
> feature_bits = user_feature_bits;
> break;
> + case NET_CLIENT_DRIVER_VHOST_VDPA:
> + feature_bits = vdpa_feature_bits;
> + break;
> default:
> error_report("Feature bits not defined for this type: %d",
> net->nc->info->type);
> @@ -434,6 +462,10 @@ VHostNetState *get_vhost_net(NetClientState *nc)
> assert(vhost_net);
> break;
> #endif
> + case NET_CLIENT_DRIVER_VHOST_VDPA:
> + vhost_net = vhost_vdpa_get_vhost_net(nc);
> + assert(vhost_net);
> + break;
> default:
> break;
> }
> @@ -465,3 +497,14 @@ int vhost_net_set_mtu(struct vhost_net *net, uint16_t
> mtu)
>
> return vhost_ops->vhost_net_set_mtu(&net->dev, mtu);
> }
> +int vhost_set_state(NetClientState *nc, int state)
> +{
> + struct vhost_net *net = get_vhost_net(nc);
> + struct vhost_dev *hdev = &net->dev;
> + if (nc->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) {
Maybe checking the vhost_set_state callback is implemented is enough,
and it is not need to restrict that to Vhost-vDPA?
> + if (hdev->vhost_ops->vhost_set_state) {
> + return hdev->vhost_ops->vhost_set_state(hdev, state);
> + }
> + }
> + return 0;
> +}
- Re: [RFC v1 3/4] vhost-vdpa: implement vhost-vdpa backend,
Maxime Coquelin <=