diff options
author | Roland Dreier <roland@eddore.topspincom.com> | 2005-08-19 13:36:11 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2005-08-26 23:37:37 -0400 |
commit | d20a40192868082eff6fec729b311cb8463b4a21 (patch) | |
tree | dae3cac48c76da789215cb9067559a7b721cbc5f /drivers | |
parent | c04bc3d1f417a8a90eef9ab46523dfd44858b28d (diff) |
[PATCH] IB/mthca: Handle context tables smaller than our chunk size
When creating a table in context memory where the table is smaller
than our chunk size, we don't want to allocate and map a full chunk.
Instead, allocate just enough memory to cover the table.
This can be pretty simple because all tables are a power-of-2 size, so
either the table is a multiple of the chunk size, or it's smaller than
one chunk.
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_memfree.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_memfree.c b/drivers/infiniband/hw/mthca/mthca_memfree.c index fba0a53ba6ea..1827400f189b 100644 --- a/drivers/infiniband/hw/mthca/mthca_memfree.c +++ b/drivers/infiniband/hw/mthca/mthca_memfree.c | |||
@@ -286,6 +286,7 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev, | |||
286 | { | 286 | { |
287 | struct mthca_icm_table *table; | 287 | struct mthca_icm_table *table; |
288 | int num_icm; | 288 | int num_icm; |
289 | unsigned chunk_size; | ||
289 | int i; | 290 | int i; |
290 | u8 status; | 291 | u8 status; |
291 | 292 | ||
@@ -306,7 +307,11 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev, | |||
306 | table->icm[i] = NULL; | 307 | table->icm[i] = NULL; |
307 | 308 | ||
308 | for (i = 0; i * MTHCA_TABLE_CHUNK_SIZE < reserved * obj_size; ++i) { | 309 | for (i = 0; i * MTHCA_TABLE_CHUNK_SIZE < reserved * obj_size; ++i) { |
309 | table->icm[i] = mthca_alloc_icm(dev, MTHCA_TABLE_CHUNK_SIZE >> PAGE_SHIFT, | 310 | chunk_size = MTHCA_TABLE_CHUNK_SIZE; |
311 | if ((i + 1) * MTHCA_TABLE_CHUNK_SIZE > nobj * obj_size) | ||
312 | chunk_size = nobj * obj_size - i * MTHCA_TABLE_CHUNK_SIZE; | ||
313 | |||
314 | table->icm[i] = mthca_alloc_icm(dev, chunk_size >> PAGE_SHIFT, | ||
310 | (use_lowmem ? GFP_KERNEL : GFP_HIGHUSER) | | 315 | (use_lowmem ? GFP_KERNEL : GFP_HIGHUSER) | |
311 | __GFP_NOWARN); | 316 | __GFP_NOWARN); |
312 | if (!table->icm[i]) | 317 | if (!table->icm[i]) |