From patchwork Thu Dec 16 17:47:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 1569333 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JFKMr0D99z9sRK for ; Fri, 17 Dec 2021 04:48:07 +1100 (AEDT) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4JFKMq1wDmz3bbF for ; Fri, 17 Dec 2021 04:48:07 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=csgroup.eu (client-ip=2a01:111:f400:7e18::609; helo=fra01-pr2-obe.outbound.protection.outlook.com; envelope-from=christophe.leroy@csgroup.eu; receiver=) Received: from FRA01-PR2-obe.outbound.protection.outlook.com (mail-pr2fra01on0609.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e18::609]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4JFKMc31ckz2yJF for ; Fri, 17 Dec 2021 04:47:54 +1100 (AEDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IIZH/FnoDlsMslOXFtDB02ifnwZUkTD0xhCVNRfxsynmMJukj+lvo4D5mid5jrxHY+Wr39u7UhSvVKwjPRVll66c4mnwACYATLoeT+fygReFad0EbyIHkXmYscrIUJIlq6isiM+OFZdxiR7SLuMSuSjc+c7c9EabXJb1L3cA3/qT6UlR0/MOlOwNHSFGwfYaGm3BqP0e2bXIEWsZy7rzGI5p84FblIb23mB0ZtSTlmD3mp5QQ1RpmPX8l2RC6L3H8SBhxRO0A/37GCmJYCXG3Da/1SbpgP1m/khfMBQxL2CCUQDOE/bknmSjHCi/qejQ/C74CN+wfe177LdaeZV5gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ZNCU92j9qgjTOOtwQjgdmBFdzmujqbrzEVNjgl8UNDk=; b=IjQIFC4Uf8cVgXpHff+34YEt0aVlwc0bL+vzbje+hxP+QIGnS9Lk7oiUoGmq55ldqROd6GZL5136j2pQI3A2E5ym9nugjovqLrW0ILEOHiekAq8QHvjW8/ot5t8XgOCgLyKF3LtwZ0fbkNpWzyW7c9lUtmfwlwezhDQyMlEYPTGZjGhFDm1PnfbmSfE1J6vabAhYX8IjPw3vDRYQeDOH8aXaGxHzww7SJSc5uubdilCZxqUlx75G6vM8isZp8wWhbX2YEDsLxPNtznhv4v+6W9OqFF0tlds+staNLq9OFEqOeKTA90uaIbQhtxZHm0MWhPDAGaIvLNnZH1Vtt5X4Og== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=csgroup.eu; dmarc=pass action=none header.from=csgroup.eu; dkim=pass header.d=csgroup.eu; arc=none Received: from MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::7) by MRXP264MB0040.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:18::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4778.16; Thu, 16 Dec 2021 17:47:33 +0000 Received: from MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM ([fe80::30e4:16d5:f514:b8f8]) by MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM ([fe80::30e4:16d5:f514:b8f8%2]) with mapi id 15.20.4801.015; Thu, 16 Dec 2021 17:47:33 +0000 From: Christophe Leroy To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Subject: [PATCH v2 1/2] powerpc/set_memory: Avoid spinlock recursion in change_page_attr() Thread-Topic: [PATCH v2 1/2] powerpc/set_memory: Avoid spinlock recursion in change_page_attr() Thread-Index: AQHX8qUBgZlGk5AZtkeEGUMOS24Aew== Date: Thu, 16 Dec 2021 17:47:33 +0000 Message-ID: <112b55c5fe019fefc284e3361772b00345fa0967.1639676816.git.christophe.leroy@csgroup.eu> Accept-Language: fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=csgroup.eu; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 55fae6c4-bfab-4981-6ec5-08d9c0bc23d2 x-ms-traffictypediagnostic: MRXP264MB0040:EE_ x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:741; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: XRTDJK6KpVIizi9xR1QnHiK4gRF4n04Y8XZyH7I4t2fp+OJNJ5QBGj4t9rT7Um7JL1o3IxUN7kT2j3xmzhebM3QYPAHhjC54iyKg7Mh1X2W+o6Rr6H+3T8le/bnBOx1jme5sDLLXnZ5RtSYc/vzgBHApvQvteTbVd6rvcmm5YOsINdId8aVtua4tERz5518l6SGZiYLIHSIMqBaVWcuTaiiWNmSU8mePTFyYuR/uMKI/AnB9ptMACQ7AHfVQ1phY6ZTI2f4JLxHgasXUoRncbPDKaUky1ORRfbqLrMawoTcMSEbvZ2W3aYyO4ZSOWbajLy47IcydU5Byda1apyjQYjTyyKytuH0gbatEMpHKxEO8VqoxsjbHFneM4B8SCEjHWkr5br0CmnvTyGU3HSI1zB1Lu3POX3kiDJqJrsucVuJt43qL/IVYcTQCtztyb1lr4Za5PKrNS3bYz0BK9lI+yN1gW6z0L3kWAXl8oR0OexjoqvnJBuRs9+0zhhRC4Hwr1+TrBwnBky7aNt+6U8+RH0yfEDtDjyOcwpHnDFsLmAub3DZGrcfn6/n90ehZsahTFRgNchmwlXXalRX7DVhjPVaq056p/+/YBuLu2eNLyPTmsh3wJcyk4LfsXU2A/qrk4ji2lpi8gJ2zxACnpiza7VgMvL/fe9vkfroT1aEWpNPqeN9mm4QHDndDnUwGTfpfwQU6UnYtlR+oWqHrOAVjdIxnXueWHI6/wu9vEzAl4w7JFnyiK6J3Nm2Zmk+hPkivIEvfHN7vy7SdStLVuGDjkuZCd7ZIV48zZ9sZ3ozYSdo= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(4636009)(366004)(38100700002)(66556008)(54906003)(26005)(508600001)(8936002)(36756003)(2616005)(316002)(66946007)(110136005)(5660300002)(8676002)(71200400001)(966005)(122000001)(6512007)(91956017)(83380400001)(2906002)(86362001)(66446008)(6506007)(64756008)(38070700005)(186003)(6486002)(76116006)(44832011)(66476007)(4326008); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?a6sg6mO/ePGeXAkw9MZSrr2?= =?iso-8859-1?q?wCrDKAlR4hK7XiU1I+/V1UtrygLWazg82x1YnPqA2hHCpjmag8UcYX/0MSbU?= =?iso-8859-1?q?cXAONpZWSdKG4QgXoqNKBGDbx+8SyzIgy7NG7uPA0H1vCTk+kAp6LjVFE42b?= =?iso-8859-1?q?mW7jWu9e7SoYAqrfLaNSrZ8h9FwroflR8FAzVB0Y/4iXNB//yvBpksp2SZDG?= =?iso-8859-1?q?SzTErWcKCe4Rway9+sZoIl/56fzj/jIHcuzpe1gvJ6wpDPVaQIGMCmEzB7JY?= =?iso-8859-1?q?VsQL7jKFgfuMJA0MpwNF9h9tDKhp6HAdw2ERuZkDKUMfGDpL1SwHH8jjx14Z?= =?iso-8859-1?q?zsp1g/YPZv4riU1b2XuO3hTdiNQKw1jkvhTQFiyiMGdihJbGFnY5DNTBA3/Q?= =?iso-8859-1?q?a49naQs7JYMUlSRIXb2svmwmq0N0KooqgodYz0qUNNU8zaYJ9SZmzt+nqbby?= =?iso-8859-1?q?2WO92ZmYSqUG+n1zZEpjFi2frUcL7fAJy6s0T73dONvg+HkG50Y+1UeNcQfr?= =?iso-8859-1?q?1C0S5MNtmbr2k7XXt7OZev8Dtyig8TKMZ0VDOzSRINQ1FJsyeDCkJpKmHqaq?= =?iso-8859-1?q?hG5hulhABfFDSSvvHZYmN33vLUOlalnkHrMcAjsE/P5swLIQJj8nXRf9dA4l?= =?iso-8859-1?q?JW4gRfNxO2qsBYy95/Cb998GCsOiw82LCKibAg/EpjR1x7vIKvL/5EiysLQR?= =?iso-8859-1?q?9f09DQimuQFe6f1wSVJogQpPA8KAA/zGEY2rWR3L0SuybvgrBKi5AuKrvsnc?= =?iso-8859-1?q?ZHnDEHUiQeKFII1IqVfvrYL/oMvJZAzpyTlFsZCKBpw5vm72e9SJRjwGlqi2?= =?iso-8859-1?q?oa+q8+zsukJL6eUBMv/m5AMFuxIV+4kcgh0AhgXUSKSEbSNjE1RaNcZurmwk?= =?iso-8859-1?q?IEFixy71Pb/LGxZ4mfVPFmz+GTC4TEDDAYATGaIoOUcxRn3tH5m8HQQZyAol?= =?iso-8859-1?q?zcHe/JO+WdD8B53RaLVC4iu/cJnKeuD6HWv47BcSlCJCmFW/TCXGbKKF6AYa?= =?iso-8859-1?q?tnd0lWQAxrhbuNglWYBFAeNZzmf3yAyX9gtUjPSXLM6Akgo9txdH2tAvMCdD?= =?iso-8859-1?q?j5qbznNEpuah/ct2Y/FpKz6a/wwPiql1UKpox0nYMIhPIGGeiFGdMYxCjeyW?= =?iso-8859-1?q?VXmY2Iu0TUiZfTpP4Z7reShgjFDWKaY819pqjLiEbTgLH0nuwUOn/hqFklRy?= =?iso-8859-1?q?/aVwtLk0u7Av/ijZhAJjKWHTTKnMBuv08+aE8ry8xgwz3plMGhsfnG9vwkUL?= =?iso-8859-1?q?saT+HjlqVYiZhGApNX5JOG7fojcJZ9kCASD0VigTmIsoz5/t+ZTE6hOOrA0A?= =?iso-8859-1?q?MCjN7ePKfrHFMVW4hZtHaAzR5l30HlyB7WdsX+VnLvHrdDZFOu9X7C29a+kZ?= =?iso-8859-1?q?P2MSYy2hzi7k7jNLod484Vo/Uod+jrErkxtmyA54fnhIGJDz31tGkuzd2wII?= =?iso-8859-1?q?PXTGmvkeBi0R3R9XxJ5f3WFE/6NkKP2ELioEgG0y7o7AF3n2wJwn4xPxUvzm?= =?iso-8859-1?q?US/pVEZ4Tm2rQ85uUYaSYKH9vJAHYKigRnkRvM5DwelkhVbf4UGbEFyHFRhz?= =?iso-8859-1?q?NqveLA7JVXmHVNG5GGVYNJ5c8yQbHKIr8WmuI/Dc6Z1UAUCUuUfKWTxUeI8e?= =?iso-8859-1?q?eUozdmFkdukx/NDSW8sqgm/O5/yqksEZwOZmfXwp+p19LQCoAWOcs1e6U/mF?= =?iso-8859-1?q?D2pjUfsy4VreuKoODzDV9umOhZyIQcvOG1OiQ1AUvl1TuuixfGaMs2buHr6R?= =?iso-8859-1?q?/Pt0=3D?= MIME-Version: 1.0 X-OriginatorOrg: csgroup.eu X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 55fae6c4-bfab-4981-6ec5-08d9c0bc23d2 X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Dec 2021 17:47:33.5978 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 9914def7-b676-4fda-8815-5d49fb3b45c8 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: tY3AdsZPbRoyG8OTMFdtb6TeKTvtEpxvevttWZO9GHejmzC9gd6CpsPH6ZKzviHnX1XQYPlQRrW39UQvi1W3aHcZq8UQs3cPbGshlIp4R8w= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MRXP264MB0040 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Maxime Bizon , "linuxppc-dev@lists.ozlabs.org" , "linux-kernel@vger.kernel.org" Errors-To: linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Commit 1f9ad21c3b38 ("powerpc/mm: Implement set_memory() routines") included a spin_lock() to change_page_attr() in order to safely perform the three step operations. But then commit 9f7853d7609d ("powerpc/mm: Fix set_memory_*() against concurrent accesses") modify it to use pte_update() and do the operation atomically. In the meantime, Maxime reported some spinlock recursion. [ 15.351649] BUG: spinlock recursion on CPU#0, kworker/0:2/217 [ 15.357540] lock: init_mm+0x3c/0x420, .magic: dead4ead, .owner: kworker/0:2/217, .owner_cpu: 0 [ 15.366563] CPU: 0 PID: 217 Comm: kworker/0:2 Not tainted 5.15.0+ #523 [ 15.373350] Workqueue: events do_free_init [ 15.377615] Call Trace: [ 15.380232] [e4105ac0] [800946a4] do_raw_spin_lock+0xf8/0x120 (unreliable) [ 15.387340] [e4105ae0] [8001f4ec] change_page_attr+0x40/0x1d4 [ 15.393413] [e4105b10] [801424e0] __apply_to_page_range+0x164/0x310 [ 15.400009] [e4105b60] [80169620] free_pcp_prepare+0x1e4/0x4a0 [ 15.406045] [e4105ba0] [8016c5a0] free_unref_page+0x40/0x2b8 [ 15.411979] [e4105be0] [8018724c] kasan_depopulate_vmalloc_pte+0x6c/0x94 [ 15.418989] [e4105c00] [801424e0] __apply_to_page_range+0x164/0x310 [ 15.425451] [e4105c50] [80187834] kasan_release_vmalloc+0xbc/0x134 [ 15.431898] [e4105c70] [8015f7a8] __purge_vmap_area_lazy+0x4e4/0xdd8 [ 15.438560] [e4105d30] [80160d10] _vm_unmap_aliases.part.0+0x17c/0x24c [ 15.445283] [e4105d60] [801642d0] __vunmap+0x2f0/0x5c8 [ 15.450684] [e4105db0] [800e32d0] do_free_init+0x68/0x94 [ 15.456181] [e4105dd0] [8005d094] process_one_work+0x4bc/0x7b8 [ 15.462283] [e4105e90] [8005d614] worker_thread+0x284/0x6e8 [ 15.468227] [e4105f00] [8006aaec] kthread+0x1f0/0x210 [ 15.473489] [e4105f40] [80017148] ret_from_kernel_thread+0x14/0x1c Remove the spin_lock() in change_page_attr(). Reported-by: Maxime Bizon Link: https://lore.kernel.org/all/20211212112152.GA27070@sakura/ Cc: Russell Currey Signed-off-by: Christophe Leroy Tested-by: Maxime Bizon --- arch/powerpc/mm/pageattr.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c index edea388e9d3f..308adc51da9d 100644 --- a/arch/powerpc/mm/pageattr.c +++ b/arch/powerpc/mm/pageattr.c @@ -30,8 +30,6 @@ static int change_page_attr(pte_t *ptep, unsigned long addr, void *data) long action = (long)data; pte_t pte; - spin_lock(&init_mm.page_table_lock); - pte = ptep_get(ptep); /* modify the PTE bits as desired, then apply */ @@ -61,8 +59,6 @@ static int change_page_attr(pte_t *ptep, unsigned long addr, void *data) flush_tlb_kernel_range(addr, addr + PAGE_SIZE); - spin_unlock(&init_mm.page_table_lock); - return 0; } From patchwork Thu Dec 16 17:47:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Leroy X-Patchwork-Id: 1569334 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org; receiver=) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4JFKNL5YsGz9sRK for ; Fri, 17 Dec 2021 04:48:34 +1100 (AEDT) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4JFKNL4SkGz2yw5 for ; Fri, 17 Dec 2021 04:48:34 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=csgroup.eu (client-ip=2a01:111:f400:7e18::609; helo=fra01-pr2-obe.outbound.protection.outlook.com; envelope-from=christophe.leroy@csgroup.eu; receiver=) Received: from FRA01-PR2-obe.outbound.protection.outlook.com (mail-pr2fra01on0609.outbound.protection.outlook.com [IPv6:2a01:111:f400:7e18::609]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4JFKMc6fTqz2yJF for ; Fri, 17 Dec 2021 04:47:56 +1100 (AEDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LRf8/K6KiLOyLizxc1M1wYYlUfqOuNKV4nkk8K1OO2B3T91+eOCDQdk8ekqGUCXTKp/J2uNAqIwXEFJldwFTb/Z4ZU1ib7sLPpuURiIuy1z1gb3N4TsSVUXf7b+vMMMIB+TllCdMorvsenS3dyLW4QNs593Q0fqOV3eLdxR/bBu0QJwsapwF2yLt5x5XSAdgrKVvu6H5KDhE2ipn6WYGeTYxGBGxME3wLt97rexAEPKMW/ip0maEb+qE+/A3KynKNI3MWhnB6W6Dh1tdHhcTqko7YaDAyWwrqxL+UTg5dNfqv6RksAZtCOyGuId/Qd+4FQtcd8n+OVgWehBP3znNZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ghsb1Kt7s6t3IDnF5g3ohm2Vxm553AqFVa3NEmYnHrs=; b=B72vVpUZ6/j8zVbwneboDV8+EnkXZdyDavd2jou7Ajb5Ark4jXGdwn4BbKP/UIRrEyayWhL9oIm8IeCe8enwe4f99Zu55a+0PYRARnogiEaLZRR58CPVChxTBNsinDOXdfbY0EE59Jtz6GORscDrLLbJyvIXSqsLQr+TWA0qiAQXo2pBqj3oXtrHKCqVkfb7/3e9z7OEa8e1HGgVJS7v54QbMwuNkbSS2teIMLIF5eWRaRYmWbUcTO1PAZQqqsI7cj7usNyYxP0khD9saj1DG5a74nAU1qSe9KjOOqBgWvHm9mi8haafDE0IL1GncptA4cbUea/FIeG4U49tKCKz6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=csgroup.eu; dmarc=pass action=none header.from=csgroup.eu; dkim=pass header.d=csgroup.eu; arc=none Received: from MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM (2603:10a6:501:3d::7) by MRXP264MB0040.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:18::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4778.16; Thu, 16 Dec 2021 17:47:43 +0000 Received: from MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM ([fe80::30e4:16d5:f514:b8f8]) by MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM ([fe80::30e4:16d5:f514:b8f8%2]) with mapi id 15.20.4801.015; Thu, 16 Dec 2021 17:47:42 +0000 From: Christophe Leroy To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman Subject: [PATCH v2 2/2] powerpc: Add set_memory_{p/np}() and remove set_memory_attr() Thread-Topic: [PATCH v2 2/2] powerpc: Add set_memory_{p/np}() and remove set_memory_attr() Thread-Index: AQHX8qUG8PKoUhzwdUWdJAEQIG9ETQ== Date: Thu, 16 Dec 2021 17:47:42 +0000 Message-ID: <0e45e5454cc8e53461e6bb057861ab3578afc4b1.1639676816.git.christophe.leroy@csgroup.eu> References: <112b55c5fe019fefc284e3361772b00345fa0967.1639676816.git.christophe.leroy@csgroup.eu> In-Reply-To: <112b55c5fe019fefc284e3361772b00345fa0967.1639676816.git.christophe.leroy@csgroup.eu> Accept-Language: fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=csgroup.eu; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 1fd53736-4687-4d3d-59e9-08d9c0bc2958 x-ms-traffictypediagnostic: MRXP264MB0040:EE_ x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:989; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: uk90cRpZkQB/Nrk2+JwZipVJmd4Fv07wXJbQ7/9lpiGeAH9HYqTZGw0wNaZS5st/+Uqh6uTZt8JDf2wCcy4Vagvr1f7004dKsdNSvAsKdoEWceDescgRRSSK6g9D4kAb9XnYICCDvDzbBGeprkBfaedXNMN8RRZy3iaoP5UJmDgz9ii0/gdVUi3s3qbtsm+cd1i+1kl1feUC0pbNKrPrKZkmCkTzcm1ghnOf5/ECK8DAhOZkiiictAWwu7207J6gEBUPI3QJDZHDS/d3RrhTrz5VZU226yX4Pikl7EXeiZrQLw08ZJ5/P8BYD6N2rf54sKiTbjjRJkq8vbI3Mq59Q4bArL9pmwB1ZhXaNOc70fi3vuFQxvOzVFyNhh1aJH2eidaNMIjrvlGD8AN3II4ntks5OPEyReU4oPbu0GVGGvxsmsFp9e+jX2Y2CtsX8NNG1CYrAldntpws5ED8tVPvaxop0hBlnidABDnowdBLhgdyYxz6AO+4ZeFzgyKosFiI1liVHKaHF901QF5DtYXl7wgsOsp4ET8+awZKG7uoVf3FNn+5UgdX6ek7JtGxPvv2avgMJB2th0DcyJ/1h+NO8a4DV3h0j+eUsQD1THVDAkEAMX1ytZNIGbfBAe0vnWhF49OtVe/q3QWDVCxuQLlCPuFzm8tCl5GWZdw6O7dvnKlLrQ4mv7tJtZ1GUpit1Gyv8JJOGYSc2BH+K/WwoYcR5w== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(4636009)(366004)(38100700002)(66556008)(54906003)(26005)(508600001)(8936002)(36756003)(2616005)(316002)(66946007)(110136005)(5660300002)(8676002)(71200400001)(122000001)(6512007)(91956017)(83380400001)(2906002)(86362001)(66446008)(6506007)(64756008)(38070700005)(186003)(6486002)(76116006)(44832011)(66476007)(4326008); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?Ay/bgegcYCh0eKQlefDEWE2?= =?iso-8859-1?q?uHixU1q5pxBVxF//qzZU5fEpCdZnLIBtEnX7fO0ArSSYDwKl2d0muPUE1Rlq?= =?iso-8859-1?q?rMF4uQyyBnTdl8EPfsbWBEDJKZ03oII1cmzSFpn09i+NR9jhsMzZ0nrNmp+F?= =?iso-8859-1?q?VM83d6QjjV/7KrbS85qDzuTWaNackoHJDKvM5ZfdLljOMCdSRRY3O+abylvj?= =?iso-8859-1?q?pUZq6mgzQ/uQhirVyeCu5XVlUHPZ6aqhi3qbq91Nr5ZJ4A9yXSdIKLpPOPol?= =?iso-8859-1?q?UCnMG00fGpK6u20+Hx6QSMd34BXDLXUQtQ67DZsSnjnLq4ldHfuENfoeAmTg?= =?iso-8859-1?q?y3EfnCPxCTat/3xT71Si8YgCjRWPCO4HEy7kmMn8EUKlRFNF02iEeaEVkw/X?= =?iso-8859-1?q?zfG9TThpyYqQFC64KdnyBWBZQ++q+vNdHmtvWvcCDrcT9Sv4xqNrboKfrNX5?= =?iso-8859-1?q?J528ZuNutupnZO8EcQFE9E/fVA+A21ZIYGmKiVG4Gzk/WKNONwTYJBlP5z8A?= =?iso-8859-1?q?eNs3L8Vu7Scp4e8GkLAOzAMvIVeSo04zIGez01UN8n68V2tx98r98iF6KiJE?= =?iso-8859-1?q?DF1ihIKiOKh8W02XmPe6327h+oRfICBVfENVXNoO6BhlSajpOZ28sinG7PVK?= =?iso-8859-1?q?DQI0Omv0MqevdPQPLslzN52nQnwu/O1qgda0yFMz1ZO9IlXhvHmFeU0rTf1b?= =?iso-8859-1?q?PcYkVQlpIYHKyPV7ImbHkGmymxAwZQLl9IjzaktZwEjDpWMm7zOAH82hH/1S?= =?iso-8859-1?q?w+RArM2j7as7LPulz4OROPjkh8D8fOmXpld8ogCNBFmWbHJEpy4wWMuDTcK8?= =?iso-8859-1?q?Tk0niLR42jrHP1zwuaoWntct5pd+Wc99NLT/JqPrqDxqwhCOszcdG63luEU1?= =?iso-8859-1?q?OS9K4T47AEYo7c8MADJjkS/v4VhMUndQl8PzyEPRXr73FvB26KpyeraKJs/T?= =?iso-8859-1?q?TFS/1Ag2U7SinYiCc2mmqMJbamFWTWX0UAvGFfoM4/5g2EvJMsNQz1M6amzO?= =?iso-8859-1?q?RRNAg630ty0GFxmqvyMn6bohi3Xp7r03ZbgEVTnJfI6QTzQPQ6pUrzMOp3t9?= =?iso-8859-1?q?UWYRrPh0bfIlqja4xRXVCZdiFj9aB6X9aEau1xZ9YHj1ygObMr9EZrUeCHNu?= =?iso-8859-1?q?z3Ecqc0spatbIajny78alp80a+N9MYOxSziya49h+gxNXNIllTw9MuiZDD7T?= =?iso-8859-1?q?fT6LfGJxOnl+3QY8Fml5prvoYLABOLP1fEh6+DvascRpPy6qrfT1fXKPQtF+?= =?iso-8859-1?q?1wfZZdukgh8V+7w3kBVelm4hdZp541rQnN2EF6qaOdGs5TnWjSAv9TGoGSGs?= =?iso-8859-1?q?1ZMGRIQ5tptHhjskV70w1lnBQu204VwVr6LxVJQvN50MpZRfzrakwo75615C?= =?iso-8859-1?q?x4pWQlnrYRU4Dpsj8dssgfP2zh/89SJ5hPNLAkU1SkGoXgrrr18H/AREgh1K?= =?iso-8859-1?q?BKlFCaSzbqOSdl2yz5YwuTXJy7H04p9U5uTtm+NBAa+9w3kUJfC04XZHXdGj?= =?iso-8859-1?q?ejV7mO+OkYoKcfCLrdhpGE414ftP/TQmwrLptsXCLhO8pQNTv7Z6wtiQkU7a?= =?iso-8859-1?q?ioT5eTs+4O0PRb1/I769RQBI2GnanxpKe3fvBYTM6noNRAaQzaMfI879sawN?= =?iso-8859-1?q?HUzZDeKHwkd6drm114qqvxErxyNIzSWq2b1/W7xNFeqjNhQxFNDqy+YsQnqA?= =?iso-8859-1?q?4qs2cvSEySIFAELETePc0ZCvq4p2IadsuHXmnQ6MsJyyeDv2vQYtLur9naTD?= =?iso-8859-1?q?xNoA=3D?= MIME-Version: 1.0 X-OriginatorOrg: csgroup.eu X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MR1P264MB2980.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: 1fd53736-4687-4d3d-59e9-08d9c0bc2958 X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Dec 2021 17:47:42.8860 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 9914def7-b676-4fda-8815-5d49fb3b45c8 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: GH9MenvELRTn2tnuc1joTlEif2Rkg07HwXFl+dG+g5EgYavQzr9kch+spAWN9q0Xy1ulKmr+S+fy33VpCLw2RqnaypiL/lF5HTK5gbVOSIM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MRXP264MB0040 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" , Maxime Bizon , "linuxppc-dev@lists.ozlabs.org" Errors-To: linuxppc-dev-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" set_memory_attr() was implemented by commit 4d1755b6a762 ("powerpc/mm: implement set_memory_attr()") because the set_memory_xx() couldn't be used at that time to modify memory "on the fly" as explained it the commit. But set_memory_attr() uses set_pte_at() which leads to warnings when CONFIG_DEBUG_VM is selected, because set_pte_at() is unexpected for updating existing page table entries. The check could be bypassed by using __set_pte_at() instead, as it was the case before commit c988cfd38e48 ("powerpc/32: use set_memory_attr()") but since commit 9f7853d7609d ("powerpc/mm: Fix set_memory_*() against concurrent accesses") it is now possible to use set_memory_xx() functions to update page table entries "on the fly" because the update is now atomic. For DEBUG_PAGEALLOC we need to clear and set back _PAGE_PRESENT. Add set_memory_np() and set_memory_p() for that. Replace all uses of set_memory_attr() by the relevant set_memory_xx() and remove set_memory_attr(). Reported-by: Maxime Bizon Fixes: c988cfd38e48 ("powerpc/32: use set_memory_attr()") Cc: stable@vger.kernel.org Depends-on: 9f7853d7609d ("powerpc/mm: Fix set_memory_*() against concurrent accesses") Signed-off-by: Christophe Leroy Reviewed-by: Russell Currey Tested-by: Maxime Bizon --- v2: Add comment to SET_MEMORY_P and SET_MEMORY_NP --- arch/powerpc/include/asm/book3s/32/pgtable.h | 10 +++++ arch/powerpc/include/asm/book3s/64/pgtable.h | 10 +++++ arch/powerpc/include/asm/nohash/pgtable.h | 10 +++++ arch/powerpc/include/asm/set_memory.h | 12 +++++- arch/powerpc/mm/pageattr.c | 39 +++----------------- arch/powerpc/mm/pgtable_32.c | 24 ++++++------ 6 files changed, 58 insertions(+), 47 deletions(-) diff --git a/arch/powerpc/include/asm/book3s/32/pgtable.h b/arch/powerpc/include/asm/book3s/32/pgtable.h index 609c80f67194..4ceebb291896 100644 --- a/arch/powerpc/include/asm/book3s/32/pgtable.h +++ b/arch/powerpc/include/asm/book3s/32/pgtable.h @@ -518,6 +518,16 @@ static inline pte_t pte_mkuser(pte_t pte) return __pte(pte_val(pte) | _PAGE_USER); } +static inline pte_t pte_mkpresent(pte_t pte) +{ + return __pte(pte_val(pte) | _PAGE_PRESENT); +} + +static inline pte_t pte_mkabsent(pte_t pte) +{ + return __pte(pte_val(pte) & ~_PAGE_PRESENT); +} + static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) { return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)); diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h index 33e073d6b0c4..2bbc8b69b7f4 100644 --- a/arch/powerpc/include/asm/book3s/64/pgtable.h +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -724,6 +724,16 @@ static inline pte_t pte_mkuser(pte_t pte) return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_PRIVILEGED)); } +static inline pte_t pte_mkpresent(pte_t pte) +{ + return __pte_raw(pte_raw(pte) | cpu_to_be64(_PAGE_PRESENT)); +} + +static inline pte_t pte_mkabsent(pte_t pte) +{ + return __pte_raw(pte_raw(pte) & cpu_to_be64(~_PAGE_PRESENT)); +} + /* * This is potentially called with a pmd as the argument, in which case it's not * safe to check _PAGE_DEVMAP unless we also confirm that _PAGE_PTE is set. diff --git a/arch/powerpc/include/asm/nohash/pgtable.h b/arch/powerpc/include/asm/nohash/pgtable.h index ac75f4ab0dba..3d4169969900 100644 --- a/arch/powerpc/include/asm/nohash/pgtable.h +++ b/arch/powerpc/include/asm/nohash/pgtable.h @@ -166,6 +166,16 @@ static inline pte_t pte_mkuser(pte_t pte) } #endif +static inline pte_t pte_mkpresent(pte_t pte) +{ + return __pte(pte_val(pte) | _PAGE_PRESENT); +} + +static inline pte_t pte_mkabsent(pte_t pte) +{ + return __pte(pte_val(pte) & ~_PAGE_PRESENT); +} + static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) { return __pte((pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot)); diff --git a/arch/powerpc/include/asm/set_memory.h b/arch/powerpc/include/asm/set_memory.h index b040094f7920..7ebc807aa8cc 100644 --- a/arch/powerpc/include/asm/set_memory.h +++ b/arch/powerpc/include/asm/set_memory.h @@ -6,6 +6,8 @@ #define SET_MEMORY_RW 1 #define SET_MEMORY_NX 2 #define SET_MEMORY_X 3 +#define SET_MEMORY_NP 4 /* Set memory non present */ +#define SET_MEMORY_P 5 /* Set memory present */ int change_memory_attr(unsigned long addr, int numpages, long action); @@ -29,6 +31,14 @@ static inline int set_memory_x(unsigned long addr, int numpages) return change_memory_attr(addr, numpages, SET_MEMORY_X); } -int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot); +static inline int set_memory_np(unsigned long addr, int numpages) +{ + return change_memory_attr(addr, numpages, SET_MEMORY_NP); +} + +static inline int set_memory_p(unsigned long addr, int numpages) +{ + return change_memory_attr(addr, numpages, SET_MEMORY_P); +} #endif diff --git a/arch/powerpc/mm/pageattr.c b/arch/powerpc/mm/pageattr.c index 308adc51da9d..eb5405d410f1 100644 --- a/arch/powerpc/mm/pageattr.c +++ b/arch/powerpc/mm/pageattr.c @@ -46,6 +46,12 @@ static int change_page_attr(pte_t *ptep, unsigned long addr, void *data) case SET_MEMORY_X: pte = pte_mkexec(pte); break; + case SET_MEMORY_NP: + pte = pte_mkabsent(pte); + break; + case SET_MEMORY_P: + pte = pte_mkpresent(pte); + break; default: WARN_ON_ONCE(1); break; @@ -92,36 +98,3 @@ int change_memory_attr(unsigned long addr, int numpages, long action) return apply_to_existing_page_range(&init_mm, start, size, change_page_attr, (void *)action); } - -/* - * Set the attributes of a page: - * - * This function is used by PPC32 at the end of init to set final kernel memory - * protection. It includes changing the maping of the page it is executing from - * and data pages it is using. - */ -static int set_page_attr(pte_t *ptep, unsigned long addr, void *data) -{ - pgprot_t prot = __pgprot((unsigned long)data); - - spin_lock(&init_mm.page_table_lock); - - set_pte_at(&init_mm, addr, ptep, pte_modify(*ptep, prot)); - flush_tlb_kernel_range(addr, addr + PAGE_SIZE); - - spin_unlock(&init_mm.page_table_lock); - - return 0; -} - -int set_memory_attr(unsigned long addr, int numpages, pgprot_t prot) -{ - unsigned long start = ALIGN_DOWN(addr, PAGE_SIZE); - unsigned long sz = numpages * PAGE_SIZE; - - if (numpages <= 0) - return 0; - - return apply_to_existing_page_range(&init_mm, start, sz, set_page_attr, - (void *)pgprot_val(prot)); -} diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index 906e4e4328b2..f71ededdc02a 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c @@ -135,10 +135,12 @@ void mark_initmem_nx(void) unsigned long numpages = PFN_UP((unsigned long)_einittext) - PFN_DOWN((unsigned long)_sinittext); - if (v_block_mapped((unsigned long)_sinittext)) + if (v_block_mapped((unsigned long)_sinittext)) { mmu_mark_initmem_nx(); - else - set_memory_attr((unsigned long)_sinittext, numpages, PAGE_KERNEL); + } else { + set_memory_nx((unsigned long)_sinittext, numpages); + set_memory_rw((unsigned long)_sinittext, numpages); + } } #ifdef CONFIG_STRICT_KERNEL_RWX @@ -152,18 +154,14 @@ void mark_rodata_ro(void) return; } - numpages = PFN_UP((unsigned long)_etext) - - PFN_DOWN((unsigned long)_stext); - - set_memory_attr((unsigned long)_stext, numpages, PAGE_KERNEL_ROX); /* - * mark .rodata as read only. Use __init_begin rather than __end_rodata - * to cover NOTES and EXCEPTION_TABLE. + * mark .text and .rodata as read only. Use __init_begin rather than + * __end_rodata to cover NOTES and EXCEPTION_TABLE. */ numpages = PFN_UP((unsigned long)__init_begin) - - PFN_DOWN((unsigned long)__start_rodata); + PFN_DOWN((unsigned long)_stext); - set_memory_attr((unsigned long)__start_rodata, numpages, PAGE_KERNEL_RO); + set_memory_ro((unsigned long)_stext, numpages); // mark_initmem_nx() should have already run by now ptdump_check_wx(); @@ -179,8 +177,8 @@ void __kernel_map_pages(struct page *page, int numpages, int enable) return; if (enable) - set_memory_attr(addr, numpages, PAGE_KERNEL); + set_memory_p(addr, numpages); else - set_memory_attr(addr, numpages, __pgprot(0)); + set_memory_np(addr, numpages); } #endif /* CONFIG_DEBUG_PAGEALLOC */