From: Bjorn Helgaas <bhelgaas@google.com>
To: Yinghai Lu <yinghai@kernel.org>
Cc: "linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
Wei Yang <weiyang@linux.vnet.ibm.com>,
Nishank Trivedi <nistrive@cisco.com>
Subject: Re: [PATCH] PCI: Use pci_is_root_bus() to check for root bus
Date: Wed, 6 Nov 2013 13:12:39 -0700 [thread overview]
Message-ID: <20131106201239.GA8971@google.com> (raw)
In-Reply-To: <CAE9FiQU4V0waWNvMFgEjKv90KuCCQ2CYJU2UsnDP0+WDS9zb1Q@mail.gmail.com>
On Wed, Nov 06, 2013 at 11:56:13AM -0800, Yinghai Lu wrote:
> On Wed, Nov 6, 2013 at 10:15 AM, Bjorn Helgaas <bhelgaas@google.com> wrote:
>
> > commit dfb66fee4715c747a94abd45c20fbe302b10e49c
> > Author: Bjorn Helgaas <bhelgaas@google.com>
> > Date: Wed Nov 6 10:11:48 2013 -0700
> >
> > PCI: Add pci_upstream_bridge()
> >
> > This adds a pci_upstream_bridge() interface to find the PCI-to-PCI bridge
> > upstream from a device. If the device is on a root bus, i.e., the upstream
> > bridge is a host bridge instead of a PCI bridge, this returns NULL. If the
> > device is a VF, this returns the bridge upstream from the PF corresponding
> > to the VF. This is important for VFs on virtual buses, where
> > "dev->bus->self == NULL".
> >
> > Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> >
> > diff --git a/include/linux/pci.h b/include/linux/pci.h
> > index d3a888a..e09d19a 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -480,6 +480,18 @@ static inline bool pci_is_root_bus(struct pci_bus *pbus)
> > return !(pbus->parent);
> > }
> >
> > +static inline struct pci_dev *pci_upstream_bridge(struct pci_dev *dev)
> > +{
> > + if (pci_is_root_bus(dev->bus))
> > + return NULL;
> > +
> > + dev = pci_physfn(dev);
> > + if (pci_is_root_bus(dev->bus))
> > + return NULL;
>
> Maybe we can drop the first pci_is_root_bus() checking.
> for physfn, pci_physfn will return it's self.
Yep, that makes sense, thanks. I incorporated that change.
> > +
> > + return dev->bus->self;
> > +}
> > +
> > #ifdef CONFIG_PCI_MSI
> > static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev)
> > {
> > commit 4e5415f02e32c85e902cd9692eab18200e14b347
> > Author: Bjorn Helgaas <bhelgaas@google.com>
> > Date: Wed Nov 6 10:00:51 2013 -0700
> >
> > PCI: Enable upstream bridges even for VFs on virtual buses
> >
> > Previously we enabled the upstream PCI-to-PCI bridge only when
> > "dev->bus->self != NULL". In the case of a VF on a virtual bus, where
> > "bus->self == NULL", we didn't enable the upstream bridge.
> >
> > This fixes that by enabling the upstream bridge of the PF corresponding to
> > the VF.
> >
> > Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> >
> > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> > index ac40f90..744dc26 100644
> > --- a/drivers/pci/pci.c
> > +++ b/drivers/pci/pci.c
> > @@ -1150,10 +1150,8 @@ static void pci_enable_bridge(struct pci_dev *dev)
> > {
> > int retval;
> >
> > - if (!dev)
> > - return;
> > -
> > - pci_enable_bridge(dev->bus->self);
> > + if (!pci_is_root_bus(dev->bus))
> > + pci_enable_bridge(pci_upstream_bridge(dev));
> >
> > if (pci_is_enabled(dev)) {
> > if (!dev->is_busmaster)
> > @@ -1188,7 +1186,8 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
> > if (atomic_inc_return(&dev->enable_cnt) > 1)
> > return 0; /* already enabled */
> >
> > - pci_enable_bridge(dev->bus->self);
> > + if (!pci_is_root_bus(dev->bus))
> > + pci_enable_bridge(pci_upstream_bridge(dev));
> >
> > /* only skip sriov related */
> > for (i = 0; i <= PCI_ROM_RESOURCE; i++)
>
> still have problem.
>
> pci_upstream_bridge() could return NULL. so later pci_enable_bridge()
> referring dev->bus could panic, as you remove !dev checking.
pci_upstream_bridge(dev) can only return NULL if dev is on a root bus,
and we never call pci_enable_bridge() in that case. So I don't see
the problem.
Bjorn
next prev parent reply other threads:[~2013-11-06 20:12 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-05 23:29 [PATCH] PCI: Use pci_is_root_bus() to check for root bus Bjorn Helgaas
2013-11-06 3:39 ` Yinghai Lu
2013-11-06 18:15 ` Bjorn Helgaas
2013-11-06 19:56 ` Yinghai Lu
2013-11-06 20:12 ` Bjorn Helgaas [this message]
2013-11-06 20:33 ` Yinghai Lu
2013-11-06 20:46 ` Bjorn Helgaas
2013-11-07 0:28 ` Yinghai Lu
2013-11-07 22:03 ` Bjorn Helgaas
2013-11-07 3:00 ` Wei Yang
2013-11-07 21:59 ` Bjorn Helgaas
2013-11-08 1:35 ` 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=20131106201239.GA8971@google.com \
--to=bhelgaas@google.com \
--cc=linux-pci@vger.kernel.org \
--cc=nistrive@cisco.com \
--cc=weiyang@linux.vnet.ibm.com \
--cc=yinghai@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.