12
12
#include <linux/export.h>
13
13
#include <linux/interrupt.h>
14
14
#include <linux/kernel_stat.h>
15
- #include <linux/radix-tree.h>
16
- #include <linux/bitmap.h>
15
+ #include <linux/maple_tree.h>
17
16
#include <linux/irqdomain.h>
18
17
#include <linux/sysfs.h>
19
18
@@ -131,17 +130,39 @@ int nr_irqs = NR_IRQS;
131
130
EXPORT_SYMBOL_GPL (nr_irqs );
132
131
133
132
static DEFINE_MUTEX (sparse_irq_lock );
134
- static DECLARE_BITMAP (allocated_irqs , MAX_SPARSE_IRQS ) ;
133
+ static struct maple_tree sparse_irqs = MTREE_INIT_EXT (sparse_irqs ,
134
+ MT_FLAGS_ALLOC_RANGE |
135
+ MT_FLAGS_LOCK_EXTERN |
136
+ MT_FLAGS_USE_RCU ,
137
+ sparse_irq_lock );
135
138
136
139
static int irq_find_free_area (unsigned int from , unsigned int cnt )
137
140
{
138
- return bitmap_find_next_zero_area (allocated_irqs , MAX_SPARSE_IRQS ,
139
- from , cnt , 0 );
141
+ MA_STATE (mas , & sparse_irqs , 0 , 0 );
142
+
143
+ if (mas_empty_area (& mas , from , MAX_SPARSE_IRQS , cnt ))
144
+ return - ENOSPC ;
145
+ return mas .index ;
140
146
}
141
147
142
148
static unsigned int irq_find_at_or_after (unsigned int offset )
143
149
{
144
- return find_next_bit (allocated_irqs , nr_irqs , offset );
150
+ unsigned long index = offset ;
151
+ struct irq_desc * desc = mt_find (& sparse_irqs , & index , nr_irqs );
152
+
153
+ return desc ? irq_desc_get_irq (desc ) : nr_irqs ;
154
+ }
155
+
156
+ static void irq_insert_desc (unsigned int irq , struct irq_desc * desc )
157
+ {
158
+ MA_STATE (mas , & sparse_irqs , irq , irq );
159
+ WARN_ON (mas_store_gfp (& mas , desc , GFP_KERNEL ) != 0 );
160
+ }
161
+
162
+ static void delete_irq_desc (unsigned int irq )
163
+ {
164
+ MA_STATE (mas , & sparse_irqs , irq , irq );
165
+ mas_erase (& mas );
145
166
}
146
167
147
168
#ifdef CONFIG_SPARSE_IRQ
@@ -355,26 +376,14 @@ static void irq_sysfs_del(struct irq_desc *desc) {}
355
376
356
377
#endif /* CONFIG_SYSFS */
357
378
358
- static RADIX_TREE (irq_desc_tree , GFP_KERNEL ) ;
359
-
360
- static void irq_insert_desc (unsigned int irq , struct irq_desc * desc )
361
- {
362
- radix_tree_insert (& irq_desc_tree , irq , desc );
363
- }
364
-
365
379
struct irq_desc * irq_to_desc (unsigned int irq )
366
380
{
367
- return radix_tree_lookup ( & irq_desc_tree , irq );
381
+ return mtree_load ( & sparse_irqs , irq );
368
382
}
369
383
#ifdef CONFIG_KVM_BOOK3S_64_HV_MODULE
370
384
EXPORT_SYMBOL_GPL (irq_to_desc );
371
385
#endif
372
386
373
- static void delete_irq_desc (unsigned int irq )
374
- {
375
- radix_tree_delete (& irq_desc_tree , irq );
376
- }
377
-
378
387
#ifdef CONFIG_SMP
379
388
static void free_masks (struct irq_desc * desc )
380
389
{
@@ -517,7 +526,6 @@ static int alloc_descs(unsigned int start, unsigned int cnt, int node,
517
526
irq_sysfs_add (start + i , desc );
518
527
irq_add_debugfs_entry (start + i , desc );
519
528
}
520
- bitmap_set (allocated_irqs , start , cnt );
521
529
return start ;
522
530
523
531
err :
@@ -557,7 +565,6 @@ int __init early_irq_init(void)
557
565
558
566
for (i = 0 ; i < initcnt ; i ++ ) {
559
567
desc = alloc_desc (i , node , 0 , NULL , NULL );
560
- set_bit (i , allocated_irqs );
561
568
irq_insert_desc (i , desc );
562
569
}
563
570
return arch_early_irq_init ();
@@ -612,6 +619,7 @@ static void free_desc(unsigned int irq)
612
619
raw_spin_lock_irqsave (& desc -> lock , flags );
613
620
desc_set_defaults (irq , desc , irq_desc_get_node (desc ), NULL , NULL );
614
621
raw_spin_unlock_irqrestore (& desc -> lock , flags );
622
+ delete_irq_desc (irq );
615
623
}
616
624
617
625
static inline int alloc_descs (unsigned int start , unsigned int cnt , int node ,
@@ -624,8 +632,8 @@ static inline int alloc_descs(unsigned int start, unsigned int cnt, int node,
624
632
struct irq_desc * desc = irq_to_desc (start + i );
625
633
626
634
desc -> owner = owner ;
635
+ irq_insert_desc (start + i , desc );
627
636
}
628
- bitmap_set (allocated_irqs , start , cnt );
629
637
return start ;
630
638
}
631
639
@@ -637,7 +645,7 @@ static int irq_expand_nr_irqs(unsigned int nr)
637
645
void irq_mark_irq (unsigned int irq )
638
646
{
639
647
mutex_lock (& sparse_irq_lock );
640
- bitmap_set ( allocated_irqs , irq , 1 );
648
+ irq_insert_desc ( irq , irq_desc + irq );
641
649
mutex_unlock (& sparse_irq_lock );
642
650
}
643
651
@@ -781,7 +789,6 @@ void irq_free_descs(unsigned int from, unsigned int cnt)
781
789
for (i = 0 ; i < cnt ; i ++ )
782
790
free_desc (from + i );
783
791
784
- bitmap_clear (allocated_irqs , from , cnt );
785
792
mutex_unlock (& sparse_irq_lock );
786
793
}
787
794
EXPORT_SYMBOL_GPL (irq_free_descs );
@@ -844,7 +851,7 @@ EXPORT_SYMBOL_GPL(__irq_alloc_descs);
844
851
* irq_get_next_irq - get next allocated irq number
845
852
* @offset: where to start the search
846
853
*
847
- * Returns next irq number at or after offset or nr_irqs if none is found.
854
+ * Returns next irq number after offset or nr_irqs if none is found.
848
855
*/
849
856
unsigned int irq_get_next_irq (unsigned int offset )
850
857
{
0 commit comments