Skip to content

Commit

Permalink
s390/irq: reduce size of external interrupt handler hash array
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Heiko Carstens committed Sep 9, 2013
1 parent 2ec7f4a commit 9e75c62
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions arch/s390/kernel/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ asmlinkage void do_softirq(void)
* ext_int_hash[index] is the list head for all external interrupts that hash
* to this index.
*/
static struct hlist_head ext_int_hash[256];
static struct hlist_head ext_int_hash[32] ____cacheline_aligned;

struct ext_int_info {
ext_int_handler_t handler;
Expand All @@ -210,7 +210,9 @@ static DEFINE_SPINLOCK(ext_int_hash_lock);

static inline int ext_hash(u16 code)
{
return (code + (code >> 9)) & 0xff;
BUILD_BUG_ON(!is_power_of_2(ARRAY_SIZE(ext_int_hash)));

return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1);
}

int register_external_interrupt(u16 code, ext_int_handler_t handler)
Expand Down

0 comments on commit 9e75c62

Please sign in to comment.