aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@voltaire.com>2008-01-29 12:56:18 +0200
committerRoland Dreier <rolandd@cisco.com>2008-02-04 20:20:44 -0800
commit1d96354e617990799b1cb5d7ff8f7c467b8767c8 (patch)
tree7d106bf836c8cd99ee844845e71216e83c004248
parent9fe4bcf45ece0b0081031edaaa41581c85ef7049 (diff)
downloadkernel_samsung_smdk4412-1d96354e617990799b1cb5d7ff8f7c467b8767c8.zip
kernel_samsung_smdk4412-1d96354e617990799b1cb5d7ff8f7c467b8767c8.tar.gz
kernel_samsung_smdk4412-1d96354e617990799b1cb5d7ff8f7c467b8767c8.tar.bz2
IB/fmr_pool: Allocate page list for pool FMRs only when caching enabled
Allocate memory for the page_list field of struct ib_pool_fmr only when caching is enabled for the FMR pool, since the field is not used otherwise. This can save significant amounts of memory for large pools with caching turned off. Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
-rw-r--r--drivers/infiniband/core/fmr_pool.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c
index 6c7aa59..7f00347 100644
--- a/drivers/infiniband/core/fmr_pool.c
+++ b/drivers/infiniband/core/fmr_pool.c
@@ -320,10 +320,13 @@ struct ib_fmr_pool *ib_create_fmr_pool(struct ib_pd *pd,
.max_maps = pool->max_remaps,
.page_shift = params->page_shift
};
+ int bytes_per_fmr = sizeof *fmr;
+
+ if (pool->cache_bucket)
+ bytes_per_fmr += params->max_pages_per_fmr * sizeof (u64);
for (i = 0; i < params->pool_size; ++i) {
- fmr = kmalloc(sizeof *fmr + params->max_pages_per_fmr * sizeof (u64),
- GFP_KERNEL);
+ fmr = kmalloc(bytes_per_fmr, GFP_KERNEL);
if (!fmr) {
printk(KERN_WARNING PFX "failed to allocate fmr "
"struct for FMR %d\n", i);