2015-06-10 08:53:14

by Jiang Liu

[permalink] [raw]
Subject: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

Hi Bjorn,
I have verified that this patch set could be applied to the
mainstream kernel without dependency on other patches, so could you
please help to merge it?

This patch set introduces a mechanism to allocate PCI IRQ on demand and
free it when not used anymore by hooking pci_device_probe() and
pci_device_remove().

It will be used to track IOAPIC pin usage on x86 so we could support
IOAPIC hot-removal.

The patch set passes Fengguang's 0day test suite.

V2->V3:
1) Change the default pcibios_alloc_irq() to always return 0, as
suggested by Bjorn.
2) Refine comments.

V1->V2:
1) Refine pci_device_probe() to optimize for mainline code as suggested
by Bjorn
2) Reorder patch set to put optional patch as the last (Patch 4)


Jiang Liu (4):
PCI: Add hooks to allocate/free IRQ resources when binding/unbinding
driver
PCI, x86: Allocate PCI IRQ on demand and free it when not used
anymore
PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed
PCI, MSI: Free legacy PCI IRQ when enabling MSI/MSI-X

arch/x86/include/asm/pci_x86.h | 2 --
arch/x86/pci/common.c | 20 +++++++++-----------
arch/x86/pci/intel_mid_pci.c | 9 ++++++---
arch/x86/pci/irq.c | 23 ++++-------------------
drivers/acpi/pci_irq.c | 17 ++++-------------
drivers/pci/msi.c | 6 +++++-
drivers/pci/pci-driver.c | 26 ++++++++++++++++++++------
include/linux/pci.h | 19 +++++++++++++++++++
8 files changed, 67 insertions(+), 55 deletions(-)

--
1.7.10.4


2015-06-10 08:53:44

by Jiang Liu

[permalink] [raw]
Subject: [Patch v3 1/4] PCI: Add hooks to allocate/free IRQ resources when binding/unbinding driver

Add two hook points pcibios_{alloc|free}_irq() into PCI core, which will
be called when binding/unbinding PCI device drivers. Then PCI arch code
may hook into these two points to allocate IRQ resources on demand and
free them when not used anymore.

Signed-off-by: Jiang Liu <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
---
drivers/pci/pci-driver.c | 26 ++++++++++++++++++++------
include/linux/pci.h | 2 ++
2 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
index 3cb2210de553..52a880ca1768 100644
--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -388,18 +388,31 @@ static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
return error;
}

+int __weak pcibios_alloc_irq(struct pci_dev *dev)
+{
+ return 0;
+}
+
+void __weak pcibios_free_irq(struct pci_dev *dev)
+{
+}
+
static int pci_device_probe(struct device *dev)
{
- int error = 0;
- struct pci_driver *drv;
- struct pci_dev *pci_dev;
+ int error;
+ struct pci_dev *pci_dev = to_pci_dev(dev);
+ struct pci_driver *drv = to_pci_driver(dev->driver);
+
+ error = pcibios_alloc_irq(pci_dev);
+ if (error < 0)
+ return error;

- drv = to_pci_driver(dev->driver);
- pci_dev = to_pci_dev(dev);
pci_dev_get(pci_dev);
error = __pci_device_probe(drv, pci_dev);
- if (error)
+ if (error) {
+ pcibios_free_irq(pci_dev);
pci_dev_put(pci_dev);
+ }

return error;
}
@@ -415,6 +428,7 @@ static int pci_device_remove(struct device *dev)
drv->remove(pci_dev);
pm_runtime_put_noidle(dev);
}
+ pcibios_free_irq(pci_dev);
pci_dev->driver = NULL;
}

diff --git a/include/linux/pci.h b/include/linux/pci.h
index 353db8dc4c6e..f50d16a04abc 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1656,6 +1656,8 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,
int pcibios_add_device(struct pci_dev *dev);
void pcibios_release_device(struct pci_dev *dev);
void pcibios_penalize_isa_irq(int irq, int active);
+int pcibios_alloc_irq(struct pci_dev *dev);
+void pcibios_free_irq(struct pci_dev *dev);

#ifdef CONFIG_HIBERNATE_CALLBACKS
extern struct dev_pm_ops pcibios_pm_ops;
--
1.7.10.4

2015-06-10 08:53:38

by Jiang Liu

[permalink] [raw]
Subject: [Patch v3 2/4] PCI, x86: Allocate PCI IRQ on demand and free it when not used anymore

To support IOAPIC hotplug, we need to correctly manage IOAPIC pin usage,
which is to allocate IRQs on demand and free them when not used anymore.
So use pcibios_alloc_irq() and pcibios_free_irq() to dynamically allocate
and free PCI IRQs.

Also remove obseleted code mp_should_keep_irq().

Signed-off-by: Jiang Liu <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
---
arch/x86/include/asm/pci_x86.h | 2 --
arch/x86/pci/common.c | 20 +++++++++-----------
arch/x86/pci/intel_mid_pci.c | 7 +++++--
arch/x86/pci/irq.c | 15 +--------------
drivers/acpi/pci_irq.c | 9 +--------
5 files changed, 16 insertions(+), 37 deletions(-)

diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h
index 164e3f8d3c3d..fa1195dae425 100644
--- a/arch/x86/include/asm/pci_x86.h
+++ b/arch/x86/include/asm/pci_x86.h
@@ -93,8 +93,6 @@ extern raw_spinlock_t pci_config_lock;
extern int (*pcibios_enable_irq)(struct pci_dev *dev);
extern void (*pcibios_disable_irq)(struct pci_dev *dev);

-extern bool mp_should_keep_irq(struct device *dev);
-
struct pci_raw_ops {
int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn,
int reg, int len, u32 *val);
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 8fd6f44aee83..dc78a4a9a466 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -673,24 +673,22 @@ int pcibios_add_device(struct pci_dev *dev)
return 0;
}

-int pcibios_enable_device(struct pci_dev *dev, int mask)
+int pcibios_alloc_irq(struct pci_dev *dev)
{
- int err;
-
- if ((err = pci_enable_resources(dev, mask)) < 0)
- return err;
-
- if (!pci_dev_msi_enabled(dev))
- return pcibios_enable_irq(dev);
- return 0;
+ return pcibios_enable_irq(dev);
}

-void pcibios_disable_device (struct pci_dev *dev)
+void pcibios_free_irq(struct pci_dev *dev)
{
- if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq)
+ if (pcibios_disable_irq)
pcibios_disable_irq(dev);
}

+int pcibios_enable_device(struct pci_dev *dev, int mask)
+{
+ return pci_enable_resources(dev, mask);
+}
+
int pci_ext_cfg_avail(void)
{
if (raw_pci_ext_ops)
diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c
index 27062303c881..fb7a1f96d80c 100644
--- a/arch/x86/pci/intel_mid_pci.c
+++ b/arch/x86/pci/intel_mid_pci.c
@@ -234,10 +234,13 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)

static void intel_mid_pci_irq_disable(struct pci_dev *dev)
{
- if (!mp_should_keep_irq(&dev->dev) && dev->irq_managed &&
- dev->irq > 0) {
+ if (dev->irq_managed && dev->irq > 0) {
mp_unmap_irq(dev->irq);
dev->irq_managed = 0;
+ /*
+ * Don't reset dev->irq here, otherwise
+ * intel_mid_pci_irq_enable() will fail on next call.
+ */
}
}

diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 9bd115484745..72108f0b66b1 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -1257,22 +1257,9 @@ static int pirq_enable_irq(struct pci_dev *dev)
return 0;
}

-bool mp_should_keep_irq(struct device *dev)
-{
- if (dev->power.is_prepared)
- return true;
-#ifdef CONFIG_PM
- if (dev->power.runtime_status == RPM_SUSPENDING)
- return true;
-#endif
-
- return false;
-}
-
static void pirq_disable_irq(struct pci_dev *dev)
{
- if (io_apic_assign_pci_irqs && !mp_should_keep_irq(&dev->dev) &&
- dev->irq_managed && dev->irq) {
+ if (io_apic_assign_pci_irqs && dev->irq_managed && dev->irq) {
mp_unmap_irq(dev->irq);
dev->irq = 0;
dev->irq_managed = 0;
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index b1def411c0b8..e7f718d6918a 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -485,14 +485,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
if (!pin || !dev->irq_managed || dev->irq <= 0)
return;

- /* Keep IOAPIC pin configuration when suspending */
- if (dev->dev.power.is_prepared)
- return;
-#ifdef CONFIG_PM
- if (dev->dev.power.runtime_status == RPM_SUSPENDING)
- return;
-#endif
-
entry = acpi_pci_irq_lookup(dev, pin);
if (!entry)
return;
@@ -513,5 +505,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
if (gsi >= 0) {
acpi_unregister_gsi(gsi);
dev->irq_managed = 0;
+ dev->irq = 0;
}
}
--
1.7.10.4

2015-06-10 08:53:28

by Jiang Liu

[permalink] [raw]
Subject: [Patch v3 3/4] PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed

Add three helpers to manage pci_dev->irq and pci_dev->irq_managed,
which helps to improve maintenance.

Signed-off-by: Jiang Liu <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
---
arch/x86/pci/intel_mid_pci.c | 4 ++--
arch/x86/pci/irq.c | 10 ++++------
drivers/acpi/pci_irq.c | 10 ++++------
include/linux/pci.h | 17 +++++++++++++++++
4 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c
index fb7a1f96d80c..22aaefb4f1ca 100644
--- a/arch/x86/pci/intel_mid_pci.c
+++ b/arch/x86/pci/intel_mid_pci.c
@@ -211,7 +211,7 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)
struct irq_alloc_info info;
int polarity;

- if (dev->irq_managed && dev->irq > 0)
+ if (pci_has_managed_irq(dev))
return 0;

if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER)
@@ -234,7 +234,7 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)

static void intel_mid_pci_irq_disable(struct pci_dev *dev)
{
- if (dev->irq_managed && dev->irq > 0) {
+ if (pci_has_managed_irq(dev)) {
mp_unmap_irq(dev->irq);
dev->irq_managed = 0;
/*
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 72108f0b66b1..32e70343e6fd 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -1202,7 +1202,7 @@ static int pirq_enable_irq(struct pci_dev *dev)
struct pci_dev *temp_dev;
int irq;

- if (dev->irq_managed && dev->irq > 0)
+ if (pci_has_managed_irq(dev))
return 0;

irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
@@ -1230,8 +1230,7 @@ static int pirq_enable_irq(struct pci_dev *dev)
}
dev = temp_dev;
if (irq >= 0) {
- dev->irq_managed = 1;
- dev->irq = irq;
+ pci_set_managed_irq(dev, irq);
dev_info(&dev->dev, "PCI->APIC IRQ transform: "
"INT %c -> IRQ %d\n", 'A' + pin - 1, irq);
return 0;
@@ -1259,9 +1258,8 @@ static int pirq_enable_irq(struct pci_dev *dev)

static void pirq_disable_irq(struct pci_dev *dev)
{
- if (io_apic_assign_pci_irqs && dev->irq_managed && dev->irq) {
+ if (io_apic_assign_pci_irqs && pci_has_managed_irq(dev)) {
mp_unmap_irq(dev->irq);
- dev->irq = 0;
- dev->irq_managed = 0;
+ pci_reset_managed_irq(dev);
}
}
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index e7f718d6918a..9d6343d02f7e 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -413,7 +413,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
return 0;
}

- if (dev->irq_managed && dev->irq > 0)
+ if (pci_has_managed_irq(dev))
return 0;

entry = acpi_pci_irq_lookup(dev, pin);
@@ -458,8 +458,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
kfree(entry);
return rc;
}
- dev->irq = rc;
- dev->irq_managed = 1;
+ pci_set_managed_irq(dev, rc);

if (link)
snprintf(link_desc, sizeof(link_desc), " -> Link[%s]", link);
@@ -482,7 +481,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
u8 pin;

pin = dev->pin;
- if (!pin || !dev->irq_managed || dev->irq <= 0)
+ if (!pin || !pci_has_managed_irq(dev))
return;

entry = acpi_pci_irq_lookup(dev, pin);
@@ -504,7 +503,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin));
if (gsi >= 0) {
acpi_unregister_gsi(gsi);
- dev->irq_managed = 0;
- dev->irq = 0;
+ pci_reset_managed_irq(dev);
}
}
diff --git a/include/linux/pci.h b/include/linux/pci.h
index f50d16a04abc..4bc640eef76f 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -958,6 +958,23 @@ static inline int pci_is_managed(struct pci_dev *pdev)
return pdev->is_managed;
}

+static inline void pci_set_managed_irq(struct pci_dev *pdev, unsigned int irq)
+{
+ pdev->irq = irq;
+ pdev->irq_managed = 1;
+}
+
+static inline void pci_reset_managed_irq(struct pci_dev *pdev)
+{
+ pdev->irq = 0;
+ pdev->irq_managed = 0;
+}
+
+static inline bool pci_has_managed_irq(struct pci_dev *pdev)
+{
+ return pdev->irq_managed && pdev->irq > 0;
+}
+
void pci_disable_device(struct pci_dev *dev);

extern unsigned int pcibios_max_latency;
--
1.7.10.4

2015-06-10 08:53:53

by Jiang Liu

[permalink] [raw]
Subject: [Patch v3 4/4] PCI, MSI: Free legacy PCI IRQ when enabling MSI/MSI-X

Once PCI MSI/MSI-X is enabled by the device driver, PCI device won't
make use of legacy PCI IRQ until PCI MSI/MSI-X is disabled again.
This patch enhances the PCI MSI core to call pcibios_free_irq() when
enabling MSI/MSI-X and to call pcibios_alloc_irq() when disabling
MSI/MSI-X. So legacy PCI IRQ will released when enabling MSI/MSI-X
and reallocated when disabling MSI/MSI-X if pcibios_alloc_irq() and
pcibios_free_irq() are implemented by arch specific PCI code.

Signed-off-by: Jiang Liu <[email protected]>
Acked-by: Bjorn Helgaas <[email protected]>
---
drivers/pci/msi.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index c3e7dfcf9ff5..47cf72c669f0 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -686,6 +686,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
msi_set_enable(dev, 1);
dev->msi_enabled = 1;

+ pcibios_free_irq(dev);
dev->irq = entry->irq;
return 0;
}
@@ -813,9 +814,10 @@ static int msix_capability_init(struct pci_dev *dev,
/* Set MSI-X enabled bits and unmask the function */
pci_intx_for_msi(dev, 0);
dev->msix_enabled = 1;
-
msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);

+ pcibios_free_irq(dev);
+
return 0;

out_avail:
@@ -930,6 +932,7 @@ void pci_msi_shutdown(struct pci_dev *dev)

/* Restore dev->irq to its default pin-assertion irq */
dev->irq = desc->msi_attrib.default_irq;
+ pcibios_alloc_irq(dev);
}

void pci_disable_msi(struct pci_dev *dev)
@@ -1030,6 +1033,7 @@ void pci_msix_shutdown(struct pci_dev *dev)
msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
pci_intx_for_msi(dev, 1);
dev->msix_enabled = 0;
+ pcibios_alloc_irq(dev);
}

void pci_disable_msix(struct pci_dev *dev)
--
1.7.10.4

2015-06-19 16:10:13

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

On Wed, Jun 10, 2015 at 04:54:57PM +0800, Jiang Liu wrote:
> Hi Bjorn,
> I have verified that this patch set could be applied to the
> mainstream kernel without dependency on other patches, so could you
> please help to merge it?

I already acked these and said I was willing to merge them and that I was
hoping for an ack from Thomas.

Any thoughts, Thomas?

> This patch set introduces a mechanism to allocate PCI IRQ on demand and
> free it when not used anymore by hooking pci_device_probe() and
> pci_device_remove().
>
> It will be used to track IOAPIC pin usage on x86 so we could support
> IOAPIC hot-removal.
>
> The patch set passes Fengguang's 0day test suite.
>
> V2->V3:
> 1) Change the default pcibios_alloc_irq() to always return 0, as
> suggested by Bjorn.
> 2) Refine comments.
>
> V1->V2:
> 1) Refine pci_device_probe() to optimize for mainline code as suggested
> by Bjorn
> 2) Reorder patch set to put optional patch as the last (Patch 4)
>
>
> Jiang Liu (4):
> PCI: Add hooks to allocate/free IRQ resources when binding/unbinding
> driver
> PCI, x86: Allocate PCI IRQ on demand and free it when not used
> anymore
> PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed
> PCI, MSI: Free legacy PCI IRQ when enabling MSI/MSI-X
>
> arch/x86/include/asm/pci_x86.h | 2 --
> arch/x86/pci/common.c | 20 +++++++++-----------
> arch/x86/pci/intel_mid_pci.c | 9 ++++++---
> arch/x86/pci/irq.c | 23 ++++-------------------
> drivers/acpi/pci_irq.c | 17 ++++-------------
> drivers/pci/msi.c | 6 +++++-
> drivers/pci/pci-driver.c | 26 ++++++++++++++++++++------
> include/linux/pci.h | 19 +++++++++++++++++++
> 8 files changed, 67 insertions(+), 55 deletions(-)
>
> --
> 1.7.10.4
>

2015-07-08 07:31:39

by Jiang Liu

[permalink] [raw]
Subject: Re: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

On 2015/6/20 0:10, Bjorn Helgaas wrote:
> On Wed, Jun 10, 2015 at 04:54:57PM +0800, Jiang Liu wrote:
>> Hi Bjorn,
>> I have verified that this patch set could be applied to the
>> mainstream kernel without dependency on other patches, so could you
>> please help to merge it?
>
> I already acked these and said I was willing to merge them and that I was
> hoping for an ack from Thomas.
>
> Any thoughts, Thomas?

Hi Thomas,
Any comments about this bugfix series?
Thanks!
Gerry

>
>> This patch set introduces a mechanism to allocate PCI IRQ on demand and
>> free it when not used anymore by hooking pci_device_probe() and
>> pci_device_remove().
>>
>> It will be used to track IOAPIC pin usage on x86 so we could support
>> IOAPIC hot-removal.
>>
>> The patch set passes Fengguang's 0day test suite.
>>
>> V2->V3:
>> 1) Change the default pcibios_alloc_irq() to always return 0, as
>> suggested by Bjorn.
>> 2) Refine comments.
>>
>> V1->V2:
>> 1) Refine pci_device_probe() to optimize for mainline code as suggested
>> by Bjorn
>> 2) Reorder patch set to put optional patch as the last (Patch 4)
>>
>>
>> Jiang Liu (4):
>> PCI: Add hooks to allocate/free IRQ resources when binding/unbinding
>> driver
>> PCI, x86: Allocate PCI IRQ on demand and free it when not used
>> anymore
>> PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed
>> PCI, MSI: Free legacy PCI IRQ when enabling MSI/MSI-X
>>
>> arch/x86/include/asm/pci_x86.h | 2 --
>> arch/x86/pci/common.c | 20 +++++++++-----------
>> arch/x86/pci/intel_mid_pci.c | 9 ++++++---
>> arch/x86/pci/irq.c | 23 ++++-------------------
>> drivers/acpi/pci_irq.c | 17 ++++-------------
>> drivers/pci/msi.c | 6 +++++-
>> drivers/pci/pci-driver.c | 26 ++++++++++++++++++++------
>> include/linux/pci.h | 19 +++++++++++++++++++
>> 8 files changed, 67 insertions(+), 55 deletions(-)
>>
>> --
>> 1.7.10.4
>>

2015-07-08 07:41:33

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

On Wed, 8 Jul 2015, Jiang Liu wrote:
> On 2015/6/20 0:10, Bjorn Helgaas wrote:
> > On Wed, Jun 10, 2015 at 04:54:57PM +0800, Jiang Liu wrote:
> >> Hi Bjorn,
> >> I have verified that this patch set could be applied to the
> >> mainstream kernel without dependency on other patches, so could you
> >> please help to merge it?
> >
> > I already acked these and said I was willing to merge them and that I was
> > hoping for an ack from Thomas.
> >
> > Any thoughts, Thomas?
>
> Hi Thomas,
> Any comments about this bugfix series?

How is these a bugfix series? It looks like preparation for ioapic
hotplug.

But other than that, Acked-by-me.

2015-07-08 07:56:02

by Jiang Liu

[permalink] [raw]
Subject: Re: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

On 2015/7/8 15:40, Thomas Gleixner wrote:
> On Wed, 8 Jul 2015, Jiang Liu wrote:
>> On 2015/6/20 0:10, Bjorn Helgaas wrote:
>>> On Wed, Jun 10, 2015 at 04:54:57PM +0800, Jiang Liu wrote:
>>>> Hi Bjorn,
>>>> I have verified that this patch set could be applied to the
>>>> mainstream kernel without dependency on other patches, so could you
>>>> please help to merge it?
>>>
>>> I already acked these and said I was willing to merge them and that I was
>>> hoping for an ack from Thomas.
>>>
>>> Any thoughts, Thomas?
>>
>> Hi Thomas,
>> Any comments about this bugfix series?
>
> How is these a bugfix series? It looks like preparation for ioapic
> hotplug.
>
> But other than that, Acked-by-me.
Thanks! The IOAPIC hotplug driver has been merged into mainstream
kernel, so treat them as bugfix:)

2015-07-30 19:23:17

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: [Patch v3 0/4] Introduce a mechanism to allocate PCI IRQ on demand

On Wed, Jun 10, 2015 at 04:54:57PM +0800, Jiang Liu wrote:
> Hi Bjorn,
> I have verified that this patch set could be applied to the
> mainstream kernel without dependency on other patches, so could you
> please help to merge it?
>
> This patch set introduces a mechanism to allocate PCI IRQ on demand and
> free it when not used anymore by hooking pci_device_probe() and
> pci_device_remove().
>
> It will be used to track IOAPIC pin usage on x86 so we could support
> IOAPIC hot-removal.
>
> The patch set passes Fengguang's 0day test suite.
>
> V2->V3:
> 1) Change the default pcibios_alloc_irq() to always return 0, as
> suggested by Bjorn.
> 2) Refine comments.
>
> V1->V2:
> 1) Refine pci_device_probe() to optimize for mainline code as suggested
> by Bjorn
> 2) Reorder patch set to put optional patch as the last (Patch 4)
>
>
> Jiang Liu (4):
> PCI: Add hooks to allocate/free IRQ resources when binding/unbinding
> driver
> PCI, x86: Allocate PCI IRQ on demand and free it when not used
> anymore
> PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed
> PCI, MSI: Free legacy PCI IRQ when enabling MSI/MSI-X

Applied to pci/irq with the following changelogs for v4.3, thanks!

commit 890e4847587fcff5eb0438e90992ad7d2a261f33
Author: Jiang Liu <[email protected]>
Date: Wed Jun 10 16:54:58 2015 +0800

PCI: Add pcibios_alloc_irq() and pcibios_free_irq()

Add pcibios_alloc_irq() and pcibios_free_irq(), which are called when
binding/unbinding PCI device drivers.

PCI arch code may implement these to manage IRQ resources for hotplugged
devices.

[bhelgaas: changelog]
Signed-off-by: Jiang Liu <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>

commit 991de2e59090e55c65a7f59a049142e3c480f7bd
Author: Jiang Liu <[email protected]>
Date: Wed Jun 10 16:54:59 2015 +0800

PCI, x86: Implement pcibios_alloc_irq() and pcibios_free_irq()

To support IOAPIC hotplug, we need to allocate PCI IRQ resources on demand
and free them when not used anymore.

Implement pcibios_alloc_irq() and pcibios_free_irq() to dynamically
allocate and free PCI IRQs.

Remove mp_should_keep_irq(), which is no longer used.

[bhelgaas: changelog]
Signed-off-by: Jiang Liu <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>

commit 811a4e6fce09bc9239c664c6a1a53645a678c303
Author: Jiang Liu <[email protected]>
Date: Wed Jun 10 16:55:00 2015 +0800

PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed

Add pci_has_managed_irq(), pci_set_managed_irq(), and
pci_reset_managed_irq() to simplify code. No functional change.

[bhelgaas: changelog]
Signed-off-by: Jiang Liu <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>

commit 5f2269916b0e509f2926346b58209abfa8316143
Author: Jiang Liu <[email protected]>
Date: Thu Jul 30 14:00:08 2015 -0500

PCI/MSI: Free legacy IRQ when enabling MSI/MSI-X

Once MSI/MSI-X is enabled by the device driver, a PCI device won't use
legacy IRQs again until MSI/MSI-X is disabled.

Call pcibios_free_irq() when enabling MSI/MSI-X and pcibios_alloc_irq()
when disabling MSI/MSI-X. This allows arch code to manage resources
associated with the legacy IRQ.

[bhelgaas: changelog]
Signed-off-by: Jiang Liu <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
Acked-by: Thomas Gleixner <[email protected]>