s390/mm: Convert make_page_secure to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 22 Mar 2024 16:11:46 +0000 (16:11 +0000)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 9 Apr 2024 15:29:57 +0000 (17:29 +0200)
These page APIs are deprecated, so convert the incoming page to a folio
and use the folio APIs instead.  The ultravisor API cannot handle large
folios, so return -EINVAL if one has slipped through.

Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Link: https://lore.kernel.org/r/20240322161149.2327518-2-willy@infradead.org
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kernel/uv.c

index 2961db0..4ae1571 100644 (file)
@@ -182,21 +182,21 @@ int uv_convert_owned_from_secure(unsigned long paddr)
 }
 
 /*
- * Calculate the expected ref_count for a page that would otherwise have no
+ * Calculate the expected ref_count for a folio that would otherwise have no
  * further pins. This was cribbed from similar functions in other places in
  * the kernel, but with some slight modifications. We know that a secure
- * page can not be a huge page for example.
+ * folio can not be a large folio, for example.
  */
-static int expected_page_refs(struct page *page)
+static int expected_folio_refs(struct folio *folio)
 {
        int res;
 
-       res = page_mapcount(page);
-       if (PageSwapCache(page)) {
+       res = folio_mapcount(folio);
+       if (folio_test_swapcache(folio)) {
                res++;
-       } else if (page_mapping(page)) {
+       } else if (folio_mapping(folio)) {
                res++;
-               if (page_has_private(page))
+               if (folio->private)
                        res++;
        }
        return res;
@@ -204,14 +204,17 @@ static int expected_page_refs(struct page *page)
 
 static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
 {
+       struct folio *folio = page_folio(page);
        int expected, cc = 0;
 
-       if (PageWriteback(page))
+       if (folio_test_large(folio))
+               return -EINVAL;
+       if (folio_test_writeback(folio))
                return -EAGAIN;
-       expected = expected_page_refs(page);
-       if (!page_ref_freeze(page, expected))
+       expected = expected_folio_refs(folio);
+       if (!folio_ref_freeze(folio, expected))
                return -EBUSY;
-       set_bit(PG_arch_1, &page->flags);
+       set_bit(PG_arch_1, &folio->flags);
        /*
         * If the UVC does not succeed or fail immediately, we don't want to
         * loop for long, or we might get stall notifications.
@@ -221,9 +224,9 @@ static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
         * -EAGAIN and we let the callers deal with it.
         */
        cc = __uv_call(0, (u64)uvcb);
-       page_ref_unfreeze(page, expected);
+       folio_ref_unfreeze(folio, expected);
        /*
-        * Return -ENXIO if the page was not mapped, -EINVAL for other errors.
+        * Return -ENXIO if the folio was not mapped, -EINVAL for other errors.
         * If busy or partially completed, return -EAGAIN.
         */
        if (cc == UVC_CC_OK)