Skip to content

Commit 5d964a9

Browse files
committed
genirq/irqdesc: Switch to lock guards
Replace all lock/unlock pairs with lock guards and simplify the code flow. No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Jiri Slaby <jirislaby@kernel.org> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/all/871ptaqhoo.ffs@tglx
1 parent 0f70a49 commit 5d964a9

1 file changed

Lines changed: 44 additions & 85 deletions

File tree

kernel/irq/irqdesc.c

Lines changed: 44 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ static struct kobject *irq_kobj_base;
246246
#define IRQ_ATTR_RO(_name) \
247247
static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
248248

249-
static ssize_t per_cpu_count_show(struct kobject *kobj,
250-
struct kobj_attribute *attr, char *buf)
249+
static ssize_t per_cpu_count_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
251250
{
252251
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
253252
ssize_t ret = 0;
@@ -266,99 +265,75 @@ static ssize_t per_cpu_count_show(struct kobject *kobj,
266265
}
267266
IRQ_ATTR_RO(per_cpu_count);
268267

269-
static ssize_t chip_name_show(struct kobject *kobj,
270-
struct kobj_attribute *attr, char *buf)
268+
static ssize_t chip_name_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
271269
{
272270
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
273-
ssize_t ret = 0;
274271

275-
raw_spin_lock_irq(&desc->lock);
272+
guard(raw_spinlock_irq)(&desc->lock);
276273
if (desc->irq_data.chip && desc->irq_data.chip->name)
277-
ret = sysfs_emit(buf, "%s\n", desc->irq_data.chip->name);
278-
raw_spin_unlock_irq(&desc->lock);
279-
280-
return ret;
274+
return sysfs_emit(buf, "%s\n", desc->irq_data.chip->name);
275+
return 0;
281276
}
282277
IRQ_ATTR_RO(chip_name);
283278

284-
static ssize_t hwirq_show(struct kobject *kobj,
285-
struct kobj_attribute *attr, char *buf)
279+
static ssize_t hwirq_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
286280
{
287281
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
288-
ssize_t ret = 0;
289282

283+
guard(raw_spinlock_irq)(&desc->lock);
290284
raw_spin_lock_irq(&desc->lock);
291285
if (desc->irq_data.domain)
292-
ret = sysfs_emit(buf, "%lu\n", desc->irq_data.hwirq);
293-
raw_spin_unlock_irq(&desc->lock);
294-
295-
return ret;
286+
return sysfs_emit(buf, "%lu\n", desc->irq_data.hwirq);
287+
return 0;
296288
}
297289
IRQ_ATTR_RO(hwirq);
298290

299-
static ssize_t type_show(struct kobject *kobj,
300-
struct kobj_attribute *attr, char *buf)
291+
static ssize_t type_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
301292
{
302293
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
303-
ssize_t ret = 0;
304-
305-
raw_spin_lock_irq(&desc->lock);
306-
ret = sysfs_emit(buf, "%s\n", irqd_is_level_type(&desc->irq_data) ? "level" : "edge");
307-
raw_spin_unlock_irq(&desc->lock);
308294

309-
return ret;
295+
guard(raw_spinlock_irq)(&desc->lock);
296+
return sysfs_emit(buf, "%s\n", irqd_is_level_type(&desc->irq_data) ? "level" : "edge");
310297

311298
}
312299
IRQ_ATTR_RO(type);
313300

314-
static ssize_t wakeup_show(struct kobject *kobj,
315-
struct kobj_attribute *attr, char *buf)
301+
static ssize_t wakeup_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
316302
{
317303
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
318-
ssize_t ret = 0;
319-
320-
raw_spin_lock_irq(&desc->lock);
321-
ret = sysfs_emit(buf, "%s\n", str_enabled_disabled(irqd_is_wakeup_set(&desc->irq_data)));
322-
raw_spin_unlock_irq(&desc->lock);
323-
324-
return ret;
325304

305+
guard(raw_spinlock_irq)(&desc->lock);
306+
return sysfs_emit(buf, "%s\n", str_enabled_disabled(irqd_is_wakeup_set(&desc->irq_data)));
326307
}
327308
IRQ_ATTR_RO(wakeup);
328309

329-
static ssize_t name_show(struct kobject *kobj,
330-
struct kobj_attribute *attr, char *buf)
310+
static ssize_t name_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
331311
{
332312
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
333-
ssize_t ret = 0;
334313

335-
raw_spin_lock_irq(&desc->lock);
314+
guard(raw_spinlock_irq)(&desc->lock);
336315
if (desc->name)
337-
ret = sysfs_emit(buf, "%s\n", desc->name);
338-
raw_spin_unlock_irq(&desc->lock);
339-
340-
return ret;
316+
return sysfs_emit(buf, "%s\n", desc->name);
317+
return 0;
341318
}
342319
IRQ_ATTR_RO(name);
343320

344-
static ssize_t actions_show(struct kobject *kobj,
345-
struct kobj_attribute *attr, char *buf)
321+
static ssize_t actions_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
346322
{
347323
struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
348324
struct irqaction *action;
349325
ssize_t ret = 0;
350326
char *p = "";
351327

352-
raw_spin_lock_irq(&desc->lock);
353-
for_each_action_of_desc(desc, action) {
354-
ret += sysfs_emit_at(buf, ret, "%s%s", p, action->name);
355-
p = ",";
328+
scoped_guard(raw_spinlock_irq, &desc->lock) {
329+
for_each_action_of_desc(desc, action) {
330+
ret += sysfs_emit_at(buf, ret, "%s%s", p, action->name);
331+
p = ",";
332+
}
356333
}
357-
raw_spin_unlock_irq(&desc->lock);
358334

359335
if (ret)
360336
ret += sysfs_emit_at(buf, ret, "\n");
361-
362337
return ret;
363338
}
364339
IRQ_ATTR_RO(actions);
@@ -414,19 +389,14 @@ static int __init irq_sysfs_init(void)
414389
int irq;
415390

416391
/* Prevent concurrent irq alloc/free */
417-
irq_lock_sparse();
418-
392+
guard(mutex)(&sparse_irq_lock);
419393
irq_kobj_base = kobject_create_and_add("irq", kernel_kobj);
420-
if (!irq_kobj_base) {
421-
irq_unlock_sparse();
394+
if (!irq_kobj_base)
422395
return -ENOMEM;
423-
}
424396

425397
/* Add the already allocated interrupts */
426398
for_each_irq_desc(irq, desc)
427399
irq_sysfs_add(irq, desc);
428-
irq_unlock_sparse();
429-
430400
return 0;
431401
}
432402
postcore_initcall(irq_sysfs_init);
@@ -569,12 +539,12 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node,
569539
return -ENOMEM;
570540
}
571541

572-
static int irq_expand_nr_irqs(unsigned int nr)
542+
static bool irq_expand_nr_irqs(unsigned int nr)
573543
{
574544
if (nr > MAX_SPARSE_IRQS)
575-
return -ENOMEM;
545+
return false;
576546
nr_irqs = nr;
577-
return 0;
547+
return true;
578548
}
579549

580550
int __init early_irq_init(void)
@@ -652,11 +622,9 @@ EXPORT_SYMBOL(irq_to_desc);
652622
static void free_desc(unsigned int irq)
653623
{
654624
struct irq_desc *desc = irq_to_desc(irq);
655-
unsigned long flags;
656625

657-
raw_spin_lock_irqsave(&desc->lock, flags);
658-
desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL, NULL);
659-
raw_spin_unlock_irqrestore(&desc->lock, flags);
626+
scoped_guard(raw_spinlock_irqsave, &desc->lock)
627+
desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL, NULL);
660628
delete_irq_desc(irq);
661629
}
662630

@@ -675,16 +643,15 @@ static inline int alloc_descs(unsigned int start, unsigned int cnt, int node,
675643
return start;
676644
}
677645

678-
static int irq_expand_nr_irqs(unsigned int nr)
646+
static inline bool irq_expand_nr_irqs(unsigned int nr)
679647
{
680-
return -ENOMEM;
648+
return false;
681649
}
682650

683651
void irq_mark_irq(unsigned int irq)
684652
{
685-
mutex_lock(&sparse_irq_lock);
653+
guard(mutex)(&sparse_irq_lock);
686654
irq_insert_desc(irq, irq_desc + irq);
687-
mutex_unlock(&sparse_irq_lock);
688655
}
689656

690657
#ifdef CONFIG_GENERIC_IRQ_LEGACY
@@ -823,11 +790,9 @@ void irq_free_descs(unsigned int from, unsigned int cnt)
823790
if (from >= nr_irqs || (from + cnt) > nr_irqs)
824791
return;
825792

826-
mutex_lock(&sparse_irq_lock);
793+
guard(mutex)(&sparse_irq_lock);
827794
for (i = 0; i < cnt; i++)
828795
free_desc(from + i);
829-
830-
mutex_unlock(&sparse_irq_lock);
831796
}
832797
EXPORT_SYMBOL_GPL(irq_free_descs);
833798

@@ -844,11 +809,10 @@ EXPORT_SYMBOL_GPL(irq_free_descs);
844809
*
845810
* Returns the first irq number or error code
846811
*/
847-
int __ref
848-
__irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
849-
struct module *owner, const struct irq_affinity_desc *affinity)
812+
int __ref __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
813+
struct module *owner, const struct irq_affinity_desc *affinity)
850814
{
851-
int start, ret;
815+
int start;
852816

853817
if (!cnt)
854818
return -EINVAL;
@@ -866,22 +830,17 @@ __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
866830
from = arch_dynirq_lower_bound(from);
867831
}
868832

869-
mutex_lock(&sparse_irq_lock);
833+
guard(mutex)(&sparse_irq_lock);
870834

871835
start = irq_find_free_area(from, cnt);
872-
ret = -EEXIST;
873836
if (irq >=0 && start != irq)
874-
goto unlock;
837+
return -EEXIST;
875838

876839
if (start + cnt > nr_irqs) {
877-
ret = irq_expand_nr_irqs(start + cnt);
878-
if (ret)
879-
goto unlock;
840+
if (!irq_expand_nr_irqs(start + cnt))
841+
return -ENOMEM;
880842
}
881-
ret = alloc_descs(start, cnt, node, affinity, owner);
882-
unlock:
883-
mutex_unlock(&sparse_irq_lock);
884-
return ret;
843+
return alloc_descs(start, cnt, node, affinity, owner);
885844
}
886845
EXPORT_SYMBOL_GPL(__irq_alloc_descs);
887846

0 commit comments

Comments
 (0)