From: Matthew Wilcox Date: Tue, 12 Feb 2019 14:36:36 +0000 (-0500) Subject: irq: Convert timings to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=5c4d04492bd00b2ed6082aa27a24a70229964ecb;p=users%2Fwilly%2Fxarray.git irq: Convert timings to XArray Signed-off-by: Matthew Wilcox --- diff --git a/kernel/irq/timings.c b/kernel/irq/timings.c index e960d7ce7bcc..dc275f3a8be0 100644 --- a/kernel/irq/timings.c +++ b/kernel/irq/timings.c @@ -8,10 +8,10 @@ #include #include #include -#include #include #include #include +#include #include @@ -21,7 +21,7 @@ DEFINE_STATIC_KEY_FALSE(irq_timing_enabled); DEFINE_PER_CPU(struct irq_timings, irq_timings); -static DEFINE_IDR(irqt_stats); +static DEFINE_XARRAY(irqt_stats); void irq_timings_enable(void) { @@ -534,7 +534,8 @@ u64 irq_timings_next_event(u64 now) struct irqt_stat *irqs; struct irqt_stat __percpu *s; u64 ts, next_evt = U64_MAX; - int i, irq = 0; + unsigned long i; + int irq = 0; /* * This function must be called with the local irq disabled in @@ -562,7 +563,7 @@ u64 irq_timings_next_event(u64 now) */ for_each_irqts(i, irqts) { irq = irq_timing_decode(irqts->values[i], &ts); - s = idr_find(&irqt_stats, irq); + s = xa_load(&irqt_stats, irq); if (s) irq_timings_store(irq, this_cpu_ptr(s), ts); } @@ -571,8 +572,7 @@ u64 irq_timings_next_event(u64 now) * Look in the list of interrupts' statistics, the earliest * next event. */ - idr_for_each_entry(&irqt_stats, s, i) { - + xa_for_each(&irqt_stats, i, s) { irqs = this_cpu_ptr(s); ts = __irq_timings_next_event(irqs, i, now); @@ -590,10 +590,9 @@ void irq_timings_free(int irq) { struct irqt_stat __percpu *s; - s = idr_find(&irqt_stats, irq); + s = xa_erase(&irqt_stats, irq); if (s) { free_percpu(s); - idr_remove(&irqt_stats, irq); } } @@ -608,7 +607,7 @@ int irq_timings_alloc(int irq) * same interrupt number. Just bail out in case the per cpu * stat structure is already allocated. */ - s = idr_find(&irqt_stats, irq); + s = xa_load(&irqt_stats, irq); if (s) return 0; @@ -616,10 +615,7 @@ int irq_timings_alloc(int irq) if (!s) return -ENOMEM; - idr_preload(GFP_KERNEL); - id = idr_alloc(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT); - idr_preload_end(); - + id = xa_insert(&irqt_stats, irq, s, GFP_KERNEL); if (id < 0) { free_percpu(s); return id; @@ -778,7 +774,7 @@ static int __init irq_timings_test_irqs(struct timings_intervals *ti) return ret; } - s = idr_find(&irqt_stats, irq); + s = xa_load(&irqt_stats, irq); if (!s) { ret = -EIDRM; goto out;