| @@ -95,13 +95,12 @@ static int dr_icm_create_dm_mkey(struct mlx5_core_dev *mdev, · 94 unmodified lines |
| 95 | 95 | } |
| 96 | 96 | |
| 97 | 97 | static struct mlx5dr_icm_mr * |
| 98 | | −dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool, |
| 99 | | − enum mlx5_sw_icm_type type, |
| 100 | | − size_t align_base) |
| 98 | +dr_icm_pool_mr_create(struct mlx5dr_icm_pool *pool) |
| 101 | 99 | { |
| 102 | 100 | struct mlx5_core_dev *mdev = pool->dmn->mdev; |
| 101 | + enum mlx5_sw_icm_type dm_type; |
| 103 | 102 | struct mlx5dr_icm_mr *icm_mr; |
| 104 | | − size_t align_diff; |
| 103 | + size_t log_align_base; |
| 105 | 104 | int err; |
| 106 | 105 | |
| 107 | 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 | 110 | icm_mr->pool = pool; |
| 112 | 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 | 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, |
| 121 | | − &icm_mr->dm.addr, &icm_mr->dm.obj_id); |
| 126 | + err = mlx5_dm_sw_icm_alloc(mdev, icm_mr->dm.type, icm_mr->dm.length, |
| 127 | + log_align_base, 0, &icm_mr->dm.addr, |
| 128 | + &icm_mr->dm.obj_id); |
| 122 | 129 | if (err) { |
| 123 | 130 | mlx5dr_err(pool->dmn, "Failed to allocate SW ICM memory, err (%d)\n", err); |
| 124 | 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 | 145 | icm_mr->icm_start_addr = icm_mr->dm.addr; |
| 139 | 146 | |
| 140 | | − /* align_base is always a power of 2 */ |
| 141 | | − align_diff = icm_mr->icm_start_addr & (align_base - 1); |
| 142 | | − if (align_diff) |
| 143 | | − icm_mr->used_length = align_base - align_diff; |
| 147 | + if (icm_mr->icm_start_addr & (BIT(log_align_base) - 1)) { |
| 148 | + mlx5dr_err(pool->dmn, "Failed to get Aligned ICM mem (asked: %zu)\n", |
| 149 | + log_align_base); |
| 150 | + goto free_mkey; |
| 151 | + } |
| 144 | 152 | |
| 145 | 153 | list_add_tail(&icm_mr->mr_list, &pool->icm_mr_list); |
| 146 | 154 | |
| 147 | 155 | return icm_mr; |
| 148 | 156 | |
| 157 | +free_mkey: |
| 158 | + mlx5_core_destroy_mkey(mdev, &icm_mr->mkey); |
| 149 | 159 | free_dm: |
| 150 | 160 | mlx5_dm_sw_icm_dealloc(mdev, icm_mr->dm.type, icm_mr->dm.length, 0, |
| 151 | 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 | 210 | struct mlx5dr_icm_pool *pool = bucket->pool; |
| 201 | 211 | struct mlx5dr_icm_mr *icm_mr = NULL; |
| 202 | 212 | struct mlx5dr_icm_chunk *chunk; |
| 203 | | − enum mlx5_sw_icm_type dm_type; |
| 204 | | − size_t align_base; |
| 205 | 213 | int i, err = 0; |
| 206 | 214 | |
| 207 | 215 | mr_req_size = bucket->num_of_entries * bucket->entry_size; |
| 208 | 216 | mr_row_size = mlx5dr_icm_pool_chunk_size_to_byte(pool->max_log_chunk_sz, |
| 209 | 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 | 218 | mutex_lock(&pool->mr_mutex); |
| 222 | 219 | if (!list_empty(&pool->icm_mr_list)) { |
| 223 | 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 | 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 | 229 | if (!icm_mr) { |
| 233 | 230 | err = -ENOMEM; |
| 234 | 231 | goto out_err; |