summaryrefslogtreecommitdiffstats
path: root/arch/s390/pci/pci_msi.c
diff options
context:
space:
mode:
authorSebastian Ott2013-04-16 14:05:47 +0200
committerMartin Schwidefsky2013-04-17 14:07:35 +0200
commitea793788f8ec868e655920f4726b2bd6a881e5ae (patch)
treef61e43b7f70b9ad9c332b3b529604cdb86fed75c /arch/s390/pci/pci_msi.c
parents390/signal: Add BEA to compat signal handler parameters (diff)
downloadkernel-qcow2-linux-ea793788f8ec868e655920f4726b2bd6a881e5ae.tar.gz
kernel-qcow2-linux-ea793788f8ec868e655920f4726b2bd6a881e5ae.tar.xz
kernel-qcow2-linux-ea793788f8ec868e655920f4726b2bd6a881e5ae.zip
s390/pci: msi cleanup hash usage
The hash used for mapping irq numbers to msi descriptors does not utilize all buckets that were allocated. Fix this by using the same value (computed by the number of bits used for the hash function) at relevant places. Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/pci/pci_msi.c')
-rw-r--r--arch/s390/pci/pci_msi.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/s390/pci/pci_msi.c b/arch/s390/pci/pci_msi.c
index 0297931335e1..b097aed05a9b 100644
--- a/arch/s390/pci/pci_msi.c
+++ b/arch/s390/pci/pci_msi.c
@@ -18,8 +18,9 @@
/* mapping of irq numbers to msi_desc */
static struct hlist_head *msi_hash;
-static unsigned int msihash_shift = 6;
-#define msi_hashfn(nr) hash_long(nr, msihash_shift)
+static const unsigned int msi_hash_bits = 8;
+#define MSI_HASH_BUCKETS (1U << msi_hash_bits)
+#define msi_hashfn(nr) hash_long(nr, msi_hash_bits)
static DEFINE_SPINLOCK(msi_map_lock);
@@ -74,6 +75,7 @@ int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi,
map->irq = nr;
map->msi = msi;
zdev->msi_map[nr & ZPCI_MSI_MASK] = map;
+ INIT_HLIST_NODE(&map->msi_chain);
pr_debug("%s hashing irq: %u to bucket nr: %llu\n",
__func__, nr, msi_hashfn(nr));
@@ -125,11 +127,11 @@ int __init zpci_msihash_init(void)
{
unsigned int i;
- msi_hash = kmalloc(256 * sizeof(*msi_hash), GFP_KERNEL);
+ msi_hash = kmalloc(MSI_HASH_BUCKETS * sizeof(*msi_hash), GFP_KERNEL);
if (!msi_hash)
return -ENOMEM;
- for (i = 0; i < (1U << msihash_shift); i++)
+ for (i = 0; i < MSI_HASH_BUCKETS; i++)
INIT_HLIST_HEAD(&msi_hash[i]);
return 0;
}