irqdesc: Consolidate irq reservation logic
PATCH 1/1 irqdesc: Consolidate irq reservation logic
From: Grant Likely <[email protected]>
irq_reserve_irqs() and irq_alloc_descs() use largely identical code for finding the range of irqs to reserve. This patch consolidates it into a single function
v2: Fix bug where irq_alloc_desc() was returning -EEXIST always
Signed-off-by Grant Likely <[email protected]>
Cc Thomas Gleixner <[email protected]>
--- kernel/irq/irqdesc.c | 45 ++++++++++++++++++++++++--------------------- 1 files changed, 24 insertions(+), 21 deletions(-)
kernel/irq/irqdesc.c +24 -21
@@ -339,18 +339,15 @@ void irq_free_descs(unsigned int from, unsigned int cnt)EXPORT_SYMBOL_GPL (irq_free_descs);/** -* irq_alloc_descs - allocate and initialize a range of irq descriptors +* __irq_reserve_irqs() - reserve a range of irq numbers * @irq: Allocate for specific irq number if irq >= 0 * @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, -struct module *owner) +static int __ref +__irq_reserve_irqs (int irq,unsigned int from,unsigned int cnt) {int start, ret;
@@ -379,12 +376,30 @@ __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, owner); +return start; err:mutex_unlock (&sparse_irq_lock);return ret; } + +/** +* irq_alloc_descs - allocate and initialize a range of irq descriptors +* @irq: Allocate for specific irq number if irq >= 0 +* @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 of the reserved range or an error code +*/ +int __ref +__irq_alloc_descs (int irq,unsigned int from,unsigned int cnt,int node, +struct module *owner) +{ +int start =__irq_reserve_irqs (irq, from, cnt); +return start <0 ? start :alloc_descs (start, cnt, node, owner); +}EXPORT_SYMBOL_GPL (__irq_alloc_descs);/**
@@ -396,20 +411,8 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs);*/ int irq_reserve_irqs (unsigned int from,unsigned int cnt) { -unsigned int start; -int ret =0 ; - -if (!cnt || (from + cnt) > nr_irqs) -return -EINVAL ; - -mutex_lock (&sparse_irq_lock); - start =bitmap_find_next_zero_area (allocated_irqs, nr_irqs, from, cnt,0 ); -if (start == from) -bitmap_set (allocated_irqs, start, cnt); -else - ret = -EEXIST ; -mutex_unlock (&sparse_irq_lock); -return ret; +int start =__irq_reserve_irqs (from, from, cnt); +return start <0 ? start :0 ; }/**
Signature · 1 line
1.7.5.4