diff options
| -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]) |
