From nobody Mon Feb 9 09:52:59 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1686603921; cv=none; d=zohomail.com; s=zohoarc; b=lKGAfnv2Z+hlKsPE/WsR//sKU+e6Qkef2EIzoDag+JKs9cGI/9NukjjJ/sbzxKvK64DvKUySPB7TSa1YjTZziHMAXWTb5fbXt4g9Nb9eZJ7jG0703+oLigiLh+UC2fFBrhmxOukl+OaWsLxTZ+xvOXUzLhp8ikV5TXS/0vyA4Yw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686603921; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UyShpFpgVR6i39SmTUNSXyIOGqdGil6rpZQyINgvaNc=; b=h+IxXr9vCGELwZyOD1Tcq9uKkN8AX1KfHM1u52iUzniMtq+vIIf2W5Gq/GAVuOB4OLhQpamWs5B/b25qr57tbVdOPvefcWHZp5SWCW1tLhCdWWwpKd9tZF6ZuzYn+zM3kKx4k/BYKptwqpnqRdnTk7TaZS3/kXO0PIo8+CtHpT0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1686603921258290.435519712831; Mon, 12 Jun 2023 14:05:21 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.547470.854895 (Exim 4.92) (envelope-from ) id 1q8oid-00080B-6E; Mon, 12 Jun 2023 21:04:55 +0000 Received: by outflank-mailman (output) from mailman id 547470.854895; Mon, 12 Jun 2023 21:04:55 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1q8oid-000802-2u; Mon, 12 Jun 2023 21:04:55 +0000 Received: by outflank-mailman (input) for mailman id 547470; Mon, 12 Jun 2023 21:04:54 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1q8oic-0007zJ-BC for xen-devel@lists.xenproject.org; Mon, 12 Jun 2023 21:04:54 +0000 Received: from mail-oi1-x232.google.com (mail-oi1-x232.google.com [2607:f8b0:4864:20::232]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id c58953eb-0964-11ee-8611-37d641c3527e; Mon, 12 Jun 2023 23:04:51 +0200 (CEST) Received: by mail-oi1-x232.google.com with SMTP id 5614622812f47-3909756b8b1so1846502b6e.1 for ; Mon, 12 Jun 2023 14:04:51 -0700 (PDT) Received: from unknowna0e70b2ca394.attlocal.net ([2600:1700:2f7d:1800::16]) by smtp.googlemail.com with ESMTPSA id s125-20020a817783000000b00569eb609458sm2757115ywc.81.2023.06.12.14.04.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jun 2023 14:04:49 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: c58953eb-0964-11ee-8611-37d641c3527e DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1686603890; x=1689195890; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UyShpFpgVR6i39SmTUNSXyIOGqdGil6rpZQyINgvaNc=; b=lJvRaSYm1Jh5V4r7TYzrSMIRzNaBV5SN7nn3sPeT/jo1IMPwPzq9N3Yf3bBYoJxMZw v/s9XKD5xWNVmdGTxeR0fZvEchZcIS0T7ycmmKwo+IiJpZzms4PbxfB/j9f5cguGfKcu 19tKUcAlt5RAZhhxls5QyHPdh1rv4sFgWmQQk4hBjlJgClQsKjqjLXKzEmKGAt3IccFx bTspEu7foB7PWo5Hitw1Rj3gfCpK9XVe/YXdBcF4RWSMuHrTJZvwCj8dZahlFpbKNlhX XA60O6Ll3Y4mL+q/EvCYaosPT9jPlRTpVyELoVIXfZ/Aan4STf1XXuMIyJLW3RN7kUz5 rtxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686603890; x=1689195890; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UyShpFpgVR6i39SmTUNSXyIOGqdGil6rpZQyINgvaNc=; b=OVFGhoMgWe481Ksd/3wFD17xXmOe25WDj0C1laA86qjty0v2pt1jyDvEJ3cW2SRJRO 3uUTV+NaYAiBFY3gaIIxaVQL8yfNXvSgnvKl34QzbJ2hR2pRs6IzGu65MmjbHNXAgwf5 m1oWW2Eu1ytGfrdUKqg0Ty8XHhxusYQ/pWUlyM8X5faoTPXdjS04SsuVT8iVgkK0dTOq 01w7TEevZbujrO5kGKKaqPPtJsqDnMNpw0gDiXZofhoMhLP8zOr67sckaYAZ7+1olJvC SmgZHwtO0ZjwsXFn4iMPhIjJdbebjzO7uLw3LJD+jc7cQe+okMensFxWxyLQu+1JWrR2 HJeQ== X-Gm-Message-State: AC+VfDy6CWUxTxhWOirBFlqqk0SyM2GhJRKV1hrG8nSuJoCd/ZzM1f8q zeZ/jz5eO0h2y4InalU0Lyk= X-Google-Smtp-Source: ACHHUZ4VM+m5NUYLn8c0v/glSn3np4BOPgR5n2geFm21VkPM9gOZaCC7fKIMLbwOz31LgZ3ui1xNPA== X-Received: by 2002:a05:6358:cb27:b0:129:cce3:a876 with SMTP id gr39-20020a056358cb2700b00129cce3a876mr2647493rwb.19.1686603890151; Mon, 12 Jun 2023 14:04:50 -0700 (PDT) From: "Vishal Moola (Oracle)" To: Andrew Morton , Matthew Wilcox Cc: linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-csky@vger.kernel.org, linux-hexagon@vger.kernel.org, loongarch@lists.linux.dev, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, linux-openrisc@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, sparclinux@vger.kernel.org, linux-um@lists.infradead.org, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, Hugh Dickins , "Vishal Moola (Oracle)" , David Hildenbrand , Claudio Imbrenda Subject: [PATCH v4 02/34] s390: Use _pt_s390_gaddr for gmap address tracking Date: Mon, 12 Jun 2023 14:03:51 -0700 Message-Id: <20230612210423.18611-3-vishal.moola@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230612210423.18611-1-vishal.moola@gmail.com> References: <20230612210423.18611-1-vishal.moola@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1686603922993100004 Content-Type: text/plain; charset="utf-8" s390 uses page->index to keep track of page tables for the guest address space. In an attempt to consolidate the usage of page fields in s390, replace _pt_pad_2 with _pt_s390_gaddr to replace page->index in gmap. This will help with the splitting of struct ptdesc from struct page, as well as allow s390 to use _pt_frag_refcount for fragmented page table tracking. Since page->_pt_s390_gaddr aliases with mapping, ensure its set to NULL before freeing the pages as well. This also reverts commit 7e25de77bc5ea ("s390/mm: use pmd_pgtable_page() helper in __gmap_segment_gaddr()") which had s390 use pmd_pgtable_page() to get a gmap page table, as pmd_pgtable_page() should be used for more generic process page tables. Signed-off-by: Vishal Moola (Oracle) Acked-by: Mike Rapoport (IBM) --- arch/s390/mm/gmap.c | 56 +++++++++++++++++++++++++++------------- include/linux/mm_types.h | 2 +- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c index dc90d1eb0d55..81c683426b49 100644 --- a/arch/s390/mm/gmap.c +++ b/arch/s390/mm/gmap.c @@ -70,7 +70,7 @@ static struct gmap *gmap_alloc(unsigned long limit) page =3D alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER); if (!page) goto out_free; - page->index =3D 0; + page->_pt_s390_gaddr =3D 0; list_add(&page->lru, &gmap->crst_list); table =3D page_to_virt(page); crst_table_init(table, etype); @@ -187,16 +187,20 @@ static void gmap_free(struct gmap *gmap) if (!(gmap_is_shadow(gmap) && gmap->removed)) gmap_flush_tlb(gmap); /* Free all segment & region tables. */ - list_for_each_entry_safe(page, next, &gmap->crst_list, lru) + list_for_each_entry_safe(page, next, &gmap->crst_list, lru) { + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); + } gmap_radix_tree_free(&gmap->guest_to_host); gmap_radix_tree_free(&gmap->host_to_guest); =20 /* Free additional data for a shadow gmap */ if (gmap_is_shadow(gmap)) { /* Free all page tables. */ - list_for_each_entry_safe(page, next, &gmap->pt_list, lru) + list_for_each_entry_safe(page, next, &gmap->pt_list, lru) { + page->_pt_s390_gaddr =3D 0; page_table_free_pgste(page); + } gmap_rmap_radix_tree_free(&gmap->host_to_rmap); /* Release reference to the parent */ gmap_put(gmap->parent); @@ -318,12 +322,14 @@ static int gmap_alloc_table(struct gmap *gmap, unsign= ed long *table, list_add(&page->lru, &gmap->crst_list); *table =3D __pa(new) | _REGION_ENTRY_LENGTH | (*table & _REGION_ENTRY_TYPE_MASK); - page->index =3D gaddr; + page->_pt_s390_gaddr =3D gaddr; page =3D NULL; } spin_unlock(&gmap->guest_table_lock); - if (page) + if (page) { + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); + } return 0; } =20 @@ -336,12 +342,14 @@ static int gmap_alloc_table(struct gmap *gmap, unsign= ed long *table, static unsigned long __gmap_segment_gaddr(unsigned long *entry) { struct page *page; - unsigned long offset; + unsigned long offset, mask; =20 offset =3D (unsigned long) entry / sizeof(unsigned long); offset =3D (offset & (PTRS_PER_PMD - 1)) * PMD_SIZE; - page =3D pmd_pgtable_page((pmd_t *) entry); - return page->index + offset; + mask =3D ~(PTRS_PER_PMD * sizeof(pmd_t) - 1); + page =3D virt_to_page((void *)((unsigned long) entry & mask)); + + return page->_pt_s390_gaddr + offset; } =20 /** @@ -1351,6 +1359,7 @@ static void gmap_unshadow_pgt(struct gmap *sg, unsign= ed long raddr) /* Free page table */ page =3D phys_to_page(pgt); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; page_table_free_pgste(page); } =20 @@ -1379,6 +1388,7 @@ static void __gmap_unshadow_sgt(struct gmap *sg, unsi= gned long raddr, /* Free page table */ page =3D phys_to_page(pgt); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; page_table_free_pgste(page); } } @@ -1409,6 +1419,7 @@ static void gmap_unshadow_sgt(struct gmap *sg, unsign= ed long raddr) /* Free segment table */ page =3D phys_to_page(sgt); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } =20 @@ -1437,6 +1448,7 @@ static void __gmap_unshadow_r3t(struct gmap *sg, unsi= gned long raddr, /* Free segment table */ page =3D phys_to_page(sgt); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } } @@ -1467,6 +1479,7 @@ static void gmap_unshadow_r3t(struct gmap *sg, unsign= ed long raddr) /* Free region 3 table */ page =3D phys_to_page(r3t); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } =20 @@ -1495,6 +1508,7 @@ static void __gmap_unshadow_r2t(struct gmap *sg, unsi= gned long raddr, /* Free region 3 table */ page =3D phys_to_page(r3t); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } } @@ -1525,6 +1539,7 @@ static void gmap_unshadow_r2t(struct gmap *sg, unsign= ed long raddr) /* Free region 2 table */ page =3D phys_to_page(r2t); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } =20 @@ -1557,6 +1572,7 @@ static void __gmap_unshadow_r1t(struct gmap *sg, unsi= gned long raddr, /* Free region 2 table */ page =3D phys_to_page(r2t); list_del(&page->lru); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); } } @@ -1762,9 +1778,9 @@ int gmap_shadow_r2t(struct gmap *sg, unsigned long sa= ddr, unsigned long r2t, page =3D alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER); if (!page) return -ENOMEM; - page->index =3D r2t & _REGION_ENTRY_ORIGIN; + page->_pt_s390_gaddr =3D r2t & _REGION_ENTRY_ORIGIN; if (fake) - page->index |=3D GMAP_SHADOW_FAKE_TABLE; + page->_pt_s390_gaddr |=3D GMAP_SHADOW_FAKE_TABLE; s_r2t =3D page_to_phys(page); /* Install shadow region second table */ spin_lock(&sg->guest_table_lock); @@ -1814,6 +1830,7 @@ int gmap_shadow_r2t(struct gmap *sg, unsigned long sa= ddr, unsigned long r2t, return rc; out_free: spin_unlock(&sg->guest_table_lock); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); return rc; } @@ -1846,9 +1863,9 @@ int gmap_shadow_r3t(struct gmap *sg, unsigned long sa= ddr, unsigned long r3t, page =3D alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER); if (!page) return -ENOMEM; - page->index =3D r3t & _REGION_ENTRY_ORIGIN; + page->_pt_s390_gaddr =3D r3t & _REGION_ENTRY_ORIGIN; if (fake) - page->index |=3D GMAP_SHADOW_FAKE_TABLE; + page->_pt_s390_gaddr |=3D GMAP_SHADOW_FAKE_TABLE; s_r3t =3D page_to_phys(page); /* Install shadow region second table */ spin_lock(&sg->guest_table_lock); @@ -1898,6 +1915,7 @@ int gmap_shadow_r3t(struct gmap *sg, unsigned long sa= ddr, unsigned long r3t, return rc; out_free: spin_unlock(&sg->guest_table_lock); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); return rc; } @@ -1930,9 +1948,9 @@ int gmap_shadow_sgt(struct gmap *sg, unsigned long sa= ddr, unsigned long sgt, page =3D alloc_pages(GFP_KERNEL_ACCOUNT, CRST_ALLOC_ORDER); if (!page) return -ENOMEM; - page->index =3D sgt & _REGION_ENTRY_ORIGIN; + page->_pt_s390_gaddr =3D sgt & _REGION_ENTRY_ORIGIN; if (fake) - page->index |=3D GMAP_SHADOW_FAKE_TABLE; + page->_pt_s390_gaddr |=3D GMAP_SHADOW_FAKE_TABLE; s_sgt =3D page_to_phys(page); /* Install shadow region second table */ spin_lock(&sg->guest_table_lock); @@ -1982,6 +2000,7 @@ int gmap_shadow_sgt(struct gmap *sg, unsigned long sa= ddr, unsigned long sgt, return rc; out_free: spin_unlock(&sg->guest_table_lock); + page->_pt_s390_gaddr =3D 0; __free_pages(page, CRST_ALLOC_ORDER); return rc; } @@ -2014,9 +2033,9 @@ int gmap_shadow_pgt_lookup(struct gmap *sg, unsigned = long saddr, if (table && !(*table & _SEGMENT_ENTRY_INVALID)) { /* Shadow page tables are full pages (pte+pgste) */ page =3D pfn_to_page(*table >> PAGE_SHIFT); - *pgt =3D page->index & ~GMAP_SHADOW_FAKE_TABLE; + *pgt =3D page->_pt_s390_gaddr & ~GMAP_SHADOW_FAKE_TABLE; *dat_protection =3D !!(*table & _SEGMENT_ENTRY_PROTECT); - *fake =3D !!(page->index & GMAP_SHADOW_FAKE_TABLE); + *fake =3D !!(page->_pt_s390_gaddr & GMAP_SHADOW_FAKE_TABLE); rc =3D 0; } else { rc =3D -EAGAIN; @@ -2054,9 +2073,9 @@ int gmap_shadow_pgt(struct gmap *sg, unsigned long sa= ddr, unsigned long pgt, page =3D page_table_alloc_pgste(sg->mm); if (!page) return -ENOMEM; - page->index =3D pgt & _SEGMENT_ENTRY_ORIGIN; + page->_pt_s390_gaddr =3D pgt & _SEGMENT_ENTRY_ORIGIN; if (fake) - page->index |=3D GMAP_SHADOW_FAKE_TABLE; + page->_pt_s390_gaddr |=3D GMAP_SHADOW_FAKE_TABLE; s_pgt =3D page_to_phys(page); /* Install shadow page table */ spin_lock(&sg->guest_table_lock); @@ -2101,6 +2120,7 @@ int gmap_shadow_pgt(struct gmap *sg, unsigned long sa= ddr, unsigned long pgt, return rc; out_free: spin_unlock(&sg->guest_table_lock); + page->_pt_s390_gaddr =3D 0; page_table_free_pgste(page); return rc; =20 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 306a3d1a0fa6..6161fe1ae5b8 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -144,7 +144,7 @@ struct page { struct { /* Page table pages */ unsigned long _pt_pad_1; /* compound_head */ pgtable_t pmd_huge_pte; /* protected by page->ptl */ - unsigned long _pt_pad_2; /* mapping */ + unsigned long _pt_s390_gaddr; /* mapping */ union { struct mm_struct *pt_mm; /* x86 pgds only */ atomic_t pt_frag_refcount; /* powerpc */ --=20 2.40.1