summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-05-20 05:26:45 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-06-10 13:20:37 -0400
commit993f5d11a9631face2bb597826b86f476a9b915b (patch)
tree2f775376f5e409dc8e41e368ecdce8fdfdb20fb1
parent8f58570b98c090a4544ef9eaea1f419706672845 (diff)
firmware: Use kvmalloc for page tables
This is a minor optimization to use kvmalloc() variant for allocating the page table for the SG-buffer. They aren't so big in general, so kmalloc() would fit often better. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/base/firmware_loader/fallback.c7
-rw-r--r--drivers/base/firmware_loader/main.c2
2 files changed, 5 insertions, 4 deletions
diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c
index 8970a5315e85..b5cd96fd0e77 100644
--- a/drivers/base/firmware_loader/fallback.c
+++ b/drivers/base/firmware_loader/fallback.c
@@ -232,7 +232,7 @@ static int map_fw_priv_pages(struct fw_priv *fw_priv)
232 return -ENOMEM; 232 return -ENOMEM;
233 233
234 /* page table is no longer needed after mapping, let's free */ 234 /* page table is no longer needed after mapping, let's free */
235 vfree(fw_priv->pages); 235 kvfree(fw_priv->pages);
236 fw_priv->pages = NULL; 236 fw_priv->pages = NULL;
237 237
238 return 0; 238 return 0;
@@ -397,7 +397,8 @@ static int fw_realloc_pages(struct fw_sysfs *fw_sysfs, int min_size)
397 fw_priv->page_array_size * 2); 397 fw_priv->page_array_size * 2);
398 struct page **new_pages; 398 struct page **new_pages;
399 399
400 new_pages = vmalloc(array_size(new_array_size, sizeof(void *))); 400 new_pages = kvmalloc_array(new_array_size, sizeof(void *),
401 GFP_KERNEL);
401 if (!new_pages) { 402 if (!new_pages) {
402 fw_load_abort(fw_sysfs); 403 fw_load_abort(fw_sysfs);
403 return -ENOMEM; 404 return -ENOMEM;
@@ -406,7 +407,7 @@ static int fw_realloc_pages(struct fw_sysfs *fw_sysfs, int min_size)
406 fw_priv->page_array_size * sizeof(void *)); 407 fw_priv->page_array_size * sizeof(void *));
407 memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) * 408 memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) *
408 (new_array_size - fw_priv->page_array_size)); 409 (new_array_size - fw_priv->page_array_size));
409 vfree(fw_priv->pages); 410 kvfree(fw_priv->pages);
410 fw_priv->pages = new_pages; 411 fw_priv->pages = new_pages;
411 fw_priv->page_array_size = new_array_size; 412 fw_priv->page_array_size = new_array_size;
412 } 413 }
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 083fc3e4f2fd..2e74a1b73dae 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -276,7 +276,7 @@ void fw_free_paged_buf(struct fw_priv *fw_priv)
276 276
277 for (i = 0; i < fw_priv->nr_pages; i++) 277 for (i = 0; i < fw_priv->nr_pages; i++)
278 __free_page(fw_priv->pages[i]); 278 __free_page(fw_priv->pages[i]);
279 vfree(fw_priv->pages); 279 kvfree(fw_priv->pages);
280 fw_priv->pages = NULL; 280 fw_priv->pages = NULL;
281 fw_priv->page_array_size = 0; 281 fw_priv->page_array_size = 0;
282 fw_priv->nr_pages = 0; 282 fw_priv->nr_pages = 0;