staging: vc04_services: Convert get_user_pages*() --> pin_user_pages*()
authorSouptick Joarder <jrdr.linux@gmail.com>
Tue, 2 Jun 2020 18:54:17 +0000 (00:24 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Jun 2020 07:53:21 +0000 (09:53 +0200)
In 2019, we introduced pin_user_pages*() and now we are converting
get_user_pages*() to the new API as appropriate. [1] & [2] could
be referred for more information.

[1] Documentation/core-api/pin_user_pages.rst

[2] "Explicit pinning of user-space pages":
        https://lwn.net/Articles/807108/

Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
Cc: John Hubbard <jhubbard@nvidia.com>
Link: https://lore.kernel.org/r/1591124057-27696-1-git-send-email-jrdr.linux@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c

index 38a13e4..4616013 100644 (file)
@@ -287,12 +287,8 @@ cleanup_pagelistinfo(struct vchiq_pagelist_info *pagelistinfo)
                             pagelistinfo->num_pages, pagelistinfo->dma_dir);
        }
 
-       if (pagelistinfo->pages_need_release) {
-               unsigned int i;
-
-               for (i = 0; i < pagelistinfo->num_pages; i++)
-                       put_page(pagelistinfo->pages[i]);
-       }
+       if (pagelistinfo->pages_need_release)
+               unpin_user_pages(pagelistinfo->pages, pagelistinfo->num_pages);
 
        dma_free_coherent(g_dev, pagelistinfo->pagelist_buffer_size,
                          pagelistinfo->pagelist, pagelistinfo->dma_addr);
@@ -395,7 +391,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type)
                }
                /* do not try and release vmalloc pages */
        } else {
-               actual_pages = get_user_pages_fast(
+               actual_pages = pin_user_pages_fast(
                                          (unsigned long)buf & PAGE_MASK,
                                          num_pages,
                                          type == PAGELIST_READ,
@@ -407,10 +403,8 @@ create_pagelist(char __user *buf, size_t count, unsigned short type)
                                       __func__, actual_pages, num_pages);
 
                        /* This is probably due to the process being killed */
-                       while (actual_pages > 0) {
-                               actual_pages--;
-                               put_page(pages[actual_pages]);
-                       }
+                       if (actual_pages > 0)
+                               unpin_user_pages(pages, actual_pages);
                        cleanup_pagelistinfo(pagelistinfo);
                        return NULL;
                }