|
@@ -16,6 +16,7 @@ struct cpumap {
|
|
|
unsigned int available;
|
|
|
unsigned int allocated;
|
|
|
unsigned int managed;
|
|
|
+ bool initialized;
|
|
|
bool online;
|
|
|
unsigned long alloc_map[IRQ_MATRIX_SIZE];
|
|
|
unsigned long managed_map[IRQ_MATRIX_SIZE];
|
|
@@ -81,9 +82,11 @@ void irq_matrix_online(struct irq_matrix *m)
|
|
|
|
|
|
BUG_ON(cm->online);
|
|
|
|
|
|
- bitmap_zero(cm->alloc_map, m->matrix_bits);
|
|
|
- cm->available = m->alloc_size - (cm->managed + m->systembits_inalloc);
|
|
|
- cm->allocated = 0;
|
|
|
+ if (!cm->initialized) {
|
|
|
+ cm->available = m->alloc_size;
|
|
|
+ cm->available -= cm->managed + m->systembits_inalloc;
|
|
|
+ cm->initialized = true;
|
|
|
+ }
|
|
|
m->global_available += cm->available;
|
|
|
cm->online = true;
|
|
|
m->online_maps++;
|
|
@@ -370,14 +373,16 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu,
|
|
|
if (WARN_ON_ONCE(bit < m->alloc_start || bit >= m->alloc_end))
|
|
|
return;
|
|
|
|
|
|
- if (cm->online) {
|
|
|
- clear_bit(bit, cm->alloc_map);
|
|
|
- cm->allocated--;
|
|
|
+ clear_bit(bit, cm->alloc_map);
|
|
|
+ cm->allocated--;
|
|
|
+
|
|
|
+ if (cm->online)
|
|
|
m->total_allocated--;
|
|
|
- if (!managed) {
|
|
|
- cm->available++;
|
|
|
+
|
|
|
+ if (!managed) {
|
|
|
+ cm->available++;
|
|
|
+ if (cm->online)
|
|
|
m->global_available++;
|
|
|
- }
|
|
|
}
|
|
|
trace_irq_matrix_free(bit, cpu, m, cm);
|
|
|
}
|