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>
This commit is contained in:
parent
856c256f88
commit
6fb9cdbf2c
@ -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,
|
|||||||
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)
|
|||||||
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:
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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 {
|
|||||||
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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user