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 {  	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);  } | 

