108
108
#define DBG (fmt ...)
109
109
#endif
110
110
111
- #define NR_PREALLOCATE_RTE_ENTRIES \
112
- (PAGE_SIZE / sizeof(struct iosapic_rte_info))
113
- #define RTE_PREALLOCATED (1)
114
-
115
111
static DEFINE_SPINLOCK (iosapic_lock );
116
112
117
113
/*
@@ -136,7 +132,6 @@ struct iosapic_rte_info {
136
132
struct list_head rte_list ; /* RTEs sharing the same vector */
137
133
char rte_index ; /* IOSAPIC RTE index */
138
134
int refcnt ; /* reference counter */
139
- unsigned int flags ; /* flags */
140
135
struct iosapic * iosapic ;
141
136
} ____cacheline_aligned ;
142
137
@@ -155,9 +150,6 @@ static struct iosapic_intr_info {
155
150
156
151
static unsigned char pcat_compat __devinitdata ; /* 8259 compatibility flag */
157
152
158
- static int iosapic_kmalloc_ok ;
159
- static LIST_HEAD (free_rte_list );
160
-
161
153
static inline void
162
154
iosapic_write (struct iosapic * iosapic , unsigned int reg , u32 val )
163
155
{
@@ -394,7 +386,7 @@ iosapic_startup_level_irq (unsigned int irq)
394
386
}
395
387
396
388
static void
397
- iosapic_end_level_irq (unsigned int irq )
389
+ iosapic_unmask_level_irq (unsigned int irq )
398
390
{
399
391
ia64_vector vec = irq_to_vector (irq );
400
392
struct iosapic_rte_info * rte ;
@@ -404,7 +396,8 @@ iosapic_end_level_irq (unsigned int irq)
404
396
if (unlikely (irq_desc [irq ].status & IRQ_MOVE_PENDING )) {
405
397
do_unmask_irq = 1 ;
406
398
mask_irq (irq );
407
- }
399
+ } else
400
+ unmask_irq (irq );
408
401
409
402
list_for_each_entry (rte , & iosapic_intr_info [irq ].rtes , rte_list )
410
403
iosapic_eoi (rte -> iosapic -> addr , vec );
@@ -427,9 +420,8 @@ static struct irq_chip irq_type_iosapic_level = {
427
420
.enable = iosapic_enable_level_irq ,
428
421
.disable = iosapic_disable_level_irq ,
429
422
.ack = iosapic_ack_level_irq ,
430
- .end = iosapic_end_level_irq ,
431
423
.mask = mask_irq ,
432
- .unmask = unmask_irq ,
424
+ .unmask = iosapic_unmask_level_irq ,
433
425
.set_affinity = iosapic_set_affinity
434
426
};
435
427
@@ -552,37 +544,6 @@ iosapic_reassign_vector (int irq)
552
544
}
553
545
}
554
546
555
- static struct iosapic_rte_info * __init_refok iosapic_alloc_rte (void )
556
- {
557
- int i ;
558
- struct iosapic_rte_info * rte ;
559
- int preallocated = 0 ;
560
-
561
- if (!iosapic_kmalloc_ok && list_empty (& free_rte_list )) {
562
- rte = alloc_bootmem (sizeof (struct iosapic_rte_info ) *
563
- NR_PREALLOCATE_RTE_ENTRIES );
564
- for (i = 0 ; i < NR_PREALLOCATE_RTE_ENTRIES ; i ++ , rte ++ )
565
- list_add (& rte -> rte_list , & free_rte_list );
566
- }
567
-
568
- if (!list_empty (& free_rte_list )) {
569
- rte = list_entry (free_rte_list .next , struct iosapic_rte_info ,
570
- rte_list );
571
- list_del (& rte -> rte_list );
572
- preallocated ++ ;
573
- } else {
574
- rte = kmalloc (sizeof (struct iosapic_rte_info ), GFP_ATOMIC );
575
- if (!rte )
576
- return NULL ;
577
- }
578
-
579
- memset (rte , 0 , sizeof (struct iosapic_rte_info ));
580
- if (preallocated )
581
- rte -> flags |= RTE_PREALLOCATED ;
582
-
583
- return rte ;
584
- }
585
-
586
547
static inline int irq_is_shared (int irq )
587
548
{
588
549
return (iosapic_intr_info [irq ].count > 1 );
@@ -615,7 +576,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
615
576
616
577
rte = find_rte (irq , gsi );
617
578
if (!rte ) {
618
- rte = iosapic_alloc_rte ( );
579
+ rte = kzalloc ( sizeof ( * rte ), GFP_ATOMIC );
619
580
if (!rte ) {
620
581
printk (KERN_WARNING "%s: cannot allocate memory\n" ,
621
582
__func__ );
@@ -658,6 +619,10 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
658
619
idesc -> chip -> name , irq_type -> name );
659
620
idesc -> chip = irq_type ;
660
621
}
622
+ if (trigger == IOSAPIC_EDGE )
623
+ __set_irq_handler_unlocked (irq , handle_edge_irq );
624
+ else
625
+ __set_irq_handler_unlocked (irq , handle_level_irq );
661
626
return 0 ;
662
627
}
663
628
@@ -1161,10 +1126,3 @@ map_iosapic_to_node(unsigned int gsi_base, int node)
1161
1126
return ;
1162
1127
}
1163
1128
#endif
1164
-
1165
- static int __init iosapic_enable_kmalloc (void )
1166
- {
1167
- iosapic_kmalloc_ok = 1 ;
1168
- return 0 ;
1169
- }
1170
- core_initcall (iosapic_enable_kmalloc );
0 commit comments