From: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
To: Thomas Gleixner <tglx@linutronix.de>, Bjorn Helgaas <helgaas@kernel.org>
Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
rjw@rjwysocki.net, lenb@kernel.org, izumi.taku@jp.fujitsu.com,
wency@cn.fujitsu.com, caoj.fnst@cn.fujitsu.com,
ddaney.cavm@gmail.com, okaya@codeaurora.org, bhelgaas@google.com,
jiang.liu@linux.intel.com, linux-pci@vger.kernel.org
Subject: Re: [PATCH v2] pci: fix unavailable irq number 255 reported by BIOS
Date: Tue, 26 Jan 2016 17:45:46 +0800 [thread overview]
Message-ID: <56A7404A.8080205@cn.fujitsu.com> (raw)
In-Reply-To: <alpine.DEB.2.11.1601260825510.3886@nanos>
On 01/26/2016 04:26 PM, Thomas Gleixner wrote:
> On Mon, 25 Jan 2016, Bjorn Helgaas wrote:
>> On Mon, Jan 25, 2016 at 02:59:38PM +0800, Chen Fan wrote:
>>> i801_smbus 0000:00:1f.3: PCI INT C: no GSI
>>> i801_smbus 0000:00:1f.3: Failed to allocate irq 255: -16
>>> i801_smbus: probe of 0000:00:1f.3 failed with error -16
> The current code does not not fail when the interrupt request fails. It
> reports it and clears the IRQ feature flag.
>
>>> @@ -436,7 +437,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
>>> * driver reported one, then use it. Exit in any case.
>>> */
>>> if (gsi < 0) {
>>> - if (acpi_isa_register_gsi(dev))
>>> +#ifdef CONFIG_X86
>>> + /*
>>> + * The Interrupt Line value of 0xff is defined to mean "unknown"
>>> + * or "no connection" (PCI 3.0, Section 6.2.4, footnote on page
>>> + * 223), using ~0U as invalid IRQ.
>>> + */
> And why would this be x86 specific? PCI3.0 is architecture independent, right?
quoting the spec document:
"For x86 based PCs, the values in this register correspond to IRQ
numbers (0-15) of the standard dual
8259 configuration. The value 255 is defined as meaning "unknown" or "no
connection" to the interrupt
controller. Values between 15 and 254 are reserved."
>
>>> + dev->irq = (dev->irq == 0xff) ? IRQ_INVALID : dev->irq;
>> It's much simpler and clearer to write:
>>
>> if (dev->irq == 0xff)
>> dev->irq = IRQ_INVALID;
> I do not understand that IRQ_INVALID business at all.
>
>>> +#endif
>>> + if (!irq_is_valid(dev->irq) || acpi_isa_register_gsi(dev))
>>> dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
>>> pin_name(pin));
>>>
> The existing code already drops into this place because
> acpi_isa_register_gsi() fails.
>
>>> i801_smbus 0000:00:1f.3: PCI INT C: no GSI
> What extra value does that !irq_is_valid() provide?
>
> And how does setting dev->irq to ~0U prevent that request_irq() is called in
> the i801 device driver? Not at all, AFAICT. It will just fail with a different
> error.
>
> So the whole 'fix' relies on the fact that irq ~0U does not exist (at least
> not today) and therefor the false sharing with some other driver using irq 255
> will not happen.
>
> Relying on undocumented behaviour is not a fix, that's voodoo programming.
>
> The proper solution here is to flag that this device does not have an
> interrupt connected and act accordingly in the device driver, i.e. do not call
> request_irq() in the first place.
yes, this is what I thought in previous email, I has asked that
whether we can use a broken_irq flag in pci_dev to mark the device irq
if invalid.
and then if the device broken_irq set, we could directly skip call the
request_irq.
maybe we can set the broken_irq in pci_read_irq if the irq is 0xff.
Thanks,
Chen
>
>>> +static inline bool irq_is_valid(unsigned int irq)
>>> +{
>>> +#ifdef CONFIG_X86
>>> + if (irq == IRQ_INVALID)
>>> + return false;
>>> +#endif
>>> + return true;
>>> +}
>> I don't like the x86 ifdef. I'd prefer:
>>
>> static inline bool irq_valid(unsigned int irq)
>> {
>> if (irq < NR_IRQS)
>> return true;
>> return false;
>> }
>>
>> This could be used in many of the places that currently use NR_IRQS.
> No. NR_IRQS cannot be used at all if sparse irqs are enabled. Nothing in any
> generic code is supposed to rely on NR_IRQS.
>
> Thanks,
>
> tglx
>
>
>
> .
>
WARNING: multiple messages have this Message-ID (diff)
From: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
To: Thomas Gleixner <tglx@linutronix.de>, Bjorn Helgaas <helgaas@kernel.org>
Cc: <linux-acpi@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<rjw@rjwysocki.net>, <lenb@kernel.org>,
<izumi.taku@jp.fujitsu.com>, <wency@cn.fujitsu.com>,
<caoj.fnst@cn.fujitsu.com>, <ddaney.cavm@gmail.com>,
<okaya@codeaurora.org>, <bhelgaas@google.com>,
<jiang.liu@linux.intel.com>, <linux-pci@vger.kernel.org>
Subject: Re: [PATCH v2] pci: fix unavailable irq number 255 reported by BIOS
Date: Tue, 26 Jan 2016 17:45:46 +0800 [thread overview]
Message-ID: <56A7404A.8080205@cn.fujitsu.com> (raw)
In-Reply-To: <alpine.DEB.2.11.1601260825510.3886@nanos>
On 01/26/2016 04:26 PM, Thomas Gleixner wrote:
> On Mon, 25 Jan 2016, Bjorn Helgaas wrote:
>> On Mon, Jan 25, 2016 at 02:59:38PM +0800, Chen Fan wrote:
>>> i801_smbus 0000:00:1f.3: PCI INT C: no GSI
>>> i801_smbus 0000:00:1f.3: Failed to allocate irq 255: -16
>>> i801_smbus: probe of 0000:00:1f.3 failed with error -16
> The current code does not not fail when the interrupt request fails. It
> reports it and clears the IRQ feature flag.
>
>>> @@ -436,7 +437,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
>>> * driver reported one, then use it. Exit in any case.
>>> */
>>> if (gsi < 0) {
>>> - if (acpi_isa_register_gsi(dev))
>>> +#ifdef CONFIG_X86
>>> + /*
>>> + * The Interrupt Line value of 0xff is defined to mean "unknown"
>>> + * or "no connection" (PCI 3.0, Section 6.2.4, footnote on page
>>> + * 223), using ~0U as invalid IRQ.
>>> + */
> And why would this be x86 specific? PCI3.0 is architecture independent, right?
quoting the spec document:
"For x86 based PCs, the values in this register correspond to IRQ
numbers (0-15) of the standard dual
8259 configuration. The value 255 is defined as meaning "unknown" or "no
connection" to the interrupt
controller. Values between 15 and 254 are reserved."
>
>>> + dev->irq = (dev->irq == 0xff) ? IRQ_INVALID : dev->irq;
>> It's much simpler and clearer to write:
>>
>> if (dev->irq == 0xff)
>> dev->irq = IRQ_INVALID;
> I do not understand that IRQ_INVALID business at all.
>
>>> +#endif
>>> + if (!irq_is_valid(dev->irq) || acpi_isa_register_gsi(dev))
>>> dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
>>> pin_name(pin));
>>>
> The existing code already drops into this place because
> acpi_isa_register_gsi() fails.
>
>>> i801_smbus 0000:00:1f.3: PCI INT C: no GSI
> What extra value does that !irq_is_valid() provide?
>
> And how does setting dev->irq to ~0U prevent that request_irq() is called in
> the i801 device driver? Not at all, AFAICT. It will just fail with a different
> error.
>
> So the whole 'fix' relies on the fact that irq ~0U does not exist (at least
> not today) and therefor the false sharing with some other driver using irq 255
> will not happen.
>
> Relying on undocumented behaviour is not a fix, that's voodoo programming.
>
> The proper solution here is to flag that this device does not have an
> interrupt connected and act accordingly in the device driver, i.e. do not call
> request_irq() in the first place.
yes, this is what I thought in previous email, I has asked that
whether we can use a broken_irq flag in pci_dev to mark the device irq
if invalid.
and then if the device broken_irq set, we could directly skip call the
request_irq.
maybe we can set the broken_irq in pci_read_irq if the irq is 0xff.
Thanks,
Chen
>
>>> +static inline bool irq_is_valid(unsigned int irq)
>>> +{
>>> +#ifdef CONFIG_X86
>>> + if (irq == IRQ_INVALID)
>>> + return false;
>>> +#endif
>>> + return true;
>>> +}
>> I don't like the x86 ifdef. I'd prefer:
>>
>> static inline bool irq_valid(unsigned int irq)
>> {
>> if (irq < NR_IRQS)
>> return true;
>> return false;
>> }
>>
>> This could be used in many of the places that currently use NR_IRQS.
> No. NR_IRQS cannot be used at all if sparse irqs are enabled. Nothing in any
> generic code is supposed to rely on NR_IRQS.
>
> Thanks,
>
> tglx
>
>
>
> .
>
next prev parent reply other threads:[~2016-01-26 9:45 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-25 6:59 [PATCH v2] pci: fix unavailable irq number 255 reported by BIOS Chen Fan
2016-01-25 6:59 ` Chen Fan
2016-01-25 20:58 ` Bjorn Helgaas
2016-01-26 1:40 ` Chen Fan
2016-01-26 1:40 ` Chen Fan
2016-01-26 4:05 ` Guenter Roeck
2016-01-26 8:26 ` Thomas Gleixner
2016-01-26 9:45 ` Chen Fan [this message]
2016-01-26 9:45 ` Chen Fan
2016-01-26 9:51 ` Thomas Gleixner
2016-01-26 15:22 ` Bjorn Helgaas
2016-01-26 15:48 ` Thomas Gleixner
2016-01-27 0:25 ` Bjorn Helgaas
2016-01-27 5:24 ` Cao jin
2016-01-27 5:24 ` Cao jin
2016-01-27 8:35 ` Thomas Gleixner
2016-01-27 9:13 ` Thomas Gleixner
2016-01-27 22:32 ` Bjorn Helgaas
2016-01-28 1:00 ` Chen Fan
2016-01-28 1:00 ` Chen Fan
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=56A7404A.8080205@cn.fujitsu.com \
--to=chen.fan.fnst@cn.fujitsu.com \
--cc=bhelgaas@google.com \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=ddaney.cavm@gmail.com \
--cc=helgaas@kernel.org \
--cc=izumi.taku@jp.fujitsu.com \
--cc=jiang.liu@linux.intel.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=okaya@codeaurora.org \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
--cc=wency@cn.fujitsu.com \
/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.