|
@@ -778,50 +778,40 @@ static void gid_table_reserve_default(struct ib_device *ib_dev, u8 port,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+static void gid_table_release_one(struct ib_device *ib_dev)
|
|
|
|
+{
|
|
|
|
+ struct ib_gid_table *table;
|
|
|
|
+ u8 port;
|
|
|
|
+
|
|
|
|
+ for (port = 0; port < ib_dev->phys_port_cnt; port++) {
|
|
|
|
+ table = ib_dev->cache.ports[port].gid;
|
|
|
|
+ release_gid_table(table);
|
|
|
|
+ ib_dev->cache.ports[port].gid = NULL;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
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;
|
|
|
|
|
|
|
|
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 = alloc_gid_table(
|
|
table = alloc_gid_table(
|
|
ib_dev->port_immutable[rdma_port].gid_tbl_len);
|
|
ib_dev->port_immutable[rdma_port].gid_tbl_len);
|
|
- if (!table) {
|
|
|
|
- err = -ENOMEM;
|
|
|
|
|
|
+ if (!table)
|
|
goto rollback_table_setup;
|
|
goto rollback_table_setup;
|
|
- }
|
|
|
|
|
|
|
|
gid_table_reserve_default(ib_dev, rdma_port, table);
|
|
gid_table_reserve_default(ib_dev, rdma_port, table);
|
|
ib_dev->cache.ports[port].gid = table;
|
|
ib_dev->cache.ports[port].gid = table;
|
|
}
|
|
}
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
rollback_table_setup:
|
|
rollback_table_setup:
|
|
- 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),
|
|
|
|
- table);
|
|
|
|
- release_gid_table(table);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return err;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void gid_table_release_one(struct ib_device *ib_dev)
|
|
|
|
-{
|
|
|
|
- struct ib_gid_table *table;
|
|
|
|
- u8 port;
|
|
|
|
-
|
|
|
|
- for (port = 0; port < ib_dev->phys_port_cnt; port++) {
|
|
|
|
- table = ib_dev->cache.ports[port].gid;
|
|
|
|
- release_gid_table(table);
|
|
|
|
- ib_dev->cache.ports[port].gid = NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ gid_table_release_one(ib_dev);
|
|
|
|
+ return -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
static void gid_table_cleanup_one(struct ib_device *ib_dev)
|
|
static void gid_table_cleanup_one(struct ib_device *ib_dev)
|