From nobody Sat Feb 7 04:47:11 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=1685568702; cv=none; d=zohomail.com; s=zohoarc; b=Y53KG41rdK+Zrbp6sL+HQ2j8OMht3yG/mMPrS2CpaMtmasQwvFvx/VuDoLrvzv/r77Z2pfAA8CgQk/Qtkw3XhF15WGZwc3tTFCCnUsRtQmNMpT/yl/ILcsXGDpEfBNr5tzP+AkTnz+Ul1fag1pRjTf2lK2oyacqPlGIZ5c91w/s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1685568702; 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=V5BTNYEJrMvEdgPHE9qghL8qlsXVOst+iBLMKLVFrSI=; b=Z781RdTJiZ1QfL+5uGkvFbzmGgOAGEzWM//EDPymlTqkz3u+NxiiC7RvhyAFID8///aE3Pn7ldsUnFfoP/Hnx3ehvncc+N+QYRlzyVu7ldoBo+yuDntfUvMtIVtr3GCV7afYV5g45A1+eKutgrGYPRJzEYaPR7al4NboEin9U0s= 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 1685568702204479.94168111873194; Wed, 31 May 2023 14:31:42 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.542011.845396 (Exim 4.92) (envelope-from ) id 1q4TPZ-0007eB-S3; Wed, 31 May 2023 21:31:17 +0000 Received: by outflank-mailman (output) from mailman id 542011.845396; Wed, 31 May 2023 21:31:17 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1q4TPZ-0007d6-Nr; Wed, 31 May 2023 21:31:17 +0000 Received: by outflank-mailman (input) for mailman id 542011; Wed, 31 May 2023 21:31:16 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1q4TPY-0006xu-Qd for xen-devel@lists.xenproject.org; Wed, 31 May 2023 21:31:16 +0000 Received: from mail-yw1-x112a.google.com (mail-yw1-x112a.google.com [2607:f8b0:4864:20::112a]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 7969a384-fffa-11ed-b231-6b7b168915f2; Wed, 31 May 2023 23:31:16 +0200 (CEST) Received: by mail-yw1-x112a.google.com with SMTP id 00721157ae682-5689335d2b6so710907b3.3 for ; Wed, 31 May 2023 14:31:16 -0700 (PDT) Received: from unknowna0e70b2ca394.attlocal.net ([2600:1700:2f7d:1800::46]) by smtp.googlemail.com with ESMTPSA id t63-20020a0dd142000000b0055aafcef659sm658905ywd.5.2023.05.31.14.31.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 May 2023 14:31:15 -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: 7969a384-fffa-11ed-b231-6b7b168915f2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1685568676; x=1688160676; 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=V5BTNYEJrMvEdgPHE9qghL8qlsXVOst+iBLMKLVFrSI=; b=ZOrjRpztCykn5S2UQynBNzBa3MWmWRXtFOidHPb8ljWg9idLGbr9+vMldhGKYgTruN 1934LTH9c2Wh9xXG+tZ6quTSzUJuhszO9LCf/AYBJsPXuQjHo4TfwO3yqkVoV4JnI7mh lK7Zjtt0YSLV9vHzTQP3W+nJ0auBkrTwfRrAwKmblLPqRjLTgj5BxN/zgR0xbn+upf0o apfiugG50HJ8VEu2RIDT+46U7OJf8q3uoGBfoRDouzvlyJiG8pcaDr4mVE+vzfndDM01 /Jv+1rxOJiA9ppMDbAjm8+j8FmFsNys3enhgZaJmy9pp0lvroiQaVp9oa4sPbWaYs1n7 Zxdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685568676; x=1688160676; 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=V5BTNYEJrMvEdgPHE9qghL8qlsXVOst+iBLMKLVFrSI=; b=begzDfcsW6XbMI+NOAXapE0XWTrMHXoABiOFotMQysGRmEOhF07uwGUEED+u9LZe4h YjKIyO1eTCCG+UY9HEEOHMF9kYSxAzOQLvLYJE8KCBpXPLeuAwV86BlM6BXi6s/Gx2VN KepIh0xs+JLYAfYDslSnhkMnd95/hC9rKzpfbd8i30nsosHq85I6sfgHeI4Ba/Mwh2X5 ikmSpO9GAdKhNBO6JKjNEKZT+lJ3TuGfUxe5ww53W7xitoUKJCOGZjtwb/z/P9lGRLuD otHt1IZrBhn1PlTRtAzhN1k2VYoA7AIh2FR78T4TIJXbd144YRJshfR+xEQlLjNTs6mx YJ4w== X-Gm-Message-State: AC+VfDzzqu8J5iz9PMOb7CWN+1KZtfSUFSFP5sVKBcUPhtfp6KcRT6Th gd1vCdXuLkcq1vU65vaj4HQ= X-Google-Smtp-Source: ACHHUZ7A4AW0g1EJo54eGQeBH+bfqFv0MB7wzzUtb0w1cODVt+jOCsqaj2lzyysVEFaa+9MnJMXYag== X-Received: by 2002:a0d:df81:0:b0:561:bd01:9ff with SMTP id i123-20020a0ddf81000000b00561bd0109ffmr7412356ywe.28.1685568675532; Wed, 31 May 2023 14:31:15 -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, "Vishal Moola (Oracle)" , David Hildenbrand , Claudio Imbrenda Subject: [PATCH v3 03/34] s390: Use pt_frag_refcount for pagetables Date: Wed, 31 May 2023 14:30:01 -0700 Message-Id: <20230531213032.25338-4-vishal.moola@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230531213032.25338-1-vishal.moola@gmail.com> References: <20230531213032.25338-1-vishal.moola@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1685568702630100003 Content-Type: text/plain; charset="utf-8" s390 currently uses _refcount to identify fragmented page tables. The page table struct already has a member pt_frag_refcount used by powerpc, so have s390 use that instead of the _refcount field as well. This improves the safety for _refcount and the page table tracking. This also allows us to simplify the tracking since we can once again use the lower byte of pt_frag_refcount instead of the upper byte of _refcount. Signed-off-by: Vishal Moola (Oracle) --- arch/s390/mm/pgalloc.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index 66ab68db9842..6b99932abc66 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -182,20 +182,17 @@ void page_table_free_pgste(struct page *page) * As follows from the above, no unallocated or fully allocated parent * pages are contained in mm_context_t::pgtable_list. * - * The upper byte (bits 24-31) of the parent page _refcount is used + * The lower byte (bits 0-7) of the parent page pt_frag_refcount is used * for tracking contained 2KB-pgtables and has the following format: * * PP AA - * 01234567 upper byte (bits 24-31) of struct page::_refcount + * 01234567 upper byte (bits 0-7) of struct page::pt_frag_refcount * || || * || |+--- upper 2KB-pgtable is allocated * || +---- lower 2KB-pgtable is allocated * |+------- upper 2KB-pgtable is pending for removal * +-------- lower 2KB-pgtable is pending for removal * - * (See commit 620b4e903179 ("s390: use _refcount for pgtables") on why - * using _refcount is possible). - * * When 2KB-pgtable is allocated the corresponding AA bit is set to 1. * The parent page is either: * - added to mm_context_t::pgtable_list in case the second half of the @@ -243,11 +240,12 @@ unsigned long *page_table_alloc(struct mm_struct *mm) if (!list_empty(&mm->context.pgtable_list)) { page =3D list_first_entry(&mm->context.pgtable_list, struct page, lru); - mask =3D atomic_read(&page->_refcount) >> 24; + mask =3D atomic_read(&page->pt_frag_refcount); /* * The pending removal bits must also be checked. * Failure to do so might lead to an impossible - * value of (i.e 0x13 or 0x23) written to _refcount. + * value of (i.e 0x13 or 0x23) written to + * pt_frag_refcount. * Such values violate the assumption that pending and * allocation bits are mutually exclusive, and the rest * of the code unrails as result. That could lead to @@ -259,8 +257,8 @@ unsigned long *page_table_alloc(struct mm_struct *mm) bit =3D mask & 1; /* =3D1 -> second 2K */ if (bit) table +=3D PTRS_PER_PTE; - atomic_xor_bits(&page->_refcount, - 0x01U << (bit + 24)); + atomic_xor_bits(&page->pt_frag_refcount, + 0x01U << bit); list_del(&page->lru); } } @@ -281,12 +279,12 @@ unsigned long *page_table_alloc(struct mm_struct *mm) table =3D (unsigned long *) page_to_virt(page); if (mm_alloc_pgste(mm)) { /* Return 4K page table with PGSTEs */ - atomic_xor_bits(&page->_refcount, 0x03U << 24); + atomic_xor_bits(&page->pt_frag_refcount, 0x03U); memset64((u64 *)table, _PAGE_INVALID, PTRS_PER_PTE); memset64((u64 *)table + PTRS_PER_PTE, 0, PTRS_PER_PTE); } else { /* Return the first 2K fragment of the page */ - atomic_xor_bits(&page->_refcount, 0x01U << 24); + atomic_xor_bits(&page->pt_frag_refcount, 0x01U); memset64((u64 *)table, _PAGE_INVALID, 2 * PTRS_PER_PTE); spin_lock_bh(&mm->context.lock); list_add(&page->lru, &mm->context.pgtable_list); @@ -323,22 +321,19 @@ void page_table_free(struct mm_struct *mm, unsigned l= ong *table) * will happen outside of the critical section from this * function or from __tlb_remove_table() */ - mask =3D atomic_xor_bits(&page->_refcount, 0x11U << (bit + 24)); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, 0x11U << bit); if (mask & 0x03U) list_add(&page->lru, &mm->context.pgtable_list); else list_del(&page->lru); spin_unlock_bh(&mm->context.lock); - mask =3D atomic_xor_bits(&page->_refcount, 0x10U << (bit + 24)); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, 0x10U << bit); if (mask !=3D 0x00U) return; half =3D 0x01U << bit; } else { half =3D 0x03U; - mask =3D atomic_xor_bits(&page->_refcount, 0x03U << 24); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, 0x03U); } =20 page_table_release_check(page, table, half, mask); @@ -368,8 +363,7 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsign= ed long *table, * outside of the critical section from __tlb_remove_table() or from * page_table_free() */ - mask =3D atomic_xor_bits(&page->_refcount, 0x11U << (bit + 24)); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, 0x11U << bit); if (mask & 0x03U) list_add_tail(&page->lru, &mm->context.pgtable_list); else @@ -391,14 +385,12 @@ void __tlb_remove_table(void *_table) return; case 0x01U: /* lower 2K of a 4K page table */ case 0x02U: /* higher 2K of a 4K page table */ - mask =3D atomic_xor_bits(&page->_refcount, mask << (4 + 24)); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, mask << 4); if (mask !=3D 0x00U) return; break; case 0x03U: /* 4K page table with pgstes */ - mask =3D atomic_xor_bits(&page->_refcount, 0x03U << 24); - mask >>=3D 24; + mask =3D atomic_xor_bits(&page->pt_frag_refcount, 0x03U); break; } =20 --=20 2.40.1