mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-01 06:46:35 +01:00
firmware: Free temporary page table after vmapping
Once after performing vmap() to map the S/G pages, our own page table becomes superfluous since the pages can be released via vfree() automatically. Let's change the buffer release code and discard the page table array for saving some memory. Signed-off-by: Takashi Iwai <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
1 parent
64ae0e71c6
commit
ddaf29fd9b
2 files changed
+9
-4
No files matched your search
@@ -222,7 +222,7 @@ static ssize_t firmware_loading_show(struct device *dev,
|
||||
/* one pages buffer should be mapped/unmapped only once */
|
||||
static int map_fw_priv_pages(struct fw_priv *fw_priv)
|
||||
{
|
||||
if (!fw_priv->is_paged_buf)
|
||||
if (!fw_priv->pages)
|
||||
return 0;
|
||||
|
||||
vunmap(fw_priv->data);
|
||||
@@ -230,6 +230,11 @@ static int map_fw_priv_pages(struct fw_priv *fw_priv)
|
||||
PAGE_KERNEL_RO);
|
||||
if (!fw_priv->data)
|
||||
return -ENOMEM;
|
||||
|
||||
/* page table is no longer needed after mapping, let's free */
|
||||
vfree(fw_priv->pages);
|
||||
fw_priv->pages = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -252,13 +252,13 @@ static void __free_fw_priv(struct kref *ref)
|
||||
spin_unlock(&fwc->lock);
|
||||
|
||||
#ifdef CONFIG_FW_LOADER_USER_HELPER
|
||||
if (fw_priv->is_paged_buf) {
|
||||
if (fw_priv->pages) {
|
||||
/* free leftover pages */
|
||||
int i;
|
||||
vunmap(fw_priv->data);
|
||||
for (i = 0; i < fw_priv->nr_pages; i++)
|
||||
__free_page(fw_priv->pages[i]);
|
||||
vfree(fw_priv->pages);
|
||||
} else
|
||||
}
|
||||
#endif
|
||||
if (!fw_priv->allocated_size)
|
||||
vfree(fw_priv->data);
|
||||
|
||||
Reference in new issue
Block a user