All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Jon Derrick <jonathan.derrick@intel.com>
Cc: linux-pci@vger.kernel.org,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Yinghai Lu <yinghai@kernel.org>
Subject: Re: [PATCH v2] PCI: Configure MPS on rescan
Date: Fri, 1 Feb 2019 16:54:27 -0600	[thread overview]
Message-ID: <20190201225427.GU229773@google.com> (raw)
In-Reply-To: <20181106201242.2862-1-jonathan.derrick@intel.com>

On Tue, Nov 06, 2018 at 01:12:42PM -0700, Jon Derrick wrote:
> During pci_rescan_bus(), we may encounter new buses and devices which
> don't have MPS set for compatibility. Using this path, newly discovered
> buses and devices would then require their MPS to be configured after
> driver attachment, which may be too late for drivers which do memory
> transactions on probe.

This definitely looks like something we need to do.  Have you tripped
over an actual problem?  If so, it might be interesting to include a
symptom here, e.g., Unsupported Request error for hot-added device, or
whatever it is.

Can you clarify the "would then require their MPS to be configured"
part?  Is there some path where we *do* configure MPS after driver
attachment?  Or is this just a way of saying that "if we don't
configure MPS *before* driver attachment, we would have to do it
after"?

I'm thinking we could simply say something like:

  During pci_rescan_bus(), we may encounter new devices which haven't
  had MPS configured.  Their MPS must be configured before we make the
  devices available for driver attachment by calling
  pci_bus_add_devices().

> This additionally ensures that any pcie_bus_config kernel settings will
> be applied to the buses and devices discovered through this path prior
> to driver attachment.
> 
> Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
> ---
> v1: https://patchwork.kernel.org/patch/10642019/
> 
>  drivers/pci/probe.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index b1c05b5054a0..126cd426b6f2 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -3156,6 +3156,34 @@ unsigned int pci_rescan_bus_bridge_resize(struct pci_dev *bridge)
>  	return max;
>  }
>  
> +/*
> + * Walks the PCI/PCIe tree to find the first instance of a PCIe device and
> + * hands off the PCIe bus to pcie_bus_configure_settings to walk the rest.
> + */
> +static int pcie_rescan_bus_configure_settings(struct pci_dev *dev, void *data)
> +{
> +	if (pci_is_pcie(dev)) {
> +		struct pci_bus *child, *bus = dev->bus;
> +
> +		list_for_each_entry(child, &bus->children, node)
> +			pcie_bus_configure_settings(child);

It looks possible that this could call pcie_bus_configure_settings()
a second time for a device that we've already configured.  For
example, it's legal to call pci_rescan_bus() on an arbitrary bus even
if there has been no hot-add event.

Is there something that prevents us from touching this
already-configured device?  *Probably* we would configure it the same
way the second time, but a driver is likely already attached to it,
and we shouldn't do anything to it.  Even if
pcie_bus_configure_settings() happens to be idempotent, that seems
like it would be hard to verify and keep true indefinitely.

Bjorn

> +
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +/**
> + * pci_bus_configure_settings - Configure bus settings
> + * @bus: PCI/PCIE bus to configure
> + *
> + * Currently only configures PCIe bus settings related to MPS and MRRS.
> + */
> +static void pci_bus_configure_settings(struct pci_bus *bus)
> +{
> +	pci_walk_bus(bus, pcie_rescan_bus_configure_settings, NULL);
> +}
> +
>  /**
>   * pci_rescan_bus - Scan a PCI bus for devices
>   * @bus: PCI bus to scan
> @@ -3171,6 +3199,7 @@ unsigned int pci_rescan_bus(struct pci_bus *bus)
>  
>  	max = pci_scan_child_bus(bus);
>  	pci_assign_unassigned_bus_resources(bus);
> +	pci_bus_configure_settings(bus);
>  	pci_bus_add_devices(bus);
>  
>  	return max;
> -- 
> 2.14.4
> 

  reply	other threads:[~2019-02-01 22:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-06 20:12 [PATCH v2] PCI: Configure MPS on rescan Jon Derrick
2019-02-01 22:54 ` Bjorn Helgaas [this message]
2019-02-01 23:18   ` Derrick, Jonathan

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=20190201225427.GU229773@google.com \
    --to=helgaas@kernel.org \
    --cc=jonathan.derrick@intel.com \
    --cc=linux-pci@vger.kernel.org \
    --cc=lorenzo.pieralisi@arm.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.