Commit 21d6454a authored by Jack Wang's avatar Jack Wang Committed by Doug Ledford

RDMA/core: create struct ib_port_cache

As Jason suggested, we have 4 elements for per port arrays,
it's better to have a separate structure to represent them.

It simplifies code a bit, ~ 30 lines of code less :)
Signed-off-by: default avatarJack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: default avatarMichael Wang <yun.wang@profitbricks.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent dfc0e555
...@@ -314,14 +314,13 @@ static void make_default_gid(struct net_device *dev, union ib_gid *gid) ...@@ -314,14 +314,13 @@ static void make_default_gid(struct net_device *dev, union ib_gid *gid)
int ib_cache_gid_add(struct ib_device *ib_dev, u8 port, int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
union ib_gid *gid, struct ib_gid_attr *attr) union ib_gid *gid, struct ib_gid_attr *attr)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
int ix; int ix;
int ret = 0; int ret = 0;
struct net_device *idev; struct net_device *idev;
int empty; int empty;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
if (!memcmp(gid, &zgid, sizeof(*gid))) if (!memcmp(gid, &zgid, sizeof(*gid)))
return -EINVAL; return -EINVAL;
...@@ -369,11 +368,10 @@ int ib_cache_gid_add(struct ib_device *ib_dev, u8 port, ...@@ -369,11 +368,10 @@ int ib_cache_gid_add(struct ib_device *ib_dev, u8 port,
int ib_cache_gid_del(struct ib_device *ib_dev, u8 port, int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
union ib_gid *gid, struct ib_gid_attr *attr) union ib_gid *gid, struct ib_gid_attr *attr)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
int ix; int ix;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
mutex_lock(&table->lock); mutex_lock(&table->lock);
write_lock_irq(&table->rwlock); write_lock_irq(&table->rwlock);
...@@ -399,12 +397,11 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port, ...@@ -399,12 +397,11 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port,
int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port, int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
struct net_device *ndev) struct net_device *ndev)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
int ix; int ix;
bool deleted = false; bool deleted = false;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
mutex_lock(&table->lock); mutex_lock(&table->lock);
write_lock_irq(&table->rwlock); write_lock_irq(&table->rwlock);
...@@ -428,10 +425,9 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port, ...@@ -428,10 +425,9 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port,
static int __ib_cache_gid_get(struct ib_device *ib_dev, u8 port, int index, static int __ib_cache_gid_get(struct ib_device *ib_dev, u8 port, int index,
union ib_gid *gid, struct ib_gid_attr *attr) union ib_gid *gid, struct ib_gid_attr *attr)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
if (index < 0 || index >= table->sz) if (index < 0 || index >= table->sz)
return -EINVAL; return -EINVAL;
...@@ -455,14 +451,13 @@ static int _ib_cache_gid_table_find(struct ib_device *ib_dev, ...@@ -455,14 +451,13 @@ static int _ib_cache_gid_table_find(struct ib_device *ib_dev,
unsigned long mask, unsigned long mask,
u8 *port, u16 *index) u8 *port, u16 *index)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
u8 p; u8 p;
int local_index; int local_index;
unsigned long flags; unsigned long flags;
for (p = 0; p < ib_dev->phys_port_cnt; p++) { for (p = 0; p < ib_dev->phys_port_cnt; p++) {
table = ports_table[p]; table = ib_dev->cache.ports[p].gid;
read_lock_irqsave(&table->rwlock, flags); read_lock_irqsave(&table->rwlock, flags);
local_index = find_gid(table, gid, val, false, mask, NULL); local_index = find_gid(table, gid, val, false, mask, NULL);
if (local_index >= 0) { if (local_index >= 0) {
...@@ -503,7 +498,6 @@ int ib_find_cached_gid_by_port(struct ib_device *ib_dev, ...@@ -503,7 +498,6 @@ int ib_find_cached_gid_by_port(struct ib_device *ib_dev,
u16 *index) u16 *index)
{ {
int local_index; int local_index;
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
unsigned long mask = GID_ATTR_FIND_MASK_GID | unsigned long mask = GID_ATTR_FIND_MASK_GID |
GID_ATTR_FIND_MASK_GID_TYPE; GID_ATTR_FIND_MASK_GID_TYPE;
...@@ -514,7 +508,7 @@ int ib_find_cached_gid_by_port(struct ib_device *ib_dev, ...@@ -514,7 +508,7 @@ int ib_find_cached_gid_by_port(struct ib_device *ib_dev,
port > rdma_end_port(ib_dev)) port > rdma_end_port(ib_dev))
return -ENOENT; return -ENOENT;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
if (ndev) if (ndev)
mask |= GID_ATTR_FIND_MASK_NETDEV; mask |= GID_ATTR_FIND_MASK_NETDEV;
...@@ -562,21 +556,18 @@ static int ib_cache_gid_find_by_filter(struct ib_device *ib_dev, ...@@ -562,21 +556,18 @@ static int ib_cache_gid_find_by_filter(struct ib_device *ib_dev,
void *context, void *context,
u16 *index) u16 *index)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
struct ib_gid_table *table; struct ib_gid_table *table;
unsigned int i; unsigned int i;
unsigned long flags; unsigned long flags;
bool found = false; bool found = false;
if (!ports_table)
return -EOPNOTSUPP;
if (port < rdma_start_port(ib_dev) || if (port < rdma_start_port(ib_dev) ||
port > rdma_end_port(ib_dev) || port > rdma_end_port(ib_dev) ||
!rdma_protocol_roce(ib_dev, port)) !rdma_protocol_roce(ib_dev, port))
return -EPROTONOSUPPORT; return -EPROTONOSUPPORT;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
read_lock_irqsave(&table->rwlock, flags); read_lock_irqsave(&table->rwlock, flags);
for (i = 0; i < table->sz; i++) { for (i = 0; i < table->sz; i++) {
...@@ -668,14 +659,13 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port, ...@@ -668,14 +659,13 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port,
unsigned long gid_type_mask, unsigned long gid_type_mask,
enum ib_cache_gid_default_mode mode) enum ib_cache_gid_default_mode mode)
{ {
struct ib_gid_table **ports_table = ib_dev->cache.gid_cache;
union ib_gid gid; union ib_gid gid;
struct ib_gid_attr gid_attr; struct ib_gid_attr gid_attr;
struct ib_gid_attr zattr_type = zattr; struct ib_gid_attr zattr_type = zattr;
struct ib_gid_table *table; struct ib_gid_table *table;
unsigned int gid_type; unsigned int gid_type;
table = ports_table[port - rdma_start_port(ib_dev)]; table = ib_dev->cache.ports[port - rdma_start_port(ib_dev)].gid;
make_default_gid(ndev, &gid); make_default_gid(ndev, &gid);
memset(&gid_attr, 0, sizeof(gid_attr)); memset(&gid_attr, 0, sizeof(gid_attr));
...@@ -766,71 +756,64 @@ static int gid_table_reserve_default(struct ib_device *ib_dev, u8 port, ...@@ -766,71 +756,64 @@ static int gid_table_reserve_default(struct ib_device *ib_dev, u8 port,
static int _gid_table_setup_one(struct ib_device *ib_dev) static int _gid_table_setup_one(struct ib_device *ib_dev)
{ {
u8 port; u8 port;
struct ib_gid_table **table; struct ib_gid_table *table;
int err = 0; int err = 0;
table = kcalloc(ib_dev->phys_port_cnt, sizeof(*table), GFP_KERNEL);
if (!table)
return -ENOMEM;
for (port = 0; port < ib_dev->phys_port_cnt; port++) { for (port = 0; port < ib_dev->phys_port_cnt; port++) {
u8 rdma_port = port + rdma_start_port(ib_dev); u8 rdma_port = port + rdma_start_port(ib_dev);
table[port] = table =
alloc_gid_table( alloc_gid_table(
ib_dev->port_immutable[rdma_port].gid_tbl_len); ib_dev->port_immutable[rdma_port].gid_tbl_len);
if (!table[port]) { if (!table) {
err = -ENOMEM; err = -ENOMEM;
goto rollback_table_setup; goto rollback_table_setup;
} }
err = gid_table_reserve_default(ib_dev, err = gid_table_reserve_default(ib_dev,
port + rdma_start_port(ib_dev), port + rdma_start_port(ib_dev),
table[port]); table);
if (err) if (err)
goto rollback_table_setup; goto rollback_table_setup;
ib_dev->cache.ports[port].gid = table;
} }
ib_dev->cache.gid_cache = table;
return 0; return 0;
rollback_table_setup: rollback_table_setup:
for (port = 0; port < ib_dev->phys_port_cnt; port++) { for (port = 0; port < ib_dev->phys_port_cnt; port++) {
table = ib_dev->cache.ports[port].gid;
cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev), cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev),
table[port]); table);
release_gid_table(table[port]); release_gid_table(table);
} }
kfree(table);
return err; return err;
} }
static void gid_table_release_one(struct ib_device *ib_dev) static void gid_table_release_one(struct ib_device *ib_dev)
{ {
struct ib_gid_table **table = ib_dev->cache.gid_cache; struct ib_gid_table *table;
u8 port; u8 port;
if (!table) for (port = 0; port < ib_dev->phys_port_cnt; port++) {
return; table = ib_dev->cache.ports[port].gid;
release_gid_table(table);
for (port = 0; port < ib_dev->phys_port_cnt; port++) ib_dev->cache.ports[port].gid = NULL;
release_gid_table(table[port]); }
kfree(table);
ib_dev->cache.gid_cache = NULL;
} }
static void gid_table_cleanup_one(struct ib_device *ib_dev) static void gid_table_cleanup_one(struct ib_device *ib_dev)
{ {
struct ib_gid_table **table = ib_dev->cache.gid_cache; struct ib_gid_table *table;
u8 port; u8 port;
if (!table) for (port = 0; port < ib_dev->phys_port_cnt; port++) {
return; table = ib_dev->cache.ports[port].gid;
for (port = 0; port < ib_dev->phys_port_cnt; port++)
cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev), cleanup_gid_table_port(ib_dev, port + rdma_start_port(ib_dev),
table[port]); table);
}
} }
static int gid_table_setup_one(struct ib_device *ib_dev) static int gid_table_setup_one(struct ib_device *ib_dev)
...@@ -860,12 +843,12 @@ int ib_get_cached_gid(struct ib_device *device, ...@@ -860,12 +843,12 @@ int ib_get_cached_gid(struct ib_device *device,
{ {
int res; int res;
unsigned long flags; unsigned long flags;
struct ib_gid_table **ports_table = device->cache.gid_cache; struct ib_gid_table *table;
struct ib_gid_table *table = ports_table[port_num - rdma_start_port(device)];
if (port_num < rdma_start_port(device) || port_num > rdma_end_port(device)) if (port_num < rdma_start_port(device) || port_num > rdma_end_port(device))
return -EINVAL; return -EINVAL;
table = device->cache.ports[port_num - rdma_start_port(device)].gid;
read_lock_irqsave(&table->rwlock, flags); read_lock_irqsave(&table->rwlock, flags);
res = __ib_cache_gid_get(device, port_num, index, gid, gid_attr); res = __ib_cache_gid_get(device, port_num, index, gid, gid_attr);
read_unlock_irqrestore(&table->rwlock, flags); read_unlock_irqrestore(&table->rwlock, flags);
...@@ -917,7 +900,7 @@ int ib_get_cached_pkey(struct ib_device *device, ...@@ -917,7 +900,7 @@ int ib_get_cached_pkey(struct ib_device *device,
read_lock_irqsave(&device->cache.lock, flags); read_lock_irqsave(&device->cache.lock, flags);
cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; cache = device->cache.ports[port_num - rdma_start_port(device)].pkey;
if (index < 0 || index >= cache->table_len) if (index < 0 || index >= cache->table_len)
ret = -EINVAL; ret = -EINVAL;
...@@ -946,7 +929,7 @@ int ib_find_cached_pkey(struct ib_device *device, ...@@ -946,7 +929,7 @@ int ib_find_cached_pkey(struct ib_device *device,
read_lock_irqsave(&device->cache.lock, flags); read_lock_irqsave(&device->cache.lock, flags);
cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; cache = device->cache.ports[port_num - rdma_start_port(device)].pkey;
*index = -1; *index = -1;
...@@ -986,7 +969,7 @@ int ib_find_exact_cached_pkey(struct ib_device *device, ...@@ -986,7 +969,7 @@ int ib_find_exact_cached_pkey(struct ib_device *device,
read_lock_irqsave(&device->cache.lock, flags); read_lock_irqsave(&device->cache.lock, flags);
cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; cache = device->cache.ports[port_num - rdma_start_port(device)].pkey;
*index = -1; *index = -1;
...@@ -1014,7 +997,7 @@ int ib_get_cached_lmc(struct ib_device *device, ...@@ -1014,7 +997,7 @@ int ib_get_cached_lmc(struct ib_device *device,
return -EINVAL; return -EINVAL;
read_lock_irqsave(&device->cache.lock, flags); read_lock_irqsave(&device->cache.lock, flags);
*lmc = device->cache.lmc_cache[port_num - rdma_start_port(device)]; *lmc = device->cache.ports[port_num - rdma_start_port(device)].lmc;
read_unlock_irqrestore(&device->cache.lock, flags); read_unlock_irqrestore(&device->cache.lock, flags);
return ret; return ret;
...@@ -1032,7 +1015,8 @@ int ib_get_cached_port_state(struct ib_device *device, ...@@ -1032,7 +1015,8 @@ int ib_get_cached_port_state(struct ib_device *device,
return -EINVAL; return -EINVAL;
read_lock_irqsave(&device->cache.lock, flags); read_lock_irqsave(&device->cache.lock, flags);
*port_state = device->cache.port_state_cache[port_num - rdma_start_port(device)]; *port_state = device->cache.ports[port_num
- rdma_start_port(device)].port_state;
read_unlock_irqrestore(&device->cache.lock, flags); read_unlock_irqrestore(&device->cache.lock, flags);
return ret; return ret;
...@@ -1051,14 +1035,13 @@ static void ib_cache_update(struct ib_device *device, ...@@ -1051,14 +1035,13 @@ static void ib_cache_update(struct ib_device *device,
int i; int i;
int ret; int ret;
struct ib_gid_table *table; struct ib_gid_table *table;
struct ib_gid_table **ports_table = device->cache.gid_cache;
bool use_roce_gid_table = bool use_roce_gid_table =
rdma_cap_roce_gid_table(device, port); rdma_cap_roce_gid_table(device, port);
if (port < rdma_start_port(device) || port > rdma_end_port(device)) if (port < rdma_start_port(device) || port > rdma_end_port(device))
return; return;
table = ports_table[port - rdma_start_port(device)]; table = device->cache.ports[port - rdma_start_port(device)].gid;
tprops = kmalloc(sizeof *tprops, GFP_KERNEL); tprops = kmalloc(sizeof *tprops, GFP_KERNEL);
if (!tprops) if (!tprops)
...@@ -1110,9 +1093,10 @@ static void ib_cache_update(struct ib_device *device, ...@@ -1110,9 +1093,10 @@ static void ib_cache_update(struct ib_device *device,
write_lock_irq(&device->cache.lock); write_lock_irq(&device->cache.lock);
old_pkey_cache = device->cache.pkey_cache[port - rdma_start_port(device)]; old_pkey_cache = device->cache.ports[port -
rdma_start_port(device)].pkey;
device->cache.pkey_cache[port - rdma_start_port(device)] = pkey_cache; device->cache.ports[port - rdma_start_port(device)].pkey = pkey_cache;
if (!use_roce_gid_table) { if (!use_roce_gid_table) {
write_lock(&table->rwlock); write_lock(&table->rwlock);
for (i = 0; i < gid_cache->table_len; i++) { for (i = 0; i < gid_cache->table_len; i++) {
...@@ -1122,8 +1106,8 @@ static void ib_cache_update(struct ib_device *device, ...@@ -1122,8 +1106,8 @@ static void ib_cache_update(struct ib_device *device,
write_unlock(&table->rwlock); write_unlock(&table->rwlock);
} }
device->cache.lmc_cache[port - rdma_start_port(device)] = tprops->lmc; device->cache.ports[port - rdma_start_port(device)].lmc = tprops->lmc;
device->cache.port_state_cache[port - rdma_start_port(device)] = device->cache.ports[port - rdma_start_port(device)].port_state =
tprops->state; tprops->state;
write_unlock_irq(&device->cache.lock); write_unlock_irq(&device->cache.lock);
...@@ -1177,26 +1161,17 @@ int ib_cache_setup_one(struct ib_device *device) ...@@ -1177,26 +1161,17 @@ int ib_cache_setup_one(struct ib_device *device)
rwlock_init(&device->cache.lock); rwlock_init(&device->cache.lock);
device->cache.pkey_cache = device->cache.ports =
kzalloc(sizeof *device->cache.pkey_cache * kzalloc(sizeof(*device->cache.ports) *
(rdma_end_port(device) - rdma_start_port(device) + 1), GFP_KERNEL); (rdma_end_port(device) - rdma_start_port(device) + 1), GFP_KERNEL);
device->cache.lmc_cache = kmalloc(sizeof *device->cache.lmc_cache * if (!device->cache.ports) {
(rdma_end_port(device) -
rdma_start_port(device) + 1),
GFP_KERNEL);
device->cache.port_state_cache = kmalloc(sizeof *device->cache.port_state_cache *
(rdma_end_port(device) -
rdma_start_port(device) + 1),
GFP_KERNEL);
if (!device->cache.pkey_cache || !device->cache.port_state_cache ||
!device->cache.lmc_cache) {
err = -ENOMEM; err = -ENOMEM;
goto free; goto out;
} }
err = gid_table_setup_one(device); err = gid_table_setup_one(device);
if (err) if (err)
goto free; goto out;
for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p) for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p)
ib_cache_update(device, p + rdma_start_port(device)); ib_cache_update(device, p + rdma_start_port(device));
...@@ -1211,10 +1186,7 @@ int ib_cache_setup_one(struct ib_device *device) ...@@ -1211,10 +1186,7 @@ int ib_cache_setup_one(struct ib_device *device)
err: err:
gid_table_cleanup_one(device); gid_table_cleanup_one(device);
free: out:
kfree(device->cache.pkey_cache);
kfree(device->cache.lmc_cache);
kfree(device->cache.port_state_cache);
return err; return err;
} }
...@@ -1228,15 +1200,11 @@ void ib_cache_release_one(struct ib_device *device) ...@@ -1228,15 +1200,11 @@ void ib_cache_release_one(struct ib_device *device)
* all the device's resources when the cache could no * all the device's resources when the cache could no
* longer be accessed. * longer be accessed.
*/ */
if (device->cache.pkey_cache) for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p)
for (p = 0; kfree(device->cache.ports[p].pkey);
p <= rdma_end_port(device) - rdma_start_port(device); ++p)
kfree(device->cache.pkey_cache[p]);
gid_table_release_one(device); gid_table_release_one(device);
kfree(device->cache.pkey_cache); kfree(device->cache.ports);
kfree(device->cache.lmc_cache);
kfree(device->cache.port_state_cache);
} }
void ib_cache_cleanup_one(struct ib_device *device) void ib_cache_cleanup_one(struct ib_device *device)
......
...@@ -1775,13 +1775,17 @@ enum ib_mad_result { ...@@ -1775,13 +1775,17 @@ enum ib_mad_result {
#define IB_DEVICE_NAME_MAX 64 #define IB_DEVICE_NAME_MAX 64
struct ib_port_cache {
struct ib_pkey_cache *pkey;
struct ib_gid_table *gid;
u8 lmc;
enum ib_port_state port_state;
};
struct ib_cache { struct ib_cache {
rwlock_t lock; rwlock_t lock;
struct ib_event_handler event_handler; struct ib_event_handler event_handler;
struct ib_pkey_cache **pkey_cache; struct ib_port_cache *ports;
struct ib_gid_table **gid_cache;
u8 *lmc_cache;
enum ib_port_state *port_state_cache;
}; };
struct ib_dma_mapping_ops { struct ib_dma_mapping_ops {
......
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