summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Wang <jinpu.wang@profitbricks.com>2017-01-02 15:17:36 +0300
committerDoug Ledford <dledford@redhat.com>2017-01-13 06:59:55 +0300
commitaaaca121c7cf9217ab81d9db0a04835d52aabebe (patch)
treeefaef9192a68a244e50d44903a13d687df8c2ec2
parent27d41d29c7f093f6f77843624fbb080c1b4a8b9c (diff)
downloadlinux-aaaca121c7cf9217ab81d9db0a04835d52aabebe.tar.xz
RDMA/core: add port state cache
We need a port state cache in ib_core, later we will use in rdma_cm. Signed-off-by: Jack Wang <jinpu.wang@profitbricks.com> Reviewed-by: Michael Wang <yun.wang@profitbricks.com> Acked-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/core/cache.c10
-rw-r--r--include/rdma/ib_verbs.h1
2 files changed, 10 insertions, 1 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
index ae04826e82fc..87fd7c39fbc0 100644
--- a/drivers/infiniband/core/cache.c
+++ b/drivers/infiniband/core/cache.c
@@ -1105,6 +1105,8 @@ static void ib_cache_update(struct ib_device *device,
}
device->cache.lmc_cache[port - rdma_start_port(device)] = tprops->lmc;
+ device->cache.port_state_cache[port - rdma_start_port(device)] =
+ tprops->state;
write_unlock_irq(&device->cache.lock);
@@ -1164,7 +1166,11 @@ int ib_cache_setup_one(struct ib_device *device)
(rdma_end_port(device) -
rdma_start_port(device) + 1),
GFP_KERNEL);
- if (!device->cache.pkey_cache ||
+ device->cache.port_state_cache = kmalloc(sizeof *device->cache.port_state_cache *
+ (rdma_end_port(device) -
+ rdma_start_port(device) + 1),
+ GFP_KERNEL);
+ if (!device->cache.pkey_cache || !device->cache.port_state_cache ||
!device->cache.lmc_cache) {
err = -ENOMEM;
goto free;
@@ -1190,6 +1196,7 @@ err:
free:
kfree(device->cache.pkey_cache);
kfree(device->cache.lmc_cache);
+ kfree(device->cache.port_state_cache);
return err;
}
@@ -1211,6 +1218,7 @@ void ib_cache_release_one(struct ib_device *device)
gid_table_release_one(device);
kfree(device->cache.pkey_cache);
kfree(device->cache.lmc_cache);
+ kfree(device->cache.port_state_cache);
}
void ib_cache_cleanup_one(struct ib_device *device)
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 958a24d8fae7..fafa988e0e9a 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -1781,6 +1781,7 @@ struct ib_cache {
struct ib_pkey_cache **pkey_cache;
struct ib_gid_table **gid_cache;
u8 *lmc_cache;
+ enum ib_port_state *port_state_cache;
};
struct ib_dma_mapping_ops {