Commit 8054c363 authored by Konrad Rzeszutek Wilk's avatar Konrad Rzeszutek Wilk

Merge branch 'stable/irq.rework' into stable/irq.cleanup

* stable/irq.rework:
  xen/irq: Cleanup up the pirq_to_irq for DomU PV PCI passthrough guests as well.
  xen: Use IRQF_FORCE_RESUME
  xen/timer: Missing IRQF_NO_SUSPEND in timer code broke suspend.
  xen: Fix compile error introduced by "switch to new irq_chip functions"
  xen: Switch to new irq_chip functions
  xen: Remove stale irq_chip.end
  xen: events: do not free legacy IRQs
  xen: events: allocate GSIs and dynamic IRQs from separate IRQ ranges.
  xen: events: add xen_allocate_irq_{dynamic, gsi} and xen_free_irq
  xen:events: move find_unbound_irq inside CONFIG_PCI_MSI
  xen: handled remapped IRQs when enabling a pcifront PCI device.
  genirq: Add IRQF_FORCE_RESUME
parents f5412be5 1aa0b51a
...@@ -226,21 +226,27 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev) ...@@ -226,21 +226,27 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
{ {
int rc; int rc;
int share = 1; int share = 1;
u8 gsi;
dev_info(&dev->dev, "Xen PCI enabling IRQ: %d\n", dev->irq); rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
if (rc < 0) {
if (dev->irq < 0) dev_warn(&dev->dev, "Xen PCI: failed to read interrupt line: %d\n",
return -EINVAL; rc);
return rc;
}
if (dev->irq < NR_IRQS_LEGACY) if (gsi < NR_IRQS_LEGACY)
share = 0; share = 0;
rc = xen_allocate_pirq(dev->irq, share, "pcifront"); rc = xen_allocate_pirq(gsi, share, "pcifront");
if (rc < 0) { if (rc < 0) {
dev_warn(&dev->dev, "Xen PCI IRQ: %d, failed to register:%d\n", dev_warn(&dev->dev, "Xen PCI: failed to register GSI%d: %d\n",
dev->irq, rc); gsi, rc);
return rc; return rc;
} }
dev->irq = rc;
dev_info(&dev->dev, "Xen PCI mapped GSI%d to IRQ%d\n", gsi, dev->irq);
return 0; return 0;
} }
......
...@@ -397,7 +397,9 @@ void xen_setup_timer(int cpu) ...@@ -397,7 +397,9 @@ void xen_setup_timer(int cpu)
name = "<timer kasprintf failed>"; name = "<timer kasprintf failed>";
irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt, irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt,
IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING|IRQF_TIMER, IRQF_DISABLED|IRQF_PERCPU|
IRQF_NOBALANCING|IRQF_TIMER|
IRQF_FORCE_RESUME,
name, NULL); name, NULL);
evt = &per_cpu(xen_clock_events, cpu); evt = &per_cpu(xen_clock_events, cpu);
......
This diff is collapsed.
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
* Used by threaded interrupts which need to keep the * Used by threaded interrupts which need to keep the
* irq line disabled until the threaded handler has been run. * irq line disabled until the threaded handler has been run.
* IRQF_NO_SUSPEND - Do not disable this IRQ during suspend * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
* * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
*/ */
#define IRQF_DISABLED 0x00000020 #define IRQF_DISABLED 0x00000020
#define IRQF_SAMPLE_RANDOM 0x00000040 #define IRQF_SAMPLE_RANDOM 0x00000040
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
#define IRQF_IRQPOLL 0x00001000 #define IRQF_IRQPOLL 0x00001000
#define IRQF_ONESHOT 0x00002000 #define IRQF_ONESHOT 0x00002000
#define IRQF_NO_SUSPEND 0x00004000 #define IRQF_NO_SUSPEND 0x00004000
#define IRQF_FORCE_RESUME 0x00008000
#define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND)
......
...@@ -282,8 +282,17 @@ EXPORT_SYMBOL(disable_irq); ...@@ -282,8 +282,17 @@ EXPORT_SYMBOL(disable_irq);
void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume)
{ {
if (resume) if (resume) {
if (!(desc->status & IRQ_SUSPENDED)) {
if (!desc->action)
return;
if (!(desc->action->flags & IRQF_FORCE_RESUME))
return;
/* Pretend that it got disabled ! */
desc->depth++;
}
desc->status &= ~IRQ_SUSPENDED; desc->status &= ~IRQ_SUSPENDED;
}
switch (desc->depth) { switch (desc->depth) {
case 0: case 0:
......
...@@ -53,9 +53,6 @@ void resume_device_irqs(void) ...@@ -53,9 +53,6 @@ void resume_device_irqs(void)
for_each_irq_desc(irq, desc) { for_each_irq_desc(irq, desc) {
unsigned long flags; unsigned long flags;
if (!(desc->status & IRQ_SUSPENDED))
continue;
raw_spin_lock_irqsave(&desc->lock, flags); raw_spin_lock_irqsave(&desc->lock, flags);
__enable_irq(desc, irq, true); __enable_irq(desc, irq, true);
raw_spin_unlock_irqrestore(&desc->lock, flags); raw_spin_unlock_irqrestore(&desc->lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment