diff options
-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 { |