From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2C5FCC4167B for ; Fri, 1 Dec 2023 01:56:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5E83C6B0484; Thu, 30 Nov 2023 20:56:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 597ED6B0485; Thu, 30 Nov 2023 20:56:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 411206B0486; Thu, 30 Nov 2023 20:56:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 29BCF6B0484 for ; Thu, 30 Nov 2023 20:56:27 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id DEEB01201DC for ; Fri, 1 Dec 2023 01:56:26 +0000 (UTC) X-FDA: 81516584772.16.F5C9B43 Received: from APC01-TYZ-obe.outbound.protection.outlook.com (mail-tyzapc01on2118.outbound.protection.outlook.com [40.107.117.118]) by imf03.hostedemail.com (Postfix) with ESMTP id 0349F2000C for ; Fri, 1 Dec 2023 01:56:22 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=vivo.com header.s=selector2 header.b="qTX/XBXk"; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=quarantine) header.from=vivo.com; spf=pass (imf03.hostedemail.com: domain of link@vivo.com designates 40.107.117.118 as permitted sender) smtp.mailfrom=link@vivo.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1701395784; a=rsa-sha256; cv=pass; b=LgnfQLmTSmYJBjpHApwVCVj2C2qTUUa9fVUwu24otrmgQXt3Dy6OajIkMnTuZl4rMv/2bn D3YjvUGmg1v4vEeBsKb5MVMbO7dKrin/vvPOI12qYmItIvbx/IR98lJBEj+VaUrwXtevwL COFt0W6G3h7lkl418l0eifrUva+t1xo= ARC-Authentication-Results: i=2; imf03.hostedemail.com; dkim=pass header.d=vivo.com header.s=selector2 header.b="qTX/XBXk"; arc=pass ("microsoft.com:s=arcselector9901:i=1"); dmarc=pass (policy=quarantine) header.from=vivo.com; spf=pass (imf03.hostedemail.com: domain of link@vivo.com designates 40.107.117.118 as permitted sender) smtp.mailfrom=link@vivo.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1701395784; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=4NTjnQHS1Hg6iXjpc0KdZ8Ygnd6y8IITxUDdgOE4GxY=; b=W1r1l81cWpKFIpkNQVqsv5JegbFfyaRHN3HtFyYSTadboQSCplLmZfBeCWkoPzkm/PdBaC +rDqLeqasiZfhmZdp8jTBScPm0AdK1/jBiw8KeR8SNsRyXIIBTtlUFvAJ/+l8Ac+gypdrb dT9V8DAf/bw0mwvUU1j2BpXY+Cbiq5c= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RYs4vXsiANIPDcNg5hbiC82PpFQLe8OLNuPCt+IfLE7I+eA99Ws9Pb8KZFPoxI60TdlrJix0RnlScChHcq5qGAxxkxRHM5lgP/beAfV99nS8/YiELeHBXqx9yxTBzMDnZ9zdQkCXFeoyDcdlzCMHoTaPEJ9tSljEfDAcF+U8L1cMFY2ZiiJfmpfI3PNf0kZVs0kkagpbbgi3zk30YS1SrdBDV7qE7gThWpzKMPuoteVNPj7j0O9vXqkfs+tNAONE0M0vyWSL4e1GVpaUojcYZGBzBFwkwolVTB4qCj+ZmqhKHyzxHSqd6M1cjwEjzwzJqfsUsS/Yhd1NO6Q4DIVj7w== 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=4NTjnQHS1Hg6iXjpc0KdZ8Ygnd6y8IITxUDdgOE4GxY=; b=J8Ei5JDr796ypRsiAubUo8RoTLPpJnsjepM6amJny+M6FYGhK89RzfJaNFGmEl4CTsk/OT/n3UJkJFGUqsiHA+yAdqX3MicY4sHHMuO2D4h9B678ka3Ix7ygs+i9h143U6huuzo5ufSGc6Exkverk61i9Q6dkioN6YrjJf2Q3iSLLldLY2P6B+Oa1IAZCGl4rLBjZ3jLI/asPHz6eQ7abylSnQ5GAH/MoQuHdnF9cWxyiCSDx+H5Cdty95NhZOAWNVv6/oFStLk2JJeKXOfAhKwTl9cDe8Vi2v7mMFR5qIBsNx/ZPokJ03dme1UwWLLFY9SND2/fQC02jwBe2S59ow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=vivo.com; dmarc=pass action=none header.from=vivo.com; dkim=pass header.d=vivo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vivo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4NTjnQHS1Hg6iXjpc0KdZ8Ygnd6y8IITxUDdgOE4GxY=; b=qTX/XBXkXKyTSN9qy1oskVb0F73ixsM6LgbhB9cAe1buOQGtlff6whe+0nfRA+swIFGj7STTfdiMiM3AcJCuS+olYx6129LEQuLArqAZKJoXF0hAm50NZvYeRKeq8pjJjfy3T5hlf+Qwj4K+YLaT4kv3Nv2dDkwcgd1hj9i9yuSeYURUzgkKtGxFelL8MFqDDUsT2d7FAhnngc7SJ47L1sWDoBkfT/98fDXaRcnzv33kEtV5hfdSeSPspKYAzdz3kT8SiDgHuOmGiXKeQNGXa8mCgmyok2FdQw5gMQ6wsk+MtXX1LVKKTAsj/D6jKo5Sh6+a40cTSBlG21HrB0iwlA== Received: from PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) by SEYPR06MB6562.apcprd06.prod.outlook.com (2603:1096:101:173::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7046.24; Fri, 1 Dec 2023 01:56:16 +0000 Received: from PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::d754:7b3:dc4c:6b48]) by PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::d754:7b3:dc4c:6b48%7]) with mapi id 15.20.7046.027; Fri, 1 Dec 2023 01:56:16 +0000 Content-Type: multipart/alternative; boundary="------------xq9pwpu0yrK20qBSP9o7hDOY" Message-ID: Date: Fri, 1 Dec 2023 09:56:06 +0800 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/1] mm: add swapiness= arg to memory.reclaim To: Dan Schatzberg , Johannes Weiner , Roman Gushchin , Yosry Ahmed , Huan Yang Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org, Michal Hocko , Shakeel Butt , Muchun Song , Andrew Morton , David Hildenbrand , Matthew Wilcox , Huang Ying , Kefeng Wang , Peter Xu , "Vishal Moola (Oracle)" , Yue Zhao , Hugh Dickins References: <20231130153658.527556-1-schatzberg.dan@gmail.com> <20231130153658.527556-2-schatzberg.dan@gmail.com> From: Huan Yang <11133793@vivo.com> In-Reply-To: <20231130153658.527556-2-schatzberg.dan@gmail.com> X-ClientProxiedBy: SGXP274CA0011.SGPP274.PROD.OUTLOOK.COM (2603:1096:4:b8::23) To PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR06MB5676:EE_|SEYPR06MB6562:EE_ X-MS-Office365-Filtering-Correlation-Id: 9d82af8a-ffda-4ab7-3360-08dbf210b405 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: S3VM2/VvzZRQ4gjgIUy1bJ0UmqxUc+NRiSUWknFgWEYIYk3+dOG3g/lV6N+Hmlj6X0kbT3gdsLnlAtau7zapiyYDJ92/ISv2aHD6cWiGOF+8RN/DjBDapefq9kfpGK+uy/7ffOXKRQ0Ysf1ownO/RgdlfdCBilIirh2cfw8Vw9Qmiy2u3gEXIrOiTYBt17Rzuzsvr+hxSmldEaBEkXWPqoSSaLF5S7Ptl+iAeKkh/W3KYlOODuiX8HLMoeJ5FcfNwnxOYiM5qL3umxlESx7cFsPVQr47g50f6vw+ZA0VD5nkMkvFYcd99IEawzqGsAKMJIOtBEbznqHRilCcyOm9luBDokii3MrF9ChYIJrN0+QW+aRyaCN2Rfuv/D4d2OMOT2bgw4dyHKysGMTG6N9WPUKZ8AOC472Ppvkyr4QQo87MzuuiFjmHJIDpA7FR8nGvaTL8anbG9X4M3LIrxvmIVPT7ycI9v6z8x6oKUxikCrZZ+2gT/Imy1CjO/3I+zePVXoC2VVvVV9kZ5wGFIciA02qLc31kcrGUso3hdWPj/n7TQyF69GSsjq0fTCktSkY+r55VJE+T+nFiek3dWtwMRNPC5N8LJZYr7tJdkpkz32fCR1NIRLq6AiMsUiFLJh8D2F99d8ISNhFDgXm35zYdH0FmxYqzc278ccWXX3leQslOr8CoS+rjar2uOiXjUQMF0sRnDNxF90TkoEdjPcUz4w== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR06MB5676.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(346002)(39860400002)(376002)(396003)(136003)(230922051799003)(186009)(1800799012)(64100799003)(451199024)(5660300002)(31686004)(8936002)(31696002)(166002)(4326008)(8676002)(66556008)(6636002)(316002)(66946007)(66476007)(54906003)(110136005)(38100700002)(7416002)(41300700001)(6486002)(2906002)(30864003)(478600001)(36756003)(966005)(38350700005)(26005)(6666004)(6512007)(33964004)(52116002)(6506007)(2616005)(83380400001)(81742002)(45980500001)(43740500002);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bkcrSyt5MytuVHQ4QXE1M3RKWTE4dVhyQ2ZYVnNUMXAwOFhCVi9hSWgzRlAw?= =?utf-8?B?bnoyYVA0aDY3YTRoeW1CTGlQYkYrYkxFZDduT2ltcEtkOHJ2VDdqbDhLejB1?= =?utf-8?B?bW9BR2o0NHRlVVl6S3paUkwybEhabHd6TGV4d3EyK2tkZmp1di9hck50VDVT?= =?utf-8?B?d3NacU9hL0hjMVhXeEg4cVVFZEp0L1dCK2dFbVUxckREbGNjQVRYN0lVemtx?= =?utf-8?B?Ylc1TWNLcVBxVTZOcUpKZExnUzM4YmRMVG53N0REZEZTZzRVelFuZVRRMURj?= =?utf-8?B?WUIzaWJUTVhoQ2FGQ3R1UFB6aUcremErb1hMT0NaY09rR0dqRXV0Qmo4QWxn?= =?utf-8?B?Ri9aaUdNWC8zU1ROMlJkZ0FBS3Z4SmczY1Vna29ZSTE4U3lKR3Vnd29IZytt?= =?utf-8?B?MmdZUks3K2F2c0ozZnZ2WjlXdG5rQXZVbVJoSzNhUTAwVVBIajNkM0pUTGlE?= =?utf-8?B?bjdibS9ESjcvbXFOOFN2WFplR1h0VHFPNG96TlFqbTlRWCsrS21TUkdwYjE1?= =?utf-8?B?aXlWb1JReXREc3hNUjNPOWozN1Z4WlFJYi9kVTRyZ0pja0xCUU80Wi9nUmcz?= =?utf-8?B?bWcrYW9WTUpsZmxuVEQyMnFGZmM5cFpNK1RsUU9mK3RoSm1FTlBtY0Z0bGZZ?= =?utf-8?B?ek9rZW9HYzRrZFErSEM0V2ZYbGtoVUlkTDN5Ly8zMGNPelRVR0cwYjhDWVp6?= =?utf-8?B?cFZ0ZEZ1RGZmQ2dleU8ySmhpRmUvam5KY2lkbm5lM3NKYVBsQ3l6anJab0do?= =?utf-8?B?aUtSZkdlNkRXcTkyb2RwVG1ZZGkwZnFRR0VNcHB3b2tqSXMxc3pTMTUzb1BP?= =?utf-8?B?NE5XVTF5cmZOanpwVzltMFY3c04veEtObTQ3dDhDYmhxTmdacDl4QVg3emwr?= =?utf-8?B?TjV3a3ZteFZaMFZjelRwc0drYW9VQnBrd0ptdngvbHlzRG41dkFPYnM1U0gx?= =?utf-8?B?WXdZU3hsKytMbXhnaTAyb0w3TnpwNHprZ2xrVFpUNU5UYmEyUFMzU1h2K0d3?= =?utf-8?B?bWlUYXh0dFRNamw1OGlxY3ljZDlkUWVCQWR3M3RuQzlRdU1OUndncmYzaTBQ?= =?utf-8?B?dW93UGRSN2lObGxYNUx1NmJucXhyVDdmWTBrM0UvaFpLUUdUbUVXNzI1ekNX?= =?utf-8?B?YnhhWm5XOFFaNURvcjBMYmhTZ3EzY24zNDgzMnpkVk1FRWZaeTkwNm5VUVpK?= =?utf-8?B?ZjExVzFlR2YxbEVBUUZ1eEs3L3dZWWNYUmYxYjQrSVM0alNVYlFndG1TQUNR?= =?utf-8?B?dlcxM2oyN0xzM0dCcE1IWFJQSWNXWjd0aHkzbjNSMU11YXRGY0YwaFJuZWZD?= =?utf-8?B?alNwaEN3UTA2RXJOMklpTmN6aEc5NHE3dUNUZWNOVlJXTlllTFYvRGw3cEdX?= =?utf-8?B?WUI2QmJhd1lwN0VmaGJCQWtCNm1XM01JMjFJNkl3RytiVTNSYjB4UktEcGNC?= =?utf-8?B?dGJ1YkZzNEUyYlBSWHJnWVJ5WW43bnFPN3h3ZUQwbWd4STRRUFZBVnNEdWpV?= =?utf-8?B?bnpKU2FwMm9ZUWdwVVF4cTBEYW5yaHNBeEhmMGRLNHhzQlIyRFNHcUcrVVg5?= =?utf-8?B?SmdkczI1RlFEWXpJT1lqN2lYQnlIZGVsVytBNlAxaWxWdUhETkQvcGRzdkVW?= =?utf-8?B?SUNKL0ROQmFiMXE3dmhqVTB2Y2ZHUjdOaUs2RHlybHBzNXpDR2NEWUpvVHlO?= =?utf-8?B?NTJBYVJjeVppVkE5T0cwRkNvbGlSSkNBOHhrRFdtOGZZZGtjY2o0YTFHTEVz?= =?utf-8?B?V1dCOWtjRTBlcU1FUU5MOGJCYWNURVd4UE9xamtZbjJtTHR3SWFneGMwd2ky?= =?utf-8?B?TkgrbzJxRjlGQXFTYWF5S2NqV2R4S2NRYURtbWdjbVg4NlZMWWNFTzZqbG9y?= =?utf-8?B?Qk5yMVJjQUFack1lbUQ0YUVJZ1hCQzYwL1dhMVRCeTJzelY3anlUQkxZRVVG?= =?utf-8?B?SjZobDB3cWtRd25xd2hzTXUyekRsQ2psaVlWYkwwWjRnb3RqaERyWXBnTU50?= =?utf-8?B?M1FEQUZSbmhPWXhhbWZQaGhPNGVJVm55ZitOVTBIVXQwVjRicjUwMURQd2Q5?= =?utf-8?B?TW5VZ05jd3lBODNwcXUwNnlWOFpxb2V3bW15YUR5anlEaVFoQTYyNmhXVSs3?= =?utf-8?Q?3MhmAF8gAtwFlZSAac1XLB7RC?= X-OriginatorOrg: vivo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9d82af8a-ffda-4ab7-3360-08dbf210b405 X-MS-Exchange-CrossTenant-AuthSource: PUZPR06MB5676.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Dec 2023 01:56:16.0282 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 923e42dc-48d5-4cbe-b582-1a797a6412ed X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 574qCpkNd46fXPX5F16NTP+iWiT71cpndaoyFGndnyJI426GvblGz6xQQZ/fMQypnuuLXVfQpT+f+VY9I7J2iA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR06MB6562 X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 0349F2000C X-Stat-Signature: m969kuukxnbt1ripfbh1hnm75uwdkwap X-HE-Tag: 1701395782-276917 X-HE-Meta: U2FsdGVkX18cySOtiZVxgsfVSOVzyp5Fjz8KhCvAMSzY4AaAG2TYW1Fkr3E43VJ9WA3jXYLlOt8bOx5EyL+Zs7jQGQaj4Mkn6G9DTFgp/MrPsFpXBmpCT7oN47mZq2hJdxWH6J8qMb450XdQJgM6iYX6Y8fyciq5ENhtjJ32WKGS+9Md/YED+5dxaYv2xBOEk7IthL6UjyqmA4gNt5GtPn0ZUCdl/cq3TXAkIyIPvas60cGU3/R6se6O33hjnbxcGe8kf/M0Cem5nvpDrinG1LKoyBGXcSY4aiPalz3de1iHzqVzB7avyjVt6+IuLtG2GHEoAaXmCRrTJmoLr9CbDxU2APMsqjTKsvirWaBH5vOEt9nSnMMOJHCXNdLBUO/HRC1iBCw2HutOR/bkSv9AZyRz4+yNswZmoB8xsWfw6mlXy048E0ml26FzzjSVY9wBCyuqK3Ww8t1ItimXwR9yxIKr4R8184gwj+yBgzTi2ZF8vRrVpTtFfvo1mPtVibLyXGsWsqYIf/Dxr0Zbk8s/RTJPevu8KfDBbSaY1Sg4ShC7KRTxeumS6Z5EJR9s5w5Fg/KmbTNhTpo1JLXtMQN0gybn+VCVztWEk1lqNWjNPs9W1P+8Cx6U1XENdo0G93iY615WnJpNdjqm6ou7gPTEyPfwt+ARWzN8/3XTon6Oi6AjRQBwl5rForU9qY/lPSVhEq7HlDcvlS0S+/IsDW1pGoqJxcazGFqPe8IEBRTQObop3zd4dEXIC4vJPt4gZXFAuUQXkI7tvYbqOU7Zu4vv0md5Au4OgDOG/BEwKRJFchs/DbjvuHRDP4i7455UAMCCPVaChLYNmXR9RdPVmiNONF9cbJ2LS1EMKzyyrBuxtWDdM52TCG67Q2maBVY6P8wvXA58IwEy+YzRnz7J2gSmpGeJwDwQfLrk3CJmmOw831le52nUyBORKtctggaylqeTVqimmOFJjKURlSDs2B6 ZSNZaRAo xEwtLlkz9a19ydrXhtx7L0FD+BaY/7tujji57ZpQAf5iR3fitUx9TYD7l2IXdFZFko7drc8c/TV9sFPAbwlKVU6eUjx4W+wVP4NxtnxDBLiaRVD9X4N01xeQdZi7DEDsIykEdkNFhn1xPCge8ltLR+tHcpljXe7dHSpW9jhXuR9ltcAk9YwebhD3V30w6SKcvUKHY79pqT3u8eo4FWwFUtdvv1yrwUQUCAhVR2fC0v2KmuNuxfgl8k9orWNopCjkp8ZNGKH1OzDJp7Lq84RMVJBD6EgPC9/Kh5AimGpxkNipskZdgNiVPMH++PtrYDY00vDrIDHueIA3UcgaqcP5uuUk1//mMbgRLYs05sLwyfVO3VCVSKMteZReDIBk5btoPL9joQzH6NIwkTTwtaB0wtwZDYyXJM8SKMOUF5b4WhsLkw3vl/OZhn3K4k3pHU6W4o/CtwG2/7SA5zZPCPK+hgKpGgrmame+QtJpmPAez2fTtX1j9cHceo+14zXB6mXPYtIdqWyTTD5uzbMyc2/3PjK9YXtdr538VcZ/v94Yxv2CpsKu+7vTCenZ1r2TsjbTXQTtz8d3J30519H4zAU2YTjtwq1qt9JsDkKDPSHTxtsSkLmYfBVbFdJmIO3Ticg0w3N6zp36uIhHz/B+G/ZlzU2W3+d9oO0lQIYU2vNYvgbhFW6B/25IkXxVp9B8uNmKr+Mx4OWfQbFBeyyny8jFF4kexXN5O+2lsFliBrxharQ5nAgA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --------------xq9pwpu0yrK20qBSP9o7hDOY Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 在 2023/11/30 23:36, Dan Schatzberg 写道: > [?????????schatzberg.dan@gmail.com ?????????https://aka.ms/LearnAboutSenderIdentification,????????????] > > Allow proactive reclaimers to submit an additional swappiness= > argument to memory.reclaim. This overrides the global or per-memcg > swappiness setting for that reclaim attempt. > > For example: > > echo "2M swappiness=0" > /sys/fs/cgroup/memory.reclaim > > will perform reclaim on the rootcg with a swappiness setting of 0 (no > swap) regardless of the vm.swappiness sysctl setting. > > Signed-off-by: Dan Schatzberg > --- > include/linux/swap.h | 3 ++- > mm/memcontrol.c | 55 +++++++++++++++++++++++++++++++++++--------- > mm/vmscan.c | 13 +++++++++-- > 3 files changed, 57 insertions(+), 14 deletions(-) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index f6dd6575b905..c6e309199f10 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -410,7 +410,8 @@ extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, > extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, > unsigned long nr_pages, > gfp_t gfp_mask, > - unsigned int reclaim_options); > + unsigned int reclaim_options, > + int *swappiness); > extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem, > gfp_t gfp_mask, bool noswap, > pg_data_t *pgdat, > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 1c1061df9cd1..ba1c89455ab0 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -63,6 +63,7 @@ > #include > #include > #include > +#include > #include > #include "internal.h" > #include > @@ -2449,7 +2450,7 @@ static unsigned long reclaim_high(struct mem_cgroup *memcg, > psi_memstall_enter(&pflags); > nr_reclaimed += try_to_free_mem_cgroup_pages(memcg, nr_pages, > gfp_mask, > - MEMCG_RECLAIM_MAY_SWAP); > + MEMCG_RECLAIM_MAY_SWAP, NULL); > psi_memstall_leave(&pflags); > } while ((memcg = parent_mem_cgroup(memcg)) && > !mem_cgroup_is_root(memcg)); > @@ -2740,7 +2741,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, > > psi_memstall_enter(&pflags); > nr_reclaimed = try_to_free_mem_cgroup_pages(mem_over_limit, nr_pages, > - gfp_mask, reclaim_options); > + gfp_mask, reclaim_options, NULL); > psi_memstall_leave(&pflags); > > if (mem_cgroup_margin(mem_over_limit) >= nr_pages) > @@ -3660,7 +3661,7 @@ static int mem_cgroup_resize_max(struct mem_cgroup *memcg, > } > > if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, > - memsw ? 0 : MEMCG_RECLAIM_MAY_SWAP)) { > + memsw ? 0 : MEMCG_RECLAIM_MAY_SWAP, NULL)) { > ret = -EBUSY; > break; > } > @@ -3774,7 +3775,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg) > return -EINTR; > > if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, > - MEMCG_RECLAIM_MAY_SWAP)) > + MEMCG_RECLAIM_MAY_SWAP, NULL)) > nr_retries--; > } > > @@ -6720,7 +6721,7 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, > } > > reclaimed = try_to_free_mem_cgroup_pages(memcg, nr_pages - high, > - GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP); > + GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP, NULL); > > if (!reclaimed && !nr_retries--) > break; > @@ -6769,7 +6770,7 @@ static ssize_t memory_max_write(struct kernfs_open_file *of, > > if (nr_reclaims) { > if (!try_to_free_mem_cgroup_pages(memcg, nr_pages - max, > - GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP)) > + GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP, NULL)) > nr_reclaims--; > continue; > } > @@ -6895,6 +6896,16 @@ static ssize_t memory_oom_group_write(struct kernfs_open_file *of, > return nbytes; > } > > +enum { > + MEMORY_RECLAIM_SWAPPINESS = 0, > + MEMORY_RECLAIM_NULL, > +}; > + > +static const match_table_t if_tokens = { > + { MEMORY_RECLAIM_SWAPPINESS, "swappiness=%d"}, > + { MEMORY_RECLAIM_NULL, NULL }, > +}; > + > static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, > size_t nbytes, loff_t off) > { > @@ -6902,12 +6913,33 @@ static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, > unsigned int nr_retries = MAX_RECLAIM_RETRIES; > unsigned long nr_to_reclaim, nr_reclaimed = 0; > unsigned int reclaim_options; > - int err; > + char *old_buf, *start; > + substring_t args[MAX_OPT_ARGS]; > + int swappiness = -1; > > buf = strstrip(buf); > - err = page_counter_memparse(buf, "", &nr_to_reclaim); > - if (err) > - return err; > + > + old_buf = buf; > + nr_to_reclaim = memparse(buf, &buf) / PAGE_SIZE; > + if (buf == old_buf) > + return -EINVAL; > + > + buf = strstrip(buf); > + > + while ((start = strsep(&buf, " ")) != NULL) { > + if (!strlen(start)) > + continue; > + switch (match_token(start, if_tokens, args)) { > + case MEMORY_RECLAIM_SWAPPINESS: > + if (match_int(&args[0], &swappiness)) > + return -EINVAL; > + if (swappiness < 0 || swappiness > 200) > + return -EINVAL; > + break; > + default: > + return -EINVAL; > + } > + } > > reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE; > while (nr_reclaimed < nr_to_reclaim) { > @@ -6926,7 +6958,8 @@ static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, > > reclaimed = try_to_free_mem_cgroup_pages(memcg, > min(nr_to_reclaim - nr_reclaimed, SWAP_CLUSTER_MAX), > - GFP_KERNEL, reclaim_options); > + GFP_KERNEL, reclaim_options, > + swappiness == -1 ? NULL : &swappiness); > > if (!reclaimed && !nr_retries--) > return -EAGAIN; > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 506f8220c5fe..546704ea01e1 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -136,6 +136,9 @@ struct scan_control { > /* Always discard instead of demoting to lower tier memory */ > unsigned int no_demotion:1; > > + /* Swappiness value for reclaim, if NULL use memcg/global value */ > + int *swappiness; > + > /* Allocation order */ > s8 order; > > @@ -2327,7 +2330,8 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, > struct pglist_data *pgdat = lruvec_pgdat(lruvec); > struct mem_cgroup *memcg = lruvec_memcg(lruvec); > unsigned long anon_cost, file_cost, total_cost; > - int swappiness = mem_cgroup_swappiness(memcg); > + int swappiness = sc->swappiness ? > + *sc->swappiness : mem_cgroup_swappiness(memcg); Should we use "unlikely" here to indicate that sc->swappiness is an unexpected behavior? Due to current use case only apply in proactive reclaim. > u64 fraction[ANON_AND_FILE]; > u64 denominator = 0; /* gcc */ > enum scan_balance scan_balance; > @@ -2608,6 +2612,9 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc) > mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH) > return 0; > > + if (sc->swappiness) > + return *sc->swappiness; Also there. > + > return mem_cgroup_swappiness(memcg); > } > > @@ -6433,7 +6440,8 @@ unsigned long mem_cgroup_shrink_node(struct mem_cgroup *memcg, > unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, > unsigned long nr_pages, > gfp_t gfp_mask, > - unsigned int reclaim_options) > + unsigned int reclaim_options, > + int *swappiness) > { > unsigned long nr_reclaimed; > unsigned int noreclaim_flag; > @@ -6448,6 +6456,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, > .may_unmap = 1, > .may_swap = !!(reclaim_options & MEMCG_RECLAIM_MAY_SWAP), > .proactive = !!(reclaim_options & MEMCG_RECLAIM_PROACTIVE), > + .swappiness = swappiness, > }; > /* > * Traverse the ZONELIST_FALLBACK zonelist of the current node to put > -- > 2.34.1 My previous patch attempted to ensure fully deterministic semantics under extreme swappiness. For example, when swappiness is set to 200, only anonymous pages will be reclaimed. Due to code in MGLRU isolate_folios will try scan anon if no scanned, will try other type.(We do not want it to attempt this behavior.) How do you think about extreme swappiness scenarios? --------------xq9pwpu0yrK20qBSP9o7hDOY Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit


在 2023/11/30 23:36, Dan Schatzberg 写道:
[????????? schatzberg.dan@gmail.com ????????? https://aka.ms/LearnAboutSenderIdentification,????????????]

Allow proactive reclaimers to submit an additional swappiness=<val>
argument to memory.reclaim. This overrides the global or per-memcg
swappiness setting for that reclaim attempt.

For example:

echo "2M swappiness=0" > /sys/fs/cgroup/memory.reclaim

will perform reclaim on the rootcg with a swappiness setting of 0 (no
swap) regardless of the vm.swappiness sysctl setting.

Signed-off-by: Dan Schatzberg <schatzberg.dan@gmail.com>
---
 include/linux/swap.h |  3 ++-
 mm/memcontrol.c      | 55 +++++++++++++++++++++++++++++++++++---------
 mm/vmscan.c          | 13 +++++++++--
 3 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/include/linux/swap.h b/include/linux/swap.h
index f6dd6575b905..c6e309199f10 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -410,7 +410,8 @@ extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
 extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
                                                  unsigned long nr_pages,
                                                  gfp_t gfp_mask,
-                                                 unsigned int reclaim_options);
+                                                 unsigned int reclaim_options,
+                                                 int *swappiness);
 extern unsigned long mem_cgroup_shrink_node(struct mem_cgroup *mem,
                                                gfp_t gfp_mask, bool noswap,
                                                pg_data_t *pgdat,
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 1c1061df9cd1..ba1c89455ab0 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -63,6 +63,7 @@
 #include <linux/resume_user_mode.h>
 #include <linux/psi.h>
 #include <linux/seq_buf.h>
+#include <linux/parser.h>
 #include <linux/sched/isolation.h>
 #include "internal.h"
 #include <net/sock.h>
@@ -2449,7 +2450,7 @@ static unsigned long reclaim_high(struct mem_cgroup *memcg,
                psi_memstall_enter(&pflags);
                nr_reclaimed += try_to_free_mem_cgroup_pages(memcg, nr_pages,
                                                        gfp_mask,
-                                                       MEMCG_RECLAIM_MAY_SWAP);
+                                                       MEMCG_RECLAIM_MAY_SWAP, NULL);
                psi_memstall_leave(&pflags);
        } while ((memcg = parent_mem_cgroup(memcg)) &&
                 !mem_cgroup_is_root(memcg));
@@ -2740,7 +2741,7 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask,

        psi_memstall_enter(&pflags);
        nr_reclaimed = try_to_free_mem_cgroup_pages(mem_over_limit, nr_pages,
-                                                   gfp_mask, reclaim_options);
+                                                   gfp_mask, reclaim_options, NULL);
        psi_memstall_leave(&pflags);

        if (mem_cgroup_margin(mem_over_limit) >= nr_pages)
@@ -3660,7 +3661,7 @@ static int mem_cgroup_resize_max(struct mem_cgroup *memcg,
                }

                if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,
-                                       memsw ? 0 : MEMCG_RECLAIM_MAY_SWAP)) {
+                                       memsw ? 0 : MEMCG_RECLAIM_MAY_SWAP, NULL)) {
                        ret = -EBUSY;
                        break;
                }
@@ -3774,7 +3775,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg)
                        return -EINTR;

                if (!try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL,
-                                                 MEMCG_RECLAIM_MAY_SWAP))
+                                                 MEMCG_RECLAIM_MAY_SWAP, NULL))
                        nr_retries--;
        }

@@ -6720,7 +6721,7 @@ static ssize_t memory_high_write(struct kernfs_open_file *of,
                }

                reclaimed = try_to_free_mem_cgroup_pages(memcg, nr_pages - high,
-                                       GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP);
+                                       GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP, NULL);

                if (!reclaimed && !nr_retries--)
                        break;
@@ -6769,7 +6770,7 @@ static ssize_t memory_max_write(struct kernfs_open_file *of,

                if (nr_reclaims) {
                        if (!try_to_free_mem_cgroup_pages(memcg, nr_pages - max,
-                                       GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP))
+                                       GFP_KERNEL, MEMCG_RECLAIM_MAY_SWAP, NULL))
                                nr_reclaims--;
                        continue;
                }
@@ -6895,6 +6896,16 @@ static ssize_t memory_oom_group_write(struct kernfs_open_file *of,
        return nbytes;
 }

+enum {
+       MEMORY_RECLAIM_SWAPPINESS = 0,
+       MEMORY_RECLAIM_NULL,
+};
+
+static const match_table_t if_tokens = {
+       { MEMORY_RECLAIM_SWAPPINESS, "swappiness=%d"},
+       { MEMORY_RECLAIM_NULL, NULL },
+};
+
 static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,
                              size_t nbytes, loff_t off)
 {
@@ -6902,12 +6913,33 @@ static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,
        unsigned int nr_retries = MAX_RECLAIM_RETRIES;
        unsigned long nr_to_reclaim, nr_reclaimed = 0;
        unsigned int reclaim_options;
-       int err;
+       char *old_buf, *start;
+       substring_t args[MAX_OPT_ARGS];
+       int swappiness = -1;

        buf = strstrip(buf);
-       err = page_counter_memparse(buf, "", &nr_to_reclaim);
-       if (err)
-               return err;
+
+       old_buf = buf;
+       nr_to_reclaim = memparse(buf, &buf) / PAGE_SIZE;
+       if (buf == old_buf)
+               return -EINVAL;
+
+       buf = strstrip(buf);
+
+       while ((start = strsep(&buf, " ")) != NULL) {
+               if (!strlen(start))
+                       continue;
+               switch (match_token(start, if_tokens, args)) {
+               case MEMORY_RECLAIM_SWAPPINESS:
+                       if (match_int(&args[0], &swappiness))
+                               return -EINVAL;
+                       if (swappiness < 0 || swappiness > 200)
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }

        reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE;
        while (nr_reclaimed < nr_to_reclaim) {
@@ -6926,7 +6958,8 @@ static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf,

                reclaimed = try_to_free_mem_cgroup_pages(memcg,
                                        min(nr_to_reclaim - nr_reclaimed, SWAP_CLUSTER_MAX),
-                                       GFP_KERNEL, reclaim_options);
+                                       GFP_KERNEL, reclaim_options,
+                                       swappiness == -1 ? NULL : &swappiness);

                if (!reclaimed && !nr_retries--)
                        return -EAGAIN;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 506f8220c5fe..546704ea01e1 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -136,6 +136,9 @@ struct scan_control {
        /* Always discard instead of demoting to lower tier memory */
        unsigned int no_demotion:1;

+       /* Swappiness value for reclaim, if NULL use memcg/global value */
+       int *swappiness;
+
        /* Allocation order */
        s8 order;

@@ -2327,7 +2330,8 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc,
        struct pglist_data *pgdat = lruvec_pgdat(lruvec);
        struct mem_cgroup *memcg = lruvec_memcg(lruvec);
        unsigned long anon_cost, file_cost, total_cost;
-       int swappiness = mem_cgroup_swappiness(memcg);
+       int swappiness = sc->swappiness ?
+               *sc->swappiness : mem_cgroup_swappiness(memcg);
Should we use "unlikely" here to indicate that sc->swappiness is an unexpected behavior?
Due to current use case only apply in proactive reclaim.
        u64 fraction[ANON_AND_FILE];
        u64 denominator = 0;    /* gcc */
        enum scan_balance scan_balance;
@@ -2608,6 +2612,9 @@ static int get_swappiness(struct lruvec *lruvec, struct scan_control *sc)
            mem_cgroup_get_nr_swap_pages(memcg) < MIN_LRU_BATCH)
                return 0;

+       if (sc->swappiness)
+               return *sc->swappiness;
Also there.
+
        return mem_cgroup_swappiness(memcg);
 }

@@ -6433,7 +6440,8 @@ unsigned long mem_cgroup_shrink_node(struct mem_cgroup *memcg,
 unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
                                           unsigned long nr_pages,
                                           gfp_t gfp_mask,
-                                          unsigned int reclaim_options)
+                                          unsigned int reclaim_options,
+                                          int *swappiness)
 {
        unsigned long nr_reclaimed;
        unsigned int noreclaim_flag;
@@ -6448,6 +6456,7 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg,
                .may_unmap = 1,
                .may_swap = !!(reclaim_options & MEMCG_RECLAIM_MAY_SWAP),
                .proactive = !!(reclaim_options & MEMCG_RECLAIM_PROACTIVE),
+               .swappiness = swappiness,
        };
        /*
         * Traverse the ZONELIST_FALLBACK zonelist of the current node to put
--
2.34.1
My previous patch attempted to ensure fully deterministic semantics under extreme swappiness.
For example, when swappiness is set to 200, only anonymous pages will be reclaimed.
Due to code in MGLRU isolate_folios will try scan anon if no scanned, will try other type.(We do not want
it to attempt this behavior.)
How do you think about extreme swappiness scenarios?

    
--------------xq9pwpu0yrK20qBSP9o7hDOY--