mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 14:13:01 -04:00
Merge branch 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-apic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (25 commits) x86: Fix out of order of gsi x86: apic: Fix mismerge, add arch_probe_nr_irqs() again x86, irq: Keep chip_data in create_irq_nr and destroy_irq xen: Remove unnecessary arch specific xen irq functions. smp: Use nr_cpus= to set nr_cpu_ids early x86, irq: Remove arch_probe_nr_irqs sparseirq: Use radix_tree instead of ptrs array sparseirq: Change irq_desc_ptrs to static init: Move radix_tree_init() early irq: Remove unnecessary bootmem code x86: Add iMac9,1 to pci_reboot_dmi_table x86: Convert i8259_lock to raw_spinlock x86: Convert nmi_lock to raw_spinlock x86: Convert ioapic_lock and vector_lock to raw_spinlock x86: Avoid race condition in pci_enable_msix() x86: Fix SCI on IOAPIC != 0 x86, ia32_aout: do not kill argument mapping x86, irq: Move __setup_vector_irq() before the first irq enable in cpu online path x86, irq: Update the vector domain for legacy irqs handled by io-apic x86, irq: Don't block IRQ0_VECTOR..IRQ15_VECTOR's on all cpu's ...
This commit is contained in:
commit
fb7b096d94
26 changed files with 345 additions and 247 deletions
|
|
@ -18,11 +18,7 @@
|
|||
|
||||
#include "internals.h"
|
||||
|
||||
/**
|
||||
* dynamic_irq_init - initialize a dynamically allocated irq
|
||||
* @irq: irq number to initialize
|
||||
*/
|
||||
void dynamic_irq_init(unsigned int irq)
|
||||
static void dynamic_irq_init_x(unsigned int irq, bool keep_chip_data)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
unsigned long flags;
|
||||
|
|
@ -41,7 +37,8 @@ void dynamic_irq_init(unsigned int irq)
|
|||
desc->depth = 1;
|
||||
desc->msi_desc = NULL;
|
||||
desc->handler_data = NULL;
|
||||
desc->chip_data = NULL;
|
||||
if (!keep_chip_data)
|
||||
desc->chip_data = NULL;
|
||||
desc->action = NULL;
|
||||
desc->irq_count = 0;
|
||||
desc->irqs_unhandled = 0;
|
||||
|
|
@ -55,10 +52,26 @@ void dynamic_irq_init(unsigned int irq)
|
|||
}
|
||||
|
||||
/**
|
||||
* dynamic_irq_cleanup - cleanup a dynamically allocated irq
|
||||
* dynamic_irq_init - initialize a dynamically allocated irq
|
||||
* @irq: irq number to initialize
|
||||
*/
|
||||
void dynamic_irq_cleanup(unsigned int irq)
|
||||
void dynamic_irq_init(unsigned int irq)
|
||||
{
|
||||
dynamic_irq_init_x(irq, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* dynamic_irq_init_keep_chip_data - initialize a dynamically allocated irq
|
||||
* @irq: irq number to initialize
|
||||
*
|
||||
* does not set irq_to_desc(irq)->chip_data to NULL
|
||||
*/
|
||||
void dynamic_irq_init_keep_chip_data(unsigned int irq)
|
||||
{
|
||||
dynamic_irq_init_x(irq, true);
|
||||
}
|
||||
|
||||
static void dynamic_irq_cleanup_x(unsigned int irq, bool keep_chip_data)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned long flags;
|
||||
|
|
@ -77,7 +90,8 @@ void dynamic_irq_cleanup(unsigned int irq)
|
|||
}
|
||||
desc->msi_desc = NULL;
|
||||
desc->handler_data = NULL;
|
||||
desc->chip_data = NULL;
|
||||
if (!keep_chip_data)
|
||||
desc->chip_data = NULL;
|
||||
desc->handle_irq = handle_bad_irq;
|
||||
desc->chip = &no_irq_chip;
|
||||
desc->name = NULL;
|
||||
|
|
@ -85,6 +99,26 @@ void dynamic_irq_cleanup(unsigned int irq)
|
|||
raw_spin_unlock_irqrestore(&desc->lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* dynamic_irq_cleanup - cleanup a dynamically allocated irq
|
||||
* @irq: irq number to initialize
|
||||
*/
|
||||
void dynamic_irq_cleanup(unsigned int irq)
|
||||
{
|
||||
dynamic_irq_cleanup_x(irq, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* dynamic_irq_cleanup_keep_chip_data - cleanup a dynamically allocated irq
|
||||
* @irq: irq number to initialize
|
||||
*
|
||||
* does not set irq_to_desc(irq)->chip_data to NULL
|
||||
*/
|
||||
void dynamic_irq_cleanup_keep_chip_data(unsigned int irq)
|
||||
{
|
||||
dynamic_irq_cleanup_x(irq, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set_irq_chip - set the irq chip for an irq
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
#include <linux/kernel_stat.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/hash.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/radix-tree.h>
|
||||
#include <trace/events/irq.h>
|
||||
|
||||
#include "internals.h"
|
||||
|
|
@ -87,12 +87,8 @@ void __ref init_kstat_irqs(struct irq_desc *desc, int node, int nr)
|
|||
{
|
||||
void *ptr;
|
||||
|
||||
if (slab_is_available())
|
||||
ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs),
|
||||
GFP_ATOMIC, node);
|
||||
else
|
||||
ptr = alloc_bootmem_node(NODE_DATA(node),
|
||||
nr * sizeof(*desc->kstat_irqs));
|
||||
ptr = kzalloc_node(nr * sizeof(*desc->kstat_irqs),
|
||||
GFP_ATOMIC, node);
|
||||
|
||||
/*
|
||||
* don't overwite if can not get new one
|
||||
|
|
@ -132,7 +128,26 @@ static void init_one_irq_desc(int irq, struct irq_desc *desc, int node)
|
|||
*/
|
||||
DEFINE_RAW_SPINLOCK(sparse_irq_lock);
|
||||
|
||||
struct irq_desc **irq_desc_ptrs __read_mostly;
|
||||
static RADIX_TREE(irq_desc_tree, GFP_ATOMIC);
|
||||
|
||||
static void set_irq_desc(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
radix_tree_insert(&irq_desc_tree, irq, desc);
|
||||
}
|
||||
|
||||
struct irq_desc *irq_to_desc(unsigned int irq)
|
||||
{
|
||||
return radix_tree_lookup(&irq_desc_tree, irq);
|
||||
}
|
||||
|
||||
void replace_irq_desc(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
void **ptr;
|
||||
|
||||
ptr = radix_tree_lookup_slot(&irq_desc_tree, irq);
|
||||
if (ptr)
|
||||
radix_tree_replace_slot(ptr, desc);
|
||||
}
|
||||
|
||||
static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
|
||||
[0 ... NR_IRQS_LEGACY-1] = {
|
||||
|
|
@ -164,9 +179,6 @@ int __init early_irq_init(void)
|
|||
legacy_count = ARRAY_SIZE(irq_desc_legacy);
|
||||
node = first_online_node;
|
||||
|
||||
/* allocate irq_desc_ptrs array based on nr_irqs */
|
||||
irq_desc_ptrs = kcalloc(nr_irqs, sizeof(void *), GFP_NOWAIT);
|
||||
|
||||
/* allocate based on nr_cpu_ids */
|
||||
kstat_irqs_legacy = kzalloc_node(NR_IRQS_LEGACY * nr_cpu_ids *
|
||||
sizeof(int), GFP_NOWAIT, node);
|
||||
|
|
@ -180,23 +192,12 @@ int __init early_irq_init(void)
|
|||
lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
|
||||
alloc_desc_masks(&desc[i], node, true);
|
||||
init_desc_masks(&desc[i]);
|
||||
irq_desc_ptrs[i] = desc + i;
|
||||
set_irq_desc(i, &desc[i]);
|
||||
}
|
||||
|
||||
for (i = legacy_count; i < nr_irqs; i++)
|
||||
irq_desc_ptrs[i] = NULL;
|
||||
|
||||
return arch_early_irq_init();
|
||||
}
|
||||
|
||||
struct irq_desc *irq_to_desc(unsigned int irq)
|
||||
{
|
||||
if (irq_desc_ptrs && irq < nr_irqs)
|
||||
return irq_desc_ptrs[irq];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node)
|
||||
{
|
||||
struct irq_desc *desc;
|
||||
|
|
@ -208,21 +209,18 @@ struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
desc = irq_desc_ptrs[irq];
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc)
|
||||
return desc;
|
||||
|
||||
raw_spin_lock_irqsave(&sparse_irq_lock, flags);
|
||||
|
||||
/* We have to check it to avoid races with another CPU */
|
||||
desc = irq_desc_ptrs[irq];
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc)
|
||||
goto out_unlock;
|
||||
|
||||
if (slab_is_available())
|
||||
desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
|
||||
else
|
||||
desc = alloc_bootmem_node(NODE_DATA(node), sizeof(*desc));
|
||||
desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
|
||||
|
||||
printk(KERN_DEBUG " alloc irq_desc for %d on node %d\n", irq, node);
|
||||
if (!desc) {
|
||||
|
|
@ -231,7 +229,7 @@ struct irq_desc * __ref irq_to_desc_alloc_node(unsigned int irq, int node)
|
|||
}
|
||||
init_one_irq_desc(irq, desc, node);
|
||||
|
||||
irq_desc_ptrs[irq] = desc;
|
||||
set_irq_desc(irq, desc);
|
||||
|
||||
out_unlock:
|
||||
raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
|
||||
|
|
|
|||
|
|
@ -21,11 +21,7 @@ extern void clear_kstat_irqs(struct irq_desc *desc);
|
|||
extern raw_spinlock_t sparse_irq_lock;
|
||||
|
||||
#ifdef CONFIG_SPARSE_IRQ
|
||||
/* irq_desc_ptrs allocated at boot time */
|
||||
extern struct irq_desc **irq_desc_ptrs;
|
||||
#else
|
||||
/* irq_desc_ptrs is a fixed size array */
|
||||
extern struct irq_desc *irq_desc_ptrs[NR_IRQS];
|
||||
void replace_irq_desc(unsigned int irq, struct irq_desc *desc);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc,
|
|||
raw_spin_lock_irqsave(&sparse_irq_lock, flags);
|
||||
|
||||
/* We have to check it to avoid races with another CPU */
|
||||
desc = irq_desc_ptrs[irq];
|
||||
desc = irq_to_desc(irq);
|
||||
|
||||
if (desc && old_desc != desc)
|
||||
goto out_unlock;
|
||||
|
|
@ -90,7 +90,7 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc,
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
irq_desc_ptrs[irq] = desc;
|
||||
replace_irq_desc(irq, desc);
|
||||
raw_spin_unlock_irqrestore(&sparse_irq_lock, flags);
|
||||
|
||||
/* free the old one */
|
||||
|
|
|
|||
Loading…
Reference in a new issue