mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 16:12:02 +00:00
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>
This commit is contained in:
parent
2ec7f4aec4
commit
9e75c6274a
@ -196,7 +196,7 @@ asmlinkage void do_softirq(void)
|
|||||||
* ext_int_hash[index] is the list head for all external interrupts that hash
|
* ext_int_hash[index] is the list head for all external interrupts that hash
|
||||||
* to this index.
|
* 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 {
|
struct ext_int_info {
|
||||||
ext_int_handler_t handler;
|
ext_int_handler_t handler;
|
||||||
@ -210,7 +210,9 @@ static DEFINE_SPINLOCK(ext_int_hash_lock);
|
|||||||
|
|
||||||
static inline int ext_hash(u16 code)
|
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)
|
int register_external_interrupt(u16 code, ext_int_handler_t handler)
|
||||||
|
Loading…
Reference in New Issue
Block a user