Commit 191988e0 authored by David S. Miller's avatar David S. Miller

Merge branch 'mvneta_percpu_irq'

Gregory CLEMENT says:

====================
net: mvneta: Switch to per-CPU irq and make rxq_def useful

As stated in the first version: "this patchset reworks the Marvell
neta driver in order to really support its per-CPU interrupts, instead
of faking them as SPI, and allow the use of any RX queue instead of
the hardcoded RX queue 0 that we have currently."

Following the review which has been done, Maxime started adding the
CPU hotplug support. I continued his work a few weeks ago and here is
the result.

Since the 1st version the main change is this CPU hotplug support, in
order to validate it I powered up and down the CPUs while performing
iperf. I ran the tests during hours: the kernel didn't crash and the
network interfaces were still usable. Of course it impacted the
performance, but continuously power down and up the CPUs is not
something we usually do.

I also reorganized the series, the 3 first patches should go through
the irq subsystem, whereas the 4 others should go to the network
subsystem.

However, there is a runtime dependency between the two parts. Patch 5
depend on the patch 3 to be able to use the percpu irq.

Thanks,

Gregory

PS: Thanks to Willy who gave me some pointers on how to deal with the
NAPI.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 8a4683a5 f8642885
...@@ -56,9 +56,6 @@ ...@@ -56,9 +56,6 @@
#define ARMADA_370_XP_MAX_PER_CPU_IRQS (28) #define ARMADA_370_XP_MAX_PER_CPU_IRQS (28)
#define ARMADA_370_XP_TIMER0_PER_CPU_IRQ (5)
#define ARMADA_370_XP_FABRIC_IRQ (3)
#define IPI_DOORBELL_START (0) #define IPI_DOORBELL_START (0)
#define IPI_DOORBELL_END (8) #define IPI_DOORBELL_END (8)
#define IPI_DOORBELL_MASK 0xFF #define IPI_DOORBELL_MASK 0xFF
...@@ -81,13 +78,10 @@ static phys_addr_t msi_doorbell_addr; ...@@ -81,13 +78,10 @@ static phys_addr_t msi_doorbell_addr;
static inline bool is_percpu_irq(irq_hw_number_t irq) static inline bool is_percpu_irq(irq_hw_number_t irq)
{ {
switch (irq) { if (irq <= ARMADA_370_XP_MAX_PER_CPU_IRQS)
case ARMADA_370_XP_TIMER0_PER_CPU_IRQ:
case ARMADA_370_XP_FABRIC_IRQ:
return true; return true;
default:
return false; return false;
}
} }
/* /*
...@@ -549,7 +543,7 @@ static void armada_370_xp_mpic_resume(void) ...@@ -549,7 +543,7 @@ static void armada_370_xp_mpic_resume(void)
if (virq == 0) if (virq == 0)
continue; continue;
if (irq != ARMADA_370_XP_TIMER0_PER_CPU_IRQ) if (!is_percpu_irq(irq))
writel(irq, per_cpu_int_base + writel(irq, per_cpu_int_base +
ARMADA_370_XP_INT_CLEAR_MASK_OFFS); ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
else else
......
This diff is collapsed.
...@@ -1761,6 +1761,7 @@ void free_percpu_irq(unsigned int irq, void __percpu *dev_id) ...@@ -1761,6 +1761,7 @@ void free_percpu_irq(unsigned int irq, void __percpu *dev_id)
kfree(__free_percpu_irq(irq, dev_id)); kfree(__free_percpu_irq(irq, dev_id));
chip_bus_sync_unlock(desc); chip_bus_sync_unlock(desc);
} }
EXPORT_SYMBOL_GPL(free_percpu_irq);
/** /**
* setup_percpu_irq - setup a per-cpu interrupt * setup_percpu_irq - setup a per-cpu interrupt
...@@ -1790,9 +1791,10 @@ int setup_percpu_irq(unsigned int irq, struct irqaction *act) ...@@ -1790,9 +1791,10 @@ int setup_percpu_irq(unsigned int irq, struct irqaction *act)
* @devname: An ascii name for the claiming device * @devname: An ascii name for the claiming device
* @dev_id: A percpu cookie passed back to the handler function * @dev_id: A percpu cookie passed back to the handler function
* *
* This call allocates interrupt resources, but doesn't * This call allocates interrupt resources and enables the
* automatically enable the interrupt. It has to be done on each * interrupt on the local CPU. If the interrupt is supposed to be
* CPU using enable_percpu_irq(). * enabled on other CPUs, it has to be done on each CPU using
* enable_percpu_irq().
* *
* Dev_id must be globally unique. It is a per-cpu variable, and * Dev_id must be globally unique. It is a per-cpu variable, and
* the handler gets called with the interrupted CPU's instance of * the handler gets called with the interrupted CPU's instance of
...@@ -1831,6 +1833,7 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler, ...@@ -1831,6 +1833,7 @@ int request_percpu_irq(unsigned int irq, irq_handler_t handler,
return retval; return retval;
} }
EXPORT_SYMBOL_GPL(request_percpu_irq);
/** /**
* irq_get_irqchip_state - returns the irqchip state of a interrupt. * irq_get_irqchip_state - returns the irqchip state of a interrupt.
......
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