From: Stefano Garzarella <sgarzare@redhat.com> To: virtualization@lists.linux-foundation.org Cc: Stefan Hajnoczi <stefanha@redhat.com>, Laurent Vivier <lvivier@redhat.com>, linux-kernel@vger.kernel.org, Eli Cohen <elic@nvidia.com>, Jason Wang <jasowang@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, Max Gurtovoy <mgurtovoy@nvidia.com> Subject: [PATCH RFC 04/12] vdpa: add vdpa simulator for block device Date: Fri, 13 Nov 2020 14:47:04 +0100 [thread overview] Message-ID: <20201113134712.69744-5-sgarzare@redhat.com> (raw) In-Reply-To: <20201113134712.69744-1-sgarzare@redhat.com> From: Max Gurtovoy <mgurtovoy@nvidia.com> This will allow running vDPA for virtio block protocol. Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com> [sgarzare: various cleanups/fixes] Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> --- v1: - Removed unused headers - Used cpu_to_vdpasim*() to store config fields - Replaced 'select VDPA_SIM' with 'depends on VDPA_SIM' since selected option can not depend on other [Jason] - Start with a single queue for now [Jason] - Add comments to memory barriers --- drivers/vdpa/vdpa_sim/vdpa_sim_blk.c | 124 +++++++++++++++++++++++++++ drivers/vdpa/Kconfig | 9 ++ drivers/vdpa/vdpa_sim/Makefile | 1 + 3 files changed, 134 insertions(+) create mode 100644 drivers/vdpa/vdpa_sim/vdpa_sim_blk.c diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c new file mode 100644 index 000000000000..386dbb2f7138 --- /dev/null +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * VDPA simulator for block device. + * + * Copyright (c) 2020, Mellanox Technologies. All rights reserved. + * + */ + +#include <linux/module.h> + +#include "vdpa_sim.h" + +#define VDPASIM_BLK_FEATURES ((1ULL << VIRTIO_BLK_F_SIZE_MAX) | \ + (1ULL << VIRTIO_BLK_F_SEG_MAX) | \ + (1ULL << VIRTIO_BLK_F_BLK_SIZE) | \ + (1ULL << VIRTIO_BLK_F_TOPOLOGY) | \ + (1ULL << VIRTIO_BLK_F_MQ)) + +#define VDPASIM_BLK_CAPACITY 0x40000 +#define VDPASIM_BLK_SIZE_MAX 0x1000 +#define VDPASIM_BLK_SEG_MAX 32 +#define VDPASIM_BLK_VQ_NUM 1 + +static struct vdpasim *vdpasim_blk_dev; + +static void vdpasim_blk_work(struct work_struct *work) +{ + struct vdpasim *vdpasim = container_of(work, struct vdpasim, work); + u8 status = VIRTIO_BLK_S_OK; + int i; + + spin_lock(&vdpasim->lock); + + if (!(vdpasim->status & VIRTIO_CONFIG_S_DRIVER_OK)) + goto out; + + for (i = 0; i < VDPASIM_BLK_VQ_NUM; i++) { + struct vdpasim_virtqueue *vq = &vdpasim->vqs[i]; + + if (!vq->ready) + continue; + + while (vringh_getdesc_iotlb(&vq->vring, &vq->iov, &vq->iov, + &vq->head, GFP_ATOMIC) > 0) { + + int write; + + vq->iov.i = vq->iov.used - 1; + write = vringh_iov_push_iotlb(&vq->vring, &vq->iov, &status, 1); + if (write <= 0) + break; + + /* Make sure data is wrote before advancing index */ + smp_wmb(); + + vringh_complete_iotlb(&vq->vring, vq->head, write); + + /* Make sure used is visible before rasing the interrupt. */ + smp_wmb(); + + if (vringh_need_notify_iotlb(&vq->vring) > 0) + vringh_notify(&vq->vring); + + local_bh_disable(); + if (vq->cb) + vq->cb(vq->private); + local_bh_enable(); + } + } +out: + spin_unlock(&vdpasim->lock); + +} + +static int __init vdpasim_blk_init(void) +{ + struct vdpasim_init_attr attr = {}; + struct virtio_blk_config *config; + int ret; + + attr.device_id = VIRTIO_ID_BLOCK; + attr.features = VDPASIM_FEATURES | VDPASIM_BLK_FEATURES; + attr.work_fn = vdpasim_blk_work; + vdpasim_blk_dev = vdpasim_create(&attr); + if (IS_ERR(vdpasim_blk_dev)) { + ret = PTR_ERR(vdpasim_blk_dev); + goto out; + } + + config = (struct virtio_blk_config *)vdpasim_blk_dev->config; + config->capacity = cpu_to_vdpasim64(vdpasim_blk_dev, VDPASIM_BLK_CAPACITY); + config->size_max = cpu_to_vdpasim32(vdpasim_blk_dev, VDPASIM_BLK_SIZE_MAX); + config->seg_max = cpu_to_vdpasim32(vdpasim_blk_dev, VDPASIM_BLK_SEG_MAX); + config->num_queues = cpu_to_vdpasim16(vdpasim_blk_dev, VDPASIM_BLK_VQ_NUM); + config->min_io_size = cpu_to_vdpasim16(vdpasim_blk_dev, 1); + config->opt_io_size = cpu_to_vdpasim32(vdpasim_blk_dev, 1); + config->blk_size = cpu_to_vdpasim32(vdpasim_blk_dev, 512); + + ret = vdpa_register_device(&vdpasim_blk_dev->vdpa); + if (ret) + goto put_dev; + + return 0; + +put_dev: + put_device(&vdpasim_blk_dev->vdpa.dev); +out: + return ret; +} + +static void __exit vdpasim_blk_exit(void) +{ + struct vdpa_device *vdpa = &vdpasim_blk_dev->vdpa; + + vdpa_unregister_device(vdpa); +} + +module_init(vdpasim_blk_init) +module_exit(vdpasim_blk_exit) + +MODULE_VERSION(DRV_VERSION); +MODULE_LICENSE(DRV_LICENSE); +MODULE_AUTHOR("Max Gurtovoy <mgurtovoy@nvidia.com>"); +MODULE_DESCRIPTION("vDPA Device Simulator for block device"); diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig index fdb1a9267347..0fb63362cd5d 100644 --- a/drivers/vdpa/Kconfig +++ b/drivers/vdpa/Kconfig @@ -24,6 +24,15 @@ config VDPA_SIM_NET to RX. This device is used for testing, prototyping and development of vDPA. +config VDPA_SIM_BLOCK + tristate "vDPA simulator for block device" + depends on VDPA_SIM + default n + help + vDPA block device simulator which terminates IO request in a + memory buffer. This device is used for testing, prototyping and + development of vDPA. + config IFCVF tristate "Intel IFC VF vDPA driver" depends on PCI_MSI diff --git a/drivers/vdpa/vdpa_sim/Makefile b/drivers/vdpa/vdpa_sim/Makefile index 79d4536d347e..d458103302f2 100644 --- a/drivers/vdpa/vdpa_sim/Makefile +++ b/drivers/vdpa/vdpa_sim/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_VDPA_SIM) += vdpa_sim.o obj-$(CONFIG_VDPA_SIM_NET) += vdpa_sim_net.o +obj-$(CONFIG_VDPA_SIM_BLOCK) += vdpa_sim_blk.o -- 2.26.2
WARNING: multiple messages have this Message-ID (diff)
From: Stefano Garzarella <sgarzare@redhat.com> To: virtualization@lists.linux-foundation.org Cc: Laurent Vivier <lvivier@redhat.com>, Max Gurtovoy <mgurtovoy@nvidia.com>, "Michael S. Tsirkin" <mst@redhat.com>, linux-kernel@vger.kernel.org, Stefan Hajnoczi <stefanha@redhat.com>, Eli Cohen <elic@nvidia.com> Subject: [PATCH RFC 04/12] vdpa: add vdpa simulator for block device Date: Fri, 13 Nov 2020 14:47:04 +0100 [thread overview] Message-ID: <20201113134712.69744-5-sgarzare@redhat.com> (raw) In-Reply-To: <20201113134712.69744-1-sgarzare@redhat.com> From: Max Gurtovoy <mgurtovoy@nvidia.com> This will allow running vDPA for virtio block protocol. Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com> [sgarzare: various cleanups/fixes] Signed-off-by: Stefano Garzarella <sgarzare@redhat.com> --- v1: - Removed unused headers - Used cpu_to_vdpasim*() to store config fields - Replaced 'select VDPA_SIM' with 'depends on VDPA_SIM' since selected option can not depend on other [Jason] - Start with a single queue for now [Jason] - Add comments to memory barriers --- drivers/vdpa/vdpa_sim/vdpa_sim_blk.c | 124 +++++++++++++++++++++++++++ drivers/vdpa/Kconfig | 9 ++ drivers/vdpa/vdpa_sim/Makefile | 1 + 3 files changed, 134 insertions(+) create mode 100644 drivers/vdpa/vdpa_sim/vdpa_sim_blk.c diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c new file mode 100644 index 000000000000..386dbb2f7138 --- /dev/null +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * VDPA simulator for block device. + * + * Copyright (c) 2020, Mellanox Technologies. All rights reserved. + * + */ + +#include <linux/module.h> + +#include "vdpa_sim.h" + +#define VDPASIM_BLK_FEATURES ((1ULL << VIRTIO_BLK_F_SIZE_MAX) | \ + (1ULL << VIRTIO_BLK_F_SEG_MAX) | \ + (1ULL << VIRTIO_BLK_F_BLK_SIZE) | \ + (1ULL << VIRTIO_BLK_F_TOPOLOGY) | \ + (1ULL << VIRTIO_BLK_F_MQ)) + +#define VDPASIM_BLK_CAPACITY 0x40000 +#define VDPASIM_BLK_SIZE_MAX 0x1000 +#define VDPASIM_BLK_SEG_MAX 32 +#define VDPASIM_BLK_VQ_NUM 1 + +static struct vdpasim *vdpasim_blk_dev; + +static void vdpasim_blk_work(struct work_struct *work) +{ + struct vdpasim *vdpasim = container_of(work, struct vdpasim, work); + u8 status = VIRTIO_BLK_S_OK; + int i; + + spin_lock(&vdpasim->lock); + + if (!(vdpasim->status & VIRTIO_CONFIG_S_DRIVER_OK)) + goto out; + + for (i = 0; i < VDPASIM_BLK_VQ_NUM; i++) { + struct vdpasim_virtqueue *vq = &vdpasim->vqs[i]; + + if (!vq->ready) + continue; + + while (vringh_getdesc_iotlb(&vq->vring, &vq->iov, &vq->iov, + &vq->head, GFP_ATOMIC) > 0) { + + int write; + + vq->iov.i = vq->iov.used - 1; + write = vringh_iov_push_iotlb(&vq->vring, &vq->iov, &status, 1); + if (write <= 0) + break; + + /* Make sure data is wrote before advancing index */ + smp_wmb(); + + vringh_complete_iotlb(&vq->vring, vq->head, write); + + /* Make sure used is visible before rasing the interrupt. */ + smp_wmb(); + + if (vringh_need_notify_iotlb(&vq->vring) > 0) + vringh_notify(&vq->vring); + + local_bh_disable(); + if (vq->cb) + vq->cb(vq->private); + local_bh_enable(); + } + } +out: + spin_unlock(&vdpasim->lock); + +} + +static int __init vdpasim_blk_init(void) +{ + struct vdpasim_init_attr attr = {}; + struct virtio_blk_config *config; + int ret; + + attr.device_id = VIRTIO_ID_BLOCK; + attr.features = VDPASIM_FEATURES | VDPASIM_BLK_FEATURES; + attr.work_fn = vdpasim_blk_work; + vdpasim_blk_dev = vdpasim_create(&attr); + if (IS_ERR(vdpasim_blk_dev)) { + ret = PTR_ERR(vdpasim_blk_dev); + goto out; + } + + config = (struct virtio_blk_config *)vdpasim_blk_dev->config; + config->capacity = cpu_to_vdpasim64(vdpasim_blk_dev, VDPASIM_BLK_CAPACITY); + config->size_max = cpu_to_vdpasim32(vdpasim_blk_dev, VDPASIM_BLK_SIZE_MAX); + config->seg_max = cpu_to_vdpasim32(vdpasim_blk_dev, VDPASIM_BLK_SEG_MAX); + config->num_queues = cpu_to_vdpasim16(vdpasim_blk_dev, VDPASIM_BLK_VQ_NUM); + config->min_io_size = cpu_to_vdpasim16(vdpasim_blk_dev, 1); + config->opt_io_size = cpu_to_vdpasim32(vdpasim_blk_dev, 1); + config->blk_size = cpu_to_vdpasim32(vdpasim_blk_dev, 512); + + ret = vdpa_register_device(&vdpasim_blk_dev->vdpa); + if (ret) + goto put_dev; + + return 0; + +put_dev: + put_device(&vdpasim_blk_dev->vdpa.dev); +out: + return ret; +} + +static void __exit vdpasim_blk_exit(void) +{ + struct vdpa_device *vdpa = &vdpasim_blk_dev->vdpa; + + vdpa_unregister_device(vdpa); +} + +module_init(vdpasim_blk_init) +module_exit(vdpasim_blk_exit) + +MODULE_VERSION(DRV_VERSION); +MODULE_LICENSE(DRV_LICENSE); +MODULE_AUTHOR("Max Gurtovoy <mgurtovoy@nvidia.com>"); +MODULE_DESCRIPTION("vDPA Device Simulator for block device"); diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig index fdb1a9267347..0fb63362cd5d 100644 --- a/drivers/vdpa/Kconfig +++ b/drivers/vdpa/Kconfig @@ -24,6 +24,15 @@ config VDPA_SIM_NET to RX. This device is used for testing, prototyping and development of vDPA. +config VDPA_SIM_BLOCK + tristate "vDPA simulator for block device" + depends on VDPA_SIM + default n + help + vDPA block device simulator which terminates IO request in a + memory buffer. This device is used for testing, prototyping and + development of vDPA. + config IFCVF tristate "Intel IFC VF vDPA driver" depends on PCI_MSI diff --git a/drivers/vdpa/vdpa_sim/Makefile b/drivers/vdpa/vdpa_sim/Makefile index 79d4536d347e..d458103302f2 100644 --- a/drivers/vdpa/vdpa_sim/Makefile +++ b/drivers/vdpa/vdpa_sim/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_VDPA_SIM) += vdpa_sim.o obj-$(CONFIG_VDPA_SIM_NET) += vdpa_sim_net.o +obj-$(CONFIG_VDPA_SIM_BLOCK) += vdpa_sim_blk.o -- 2.26.2 _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2020-11-13 13:48 UTC|newest] Thread overview: 131+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-11-13 13:47 [PATCH RFC 00/12] vdpa: generalize vdpa simulator and add block device Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 01/12] vhost-vdpa: add support for vDPA blk devices Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-17 10:57 ` Stefan Hajnoczi 2020-11-17 10:57 ` Stefan Hajnoczi 2020-11-17 15:05 ` Stefano Garzarella 2020-11-17 15:05 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 02/12] vdpa: split vdpasim to core and net modules Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-13 18:32 ` kernel test robot 2020-11-16 4:00 ` Jason Wang 2020-11-16 4:00 ` Jason Wang 2020-11-16 9:39 ` Stefano Garzarella 2020-11-16 9:39 ` Stefano Garzarella 2020-11-18 13:14 ` Stefano Garzarella 2020-11-18 13:14 ` Stefano Garzarella 2020-11-19 6:16 ` Jason Wang 2020-11-19 6:16 ` Jason Wang 2020-11-16 9:06 ` Dan Carpenter 2020-11-16 9:06 ` Dan Carpenter 2020-11-16 9:12 ` Stefano Garzarella 2020-11-16 10:47 ` Dan Carpenter 2020-11-16 10:47 ` Dan Carpenter 2020-11-16 11:16 ` Stefano Garzarella 2020-11-16 11:58 ` Dan Carpenter 2020-11-16 11:58 ` Dan Carpenter 2020-11-16 12:41 ` Stefano Garzarella 2020-11-16 12:54 ` Dan Carpenter 2020-11-16 12:54 ` Dan Carpenter 2020-11-13 13:47 ` [PATCH RFC 03/12] vdpa_sim: remove hard-coded virtq count Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:02 ` Jason Wang 2020-11-16 4:02 ` Jason Wang 2020-11-13 13:47 ` Stefano Garzarella [this message] 2020-11-13 13:47 ` [PATCH RFC 04/12] vdpa: add vdpa simulator for block device Stefano Garzarella 2020-11-16 4:10 ` Jason Wang 2020-11-16 4:10 ` Jason Wang 2020-11-16 10:17 ` Stefano Garzarella 2020-11-16 10:17 ` Stefano Garzarella 2020-11-17 11:11 ` Stefan Hajnoczi 2020-11-17 11:11 ` Stefan Hajnoczi 2020-11-17 14:16 ` Stefano Garzarella 2020-11-17 14:16 ` Stefano Garzarella 2020-11-17 16:43 ` Stefan Hajnoczi 2020-11-17 16:43 ` Stefan Hajnoczi 2020-11-17 17:38 ` Stefano Garzarella 2020-11-17 17:38 ` Stefano Garzarella 2020-11-18 11:23 ` Stefan Hajnoczi 2020-11-18 11:23 ` Stefan Hajnoczi 2020-11-18 11:39 ` Stefano Garzarella 2020-11-18 11:39 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 05/12] vdpa_sim: remove the limit of IOTLB entries Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:12 ` Jason Wang 2020-11-16 4:12 ` Jason Wang 2020-11-16 10:22 ` Stefano Garzarella 2020-11-16 10:22 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 06/12] vdpa_sim: add struct vdpasim_device to store device properties Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:14 ` Jason Wang 2020-11-16 4:14 ` Jason Wang 2020-11-16 10:30 ` Stefano Garzarella 2020-11-16 10:30 ` Stefano Garzarella 2020-11-17 11:23 ` Stefan Hajnoczi 2020-11-17 11:23 ` Stefan Hajnoczi 2020-11-17 14:24 ` Stefano Garzarella 2020-11-17 14:24 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 07/12] vdpa_sim: move config management outside of the core Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:18 ` Jason Wang 2020-11-16 4:18 ` Jason Wang 2020-11-16 10:42 ` Stefano Garzarella 2020-11-16 10:42 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 08/12] vdpa_sim: use kvmalloc to allocate vdpasim->buffer Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:19 ` Jason Wang 2020-11-16 4:19 ` Jason Wang 2020-11-13 13:47 ` [PATCH RFC 09/12] vdpa_sim: make vdpasim->buffer size configurable Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:19 ` Jason Wang 2020-11-16 4:19 ` Jason Wang 2020-11-13 13:47 ` [PATCH RFC 10/12] vdpa_sim: split vdpasim_virtqueue's iov field in riov and wiov Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:21 ` Jason Wang 2020-11-16 4:21 ` Jason Wang 2020-11-17 11:27 ` Stefan Hajnoczi 2020-11-17 11:27 ` Stefan Hajnoczi 2020-11-20 14:41 ` Stefano Garzarella 2020-11-20 14:41 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 11/12] vringh: allow vringh_iov_xfer() to skip bytes when ptr is NULL Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-16 4:32 ` Jason Wang 2020-11-16 4:32 ` Jason Wang 2020-11-16 11:48 ` Stefano Garzarella 2020-11-16 11:48 ` Stefano Garzarella 2020-11-13 13:47 ` [PATCH RFC 12/12] vdpa_sim_blk: implement ramdisk behaviour Stefano Garzarella 2020-11-13 13:47 ` Stefano Garzarella 2020-11-13 15:15 ` kernel test robot 2020-11-16 5:25 ` Jason Wang 2020-11-16 5:25 ` Jason Wang 2020-11-16 11:08 ` Stefano Garzarella 2020-11-16 11:08 ` Stefano Garzarella 2020-11-16 9:50 ` Michael S. Tsirkin 2020-11-16 9:50 ` Michael S. Tsirkin 2020-11-16 11:23 ` Stefano Garzarella 2020-11-16 11:23 ` Stefano Garzarella 2020-11-17 11:36 ` Stefan Hajnoczi 2020-11-17 11:36 ` Stefan Hajnoczi 2020-11-17 14:32 ` Stefano Garzarella 2020-11-17 14:32 ` Stefano Garzarella 2020-11-16 3:37 ` [PATCH RFC 00/12] vdpa: generalize vdpa simulator and add block device Jason Wang 2020-11-16 3:37 ` Jason Wang 2020-11-16 8:53 ` Stefano Garzarella 2020-11-16 8:53 ` Stefano Garzarella 2020-12-18 11:38 ` Stefano Garzarella 2020-12-18 11:38 ` Stefano Garzarella 2020-12-21 3:16 ` Jason Wang 2020-12-21 3:16 ` Jason Wang 2020-12-21 11:14 ` Stefano Garzarella 2020-12-21 11:14 ` Stefano Garzarella 2020-12-22 2:44 ` Jason Wang 2020-12-22 2:44 ` Jason Wang 2020-12-22 10:57 ` Stefano Garzarella 2020-12-22 10:57 ` Stefano Garzarella 2020-12-22 12:29 ` Jason Wang 2020-12-22 12:29 ` Jason Wang 2020-12-22 12:56 ` Jason Wang 2020-12-22 12:56 ` Jason Wang 2020-12-22 13:23 ` Stefano Garzarella 2020-12-22 13:23 ` Stefano Garzarella
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=20201113134712.69744-5-sgarzare@redhat.com \ --to=sgarzare@redhat.com \ --cc=elic@nvidia.com \ --cc=jasowang@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=lvivier@redhat.com \ --cc=mgurtovoy@nvidia.com \ --cc=mst@redhat.com \ --cc=stefanha@redhat.com \ --cc=virtualization@lists.linux-foundation.org \ /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: linkBe 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.