diff options
| -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 | } |
