Merge branch 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner: "This is a rather large update post rc1 due to the final steps of cleanups and API changes which had to wait for the preparatory patches to hit your tree. - Regression fixes for ARM GIC irqchips - Regression fixes and lockdep anotations for renesas irq chips - The leftovers of the cleanup and preparatory patches which have been ignored by maintainers - Final conversions of the newly merged users of obsolete APIs - Final removal of obsolete APIs - Final removal of ARM artifacts which had been introduced during the conversion of ARM to the generic interrupt code. - Final split of the irq_data into chip specific and common data to reflect the needs of hierarchical irq domains. - Treewide removal of the first argument of interrupt flow handlers, i.e. the irq number, which is not used by the majority of handlers and simple to retrieve from the other argument the irq descriptor. - A few comment updates and build warning fixes" * 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (40 commits) arm64: Remove ununsed set_irq_flags ARM: Remove ununsed set_irq_flags sh: Kill off set_irq_flags usage irqchip: Kill off set_irq_flags usage gpu/drm: Kill off set_irq_flags usage genirq: Remove irq argument from irq flow handlers genirq: Move field 'msi_desc' from irq_data into irq_common_data genirq: Move field 'affinity' from irq_data into irq_common_data genirq: Move field 'handler_data' from irq_data into irq_common_data genirq: Move field 'node' from irq_data into irq_common_data irqchip/gic-v3: Use IRQD_FORWARDED_TO_VCPU flag irqchip/gic: Use IRQD_FORWARDED_TO_VCPU flag genirq: Provide IRQD_FORWARDED_TO_VCPU status flag genirq: Simplify irq_data_to_desc() genirq: Remove __irq_set_handler_locked() pinctrl/pistachio: Use irq_set_handler_locked gpio: vf610: Use irq_set_handler_locked powerpc/mpc8xx: Use irq_set_handler_locked() powerpc/ipic: Use irq_set_handler_locked() powerpc/cpm2: Use irq_set_handler_locked() ...
This commit is contained in:
@@ -83,7 +83,7 @@ int irq_set_handler_data(unsigned int irq, void *data)
|
||||
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
desc->irq_data.handler_data = data;
|
||||
desc->irq_common_data.handler_data = data;
|
||||
irq_put_desc_unlock(desc, flags);
|
||||
return 0;
|
||||
}
|
||||
@@ -105,7 +105,7 @@ int irq_set_msi_desc_off(unsigned int irq_base, unsigned int irq_offset,
|
||||
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
desc->irq_data.msi_desc = entry;
|
||||
desc->irq_common_data.msi_desc = entry;
|
||||
if (entry && !irq_offset)
|
||||
entry->irq = irq_base;
|
||||
irq_put_desc_unlock(desc, flags);
|
||||
@@ -372,7 +372,6 @@ static bool irq_may_run(struct irq_desc *desc)
|
||||
|
||||
/**
|
||||
* handle_simple_irq - Simple and software-decoded IRQs.
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Simple interrupts are either sent from a demultiplexing interrupt
|
||||
@@ -382,8 +381,7 @@ static bool irq_may_run(struct irq_desc *desc)
|
||||
* Note: The caller is expected to handle the ack, clear, mask and
|
||||
* unmask issues if necessary.
|
||||
*/
|
||||
void
|
||||
handle_simple_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_simple_irq(struct irq_desc *desc)
|
||||
{
|
||||
raw_spin_lock(&desc->lock);
|
||||
|
||||
@@ -425,7 +423,6 @@ static void cond_unmask_irq(struct irq_desc *desc)
|
||||
|
||||
/**
|
||||
* handle_level_irq - Level type irq handler
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Level type interrupts are active as long as the hardware line has
|
||||
@@ -433,8 +430,7 @@ static void cond_unmask_irq(struct irq_desc *desc)
|
||||
* it after the associated handler has acknowledged the device, so the
|
||||
* interrupt line is back to inactive.
|
||||
*/
|
||||
void
|
||||
handle_level_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_level_irq(struct irq_desc *desc)
|
||||
{
|
||||
raw_spin_lock(&desc->lock);
|
||||
mask_ack_irq(desc);
|
||||
@@ -496,7 +492,6 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
|
||||
|
||||
/**
|
||||
* handle_fasteoi_irq - irq handler for transparent controllers
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Only a single callback will be issued to the chip: an ->eoi()
|
||||
@@ -504,8 +499,7 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
|
||||
* for modern forms of interrupt handlers, which handle the flow
|
||||
* details in hardware, transparently.
|
||||
*/
|
||||
void
|
||||
handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_fasteoi_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = desc->irq_data.chip;
|
||||
|
||||
@@ -546,7 +540,6 @@ EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
|
||||
|
||||
/**
|
||||
* handle_edge_irq - edge type IRQ handler
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Interrupt occures on the falling and/or rising edge of a hardware
|
||||
@@ -560,8 +553,7 @@ EXPORT_SYMBOL_GPL(handle_fasteoi_irq);
|
||||
* the handler was running. If all pending interrupts are handled, the
|
||||
* loop is left.
|
||||
*/
|
||||
void
|
||||
handle_edge_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_edge_irq(struct irq_desc *desc)
|
||||
{
|
||||
raw_spin_lock(&desc->lock);
|
||||
|
||||
@@ -618,13 +610,12 @@ EXPORT_SYMBOL(handle_edge_irq);
|
||||
#ifdef CONFIG_IRQ_EDGE_EOI_HANDLER
|
||||
/**
|
||||
* handle_edge_eoi_irq - edge eoi type IRQ handler
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Similar as the above handle_edge_irq, but using eoi and w/o the
|
||||
* mask/unmask logic.
|
||||
*/
|
||||
void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_edge_eoi_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
|
||||
@@ -665,13 +656,11 @@ out_eoi:
|
||||
|
||||
/**
|
||||
* handle_percpu_irq - Per CPU local irq handler
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Per CPU interrupts on SMP machines without locking requirements
|
||||
*/
|
||||
void
|
||||
handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_percpu_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
|
||||
@@ -688,7 +677,6 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
||||
|
||||
/**
|
||||
* handle_percpu_devid_irq - Per CPU local irq handler with per cpu dev ids
|
||||
* @irq: the interrupt number
|
||||
* @desc: the interrupt description structure for this irq
|
||||
*
|
||||
* Per CPU interrupts on SMP machines without locking requirements. Same as
|
||||
@@ -698,11 +686,12 @@ handle_percpu_irq(unsigned int irq, struct irq_desc *desc)
|
||||
* contain the real device id for the cpu on which this handler is
|
||||
* called
|
||||
*/
|
||||
void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_percpu_devid_irq(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
struct irqaction *action = desc->action;
|
||||
void *dev_id = raw_cpu_ptr(action->percpu_dev_id);
|
||||
unsigned int irq = irq_desc_get_irq(desc);
|
||||
irqreturn_t res;
|
||||
|
||||
kstat_incr_irqs_this_cpu(desc);
|
||||
@@ -796,7 +785,7 @@ irq_set_chained_handler_and_data(unsigned int irq, irq_flow_handler_t handle,
|
||||
return;
|
||||
|
||||
__irq_do_set_handler(desc, handle, 1, NULL);
|
||||
desc->irq_data.handler_data = data;
|
||||
desc->irq_common_data.handler_data = data;
|
||||
|
||||
irq_put_desc_busunlock(desc, flags);
|
||||
}
|
||||
|
@@ -27,8 +27,10 @@
|
||||
*
|
||||
* Handles spurious and unhandled IRQ's. It also prints a debugmessage.
|
||||
*/
|
||||
void handle_bad_irq(unsigned int irq, struct irq_desc *desc)
|
||||
void handle_bad_irq(struct irq_desc *desc)
|
||||
{
|
||||
unsigned int irq = irq_desc_get_irq(desc);
|
||||
|
||||
print_irq_desc(irq, desc);
|
||||
kstat_incr_irqs_this_cpu(desc);
|
||||
ack_bad_irq(irq);
|
||||
|
@@ -194,7 +194,7 @@ static inline void kstat_incr_irqs_this_cpu(struct irq_desc *desc)
|
||||
|
||||
static inline int irq_desc_get_node(struct irq_desc *desc)
|
||||
{
|
||||
return irq_data_get_node(&desc->irq_data);
|
||||
return irq_common_data_get_node(&desc->irq_common_data);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
@@ -38,12 +38,13 @@ static void __init init_irq_default_affinity(void)
|
||||
#ifdef CONFIG_SMP
|
||||
static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node)
|
||||
{
|
||||
if (!zalloc_cpumask_var_node(&desc->irq_data.affinity, gfp, node))
|
||||
if (!zalloc_cpumask_var_node(&desc->irq_common_data.affinity,
|
||||
gfp, node))
|
||||
return -ENOMEM;
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
if (!zalloc_cpumask_var_node(&desc->pending_mask, gfp, node)) {
|
||||
free_cpumask_var(desc->irq_data.affinity);
|
||||
free_cpumask_var(desc->irq_common_data.affinity);
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif
|
||||
@@ -52,11 +53,13 @@ static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node)
|
||||
|
||||
static void desc_smp_init(struct irq_desc *desc, int node)
|
||||
{
|
||||
desc->irq_data.node = node;
|
||||
cpumask_copy(desc->irq_data.affinity, irq_default_affinity);
|
||||
cpumask_copy(desc->irq_common_data.affinity, irq_default_affinity);
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
cpumask_clear(desc->pending_mask);
|
||||
#endif
|
||||
#ifdef CONFIG_NUMA
|
||||
desc->irq_common_data.node = node;
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -70,12 +73,13 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
|
||||
{
|
||||
int cpu;
|
||||
|
||||
desc->irq_common_data.handler_data = NULL;
|
||||
desc->irq_common_data.msi_desc = NULL;
|
||||
|
||||
desc->irq_data.common = &desc->irq_common_data;
|
||||
desc->irq_data.irq = irq;
|
||||
desc->irq_data.chip = &no_irq_chip;
|
||||
desc->irq_data.chip_data = NULL;
|
||||
desc->irq_data.handler_data = NULL;
|
||||
desc->irq_data.msi_desc = NULL;
|
||||
irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS);
|
||||
irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);
|
||||
desc->handle_irq = handle_bad_irq;
|
||||
@@ -121,7 +125,7 @@ static void free_masks(struct irq_desc *desc)
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
free_cpumask_var(desc->pending_mask);
|
||||
#endif
|
||||
free_cpumask_var(desc->irq_data.affinity);
|
||||
free_cpumask_var(desc->irq_common_data.affinity);
|
||||
}
|
||||
#else
|
||||
static inline void free_masks(struct irq_desc *desc) { }
|
||||
@@ -343,7 +347,7 @@ int generic_handle_irq(unsigned int irq)
|
||||
|
||||
if (!desc)
|
||||
return -EINVAL;
|
||||
generic_handle_irq_desc(irq, desc);
|
||||
generic_handle_irq_desc(desc);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(generic_handle_irq);
|
||||
|
@@ -844,7 +844,6 @@ static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain,
|
||||
child->parent_data = irq_data;
|
||||
irq_data->irq = child->irq;
|
||||
irq_data->common = child->common;
|
||||
irq_data->node = child->node;
|
||||
irq_data->domain = domain;
|
||||
}
|
||||
|
||||
|
@@ -192,7 +192,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
||||
switch (ret) {
|
||||
case IRQ_SET_MASK_OK:
|
||||
case IRQ_SET_MASK_OK_DONE:
|
||||
cpumask_copy(data->affinity, mask);
|
||||
cpumask_copy(desc->irq_common_data.affinity, mask);
|
||||
case IRQ_SET_MASK_OK_NOCOPY:
|
||||
irq_set_thread_affinity(desc);
|
||||
ret = 0;
|
||||
@@ -304,7 +304,7 @@ static void irq_affinity_notify(struct work_struct *work)
|
||||
if (irq_move_pending(&desc->irq_data))
|
||||
irq_get_pending(cpumask, desc);
|
||||
else
|
||||
cpumask_copy(cpumask, desc->irq_data.affinity);
|
||||
cpumask_copy(cpumask, desc->irq_common_data.affinity);
|
||||
raw_spin_unlock_irqrestore(&desc->lock, flags);
|
||||
|
||||
notify->notify(notify, cpumask);
|
||||
@@ -375,9 +375,9 @@ static int setup_affinity(struct irq_desc *desc, struct cpumask *mask)
|
||||
* one of the targets is online.
|
||||
*/
|
||||
if (irqd_has_set(&desc->irq_data, IRQD_AFFINITY_SET)) {
|
||||
if (cpumask_intersects(desc->irq_data.affinity,
|
||||
if (cpumask_intersects(desc->irq_common_data.affinity,
|
||||
cpu_online_mask))
|
||||
set = desc->irq_data.affinity;
|
||||
set = desc->irq_common_data.affinity;
|
||||
else
|
||||
irqd_clear(&desc->irq_data, IRQD_AFFINITY_SET);
|
||||
}
|
||||
@@ -829,8 +829,8 @@ irq_thread_check_affinity(struct irq_desc *desc, struct irqaction *action)
|
||||
* This code is triggered unconditionally. Check the affinity
|
||||
* mask pointer. For CPU_MASK_OFFSTACK=n this is optimized out.
|
||||
*/
|
||||
if (desc->irq_data.affinity)
|
||||
cpumask_copy(mask, desc->irq_data.affinity);
|
||||
if (desc->irq_common_data.affinity)
|
||||
cpumask_copy(mask, desc->irq_common_data.affinity);
|
||||
else
|
||||
valid = false;
|
||||
raw_spin_unlock_irq(&desc->lock);
|
||||
|
@@ -39,7 +39,7 @@ static struct proc_dir_entry *root_irq_dir;
|
||||
static int show_irq_affinity(int type, struct seq_file *m, void *v)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc((long)m->private);
|
||||
const struct cpumask *mask = desc->irq_data.affinity;
|
||||
const struct cpumask *mask = desc->irq_common_data.affinity;
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
if (irqd_is_setaffinity_pending(&desc->irq_data))
|
||||
|
@@ -38,7 +38,7 @@ static void resend_irqs(unsigned long arg)
|
||||
clear_bit(irq, irqs_resend);
|
||||
desc = irq_to_desc(irq);
|
||||
local_irq_disable();
|
||||
desc->handle_irq(irq, desc);
|
||||
desc->handle_irq(desc);
|
||||
local_irq_enable();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user