summaryrefslogtreecommitdiffstats
path: root/arch/s390/pci/pci_msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/pci/pci_msi.c')
-rw-r--r--arch/s390/pci/pci_msi.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/arch/s390/pci/pci_msi.c b/arch/s390/pci/pci_msi.c
index b097aed..d4b480a 100644
--- a/arch/s390/pci/pci_msi.c
+++ b/arch/s390/pci/pci_msi.c
@@ -62,19 +62,15 @@ int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag)
}
int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi,
- unsigned int nr, int offset)
+ unsigned int nr, int offset)
{
struct msi_map *map;
struct msi_msg msg;
int rc;
- map = kmalloc(sizeof(*map), GFP_KERNEL);
- if (map == NULL)
- return -ENOMEM;
-
+ map = zdev->msi_map + (nr & ZPCI_MSI_VEC_MASK);
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",
@@ -86,8 +82,6 @@ int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi,
if (rc) {
spin_unlock(&msi_map_lock);
hlist_del_rcu(&map->msi_chain);
- kfree(map);
- zdev->msi_map[nr & ZPCI_MSI_MASK] = NULL;
return rc;
}
spin_unlock(&msi_map_lock);
@@ -101,20 +95,18 @@ int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi,
void zpci_teardown_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi)
{
- int irq = msi->irq & ZPCI_MSI_MASK;
+ int nr = msi->irq & ZPCI_MSI_VEC_MASK;
struct msi_map *map;
+ zpci_msi_set_mask_bits(msi, 1, 1);
msi->msg.address_lo = 0;
msi->msg.address_hi = 0;
msi->msg.data = 0;
msi->irq = 0;
- zpci_msi_set_mask_bits(msi, 1, 1);
spin_lock(&msi_map_lock);
- map = zdev->msi_map[irq];
+ map = zdev->msi_map + nr;
hlist_del_rcu(&map->msi_chain);
- kfree(map);
- zdev->msi_map[irq] = NULL;
spin_unlock(&msi_map_lock);
}
OpenPOWER on IntegriCloud