All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Wu Zongyong <wuzongyong@linux.alibaba.com>
Cc: jasowang@redhat.com, virtualization@lists.linux-foundation.org,
	linux-kernel@vger.kernel.org, wei.yang1@linux.alibaba.com
Subject: Re: [PATCH 6/6] vp_vdpa: introduce legacy virtio pci driver
Date: Fri, 10 Sep 2021 05:57:15 -0400	[thread overview]
Message-ID: <20210910055510-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20210910022818.GB17535@L-PF27918B-1352.localdomain>

On Fri, Sep 10, 2021 at 10:28:18AM +0800, Wu Zongyong wrote:
> On Thu, Sep 09, 2021 at 09:57:50AM -0400, Michael S. Tsirkin wrote:
> > On Wed, Sep 08, 2021 at 08:20:37PM +0800, Wu Zongyong wrote:
> > > This patch implements a vdpa driver for legacy virtio-pci device. And
> > > this has been tested with the ENI(Elastic Network Interface) which is a
> > > hardware virtio network device in Alibaba ECS baremetal instance.
> > > 
> > > Note that legacy device doesn't support to change the virtqueue size, so
> > > users should use get_vq_num_unchangeable callback to check if the
> > > virqueue size can be changed.
> > 
> > Hmm isn't this implicit in this being a legacy device?
> > 
> Yes, but there is no way to report the backend device is legacy for
> users. So I add a new callback get_vq_num_unchangeable to indicate it.

Legacy is actually easy. It does not have VIRTIO_F_VERSION_1.
Transitional devices with two interfaces are trickier.

These really need an ioctl so userspace can tell vdpa
whether it's being used through a legacy or modern interface.


> > > If not, users should get the virqueue size
> > > first by the get_vq_num_max callback first then allocate same size
> > > memory for the virtqueue otherwise the device won't work correctly.
> > > 
> > > Signed-off-by: Wu Zongyong <wuzongyong@linux.alibaba.com>
> > > ---
> > >  drivers/vdpa/Kconfig                     |   7 +
> > >  drivers/vdpa/virtio_pci/Makefile         |   1 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_common.c |   5 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_common.h |  11 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_legacy.c | 346 +++++++++++++++++++++++
> > >  5 files changed, 370 insertions(+)
> > >  create mode 100644 drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > 
> > > diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig
> > > index a503c1b2bfd9..ccb4fdb11f0f 100644
> > > --- a/drivers/vdpa/Kconfig
> > > +++ b/drivers/vdpa/Kconfig
> > > @@ -67,4 +67,11 @@ config VP_VDPA
> > >  	help
> > >  	  This kernel module bridges virtio PCI device to vDPA bus.
> > >  
> > > +config VP_VDPA_LEGACY
> > > +	bool "Support legacy virtio pci device"
> > > +	depends on VP_VDPA
> > > +	select VIRTIO_PCI_LIB_LEGACY
> > > +	help
> > > +	  This option enables bridges legacy virito PCI device to vDPA bus.
> > > +
> > >  endif # VDPA
> > > diff --git a/drivers/vdpa/virtio_pci/Makefile b/drivers/vdpa/virtio_pci/Makefile
> > > index a772d86952b1..77c52dfb8b56 100644
> > > --- a/drivers/vdpa/virtio_pci/Makefile
> > > +++ b/drivers/vdpa/virtio_pci/Makefile
> > > @@ -1,4 +1,5 @@
> > >  # SPDX-License-Identifier: GPL-2.0
> > >  
> > >  vp_vdpa-y += vp_vdpa_common.o vp_vdpa_modern.o
> > > +vp_vdpa-$(CONFIG_VP_VDPA_LEGACY) += vp_vdpa_legacy.o
> > >  obj-$(CONFIG_VP_VDPA) += vp_vdpa.o
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_common.c b/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > index 3ff24c9ad6e4..fa91dc153244 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > @@ -8,6 +8,7 @@
> > >   * Based on virtio_pci_modern.c.
> > >   */
> > >  
> > > +#include "linux/err.h"
> > >  #include <linux/irqreturn.h>
> > >  #include <linux/interrupt.h>
> > >  #include "vp_vdpa_common.h"
> > > @@ -172,6 +173,10 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> > >  		return ret;
> > >  
> > >  	vp_vdpa = vp_vdpa_modern_probe(pdev);
> > > +	if (PTR_ERR(vp_vdpa) == -ENODEV) {
> > > +		dev_info(&pdev->dev, "Tring legacy driver");
> > > +		vp_vdpa = vp_vdpa_legacy_probe(pdev);
> > > +	}
> > >  	if (IS_ERR(vp_vdpa))
> > >  		return PTR_ERR(vp_vdpa);
> > >  
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_common.h b/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > index 57886b55a2e9..39f241d8321b 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > @@ -10,6 +10,7 @@
> > >  #include <linux/virtio_ring.h>
> > >  #include <linux/virtio_pci.h>
> > >  #include <linux/virtio_pci_modern.h>
> > > +#include <linux/virtio_pci_legacy.h>
> > >  
> > >  #define VP_VDPA_DRIVER_NAME "vp_vdpa"
> > >  #define VP_VDPA_NAME_SIZE 256
> > > @@ -26,6 +27,7 @@ struct vp_vdpa {
> > >  	struct vdpa_device vdpa;
> > >  	struct pci_dev *pci_dev;
> > >  	struct virtio_pci_modern_device mdev;
> > > +	struct virtio_pci_legacy_device ldev;
> > >  	struct vp_vring *vring;
> > >  	struct vdpa_callback config_cb;
> > >  	char msix_name[VP_VDPA_NAME_SIZE];
> > > @@ -53,4 +55,13 @@ void vp_vdpa_free_irq_vectors(void *data);
> > >  
> > >  struct vp_vdpa *vp_vdpa_modern_probe(struct pci_dev *pdev);
> > >  
> > > +#if IS_ENABLED(CONFIG_VP_VDPA_LEGACY)
> > > +struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev);
> > > +#else
> > > +static inline struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev)
> > > +{
> > > +	return ERR_PTR(-ENODEV);
> > > +}
> > > +#endif
> > > +
> > >  #endif
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c b/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > new file mode 100644
> > > index 000000000000..75a6879a27ca
> > > --- /dev/null
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > @@ -0,0 +1,346 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * vDPA bridge driver for legacy virtio-pci device
> > > + *
> > > + * Copyright (c) 2021, Alibaba Inc. All rights reserved.
> > > + * Author: Wu Zongyong <wuzongyong@linux.alibaba.com>
> > > + */
> > > +
> > > +#include "linux/pci.h"
> > > +#include "linux/virtio_byteorder.h"
> > > +#include "linux/virtio_pci_legacy.h"
> > > +#include <uapi/linux/virtio_net.h>
> > > +#include <uapi/linux/virtio_blk.h>
> > > +#include <linux/virtio_ids.h>
> > > +#include <linux/virtio_pci.h>
> > > +#include "vp_vdpa_common.h"
> > > +
> > > +static struct virtio_pci_legacy_device *vdpa_to_ldev(struct vdpa_device *vdpa)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +
> > > +	return &vp_vdpa->ldev;
> > > +}
> > > +
> > > +static u64 vp_vdpa_get_features(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_features(ldev);
> > > +}
> > > +
> > > +static int vp_vdpa_set_features(struct vdpa_device *vdpa, u64 features)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	vp_legacy_set_features(ldev, features);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static u8 vp_vdpa_get_status(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_status(ldev);
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_state_split(struct vdpa_device *vdpa,
> > > +				      const struct vdpa_vq_state *state)
> > > +{
> > > +	const struct vdpa_vq_state_split *split = &state->split;
> > > +
> > > +	if (split->avail_index == 0)
> > > +		return 0;
> > > +
> > > +	return -EOPNOTSUPP;
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 qid,
> > > +				const struct vdpa_vq_state *state)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* Note that this is not supported by virtio specification.
> > > +	 * But if the state is by chance equal to the device initial
> > > +	 * state, we can let it go.
> > > +	 */
> > > +	if (!vp_legacy_get_queue_enable(ldev, qid))
> > > +		return vp_vdpa_set_vq_state_split(vdpa,	state);
> > > +
> > > +	return -EOPNOTSUPP;
> > > +}
> > > +
> > > +static void vp_vdpa_set_vq_ready(struct vdpa_device *vdpa,
> > > +				 u16 qid, bool ready)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* Legacy devices can only be activated by setting vq address,
> > > +	 * and queue_enable is not supported by specification. So for
> > > +	 * legacy devices, we use @vp_vdpa_set_vq_address to set vq
> > > +	 * ready instead.
> > > +	 */
> > > +	if (!ready)
> > > +		vp_legacy_set_queue_address(ldev, qid, 0);
> > > +}
> > > +
> > > +static bool vp_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 qid)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_queue_enable(ldev, qid);
> > > +}
> > > +
> > > +/* Legacy devices don't support set vq num by specification,
> > > + * just report an error if someone try to set it.
> > > + */
> > > +static void vp_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 qid,
> > > +			       u32 num)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	dev_err(&ldev->pci_dev->dev, "legacy device don't support set vq num\n");
> > > +}
> > > +
> > > +static u16 vp_vdpa_get_vq_num_max(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* assume all virtqueues have the same size */
> > > +	return vp_legacy_get_queue_size(ldev, 0);
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 qid,
> > > +				  u64 desc_area, u64 driver_area,
> > > +				  u64 device_area)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	vp_legacy_set_queue_address(ldev, qid, desc_area >> VIRTIO_PCI_QUEUE_ADDR_SHIFT);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static u32 vp_vdpa_get_device_id(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return ldev->id.device;
> > > +}
> > > +
> > > +static u32 vp_vdpa_get_vendor_id(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return ldev->id.vendor;
> > > +}
> > > +
> > > +static size_t vp_vdpa_get_config_size(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +	size_t size;
> > > +
> > > +	switch (ldev->id.device) {
> > > +	case VIRTIO_ID_NET:
> > > +		size = sizeof(struct virtio_net_config);
> > > +		break;
> > > +	case VIRTIO_ID_BLOCK:
> > > +		size = sizeof(struct virtio_blk_config);
> > > +		break;
> > > +	default:
> > > +		size = 0;
> > > +		dev_err(&ldev->pci_dev->dev, "VIRTIO ID %u not support\n", ldev->id.device);
> > > +	}
> > > +
> > > +	return size;
> > > +}
> > > +
> > > +static void vp_vdpa_get_config(struct vdpa_device *vdpa,
> > > +			       unsigned int offset,
> > > +			       void *buf, unsigned int len)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	void __iomem *ioaddr = ldev->ioaddr +
> > > +		VIRTIO_PCI_CONFIG_OFF(vp_vdpa->vectors) +
> > > +		offset;
> > > +	u8 *p = buf;
> > > +	int i;
> > > +
> > > +	/* legacy devices don't have a configuration generation field,
> > > +	 * so we just read it once.
> > > +	 */
> > > +	for (i = 0; i < len; i++)
> > > +		*p++ = ioread8(ioaddr + i);
> > > +}
> > > +
> > > +static void vp_vdpa_set_config(struct vdpa_device *vdpa,
> > > +			       unsigned int offset, const void *buf,
> > > +			       unsigned int len)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	void __iomem *ioaddr = ldev->ioaddr +
> > > +		VIRTIO_PCI_CONFIG_OFF(vp_vdpa->vectors) +
> > > +		offset;
> > > +	const u8 *p = buf;
> > > +	int i;
> > > +
> > > +	for (i = 0; i < len; i++)
> > > +		iowrite8(*p++, ioaddr + i);
> > > +}
> > > +
> > > +static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	u8 s = vp_vdpa_get_status(vdpa);
> > > +
> > > +	if (status & VIRTIO_CONFIG_S_DRIVER_OK &&
> > > +	    !(s & VIRTIO_CONFIG_S_DRIVER_OK)) {
> > > +		vp_vdpa_request_irq(vp_vdpa);
> > > +	}
> > > +
> > > +	vp_legacy_set_status(ldev, status);
> > > +
> > > +	if (!(status & VIRTIO_CONFIG_S_DRIVER_OK) &&
> > > +	    (s & VIRTIO_CONFIG_S_DRIVER_OK)) {
> > > +		vp_vdpa_free_irq(vp_vdpa);
> > > +	}
> > > +}
> > > +
> > > +static bool vp_vdpa_get_vq_num_unchangeable(struct vdpa_device *vdpa)
> > > +{
> > > +	return true;
> > > +}
> > > +
> > > +static const struct vdpa_config_ops vp_vdpa_ops = {
> > > +	.get_features	= vp_vdpa_get_features,
> > > +	.set_features	= vp_vdpa_set_features,
> > > +	.get_status	= vp_vdpa_get_status,
> > > +	.set_status	= vp_vdpa_set_status,
> > > +	.get_vq_num_max	= vp_vdpa_get_vq_num_max,
> > > +	.get_vq_state	= vp_vdpa_get_vq_state,
> > > +	.set_vq_state	= vp_vdpa_set_vq_state,
> > > +	.set_vq_cb	= vp_vdpa_set_vq_cb,
> > > +	.set_vq_ready	= vp_vdpa_set_vq_ready,
> > > +	.get_vq_ready	= vp_vdpa_get_vq_ready,
> > > +	.set_vq_num	= vp_vdpa_set_vq_num,
> > > +	.set_vq_address	= vp_vdpa_set_vq_address,
> > > +	.kick_vq	= vp_vdpa_kick_vq,
> > > +	.get_device_id	= vp_vdpa_get_device_id,
> > > +	.get_vendor_id	= vp_vdpa_get_vendor_id,
> > > +	.get_vq_align	= vp_vdpa_get_vq_align,
> > > +	.get_config_size = vp_vdpa_get_config_size,
> > > +	.get_config	= vp_vdpa_get_config,
> > > +	.set_config	= vp_vdpa_set_config,
> > > +	.set_config_cb  = vp_vdpa_set_config_cb,
> > > +	.get_vq_irq	= vp_vdpa_get_vq_irq,
> > > +	.get_vq_num_unchangeable = vp_vdpa_get_vq_num_unchangeable,
> > > +};
> > > +
> > > +static u16 vp_vdpa_get_num_queues(struct vp_vdpa *vp_vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	u32 features = vp_legacy_get_features(ldev);
> > > +	u16 num;
> > > +
> > > +	switch (ldev->id.device) {
> > > +	case VIRTIO_ID_NET:
> > > +		num = 2;
> > > +		if (features & VIRTIO_NET_F_MQ) {
> > > +			__virtio16 max_virtqueue_pairs;
> > > +
> > > +			vp_vdpa_get_config(&vp_vdpa->vdpa,
> > > +				offsetof(struct virtio_net_config, max_virtqueue_pairs),
> > > +				&max_virtqueue_pairs,
> > > +				sizeof(max_virtqueue_pairs));
> > > +			num = 2 * __virtio16_to_cpu(virtio_legacy_is_little_endian(),
> > > +						max_virtqueue_pairs);
> > > +		}
> > > +
> > > +		if (features & VIRTIO_NET_F_CTRL_VQ)
> > > +			num += 1;
> > > +		break;
> > > +	case VIRTIO_ID_BLOCK:
> > > +		num = 1;
> > > +		break;
> > > +	default:
> > > +		num = 0;
> > > +		dev_err(&ldev->pci_dev->dev, "VIRTIO ID %u not support\n", ldev->id.device);
> > > +	}
> > > +
> > > +	return num;
> > > +}
> > > +
> > > +static u16 vp_vdpa_queue_vector(struct vp_vdpa *vp_vdpa, u16 idx, u16 vector)
> > > +{
> > > +	return vp_legacy_queue_vector(&vp_vdpa->ldev, idx, vector);
> > > +}
> > > +
> > > +static u16 vp_vdpa_config_vector(struct vp_vdpa *vp_vdpa, u16 vector)
> > > +{
> > > +	return vp_legacy_config_vector(&vp_vdpa->ldev, vector);
> > > +}
> > > +
> > > +struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev)
> > > +{
> > > +	struct device *dev = &pdev->dev;
> > > +	struct vp_vdpa *vp_vdpa;
> > > +	struct virtio_pci_legacy_device *ldev;
> > > +	int ret, i;
> > > +
> > > +	vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa, dev, &vp_vdpa_ops, NULL);
> > > +	if (vp_vdpa == NULL) {
> > > +		dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
> > > +		return ERR_PTR(-ENOMEM);
> > > +	}
> > > +
> > > +	ldev = &vp_vdpa->ldev;
> > > +	ldev->pci_dev = pdev;
> > > +
> > > +	ret = vp_legacy_probe(ldev);
> > > +	if (ret) {
> > > +		dev_err(dev, "Failed to probe legacy PCI device\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	pci_set_master(pdev);
> > > +	pci_set_drvdata(pdev, vp_vdpa);
> > > +
> > > +	vp_vdpa->vdpa.dma_dev = &pdev->dev;
> > > +	vp_vdpa->queues = vp_vdpa_get_num_queues(vp_vdpa);
> > > +
> > > +	ret = devm_add_action_or_reset(dev, vp_vdpa_free_irq_vectors, pdev);
> > > +	if (ret) {
> > > +		dev_err(dev,
> > > +			"Failed for adding devres for freeing irq vectors\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	vp_vdpa->vring = devm_kcalloc(dev, vp_vdpa->queues,
> > > +				      sizeof(*vp_vdpa->vring),
> > > +				      GFP_KERNEL);
> > > +	if (!vp_vdpa->vring) {
> > > +		ret = -ENOMEM;
> > > +		dev_err(dev, "Fail to allocate virtqueues\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	for (i = 0; i < vp_vdpa->queues; i++) {
> > > +		vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
> > > +		vp_vdpa->vring[i].notify = ldev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY;
> > > +		vp_vdpa->vring[i].notify_pa = pci_resource_start(pdev, 0) + VIRTIO_PCI_QUEUE_NOTIFY;
> > > +	}
> > > +	vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
> > > +
> > > +	vp_vdpa->queue_vector = vp_vdpa_queue_vector;
> > > +	vp_vdpa->config_vector = vp_vdpa_config_vector;
> > > +
> > > +	return vp_vdpa;
> > > +
> > > +err:
> > > +	put_device(&vp_vdpa->vdpa.dev);
> > > +	return ERR_PTR(ret);
> > > +}
> > > -- 
> > > 2.31.1


WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Wu Zongyong <wuzongyong@linux.alibaba.com>
Cc: wei.yang1@linux.alibaba.com, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org
Subject: Re: [PATCH 6/6] vp_vdpa: introduce legacy virtio pci driver
Date: Fri, 10 Sep 2021 05:57:15 -0400	[thread overview]
Message-ID: <20210910055510-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20210910022818.GB17535@L-PF27918B-1352.localdomain>

On Fri, Sep 10, 2021 at 10:28:18AM +0800, Wu Zongyong wrote:
> On Thu, Sep 09, 2021 at 09:57:50AM -0400, Michael S. Tsirkin wrote:
> > On Wed, Sep 08, 2021 at 08:20:37PM +0800, Wu Zongyong wrote:
> > > This patch implements a vdpa driver for legacy virtio-pci device. And
> > > this has been tested with the ENI(Elastic Network Interface) which is a
> > > hardware virtio network device in Alibaba ECS baremetal instance.
> > > 
> > > Note that legacy device doesn't support to change the virtqueue size, so
> > > users should use get_vq_num_unchangeable callback to check if the
> > > virqueue size can be changed.
> > 
> > Hmm isn't this implicit in this being a legacy device?
> > 
> Yes, but there is no way to report the backend device is legacy for
> users. So I add a new callback get_vq_num_unchangeable to indicate it.

Legacy is actually easy. It does not have VIRTIO_F_VERSION_1.
Transitional devices with two interfaces are trickier.

These really need an ioctl so userspace can tell vdpa
whether it's being used through a legacy or modern interface.


> > > If not, users should get the virqueue size
> > > first by the get_vq_num_max callback first then allocate same size
> > > memory for the virtqueue otherwise the device won't work correctly.
> > > 
> > > Signed-off-by: Wu Zongyong <wuzongyong@linux.alibaba.com>
> > > ---
> > >  drivers/vdpa/Kconfig                     |   7 +
> > >  drivers/vdpa/virtio_pci/Makefile         |   1 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_common.c |   5 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_common.h |  11 +
> > >  drivers/vdpa/virtio_pci/vp_vdpa_legacy.c | 346 +++++++++++++++++++++++
> > >  5 files changed, 370 insertions(+)
> > >  create mode 100644 drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > 
> > > diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig
> > > index a503c1b2bfd9..ccb4fdb11f0f 100644
> > > --- a/drivers/vdpa/Kconfig
> > > +++ b/drivers/vdpa/Kconfig
> > > @@ -67,4 +67,11 @@ config VP_VDPA
> > >  	help
> > >  	  This kernel module bridges virtio PCI device to vDPA bus.
> > >  
> > > +config VP_VDPA_LEGACY
> > > +	bool "Support legacy virtio pci device"
> > > +	depends on VP_VDPA
> > > +	select VIRTIO_PCI_LIB_LEGACY
> > > +	help
> > > +	  This option enables bridges legacy virito PCI device to vDPA bus.
> > > +
> > >  endif # VDPA
> > > diff --git a/drivers/vdpa/virtio_pci/Makefile b/drivers/vdpa/virtio_pci/Makefile
> > > index a772d86952b1..77c52dfb8b56 100644
> > > --- a/drivers/vdpa/virtio_pci/Makefile
> > > +++ b/drivers/vdpa/virtio_pci/Makefile
> > > @@ -1,4 +1,5 @@
> > >  # SPDX-License-Identifier: GPL-2.0
> > >  
> > >  vp_vdpa-y += vp_vdpa_common.o vp_vdpa_modern.o
> > > +vp_vdpa-$(CONFIG_VP_VDPA_LEGACY) += vp_vdpa_legacy.o
> > >  obj-$(CONFIG_VP_VDPA) += vp_vdpa.o
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_common.c b/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > index 3ff24c9ad6e4..fa91dc153244 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_common.c
> > > @@ -8,6 +8,7 @@
> > >   * Based on virtio_pci_modern.c.
> > >   */
> > >  
> > > +#include "linux/err.h"
> > >  #include <linux/irqreturn.h>
> > >  #include <linux/interrupt.h>
> > >  #include "vp_vdpa_common.h"
> > > @@ -172,6 +173,10 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> > >  		return ret;
> > >  
> > >  	vp_vdpa = vp_vdpa_modern_probe(pdev);
> > > +	if (PTR_ERR(vp_vdpa) == -ENODEV) {
> > > +		dev_info(&pdev->dev, "Tring legacy driver");
> > > +		vp_vdpa = vp_vdpa_legacy_probe(pdev);
> > > +	}
> > >  	if (IS_ERR(vp_vdpa))
> > >  		return PTR_ERR(vp_vdpa);
> > >  
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_common.h b/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > index 57886b55a2e9..39f241d8321b 100644
> > > --- a/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_common.h
> > > @@ -10,6 +10,7 @@
> > >  #include <linux/virtio_ring.h>
> > >  #include <linux/virtio_pci.h>
> > >  #include <linux/virtio_pci_modern.h>
> > > +#include <linux/virtio_pci_legacy.h>
> > >  
> > >  #define VP_VDPA_DRIVER_NAME "vp_vdpa"
> > >  #define VP_VDPA_NAME_SIZE 256
> > > @@ -26,6 +27,7 @@ struct vp_vdpa {
> > >  	struct vdpa_device vdpa;
> > >  	struct pci_dev *pci_dev;
> > >  	struct virtio_pci_modern_device mdev;
> > > +	struct virtio_pci_legacy_device ldev;
> > >  	struct vp_vring *vring;
> > >  	struct vdpa_callback config_cb;
> > >  	char msix_name[VP_VDPA_NAME_SIZE];
> > > @@ -53,4 +55,13 @@ void vp_vdpa_free_irq_vectors(void *data);
> > >  
> > >  struct vp_vdpa *vp_vdpa_modern_probe(struct pci_dev *pdev);
> > >  
> > > +#if IS_ENABLED(CONFIG_VP_VDPA_LEGACY)
> > > +struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev);
> > > +#else
> > > +static inline struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev)
> > > +{
> > > +	return ERR_PTR(-ENODEV);
> > > +}
> > > +#endif
> > > +
> > >  #endif
> > > diff --git a/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c b/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > new file mode 100644
> > > index 000000000000..75a6879a27ca
> > > --- /dev/null
> > > +++ b/drivers/vdpa/virtio_pci/vp_vdpa_legacy.c
> > > @@ -0,0 +1,346 @@
> > > +// SPDX-License-Identifier: GPL-2.0-only
> > > +/*
> > > + * vDPA bridge driver for legacy virtio-pci device
> > > + *
> > > + * Copyright (c) 2021, Alibaba Inc. All rights reserved.
> > > + * Author: Wu Zongyong <wuzongyong@linux.alibaba.com>
> > > + */
> > > +
> > > +#include "linux/pci.h"
> > > +#include "linux/virtio_byteorder.h"
> > > +#include "linux/virtio_pci_legacy.h"
> > > +#include <uapi/linux/virtio_net.h>
> > > +#include <uapi/linux/virtio_blk.h>
> > > +#include <linux/virtio_ids.h>
> > > +#include <linux/virtio_pci.h>
> > > +#include "vp_vdpa_common.h"
> > > +
> > > +static struct virtio_pci_legacy_device *vdpa_to_ldev(struct vdpa_device *vdpa)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +
> > > +	return &vp_vdpa->ldev;
> > > +}
> > > +
> > > +static u64 vp_vdpa_get_features(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_features(ldev);
> > > +}
> > > +
> > > +static int vp_vdpa_set_features(struct vdpa_device *vdpa, u64 features)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	vp_legacy_set_features(ldev, features);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static u8 vp_vdpa_get_status(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_status(ldev);
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_state_split(struct vdpa_device *vdpa,
> > > +				      const struct vdpa_vq_state *state)
> > > +{
> > > +	const struct vdpa_vq_state_split *split = &state->split;
> > > +
> > > +	if (split->avail_index == 0)
> > > +		return 0;
> > > +
> > > +	return -EOPNOTSUPP;
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 qid,
> > > +				const struct vdpa_vq_state *state)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* Note that this is not supported by virtio specification.
> > > +	 * But if the state is by chance equal to the device initial
> > > +	 * state, we can let it go.
> > > +	 */
> > > +	if (!vp_legacy_get_queue_enable(ldev, qid))
> > > +		return vp_vdpa_set_vq_state_split(vdpa,	state);
> > > +
> > > +	return -EOPNOTSUPP;
> > > +}
> > > +
> > > +static void vp_vdpa_set_vq_ready(struct vdpa_device *vdpa,
> > > +				 u16 qid, bool ready)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* Legacy devices can only be activated by setting vq address,
> > > +	 * and queue_enable is not supported by specification. So for
> > > +	 * legacy devices, we use @vp_vdpa_set_vq_address to set vq
> > > +	 * ready instead.
> > > +	 */
> > > +	if (!ready)
> > > +		vp_legacy_set_queue_address(ldev, qid, 0);
> > > +}
> > > +
> > > +static bool vp_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 qid)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return vp_legacy_get_queue_enable(ldev, qid);
> > > +}
> > > +
> > > +/* Legacy devices don't support set vq num by specification,
> > > + * just report an error if someone try to set it.
> > > + */
> > > +static void vp_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 qid,
> > > +			       u32 num)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	dev_err(&ldev->pci_dev->dev, "legacy device don't support set vq num\n");
> > > +}
> > > +
> > > +static u16 vp_vdpa_get_vq_num_max(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	/* assume all virtqueues have the same size */
> > > +	return vp_legacy_get_queue_size(ldev, 0);
> > > +}
> > > +
> > > +static int vp_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 qid,
> > > +				  u64 desc_area, u64 driver_area,
> > > +				  u64 device_area)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	vp_legacy_set_queue_address(ldev, qid, desc_area >> VIRTIO_PCI_QUEUE_ADDR_SHIFT);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static u32 vp_vdpa_get_device_id(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return ldev->id.device;
> > > +}
> > > +
> > > +static u32 vp_vdpa_get_vendor_id(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +
> > > +	return ldev->id.vendor;
> > > +}
> > > +
> > > +static size_t vp_vdpa_get_config_size(struct vdpa_device *vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = vdpa_to_ldev(vdpa);
> > > +	size_t size;
> > > +
> > > +	switch (ldev->id.device) {
> > > +	case VIRTIO_ID_NET:
> > > +		size = sizeof(struct virtio_net_config);
> > > +		break;
> > > +	case VIRTIO_ID_BLOCK:
> > > +		size = sizeof(struct virtio_blk_config);
> > > +		break;
> > > +	default:
> > > +		size = 0;
> > > +		dev_err(&ldev->pci_dev->dev, "VIRTIO ID %u not support\n", ldev->id.device);
> > > +	}
> > > +
> > > +	return size;
> > > +}
> > > +
> > > +static void vp_vdpa_get_config(struct vdpa_device *vdpa,
> > > +			       unsigned int offset,
> > > +			       void *buf, unsigned int len)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	void __iomem *ioaddr = ldev->ioaddr +
> > > +		VIRTIO_PCI_CONFIG_OFF(vp_vdpa->vectors) +
> > > +		offset;
> > > +	u8 *p = buf;
> > > +	int i;
> > > +
> > > +	/* legacy devices don't have a configuration generation field,
> > > +	 * so we just read it once.
> > > +	 */
> > > +	for (i = 0; i < len; i++)
> > > +		*p++ = ioread8(ioaddr + i);
> > > +}
> > > +
> > > +static void vp_vdpa_set_config(struct vdpa_device *vdpa,
> > > +			       unsigned int offset, const void *buf,
> > > +			       unsigned int len)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	void __iomem *ioaddr = ldev->ioaddr +
> > > +		VIRTIO_PCI_CONFIG_OFF(vp_vdpa->vectors) +
> > > +		offset;
> > > +	const u8 *p = buf;
> > > +	int i;
> > > +
> > > +	for (i = 0; i < len; i++)
> > > +		iowrite8(*p++, ioaddr + i);
> > > +}
> > > +
> > > +static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
> > > +{
> > > +	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	u8 s = vp_vdpa_get_status(vdpa);
> > > +
> > > +	if (status & VIRTIO_CONFIG_S_DRIVER_OK &&
> > > +	    !(s & VIRTIO_CONFIG_S_DRIVER_OK)) {
> > > +		vp_vdpa_request_irq(vp_vdpa);
> > > +	}
> > > +
> > > +	vp_legacy_set_status(ldev, status);
> > > +
> > > +	if (!(status & VIRTIO_CONFIG_S_DRIVER_OK) &&
> > > +	    (s & VIRTIO_CONFIG_S_DRIVER_OK)) {
> > > +		vp_vdpa_free_irq(vp_vdpa);
> > > +	}
> > > +}
> > > +
> > > +static bool vp_vdpa_get_vq_num_unchangeable(struct vdpa_device *vdpa)
> > > +{
> > > +	return true;
> > > +}
> > > +
> > > +static const struct vdpa_config_ops vp_vdpa_ops = {
> > > +	.get_features	= vp_vdpa_get_features,
> > > +	.set_features	= vp_vdpa_set_features,
> > > +	.get_status	= vp_vdpa_get_status,
> > > +	.set_status	= vp_vdpa_set_status,
> > > +	.get_vq_num_max	= vp_vdpa_get_vq_num_max,
> > > +	.get_vq_state	= vp_vdpa_get_vq_state,
> > > +	.set_vq_state	= vp_vdpa_set_vq_state,
> > > +	.set_vq_cb	= vp_vdpa_set_vq_cb,
> > > +	.set_vq_ready	= vp_vdpa_set_vq_ready,
> > > +	.get_vq_ready	= vp_vdpa_get_vq_ready,
> > > +	.set_vq_num	= vp_vdpa_set_vq_num,
> > > +	.set_vq_address	= vp_vdpa_set_vq_address,
> > > +	.kick_vq	= vp_vdpa_kick_vq,
> > > +	.get_device_id	= vp_vdpa_get_device_id,
> > > +	.get_vendor_id	= vp_vdpa_get_vendor_id,
> > > +	.get_vq_align	= vp_vdpa_get_vq_align,
> > > +	.get_config_size = vp_vdpa_get_config_size,
> > > +	.get_config	= vp_vdpa_get_config,
> > > +	.set_config	= vp_vdpa_set_config,
> > > +	.set_config_cb  = vp_vdpa_set_config_cb,
> > > +	.get_vq_irq	= vp_vdpa_get_vq_irq,
> > > +	.get_vq_num_unchangeable = vp_vdpa_get_vq_num_unchangeable,
> > > +};
> > > +
> > > +static u16 vp_vdpa_get_num_queues(struct vp_vdpa *vp_vdpa)
> > > +{
> > > +	struct virtio_pci_legacy_device *ldev = &vp_vdpa->ldev;
> > > +	u32 features = vp_legacy_get_features(ldev);
> > > +	u16 num;
> > > +
> > > +	switch (ldev->id.device) {
> > > +	case VIRTIO_ID_NET:
> > > +		num = 2;
> > > +		if (features & VIRTIO_NET_F_MQ) {
> > > +			__virtio16 max_virtqueue_pairs;
> > > +
> > > +			vp_vdpa_get_config(&vp_vdpa->vdpa,
> > > +				offsetof(struct virtio_net_config, max_virtqueue_pairs),
> > > +				&max_virtqueue_pairs,
> > > +				sizeof(max_virtqueue_pairs));
> > > +			num = 2 * __virtio16_to_cpu(virtio_legacy_is_little_endian(),
> > > +						max_virtqueue_pairs);
> > > +		}
> > > +
> > > +		if (features & VIRTIO_NET_F_CTRL_VQ)
> > > +			num += 1;
> > > +		break;
> > > +	case VIRTIO_ID_BLOCK:
> > > +		num = 1;
> > > +		break;
> > > +	default:
> > > +		num = 0;
> > > +		dev_err(&ldev->pci_dev->dev, "VIRTIO ID %u not support\n", ldev->id.device);
> > > +	}
> > > +
> > > +	return num;
> > > +}
> > > +
> > > +static u16 vp_vdpa_queue_vector(struct vp_vdpa *vp_vdpa, u16 idx, u16 vector)
> > > +{
> > > +	return vp_legacy_queue_vector(&vp_vdpa->ldev, idx, vector);
> > > +}
> > > +
> > > +static u16 vp_vdpa_config_vector(struct vp_vdpa *vp_vdpa, u16 vector)
> > > +{
> > > +	return vp_legacy_config_vector(&vp_vdpa->ldev, vector);
> > > +}
> > > +
> > > +struct vp_vdpa *vp_vdpa_legacy_probe(struct pci_dev *pdev)
> > > +{
> > > +	struct device *dev = &pdev->dev;
> > > +	struct vp_vdpa *vp_vdpa;
> > > +	struct virtio_pci_legacy_device *ldev;
> > > +	int ret, i;
> > > +
> > > +	vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa, dev, &vp_vdpa_ops, NULL);
> > > +	if (vp_vdpa == NULL) {
> > > +		dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
> > > +		return ERR_PTR(-ENOMEM);
> > > +	}
> > > +
> > > +	ldev = &vp_vdpa->ldev;
> > > +	ldev->pci_dev = pdev;
> > > +
> > > +	ret = vp_legacy_probe(ldev);
> > > +	if (ret) {
> > > +		dev_err(dev, "Failed to probe legacy PCI device\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	pci_set_master(pdev);
> > > +	pci_set_drvdata(pdev, vp_vdpa);
> > > +
> > > +	vp_vdpa->vdpa.dma_dev = &pdev->dev;
> > > +	vp_vdpa->queues = vp_vdpa_get_num_queues(vp_vdpa);
> > > +
> > > +	ret = devm_add_action_or_reset(dev, vp_vdpa_free_irq_vectors, pdev);
> > > +	if (ret) {
> > > +		dev_err(dev,
> > > +			"Failed for adding devres for freeing irq vectors\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	vp_vdpa->vring = devm_kcalloc(dev, vp_vdpa->queues,
> > > +				      sizeof(*vp_vdpa->vring),
> > > +				      GFP_KERNEL);
> > > +	if (!vp_vdpa->vring) {
> > > +		ret = -ENOMEM;
> > > +		dev_err(dev, "Fail to allocate virtqueues\n");
> > > +		goto err;
> > > +	}
> > > +
> > > +	for (i = 0; i < vp_vdpa->queues; i++) {
> > > +		vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
> > > +		vp_vdpa->vring[i].notify = ldev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY;
> > > +		vp_vdpa->vring[i].notify_pa = pci_resource_start(pdev, 0) + VIRTIO_PCI_QUEUE_NOTIFY;
> > > +	}
> > > +	vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
> > > +
> > > +	vp_vdpa->queue_vector = vp_vdpa_queue_vector;
> > > +	vp_vdpa->config_vector = vp_vdpa_config_vector;
> > > +
> > > +	return vp_vdpa;
> > > +
> > > +err:
> > > +	put_device(&vp_vdpa->vdpa.dev);
> > > +	return ERR_PTR(ret);
> > > +}
> > > -- 
> > > 2.31.1

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  reply	other threads:[~2021-09-10  9:57 UTC|newest]

Thread overview: 223+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-08 12:20 [PATCH 0/6] vDPA driver for legacy virtio-pci device Wu Zongyong
2021-09-08 12:20 ` [PATCH 1/6] virtio-pci: introduce legacy device module Wu Zongyong
2021-09-08 12:20 ` [PATCH 2/6] vdpa: fix typo Wu Zongyong
2021-09-08 12:20 ` [PATCH 3/6] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-09-09  2:53   ` Jason Wang
2021-09-09  2:53     ` Jason Wang
2021-09-08 12:20 ` [PATCH 4/6] vp_vdpa: split out reusable and device specific codes to separate file Wu Zongyong
2021-09-08 12:20 ` [PATCH 5/6] vdpa: add get_vq_num_unchangeable callback in vdpa_config_ops Wu Zongyong
2021-09-09  2:55   ` Jason Wang
2021-09-09  2:55     ` Jason Wang
2021-09-09  8:01     ` Wu Zongyong
2021-09-09  9:28       ` Jason Wang
2021-09-09  9:28         ` Jason Wang
2021-09-09  9:57         ` Wu Zongyong
2021-09-10  1:45           ` Jason Wang
2021-09-10  1:45             ` Jason Wang
2021-09-10  7:32             ` Wu Zongyong
2021-09-10  8:25               ` Cindy Lu
2021-09-10  9:20                 ` Wu Zongyong
2021-09-10 15:10                   ` Cindy Lu
2021-09-13  1:43                     ` Jason Wang
2021-09-13  1:43                       ` Jason Wang
2021-09-13  2:59                       ` Wu Zongyong
2021-09-13  3:13                         ` Jason Wang
2021-09-13  3:13                           ` Jason Wang
2021-09-13  6:22                           ` Cindy Lu
2021-09-09  9:18     ` Michael S. Tsirkin
2021-09-09  9:18       ` Michael S. Tsirkin
2021-09-09  9:32       ` Jason Wang
2021-09-09  9:32         ` Jason Wang
2021-09-08 12:20 ` [PATCH 6/6] vp_vdpa: introduce legacy virtio pci driver Wu Zongyong
2021-09-09 13:57   ` Michael S. Tsirkin
2021-09-09 13:57     ` Michael S. Tsirkin
2021-09-10  2:28     ` Wu Zongyong
2021-09-10  9:57       ` Michael S. Tsirkin [this message]
2021-09-10  9:57         ` Michael S. Tsirkin
2021-09-10 10:01         ` Wu Zongyong
2021-10-22  9:37         ` Michael S. Tsirkin
2021-10-22  9:37           ` Michael S. Tsirkin
2021-09-09  3:05 ` [PATCH 0/6] vDPA driver for legacy virtio-pci device Jason Wang
2021-09-09  3:05   ` Jason Wang
2021-09-09  3:20   ` Jason Wang
2021-09-09  3:20     ` Jason Wang
2021-09-09  8:12   ` Wu Zongyong
2021-09-09  9:29     ` Jason Wang
2021-09-09  9:29       ` Jason Wang
2021-09-09  9:21   ` Michael S. Tsirkin
2021-09-09  9:21     ` Michael S. Tsirkin
2021-09-09  9:31     ` Jason Wang
2021-09-09  9:31       ` Jason Wang
2021-09-09 12:53   ` Wu Zongyong
2021-09-10  1:44     ` Jason Wang
2021-09-10  1:44       ` Jason Wang
2021-09-14 12:24 ` [PATCH v2 0/5] vDPA driver for Alibaba ENI Wu Zongyong
2021-09-14 12:24   ` Wu Zongyong
2021-09-14 12:24   ` [PATCH v2 1/5] virtio-pci: introduce legacy device module Wu Zongyong
2021-09-14 22:37     ` Randy Dunlap
2021-09-14 22:37       ` Randy Dunlap
2021-09-14 12:24   ` [PATCH v2 2/5] vdpa: fix typo Wu Zongyong
2021-09-15  3:15     ` Jason Wang
2021-09-15  3:15       ` Jason Wang
2021-09-14 12:24   ` [PATCH v2 3/5] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-09-15  3:16     ` Jason Wang
2021-09-15  3:16       ` Jason Wang
2021-09-15  3:31       ` Wu Zongyong
2021-09-15  4:13         ` Jason Wang
2021-09-15  4:13           ` Jason Wang
2021-09-14 12:24   ` [PATCH v2 4/5] vdpa: add new vdpa attribute VDPA_ATTR_DEV_F_VERSION_1 Wu Zongyong
2021-09-14 12:58     ` Michael S. Tsirkin
2021-09-14 12:58       ` Michael S. Tsirkin
2021-09-15  3:18       ` Jason Wang
2021-09-15  3:18         ` Jason Wang
2021-09-15  7:38         ` Michael S. Tsirkin
2021-09-15  7:38           ` Michael S. Tsirkin
2021-09-15  8:06           ` Jason Wang
2021-09-15  8:06             ` Jason Wang
2021-09-15 11:08             ` Michael S. Tsirkin
2021-09-15 11:08               ` Michael S. Tsirkin
2021-09-15 12:12               ` Wu Zongyong
2021-09-16  1:11                 ` Jason Wang
2021-09-16  1:11                   ` Jason Wang
2021-09-16  1:05               ` Jason Wang
2021-09-16  1:05                 ` Jason Wang
2021-09-17  2:34                 ` Wu Zongyong
2021-09-17  7:51                   ` Jason Wang
2021-09-17  7:51                     ` Jason Wang
2021-09-15  3:24       ` Wu Zongyong
2021-09-15  7:30         ` Michael S. Tsirkin
2021-09-15  7:30           ` Michael S. Tsirkin
2021-09-15  8:05           ` Jason Wang
2021-09-15  8:05             ` Jason Wang
2021-09-15 11:10             ` Michael S. Tsirkin
2021-09-15 11:10               ` Michael S. Tsirkin
2021-09-14 12:24   ` [PATCH v2 5/5] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-09-14 22:35     ` Randy Dunlap
2021-09-14 22:35       ` Randy Dunlap
2021-09-15  3:14     ` Jason Wang
2021-09-15  3:14       ` Jason Wang
2021-09-15  3:47       ` Wu Zongyong
2021-09-15 13:36     ` kernel test robot
2021-09-15 13:36       ` kernel test robot
2021-09-15 13:36       ` kernel test robot
2021-09-22 12:46   ` [PATCH v3 0/7] " Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 1/7] virtio-pci: introduce legacy device module Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 2/7] vdpa: fix typo Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 3/7] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 4/7] vdpa: add new callback get_vq_num_min in vdpa_config_ops Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 5/7] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 6/7] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Wu Zongyong
2021-09-22 12:46     ` [PATCH v3 7/7] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-09-26  2:24       ` Jason Wang
2021-09-26  2:24         ` Jason Wang
2021-09-26  3:24         ` Wu Zongyong
2021-09-26  4:18           ` Jason Wang
2021-09-26  4:18             ` Jason Wang
2021-09-27 10:36             ` Michael S. Tsirkin
2021-09-27 10:36               ` Michael S. Tsirkin
2021-09-28  2:17               ` Jason Wang
2021-09-28  2:17                 ` Jason Wang
2021-09-26  2:26       ` Jason Wang
2021-09-26  2:26         ` Jason Wang
2021-09-26  3:27         ` Wu Zongyong
2021-09-26  4:19           ` Jason Wang
2021-09-26  4:19             ` Jason Wang
2021-09-29 12:54       ` kernel test robot
2021-09-29 12:54         ` kernel test robot
2021-09-29 12:54         ` kernel test robot
2021-09-29  6:11     ` [PATCH v4 0/7] " Wu Zongyong
2021-09-29  6:11       ` [PATCH v4 1/7] virtio-pci: introduce legacy device module Wu Zongyong
2021-10-11  3:00         ` Jason Wang
2021-10-11  3:00           ` Jason Wang
2021-10-11  3:02         ` Jason Wang
2021-10-11  3:02           ` Jason Wang
2021-09-29  6:11       ` [PATCH v4 2/7] vdpa: fix typo Wu Zongyong
2021-10-11  3:03         ` Jason Wang
2021-10-11  3:03           ` Jason Wang
2021-09-29  6:11       ` [PATCH v4 3/7] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-09-29  6:11       ` [PATCH v4 4/7] vdpa: add new callback get_vq_num_min in vdpa_config_ops Wu Zongyong
2021-10-11  3:04         ` Jason Wang
2021-10-11  3:04           ` Jason Wang
2021-09-29  6:11       ` [PATCH v4 5/7] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Wu Zongyong
2021-10-11  3:06         ` Jason Wang
2021-10-11  3:06           ` Jason Wang
2021-09-29  6:11       ` [PATCH v4 6/7] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Wu Zongyong
2021-10-11  3:10         ` Jason Wang
2021-10-11  3:10           ` Jason Wang
2021-09-29  6:11       ` [PATCH v4 7/7] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-10-11  3:18         ` Jason Wang
2021-10-11  3:18           ` Jason Wang
2021-10-15  7:14       ` [PATCH v5 0/8] " Wu Zongyong
2021-10-15  7:14         ` [PATCH v5 1/8] virtio-pci: introduce legacy device module Wu Zongyong
2021-10-15  8:22           ` Jason Wang
2021-10-15  8:22             ` Jason Wang
2021-10-15  7:14         ` [PATCH v5 2/8] vdpa: fix typo Wu Zongyong
2021-10-15  7:14         ` [PATCH v5 3/8] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-10-15  7:14         ` [PATCH v5 4/8] vdpa: add new callback get_vq_num_min in vdpa_config_ops Wu Zongyong
2021-10-15  8:22           ` Jason Wang
2021-10-15  8:22             ` Jason Wang
2021-10-15  7:14         ` [PATCH v5 5/8] vdpa: min vq num of vdpa device cannot be greater than max vq num Wu Zongyong
2021-10-15  8:24           ` Jason Wang
2021-10-15  8:24             ` Jason Wang
2021-10-15  7:14         ` [PATCH v5 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Wu Zongyong
2021-10-15  8:30           ` Jason Wang
2021-10-15  8:30             ` Jason Wang
2021-10-15  7:15         ` [PATCH v5 7/8] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Wu Zongyong
2021-10-15  7:15         ` [PATCH v5 8/8] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-10-15  8:18           ` Jason Wang
2021-10-15  8:18             ` Jason Wang
2021-10-15 19:13           ` Randy Dunlap
2021-10-15 19:13             ` Randy Dunlap
2021-10-22  2:44         ` [PATCH v6 0/8] " Wu Zongyong
2021-10-22  2:44           ` [PATCH v6 1/8] virtio-pci: introduce legacy device module Wu Zongyong
2021-10-25  1:30             ` Jason Wang
2021-10-25  1:30               ` Jason Wang
2021-10-22  2:44           ` [PATCH v6 2/8] vdpa: fix typo Wu Zongyong
2021-10-22  2:44           ` [PATCH v6 3/8] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-10-22  2:44           ` [PATCH v6 4/8] vdpa: add new callback get_vq_num_min in vdpa_config_ops Wu Zongyong
2021-10-25  2:17             ` Jason Wang
2021-10-25  2:17               ` Jason Wang
2021-10-22  2:44           ` [PATCH v6 5/8] vdpa: min vq num of vdpa device cannot be greater than max vq num Wu Zongyong
2021-10-25  2:18             ` Jason Wang
2021-10-25  2:18               ` Jason Wang
2021-10-22  2:44           ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Wu Zongyong
2021-10-25  2:22             ` Jason Wang
2021-10-25  2:22               ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max, min} Jason Wang
     [not found]               ` <20211025024403.GA3684@L-PF27918B-1352.localdomain>
2021-10-25  4:45                 ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Jason Wang
2021-10-25  4:45                   ` Jason Wang
     [not found]                   ` <20211025062454.GA4832@L-PF27918B-1352.localdomain>
2021-10-26  4:46                     ` Jason Wang
2021-10-26  4:46                       ` [PATCH v6 6/8] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max, min} Jason Wang
2021-10-22  2:44           ` [PATCH v6 7/8] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Wu Zongyong
2021-10-25  2:23             ` Jason Wang
2021-10-25  2:23               ` Jason Wang
2021-10-22  2:44           ` [PATCH v6 8/8] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-10-25  2:27             ` Jason Wang
2021-10-25  2:27               ` Jason Wang
     [not found]               ` <20211025032146.GC3684@L-PF27918B-1352.localdomain>
2021-10-25  4:40                 ` Jason Wang
2021-10-25  4:40                   ` Jason Wang
2021-10-27  2:47                   ` Wu Zongyong
2021-10-27  3:55                     ` Jason Wang
2021-10-27  3:55                       ` Jason Wang
2021-10-27  7:04                       ` Wu Zongyong
2021-10-29  9:14           ` [PATCH v7 0/9] " Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 1/9] virtio-pci: introduce legacy device module Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 2/9] vdpa: fix typo Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 3/9] vp_vdpa: add vq irq offloading support Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 4/9] vdpa: add new callback get_vq_num_min in vdpa_config_ops Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 5/9] vdpa: min vq num of vdpa device cannot be greater than max vq num Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 6/9] virtio_vdpa: setup correct vq size with callbacks get_vq_num_{max,min} Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 7/9] vdpa: add new attribute VDPA_ATTR_DEV_MIN_VQ_SIZE Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 8/9] eni_vdpa: add vDPA driver for Alibaba ENI Wu Zongyong
2021-10-29  9:14             ` [PATCH v7 9/9] eni_vdpa: alibaba: fix Kconfig typo Wu Zongyong
2021-11-01  8:18               ` Michael S. Tsirkin
2021-11-01  8:18                 ` Michael S. Tsirkin
2021-11-01  3:31             ` [PATCH v7 0/9] vDPA driver for Alibaba ENI Jason Wang
2021-11-01  3:31               ` Jason Wang
2021-11-01  6:22               ` Wu Zongyong
2021-11-01  7:02                 ` Jason Wang
2021-11-01  7:02                   ` Jason Wang
2021-11-01  8:11                   ` Wu Zongyong
2021-11-01 11:12                     ` Michael S. Tsirkin
2021-11-01 11:12                       ` Michael S. Tsirkin
2021-11-01  8:19             ` Michael S. Tsirkin
2021-11-01  8:19               ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210910055510-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=wei.yang1@linux.alibaba.com \
    --cc=wuzongyong@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.