All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhenyu Wang <zhenyuw@linux.intel.com>
To: Alexey Kardashevskiy <aik@ozlabs.ru>
Cc: Alex Williamson <alex.williamson@redhat.com>,
	linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
	intel-gvt-dev@lists.freedesktop.org, kwankhede@nvidia.com,
	zhenyuw@linux.intel.com, zhi.a.wang@intel.com
Subject: Re: [PATCH] vfio: Simplify capability helper
Date: Wed, 13 Dec 2017 15:01:24 +0800	[thread overview]
Message-ID: <20171213070123.jw2isiu5xhjnnqie@zhen-hp.sh.intel.com> (raw)
In-Reply-To: <47fab4f4-3f13-312c-aff8-5b3576b12578@ozlabs.ru>

[-- Attachment #1: Type: text/plain, Size: 8590 bytes --]

On 2017.12.13 12:13:34 +1100, Alexey Kardashevskiy wrote:
> On 13/12/17 06:59, Alex Williamson wrote:
> > The vfio_info_add_capability() helper requires the caller to pass a
> > capability ID, which it then uses to fill in header fields, assuming
> > hard coded versions.  This makes for an awkward and rigid interface.
> > The only thing we want this helper to do is allocate sufficient
> > space in the caps buffer and chain this capability into the list.
> > Reduce it to that simple task.
> > 
> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
> 
> 
> Makes more sense now, thanks. I'll repost mine on top of this.
> 
> 
> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> 
>

Looks good for KVMGT part.

Acked-by: Zhenyu Wang <zhenyuw@linux.intel.com>

> Below one observation, unrelated to this patch.
> 
> > ---
> >  drivers/gpu/drm/i915/gvt/kvmgt.c |   15 +++++++----
> >  drivers/vfio/pci/vfio_pci.c      |   14 ++++++----
> >  drivers/vfio/vfio.c              |   52 +++-----------------------------------
> >  include/linux/vfio.h             |    3 +-
> >  4 files changed, 24 insertions(+), 60 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> > index 96060920a6fe..0a7d084da1a2 100644
> > --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> > +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> > @@ -1012,6 +1012,8 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
> >  			if (!sparse)
> >  				return -ENOMEM;
> >  
> > +			sparse->header.id = VFIO_REGION_INFO_CAP_SPARSE_MMAP;
> > +			sparse->header.version = 1;
> >  			sparse->nr_areas = nr_areas;
> >  			cap_type_id = VFIO_REGION_INFO_CAP_SPARSE_MMAP;
> 
> 
> @cap_type_id is initialized in just one of many cases of switch
> (info.index) and after the entire switch, there is switch (cap_type_id). I
> wonder why compiler missed "potentially uninitialized variable here,
> although there is no bug - @cap_type_id is in sync with @spapse. It would
> make it cleaner imho just to have vfio_info_add_capability() next to the
> header initialization.
> 

yeah, we could clean that up, thanks for pointing out.

> 
> 
> >  			sparse->areas[0].offset =
> > @@ -1033,7 +1035,9 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
> >  			break;
> >  		default:
> >  			{
> > -				struct vfio_region_info_cap_type cap_type;
> > +				struct vfio_region_info_cap_type cap_type = {
> > +					.header.id = VFIO_REGION_INFO_CAP_TYPE,
> > +					.header.version = 1 };
> >  
> >  				if (info.index >= VFIO_PCI_NUM_REGIONS +
> >  						vgpu->vdev.num_regions)
> > @@ -1050,8 +1054,8 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
> >  				cap_type.subtype = vgpu->vdev.region[i].subtype;
> >  
> >  				ret = vfio_info_add_capability(&caps,
> > -						VFIO_REGION_INFO_CAP_TYPE,
> > -						&cap_type);
> > +							&cap_type.header,
> > +							sizeof(cap_type));
> >  				if (ret)
> >  					return ret;
> >  			}
> > @@ -1061,8 +1065,9 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
> >  			switch (cap_type_id) {
> >  			case VFIO_REGION_INFO_CAP_SPARSE_MMAP:
> >  				ret = vfio_info_add_capability(&caps,
> > -					VFIO_REGION_INFO_CAP_SPARSE_MMAP,
> > -					sparse);
> > +					&sparse->header, sizeof(*sparse) +
> > +					(sparse->nr_areas *
> > +						sizeof(*sparse->areas)));
> >  				kfree(sparse);
> >  				if (ret)
> >  					return ret;
> > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
> > index f041b1a6cf66..a73e40983880 100644
> > --- a/drivers/vfio/pci/vfio_pci.c
> > +++ b/drivers/vfio/pci/vfio_pci.c
> > @@ -582,6 +582,8 @@ static int msix_sparse_mmap_cap(struct vfio_pci_device *vdev,
> >  	if (!sparse)
> >  		return -ENOMEM;
> >  
> > +	sparse->header.id = VFIO_REGION_INFO_CAP_SPARSE_MMAP;
> > +	sparse->header.version = 1;
> >  	sparse->nr_areas = nr_areas;
> >  
> >  	if (vdev->msix_offset & PAGE_MASK) {
> > @@ -597,8 +599,7 @@ static int msix_sparse_mmap_cap(struct vfio_pci_device *vdev,
> >  		i++;
> >  	}
> >  
> > -	ret = vfio_info_add_capability(caps, VFIO_REGION_INFO_CAP_SPARSE_MMAP,
> > -				       sparse);
> > +	ret = vfio_info_add_capability(caps, &sparse->header, size);
> >  	kfree(sparse);
> >  
> >  	return ret;
> > @@ -741,7 +742,9 @@ static long vfio_pci_ioctl(void *device_data,
> >  			break;
> >  		default:
> >  		{
> > -			struct vfio_region_info_cap_type cap_type;
> > +			struct vfio_region_info_cap_type cap_type = {
> > +					.header.id = VFIO_REGION_INFO_CAP_TYPE,
> > +					.header.version = 1 };
> >  
> >  			if (info.index >=
> >  			    VFIO_PCI_NUM_REGIONS + vdev->num_regions)
> > @@ -756,9 +759,8 @@ static long vfio_pci_ioctl(void *device_data,
> >  			cap_type.type = vdev->region[i].type;
> >  			cap_type.subtype = vdev->region[i].subtype;
> >  
> > -			ret = vfio_info_add_capability(&caps,
> > -						      VFIO_REGION_INFO_CAP_TYPE,
> > -						      &cap_type);
> > +			ret = vfio_info_add_capability(&caps, &cap_type.header,
> > +						       sizeof(cap_type));
> >  			if (ret)
> >  				return ret;
> >  
> > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
> > index 2bc3705a99bd..721f97f8dac1 100644
> > --- a/drivers/vfio/vfio.c
> > +++ b/drivers/vfio/vfio.c
> > @@ -1857,63 +1857,19 @@ void vfio_info_cap_shift(struct vfio_info_cap *caps, size_t offset)
> >  }
> >  EXPORT_SYMBOL(vfio_info_cap_shift);
> >  
> > -static int sparse_mmap_cap(struct vfio_info_cap *caps, void *cap_type)
> > +int vfio_info_add_capability(struct vfio_info_cap *caps,
> > +			     struct vfio_info_cap_header *cap, size_t size)
> >  {
> >  	struct vfio_info_cap_header *header;
> > -	struct vfio_region_info_cap_sparse_mmap *sparse_cap, *sparse = cap_type;
> > -	size_t size;
> >  
> > -	size = sizeof(*sparse) + sparse->nr_areas *  sizeof(*sparse->areas);
> > -	header = vfio_info_cap_add(caps, size,
> > -				   VFIO_REGION_INFO_CAP_SPARSE_MMAP, 1);
> > +	header = vfio_info_cap_add(caps, size, cap->id, cap->version);
> >  	if (IS_ERR(header))
> >  		return PTR_ERR(header);
> >  
> > -	sparse_cap = container_of(header,
> > -			struct vfio_region_info_cap_sparse_mmap, header);
> > -	sparse_cap->nr_areas = sparse->nr_areas;
> > -	memcpy(sparse_cap->areas, sparse->areas,
> > -	       sparse->nr_areas * sizeof(*sparse->areas));
> > -	return 0;
> > -}
> > -
> > -static int region_type_cap(struct vfio_info_cap *caps, void *cap_type)
> > -{
> > -	struct vfio_info_cap_header *header;
> > -	struct vfio_region_info_cap_type *type_cap, *cap = cap_type;
> > +	memcpy(header + 1, cap + 1, size - sizeof(*header));
> >  
> > -	header = vfio_info_cap_add(caps, sizeof(*cap),
> > -				   VFIO_REGION_INFO_CAP_TYPE, 1);
> > -	if (IS_ERR(header))
> > -		return PTR_ERR(header);
> > -
> > -	type_cap = container_of(header, struct vfio_region_info_cap_type,
> > -				header);
> > -	type_cap->type = cap->type;
> > -	type_cap->subtype = cap->subtype;
> >  	return 0;
> >  }
> > -
> > -int vfio_info_add_capability(struct vfio_info_cap *caps, int cap_type_id,
> > -			     void *cap_type)
> > -{
> > -	int ret = -EINVAL;
> > -
> > -	if (!cap_type)
> > -		return 0;
> > -
> > -	switch (cap_type_id) {
> > -	case VFIO_REGION_INFO_CAP_SPARSE_MMAP:
> > -		ret = sparse_mmap_cap(caps, cap_type);
> > -		break;
> > -
> > -	case VFIO_REGION_INFO_CAP_TYPE:
> > -		ret = region_type_cap(caps, cap_type);
> > -		break;
> > -	}
> > -
> > -	return ret;
> > -}
> >  EXPORT_SYMBOL(vfio_info_add_capability);
> >  
> >  int vfio_set_irqs_validate_and_prepare(struct vfio_irq_set *hdr, int num_irqs,
> > diff --git a/include/linux/vfio.h b/include/linux/vfio.h
> > index a47b985341d1..66741ab087c1 100644
> > --- a/include/linux/vfio.h
> > +++ b/include/linux/vfio.h
> > @@ -145,7 +145,8 @@ extern struct vfio_info_cap_header *vfio_info_cap_add(
> >  extern void vfio_info_cap_shift(struct vfio_info_cap *caps, size_t offset);
> >  
> >  extern int vfio_info_add_capability(struct vfio_info_cap *caps,
> > -				    int cap_type_id, void *cap_type);
> > +				    struct vfio_info_cap_header *cap,
> > +				    size_t size);
> >  
> >  extern int vfio_set_irqs_validate_and_prepare(struct vfio_irq_set *hdr,
> >  					      int num_irqs, int max_irq_type,
> > 
> 
> 
> -- 
> Alexey

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

  reply	other threads:[~2017-12-13  7:07 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-12 19:59 [PATCH] vfio: Simplify capability helper Alex Williamson
2017-12-13  1:13 ` Alexey Kardashevskiy
2017-12-13  7:01   ` Zhenyu Wang [this message]
2017-12-13  9:04     ` Kirti Wankhede
2017-12-13  6:49 ` Peter Xu
2017-12-13 15:04   ` Auger Eric
2017-12-13 15:32     ` Auger Eric
2017-12-15  6:20       ` Peter Xu
2017-12-13 15:35     ` Alex Williamson
2017-12-15  6:18       ` Peter Xu
2017-12-13  9:23 ` Auger Eric

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=20171213070123.jw2isiu5xhjnnqie@zhen-hp.sh.intel.com \
    --to=zhenyuw@linux.intel.com \
    --cc=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=intel-gvt-dev@lists.freedesktop.org \
    --cc=kvm@vger.kernel.org \
    --cc=kwankhede@nvidia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=zhi.a.wang@intel.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.