diff options
author | Leon Romanovsky <leon@kernel.org> | 2016-11-03 10:44:11 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-12-03 13:12:52 -0500 |
commit | aa6aae38f7fb2c030f326a6dd10b58fff1851dfa (patch) | |
tree | d3396442e85da657cb01509917d2e6b2087b364c /drivers/infiniband/core/cache.c | |
parent | a0b3455fcb2d1b3e486349a4a51803c3cb3847b5 (diff) |
IB/core: Release allocated memory in cache setup failure
The failure in ib_cache_setup_one function during
ib_register_device will leave leaked allocated memory.
Fixes: 03db3a2d81e6 ("IB/core: Add RoCE GID table management")
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/core/cache.c')
-rw-r--r-- | drivers/infiniband/core/cache.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index 1a2984c28b95..ae04826e82fc 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
@@ -770,12 +770,8 @@ static int _gid_table_setup_one(struct ib_device *ib_dev) | |||
770 | int err = 0; | 770 | int err = 0; |
771 | 771 | ||
772 | table = kcalloc(ib_dev->phys_port_cnt, sizeof(*table), GFP_KERNEL); | 772 | table = kcalloc(ib_dev->phys_port_cnt, sizeof(*table), GFP_KERNEL); |
773 | 773 | if (!table) | |
774 | if (!table) { | ||
775 | pr_warn("failed to allocate ib gid cache for %s\n", | ||
776 | ib_dev->name); | ||
777 | return -ENOMEM; | 774 | return -ENOMEM; |
778 | } | ||
779 | 775 | ||
780 | for (port = 0; port < ib_dev->phys_port_cnt; port++) { | 776 | for (port = 0; port < ib_dev->phys_port_cnt; port++) { |
781 | u8 rdma_port = port + rdma_start_port(ib_dev); | 777 | u8 rdma_port = port + rdma_start_port(ib_dev); |
@@ -1170,14 +1166,13 @@ int ib_cache_setup_one(struct ib_device *device) | |||
1170 | GFP_KERNEL); | 1166 | GFP_KERNEL); |
1171 | if (!device->cache.pkey_cache || | 1167 | if (!device->cache.pkey_cache || |
1172 | !device->cache.lmc_cache) { | 1168 | !device->cache.lmc_cache) { |
1173 | pr_warn("Couldn't allocate cache for %s\n", device->name); | 1169 | err = -ENOMEM; |
1174 | return -ENOMEM; | 1170 | goto free; |
1175 | } | 1171 | } |
1176 | 1172 | ||
1177 | err = gid_table_setup_one(device); | 1173 | err = gid_table_setup_one(device); |
1178 | if (err) | 1174 | if (err) |
1179 | /* Allocated memory will be cleaned in the release function */ | 1175 | goto free; |
1180 | return err; | ||
1181 | 1176 | ||
1182 | for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p) | 1177 | for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p) |
1183 | ib_cache_update(device, p + rdma_start_port(device)); | 1178 | ib_cache_update(device, p + rdma_start_port(device)); |
@@ -1192,6 +1187,9 @@ int ib_cache_setup_one(struct ib_device *device) | |||
1192 | 1187 | ||
1193 | err: | 1188 | err: |
1194 | gid_table_cleanup_one(device); | 1189 | gid_table_cleanup_one(device); |
1190 | free: | ||
1191 | kfree(device->cache.pkey_cache); | ||
1192 | kfree(device->cache.lmc_cache); | ||
1195 | return err; | 1193 | return err; |
1196 | } | 1194 | } |
1197 | 1195 | ||