Re: [tip:x86/urgent] x86/quirks: Add early quirk to reset Apple AirPort card

From: Lukas Wunner
Date: Fri Jun 10 2016 - 09:55:24 EST


On Fri, Jun 10, 2016 at 02:59:57PM +0200, Ingo Molnar wrote:
> * Lukas Wunner <lukas@xxxxxxxxx> wrote:
> > On Fri, Jun 10, 2016 at 01:58:45PM +0200, Ingo Molnar wrote:
> > > * Yinghai Lu <yinghai@xxxxxxxxxx> wrote:
> > > > On 6/9/16, Lukas Wunner <lukas@xxxxxxxxx> wrote:
> > > > > Well, the PCI core would also scan such a bus twice AFAICS.
> > > > > And the performance penalty of scanning it twice seems negligible.
> > > > > Early quirks can prevent double execution by setting QFLAG_APPLY_ONCE.
> > > > > (Three quirks have set that flag already.)
> > > > >
> > > > > So I think this shouldn't be a concern.
> > > >
> > > > I don't know. I would like see sth like following, and that is simple
> > > > enough.
> > > >
> > > > --- linux-2.6.orig/arch/x86/kernel/early-quirks.c
> > > > +++ linux-2.6/arch/x86/kernel/early-quirks.c
> > > > @@ -755,10 +755,16 @@ static int __init check_dev_quirk(int nu
> > > > return 0;
> > > > }
> > > >
> > > > +static unsigned char __initdata scanned[256];
> > > > static void __init early_pci_scan_bus(int bus)
> > > > {
> > > > int slot, func;
> > > >
> > > > + if (scanned[bus])
> > > > + return;
> > > > +
> > > > + scanned[bus] = 1;
> > > > +
> > > > /* Poor man's PCI discovery */
> > > > for (slot = 0; slot < 32; slot++)
> > > > for (func = 0; func < 8; func++) {
> > >
> > > Ok, I removed the fix from tip:x86/urgent from the time being - could you
> > > guys please send a full version once a final approach is agreed upon?
> >
> > IMHO the above patch to prevent double scanning isn't needed
> > and less code is usually better. So my suggestion would be the
> > patch as originally sent plus the delta fix I sent yesterday,
> > either squashed or applied separately.
> >
> > Since Yinghai Lu seems to disagree I guess you as the maintainer
> > will have to make a decision. :-)
>
> So I'd lean towards lower complexity, but since this is essentially
> PCI code I'd like to defer to Bjorn on that detail.

If I may add some additional information:

drivers/pci/probe.c contains the following comment:

/*
* The bus might already exist for two reasons: Either we are
* rescanning the bus or the bus is reachable through more than
* one bridge. The second case can happen with the i450NX
* chipset.
*/

So buses reachable through more than one bridge do exist, albeit they're
assumedly rare. The question is, what are the consequences?

(1) A minimal performance hit from scanning the bus multiple times.
(2) Quirks for devices on that bus are executed multiple times.
As said quirks can set QFLAG_APPLY_ONCE to prevent that. If it turns
out this patch regresses because quirks are executed multiple times
but shouldn't, that's a bug in those quirks and they need to be
amended to set QFLAG_APPLY_ONCE. If we avoid scanning the bus
multiple times, we'd essentially be papering over those bugs.

Best regards,

Lukas