[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC v1 3/4] vhost-vdpa: implement vhost-vdpa backend
From: |
Cindy Lu |
Subject: |
Re: [RFC v1 3/4] vhost-vdpa: implement vhost-vdpa backend |
Date: |
Thu, 7 May 2020 23:56:59 +0800 |
On Thu, May 7, 2020 at 11:13 PM Maxime Coquelin
<address@hidden> wrote:
>
>
>
> 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?
Sure, Will remove this
> > + if (hdev->vhost_ops->vhost_set_state) {
> > + return hdev->vhost_ops->vhost_set_state(hdev, state);
> > + }
> > + }
> > + return 0;
> > +}
>