Skip to content

Commit c9b9dcb

Browse files
Awik84Saeed Mahameed
authored andcommitted
net/mlx5: Move device memory management to mlx5_core
Move the device memory allocation and deallocation commands SW ICM memory to mlx5_core to expose this API for all mlx5_core users. This comes as preparation for supporting SW steering in kernel where it will be required to allocate and register device memory for direct rule insertion. In addition, an API to register this device memory for future remote access operations is introduced using the create_mkey commands. Signed-off-by: Ariel Levkovich <[email protected]> Reviewed-by: Mark Bloch <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 00679b6 commit c9b9dcb

File tree

9 files changed

+276
-209
lines changed

9 files changed

+276
-209
lines changed

drivers/infiniband/hw/mlx5/cmd.c

Lines changed: 0 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -186,136 +186,6 @@ int mlx5_cmd_dealloc_memic(struct mlx5_dm *dm, phys_addr_t addr, u64 length)
186186
return err;
187187
}
188188

189-
int mlx5_cmd_alloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
190-
u16 uid, phys_addr_t *addr, u32 *obj_id)
191-
{
192-
struct mlx5_core_dev *dev = dm->dev;
193-
u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {};
194-
u32 in[MLX5_ST_SZ_DW(create_sw_icm_in)] = {};
195-
unsigned long *block_map;
196-
u64 icm_start_addr;
197-
u32 log_icm_size;
198-
u32 num_blocks;
199-
u32 max_blocks;
200-
u64 block_idx;
201-
void *sw_icm;
202-
int ret;
203-
204-
MLX5_SET(general_obj_in_cmd_hdr, in, opcode,
205-
MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
206-
MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_SW_ICM);
207-
MLX5_SET(general_obj_in_cmd_hdr, in, uid, uid);
208-
209-
switch (type) {
210-
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
211-
icm_start_addr = MLX5_CAP64_DEV_MEM(dev,
212-
steering_sw_icm_start_address);
213-
log_icm_size = MLX5_CAP_DEV_MEM(dev, log_steering_sw_icm_size);
214-
block_map = dm->steering_sw_icm_alloc_blocks;
215-
break;
216-
case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
217-
icm_start_addr = MLX5_CAP64_DEV_MEM(dev,
218-
header_modify_sw_icm_start_address);
219-
log_icm_size = MLX5_CAP_DEV_MEM(dev,
220-
log_header_modify_sw_icm_size);
221-
block_map = dm->header_modify_sw_icm_alloc_blocks;
222-
break;
223-
default:
224-
return -EINVAL;
225-
}
226-
227-
num_blocks = (length + MLX5_SW_ICM_BLOCK_SIZE(dev) - 1) >>
228-
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
229-
max_blocks = BIT(log_icm_size - MLX5_LOG_SW_ICM_BLOCK_SIZE(dev));
230-
spin_lock(&dm->lock);
231-
block_idx = bitmap_find_next_zero_area(block_map,
232-
max_blocks,
233-
0,
234-
num_blocks, 0);
235-
236-
if (block_idx < max_blocks)
237-
bitmap_set(block_map,
238-
block_idx, num_blocks);
239-
240-
spin_unlock(&dm->lock);
241-
242-
if (block_idx >= max_blocks)
243-
return -ENOMEM;
244-
245-
sw_icm = MLX5_ADDR_OF(create_sw_icm_in, in, sw_icm);
246-
icm_start_addr += block_idx << MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
247-
MLX5_SET64(sw_icm, sw_icm, sw_icm_start_addr,
248-
icm_start_addr);
249-
MLX5_SET(sw_icm, sw_icm, log_sw_icm_size, ilog2(length));
250-
251-
ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
252-
if (ret) {
253-
spin_lock(&dm->lock);
254-
bitmap_clear(block_map,
255-
block_idx, num_blocks);
256-
spin_unlock(&dm->lock);
257-
258-
return ret;
259-
}
260-
261-
*addr = icm_start_addr;
262-
*obj_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
263-
264-
return 0;
265-
}
266-
267-
int mlx5_cmd_dealloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
268-
u16 uid, phys_addr_t addr, u32 obj_id)
269-
{
270-
struct mlx5_core_dev *dev = dm->dev;
271-
u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {};
272-
u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {};
273-
unsigned long *block_map;
274-
u32 num_blocks;
275-
u64 start_idx;
276-
int err;
277-
278-
num_blocks = (length + MLX5_SW_ICM_BLOCK_SIZE(dev) - 1) >>
279-
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
280-
281-
switch (type) {
282-
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
283-
start_idx =
284-
(addr - MLX5_CAP64_DEV_MEM(
285-
dev, steering_sw_icm_start_address)) >>
286-
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
287-
block_map = dm->steering_sw_icm_alloc_blocks;
288-
break;
289-
case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
290-
start_idx =
291-
(addr -
292-
MLX5_CAP64_DEV_MEM(
293-
dev, header_modify_sw_icm_start_address)) >>
294-
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
295-
block_map = dm->header_modify_sw_icm_alloc_blocks;
296-
break;
297-
default:
298-
return -EINVAL;
299-
}
300-
301-
MLX5_SET(general_obj_in_cmd_hdr, in, opcode,
302-
MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
303-
MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_SW_ICM);
304-
MLX5_SET(general_obj_in_cmd_hdr, in, obj_id, obj_id);
305-
MLX5_SET(general_obj_in_cmd_hdr, in, uid, uid);
306-
307-
err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
308-
if (err)
309-
return err;
310-
311-
spin_lock(&dm->lock);
312-
bitmap_clear(block_map,
313-
start_idx, num_blocks);
314-
spin_unlock(&dm->lock);
315-
316-
return 0;
317-
}
318-
319189
int mlx5_cmd_query_ext_ppcnt_counters(struct mlx5_core_dev *dev, void *out)
320190
{
321191
u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};

drivers/infiniband/hw/mlx5/cmd.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,4 @@ int mlx5_cmd_alloc_q_counter(struct mlx5_core_dev *dev, u16 *counter_id,
6565
u16 uid);
6666
int mlx5_cmd_mad_ifc(struct mlx5_core_dev *dev, const void *inb, void *outb,
6767
u16 opmod, u8 port);
68-
int mlx5_cmd_alloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
69-
u16 uid, phys_addr_t *addr, u32 *obj_id);
70-
int mlx5_cmd_dealloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
71-
u16 uid, phys_addr_t addr, u32 obj_id);
7268
#endif /* MLX5_IB_CMD_H */

drivers/infiniband/hw/mlx5/main.c

Lines changed: 30 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2280,6 +2280,7 @@ static inline int check_dm_type_support(struct mlx5_ib_dev *dev,
22802280
return -EOPNOTSUPP;
22812281
break;
22822282
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
2283+
case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
22832284
if (!capable(CAP_SYS_RAWIO) ||
22842285
!capable(CAP_NET_RAW))
22852286
return -EPERM;
@@ -2344,30 +2345,30 @@ static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
23442345
struct uverbs_attr_bundle *attrs,
23452346
int type)
23462347
{
2347-
struct mlx5_dm *dm_db = &to_mdev(ctx->device)->dm;
2348+
struct mlx5_core_dev *dev = to_mdev(ctx->device)->mdev;
23482349
u64 act_size;
23492350
int err;
23502351

23512352
/* Allocation size must a multiple of the basic block size
23522353
* and a power of 2.
23532354
*/
2354-
act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dm_db->dev));
2355+
act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dev));
23552356
act_size = roundup_pow_of_two(act_size);
23562357

23572358
dm->size = act_size;
2358-
err = mlx5_cmd_alloc_sw_icm(dm_db, type, act_size,
2359-
to_mucontext(ctx)->devx_uid, &dm->dev_addr,
2360-
&dm->icm_dm.obj_id);
2359+
err = mlx5_dm_sw_icm_alloc(dev, type, act_size,
2360+
to_mucontext(ctx)->devx_uid, &dm->dev_addr,
2361+
&dm->icm_dm.obj_id);
23612362
if (err)
23622363
return err;
23632364

23642365
err = uverbs_copy_to(attrs,
23652366
MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET,
23662367
&dm->dev_addr, sizeof(dm->dev_addr));
23672368
if (err)
2368-
mlx5_cmd_dealloc_sw_icm(dm_db, type, dm->size,
2369-
to_mucontext(ctx)->devx_uid,
2370-
dm->dev_addr, dm->icm_dm.obj_id);
2369+
mlx5_dm_sw_icm_dealloc(dev, type, dm->size,
2370+
to_mucontext(ctx)->devx_uid, dm->dev_addr,
2371+
dm->icm_dm.obj_id);
23712372

23722373
return err;
23732374
}
@@ -2407,8 +2408,14 @@ struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
24072408
attrs);
24082409
break;
24092410
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
2411+
err = handle_alloc_dm_sw_icm(context, dm,
2412+
attr, attrs,
2413+
MLX5_SW_ICM_TYPE_STEERING);
2414+
break;
24102415
case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
2411-
err = handle_alloc_dm_sw_icm(context, dm, attr, attrs, type);
2416+
err = handle_alloc_dm_sw_icm(context, dm,
2417+
attr, attrs,
2418+
MLX5_SW_ICM_TYPE_HEADER_MODIFY);
24122419
break;
24132420
default:
24142421
err = -EOPNOTSUPP;
@@ -2428,6 +2435,7 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
24282435
{
24292436
struct mlx5_ib_ucontext *ctx = rdma_udata_to_drv_context(
24302437
&attrs->driver_udata, struct mlx5_ib_ucontext, ibucontext);
2438+
struct mlx5_core_dev *dev = to_mdev(ibdm->device)->mdev;
24312439
struct mlx5_dm *dm_db = &to_mdev(ibdm->device)->dm;
24322440
struct mlx5_ib_dm *dm = to_mdm(ibdm);
24332441
u32 page_idx;
@@ -2439,19 +2447,23 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
24392447
if (ret)
24402448
return ret;
24412449

2442-
page_idx = (dm->dev_addr -
2443-
pci_resource_start(dm_db->dev->pdev, 0) -
2444-
MLX5_CAP64_DEV_MEM(dm_db->dev,
2445-
memic_bar_start_addr)) >>
2446-
PAGE_SHIFT;
2450+
page_idx = (dm->dev_addr - pci_resource_start(dev->pdev, 0) -
2451+
MLX5_CAP64_DEV_MEM(dev, memic_bar_start_addr)) >>
2452+
PAGE_SHIFT;
24472453
bitmap_clear(ctx->dm_pages, page_idx,
24482454
DIV_ROUND_UP(dm->size, PAGE_SIZE));
24492455
break;
24502456
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
2457+
ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_STEERING,
2458+
dm->size, ctx->devx_uid, dm->dev_addr,
2459+
dm->icm_dm.obj_id);
2460+
if (ret)
2461+
return ret;
2462+
break;
24512463
case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM:
2452-
ret = mlx5_cmd_dealloc_sw_icm(dm_db, dm->type, dm->size,
2453-
ctx->devx_uid, dm->dev_addr,
2454-
dm->icm_dm.obj_id);
2464+
ret = mlx5_dm_sw_icm_dealloc(dev, MLX5_SW_ICM_TYPE_HEADER_MODIFY,
2465+
dm->size, ctx->devx_uid, dm->dev_addr,
2466+
dm->icm_dm.obj_id);
24552467
if (ret)
24562468
return ret;
24572469
break;
@@ -6097,38 +6109,18 @@ static struct ib_counters *mlx5_ib_create_counters(struct ib_device *device,
60976109

60986110
static void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev)
60996111
{
6100-
struct mlx5_core_dev *mdev = dev->mdev;
6101-
61026112
mlx5_ib_cleanup_multiport_master(dev);
61036113
if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
61046114
srcu_barrier(&dev->mr_srcu);
61056115
cleanup_srcu_struct(&dev->mr_srcu);
61066116
}
61076117

61086118
WARN_ON(!bitmap_empty(dev->dm.memic_alloc_pages, MLX5_MAX_MEMIC_PAGES));
6109-
6110-
WARN_ON(dev->dm.steering_sw_icm_alloc_blocks &&
6111-
!bitmap_empty(
6112-
dev->dm.steering_sw_icm_alloc_blocks,
6113-
BIT(MLX5_CAP_DEV_MEM(mdev, log_steering_sw_icm_size) -
6114-
MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev))));
6115-
6116-
kfree(dev->dm.steering_sw_icm_alloc_blocks);
6117-
6118-
WARN_ON(dev->dm.header_modify_sw_icm_alloc_blocks &&
6119-
!bitmap_empty(dev->dm.header_modify_sw_icm_alloc_blocks,
6120-
BIT(MLX5_CAP_DEV_MEM(
6121-
mdev, log_header_modify_sw_icm_size) -
6122-
MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev))));
6123-
6124-
kfree(dev->dm.header_modify_sw_icm_alloc_blocks);
61256119
}
61266120

61276121
static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
61286122
{
61296123
struct mlx5_core_dev *mdev = dev->mdev;
6130-
u64 header_modify_icm_blocks = 0;
6131-
u64 steering_icm_blocks = 0;
61326124
int err;
61336125
int i;
61346126

@@ -6173,51 +6165,17 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
61736165
INIT_LIST_HEAD(&dev->qp_list);
61746166
spin_lock_init(&dev->reset_flow_resource_lock);
61756167

6176-
if (MLX5_CAP_GEN_64(mdev, general_obj_types) &
6177-
MLX5_GENERAL_OBJ_TYPES_CAP_SW_ICM) {
6178-
if (MLX5_CAP64_DEV_MEM(mdev, steering_sw_icm_start_address)) {
6179-
steering_icm_blocks =
6180-
BIT(MLX5_CAP_DEV_MEM(mdev,
6181-
log_steering_sw_icm_size) -
6182-
MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev));
6183-
6184-
dev->dm.steering_sw_icm_alloc_blocks =
6185-
kcalloc(BITS_TO_LONGS(steering_icm_blocks),
6186-
sizeof(unsigned long), GFP_KERNEL);
6187-
if (!dev->dm.steering_sw_icm_alloc_blocks)
6188-
goto err_mp;
6189-
}
6190-
6191-
if (MLX5_CAP64_DEV_MEM(mdev,
6192-
header_modify_sw_icm_start_address)) {
6193-
header_modify_icm_blocks = BIT(
6194-
MLX5_CAP_DEV_MEM(
6195-
mdev, log_header_modify_sw_icm_size) -
6196-
MLX5_LOG_SW_ICM_BLOCK_SIZE(mdev));
6197-
6198-
dev->dm.header_modify_sw_icm_alloc_blocks =
6199-
kcalloc(BITS_TO_LONGS(header_modify_icm_blocks),
6200-
sizeof(unsigned long), GFP_KERNEL);
6201-
if (!dev->dm.header_modify_sw_icm_alloc_blocks)
6202-
goto err_dm;
6203-
}
6204-
}
6205-
62066168
spin_lock_init(&dev->dm.lock);
62076169
dev->dm.dev = mdev;
62086170

62096171
if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) {
62106172
err = init_srcu_struct(&dev->mr_srcu);
62116173
if (err)
6212-
goto err_dm;
6174+
goto err_mp;
62136175
}
62146176

62156177
return 0;
62166178

6217-
err_dm:
6218-
kfree(dev->dm.steering_sw_icm_alloc_blocks);
6219-
kfree(dev->dm.header_modify_sw_icm_alloc_blocks);
6220-
62216179
err_mp:
62226180
mlx5_ib_cleanup_multiport_master(dev);
62236181

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -880,8 +880,6 @@ struct mlx5_dm {
880880
*/
881881
spinlock_t lock;
882882
DECLARE_BITMAP(memic_alloc_pages, MLX5_MAX_MEMIC_PAGES);
883-
unsigned long *steering_sw_icm_alloc_blocks;
884-
unsigned long *header_modify_sw_icm_alloc_blocks;
885883
};
886884

887885
struct mlx5_read_counters_attr {

drivers/net/ethernet/mellanox/mlx5/core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ mlx5_core-y := main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \
1515
health.o mcg.o cq.o alloc.o qp.o port.o mr.o pd.o \
1616
transobj.o vport.o sriov.o fs_cmd.o fs_core.o pci_irq.o \
1717
fs_counters.o rl.o lag.o dev.o events.o wq.o lib/gid.o \
18-
lib/devcom.o lib/pci_vsc.o diag/fs_tracepoint.o \
18+
lib/devcom.o lib/pci_vsc.o lib/dm.o diag/fs_tracepoint.o \
1919
diag/fw_tracer.o diag/crdump.o devlink.o
2020

2121
#

0 commit comments

Comments
 (0)