s390/mm: use compound page order to distinguish page tables
authorAlexander Gordeev <agordeev@linux.ibm.com>
Fri, 3 Nov 2023 15:40:13 +0000 (16:40 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Sun, 5 Nov 2023 21:34:58 +0000 (22:34 +0100)
CRSTs always have size of four pages, while 2KB-size page tables
always occupy a single page. Use that information to distinguish
page tables from CRSTs.

Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/mm/pgalloc.c

index 5b15b45941c6ced3d508096dea450b1c9fe5b642..8159f4fade3f505cceedfbdb86a16deb8ed88b0f 100644 (file)
@@ -199,20 +199,15 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table,
        mm = tlb->mm;
        if (mm_alloc_pgste(mm))
                gmap_unlink(mm, table, vmaddr);
-       table = (unsigned long *)((unsigned long)table | 0x01U);
        tlb_remove_ptdesc(tlb, table);
 }
 
-void __tlb_remove_table(void *_table)
+void __tlb_remove_table(void *table)
 {
-       struct ptdesc *ptdesc;
-       unsigned int mask;
-       void *table;
+       struct ptdesc *ptdesc = virt_to_ptdesc(table);
+       struct page *page = ptdesc_page(ptdesc);
 
-       mask = (unsigned long)_table & 0x01U;
-       table = (void *)((unsigned long)_table ^ mask);
-       ptdesc = virt_to_ptdesc(table);
-       if (!mask) {
+       if (compound_order(page) == CRST_ALLOC_ORDER) {
                /* pmd, pud, or p4d */
                pagetable_free(ptdesc);
                return;