Amit,
On 2015/12/22 15:25, Amit Kucheria wrote:
On Tue, Dec 22, 2015 at 9:02 AM, chenfeng puck.chen@hisilicon.com wrote:
Hi, When memory is seriously fragmented.I can be failed while using kmalloc in loading firmware.
Can we change it to vmalloc? Are there someone familiar with this module?
You could, but vmalloc can be slower in most cases since it needs to create a virtual contiguous map of fragmented memory. And it seems from commit 6e03a201bb that it was changed from vmalloc to kmalloc for speed reasons.
Thanks for your sharing.
The commit id makes me know why it is.
Cheers.
No need to use use continuous memory, it may be fail when memory deeply fragmented.
Signed-off-by: Chen Feng puck.chen@hisilicon.com Signed-off-by: Xia Qing saberlily.xia@hisilicon.com
drivers/base/firmware_class.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 8524450..ff8672d 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -257,7 +257,7 @@ static void __fw_free_buf(struct kref *ref) vunmap(buf->data); for (i = 0; i < buf->nr_pages; i++) __free_page(buf->pages[i]);
kfree(buf->pages);
vfree(buf->pages); } else
#endif vfree(buf->data); @@ -660,7 +660,7 @@ static ssize_t firmware_loading_store(struct device *dev, if (!test_bit(FW_STATUS_DONE, &fw_buf->status)) { for (i = 0; i < fw_buf->nr_pages; i++) __free_page(fw_buf->pages[i]);
kfree(fw_buf->pages);
vfree(fw_buf->pages); fw_buf->pages = NULL; fw_buf->page_array_size = 0; fw_buf->nr_pages = 0;
@@ -770,8 +770,7 @@ static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) buf->page_array_size * 2); struct page **new_pages;
new_pages = kmalloc(new_array_size * sizeof(void *),
GFP_KERNEL);
new_pages = vmalloc(new_array_size * sizeof(void *)); if (!new_pages) { fw_load_abort(fw_priv); return -ENOMEM;
@@ -780,7 +779,7 @@ static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) buf->page_array_size * sizeof(void *)); memset(&new_pages[buf->page_array_size], 0, sizeof(void *) * (new_array_size - buf->page_array_size));
kfree(buf->pages);
vfree(buf->pages); buf->pages = new_pages; buf->page_array_size = new_array_size; }
https://lkml.org/lkml/2015/12/16/49
Dev mailing list Dev@lists.96boards.org https://lists.96boards.org/mailman/listinfo/dev
.