Commit 6fb9cdbf authored by Jack Morgenstein's avatar Jack Morgenstein Committed by Roland Dreier

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: default avatarJack Morgenstein <jackm@mellanox.co.il>
Signed-off-by: default avatarSean Hefty <sean.hefty@intel.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 856c256f
...@@ -191,6 +191,24 @@ int ib_find_cached_pkey(struct ib_device *device, ...@@ -191,6 +191,24 @@ int ib_find_cached_pkey(struct ib_device *device,
} }
EXPORT_SYMBOL(ib_find_cached_pkey); EXPORT_SYMBOL(ib_find_cached_pkey);
int ib_get_cached_lmc(struct ib_device *device,
u8 port_num,
u8 *lmc)
{
unsigned long flags;
int ret = 0;
if (port_num < start_port(device) || port_num > end_port(device))
return -EINVAL;
read_lock_irqsave(&device->cache.lock, flags);
*lmc = device->cache.lmc_cache[port_num - start_port(device)];
read_unlock_irqrestore(&device->cache.lock, flags);
return ret;
}
EXPORT_SYMBOL(ib_get_cached_lmc);
static void ib_cache_update(struct ib_device *device, static void ib_cache_update(struct ib_device *device,
u8 port) u8 port)
{ {
...@@ -251,6 +269,8 @@ static void ib_cache_update(struct ib_device *device, ...@@ -251,6 +269,8 @@ static void ib_cache_update(struct ib_device *device,
device->cache.pkey_cache[port - start_port(device)] = pkey_cache; device->cache.pkey_cache[port - start_port(device)] = pkey_cache;
device->cache.gid_cache [port - start_port(device)] = gid_cache; device->cache.gid_cache [port - start_port(device)] = gid_cache;
device->cache.lmc_cache[port - start_port(device)] = tprops->lmc;
write_unlock_irq(&device->cache.lock); write_unlock_irq(&device->cache.lock);
kfree(old_pkey_cache); kfree(old_pkey_cache);
...@@ -305,7 +325,13 @@ static void ib_cache_setup_one(struct ib_device *device) ...@@ -305,7 +325,13 @@ static void ib_cache_setup_one(struct ib_device *device)
kmalloc(sizeof *device->cache.gid_cache * kmalloc(sizeof *device->cache.gid_cache *
(end_port(device) - start_port(device) + 1), GFP_KERNEL); (end_port(device) - start_port(device) + 1), GFP_KERNEL);
if (!device->cache.pkey_cache || !device->cache.gid_cache) { device->cache.lmc_cache = kmalloc(sizeof *device->cache.lmc_cache *
(end_port(device) -
start_port(device) + 1),
GFP_KERNEL);
if (!device->cache.pkey_cache || !device->cache.gid_cache ||
!device->cache.lmc_cache) {
printk(KERN_WARNING "Couldn't allocate cache " printk(KERN_WARNING "Couldn't allocate cache "
"for %s\n", device->name); "for %s\n", device->name);
goto err; goto err;
...@@ -333,6 +359,7 @@ err_cache: ...@@ -333,6 +359,7 @@ err_cache:
err: err:
kfree(device->cache.pkey_cache); kfree(device->cache.pkey_cache);
kfree(device->cache.gid_cache); kfree(device->cache.gid_cache);
kfree(device->cache.lmc_cache);
} }
static void ib_cache_cleanup_one(struct ib_device *device) 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,6 +376,7 @@ static void ib_cache_cleanup_one(struct ib_device *device)
kfree(device->cache.pkey_cache); kfree(device->cache.pkey_cache);
kfree(device->cache.gid_cache); kfree(device->cache.gid_cache);
kfree(device->cache.lmc_cache);
} }
static struct ib_client cache_client = { static struct ib_client cache_client = {
......
...@@ -102,4 +102,17 @@ int ib_find_cached_pkey(struct ib_device *device, ...@@ -102,4 +102,17 @@ int ib_find_cached_pkey(struct ib_device *device,
u16 pkey, u16 pkey,
u16 *index); u16 *index);
/**
* ib_get_cached_lmc - Returns a cached lmc table entry
* @device: The device to query.
* @port_num: The port number of the device to query.
* @lmc: The lmc value for the specified port for that device.
*
* ib_get_cached_lmc() fetches the specified lmc table entry stored in
* the local software cache.
*/
int ib_get_cached_lmc(struct ib_device *device,
u8 port_num,
u8 *lmc);
#endif /* _IB_CACHE_H */ #endif /* _IB_CACHE_H */
...@@ -827,6 +827,7 @@ struct ib_cache { ...@@ -827,6 +827,7 @@ struct ib_cache {
struct ib_event_handler event_handler; struct ib_event_handler event_handler;
struct ib_pkey_cache **pkey_cache; struct ib_pkey_cache **pkey_cache;
struct ib_gid_cache **gid_cache; struct ib_gid_cache **gid_cache;
u8 *lmc_cache;
}; };
struct ib_device { struct ib_device {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment