| @@ -95,13 +95,12 @@ static int dr_icm_create_dm_mkey(struct mlx5_core_dev *mdev, · 94 unmodified lines |
| 95 | } | 95 | } |
| 96 | | 96 | |
| 97 | static struct mlx5dr_icm_mr * | 97 | static struct mlx5dr_icm_mr * |
| 98 | dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool, | 98 | dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool) |
| 99 | enum mlx5_sw_icm_type type, | | |
| 100 | size_t align_base) | | |
| 101 | { | 99 | { |
| 102 | struct mlx5_core_dev *mdev = pool->dmn->mdev; | 100 | struct mlx5_core_dev *mdev = pool->dmn->mdev; |
| | 101 | enum mlx5_sw_icm_type dm_type; |
| 103 | struct mlx5dr_icm_mr *icm_mr; | 102 | struct mlx5dr_icm_mr *icm_mr; |
| 104 | size_t align_diff; | 103 | size_t log_align_base; |
| 105 | int err; | 104 | int err; |
| 106 | | 105 | |
| 107 | icm_mr = kvzalloc(sizeof(*icm_mr), GFP_KERNEL); | 106 | icm_mr = kvzalloc(sizeof(*icm_mr), GFP_KERNEL); |
| @@ -111,14 +110,22 @@ dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool, · 3 unmodified lines |
| 111 | icm_mr->pool = pool; | 110 | icm_mr->pool = pool; |
| 112 | INIT_LIST_HEAD(&icm_mr->mr_list); | 111 | INIT_LIST_HEAD(&icm_mr->mr_list); |
| 113 | | 112 | |
| 114 | icm_mr->dm.type = type; | | |
| 115 | | | |
| 116 | /* 2^log_biggest_table * entry-size * double-for-alignment */ | | |
| 117 | icm_mr->dm.length = mlx5dr_icm_pool_chunk_size_to_byte(pool->max_log_chunk_sz, | 113 | icm_mr->dm.length = mlx5dr_icm_pool_chunk_size_to_byte(pool->max_log_chunk_sz, |
| 118 | pool->icm_type) * 2; | 114 | pool->icm_type); |
| | 115 | |
| | 116 | if (pool->icm_type == DR_ICM_TYPE_STE) { |
| | 117 | dm_type = MLX5_SW_ICM_TYPE_STEERING; |
| | 118 | log_align_base = ilog2(icm_mr->dm.length); |
| | 119 | } else { |
| | 120 | dm_type = MLX5_SW_ICM_TYPE_HEADER_MODIFY; |
| | 121 | /* Align base is 64B */ |
| | 122 | log_align_base = ilog2(DR_ICM_MODIFY_HDR_ALIGN_BASE); |
| | 123 | } |
| | 124 | icm_mr->dm.type = dm_type; |
| 119 | | 125 | |
| 120 | err = mlx5_dm_sw_icm_alloc(mdev, icm_mr->dm.type, icm_mr->dm.length, 0, | 126 | err = mlx5_dm_sw_icm_alloc(mdev, icm_mr->dm.type, icm_mr->dm.length, |
| 121 | &icm_mr->dm.addr, &icm_mr->dm.obj_id); | 127 | log_align_base, 0, &icm_mr->dm.addr, |
| | 128 | &icm_mr->dm.obj_id); |
| 122 | if (err) { | 129 | if (err) { |
| 123 | mlx5dr_err(pool->dmn, "Failed to allocate SW ICM memory, err (%d)\n", err); | 130 | mlx5dr_err(pool->dmn, "Failed to allocate SW ICM memory, err (%d)\n", err); |
| 124 | goto free_icm_mr; | 131 | goto free_icm_mr; |
| @@ -137,15 +144,18 @@ dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool, · 12 unmodified lines |
| 137 | | 144 | |
| 138 | icm_mr->icm_start_addr = icm_mr->dm.addr; | 145 | icm_mr->icm_start_addr = icm_mr->dm.addr; |
| 139 | | 146 | |
| 140 | /* align_base is always a power of 2 */ | 147 | if (icm_mr->icm_start_addr & (BIT(log_align_base) - 1)) { |
| 141 | align_diff = icm_mr->icm_start_addr & (align_base - 1); | 148 | mlx5dr_err(pool->dmn, "Failed to get Aligned ICM mem (asked: %zu)\n", |
| 142 | if (align_diff) | 149 | log_align_base); |
| 143 | icm_mr->used_length = align_base - align_diff; | 150 | goto free_mkey; |
| | 151 | } |
| 144 | | 152 | |
| 145 | list_add_tail(&icm_mr->mr_list, &pool->icm_mr_list); | 153 | list_add_tail(&icm_mr->mr_list, &pool->icm_mr_list); |
| 146 | | 154 | |
| 147 | return icm_mr; | 155 | return icm_mr; |
| 148 | | 156 | |
| | 157 | free_mkey: |
| | 158 | mlx5_core_destroy_mkey(mdev, &icm_mr->mkey); |
| 149 | free_dm: | 159 | free_dm: |
| 150 | mlx5_dm_sw_icm_dealloc(mdev, icm_mr->dm.type, icm_mr->dm.length, 0, | 160 | mlx5_dm_sw_icm_dealloc(mdev, icm_mr->dm.type, icm_mr->dm.length, 0, |
| 151 | icm_mr->dm.addr, icm_mr->dm.obj_id); | 161 | icm_mr->dm.addr, icm_mr->dm.obj_id); |
| @@ -200,24 +210,11 @@ static int dr_icm_chunks_create(struct mlx5dr_icm_bucket *bucket) · 48 unmodified lines |
| 200 | struct mlx5dr_icm_pool *pool = bucket->pool; | 210 | struct mlx5dr_icm_pool *pool = bucket->pool; |
| 201 | struct mlx5dr_icm_mr *icm_mr = NULL; | 211 | struct mlx5dr_icm_mr *icm_mr = NULL; |
| 202 | struct mlx5dr_icm_chunk *chunk; | 212 | struct mlx5dr_icm_chunk *chunk; |
| 203 | enum mlx5_sw_icm_type dm_type; | | |
| 204 | size_t align_base; | | |
| 205 | int i, err = 0; | 213 | int i, err = 0; |
| 206 | | 214 | |
| 207 | mr_req_size = bucket->num_of_entries * bucket->entry_size; | 215 | mr_req_size = bucket->num_of_entries * bucket->entry_size; |
| 208 | mr_row_size = mlx5dr_icm_pool_chunk_size_to_byte(pool->max_log_chunk_sz, | 216 | mr_row_size = mlx5dr_icm_pool_chunk_size_to_byte(pool->max_log_chunk_sz, |
| 209 | pool->icm_type); | 217 | pool->icm_type); |
| 210 | | | |
| 211 | if (pool->icm_type == DR_ICM_TYPE_STE) { | | |
| 212 | dm_type = MLX5_SW_ICM_TYPE_STEERING; | | |
| 213 | /* Align base is the biggest chunk size / row size */ | | |
| 214 | align_base = mr_row_size; | | |
| 215 | } else { | | |
| 216 | dm_type = MLX5_SW_ICM_TYPE_HEADER_MODIFY; | | |
| 217 | /* Align base is 64B */ | | |
| 218 | align_base = DR_ICM_MODIFY_HDR_ALIGN_BASE; | | |
| 219 | } | | |
| 220 | | | |
| 221 | mutex_lock(&pool->mr_mutex); | 218 | mutex_lock(&pool->mr_mutex); |
| 222 | if (!list_empty(&pool->icm_mr_list)) { | 219 | if (!list_empty(&pool->icm_mr_list)) { |
| 223 | icm_mr = list_last_entry(&pool->icm_mr_list, | 220 | icm_mr = list_last_entry(&pool->icm_mr_list, |
| @@ -228,7 +225,7 @@ static int dr_icm_chunks_create(struct mlx5dr_icm_bucket *bucket) · 4 unmodified lines |
| 228 | } | 225 | } |
| 229 | | 226 | |
| 230 | if (!icm_mr || mr_free_size < mr_row_size) { | 227 | if (!icm_mr || mr_free_size < mr_row_size) { |
| 231 | icm_mr = dr_icm_pool_mr_create(pool, dm_type, align_base); | 228 | icm_mr = dr_icm_pool_mr_create(pool); |
| 232 | if (!icm_mr) { | 229 | if (!icm_mr) { |
| 233 | err = -ENOMEM; | 230 | err = -ENOMEM; |
| 234 | goto out_err; | 231 | goto out_err; |