Fix an issue where only PAGE_SIZE bytes are allocated per
scatter-gather entry (SGE) regardless of the actual message
size: Furthermore, use buddy memory allocation technique to
allocate/free memmory (if possible) to reduce SGE.
Orabug:
21894138
Signed-off-by: Wei Lin Guay <wei.lin.guay@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
for (i = 0; i < rm->data.op_nents; i++) {
rdsdebug("putting data page %p\n", (void *)sg_page(&rm->data.op_sg[i]));
/* XXX will have to put_page for page refs */
- __free_page(sg_page(&rm->data.op_sg[i]));
+ (rm->data.op_sg[i].length <= PAGE_SIZE) ?
+ __free_page(sg_page(&rm->data.op_sg[i])) :
+ __free_pages(sg_page(&rm->data.op_sg[i]),
+ get_order(rm->data.op_sg[i].length));
}
rm->data.op_nents = 0;
/* jump straight to allocation if we're trying for a huge page */
if (bytes >= PAGE_SIZE) {
- page = alloc_page(gfp);
+ page = alloc_pages(gfp, get_order(bytes));
if (!page) {
ret = -ENOMEM;
} else {
- sg_set_page(scat, page, PAGE_SIZE, 0);
+ sg_set_page(scat, page, bytes, 0);
ret = 0;
}
goto out;