diff options
| author | Eli Cohen <eli@mellanox.co.il> | 2009-05-27 14:36:16 -0700 | 
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2009-05-27 14:36:16 -0700 | 
| commit | c1f67a88bf62fac0f4151c007b361199c2cd1988 (patch) | |
| tree | 5bb527966e1a6cd2a3c06f6df70199df948e3817 /drivers/infiniband/hw/mthca/mthca_main.c | |
| parent | 210af919c949a7d6bd330916ef376cec2907d81e (diff) | |
| download | olio-linux-3.10-c1f67a88bf62fac0f4151c007b361199c2cd1988.tar.xz olio-linux-3.10-c1f67a88bf62fac0f4151c007b361199c2cd1988.zip  | |
IB/mthca: 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 <eli@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_main.c')
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_main.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 1d83cf7caf3..13da9f1d24c 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c @@ -125,6 +125,10 @@ module_param_named(fmr_reserved_mtts, hca_profile.fmr_reserved_mtts, int, 0444);  MODULE_PARM_DESC(fmr_reserved_mtts,  		 "number of memory translation table segments reserved for FMR"); +static int log_mtts_per_seg = ilog2(MTHCA_MTT_SEG_SIZE / 8); +module_param_named(log_mtts_per_seg, log_mtts_per_seg, int, 0444); +MODULE_PARM_DESC(log_mtts_per_seg, "Log2 number of MTT entries per segment (1-5)"); +  static char mthca_version[] __devinitdata =  	DRV_NAME ": Mellanox InfiniBand HCA driver v"  	DRV_VERSION " (" DRV_RELDATE ")\n"; @@ -162,6 +166,7 @@ static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)  	int err;  	u8 status; +	mdev->limits.mtt_seg_size = (1 << log_mtts_per_seg) * 8;  	err = mthca_QUERY_DEV_LIM(mdev, dev_lim, &status);  	if (err) {  		mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n"); @@ -460,11 +465,11 @@ static int mthca_init_icm(struct mthca_dev *mdev,  	}  	/* CPU writes to non-reserved MTTs, while HCA might DMA to reserved mtts */ -	mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * MTHCA_MTT_SEG_SIZE, -					   dma_get_cache_alignment()) / MTHCA_MTT_SEG_SIZE; +	mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * mdev->limits.mtt_seg_size, +					   dma_get_cache_alignment()) / mdev->limits.mtt_seg_size;  	mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base, -							 MTHCA_MTT_SEG_SIZE, +							 mdev->limits.mtt_seg_size,  							 mdev->limits.num_mtt_segs,  							 mdev->limits.reserved_mtts,  							 1, 0); @@ -1315,6 +1320,12 @@ static void __init mthca_validate_profile(void)  		printk(KERN_WARNING PFX "Corrected fmr_reserved_mtts to %d.\n",  		       hca_profile.fmr_reserved_mtts);  	} + +	if ((log_mtts_per_seg < 1) || (log_mtts_per_seg > 5)) { +		printk(KERN_WARNING PFX "bad log_mtts_per_seg (%d). Using default - %d\n", +		       log_mtts_per_seg, ilog2(MTHCA_MTT_SEG_SIZE / 8)); +		log_mtts_per_seg = ilog2(MTHCA_MTT_SEG_SIZE / 8); +	}  }  static int __init mthca_init(void)  |