Skip to content

Commit ab6bf42

Browse files
Eli CohenRoland Dreier
authored andcommitted
mlx4_core: Add module parameter for number of MTTs per segment
The current MTT allocator uses kmalloc() to allocate a buffer for its buddy allocator, and thus is limited in the amount of MTT segments that it can control. As a result, the size of memory that can be registered is limited too. This patch uses a module parameter to control the number of MTT entries that each segment represents, allowing more memory to be registered with the same number of segments. Signed-off-by: Eli Cohen <[email protected]> Signed-off-by: Roland Dreier <[email protected]>
1 parent 210af91 commit ab6bf42

File tree

4 files changed

+17
-6
lines changed

4 files changed

+17
-6
lines changed

drivers/net/mlx4/main.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ module_param_named(use_prio, use_prio, bool, 0444);
100100
MODULE_PARM_DESC(use_prio, "Enable steering by VLAN priority on ETH ports "
101101
"(0/1, default 0)");
102102

103+
static int log_mtts_per_seg = ilog2(MLX4_MTT_ENTRY_PER_SEG);
104+
module_param_named(log_mtts_per_seg, log_mtts_per_seg, int, 0444);
105+
MODULE_PARM_DESC(log_mtts_per_seg, "Log2 number of MTT entries per segment (1-5)");
106+
103107
int mlx4_check_port_params(struct mlx4_dev *dev,
104108
enum mlx4_port_type *port_type)
105109
{
@@ -203,12 +207,13 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
203207
dev->caps.max_cqes = dev_cap->max_cq_sz - 1;
204208
dev->caps.reserved_cqs = dev_cap->reserved_cqs;
205209
dev->caps.reserved_eqs = dev_cap->reserved_eqs;
210+
dev->caps.mtts_per_seg = 1 << log_mtts_per_seg;
206211
dev->caps.reserved_mtts = DIV_ROUND_UP(dev_cap->reserved_mtts,
207-
MLX4_MTT_ENTRY_PER_SEG);
212+
dev->caps.mtts_per_seg);
208213
dev->caps.reserved_mrws = dev_cap->reserved_mrws;
209214
dev->caps.reserved_uars = dev_cap->reserved_uars;
210215
dev->caps.reserved_pds = dev_cap->reserved_pds;
211-
dev->caps.mtt_entry_sz = MLX4_MTT_ENTRY_PER_SEG * dev_cap->mtt_entry_sz;
216+
dev->caps.mtt_entry_sz = dev->caps.mtts_per_seg * dev_cap->mtt_entry_sz;
212217
dev->caps.max_msg_sz = dev_cap->max_msg_sz;
213218
dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1);
214219
dev->caps.flags = dev_cap->flags;
@@ -1304,6 +1309,11 @@ static int __init mlx4_verify_params(void)
13041309
return -1;
13051310
}
13061311

1312+
if ((log_mtts_per_seg < 1) || (log_mtts_per_seg > 5)) {
1313+
printk(KERN_WARNING "mlx4_core: bad log_mtts_per_seg: %d\n", log_mtts_per_seg);
1314+
return -1;
1315+
}
1316+
13071317
return 0;
13081318
}
13091319

drivers/net/mlx4/mr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ int mlx4_mtt_init(struct mlx4_dev *dev, int npages, int page_shift,
209209
} else
210210
mtt->page_shift = page_shift;
211211

212-
for (mtt->order = 0, i = MLX4_MTT_ENTRY_PER_SEG; i < npages; i <<= 1)
212+
for (mtt->order = 0, i = dev->caps.mtts_per_seg; i < npages; i <<= 1)
213213
++mtt->order;
214214

215215
mtt->first_seg = mlx4_alloc_mtt_range(dev, mtt->order);
@@ -350,7 +350,7 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr)
350350
mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG |
351351
MLX4_MPT_PD_FLAG_RAE);
352352
mpt_entry->mtt_sz = cpu_to_be32((1 << mr->mtt.order) *
353-
MLX4_MTT_ENTRY_PER_SEG);
353+
dev->caps.mtts_per_seg);
354354
} else {
355355
mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS);
356356
}
@@ -391,7 +391,7 @@ static int mlx4_write_mtt_chunk(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
391391
(start_index + npages - 1) / (PAGE_SIZE / sizeof (u64)))
392392
return -EINVAL;
393393

394-
if (start_index & (MLX4_MTT_ENTRY_PER_SEG - 1))
394+
if (start_index & (dev->caps.mtts_per_seg - 1))
395395
return -EINVAL;
396396

397397
mtts = mlx4_table_find(&priv->mr_table.mtt_table, mtt->first_seg +

drivers/net/mlx4/profile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ u64 mlx4_make_profile(struct mlx4_dev *dev,
9898
profile[MLX4_RES_EQ].size = dev_cap->eqc_entry_sz;
9999
profile[MLX4_RES_DMPT].size = dev_cap->dmpt_entry_sz;
100100
profile[MLX4_RES_CMPT].size = dev_cap->cmpt_entry_sz;
101-
profile[MLX4_RES_MTT].size = MLX4_MTT_ENTRY_PER_SEG * dev_cap->mtt_entry_sz;
101+
profile[MLX4_RES_MTT].size = dev->caps.mtts_per_seg * dev_cap->mtt_entry_sz;
102102
profile[MLX4_RES_MCG].size = MLX4_MGM_ENTRY_SIZE;
103103

104104
profile[MLX4_RES_QP].num = request->num_qp;

include/linux/mlx4/device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ struct mlx4_caps {
210210
int num_comp_vectors;
211211
int num_mpts;
212212
int num_mtt_segs;
213+
int mtts_per_seg;
213214
int fmr_reserved_mtts;
214215
int reserved_mtts;
215216
int reserved_mrws;

0 commit comments

Comments
 (0)