firmware: Unify the paged buffer release helper
authorTakashi Iwai <tiwai@suse.de>
Mon, 20 May 2019 09:26:44 +0000 (11:26 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 10 Jun 2019 17:20:37 +0000 (19:20 +0200)
Use a common helper to release the paged buffer resources.
This is rather a preparation for the upcoming decompression support.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/firmware_loader/fallback.c
drivers/base/firmware_loader/firmware.h
drivers/base/firmware_loader/main.c

index a0a1856aac84608d338b42dd79df4b047ec05e40..8970a5315e85470606af414d15b457173b7df02a 100644 (file)
@@ -259,7 +259,6 @@ static ssize_t firmware_loading_store(struct device *dev,
        struct fw_priv *fw_priv;
        ssize_t written = count;
        int loading = simple_strtol(buf, NULL, 10);
-       int i;
 
        mutex_lock(&fw_lock);
        fw_priv = fw_sysfs->fw_priv;
@@ -270,12 +269,7 @@ static ssize_t firmware_loading_store(struct device *dev,
        case 1:
                /* discarding any previous partial load */
                if (!fw_sysfs_done(fw_priv)) {
-                       for (i = 0; i < fw_priv->nr_pages; i++)
-                               __free_page(fw_priv->pages[i]);
-                       vfree(fw_priv->pages);
-                       fw_priv->pages = NULL;
-                       fw_priv->page_array_size = 0;
-                       fw_priv->nr_pages = 0;
+                       fw_free_paged_buf(fw_priv);
                        fw_state_start(fw_priv);
                }
                break;
index 4c1395f8e7ed25d8dd623e888614a37b88eb071d..d20d4e7f9e71c57924aaeed5b529ed66307361d9 100644 (file)
@@ -133,4 +133,10 @@ static inline void fw_state_done(struct fw_priv *fw_priv)
 int assign_fw(struct firmware *fw, struct device *device,
              enum fw_opt opt_flags);
 
+#ifdef CONFIG_FW_LOADER_USER_HELPER
+void fw_free_paged_buf(struct fw_priv *fw_priv);
+#else
+static inline void fw_free_paged_buf(struct fw_priv *fw_priv) {}
+#endif
+
 #endif /* __FIRMWARE_LOADER_H */
index aed1a7c5671328edd1e5942f4e035d281d082416..083fc3e4f2fdebd5103afef19c09e426260f7034 100644 (file)
@@ -251,15 +251,7 @@ static void __free_fw_priv(struct kref *ref)
        list_del(&fw_priv->list);
        spin_unlock(&fwc->lock);
 
-#ifdef CONFIG_FW_LOADER_USER_HELPER
-       if (fw_priv->pages) {
-               /* free leftover pages */
-               int i;
-               for (i = 0; i < fw_priv->nr_pages; i++)
-                       __free_page(fw_priv->pages[i]);
-               vfree(fw_priv->pages);
-       }
-#endif
+       fw_free_paged_buf(fw_priv); /* free leftover pages */
        if (!fw_priv->allocated_size)
                vfree(fw_priv->data);
        kfree_const(fw_priv->fw_name);
@@ -274,6 +266,23 @@ static void free_fw_priv(struct fw_priv *fw_priv)
                spin_unlock(&fwc->lock);
 }
 
+#ifdef CONFIG_FW_LOADER_USER_HELPER
+void fw_free_paged_buf(struct fw_priv *fw_priv)
+{
+       int i;
+
+       if (!fw_priv->pages)
+               return;
+
+       for (i = 0; i < fw_priv->nr_pages; i++)
+               __free_page(fw_priv->pages[i]);
+       vfree(fw_priv->pages);
+       fw_priv->pages = NULL;
+       fw_priv->page_array_size = 0;
+       fw_priv->nr_pages = 0;
+}
+#endif
+
 /* direct firmware loading support */
 static char fw_path_para[256];
 static const char * const fw_path[] = {