diff options
Diffstat (limited to 'kernel/irq/irqdesc.c')
| -rw-r--r-- | kernel/irq/irqdesc.c | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 4c60a50e66b..039b889ea05 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -70,7 +70,8 @@ static inline void desc_smp_init(struct irq_desc *desc, int node) { }  static inline int desc_node(struct irq_desc *desc) { return 0; }  #endif -static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node) +static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, +		struct module *owner)  {  	int cpu; @@ -86,6 +87,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node)  	desc->irq_count = 0;  	desc->irqs_unhandled = 0;  	desc->name = NULL; +	desc->owner = owner;  	for_each_possible_cpu(cpu)  		*per_cpu_ptr(desc->kstat_irqs, cpu) = 0;  	desc_smp_init(desc, node); @@ -128,7 +130,7 @@ static void free_masks(struct irq_desc *desc)  static inline void free_masks(struct irq_desc *desc) { }  #endif -static struct irq_desc *alloc_desc(int irq, int node) +static struct irq_desc *alloc_desc(int irq, int node, struct module *owner)  {  	struct irq_desc *desc;  	gfp_t gfp = GFP_KERNEL; @@ -147,7 +149,7 @@ static struct irq_desc *alloc_desc(int irq, int node)  	raw_spin_lock_init(&desc->lock);  	lockdep_set_class(&desc->lock, &irq_desc_lock_class); -	desc_set_defaults(irq, desc, node); +	desc_set_defaults(irq, desc, node, owner);  	return desc; @@ -173,13 +175,14 @@ static void free_desc(unsigned int irq)  	kfree(desc);  } -static int alloc_descs(unsigned int start, unsigned int cnt, int node) +static int alloc_descs(unsigned int start, unsigned int cnt, int node, +		       struct module *owner)  {  	struct irq_desc *desc;  	int i;  	for (i = 0; i < cnt; i++) { -		desc = alloc_desc(start + i, node); +		desc = alloc_desc(start + i, node, owner);  		if (!desc)  			goto err;  		mutex_lock(&sparse_irq_lock); @@ -227,7 +230,7 @@ int __init early_irq_init(void)  		nr_irqs = initcnt;  	for (i = 0; i < initcnt; i++) { -		desc = alloc_desc(i, node); +		desc = alloc_desc(i, node, NULL);  		set_bit(i, allocated_irqs);  		irq_insert_desc(i, desc);  	} @@ -261,7 +264,7 @@ int __init early_irq_init(void)  		alloc_masks(&desc[i], GFP_KERNEL, node);  		raw_spin_lock_init(&desc[i].lock);  		lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); -		desc_set_defaults(i, &desc[i], node); +		desc_set_defaults(i, &desc[i], node, NULL);  	}  	return arch_early_irq_init();  } @@ -276,8 +279,16 @@ static void free_desc(unsigned int irq)  	dynamic_irq_cleanup(irq);  } -static inline int alloc_descs(unsigned int start, unsigned int cnt, int node) +static inline int alloc_descs(unsigned int start, unsigned int cnt, int node, +			      struct module *owner)  { +	u32 i; + +	for (i = 0; i < cnt; i++) { +		struct irq_desc *desc = irq_to_desc(start + i); + +		desc->owner = owner; +	}  	return start;  } @@ -333,11 +344,13 @@ EXPORT_SYMBOL_GPL(irq_free_descs);   * @from:	Start the search from this irq number   * @cnt:	Number of consecutive irqs to allocate.   * @node:	Preferred node on which the irq descriptor should be allocated + * @owner:	Owning module (can be NULL)   *   * Returns the first irq number or error code   */  int __ref -irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node) +__irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, +		  struct module *owner)  {  	int start, ret; @@ -366,13 +379,13 @@ irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node)  	bitmap_set(allocated_irqs, start, cnt);  	mutex_unlock(&sparse_irq_lock); -	return alloc_descs(start, cnt, node); +	return alloc_descs(start, cnt, node, owner);  err:  	mutex_unlock(&sparse_irq_lock);  	return ret;  } -EXPORT_SYMBOL_GPL(irq_alloc_descs); +EXPORT_SYMBOL_GPL(__irq_alloc_descs);  /**   * irq_reserve_irqs - mark irqs allocated @@ -440,7 +453,7 @@ void dynamic_irq_cleanup(unsigned int irq)  	unsigned long flags;  	raw_spin_lock_irqsave(&desc->lock, flags); -	desc_set_defaults(irq, desc, desc_node(desc)); +	desc_set_defaults(irq, desc, desc_node(desc), NULL);  	raw_spin_unlock_irqrestore(&desc->lock, flags);  }  |