From patchwork Wed Nov 8 06:58:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Huan Yang X-Patchwork-Id: 13449624 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 28041C4332F for ; Wed, 8 Nov 2023 06:59:46 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 996668D009F; Wed, 8 Nov 2023 01:59:45 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 946588D0058; Wed, 8 Nov 2023 01:59:45 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 798D08D009F; Wed, 8 Nov 2023 01:59:45 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 6256F8D0058 for ; Wed, 8 Nov 2023 01:59:45 -0500 (EST) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 35B7C1CB700 for ; Wed, 8 Nov 2023 06:59:45 +0000 (UTC) X-FDA: 81433886730.06.6844240 Received: from APC01-PSA-obe.outbound.protection.outlook.com (mail-psaapc01on2098.outbound.protection.outlook.com [40.107.255.98]) by imf27.hostedemail.com (Postfix) with ESMTP id 1885C4000D for ; Wed, 8 Nov 2023 06:59:41 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=vivo.com header.s=selector2 header.b=T5g6S6Tl; dmarc=pass (policy=quarantine) header.from=vivo.com; spf=pass (imf27.hostedemail.com: domain of link@vivo.com designates 40.107.255.98 as permitted sender) smtp.mailfrom=link@vivo.com; arc=pass ("microsoft.com:s=arcselector9901:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1699426782; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=cpt3abWMWZL86cwkXtjUBIcD5jhjGiRn8Da7mv9vXpM=; b=XhhMIxAtodEuR/DmdFwHQCUDlY4LO+wRgie7WH7k+WvGasUT/w0LD+mqgvrfAimiaebl3r 8uQYpRCASrE5yad1YYs6BEGOwpGtD6spIW3ymPdwiM5dEd9v3s5g75hX/Rjj419XSL8Bpn LR/iEN97obcecHkHOYf3rfoHum1YTMU= ARC-Authentication-Results: i=2; imf27.hostedemail.com; dkim=pass header.d=vivo.com header.s=selector2 header.b=T5g6S6Tl; dmarc=pass (policy=quarantine) header.from=vivo.com; spf=pass (imf27.hostedemail.com: domain of link@vivo.com designates 40.107.255.98 as permitted sender) smtp.mailfrom=link@vivo.com; arc=pass ("microsoft.com:s=arcselector9901:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1699426782; a=rsa-sha256; cv=pass; b=GqqmV91zSothJQtg8RBAUD42/vDNrXSNIIwXaspJFRmePrSYOOoH/fNtVMeEtOlocMXrun hkFw2cOqCVlLLAmtmrcpZTSeLMeLGWrl82aMLlDFZjjrW7q6m42stl5f5dyQhJENYQE2wD 9Zs9Iu0PeZkFAb9Aut07o/sPNOufS08= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kCraBDGS4nJwarZ3PkRvhZd8T/mhAFQIIROGgSIlLYDiOC/WmskRfqk6qfAscw3wSbp/UTLCQQVBv3ccRwvMbVuV0fXXJJlghCJ/4bCEKXMWpUSLv5rhACBqdAhcWWGvZbOJXuMljTlnsCekjzpguycCnx3diy6K8QGS/dp8lc+pDsdDLiBaRbshplypDDE1bQzHqhRTjnONWNre7HWOX891+6PnoGNGghAGgILS3emlPnqaVY6sa39DdhsPCBfDNf5bJCrwmM1Oh/Jb3INU/fHFRo3Le9v3zSU4HQ8rt0DGxF0bSQbOx9eSen/DjAZ3ggqqDScxXfAdRmbxcFk7Iw== 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=cpt3abWMWZL86cwkXtjUBIcD5jhjGiRn8Da7mv9vXpM=; b=gL3lZEyVtmJWEIKiOJe0EBXFrpTe28Pk4dfVINXgw7Xdkmxxs+SA2ivCpVZsmaRiic6uXSyNH3mRc7PulyPJtjybJCOk7aStiSynB64VYUPo4AuFsDYHVZTkUes4LlNQifTgZ0GpzjSqT4zMttQg7aFjjQLj0RWCkv6XrKZC3w4A5dDKRlg3gAVe4DOhWIUX88V+n6hIftgsJDQ7ao/fWSWP3j89rbiHFVj17ATO5gWbO0T1gkjWOu6rXNS+JGCaDP8OY7wB/CBmrWuQtOMr6WcU0tO9M49x69ngjg+GuMpi/2JDafpSsXp4gqwXvg68S777y42nrjURfxE+cX8PxA== 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=cpt3abWMWZL86cwkXtjUBIcD5jhjGiRn8Da7mv9vXpM=; b=T5g6S6Tlf3UWfalMHqwfDUd1akd+qmNpuWnyKPIcik7mlHhPmS3OsnUTQJAY0QloERNytsjhUxRk1WuNO8lHYxqn2Uq1qsNOhyzWophTUR0VB4QEHUANJmfXaFQH8SwIVPrmgw4EiDG1iYIXJkko11Az8egS8Nnw9zKy3mwwHDTmVHFAgWIcFcWO3eQkwwGifqMLHIffNJBIW+AotG0ovr8qcAelTH4D9u843wLi2kH2dNxdlF5resw3ImwFVRFAZqeaoPV7CNFUH85OpY/MjyTKfasqVWbHp4gqyWYn7l94e2FWrJKwUYfUJHAkL1gLlS1gwHD5nBqFv8SANnh6+g== Received: from PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) by TYZPR06MB3983.apcprd06.prod.outlook.com (2603:1096:400:2a::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.31; Wed, 8 Nov 2023 06:59:36 +0000 Received: from PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::d754:7b3:dc4c:6b48]) by PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::d754:7b3:dc4c:6b48%6]) with mapi id 15.20.6954.027; Wed, 8 Nov 2023 06:59:36 +0000 From: Huan Yang To: Tejun Heo , Zefan Li , Johannes Weiner , Jonathan Corbet , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , David Hildenbrand , Matthew Wilcox , Huang Ying , Kefeng Wang , "Vishal Moola (Oracle)" , Yosry Ahmed , Liu Shixin , Peter Xu , Hugh Dickins , cgroups@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: opensource.kernel@vivo.com, Huan Yang Subject: [PATCH 4/4] mm: memcg: apply proactive reclaim into cgroupv1 Date: Wed, 8 Nov 2023 14:58:15 +0800 Message-Id: <20231108065818.19932-5-link@vivo.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231108065818.19932-1-link@vivo.com> References: <20231108065818.19932-1-link@vivo.com> X-ClientProxiedBy: SG2PR04CA0187.apcprd04.prod.outlook.com (2603:1096:4:14::25) To PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR06MB5676:EE_|TYZPR06MB3983:EE_ X-MS-Office365-Filtering-Correlation-Id: 20acc9e2-58a7-4525-20d8-08dbe0284504 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: m0d0S7dPrYxKIv/KvKIcZDpSuhQUlfqSF38FYFnQ9sMAibzE1RQ04hVvFBb1cPkaNn84TF0tP729kh5cDm5iRuB4SGFz0Q5V1m78wtJG9qZwHZOkXMBzyoQ12p/GsATf8jwTgmbxvMedHfu7SbFZxUWdI3cnCRK6MPdqeDcTS19sBponAL05mkGmO4teCz4W56lPKITUaWp7VgPpX6rIVmXe/fhC4XHVCQ9PNq8Afxsa/6grdww1ezMKRO/AAQ32rePxyqvHnfoxSvgsCed4ZMdHOerh0rpcA/vbZ7MC2vPebwf6JXy9rju9MhGmsSafx7SYmgPh7s/p58cNh8iPzRDD0ZUSycznujZreMeazcY8q7DwkTLDY1BeLiITIL3LdTJ2/Ku71R+pR+CxaxizwoFSw4OKKEo27bv7i2DvwzSs998w7b3jhfKMJnu59JdLIotH14ELHOk+/J4p0QDRMrTS5aQclaSRHmPkxVSdoTlRwtxAJE8LuvnFip4YAGekZUNbdNcE9Wy/xMsqqsNzIPDLQQZdy13s7LCXv+5wegzLlJKlu1eLhoIfBMGa1C2YdvqsgUIp/YysZyKXpcGOGWWwmkjFf8R21N8mqHLABiKzrBaX6BqLYyWk/ad7nGRFUzdz+4qm9PAr/qXXeOIiEg== 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)(376002)(346002)(136003)(396003)(39850400004)(230922051799003)(64100799003)(186009)(1800799009)(451199024)(6486002)(6512007)(5660300002)(6506007)(478600001)(52116002)(6666004)(83380400001)(8936002)(8676002)(4326008)(7416002)(316002)(2906002)(26005)(110136005)(66556008)(66476007)(66946007)(86362001)(41300700001)(38100700002)(2616005)(107886003)(1076003)(38350700005)(921008)(36756003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: VlPaXpZhkN6WqfJIzxQvj13oPxcigxKR51rIimCIRc15ghggxGoQCKX6chvJn2FYADzlaOfqhWNotGDp5lYl9PrMg10eCNCbvVgOLAK9j34ilnYd+CdVJ1z55n9KPhjnMw7THTcCN8e9PnZi9BJTxTkWskCHXrWUqtxw4GTHnrYkLBgW29hBYw4UU+oZXhRcU9XicMvaoVWqxwZg5J5hgNVQhBAsYgGPsVUpKW62FlY97XI0APrj+7cZ0CrBrQaQpcnTvFa++QzNEtRqrfAqTKgYcuZKtHgbZ3fj3ZqATakIzDuGtHMKoWGfB5NZb39b40z2aDduSQpUgg8kWOyO7wvdxIseBDAJyz2Nz5yl/azZayzpIveQgHsXwNW861OOB2fvbImpA9oKXi78EVWWiRVFzl5qmaYrTPp+gmuhYdXqn6K2QCMXKPTA7+pU6paI5RMhGGyCqf9gYolcKrseGv8tR7Ksn26Ih8MDII6X15UuNpS6MHPCPs3Hcp0neKDITDmcqiQQDrQUxGLYhSsZLATbVwwDHiOvsZMQoqvq9hydbxbi1JK6G0PCxN3acI8xaDxhQu1nI+UB4+0CrMdmJj2R8v4XVVArv3KCpyuf/kFsMudaxZoN307DAkzHwb3GpZ6iCnovvRmJsXEl1jZaGXPcl08rIcWH219JfIj3ihQlf/17r7yFEN9yclC+nxpQ+/5OZcE9MHN5tTVehTHwp4AngpGBoxVWpreMY1OJBZCGANkL2oaN2lvxNpNd1N0MDkooQncfRGUH29NjPOGBntpuJeMMQjae7zWSklyJmaAWrbuHSNlx1MfvwRlWuesWGcTya1I3Nz93gAoTwuBigJu0ewfuERSI3wXfOw2TMPjLhxSMHHp5sIWFq10HMqYBMNt3X2CCHdFiu2mScy4vubCY8Bj+laqGAGOBbpGNhHnn7TPkS06eni0SPFMHl9P0KWBAshtCACY6oHbyZDnjqUaCl2q8OXXHmMUFjfIWo49c+ko1z+ygswXvNfu+YLvtt+9g4yHUXe3M1LFyQj459P0BapCN29vXTYJpKxEtHXG0uLYmob2Bl58arFeoJOpQzVpYCQuXCZwdIv2OKg2jL1y+9nv6L/c46bdv8jWo4izEapInqyCgN5O630s6Atzn7j+CEAdtzxeYqSXfVo2l7EIv56FrJ9982GQcpJ0d1plSD4NSnA0HttGzIpGztzOvykOMqvf4Jpi3SkAbZ/hrH7kKG367NNfz6i8UVkumYfliUnpfhe2AnqW5PRO1rW+n1idoqhf7BY2aAgh0FwDBhVnLxaDFiW5YxXj/HpZzn/h5m+/X6KfChCx16bZf72xH0wiHm/C32g2WzMItWbU2Zo3lwUeZ7FNnGb5U8KV29POxYGh8tpWvgAlrESNRr7c+Yds4Zksd954cUeAAJl4pqZwdOdSvfx6kc8/5dfyz0tM9Ue1znhmk68d5zMHkInbNcQsMqDCqcf861b11s6t8ZZPNj4vENt69q8zQn51P2AzISTeJ/hUZWHKjqlKeGdZpLsPnf9xeQd0H/AODOezyMrbDNDy6TGTxwvWFL6F0MuaIewp9qz0Yljc/9PC12zlg X-OriginatorOrg: vivo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 20acc9e2-58a7-4525-20d8-08dbe0284504 X-MS-Exchange-CrossTenant-AuthSource: PUZPR06MB5676.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Nov 2023 06:59:36.6176 (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: XSS/k6YWNSQpN8HOWteW9MF3EkxY5wmnTwpXNJvyn9d3FdCwRi+q7gY/OPiSeUcwPsWYbIZSokxxEzzINpjYrw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYZPR06MB3983 X-Rspamd-Queue-Id: 1885C4000D X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: 1t7oxa98ekgpyk6z7wgbeo8jd5byau7w X-HE-Tag: 1699426781-554377 X-HE-Meta: U2FsdGVkX1/ZbVP9lOEYBNCtZxOdo/8FF/Ulvh7M6739wwRk/AulMEoY/hieNCdfhSAEcCwBNdF/IY2W4zdbI8/Vsv4OVL7/12REc9bp3itkUEzL8ACRKYJcI7gTVAABItWZRz6sfXyo9NexrsAmaj2kJwFzj6MVK3Qp3qKylXYxgY7J5CQdbHYXD+FzH48zoqS3XEcX4z+tS25ZFRnSWq7JU5mImJDOjlW+iiSdlJUpzF9skLcUs9b5TSTBQKI7Ax105KfvfcS1sUxP+AXalYIvW9/8hePJEPXzVbPl+JzA8JZ2Dz4DBtYuW6WMcyVrVGafWGtNmCSWyVMT9eKTYboYZIfWXDK8wOhbYNVT/PDrm0FIRJxYIWQ22M+Hb35lCEgg8EcbKctUI4PuOqREs9t1I6ffPm+jMXL2vEB22b7ZU3CkxbBWGYuibAlDHPRO1VNe5pk5WrSJ1pxMRZbvN/gcoTkR/DtEngGuwrs3Kp9v0s+BRE5wqV7nh5z6BhrWykiE9wZvnOCS3hCOWmVMLH6Z+Z8daXgE/nEmqolpCg7v7myc95zVDMuTMgF+Z4wYuBjSvi88U45xUtys92bSOC/7Cz7ayHLs+gz+jyJFCCgEK4n4JkuZQ7rde4E9lnW6Q5MkHFR83JHnDPX6RVTPF3eWu9Xmsue027ROVasI1AnD7eVcLJ+ZT0pfItT+IaJIevTKES6HMiy8AnvnxIC53bF55dHOJhVrpEGCRPnHIy1fmDsy/bpuQqLWJMcQhi82mBMQ49/l5445lSISyO34lGf1HQU8ZiSVGMAkxRXlIfbqdRJcAE3S3Kv68bHJI/95WiPduYTNBPVXiiYA7nwC0V4oUJ+sqlFITC3UCjVpqIJ6gnT2KQWgpeT2DcpXra0ttxcJB+5qGs+5USgWdPAJ+UiySrKKT7oTxT/T//h/lUYMJ2/LgTv4sq3+fJ+dDXgNOfMID9tg6ZMkmrvfO3u vgZsrr7l i9FpYcFj85k/1UOTC13TDZd3SWiKwjDnxEPHe/k9v3kZujchKV4XHtmmIOrLm4uhE2tKzvaUNKvJkrErqj1BTVnScaYktzur45LZt2gs+zkRyXsyUcs/w7I2vp1DtOq53OI3fz8vmh0Z2Vijq6l5byzlmcHj6fCh61Ckd8mEsAt6DNqoR1hfZLfhKjZDa5JhfvCXtU4H7yySs22tVp+8RTMFlpSS+nr5ORheA9QkLysyrzosGF3Fq4sMwVgC/698taRbTMoB0nUSsgy8s49HDLx7+gLVwBv2hGXLucKStu70eYaMg3FmFFF565N1p/04zpMW6W5Hw+/qZUJY= 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: For android use, apply proactive reclaim into cgroupv1 Signed-off-by: Huan Yang --- .../admin-guide/cgroup-v1/memory.rst | 38 +++- mm/memcontrol.c | 170 +++++++++--------- 2 files changed, 124 insertions(+), 84 deletions(-) diff --git a/Documentation/admin-guide/cgroup-v1/memory.rst b/Documentation/admin-guide/cgroup-v1/memory.rst index ca7d9402f6be..600bf26a470a 100644 --- a/Documentation/admin-guide/cgroup-v1/memory.rst +++ b/Documentation/admin-guide/cgroup-v1/memory.rst @@ -90,6 +90,7 @@ Brief summary of control files. This knob is deprecated and shouldn't be used. memory.oom_control set/show oom controls. + memory.memory proactive reclaim. memory.numa_stat show the number of memory usage per numa node memory.kmem.limit_in_bytes Deprecated knob to set and read the kernel @@ -972,7 +973,42 @@ Test: (Expect a bunch of notifications, and eventually, the oom-killer will trigger.) -12. TODO +12. Proactive Reclaim +======== +memory.reclaim A write-only nested-keyed file which exists for all cgroups. + +This is a simple interface to trigger memory reclaim in the +target cgroup. + +This file accepts a few key, the number of bytes to reclaim. +Few nested keys are currently supported. + +Example:: + + echo "1G" > memory.reclaim + +The interface extended with nested keys to configure the +reclaim behavior. For example, specify the swappiness of +memory to reclaim from (anon, file, ..). + +Example:: + + echo "1G" 200 > memory.reclaim (only reclaim anon) + echo "1G" 0 > memory.reclaim (only reclaim file) + echo "1G" 1 > memory.reclaim (only reclaim file) + +Please note that the kernel can over or under reclaim from +the target cgroup. If less bytes are reclaimed than the +specified amount, -EAGAIN is returned. + +Please note that the proactive reclaim (triggered by this +interface) is not meant to indicate memory pressure on the +memory cgroup. Therefore socket memory balancing triggered by +the memory reclaim normally is not exercised in this case. +This means that the networking layer will not adapt based on +reclaim induced by memory.reclaim. + +13. TODO ======== 1. Make per-cgroup scanner reclaim not-shared pages first diff --git a/mm/memcontrol.c b/mm/memcontrol.c index a0e460abd41c..03de3387d714 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5209,6 +5209,89 @@ static int mem_cgroup_slab_show(struct seq_file *m, void *p) static int memory_stat_show(struct seq_file *m, void *v); +static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, + size_t nbytes, loff_t off) +{ + struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); + unsigned int nr_retries = MAX_RECLAIM_RETRIES; + unsigned long nr_to_reclaim, nr_reclaimed = 0; + unsigned int reclaim_options; + int swappiness = -1, org_swappiness, n; + char *tmpbuf; + int err; + + tmpbuf = kvzalloc(nbytes, GFP_KERNEL); + if (unlikely(!tmpbuf)) + return -ENOMEM; + + buf = skip_spaces(buf); + n = sscanf(buf, "%s %d", tmpbuf, &swappiness); + if (n < 1) { + err = -EINVAL; + goto out_free; + } + + if (n == 2 && (swappiness > 200 || swappiness < 0)) { + err = -EINVAL; + goto out_free; + } + + err = page_counter_memparse(tmpbuf, "", &nr_to_reclaim); + if (err) + goto out_free; + + reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE; + if (swappiness != -1) { + org_swappiness = memcg->swappiness; + memcg->swappiness = swappiness; + if (swappiness == 200) + reclaim_options |= MEMCG_RECLAIM_ANON; + else if (swappiness == 0 || swappiness == 1) + reclaim_options |= MEMCG_RECLAIM_FILE; + } + + while (nr_reclaimed < nr_to_reclaim) { + unsigned long reclaimed; + + if (signal_pending(current)) { + err = -EINTR; + goto out; + } + + /* + * This is the final attempt, drain percpu lru caches in the + * hope of introducing more evictable pages for + * try_to_free_mem_cgroup_pages(). + */ + if (!nr_retries) + lru_add_drain_all(); + + reclaimed = try_to_free_mem_cgroup_pages(memcg, + min(nr_to_reclaim - nr_reclaimed, SWAP_CLUSTER_MAX), + GFP_KERNEL, reclaim_options); + + if (!reclaimed && !nr_retries--) { + err = -EAGAIN; + goto out; + } + + nr_reclaimed += reclaimed; + } + + if (swappiness != -1) + memcg->swappiness = org_swappiness; + + return nbytes; + +out: + if (swappiness != -1) + memcg->swappiness = org_swappiness; + +out_free: + kvfree(tmpbuf); + return err; +} + static struct cftype mem_cgroup_legacy_files[] = { { .name = "usage_in_bytes", @@ -5272,6 +5355,10 @@ static struct cftype mem_cgroup_legacy_files[] = { .seq_show = mem_cgroup_oom_control_read, .write_u64 = mem_cgroup_oom_control_write, }, + { + .name = "reclaim", + .write = memory_reclaim, + }, { .name = "pressure_level", .seq_show = mem_cgroup_dummy_seq_show, @@ -6946,89 +7033,6 @@ static ssize_t memory_oom_group_write(struct kernfs_open_file *of, return nbytes; } -static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, - size_t nbytes, loff_t off) -{ - struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); - unsigned int nr_retries = MAX_RECLAIM_RETRIES; - unsigned long nr_to_reclaim, nr_reclaimed = 0; - unsigned int reclaim_options; - int swappiness = -1, org_swappiness, n; - char *tmpbuf; - int err; - - tmpbuf = kvzalloc(nbytes, GFP_KERNEL); - if (unlikely(!tmpbuf)) - return -ENOMEM; - - buf = skip_spaces(buf); - n = sscanf(buf, "%s %d", tmpbuf, &swappiness); - if (n < 1) { - err = -EINVAL; - goto out_free; - } - - if (n == 2 && (swappiness > 200 || swappiness < 0)) { - err = -EINVAL; - goto out_free; - } - - err = page_counter_memparse(tmpbuf, "", &nr_to_reclaim); - if (err) - goto out_free; - - reclaim_options = MEMCG_RECLAIM_MAY_SWAP | MEMCG_RECLAIM_PROACTIVE; - if (swappiness != -1) { - org_swappiness = memcg->swappiness; - memcg->swappiness = swappiness; - if (swappiness == 200) - reclaim_options |= MEMCG_RECLAIM_ANON; - else if (swappiness == 0 || swappiness == 1) - reclaim_options |= MEMCG_RECLAIM_FILE; - } - - while (nr_reclaimed < nr_to_reclaim) { - unsigned long reclaimed; - - if (signal_pending(current)) { - err = -EINTR; - goto out; - } - - /* - * This is the final attempt, drain percpu lru caches in the - * hope of introducing more evictable pages for - * try_to_free_mem_cgroup_pages(). - */ - if (!nr_retries) - lru_add_drain_all(); - - reclaimed = try_to_free_mem_cgroup_pages(memcg, - min(nr_to_reclaim - nr_reclaimed, SWAP_CLUSTER_MAX), - GFP_KERNEL, reclaim_options); - - if (!reclaimed && !nr_retries--) { - err = -EAGAIN; - goto out; - } - - nr_reclaimed += reclaimed; - } - - if (swappiness != -1) - memcg->swappiness = org_swappiness; - - return nbytes; - -out: - if (swappiness != -1) - memcg->swappiness = org_swappiness; - -out_free: - kvfree(tmpbuf); - return err; -} - static struct cftype memory_files[] = { { .name = "current",