All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] pci: Store more data about VFs into the SRIOV struct
@ 2018-03-01 13:26 KarimAllah Ahmed
  2018-03-01 19:34 ` Bjorn Helgaas
  0 siblings, 1 reply; 4+ messages in thread
From: KarimAllah Ahmed @ 2018-03-01 13:26 UTC (permalink / raw)
  To: linux-pci, linux-kernel; +Cc: KarimAllah Ahmed, Bjorn Helgaas

... to avoid reading them from the config space of all the PCI VFs. This is
specially a useful optimization when bringing up thousands of VFs.

Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: linux-pci@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
---
v1 -> v2:
* Rebase on latest + remove dependency on a non-upstream patch.

 drivers/pci/iov.c   | 16 ++++++++++++++++
 drivers/pci/pci.h   |  5 +++++
 drivers/pci/probe.c | 42 ++++++++++++++++++++++++++++++++----------
 3 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index 677924a..e1d2e3f 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -114,6 +114,19 @@ resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
 	return dev->sriov->barsz[resno - PCI_IOV_RESOURCES];
 }
 
+static void pci_read_vf_config_common(struct pci_bus *bus, struct pci_dev *dev)
+{
+	int devfn = pci_iov_virtfn_devfn(dev, 0);
+
+	pci_bus_read_config_dword(bus, devfn, PCI_CLASS_REVISION,
+				  &dev->sriov->class);
+	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_ID,
+				 &dev->sriov->subsystem_device);
+	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_VENDOR_ID,
+				 &dev->sriov->subsystem_vendor);
+	pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &dev->sriov->hdr_type);
+}
+
 int pci_iov_add_virtfn(struct pci_dev *dev, int id)
 {
 	int i;
@@ -133,6 +146,9 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
 	if (!virtfn)
 		goto failed0;
 
+	if (id == 0)
+		pci_read_vf_config_common(bus, dev);
+
 	virtfn->devfn = pci_iov_virtfn_devfn(dev, id);
 	virtfn->vendor = dev->vendor;
 	virtfn->device = iov->vf_device;
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index fcd8191..346daa5 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -271,6 +271,11 @@ struct pci_sriov {
 	u16		driver_max_VFs;	/* Max num VFs driver supports */
 	struct pci_dev	*dev;		/* Lowest numbered PF */
 	struct pci_dev	*self;		/* This PF */
+	u8 hdr_type;		/* VF header type */
+	u32 class;		/* VF device */
+	u16 device;		/* VF device */
+	u16 subsystem_vendor;	/* VF subsystem vendor */
+	u16 subsystem_device;	/* VF subsystem device */
 	resource_size_t	barsz[PCI_SRIOV_NUM_BARS];	/* VF BAR size */
 	bool		drivers_autoprobe; /* Auto probing of VFs by driver */
 };
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ef53774..aeaa10a 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -180,6 +180,7 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
 int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
 		    struct resource *res, unsigned int pos)
 {
+	int bar = res - dev->resource;
 	u32 l = 0, sz = 0, mask;
 	u64 l64, sz64, mask64;
 	u16 orig_cmd;
@@ -199,9 +200,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
 	res->name = pci_name(dev);
 
 	pci_read_config_dword(dev, pos, &l);
-	pci_write_config_dword(dev, pos, l | mask);
-	pci_read_config_dword(dev, pos, &sz);
-	pci_write_config_dword(dev, pos, l);
+	if (dev->is_virtfn) {
+		sz = dev->physfn->sriov->barsz[bar] & 0xffffffff;
+	} else {
+		pci_write_config_dword(dev, pos, l | mask);
+		pci_read_config_dword(dev, pos, &sz);
+		pci_write_config_dword(dev, pos, l);
+	}
 
 	/*
 	 * All bits set in sz means the device isn't working properly.
@@ -241,9 +246,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
 
 	if (res->flags & IORESOURCE_MEM_64) {
 		pci_read_config_dword(dev, pos + 4, &l);
-		pci_write_config_dword(dev, pos + 4, ~0);
-		pci_read_config_dword(dev, pos + 4, &sz);
-		pci_write_config_dword(dev, pos + 4, l);
+
+		if (dev->is_virtfn) {
+			sz = (dev->physfn->sriov->barsz[bar] >> 32) & 0xffffffff;
+		} else {
+			pci_write_config_dword(dev, pos + 4, ~0);
+			pci_read_config_dword(dev, pos + 4, &sz);
+			pci_write_config_dword(dev, pos + 4, l);
+		}
 
 		l64 |= ((u64)l << 32);
 		sz64 |= ((u64)sz << 32);
@@ -332,6 +342,8 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
 	for (pos = 0; pos < howmany; pos++) {
 		struct resource *res = &dev->resource[pos];
 		reg = PCI_BASE_ADDRESS_0 + (pos << 2);
+		if (dev->is_virtfn && dev->physfn->sriov->barsz[pos] == 0)
+			continue;
 		pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
 	}
 
@@ -1454,7 +1466,9 @@ int pci_setup_device(struct pci_dev *dev)
 	struct pci_bus_region region;
 	struct resource *res;
 
-	if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
+	if (dev->is_virtfn)
+		hdr_type = dev->physfn->sriov->hdr_type;
+	else if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
 		return -EIO;
 
 	dev->sysdata = dev->bus->sysdata;
@@ -1477,7 +1491,10 @@ int pci_setup_device(struct pci_dev *dev)
 		     dev->bus->number, PCI_SLOT(dev->devfn),
 		     PCI_FUNC(dev->devfn));
 
-	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
+	if (dev->is_virtfn)
+		class = dev->physfn->sriov->class;
+	else
+		pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
 	dev->revision = class & 0xff;
 	dev->class = class >> 8;		    /* upper 3 bytes */
 
@@ -1517,8 +1534,13 @@ int pci_setup_device(struct pci_dev *dev)
 			goto bad;
 		pci_read_irq(dev);
 		pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
-		pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
-		pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
+		if (dev->is_virtfn) {
+			dev->subsystem_vendor = dev->physfn->sriov->subsystem_vendor;
+			dev->subsystem_device = dev->physfn->sriov->subsystem_device;
+		} else {
+			pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
+			pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
+		}
 
 		/*
 		 * Do the ugly legacy mode stuff here rather than broken chip
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] pci: Store more data about VFs into the SRIOV struct
  2018-03-01 13:26 [PATCH v2] pci: Store more data about VFs into the SRIOV struct KarimAllah Ahmed
@ 2018-03-01 19:34 ` Bjorn Helgaas
  2018-03-01 21:32     ` Raslan, KarimAllah
  0 siblings, 1 reply; 4+ messages in thread
From: Bjorn Helgaas @ 2018-03-01 19:34 UTC (permalink / raw)
  To: KarimAllah Ahmed; +Cc: linux-pci, linux-kernel, Bjorn Helgaas

s|pci: Store|PCI/IOV: Store|

(run "git log --oneline drivers/pci/probe.c" to see why)

On Thu, Mar 01, 2018 at 02:26:04PM +0100, KarimAllah Ahmed wrote:
> ... to avoid reading them from the config space of all the PCI VFs. This is
> specially a useful optimization when bringing up thousands of VFs.

Please make the changelog complete in itself, so it doesn't have to be
read in conjunction with the subject.  It's OK if you have to repeat
the subject in the changelog.

> Cc: Bjorn Helgaas <bhelgaas@google.com>
> Cc: linux-pci@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
> ---
> v1 -> v2:
> * Rebase on latest + remove dependency on a non-upstream patch.
> 
>  drivers/pci/iov.c   | 16 ++++++++++++++++
>  drivers/pci/pci.h   |  5 +++++
>  drivers/pci/probe.c | 42 ++++++++++++++++++++++++++++++++----------
>  3 files changed, 53 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index 677924a..e1d2e3f 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -114,6 +114,19 @@ resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
>  	return dev->sriov->barsz[resno - PCI_IOV_RESOURCES];
>  }
>  
> +static void pci_read_vf_config_common(struct pci_bus *bus, struct pci_dev *dev)
> +{
> +	int devfn = pci_iov_virtfn_devfn(dev, 0);
> +
> +	pci_bus_read_config_dword(bus, devfn, PCI_CLASS_REVISION,
> +				  &dev->sriov->class);
> +	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_ID,
> +				 &dev->sriov->subsystem_device);
> +	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_VENDOR_ID,
> +				 &dev->sriov->subsystem_vendor);
> +	pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &dev->sriov->hdr_type);

Can't you do this a little later, e.g., after pci_iov_add_virtfn()
calls pci_setup_device(), and then use the standard
pci_read_config_*() interfaces instead of the special
pci_bus_read_config*() ones?

> +}
> +
>  int pci_iov_add_virtfn(struct pci_dev *dev, int id)
>  {
>  	int i;
> @@ -133,6 +146,9 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
>  	if (!virtfn)
>  		goto failed0;
>  
> +	if (id == 0)
> +		pci_read_vf_config_common(bus, dev);
> +
>  	virtfn->devfn = pci_iov_virtfn_devfn(dev, id);
>  	virtfn->vendor = dev->vendor;
>  	virtfn->device = iov->vf_device;
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index fcd8191..346daa5 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -271,6 +271,11 @@ struct pci_sriov {
>  	u16		driver_max_VFs;	/* Max num VFs driver supports */
>  	struct pci_dev	*dev;		/* Lowest numbered PF */
>  	struct pci_dev	*self;		/* This PF */
> +	u8 hdr_type;		/* VF header type */
> +	u32 class;		/* VF device */
> +	u16 device;		/* VF device */
> +	u16 subsystem_vendor;	/* VF subsystem vendor */
> +	u16 subsystem_device;	/* VF subsystem device */

Please make the whitespace here match the existing code, i.e.,
line up the structure element names and comments.

>  	resource_size_t	barsz[PCI_SRIOV_NUM_BARS];	/* VF BAR size */
>  	bool		drivers_autoprobe; /* Auto probing of VFs by driver */
>  };
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index ef53774..aeaa10a 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -180,6 +180,7 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
>  int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>  		    struct resource *res, unsigned int pos)
>  {
> +	int bar = res - dev->resource;
>  	u32 l = 0, sz = 0, mask;
>  	u64 l64, sz64, mask64;
>  	u16 orig_cmd;
> @@ -199,9 +200,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>  	res->name = pci_name(dev);
>  
>  	pci_read_config_dword(dev, pos, &l);
> -	pci_write_config_dword(dev, pos, l | mask);
> -	pci_read_config_dword(dev, pos, &sz);
> -	pci_write_config_dword(dev, pos, l);
> +	if (dev->is_virtfn) {
> +		sz = dev->physfn->sriov->barsz[bar] & 0xffffffff;
> +	} else {
> +		pci_write_config_dword(dev, pos, l | mask);
> +		pci_read_config_dword(dev, pos, &sz);
> +		pci_write_config_dword(dev, pos, l);
> +	}

This part is not like the others, i.e., the others are caching info
from VF 0 in newly-added elements of struct pci_sriov.  This also uses
information from struct pci_sriov, but it's qualitatively different,
so it should be in a separate patch.

>  	/*
>  	 * All bits set in sz means the device isn't working properly.
> @@ -241,9 +246,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
>  
>  	if (res->flags & IORESOURCE_MEM_64) {
>  		pci_read_config_dword(dev, pos + 4, &l);
> -		pci_write_config_dword(dev, pos + 4, ~0);
> -		pci_read_config_dword(dev, pos + 4, &sz);
> -		pci_write_config_dword(dev, pos + 4, l);
> +
> +		if (dev->is_virtfn) {
> +			sz = (dev->physfn->sriov->barsz[bar] >> 32) & 0xffffffff;
> +		} else {
> +			pci_write_config_dword(dev, pos + 4, ~0);
> +			pci_read_config_dword(dev, pos + 4, &sz);
> +			pci_write_config_dword(dev, pos + 4, l);
> +		}
>  
>  		l64 |= ((u64)l << 32);
>  		sz64 |= ((u64)sz << 32);
> @@ -332,6 +342,8 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
>  	for (pos = 0; pos < howmany; pos++) {
>  		struct resource *res = &dev->resource[pos];
>  		reg = PCI_BASE_ADDRESS_0 + (pos << 2);
> +		if (dev->is_virtfn && dev->physfn->sriov->barsz[pos] == 0)
> +			continue;
>  		pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
>  	}
>  
> @@ -1454,7 +1466,9 @@ int pci_setup_device(struct pci_dev *dev)
>  	struct pci_bus_region region;
>  	struct resource *res;
>  
> -	if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
> +	if (dev->is_virtfn)
> +		hdr_type = dev->physfn->sriov->hdr_type;
> +	else if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
>  		return -EIO;
>  
>  	dev->sysdata = dev->bus->sysdata;
> @@ -1477,7 +1491,10 @@ int pci_setup_device(struct pci_dev *dev)
>  		     dev->bus->number, PCI_SLOT(dev->devfn),
>  		     PCI_FUNC(dev->devfn));
>  
> -	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
> +	if (dev->is_virtfn)
> +		class = dev->physfn->sriov->class;
> +	else
> +		pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
>  	dev->revision = class & 0xff;
>  	dev->class = class >> 8;		    /* upper 3 bytes */
>  
> @@ -1517,8 +1534,13 @@ int pci_setup_device(struct pci_dev *dev)
>  			goto bad;
>  		pci_read_irq(dev);
>  		pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
> -		pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
> -		pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
> +		if (dev->is_virtfn) {
> +			dev->subsystem_vendor = dev->physfn->sriov->subsystem_vendor;
> +			dev->subsystem_device = dev->physfn->sriov->subsystem_device;

PCIe r4.0, sec 9.3.4.1.13 requires that Subsystem Vendor ID be the
same for the PF and all VFs, but sec 9.3.4.1.14 says the PF and VF may
have different Subsystem IDs.  I know you're caching the Subsystem ID
from VF 0, not the PF, but I don't see anything that requires all the
VFs to have the same Subsystem ID.

I think the same is technically true for the Revision ID.  It might be
reasonable to assume all the VFs have the same values, but maybe worth
a comment.

> +		} else {
> +			pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
> +			pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
> +		}
>  
>  		/*
>  		 * Do the ugly legacy mode stuff here rather than broken chip
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] pci: Store more data about VFs into the SRIOV struct
  2018-03-01 19:34 ` Bjorn Helgaas
@ 2018-03-01 21:32     ` Raslan, KarimAllah
  0 siblings, 0 replies; 4+ messages in thread
From: Raslan, KarimAllah @ 2018-03-01 21:32 UTC (permalink / raw)
  To: helgaas; +Cc: linux-kernel, linux-pci, bhelgaas

On Thu, 2018-03-01 at 13:34 -0600, Bjorn Helgaas wrote:
> s|pci: Store|PCI/IOV: Store|
> 
> (run "git log --oneline drivers/pci/probe.c" to see why)
> 
> On Thu, Mar 01, 2018 at 02:26:04PM +0100, KarimAllah Ahmed wrote:
> > 
> > ... to avoid reading them from the config space of all the PCI VFs. This is
> > specially a useful optimization when bringing up thousands of VFs.
> 
> Please make the changelog complete in itself, so it doesn't have to be
> read in conjunction with the subject.  It's OK if you have to repeat
> the subject in the changelog.

ack.

> 
> > 
> > Cc: Bjorn Helgaas <bhelgaas@google.com>
> > Cc: linux-pci@vger.kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
> > ---
> > v1 -> v2:
> > * Rebase on latest + remove dependency on a non-upstream patch.
> > 
> >  drivers/pci/iov.c   | 16 ++++++++++++++++
> >  drivers/pci/pci.h   |  5 +++++
> >  drivers/pci/probe.c | 42 ++++++++++++++++++++++++++++++++----------
> >  3 files changed, 53 insertions(+), 10 deletions(-)
> > 
> > diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> > index 677924a..e1d2e3f 100644
> > --- a/drivers/pci/iov.c
> > +++ b/drivers/pci/iov.c
> > @@ -114,6 +114,19 @@ resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
> >  	return dev->sriov->barsz[resno - PCI_IOV_RESOURCES];
> >  }
> >  
> > +static void pci_read_vf_config_common(struct pci_bus *bus, struct pci_dev *dev)
> > +{
> > +	int devfn = pci_iov_virtfn_devfn(dev, 0);
> > +
> > +	pci_bus_read_config_dword(bus, devfn, PCI_CLASS_REVISION,
> > +				  &dev->sriov->class);
> > +	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_ID,
> > +				 &dev->sriov->subsystem_device);
> > +	pci_bus_read_config_word(bus, devfn, PCI_SUBSYSTEM_VENDOR_ID,
> > +				 &dev->sriov->subsystem_vendor);
> > +	pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &dev->sriov->hdr_type);
> 
> Can't you do this a little later, e.g., after pci_iov_add_virtfn()
> calls pci_setup_device(), and then use the standard
> pci_read_config_*() interfaces instead of the special
> pci_bus_read_config*() ones?

ack.

I moved it after "pci_iov_virtfn_devfn".

> 
> > 
> > +}
> > +
> >  int pci_iov_add_virtfn(struct pci_dev *dev, int id)
> >  {
> >  	int i;
> > @@ -133,6 +146,9 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id)
> >  	if (!virtfn)
> >  		goto failed0;
> >  
> > +	if (id == 0)
> > +		pci_read_vf_config_common(bus, dev);
> > +
> >  	virtfn->devfn = pci_iov_virtfn_devfn(dev, id);
> >  	virtfn->vendor = dev->vendor;
> >  	virtfn->device = iov->vf_device;
> > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > index fcd8191..346daa5 100644
> > --- a/drivers/pci/pci.h
> > +++ b/drivers/pci/pci.h
> > @@ -271,6 +271,11 @@ struct pci_sriov {
> >  	u16		driver_max_VFs;	/* Max num VFs driver supports */
> >  	struct pci_dev	*dev;		/* Lowest numbered PF */
> >  	struct pci_dev	*self;		/* This PF */
> > +	u8 hdr_type;		/* VF header type */
> > +	u32 class;		/* VF device */
> > +	u16 device;		/* VF device */
> > +	u16 subsystem_vendor;	/* VF subsystem vendor */
> > +	u16 subsystem_device;	/* VF subsystem device */
> 
> Please make the whitespace here match the existing code, i.e.,
> line up the structure element names and comments.

ack!

> 
> > 
> >  	resource_size_t	barsz[PCI_SRIOV_NUM_BARS];	/* VF BAR size */
> >  	bool		drivers_autoprobe; /* Auto probing of VFs by driver */
> >  };
> > diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> > index ef53774..aeaa10a 100644
> > --- a/drivers/pci/probe.c
> > +++ b/drivers/pci/probe.c
> > @@ -180,6 +180,7 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
> >  int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
> >  		    struct resource *res, unsigned int pos)
> >  {
> > +	int bar = res - dev->resource;
> >  	u32 l = 0, sz = 0, mask;
> >  	u64 l64, sz64, mask64;
> >  	u16 orig_cmd;
> > @@ -199,9 +200,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
> >  	res->name = pci_name(dev);
> >  
> >  	pci_read_config_dword(dev, pos, &l);
> > -	pci_write_config_dword(dev, pos, l | mask);
> > -	pci_read_config_dword(dev, pos, &sz);
> > -	pci_write_config_dword(dev, pos, l);
> > +	if (dev->is_virtfn) {
> > +		sz = dev->physfn->sriov->barsz[bar] & 0xffffffff;
> > +	} else {
> > +		pci_write_config_dword(dev, pos, l | mask);
> > +		pci_read_config_dword(dev, pos, &sz);
> > +		pci_write_config_dword(dev, pos, l);
> > +	}
> 
> This part is not like the others, i.e., the others are caching info
> from VF 0 in newly-added elements of struct pci_sriov.  This also uses
> information from struct pci_sriov, but it's qualitatively different,
> so it should be in a separate patch.

ack. Moved to a seperate patch.

> 
> > 
> >  	/*
> >  	 * All bits set in sz means the device isn't working properly.
> > @@ -241,9 +246,14 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
> >  
> >  	if (res->flags & IORESOURCE_MEM_64) {
> >  		pci_read_config_dword(dev, pos + 4, &l);
> > -		pci_write_config_dword(dev, pos + 4, ~0);
> > -		pci_read_config_dword(dev, pos + 4, &sz);
> > -		pci_write_config_dword(dev, pos + 4, l);
> > +
> > +		if (dev->is_virtfn) {
> > +			sz = (dev->physfn->sriov->barsz[bar] >> 32) & 0xffffffff;
> > +		} else {
> > +			pci_write_config_dword(dev, pos + 4, ~0);
> > +			pci_read_config_dword(dev, pos + 4, &sz);
> > +			pci_write_config_dword(dev, pos + 4, l);
> > +		}
> >  
> >  		l64 |= ((u64)l << 32);
> >  		sz64 |= ((u64)sz << 32);
> > @@ -332,6 +342,8 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
> >  	for (pos = 0; pos < howmany; pos++) {
> >  		struct resource *res = &dev->resource[pos];
> >  		reg = PCI_BASE_ADDRESS_0 + (pos << 2);
> > +		if (dev->is_virtfn && dev->physfn->sriov->barsz[pos] == 0)
> > +			continue;
> >  		pos += __pci_read_base(dev, pci_bar_unknown, res, reg);
> >  	}
> >  
> > @@ -1454,7 +1466,9 @@ int pci_setup_device(struct pci_dev *dev)
> >  	struct pci_bus_region region;
> >  	struct resource *res;
> >  
> > -	if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
> > +	if (dev->is_virtfn)
> > +		hdr_type = dev->physfn->sriov->hdr_type;
> > +	else if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
> >  		return -EIO;
> >  
> >  	dev->sysdata = dev->bus->sysdata;
> > @@ -1477,7 +1491,10 @@ int pci_setup_device(struct pci_dev *dev)
> >  		     dev->bus->number, PCI_SLOT(dev->devfn),
> >  		     PCI_FUNC(dev->devfn));
> >  
> > -	pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
> > +	if (dev->is_virtfn)
> > +		class = dev->physfn->sriov->class;
> > +	else
> > +		pci_read_config_dword(dev, PCI_CLASS_REVISION, &class);
> >  	dev->revision = class & 0xff;
> >  	dev->class = class >> 8;		    /* upper 3 bytes */
> >  
> > @@ -1517,8 +1534,13 @@ int pci_setup_device(struct pci_dev *dev)
> >  			goto bad;
> >  		pci_read_irq(dev);
> >  		pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
> > -		pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
> > -		pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
> > +		if (dev->is_virtfn) {
> > +			dev->subsystem_vendor = dev->physfn->sriov->subsystem_vendor;
> > +			dev->subsystem_device = dev->physfn->sriov->subsystem_device;
> 
> PCIe r4.0, sec 9.3.4.1.13 requires that Subsystem Vendor ID be the
> same for the PF and all VFs, but sec 9.3.4.1.14 says the PF and VF may
> have different Subsystem IDs.  I know you're caching the Subsystem ID
> from VF 0, not the PF, but I don't see anything that requires all the
> VFs to have the same Subsystem ID.
> 
> I think the same is technically true for the Revision ID.  It might be
> reasonable to assume all the VFs have the same values, but maybe worth
> a comment.

I added a comment about that for the 3 fields.

> 
> > 
> > +		} else {
> > +			pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor);
> > +			pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device);
> > +		}
> >  
> >  		/*
> >  		 * Do the ugly legacy mode stuff here rather than broken chip
> > -- 
> > 2.7.4
> > 
> 
Amazon Development Center Germany GmbH
Berlin - Dresden - Aachen
main office: Krausenstr. 38, 10117 Berlin
Geschaeftsfuehrer: Dr. Ralf Herbrich, Christian Schlaeger
Ust-ID: DE289237879
Eingetragen am Amtsgericht Charlottenburg HRB 149173 B

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] pci: Store more data about VFs into the SRIOV struct
@ 2018-03-01 21:32     ` Raslan, KarimAllah
  0 siblings, 0 replies; 4+ messages in thread
From: Raslan, KarimAllah @ 2018-03-01 21:32 UTC (permalink / raw)
  To: helgaas; +Cc: linux-kernel, linux-pci, bhelgaas

T24gVGh1LCAyMDE4LTAzLTAxIGF0IDEzOjM0IC0wNjAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K
PiBzfHBjaTogU3RvcmV8UENJL0lPVjogU3RvcmV8DQo+IA0KPiAocnVuICJnaXQgbG9nIC0tb25l
bGluZSBkcml2ZXJzL3BjaS9wcm9iZS5jIiB0byBzZWUgd2h5KQ0KPiANCj4gT24gVGh1LCBNYXIg
MDEsIDIwMTggYXQgMDI6MjY6MDRQTSArMDEwMCwgS2FyaW1BbGxhaCBBaG1lZCB3cm90ZToNCj4g
PiANCj4gPiAuLi4gdG8gYXZvaWQgcmVhZGluZyB0aGVtIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBv
ZiBhbGwgdGhlIFBDSSBWRnMuIFRoaXMgaXMNCj4gPiBzcGVjaWFsbHkgYSB1c2VmdWwgb3B0aW1p
emF0aW9uIHdoZW4gYnJpbmdpbmcgdXAgdGhvdXNhbmRzIG9mIFZGcy4NCj4gDQo+IFBsZWFzZSBt
YWtlIHRoZSBjaGFuZ2Vsb2cgY29tcGxldGUgaW4gaXRzZWxmLCBzbyBpdCBkb2Vzbid0IGhhdmUg
dG8gYmUNCj4gcmVhZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzdWJqZWN0LiAgSXQncyBPSyBp
ZiB5b3UgaGF2ZSB0byByZXBlYXQNCj4gdGhlIHN1YmplY3QgaW4gdGhlIGNoYW5nZWxvZy4NCg0K
YWNrLg0KDQo+IA0KPiA+IA0KPiA+IENjOiBCam9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUu
Y29tPg0KPiA+IENjOiBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnDQo+ID4gQ2M6IGxpbnV4LWtl
cm5lbEB2Z2VyLmtlcm5lbC5vcmcNCj4gPiBTaWduZWQtb2ZmLWJ5OiBLYXJpbUFsbGFoIEFobWVk
IDxrYXJhaG1lZEBhbWF6b24uZGU+DQo+ID4gLS0tDQo+ID4gdjEgLT4gdjI6DQo+ID4gKiBSZWJh
c2Ugb24gbGF0ZXN0ICsgcmVtb3ZlIGRlcGVuZGVuY3kgb24gYSBub24tdXBzdHJlYW0gcGF0Y2gu
DQo+ID4gDQo+ID4gIGRyaXZlcnMvcGNpL2lvdi5jICAgfCAxNiArKysrKysrKysrKysrKysrDQo+
ID4gIGRyaXZlcnMvcGNpL3BjaS5oICAgfCAgNSArKysrKw0KPiA+ICBkcml2ZXJzL3BjaS9wcm9i
ZS5jIHwgNDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tDQo+ID4g
IDMgZmlsZXMgY2hhbmdlZCwgNTMgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pDQo+ID4g
DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdi5jIGIvZHJpdmVycy9wY2kvaW92LmMN
Cj4gPiBpbmRleCA2Nzc5MjRhLi5lMWQyZTNmIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvcGNp
L2lvdi5jDQo+ID4gKysrIGIvZHJpdmVycy9wY2kvaW92LmMNCj4gPiBAQCAtMTE0LDYgKzExNCwx
OSBAQCByZXNvdXJjZV9zaXplX3QgcGNpX2lvdl9yZXNvdXJjZV9zaXplKHN0cnVjdCBwY2lfZGV2
ICpkZXYsIGludCByZXNubykNCj4gPiAgCXJldHVybiBkZXYtPnNyaW92LT5iYXJzeltyZXNubyAt
IFBDSV9JT1ZfUkVTT1VSQ0VTXTsNCj4gPiAgfQ0KPiA+ICANCj4gPiArc3RhdGljIHZvaWQgcGNp
X3JlYWRfdmZfY29uZmlnX2NvbW1vbihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2Rl
diAqZGV2KQ0KPiA+ICt7DQo+ID4gKwlpbnQgZGV2Zm4gPSBwY2lfaW92X3ZpcnRmbl9kZXZmbihk
ZXYsIDApOw0KPiA+ICsNCj4gPiArCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQoYnVzLCBkZXZm
biwgUENJX0NMQVNTX1JFVklTSU9OLA0KPiA+ICsJCQkJICAmZGV2LT5zcmlvdi0+Y2xhc3MpOw0K
PiA+ICsJcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIFBDSV9TVUJTWVNURU1f
SUQsDQo+ID4gKwkJCQkgJmRldi0+c3Jpb3YtPnN1YnN5c3RlbV9kZXZpY2UpOw0KPiA+ICsJcGNp
X2J1c19yZWFkX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIFBDSV9TVUJTWVNURU1fVkVORE9SX0lE
LA0KPiA+ICsJCQkJICZkZXYtPnNyaW92LT5zdWJzeXN0ZW1fdmVuZG9yKTsNCj4gPiArCXBjaV9i
dXNfcmVhZF9jb25maWdfYnl0ZShidXMsIGRldmZuLCBQQ0lfSEVBREVSX1RZUEUsICZkZXYtPnNy
aW92LT5oZHJfdHlwZSk7DQo+IA0KPiBDYW4ndCB5b3UgZG8gdGhpcyBhIGxpdHRsZSBsYXRlciwg
ZS5nLiwgYWZ0ZXIgcGNpX2lvdl9hZGRfdmlydGZuKCkNCj4gY2FsbHMgcGNpX3NldHVwX2Rldmlj
ZSgpLCBhbmQgdGhlbiB1c2UgdGhlIHN0YW5kYXJkDQo+IHBjaV9yZWFkX2NvbmZpZ18qKCkgaW50
ZXJmYWNlcyBpbnN0ZWFkIG9mIHRoZSBzcGVjaWFsDQo+IHBjaV9idXNfcmVhZF9jb25maWcqKCkg
b25lcz8NCg0KYWNrLg0KDQpJIG1vdmVkIGl0IGFmdGVyICJwY2lfaW92X3ZpcnRmbl9kZXZmbiIu
DQoNCj4gDQo+ID4gDQo+ID4gK30NCj4gPiArDQo+ID4gIGludCBwY2lfaW92X2FkZF92aXJ0Zm4o
c3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlkKQ0KPiA+ICB7DQo+ID4gIAlpbnQgaTsNCj4gPiBA
QCAtMTMzLDYgKzE0Niw5IEBAIGludCBwY2lfaW92X2FkZF92aXJ0Zm4oc3RydWN0IHBjaV9kZXYg
KmRldiwgaW50IGlkKQ0KPiA+ICAJaWYgKCF2aXJ0Zm4pDQo+ID4gIAkJZ290byBmYWlsZWQwOw0K
PiA+ICANCj4gPiArCWlmIChpZCA9PSAwKQ0KPiA+ICsJCXBjaV9yZWFkX3ZmX2NvbmZpZ19jb21t
b24oYnVzLCBkZXYpOw0KPiA+ICsNCj4gPiAgCXZpcnRmbi0+ZGV2Zm4gPSBwY2lfaW92X3ZpcnRm
bl9kZXZmbihkZXYsIGlkKTsNCj4gPiAgCXZpcnRmbi0+dmVuZG9yID0gZGV2LT52ZW5kb3I7DQo+
ID4gIAl2aXJ0Zm4tPmRldmljZSA9IGlvdi0+dmZfZGV2aWNlOw0KPiA+IGRpZmYgLS1naXQgYS9k
cml2ZXJzL3BjaS9wY2kuaCBiL2RyaXZlcnMvcGNpL3BjaS5oDQo+ID4gaW5kZXggZmNkODE5MS4u
MzQ2ZGFhNSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3BjaS9wY2kuaA0KPiA+ICsrKyBiL2Ry
aXZlcnMvcGNpL3BjaS5oDQo+ID4gQEAgLTI3MSw2ICsyNzEsMTEgQEAgc3RydWN0IHBjaV9zcmlv
diB7DQo+ID4gIAl1MTYJCWRyaXZlcl9tYXhfVkZzOwkvKiBNYXggbnVtIFZGcyBkcml2ZXIgc3Vw
cG9ydHMgKi8NCj4gPiAgCXN0cnVjdCBwY2lfZGV2CSpkZXY7CQkvKiBMb3dlc3QgbnVtYmVyZWQg
UEYgKi8NCj4gPiAgCXN0cnVjdCBwY2lfZGV2CSpzZWxmOwkJLyogVGhpcyBQRiAqLw0KPiA+ICsJ
dTggaGRyX3R5cGU7CQkvKiBWRiBoZWFkZXIgdHlwZSAqLw0KPiA+ICsJdTMyIGNsYXNzOwkJLyog
VkYgZGV2aWNlICovDQo+ID4gKwl1MTYgZGV2aWNlOwkJLyogVkYgZGV2aWNlICovDQo+ID4gKwl1
MTYgc3Vic3lzdGVtX3ZlbmRvcjsJLyogVkYgc3Vic3lzdGVtIHZlbmRvciAqLw0KPiA+ICsJdTE2
IHN1YnN5c3RlbV9kZXZpY2U7CS8qIFZGIHN1YnN5c3RlbSBkZXZpY2UgKi8NCj4gDQo+IFBsZWFz
ZSBtYWtlIHRoZSB3aGl0ZXNwYWNlIGhlcmUgbWF0Y2ggdGhlIGV4aXN0aW5nIGNvZGUsIGkuZS4s
DQo+IGxpbmUgdXAgdGhlIHN0cnVjdHVyZSBlbGVtZW50IG5hbWVzIGFuZCBjb21tZW50cy4NCg0K
YWNrIQ0KDQo+IA0KPiA+IA0KPiA+ICAJcmVzb3VyY2Vfc2l6ZV90CWJhcnN6W1BDSV9TUklPVl9O
VU1fQkFSU107CS8qIFZGIEJBUiBzaXplICovDQo+ID4gIAlib29sCQlkcml2ZXJzX2F1dG9wcm9i
ZTsgLyogQXV0byBwcm9iaW5nIG9mIFZGcyBieSBkcml2ZXIgKi8NCj4gPiAgfTsNCj4gPiBkaWZm
IC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMNCj4gPiBp
bmRleCBlZjUzNzc0Li5hZWFhMTBhIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvcGNpL3Byb2Jl
LmMNCj4gPiArKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jDQo+ID4gQEAgLTE4MCw2ICsxODAsNyBA
QCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGVjb2RlX2JhcihzdHJ1Y3QgcGNpX2RldiAq
ZGV2LCB1MzIgYmFyKQ0KPiA+ICBpbnQgX19wY2lfcmVhZF9iYXNlKHN0cnVjdCBwY2lfZGV2ICpk
ZXYsIGVudW0gcGNpX2Jhcl90eXBlIHR5cGUsDQo+ID4gIAkJICAgIHN0cnVjdCByZXNvdXJjZSAq
cmVzLCB1bnNpZ25lZCBpbnQgcG9zKQ0KPiA+ICB7DQo+ID4gKwlpbnQgYmFyID0gcmVzIC0gZGV2
LT5yZXNvdXJjZTsNCj4gPiAgCXUzMiBsID0gMCwgc3ogPSAwLCBtYXNrOw0KPiA+ICAJdTY0IGw2
NCwgc3o2NCwgbWFzazY0Ow0KPiA+ICAJdTE2IG9yaWdfY21kOw0KPiA+IEBAIC0xOTksOSArMjAw
LDEzIEBAIGludCBfX3BjaV9yZWFkX2Jhc2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSBwY2lf
YmFyX3R5cGUgdHlwZSwNCj4gPiAgCXJlcy0+bmFtZSA9IHBjaV9uYW1lKGRldik7DQo+ID4gIA0K
PiA+ICAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAmbCk7DQo+ID4gLQlwY2lfd3Jp
dGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBsIHwgbWFzayk7DQo+ID4gLQlwY2lfcmVhZF9jb25m
aWdfZHdvcmQoZGV2LCBwb3MsICZzeik7DQo+ID4gLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRl
diwgcG9zLCBsKTsNCj4gPiArCWlmIChkZXYtPmlzX3ZpcnRmbikgew0KPiA+ICsJCXN6ID0gZGV2
LT5waHlzZm4tPnNyaW92LT5iYXJzeltiYXJdICYgMHhmZmZmZmZmZjsNCj4gPiArCX0gZWxzZSB7
DQo+ID4gKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcywgbCB8IG1hc2spOw0KPiA+
ICsJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcywgJnN6KTsNCj4gPiArCQlwY2lfd3Jp
dGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCBsKTsNCj4gPiArCX0NCj4gDQo+IFRoaXMgcGFydCBp
cyBub3QgbGlrZSB0aGUgb3RoZXJzLCBpLmUuLCB0aGUgb3RoZXJzIGFyZSBjYWNoaW5nIGluZm8N
Cj4gZnJvbSBWRiAwIGluIG5ld2x5LWFkZGVkIGVsZW1lbnRzIG9mIHN0cnVjdCBwY2lfc3Jpb3Yu
ICBUaGlzIGFsc28gdXNlcw0KPiBpbmZvcm1hdGlvbiBmcm9tIHN0cnVjdCBwY2lfc3Jpb3YsIGJ1
dCBpdCdzIHF1YWxpdGF0aXZlbHkgZGlmZmVyZW50LA0KPiBzbyBpdCBzaG91bGQgYmUgaW4gYSBz
ZXBhcmF0ZSBwYXRjaC4NCg0KYWNrLiBNb3ZlZCB0byBhIHNlcGVyYXRlIHBhdGNoLg0KDQo+IA0K
PiA+IA0KPiA+ICAJLyoNCj4gPiAgCSAqIEFsbCBiaXRzIHNldCBpbiBzeiBtZWFucyB0aGUgZGV2
aWNlIGlzbid0IHdvcmtpbmcgcHJvcGVybHkuDQo+ID4gQEAgLTI0MSw5ICsyNDYsMTQgQEAgaW50
IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0
eXBlLA0KPiA+ICANCj4gPiAgCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpIHsN
Cj4gPiAgCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyA0LCAmbCk7DQo+ID4gLQkJ
cGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIDQsIH4wKTsNCj4gPiAtCQlwY2lfcmVh
ZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyA0LCAmc3opOw0KPiA+IC0JCXBjaV93cml0ZV9jb25m
aWdfZHdvcmQoZGV2LCBwb3MgKyA0LCBsKTsNCj4gPiArDQo+ID4gKwkJaWYgKGRldi0+aXNfdmly
dGZuKSB7DQo+ID4gKwkJCXN6ID0gKGRldi0+cGh5c2ZuLT5zcmlvdi0+YmFyc3pbYmFyXSA+PiAz
MikgJiAweGZmZmZmZmZmOw0KPiA+ICsJCX0gZWxzZSB7DQo+ID4gKwkJCXBjaV93cml0ZV9jb25m
aWdfZHdvcmQoZGV2LCBwb3MgKyA0LCB+MCk7DQo+ID4gKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29y
ZChkZXYsIHBvcyArIDQsICZzeik7DQo+ID4gKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2
LCBwb3MgKyA0LCBsKTsNCj4gPiArCQl9DQo+ID4gIA0KPiA+ICAJCWw2NCB8PSAoKHU2NClsIDw8
IDMyKTsNCj4gPiAgCQlzejY0IHw9ICgodTY0KXN6IDw8IDMyKTsNCj4gPiBAQCAtMzMyLDYgKzM0
Miw4IEBAIHN0YXRpYyB2b2lkIHBjaV9yZWFkX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVu
c2lnbmVkIGludCBob3dtYW55LCBpbnQgcm9tKQ0KPiA+ICAJZm9yIChwb3MgPSAwOyBwb3MgPCBo
b3dtYW55OyBwb3MrKykgew0KPiA+ICAJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVz
b3VyY2VbcG9zXTsNCj4gPiAgCQlyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAocG9zIDw8IDIp
Ow0KPiA+ICsJCWlmIChkZXYtPmlzX3ZpcnRmbiAmJiBkZXYtPnBoeXNmbi0+c3Jpb3YtPmJhcnN6
W3Bvc10gPT0gMCkNCj4gPiArCQkJY29udGludWU7DQo+ID4gIAkJcG9zICs9IF9fcGNpX3JlYWRf
YmFzZShkZXYsIHBjaV9iYXJfdW5rbm93biwgcmVzLCByZWcpOw0KPiA+ICAJfQ0KPiA+ICANCj4g
PiBAQCAtMTQ1NCw3ICsxNDY2LDkgQEAgaW50IHBjaV9zZXR1cF9kZXZpY2Uoc3RydWN0IHBjaV9k
ZXYgKmRldikNCj4gPiAgCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247DQo+ID4gIAlzdHJ1
Y3QgcmVzb3VyY2UgKnJlczsNCj4gPiAgDQo+ID4gLQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUo
ZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSkpDQo+ID4gKwlpZiAoZGV2LT5pc192aXJ0
Zm4pDQo+ID4gKwkJaGRyX3R5cGUgPSBkZXYtPnBoeXNmbi0+c3Jpb3YtPmhkcl90eXBlOw0KPiA+
ICsJZWxzZSBpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZo
ZHJfdHlwZSkpDQo+ID4gIAkJcmV0dXJuIC1FSU87DQo+ID4gIA0KPiA+ICAJZGV2LT5zeXNkYXRh
ID0gZGV2LT5idXMtPnN5c2RhdGE7DQo+ID4gQEAgLTE0NzcsNyArMTQ5MSwxMCBAQCBpbnQgcGNp
X3NldHVwX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQ0KPiA+ICAJCSAgICAgZGV2LT5idXMt
Pm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksDQo+ID4gIAkJICAgICBQQ0lfRlVOQyhkZXYt
PmRldmZuKSk7DQo+ID4gIA0KPiA+IC0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NM
QVNTX1JFVklTSU9OLCAmY2xhc3MpOw0KPiA+ICsJaWYgKGRldi0+aXNfdmlydGZuKQ0KPiA+ICsJ
CWNsYXNzID0gZGV2LT5waHlzZm4tPnNyaW92LT5jbGFzczsNCj4gPiArCWVsc2UNCj4gPiArCQlw
Y2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzcyk7DQo+
ID4gIAlkZXYtPnJldmlzaW9uID0gY2xhc3MgJiAweGZmOw0KPiA+ICAJZGV2LT5jbGFzcyA9IGNs
YXNzID4+IDg7CQkgICAgLyogdXBwZXIgMyBieXRlcyAqLw0KPiA+ICANCj4gPiBAQCAtMTUxNyw4
ICsxNTM0LDEzIEBAIGludCBwY2lfc2V0dXBfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpDQo+
ID4gIAkJCWdvdG8gYmFkOw0KPiA+ICAJCXBjaV9yZWFkX2lycShkZXYpOw0KPiA+ICAJCXBjaV9y
ZWFkX2Jhc2VzKGRldiwgNiwgUENJX1JPTV9BRERSRVNTKTsNCj4gPiAtCQlwY2lfcmVhZF9jb25m
aWdfd29yZChkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmZGV2LT5zdWJzeXN0ZW1fdmVu
ZG9yKTsNCj4gPiAtCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVUJTWVNURU1fSUQs
ICZkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOw0KPiA+ICsJCWlmIChkZXYtPmlzX3ZpcnRmbikgew0K
PiA+ICsJCQlkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPSBkZXYtPnBoeXNmbi0+c3Jpb3YtPnN1YnN5
c3RlbV92ZW5kb3I7DQo+ID4gKwkJCWRldi0+c3Vic3lzdGVtX2RldmljZSA9IGRldi0+cGh5c2Zu
LT5zcmlvdi0+c3Vic3lzdGVtX2RldmljZTsNCj4gDQo+IFBDSWUgcjQuMCwgc2VjIDkuMy40LjEu
MTMgcmVxdWlyZXMgdGhhdCBTdWJzeXN0ZW0gVmVuZG9yIElEIGJlIHRoZQ0KPiBzYW1lIGZvciB0
aGUgUEYgYW5kIGFsbCBWRnMsIGJ1dCBzZWMgOS4zLjQuMS4xNCBzYXlzIHRoZSBQRiBhbmQgVkYg
bWF5DQo+IGhhdmUgZGlmZmVyZW50IFN1YnN5c3RlbSBJRHMuICBJIGtub3cgeW91J3JlIGNhY2hp
bmcgdGhlIFN1YnN5c3RlbSBJRA0KPiBmcm9tIFZGIDAsIG5vdCB0aGUgUEYsIGJ1dCBJIGRvbid0
IHNlZSBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIGFsbCB0aGUNCj4gVkZzIHRvIGhhdmUgdGhlIHNh
bWUgU3Vic3lzdGVtIElELg0KPiANCj4gSSB0aGluayB0aGUgc2FtZSBpcyB0ZWNobmljYWxseSB0
cnVlIGZvciB0aGUgUmV2aXNpb24gSUQuICBJdCBtaWdodCBiZQ0KPiByZWFzb25hYmxlIHRvIGFz
c3VtZSBhbGwgdGhlIFZGcyBoYXZlIHRoZSBzYW1lIHZhbHVlcywgYnV0IG1heWJlIHdvcnRoDQo+
IGEgY29tbWVudC4NCg0KSSBhZGRlZCBhIGNvbW1lbnQgYWJvdXQgdGhhdCBmb3IgdGhlIDMgZmll
bGRzLg0KDQo+IA0KPiA+IA0KPiA+ICsJCX0gZWxzZSB7DQo+ID4gKwkJCXBjaV9yZWFkX2NvbmZp
Z193b3JkKGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZkZXYtPnN1YnN5c3RlbV92ZW5k
b3IpOw0KPiA+ICsJCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9TVUJTWVNURU1fSUQs
ICZkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOw0KPiA+ICsJCX0NCj4gPiAgDQo+ID4gIAkJLyoNCj4g
PiAgCQkgKiBEbyB0aGUgdWdseSBsZWdhY3kgbW9kZSBzdHVmZiBoZXJlIHJhdGhlciB0aGFuIGJy
b2tlbiBjaGlwDQo+ID4gLS0gDQo+ID4gMi43LjQNCj4gPiANCj4gDQpBbWF6b24gRGV2ZWxvcG1l
bnQgQ2VudGVyIEdlcm1hbnkgR21iSApCZXJsaW4gLSBEcmVzZGVuIC0gQWFjaGVuCm1haW4gb2Zm
aWNlOiBLcmF1c2Vuc3RyLiAzOCwgMTAxMTcgQmVybGluCkdlc2NoYWVmdHNmdWVocmVyOiBEci4g
UmFsZiBIZXJicmljaCwgQ2hyaXN0aWFuIFNjaGxhZWdlcgpVc3QtSUQ6IERFMjg5MjM3ODc5CkVp
bmdldHJhZ2VuIGFtIEFtdHNnZXJpY2h0IENoYXJsb3R0ZW5idXJnIEhSQiAxNDkxNzMgQgo=

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-03-01 21:32 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-01 13:26 [PATCH v2] pci: Store more data about VFs into the SRIOV struct KarimAllah Ahmed
2018-03-01 19:34 ` Bjorn Helgaas
2018-03-01 21:32   ` Raslan, KarimAllah
2018-03-01 21:32     ` Raslan, KarimAllah

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.