From: Dotan Barak Date: Wed, 11 Jul 2012 12:14:40 +0000 (+0300) Subject: ib_core: Usermode FMR config params X-Git-Tag: v4.1.12-92~281^2^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=982af5362e35cd2366eceacade0bf47df3f1667f;p=users%2Fjedix%2Flinux-maple.git ib_core: Usermode FMR config params Orabug: 21517998 Signed-off-by: Arun Kaimalettu (Ported from UEK2/Mellanox OFED1.5.5R2) Signed-off-by: Mukesh Kacker --- diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index a579dca7d8f7f..034d38c86c44d 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h @@ -259,6 +259,12 @@ IB_UVERBS_DECLARE_CMD(reg_mr_relaxed); IB_UVERBS_DECLARE_CMD(dereg_mr_relaxed); IB_UVERBS_DECLARE_CMD(flush_relaxed_mr); +/* UFMR parameters */ +extern int ufmr_pool1_blocksize; +extern int ufmr_pool1_nelems; +extern int ufmr_pool2_blocksize; +extern int ufmr_pool2_nelems; + #define IB_UVERBS_DECLARE_EX_CMD(name) \ int ib_uverbs_ex_##name(struct ib_uverbs_file *file, \ struct ib_udata *ucore, \ diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 51731346c3a6e..10fa5b8466734 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -43,6 +43,16 @@ #include "uverbs.h" #include "core_priv.h" +/* UFMR parameters */ +/* default Pool 1 block size */ +int ufmr_pool1_blocksize = 8 * 1024; +/* default no of fmrs in Pool 1 */ +int ufmr_pool1_nelems = 32 * 1024; +/* default Pool 2 block size */ +int ufmr_pool2_blocksize = 1 * 1024 * 1024; +/* default no of fmrs in Pool 2 */ +int ufmr_pool2_nelems = 4 * 1024; + struct uverbs_lock_class { struct lock_class_key key; char name[16]; @@ -326,7 +336,7 @@ static int fmr_pin_pages(unsigned long user_addr, unsigned int nr_pages, return ret; } -static int create_fmr_pool(struct ib_pd *pd, int pages, u32 access) +static int create_fmr_pool(struct ib_pd *pd, int pages, int size, u32 access) { int ret = 0; @@ -338,7 +348,7 @@ static int create_fmr_pool(struct ib_pd *pd, int pages, u32 access) /*create pools - 32k fmrs of 8k buf, 4k fmrs of 1meg */ memset(&fmr_param, 0, sizeof(fmr_param)); - fmr_param.pool_size = (pages > 20) ? 8 * 1024 : 32*1024; + fmr_param.pool_size = size; fmr_param.dirty_watermark = 512; fmr_param.cache = 0; fmr_param.relaxed = 1; @@ -1580,17 +1590,21 @@ ssize_t ib_uverbs_reg_mr_relaxed(struct ib_uverbs_file *file, } if (!found) { - int pagesin8K = (8*1024 + PAGE_SIZE) >> PAGE_SHIFT; - int pagesin1M = (1024*1024 + PAGE_SIZE) >> PAGE_SHIFT; + int pool1pages = + (ufmr_pool1_blocksize + PAGE_SIZE) >> PAGE_SHIFT; + int pool2pages = + (ufmr_pool2_blocksize + PAGE_SIZE) >> PAGE_SHIFT; struct ib_pd *pool_pd = file->device->ib_dev->relaxed_pd; /* Create pool for 8kb buffers */ - ret = create_fmr_pool(pool_pd, pagesin8K, cmd.access_flags); + ret = create_fmr_pool(pool_pd, pool1pages, ufmr_pool1_nelems, + cmd.access_flags); if (ret < 0) goto err_put; /* Create pool for 1mb buffers */ - ret = create_fmr_pool(pool_pd, pagesin1M, cmd.access_flags); + ret = create_fmr_pool(pool_pd, pool2pages, ufmr_pool2_nelems, + cmd.access_flags); if (ret < 0) goto err_put; diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index c8b3ada3d4ca8..229772bb4050b 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c @@ -54,6 +54,18 @@ MODULE_AUTHOR("Roland Dreier"); MODULE_DESCRIPTION("InfiniBand userspace verbs access"); MODULE_LICENSE("Dual BSD/GPL"); +module_param(ufmr_pool1_blocksize, int, 0444); +MODULE_PARM_DESC(ufmr_pool1_blocksize, "Block size for Usermode FMR Pool 1"); + +module_param(ufmr_pool1_nelems, int, 0444); +MODULE_PARM_DESC(ufmr_pool1_nelems, "No of FMRs in Usermode FMR Pool 1"); + +module_param(ufmr_pool2_blocksize, int, 0444); +MODULE_PARM_DESC(ufmr_pool2_blocksize, "Block size for Usermode FMR Pool 2"); + +module_param(ufmr_pool2_nelems, int, 0444); +MODULE_PARM_DESC(ufmr_pool2_nelems, "No of FMRs in Usermode FMR Pool 2"); + enum { IB_UVERBS_MAJOR = 231, IB_UVERBS_BASE_MINOR = 192,