@@ -2280,6 +2280,7 @@ static inline int check_dm_type_support(struct mlx5_ib_dev *dev,
2280
2280
return - EOPNOTSUPP ;
2281
2281
break ;
2282
2282
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM :
2283
+ case MLX5_IB_UAPI_DM_TYPE_HEADER_MODIFY_SW_ICM :
2283
2284
if (!capable (CAP_SYS_RAWIO ) ||
2284
2285
!capable (CAP_NET_RAW ))
2285
2286
return - EPERM ;
@@ -2344,30 +2345,30 @@ static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
2344
2345
struct uverbs_attr_bundle * attrs ,
2345
2346
int type )
2346
2347
{
2347
- struct mlx5_dm * dm_db = & to_mdev (ctx -> device )-> dm ;
2348
+ struct mlx5_core_dev * dev = to_mdev (ctx -> device )-> mdev ;
2348
2349
u64 act_size ;
2349
2350
int err ;
2350
2351
2351
2352
/* Allocation size must a multiple of the basic block size
2352
2353
* and a power of 2.
2353
2354
*/
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 ));
2355
2356
act_size = roundup_pow_of_two (act_size );
2356
2357
2357
2358
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 );
2361
2362
if (err )
2362
2363
return err ;
2363
2364
2364
2365
err = uverbs_copy_to (attrs ,
2365
2366
MLX5_IB_ATTR_ALLOC_DM_RESP_START_OFFSET ,
2366
2367
& dm -> dev_addr , sizeof (dm -> dev_addr ));
2367
2368
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 );
2371
2372
2372
2373
return err ;
2373
2374
}
@@ -2407,8 +2408,14 @@ struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
2407
2408
attrs );
2408
2409
break ;
2409
2410
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 ;
2410
2415
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 );
2412
2419
break ;
2413
2420
default :
2414
2421
err = - EOPNOTSUPP ;
@@ -2428,6 +2435,7 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
2428
2435
{
2429
2436
struct mlx5_ib_ucontext * ctx = rdma_udata_to_drv_context (
2430
2437
& attrs -> driver_udata , struct mlx5_ib_ucontext , ibucontext );
2438
+ struct mlx5_core_dev * dev = to_mdev (ibdm -> device )-> mdev ;
2431
2439
struct mlx5_dm * dm_db = & to_mdev (ibdm -> device )-> dm ;
2432
2440
struct mlx5_ib_dm * dm = to_mdm (ibdm );
2433
2441
u32 page_idx ;
@@ -2439,19 +2447,23 @@ int mlx5_ib_dealloc_dm(struct ib_dm *ibdm, struct uverbs_attr_bundle *attrs)
2439
2447
if (ret )
2440
2448
return ret ;
2441
2449
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 ;
2447
2453
bitmap_clear (ctx -> dm_pages , page_idx ,
2448
2454
DIV_ROUND_UP (dm -> size , PAGE_SIZE ));
2449
2455
break ;
2450
2456
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 ;
2451
2463
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 );
2455
2467
if (ret )
2456
2468
return ret ;
2457
2469
break ;
@@ -6097,38 +6109,18 @@ static struct ib_counters *mlx5_ib_create_counters(struct ib_device *device,
6097
6109
6098
6110
static void mlx5_ib_stage_init_cleanup (struct mlx5_ib_dev * dev )
6099
6111
{
6100
- struct mlx5_core_dev * mdev = dev -> mdev ;
6101
-
6102
6112
mlx5_ib_cleanup_multiport_master (dev );
6103
6113
if (IS_ENABLED (CONFIG_INFINIBAND_ON_DEMAND_PAGING )) {
6104
6114
srcu_barrier (& dev -> mr_srcu );
6105
6115
cleanup_srcu_struct (& dev -> mr_srcu );
6106
6116
}
6107
6117
6108
6118
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 );
6125
6119
}
6126
6120
6127
6121
static int mlx5_ib_stage_init_init (struct mlx5_ib_dev * dev )
6128
6122
{
6129
6123
struct mlx5_core_dev * mdev = dev -> mdev ;
6130
- u64 header_modify_icm_blocks = 0 ;
6131
- u64 steering_icm_blocks = 0 ;
6132
6124
int err ;
6133
6125
int i ;
6134
6126
@@ -6173,51 +6165,17 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
6173
6165
INIT_LIST_HEAD (& dev -> qp_list );
6174
6166
spin_lock_init (& dev -> reset_flow_resource_lock );
6175
6167
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
-
6206
6168
spin_lock_init (& dev -> dm .lock );
6207
6169
dev -> dm .dev = mdev ;
6208
6170
6209
6171
if (IS_ENABLED (CONFIG_INFINIBAND_ON_DEMAND_PAGING )) {
6210
6172
err = init_srcu_struct (& dev -> mr_srcu );
6211
6173
if (err )
6212
- goto err_dm ;
6174
+ goto err_mp ;
6213
6175
}
6214
6176
6215
6177
return 0 ;
6216
6178
6217
- err_dm :
6218
- kfree (dev -> dm .steering_sw_icm_alloc_blocks );
6219
- kfree (dev -> dm .header_modify_sw_icm_alloc_blocks );
6220
-
6221
6179
err_mp :
6222
6180
mlx5_ib_cleanup_multiport_master (dev );
6223
6181
0 commit comments