diff options
Diffstat (limited to 'drivers/infiniband/core')
| -rw-r--r-- | drivers/infiniband/core/cache.c | 30 | 
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 50364c0b090..e05ca2cdc73 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,  }  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,  			    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.gid_cache [port - start_port(device)] = gid_cache; +	device->cache.lmc_cache[port - start_port(device)] = tprops->lmc; +  	write_unlock_irq(&device->cache.lock);  	kfree(old_pkey_cache); @@ -305,7 +325,13 @@ static void ib_cache_setup_one(struct ib_device *device)  		kmalloc(sizeof *device->cache.gid_cache *  			(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 "  		       "for %s\n", device->name);  		goto err; @@ -333,6 +359,7 @@ err_cache:  err:  	kfree(device->cache.pkey_cache);  	kfree(device->cache.gid_cache); +	kfree(device->cache.lmc_cache);  }  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.gid_cache); +	kfree(device->cache.lmc_cache);  }  static struct ib_client cache_client = {  |