xen/grant-table: Make set/clear page private code shared
authorOleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
Fri, 20 Jul 2018 09:01:43 +0000 (12:01 +0300)
committerBoris Ostrovsky <boris.ostrovsky@oracle.com>
Fri, 27 Jul 2018 03:05:13 +0000 (23:05 -0400)
Make set/clear page private code shared and accessible to
other kernel modules which can re-use these instead of open-coding.

Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
drivers/xen/grant-table.c
include/xen/grant_table.h

index ba9f3eec2bd00f6f39eb952ed5815e7b45c9735e..bb4840653bf204f9a9f964ef06820e54ecd9d910 100644 (file)
@@ -769,29 +769,18 @@ void gnttab_free_auto_xlat_frames(void)
 }
 EXPORT_SYMBOL_GPL(gnttab_free_auto_xlat_frames);
 
-/**
- * gnttab_alloc_pages - alloc pages suitable for grant mapping into
- * @nr_pages: number of pages to alloc
- * @pages: returns the pages
- */
-int gnttab_alloc_pages(int nr_pages, struct page **pages)
+int gnttab_pages_set_private(int nr_pages, struct page **pages)
 {
        int i;
-       int ret;
-
-       ret = alloc_xenballooned_pages(nr_pages, pages);
-       if (ret < 0)
-               return ret;
 
        for (i = 0; i < nr_pages; i++) {
 #if BITS_PER_LONG < 64
                struct xen_page_foreign *foreign;
 
                foreign = kzalloc(sizeof(*foreign), GFP_KERNEL);
-               if (!foreign) {
-                       gnttab_free_pages(nr_pages, pages);
+               if (!foreign)
                        return -ENOMEM;
-               }
+
                set_page_private(pages[i], (unsigned long)foreign);
 #endif
                SetPagePrivate(pages[i]);
@@ -799,14 +788,30 @@ int gnttab_alloc_pages(int nr_pages, struct page **pages)
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
+EXPORT_SYMBOL_GPL(gnttab_pages_set_private);
 
 /**
- * gnttab_free_pages - free pages allocated by gnttab_alloc_pages()
- * @nr_pages; number of pages to free
- * @pages: the pages
+ * gnttab_alloc_pages - alloc pages suitable for grant mapping into
+ * @nr_pages: number of pages to alloc
+ * @pages: returns the pages
  */
-void gnttab_free_pages(int nr_pages, struct page **pages)
+int gnttab_alloc_pages(int nr_pages, struct page **pages)
+{
+       int ret;
+
+       ret = alloc_xenballooned_pages(nr_pages, pages);
+       if (ret < 0)
+               return ret;
+
+       ret = gnttab_pages_set_private(nr_pages, pages);
+       if (ret < 0)
+               gnttab_free_pages(nr_pages, pages);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
+
+void gnttab_pages_clear_private(int nr_pages, struct page **pages)
 {
        int i;
 
@@ -818,6 +823,17 @@ void gnttab_free_pages(int nr_pages, struct page **pages)
                        ClearPagePrivate(pages[i]);
                }
        }
+}
+EXPORT_SYMBOL_GPL(gnttab_pages_clear_private);
+
+/**
+ * gnttab_free_pages - free pages allocated by gnttab_alloc_pages()
+ * @nr_pages; number of pages to free
+ * @pages: the pages
+ */
+void gnttab_free_pages(int nr_pages, struct page **pages)
+{
+       gnttab_pages_clear_private(nr_pages, pages);
        free_xenballooned_pages(nr_pages, pages);
 }
 EXPORT_SYMBOL_GPL(gnttab_free_pages);
index 2e37741f6b8d0f99390550ad663a2954902688ba..de03f2542bb78c0b9a56c6dd025bb9e7358cf25c 100644 (file)
@@ -198,6 +198,9 @@ void gnttab_free_auto_xlat_frames(void);
 int gnttab_alloc_pages(int nr_pages, struct page **pages);
 void gnttab_free_pages(int nr_pages, struct page **pages);
 
+int gnttab_pages_set_private(int nr_pages, struct page **pages);
+void gnttab_pages_clear_private(int nr_pages, struct page **pages);
+
 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
                    struct gnttab_map_grant_ref *kmap_ops,
                    struct page **pages, unsigned int count);