diff options
| author | Jack Morgenstein <jackm@mellanox.co.il> | 2006-06-17 23:37:34 -0400 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2006-06-17 23:37:34 -0400 |
| commit | 6fb9cdbf2cdb2ea187e57ec2e16cc59df2adf86a (patch) | |
| tree | 329eb272835bd3105696ddbc60cdaea971aa2a6e | |
| parent | 856c256f883f027a14b546164294b4a86fea81a4 (diff) | |
IB: Add caching of ports' LMC
Add an LMC cache to struct ib_device, and add a function
ib_get_cached_lmc() to query the cache.
Signed-off-by: Jack Morgenstein <jackm@mellanox.co.il>
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/core/cache.c | 30 | ||||
| -rw-r--r-- | include/rdma/ib_cache.h | 13 | ||||
| -rw-r--r-- | include/rdma/ib_verbs.h | 1 |
3 files changed, 43 insertions, 1 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 50364c0b090c..e05ca2cdc73f 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
| @@ -191,6 +191,24 @@ int ib_find_cached_pkey(struct ib_device *device, | |||
| 191 | } | 191 | } |
| 192 | EXPORT_SYMBOL(ib_find_cached_pkey); | 192 | EXPORT_SYMBOL(ib_find_cached_pkey); |
| 193 | 193 | ||
| 194 | int ib_get_cached_lmc(struct ib_device *device, | ||
| 195 | u8 port_num, | ||
| 196 | u8 *lmc) | ||
| 197 | { | ||
| 198 | unsigned long flags; | ||
| 199 | int ret = 0; | ||
| 200 | |||
| 201 | if (port_num < start_port(device) || port_num > end_port(device)) | ||
| 202 | return -EINVAL; | ||
| 203 | |||
| 204 | read_lock_irqsave(&device->cache.lock, flags); | ||
| 205 | *lmc = device->cache.lmc_cache[port_num - start_port(device)]; | ||
| 206 | read_unlock_irqrestore(&device->cache.lock, flags); | ||
| 207 | |||
| 208 | return ret; | ||
| 209 | } | ||
| 210 | EXPORT_SYMBOL(ib_get_cached_lmc); | ||
| 211 | |||
| 194 | static void ib_cache_update(struct ib_device *device, | 212 | static void ib_cache_update(struct ib_device *device, |
| 195 | u8 port) | 213 | u8 port) |
| 196 | { | 214 | { |
| @@ -251,6 +269,8 @@ static void ib_cache_update(struct ib_device *device, | |||
| 251 | device->cache.pkey_cache[port - start_port(device)] = pkey_cache; | 269 | device->cache.pkey_cache[port - start_port(device)] = pkey_cache; |
| 252 | device->cache.gid_cache [port - start_port(device)] = gid_cache; | 270 | device->cache.gid_cache [port - start_port(device)] = gid_cache; |
| 253 | 271 | ||
| 272 | device->cache.lmc_cache[port - start_port(device)] = tprops->lmc; | ||
| 273 | |||
| 254 | write_unlock_irq(&device->cache.lock); | 274 | write_unlock_irq(&device->cache.lock); |
| 255 | 275 | ||
| 256 | kfree(old_pkey_cache); | 276 | kfree(old_pkey_cache); |
| @@ -305,7 +325,13 @@ static void ib_cache_setup_one(struct ib_device *device) | |||
| 305 | kmalloc(sizeof *device->cache.gid_cache * | 325 | kmalloc(sizeof *device->cache.gid_cache * |
| 306 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); | 326 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); |
| 307 | 327 | ||
| 308 | if (!device->cache.pkey_cache || !device->cache.gid_cache) { | 328 | device->cache.lmc_cache = kmalloc(sizeof *device->cache.lmc_cache * |
| 329 | (end_port(device) - | ||
| 330 | start_port(device) + 1), | ||
| 331 | GFP_KERNEL); | ||
| 332 | |||
| 333 | if (!device->cache.pkey_cache || !device->cache.gid_cache || | ||
| 334 | !device->cache.lmc_cache) { | ||
| 309 | printk(KERN_WARNING "Couldn't allocate cache " | 335 | printk(KERN_WARNING "Couldn't allocate cache " |
| 310 | "for %s\n", device->name); | 336 | "for %s\n", device->name); |
| 311 | goto err; | 337 | goto err; |
| @@ -333,6 +359,7 @@ err_cache: | |||
| 333 | err: | 359 | err: |
| 334 | kfree(device->cache.pkey_cache); | 360 | kfree(device->cache.pkey_cache); |
| 335 | kfree(device->cache.gid_cache); | 361 | kfree(device->cache.gid_cache); |
| 362 | kfree(device->cache.lmc_cache); | ||
| 336 | } | 363 | } |
| 337 | 364 | ||
| 338 | static void ib_cache_cleanup_one(struct ib_device *device) | 365 | static void ib_cache_cleanup_one(struct ib_device *device) |
| @@ -349,6 +376,7 @@ static void ib_cache_cleanup_one(struct ib_device *device) | |||
| 349 | 376 | ||
| 350 | kfree(device->cache.pkey_cache); | 377 | kfree(device->cache.pkey_cache); |
| 351 | kfree(device->cache.gid_cache); | 378 | kfree(device->cache.gid_cache); |
| 379 | kfree(device->cache.lmc_cache); | ||
| 352 | } | 380 | } |
| 353 | 381 | ||
| 354 | static struct ib_client cache_client = { | 382 | static struct ib_client cache_client = { |
diff --git a/include/rdma/ib_cache.h b/include/rdma/ib_cache.h index 5bf9834f7dca..f179d233ffc3 100644 --- a/include/rdma/ib_cache.h +++ b/include/rdma/ib_cache.h | |||
| @@ -102,4 +102,17 @@ int ib_find_cached_pkey(struct ib_device *device, | |||
| 102 | u16 pkey, | 102 | u16 pkey, |
| 103 | u16 *index); | 103 | u16 *index); |
| 104 | 104 | ||
| 105 | /** | ||
| 106 | * ib_get_cached_lmc - Returns a cached lmc table entry | ||
| 107 | * @device: The device to query. | ||
| 108 | * @port_num: The port number of the device to query. | ||
| 109 | * @lmc: The lmc value for the specified port for that device. | ||
| 110 | * | ||
| 111 | * ib_get_cached_lmc() fetches the specified lmc table entry stored in | ||
| 112 | * the local software cache. | ||
| 113 | */ | ||
| 114 | int ib_get_cached_lmc(struct ib_device *device, | ||
| 115 | u8 port_num, | ||
| 116 | u8 *lmc); | ||
| 117 | |||
| 105 | #endif /* _IB_CACHE_H */ | 118 | #endif /* _IB_CACHE_H */ |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 6bbf1b364400..aeb4fcd86a9e 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
| @@ -827,6 +827,7 @@ struct ib_cache { | |||
| 827 | struct ib_event_handler event_handler; | 827 | struct ib_event_handler event_handler; |
| 828 | struct ib_pkey_cache **pkey_cache; | 828 | struct ib_pkey_cache **pkey_cache; |
| 829 | struct ib_gid_cache **gid_cache; | 829 | struct ib_gid_cache **gid_cache; |
| 830 | u8 *lmc_cache; | ||
| 830 | }; | 831 | }; |
| 831 | 832 | ||
| 832 | struct ib_device { | 833 | struct ib_device { |
