diff options
author | Eli Cohen <eli@mellanox.co.il> | 2009-05-27 17:36:16 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2009-05-27 17:36:16 -0400 |
commit | c1f67a88bf62fac0f4151c007b361199c2cd1988 (patch) | |
tree | 5bb527966e1a6cd2a3c06f6df70199df948e3817 /drivers/infiniband/hw/mthca/mthca_mr.c | |
parent | 210af919c949a7d6bd330916ef376cec2907d81e (diff) |
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_mr.c')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_mr.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c index 882e6b735915..d606edf10858 100644 --- a/drivers/infiniband/hw/mthca/mthca_mr.c +++ b/drivers/infiniband/hw/mthca/mthca_mr.c | |||
@@ -220,7 +220,7 @@ static struct mthca_mtt *__mthca_alloc_mtt(struct mthca_dev *dev, int size, | |||
220 | 220 | ||
221 | mtt->buddy = buddy; | 221 | mtt->buddy = buddy; |
222 | mtt->order = 0; | 222 | mtt->order = 0; |
223 | for (i = MTHCA_MTT_SEG_SIZE / 8; i < size; i <<= 1) | 223 | for (i = dev->limits.mtt_seg_size / 8; i < size; i <<= 1) |
224 | ++mtt->order; | 224 | ++mtt->order; |
225 | 225 | ||
226 | mtt->first_seg = mthca_alloc_mtt_range(dev, mtt->order, buddy); | 226 | mtt->first_seg = mthca_alloc_mtt_range(dev, mtt->order, buddy); |
@@ -267,7 +267,7 @@ static int __mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt, | |||
267 | 267 | ||
268 | while (list_len > 0) { | 268 | while (list_len > 0) { |
269 | mtt_entry[0] = cpu_to_be64(dev->mr_table.mtt_base + | 269 | mtt_entry[0] = cpu_to_be64(dev->mr_table.mtt_base + |
270 | mtt->first_seg * MTHCA_MTT_SEG_SIZE + | 270 | mtt->first_seg * dev->limits.mtt_seg_size + |
271 | start_index * 8); | 271 | start_index * 8); |
272 | mtt_entry[1] = 0; | 272 | mtt_entry[1] = 0; |
273 | for (i = 0; i < list_len && i < MTHCA_MAILBOX_SIZE / 8 - 2; ++i) | 273 | for (i = 0; i < list_len && i < MTHCA_MAILBOX_SIZE / 8 - 2; ++i) |
@@ -326,7 +326,7 @@ static void mthca_tavor_write_mtt_seg(struct mthca_dev *dev, | |||
326 | u64 __iomem *mtts; | 326 | u64 __iomem *mtts; |
327 | int i; | 327 | int i; |
328 | 328 | ||
329 | mtts = dev->mr_table.tavor_fmr.mtt_base + mtt->first_seg * MTHCA_MTT_SEG_SIZE + | 329 | mtts = dev->mr_table.tavor_fmr.mtt_base + mtt->first_seg * dev->limits.mtt_seg_size + |
330 | start_index * sizeof (u64); | 330 | start_index * sizeof (u64); |
331 | for (i = 0; i < list_len; ++i) | 331 | for (i = 0; i < list_len; ++i) |
332 | mthca_write64_raw(cpu_to_be64(buffer_list[i] | MTHCA_MTT_FLAG_PRESENT), | 332 | mthca_write64_raw(cpu_to_be64(buffer_list[i] | MTHCA_MTT_FLAG_PRESENT), |
@@ -345,10 +345,10 @@ static void mthca_arbel_write_mtt_seg(struct mthca_dev *dev, | |||
345 | /* For Arbel, all MTTs must fit in the same page. */ | 345 | /* For Arbel, all MTTs must fit in the same page. */ |
346 | BUG_ON(s / PAGE_SIZE != (s + list_len * sizeof(u64) - 1) / PAGE_SIZE); | 346 | BUG_ON(s / PAGE_SIZE != (s + list_len * sizeof(u64) - 1) / PAGE_SIZE); |
347 | /* Require full segments */ | 347 | /* Require full segments */ |
348 | BUG_ON(s % MTHCA_MTT_SEG_SIZE); | 348 | BUG_ON(s % dev->limits.mtt_seg_size); |
349 | 349 | ||
350 | mtts = mthca_table_find(dev->mr_table.mtt_table, mtt->first_seg + | 350 | mtts = mthca_table_find(dev->mr_table.mtt_table, mtt->first_seg + |
351 | s / MTHCA_MTT_SEG_SIZE, &dma_handle); | 351 | s / dev->limits.mtt_seg_size, &dma_handle); |
352 | 352 | ||
353 | BUG_ON(!mtts); | 353 | BUG_ON(!mtts); |
354 | 354 | ||
@@ -479,7 +479,7 @@ int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, | |||
479 | if (mr->mtt) | 479 | if (mr->mtt) |
480 | mpt_entry->mtt_seg = | 480 | mpt_entry->mtt_seg = |
481 | cpu_to_be64(dev->mr_table.mtt_base + | 481 | cpu_to_be64(dev->mr_table.mtt_base + |
482 | mr->mtt->first_seg * MTHCA_MTT_SEG_SIZE); | 482 | mr->mtt->first_seg * dev->limits.mtt_seg_size); |
483 | 483 | ||
484 | if (0) { | 484 | if (0) { |
485 | mthca_dbg(dev, "Dumping MPT entry %08x:\n", mr->ibmr.lkey); | 485 | mthca_dbg(dev, "Dumping MPT entry %08x:\n", mr->ibmr.lkey); |
@@ -626,7 +626,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd, | |||
626 | goto err_out_table; | 626 | goto err_out_table; |
627 | } | 627 | } |
628 | 628 | ||
629 | mtt_seg = mr->mtt->first_seg * MTHCA_MTT_SEG_SIZE; | 629 | mtt_seg = mr->mtt->first_seg * dev->limits.mtt_seg_size; |
630 | 630 | ||
631 | if (mthca_is_memfree(dev)) { | 631 | if (mthca_is_memfree(dev)) { |
632 | mr->mem.arbel.mtts = mthca_table_find(dev->mr_table.mtt_table, | 632 | mr->mem.arbel.mtts = mthca_table_find(dev->mr_table.mtt_table, |
@@ -908,7 +908,7 @@ int mthca_init_mr_table(struct mthca_dev *dev) | |||
908 | dev->mr_table.mtt_base); | 908 | dev->mr_table.mtt_base); |
909 | 909 | ||
910 | dev->mr_table.tavor_fmr.mtt_base = | 910 | dev->mr_table.tavor_fmr.mtt_base = |
911 | ioremap(addr, mtts * MTHCA_MTT_SEG_SIZE); | 911 | ioremap(addr, mtts * dev->limits.mtt_seg_size); |
912 | if (!dev->mr_table.tavor_fmr.mtt_base) { | 912 | if (!dev->mr_table.tavor_fmr.mtt_base) { |
913 | mthca_warn(dev, "MTT ioremap for FMR failed.\n"); | 913 | mthca_warn(dev, "MTT ioremap for FMR failed.\n"); |
914 | err = -ENOMEM; | 914 | err = -ENOMEM; |