diff options
Diffstat (limited to 'kernel/irq/matrix.c')
-rw-r--r-- | kernel/irq/matrix.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 5187dfe809ac..4c5770407031 100644 --- a/kernel/irq/matrix.c +++ b/kernel/irq/matrix.c | |||
@@ -16,6 +16,7 @@ struct cpumap { | |||
16 | unsigned int available; | 16 | unsigned int available; |
17 | unsigned int allocated; | 17 | unsigned int allocated; |
18 | unsigned int managed; | 18 | unsigned int managed; |
19 | bool initialized; | ||
19 | bool online; | 20 | bool online; |
20 | unsigned long alloc_map[IRQ_MATRIX_SIZE]; | 21 | unsigned long alloc_map[IRQ_MATRIX_SIZE]; |
21 | unsigned long managed_map[IRQ_MATRIX_SIZE]; | 22 | unsigned long managed_map[IRQ_MATRIX_SIZE]; |
@@ -81,9 +82,11 @@ void irq_matrix_online(struct irq_matrix *m) | |||
81 | 82 | ||
82 | BUG_ON(cm->online); | 83 | BUG_ON(cm->online); |
83 | 84 | ||
84 | bitmap_zero(cm->alloc_map, m->matrix_bits); | 85 | if (!cm->initialized) { |
85 | cm->available = m->alloc_size - (cm->managed + m->systembits_inalloc); | 86 | cm->available = m->alloc_size; |
86 | cm->allocated = 0; | 87 | cm->available -= cm->managed + m->systembits_inalloc; |
88 | cm->initialized = true; | ||
89 | } | ||
87 | m->global_available += cm->available; | 90 | m->global_available += cm->available; |
88 | cm->online = true; | 91 | cm->online = true; |
89 | m->online_maps++; | 92 | m->online_maps++; |
@@ -370,14 +373,16 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu, | |||
370 | if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end)) | 373 | if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end)) |
371 | return; | 374 | return; |
372 | 375 | ||
373 | if (cm->online) { | 376 | clear_bit(bit, cm->alloc_map); |
374 | clear_bit(bit, cm->alloc_map); | 377 | cm->allocated--; |
375 | cm->allocated--; | 378 | |
379 | if (cm->online) | ||
376 | m->total_allocated--; | 380 | m->total_allocated--; |
377 | if (!managed) { | 381 | |
378 | cm->available++; | 382 | if (!managed) { |
383 | cm->available++; | ||
384 | if (cm->online) | ||
379 | m->global_available++; | 385 | m->global_available++; |
380 | } | ||
381 | } | 386 | } |
382 | trace_irq_matrix_free(bit, cpu, m, cm); | 387 | trace_irq_matrix_free(bit, cpu, m, cm); |
383 | } | 388 | } |