aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/irq.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-09 01:44:43 -0400
committerHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-09 02:57:32 -0400
commit9e75c6274a7365ad493fc3e75c8dd35f0185b7ca (patch)
tree4229e4b0f1295df570a5bad2de0af285753836b5 /arch/s390/kernel/irq.c
parent2ec7f4aec4d459ef443151ecc875bfbb3a2788f8 (diff)
s390/irq: reduce size of external interrupt handler hash array
Change the hash algorithm a bit so it produces only values in the range of 0..31. This allows to reduce the size of the external interrupt handler hash array even further while making sure that each of the known interrupt sources keeps its unique hash with the slightly modified algorithm: 0x1004 --> 12 0x1201 --> 10 0x1202 --> 11 0x1406 --> 16 0x1407 --> 17 0x2401 --> 19 0x2603 --> 22 0x4000 --> 0 This also means that the entire array now fits into exactly one cache line; so add a proper align statement as well. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/irq.c')
-rw-r--r--arch/s390/kernel/irq.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
index 6eba6fd8a8ec..8ac2097f13d4 100644
--- a/arch/s390/kernel/irq.c
+++ b/arch/s390/kernel/irq.c
@@ -196,7 +196,7 @@ asmlinkage void do_softirq(void)
196 * ext_int_hash[index] is the list head for all external interrupts that hash 196 * ext_int_hash[index] is the list head for all external interrupts that hash
197 * to this index. 197 * to this index.
198 */ 198 */
199static struct hlist_head ext_int_hash[256]; 199static struct hlist_head ext_int_hash[32] ____cacheline_aligned;
200 200
201struct ext_int_info { 201struct ext_int_info {
202 ext_int_handler_t handler; 202 ext_int_handler_t handler;
@@ -210,7 +210,9 @@ static DEFINE_SPINLOCK(ext_int_hash_lock);
210 210
211static inline int ext_hash(u16 code) 211static inline int ext_hash(u16 code)
212{ 212{
213 return (code + (code >> 9)) & 0xff; 213 BUILD_BUG_ON(!is_power_of_2(ARRAY_SIZE(ext_int_hash)));
214
215 return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1);
214} 216}
215 217
216int register_external_interrupt(u16 code, ext_int_handler_t handler) 218int register_external_interrupt(u16 code, ext_int_handler_t handler)