kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Eugenio Perez Martin <eperezma@redhat.com>
To: Gautam Dawar <gautam.dawar@xilinx.com>
Cc: Gautam Dawar <gdawar@xilinx.com>,
	Martin Petrus Hubertus Habets <martinh@xilinx.com>,
	Harpreet Singh Anand <hanand@xilinx.com>,
	Tanuj Murlidhar Kamde <tanujk@xilinx.com>,
	Jason Wang <jasowang@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Zhu Lingshan <lingshan.zhu@intel.com>,
	Stefano Garzarella <sgarzare@redhat.com>,
	Xie Yongji <xieyongji@bytedance.com>, Eli Cohen <elic@nvidia.com>,
	Si-Wei Liu <si-wei.liu@oracle.com>,
	Parav Pandit <parav@nvidia.com>, Longpeng <longpeng2@huawei.com>,
	virtualization <virtualization@lists.linux-foundation.org>,
	linux-kernel@vger.kernel.org, kvm list <kvm@vger.kernel.org>,
	netdev@vger.kernel.org
Subject: Re: [RFC PATCH v2 15/19] vhost-vdpa: support ASID based IOTLB API
Date: Fri, 4 Mar 2022 19:04:34 +0100	[thread overview]
Message-ID: <CAJaqyWcesvA68ghx15y0eJgZvXr5MNqYy2X2S+PJ3U_K8Z+DdQ@mail.gmail.com> (raw)
In-Reply-To: <20220224212314.1326-16-gdawar@xilinx.com>

On Thu, Feb 24, 2022 at 10:28 PM Gautam Dawar <gautam.dawar@xilinx.com> wrote:
>
> This patch extends the vhost-vdpa to support ASID based IOTLB API. The
> vhost-vdpa device will allocated multiple IOTLBs for vDPA device that
> supports multiple address spaces. The IOTLBs and vDPA device memory
> mappings is determined and maintained through ASID.
>
> Note that we still don't support vDPA device with more than one
> address spaces that depends on platform IOMMU. This work will be done
> by moving the IOMMU logic from vhost-vDPA to vDPA device driver.
>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Gautam Dawar <gdawar@xilinx.com>
> ---
>  drivers/vhost/vdpa.c  | 129 ++++++++++++++++++++++++++++++++----------
>  drivers/vhost/vhost.c |   2 +-
>  2 files changed, 100 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
> index 47e6cf9d0881..4bcf824e3b12 100644
> --- a/drivers/vhost/vdpa.c
> +++ b/drivers/vhost/vdpa.c
> @@ -28,7 +28,8 @@
>  enum {
>         VHOST_VDPA_BACKEND_FEATURES =
>         (1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2) |
> -       (1ULL << VHOST_BACKEND_F_IOTLB_BATCH),
> +       (1ULL << VHOST_BACKEND_F_IOTLB_BATCH) |
> +       (1ULL << VHOST_BACKEND_F_IOTLB_ASID),
>  };
>
>  #define VHOST_VDPA_DEV_MAX (1U << MINORBITS)
> @@ -57,13 +58,20 @@ struct vhost_vdpa {
>         struct eventfd_ctx *config_ctx;
>         int in_batch;
>         struct vdpa_iova_range range;
> -       int used_as;
> +       u32 batch_asid;
>  };
>
>  static DEFINE_IDA(vhost_vdpa_ida);
>
>  static dev_t vhost_vdpa_major;
>
> +static inline u32 iotlb_to_asid(struct vhost_iotlb *iotlb)
> +{
> +       struct vhost_vdpa_as *as = container_of(iotlb, struct
> +                                               vhost_vdpa_as, iotlb);
> +       return as->id;
> +}
> +
>  static struct vhost_vdpa_as *asid_to_as(struct vhost_vdpa *v, u32 asid)
>  {
>         struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
> @@ -76,6 +84,16 @@ static struct vhost_vdpa_as *asid_to_as(struct vhost_vdpa *v, u32 asid)
>         return NULL;
>  }
>
> +static struct vhost_iotlb *asid_to_iotlb(struct vhost_vdpa *v, u32 asid)
> +{
> +       struct vhost_vdpa_as *as = asid_to_as(v, asid);
> +
> +       if (!as)
> +               return NULL;
> +
> +       return &as->iotlb;
> +}
> +
>  static struct vhost_vdpa_as *vhost_vdpa_alloc_as(struct vhost_vdpa *v, u32 asid)
>  {
>         struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
> @@ -84,6 +102,9 @@ static struct vhost_vdpa_as *vhost_vdpa_alloc_as(struct vhost_vdpa *v, u32 asid)
>         if (asid_to_as(v, asid))
>                 return NULL;
>
> +       if (asid >= v->vdpa->nas)
> +               return NULL;
> +
>         as = kmalloc(sizeof(*as), GFP_KERNEL);
>         if (!as)
>                 return NULL;
> @@ -91,18 +112,24 @@ static struct vhost_vdpa_as *vhost_vdpa_alloc_as(struct vhost_vdpa *v, u32 asid)
>         vhost_iotlb_init(&as->iotlb, 0, 0);
>         as->id = asid;
>         hlist_add_head(&as->hash_link, head);
> -       ++v->used_as;
>
>         return as;
>  }
>
> -static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid)
> +static struct vhost_vdpa_as *vhost_vdpa_find_alloc_as(struct vhost_vdpa *v,
> +                                                     u32 asid)
>  {
>         struct vhost_vdpa_as *as = asid_to_as(v, asid);
>
> -       /* Remove default address space is not allowed */
> -       if (asid == 0)
> -               return -EINVAL;
> +       if (as)
> +               return as;
> +
> +       return vhost_vdpa_alloc_as(v, asid);
> +}
> +
> +static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid)
> +{
> +       struct vhost_vdpa_as *as = asid_to_as(v, asid);
>
>         if (!as)
>                 return -EINVAL;
> @@ -110,7 +137,6 @@ static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid)
>         hlist_del(&as->hash_link);
>         vhost_iotlb_reset(&as->iotlb);
>         kfree(as);
> -       --v->used_as;
>
>         return 0;
>  }
> @@ -665,6 +691,7 @@ static int vhost_vdpa_map(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
>         struct vhost_dev *dev = &v->vdev;
>         struct vdpa_device *vdpa = v->vdpa;
>         const struct vdpa_config_ops *ops = vdpa->config;
> +       u32 asid = iotlb_to_asid(iotlb);
>         int r = 0;
>
>         r = vhost_iotlb_add_range_ctx(iotlb, iova, iova + size - 1,
> @@ -673,10 +700,10 @@ static int vhost_vdpa_map(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
>                 return r;
>
>         if (ops->dma_map) {
> -               r = ops->dma_map(vdpa, 0, iova, size, pa, perm, opaque);
> +               r = ops->dma_map(vdpa, asid, iova, size, pa, perm, opaque);
>         } else if (ops->set_map) {
>                 if (!v->in_batch)
> -                       r = ops->set_map(vdpa, 0, iotlb);
> +                       r = ops->set_map(vdpa, asid, iotlb);
>         } else {
>                 r = iommu_map(v->domain, iova, pa, size,
>                               perm_to_iommu_flags(perm));
> @@ -692,23 +719,35 @@ static int vhost_vdpa_map(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
>         return 0;
>  }
>
> -static void vhost_vdpa_unmap(struct vhost_vdpa *v,
> -                            struct vhost_iotlb *iotlb,
> -                            u64 iova, u64 size)
> +static int vhost_vdpa_unmap(struct vhost_vdpa *v,
> +                           struct vhost_iotlb *iotlb,
> +                           u64 iova, u64 size)
>  {
>         struct vdpa_device *vdpa = v->vdpa;
>         const struct vdpa_config_ops *ops = vdpa->config;
> +       u32 asid = iotlb_to_asid(iotlb);
> +
> +       if (!iotlb)
> +               return -EINVAL;

I think there is no need of checking for this. Similar functions
assume the caller will pass non-null arguments, and
vhost_vdpa_process_iotlb_msg does it.

With that into account, I think there is little point in making this
function return something different than void.

Apart from that, iotlb is already used before checking for NULL.

>
>         vhost_vdpa_iotlb_unmap(v, iotlb, iova, iova + size - 1);
>
>         if (ops->dma_map) {
> -               ops->dma_unmap(vdpa, 0, iova, size);
> +               ops->dma_unmap(vdpa, asid, iova, size);
>         } else if (ops->set_map) {
>                 if (!v->in_batch)
> -                       ops->set_map(vdpa, 0, iotlb);
> +                       ops->set_map(vdpa, asid, iotlb);
>         } else {
>                 iommu_unmap(v->domain, iova, size);
>         }
> +
> +       /* If we are in the middle of batch processing, delay the free
> +        * of AS until BATCH_END.
> +        */
> +       if (!v->in_batch && !iotlb->nmaps)
> +               vhost_vdpa_remove_as(v, asid);
> +
> +       return 0;
>  }
>
>  static int vhost_vdpa_va_map(struct vhost_vdpa *v,
> @@ -916,33 +955,55 @@ static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
>         struct vhost_vdpa *v = container_of(dev, struct vhost_vdpa, vdev);
>         struct vdpa_device *vdpa = v->vdpa;
>         const struct vdpa_config_ops *ops = vdpa->config;
> -       struct vhost_vdpa_as *as = asid_to_as(v, 0);
> -       struct vhost_iotlb *iotlb = &as->iotlb;
> +       struct vhost_iotlb *iotlb = NULL;
> +       struct vhost_vdpa_as *as = NULL;
>         int r = 0;
>
>         mutex_lock(&dev->mutex);
>
> -       if (asid != 0)
> -               return -EINVAL;
> -
>         r = vhost_dev_check_owner(dev);
>         if (r)
>                 goto unlock;
>
> +       if (msg->type == VHOST_IOTLB_UPDATE ||
> +           msg->type == VHOST_IOTLB_BATCH_BEGIN) {
> +               as = vhost_vdpa_find_alloc_as(v, asid);
> +               if (!as) {
> +                       dev_err(&v->dev, "can't find and alloc asid %d\n",
> +                               asid);
> +                       return -EINVAL;
> +               }
> +               iotlb = &as->iotlb;
> +       } else
> +               iotlb = asid_to_iotlb(v, asid);
> +
> +       if ((v->in_batch && v->batch_asid != asid) || !iotlb) {
> +               if (v->in_batch && v->batch_asid != asid) {
> +                       dev_info(&v->dev, "batch id %d asid %d\n",
> +                                v->batch_asid, asid);
> +               }
> +               if (!iotlb)
> +                       dev_err(&v->dev, "no iotlb for asid %d\n", asid);
> +               return -EINVAL;
> +       }
> +
>         switch (msg->type) {
>         case VHOST_IOTLB_UPDATE:
>                 r = vhost_vdpa_process_iotlb_update(v, iotlb, msg);
>                 break;
>         case VHOST_IOTLB_INVALIDATE:
> -               vhost_vdpa_unmap(v, iotlb, msg->iova, msg->size);
> +               r = vhost_vdpa_unmap(v, iotlb, msg->iova, msg->size);
>                 break;
>         case VHOST_IOTLB_BATCH_BEGIN:
> +               v->batch_asid = asid;
>                 v->in_batch = true;
>                 break;
>         case VHOST_IOTLB_BATCH_END:
>                 if (v->in_batch && ops->set_map)
> -                       ops->set_map(vdpa, 0, iotlb);
> +                       ops->set_map(vdpa, asid, iotlb);
>                 v->in_batch = false;
> +               if (!iotlb->nmaps)
> +                       vhost_vdpa_remove_as(v, asid);
>                 break;
>         default:
>                 r = -EINVAL;
> @@ -1030,9 +1091,17 @@ static void vhost_vdpa_set_iova_range(struct vhost_vdpa *v)
>
>  static void vhost_vdpa_cleanup(struct vhost_vdpa *v)
>  {
> +       struct vhost_vdpa_as *as;
> +       u32 asid;
> +
>         vhost_dev_cleanup(&v->vdev);
>         kfree(v->vdev.vqs);
> -       vhost_vdpa_remove_as(v, 0);
> +
> +       for (asid = 0; asid < v->vdpa->nas; asid++) {
> +               as = asid_to_as(v, asid);
> +               if (as)
> +                       vhost_vdpa_remove_as(v, asid);
> +       }
>  }
>
>  static int vhost_vdpa_open(struct inode *inode, struct file *filep)
> @@ -1067,12 +1136,9 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep)
>         vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false,
>                        vhost_vdpa_process_iotlb_msg);
>
> -       if (!vhost_vdpa_alloc_as(v, 0))
> -               goto err_alloc_as;
> -
>         r = vhost_vdpa_alloc_domain(v);
>         if (r)
> -               goto err_alloc_as;
> +               goto err_alloc_domain;
>
>         vhost_vdpa_set_iova_range(v);
>
> @@ -1080,7 +1146,7 @@ static int vhost_vdpa_open(struct inode *inode, struct file *filep)
>
>         return 0;
>
> -err_alloc_as:
> +err_alloc_domain:
>         vhost_vdpa_cleanup(v);
>  err:
>         atomic_dec(&v->opened);
> @@ -1205,8 +1271,11 @@ static int vhost_vdpa_probe(struct vdpa_device *vdpa)
>         int minor;
>         int i, r;
>
> -       /* Only support 1 address space and 1 groups */
> -       if (vdpa->ngroups != 1 || vdpa->nas != 1)
> +       /* We can't support platform IOMMU device with more than 1
> +        * group or as
> +        */
> +       if (!ops->set_map && !ops->dma_map &&
> +           (vdpa->ngroups > 1 || vdpa->nas > 1))
>                 return -EOPNOTSUPP;
>
>         v = kzalloc(sizeof(*v), GFP_KERNEL | __GFP_RETRY_MAYFAIL);
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 1f514d98f0de..92eeb684c84d 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -1167,7 +1167,7 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
>                                 ret = -EINVAL;
>                                 goto done;
>                         }
> -                       offset = sizeof(__u16);
> +                       offset = 0;
>                 } else
>                         offset = sizeof(__u32);
>                 break;
> --
> 2.25.0
>


  reply	other threads:[~2022-03-04 18:05 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-16  6:47 [PATCH 00/21] Control VQ support in vDPA Jason Wang
2020-12-16  6:47 ` [PATCH 01/21] vhost: move the backend feature bits to vhost_types.h Jason Wang
2020-12-16  6:47 ` [PATCH 02/21] virtio-vdpa: don't set callback if virtio doesn't need it Jason Wang
2020-12-16  6:48 ` [PATCH 03/21] vhost-vdpa: passing iotlb to IOMMU mapping helpers Jason Wang
2020-12-16  6:48 ` [PATCH 04/21] vhost-vdpa: switch to use vhost-vdpa specific IOTLB Jason Wang
2020-12-16  6:48 ` [PATCH 05/21] vdpa: add the missing comment for nvqs in struct vdpa_device Jason Wang
2020-12-16  6:48 ` [PATCH 06/21] vdpa: introduce virtqueue groups Jason Wang
2021-01-04 10:04   ` Stefan Hajnoczi
2021-01-05  4:13     ` Jason Wang
2020-12-16  6:48 ` [PATCH 07/21] vdpa: multiple address spaces support Jason Wang
2020-12-29  7:28   ` Eli Cohen
2020-12-30  4:00     ` Jason Wang
2020-12-30  4:04     ` Jason Wang
2020-12-30  9:44       ` Eli Cohen
2020-12-16  6:48 ` [PATCH 08/21] vdpa: introduce config operations for associating ASID to a virtqueue group Jason Wang
2020-12-16  6:48 ` [PATCH 09/21] vhost_iotlb: split out IOTLB initialization Jason Wang
2020-12-16  6:48 ` [PATCH 10/21] vhost: support ASID in IOTLB API Jason Wang
2020-12-29 10:20   ` Eli Cohen
2020-12-30  4:27     ` Jason Wang
2020-12-16  6:48 ` [PATCH 11/21] vhost-vdpa: introduce asid based IOTLB Jason Wang
2020-12-29 11:41   ` Eli Cohen
2020-12-30  6:23     ` Jason Wang
2020-12-29 11:53   ` Eli Cohen
2020-12-30  6:34     ` Jason Wang
2020-12-29 12:05   ` Eli Cohen
2020-12-30  6:33     ` Jason Wang
2020-12-16  6:48 ` [PATCH 12/21] vhost-vdpa: introduce uAPI to get the number of virtqueue groups Jason Wang
2020-12-29 12:24   ` Eli Cohen
2020-12-30  6:49     ` Jason Wang
2020-12-30 10:05   ` Eli Cohen
2020-12-31  2:36     ` Jason Wang
2020-12-16  6:48 ` [PATCH 13/21] vhost-vdpa: introduce uAPI to get the number of address spaces Jason Wang
2020-12-16  6:48 ` [PATCH 14/21] vhost-vdpa: uAPI to get virtqueue group id Jason Wang
2020-12-16  6:48 ` [PATCH 15/21] vhost-vdpa: introduce uAPI to set group ASID Jason Wang
2020-12-16  6:48 ` [PATCH 16/21] vhost-vdpa: support ASID based IOTLB API Jason Wang
2020-12-16  6:48 ` [PATCH 17/21] vdpa_sim: split vdpasim_virtqueue's iov field in out_iov and in_iov Jason Wang
2020-12-16  6:48 ` [PATCH 18/21] vdpa_sim: advertise VIRTIO_NET_F_MTU Jason Wang
2020-12-16  6:48 ` [PATCH 19/21] vdpa_sim: factor out buffer completion logic Jason Wang
2020-12-16  6:48 ` [PATCH 20/21] vdpa_sim: filter destination mac address Jason Wang
2020-12-16  6:48 ` [PATCH 21/21] vdpasim: control virtqueue support Jason Wang
2020-12-17 20:19   ` kernel test robot
2021-01-11 12:26   ` Eli Cohen
2021-01-12  3:11     ` Jason Wang
2021-01-22 19:43       ` Eugenio Perez Martin
2021-01-25  3:16         ` Jason Wang
2020-12-16  9:47 ` [PATCH 00/21] Control VQ support in vDPA Michael S. Tsirkin
2020-12-17  3:30   ` Jason Wang
2020-12-17  7:58     ` Michael S. Tsirkin
2020-12-17  9:02       ` Jason Wang
2020-12-17 22:28         ` Michael S. Tsirkin
2020-12-18  2:56           ` Jason Wang
2020-12-17  7:26 ` Eli Cohen
2022-02-24 21:22 ` [RFC PATCH v2 00/19] " Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 01/19] vhost: move the backend feature bits to vhost_types.h Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 02/19] virtio-vdpa: don't set callback if virtio doesn't need it Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 03/19] vhost-vdpa: passing iotlb to IOMMU mapping helpers Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 04/19] vhost-vdpa: switch to use vhost-vdpa specific IOTLB Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 05/19] vdpa: introduce virtqueue groups Gautam Dawar
2022-02-28  8:07     ` Jason Wang
2022-02-28 10:57       ` Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 06/19] vdpa: multiple address spaces support Gautam Dawar
2022-03-03 19:39     ` Eugenio Perez Martin
2022-03-04  6:30       ` Gautam Dawar
2022-03-04 17:45         ` Eugenio Perez Martin
2022-02-24 21:22   ` [RFC PATCH v2 07/19] vdpa: introduce config operations for associating ASID to a virtqueue group Gautam Dawar
2022-03-04  9:54     ` Eugenio Perez Martin
2022-03-04 17:48       ` Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 08/19] vhost_iotlb: split out IOTLB initialization Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 09/19] vhost: support ASID in IOTLB API Gautam Dawar
2022-03-04 10:25     ` Eugenio Perez Martin
2022-03-04 17:52       ` Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 10/19] vhost-vdpa: introduce asid based IOTLB Gautam Dawar
2022-03-04 17:56     ` Eugenio Perez Martin
2022-03-07 10:07       ` Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 11/19] vhost-vdpa: introduce uAPI to get the number of virtqueue groups Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 12/19] vhost-vdpa: introduce uAPI to get the number of address spaces Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 13/19] vhost-vdpa: uAPI to get virtqueue group id Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 14/19] vhost-vdpa: introduce uAPI to set group ASID Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 15/19] vhost-vdpa: support ASID based IOTLB API Gautam Dawar
2022-03-04 18:04     ` Eugenio Perez Martin [this message]
2022-03-07 10:23       ` Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 16/19] vdpa_sim: advertise VIRTIO_NET_F_MTU Gautam Dawar
2022-03-10 17:55     ` Eugenio Perez Martin
2022-02-24 21:22   ` [RFC PATCH v2 17/19] vdpa_sim: factor out buffer completion logic Gautam Dawar
2022-02-24 21:22   ` [RFC PATCH v2 18/19] vdpa_sim: filter destination mac address Gautam Dawar
2022-03-10 18:22     ` Eugenio Perez Martin
2022-02-24 21:22   ` [RFC PATCH v2 19/19] vdpasim: control virtqueue support Gautam Dawar
2022-03-10 18:20     ` Eugenio Perez Martin
2022-03-18  7:35     ` Eugenio Perez Martin
2022-03-22  8:46       ` Gautam Dawar
2022-02-28  8:17   ` [RFC PATCH v2 00/19] Control VQ support in vDPA Jason Wang
2022-02-28 10:56     ` Gautam Dawar

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=CAJaqyWcesvA68ghx15y0eJgZvXr5MNqYy2X2S+PJ3U_K8Z+DdQ@mail.gmail.com \
    --to=eperezma@redhat.com \
    --cc=elic@nvidia.com \
    --cc=gautam.dawar@xilinx.com \
    --cc=gdawar@xilinx.com \
    --cc=hanand@xilinx.com \
    --cc=jasowang@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=lingshan.zhu@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longpeng2@huawei.com \
    --cc=martinh@xilinx.com \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=parav@nvidia.com \
    --cc=sgarzare@redhat.com \
    --cc=si-wei.liu@oracle.com \
    --cc=tanujk@xilinx.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xieyongji@bytedance.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).