All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Yang <weiyang@linux.vnet.ibm.com>
To: bhelgaas@google.com, gwshan@linux.vnet.ibm.com
Cc: linux-pci@vger.kernel.org, Wei Yang <weiyang@linux.vnet.ibm.com>
Subject: [PATCH 2/2] PCI: Calculate the VF bus range on each possible NumVFs
Date: Mon, 22 Dec 2014 13:48:46 +0800	[thread overview]
Message-ID: <1419227326-12083-3-git-send-email-weiyang@linux.vnet.ibm.com> (raw)
In-Reply-To: <1419227326-12083-1-git-send-email-weiyang@linux.vnet.ibm.com>

Per SRIOV SPEC section 3.3.10 and 3.3.11, VF Stride and VF Offset may change
when NumVFs changes. This will affect the bus range for VFs.

This patch iterates on each possible NumVFs and calculate the maximum bus
range for VFs.

Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
---
 drivers/pci/iov.c |   31 +++++++++++++++++++++++++++----
 drivers/pci/pci.h |    1 +
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index ef0ceaa..ea3a82c 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -46,6 +46,30 @@ static inline void pci_iov_set_numvfs(struct pci_dev *dev, int nr_virtfn)
 	pci_read_config_word(dev, iov->pos + PCI_SRIOV_VF_STRIDE, &iov->stride);
 }
 
+/**
+ * Per SRIOV SPEC section 3.3.10 and 3.3.11, VF Stride and VF offset may
+ * change when NumVFs changes. Which will affect the bus range for VFs.
+ *
+ * This function iterate on all valide NumVFs and calculate the maximum bus
+ * range for VFs.
+ */
+static inline void pci_iov_max_bus_range(struct pci_dev *dev)
+{
+	struct pci_sriov *iov = dev->sriov;
+	int total = iov->total_VFs;
+	u8 max = 0;
+	u8 busnr;
+
+	for ( ; total >= 0; total--) {
+		pci_iov_set_numvfs(dev, total);
+		busnr = virtfn_bus(dev, iov->total_VFs - 1);
+		if (busnr > max)
+			max = busnr;
+	}
+
+	iov->max_bus_range = max;
+}
+
 static struct pci_bus *virtfn_add_bus(struct pci_bus *bus, int busnr)
 {
 	struct pci_bus *child;
@@ -415,6 +439,7 @@ found:
 
 	dev->sriov = iov;
 	dev->is_physfn = 1;
+	pci_iov_max_bus_range(dev);
 
 	return 0;
 
@@ -550,15 +575,13 @@ void pci_restore_iov_state(struct pci_dev *dev)
 int pci_iov_bus_range(struct pci_bus *bus)
 {
 	int max = 0;
-	u8 busnr;
 	struct pci_dev *dev;
 
 	list_for_each_entry(dev, &bus->devices, bus_list) {
 		if (!dev->is_physfn)
 			continue;
-		busnr = virtfn_bus(dev, dev->sriov->total_VFs - 1);
-		if (busnr > max)
-			max = busnr;
+		if (dev->sriov->max_bus_range > max)
+			max = dev->sriov->max_bus_range;
 	}
 
 	return max ? max - bus->number : 0;
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 8aff29a..94faf97 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -236,6 +236,7 @@ struct pci_sriov {
 	u16 stride;		/* following VF stride */
 	u32 pgsz;		/* page size for BAR alignment */
 	u8 link;		/* Function Dependency Link */
+	u8 max_bus_range;	/* Maximum bus range a VF could sit*/
 	u16 driver_max_VFs;	/* max num VFs driver supports */
 	struct pci_dev *dev;	/* lowest numbered PF */
 	struct pci_dev *self;	/* this PF */
-- 
1.7.9.5


  parent reply	other threads:[~2014-12-22  5:48 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-22  5:48 [PATCH 0/2] PCI/IOV: fix on offset/stride based on NumVFs change Wei Yang
2014-12-22  5:48 ` [PATCH 1/2] PCI: Refresh offset/stride after NumVFs is written Wei Yang
2014-12-22  5:48 ` Wei Yang [this message]
2015-01-21 22:54   ` [PATCH 2/2] PCI: Calculate the VF bus range on each possible NumVFs Bjorn Helgaas
2015-01-22  9:42     ` Wei Yang

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=1419227326-12083-3-git-send-email-weiyang@linux.vnet.ibm.com \
    --to=weiyang@linux.vnet.ibm.com \
    --cc=bhelgaas@google.com \
    --cc=gwshan@linux.vnet.ibm.com \
    --cc=linux-pci@vger.kernel.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: 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.