From patchwork Tue Nov 22 20:38:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mina Almasry X-Patchwork-Id: 13052731 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 C7919C433FE for ; Tue, 22 Nov 2022 20:39:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 236F16B0073; Tue, 22 Nov 2022 15:39:06 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 1E79D8E0002; Tue, 22 Nov 2022 15:39:06 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0AF1B8E0001; Tue, 22 Nov 2022 15:39:06 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id F228B6B0073 for ; Tue, 22 Nov 2022 15:39:05 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id CA39AC10A7 for ; Tue, 22 Nov 2022 20:39:05 +0000 (UTC) X-FDA: 80162242650.23.8B5E3D0 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) by imf15.hostedemail.com (Postfix) with ESMTP id 506EDA000D for ; Tue, 22 Nov 2022 20:39:05 +0000 (UTC) Received: by mail-pj1-f74.google.com with SMTP id x8-20020a17090a6b4800b00218ae9b2a47so3606087pjl.6 for ; Tue, 22 Nov 2022 12:39:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=mH2xKyLbtphuPdUJ732OjxOQc7w7f5rhMLqPKs8ZczA=; b=qdsmec8olNuJkHjim4tCNOzdWa/frQp8m5lufYNaqejkZMLoMUUyW+CWmAkGziybpf XVtKd/0LwOGTSKPzuW0laRVzBchDj/eYAtuTCSNB8IMPYcpApfCWC2zjH37lPwrTquSo e6VwPwg/ku5WTWy2ImXR0wgUFLZ1Bya8Re9NroqrrjtTrQdgeKHCixYvONLr+VBOSK7D y/z7y3/mili8PPvIi+kePEDEmzvJZh09v92ohyzbQ5RuROFwKw5KgQsz7VHG+PzHsW5E 1yg6L/6VSUWRD0wFpHrfizjK3o+Nif6zqdPMbBMhrgAWMlNgfhUP/5lOq0C7Wj8y1WM3 OO7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mH2xKyLbtphuPdUJ732OjxOQc7w7f5rhMLqPKs8ZczA=; b=xwjXLDWwC5h7Gs4uXYwwH65yaAfcEMXfCI1GzhPWtFrmBNAdxMlLyCEEIJt8VjBFx+ JTPaI4ce+HdW41wQHOvCjT15KEG0q4kkveI1eJh/5Fl+vXziuzBssQryyhqQzXeUVQ30 SnA2a5PglY6+okNhbTFqm7ZDSVaNdTUA2/TyjsFV+PdCZsld+zi+pT/FnkVQR54pc1+/ pq6iGre0qqoi9QoEXCM3EtJXmdSpH8sTmo4FN+iWVGS+uhVsdj/8JQBOdlAw9tgMo6SG k1L+maV6q54pe+m5mneJrgem7dum8H4A9SJU3K2c0pYHUsjqcntoN7FBU3WtCgLBh1/M ubyQ== X-Gm-Message-State: ANoB5pkn9VA722FLWXUqQtTv0Xn0rG0flLPx9m/bIbsLrCXLKHz6/bK9 EM3V2jmVfEehLPjXxdO5VnVes4tlRsTzP37JNg== X-Google-Smtp-Source: AA0mqf4nRSDZsJA5udKOk+WPQ7He8G7ypX1TuK+m1EL8dLhG9pG68x3W9SVyDcAVprESbrBcmMcBBy7AvLCfO1+7Ag== X-Received: from almasrymina.svl.corp.google.com ([2620:15c:2d4:203:b7d0:497d:abe4:3e6f]) (user=almasrymina job=sendgmr) by 2002:a63:7143:0:b0:46f:918e:7338 with SMTP id b3-20020a637143000000b0046f918e7338mr6371506pgn.8.1669149544152; Tue, 22 Nov 2022 12:39:04 -0800 (PST) Date: Tue, 22 Nov 2022 12:38:46 -0800 In-Reply-To: <20221122203850.2765015-1-almasrymina@google.com> Mime-Version: 1.0 References: <20221122203850.2765015-1-almasrymina@google.com> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221122203850.2765015-2-almasrymina@google.com> Subject: [RFC PATCH v1] mm: Add memory.demote for proactive demotion only From: Mina Almasry To: Huang Ying , Yang Shi , Yosry Ahmed , Tim Chen , weixugc@google.com, shakeelb@google.com, gthelen@google.com, fvdl@google.com, Johannes Weiner , Michal Hocko , Roman Gushchin , Muchun Song , Andrew Morton Cc: Mina Almasry , linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1669149545; a=rsa-sha256; cv=none; b=q130LVdNn69CbKVYZ0Qg6j/8/EkkfkMod0ARDskgRP7Ag6At1LR5YCD5dcnv+MytpREvmx VoXTsAV9F9ARfKf/0wO27/lQsEzsgGv9aCM3WGSTRRU4aDzAqZjmnSuH1KNIxetgcl66S2 LZ1iQ6kh5EMEGbyuY/TozDwcQDjylB0= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=qdsmec8o; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 3aDN9YwsKCOUHSTHZYfTPUHNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--almasrymina.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3aDN9YwsKCOUHSTHZYfTPUHNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--almasrymina.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1669149545; 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=mH2xKyLbtphuPdUJ732OjxOQc7w7f5rhMLqPKs8ZczA=; b=gUr9dKE0qQUYF6ZoJHG2ZXogdDfHFhtFuTOKpph85/Blne34vVysOq542DFUgrqP0thp0H uJuwwUzdJcPkhPziIqUuxiHJlm5H7X/Xt8AtIE5WBjLmz6vqAWkuZDyxjVswWKn/66HdUD DE1kU8q+oZoXb7eTHQM25ZAwUHrIRws= X-Stat-Signature: sdq4yibq7byapqg7ot6kp6uz4uuq3k9h X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 506EDA000D Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=qdsmec8o; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf15.hostedemail.com: domain of 3aDN9YwsKCOUHSTHZYfTPUHNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--almasrymina.bounces.google.com designates 209.85.216.74 as permitted sender) smtp.mailfrom=3aDN9YwsKCOUHSTHZYfTPUHNVVNSL.JVTSPUbe-TTRcHJR.VYN@flex--almasrymina.bounces.google.com X-Rspam-User: X-HE-Tag: 1669149545-640340 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: Add the proactive demotion interface memory.demote. This interface can be used as follows: echo "1m" > memory.demote At this command the kernel will attempt to demote 1m of memory from this cgroup. The kernel may not be able to demote the full amount requested by the userspace and in that case EAGAIN would be returned to the user (similar to memory.reclaim). The kernel will only attempt to demote pages with this interface. It will not attempt any other kind of reclaim (swap, writeback or reclaiming clean file pages). Signed-off-by: Mina Almasry --- mm/memcontrol.c | 38 ++++++++++++++++++++++++++++++++++++++ mm/vmscan.c | 18 ++++++++++++++---- 2 files changed, 52 insertions(+), 4 deletions(-) -- 2.38.1.584.g0f3c55d4c2-goog diff --git a/mm/memcontrol.c b/mm/memcontrol.c index fd4ff1c865a2..427c79e467eb 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -6623,6 +6623,39 @@ static ssize_t memory_reclaim(struct kernfs_open_file *of, char *buf, return nbytes; } +static ssize_t memory_demote(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_demote, nr_demoted = 0; + unsigned int reclaim_options = MEMCG_RECLAIM_ONLY_DEMOTE; + int err; + + buf = strstrip(buf); + err = page_counter_memparse(buf, "", &nr_to_demote); + if (err) + return err; + + while (nr_demoted < nr_to_demote) { + unsigned long demoted; + + if (signal_pending(current)) + return -EINTR; + + demoted = try_to_free_mem_cgroup_pages( + memcg, nr_to_demote - nr_demoted, GFP_KERNEL, + reclaim_options); + + if (!demoted && !nr_retries--) + return -EAGAIN; + + nr_demoted += demoted; + } + + return nbytes; +} + static struct cftype memory_files[] = { { .name = "current", @@ -6691,6 +6724,11 @@ static struct cftype memory_files[] = { .flags = CFTYPE_NS_DELEGATABLE, .write = memory_reclaim, }, + { + .name = "demote", + .flags = CFTYPE_NS_DELEGATABLE, + .write = memory_demote, + }, { } /* terminate */ }; diff --git a/mm/vmscan.c b/mm/vmscan.c index dea05ad8ece5..8c1f5416d789 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1657,12 +1657,13 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, LIST_HEAD(demote_folios); unsigned int nr_reclaimed = 0; unsigned int pgactivate = 0; - bool do_demote_pass; + bool do_demote_pass, only_demote_pass; struct swap_iocb *plug = NULL; memset(stat, 0, sizeof(*stat)); cond_resched(); do_demote_pass = can_demote(pgdat->node_id, sc); + only_demote_pass = sc->demotion == 2; retry: while (!list_empty(folio_list)) { @@ -2091,10 +2092,19 @@ static unsigned int shrink_folio_list(struct list_head *folio_list, nr_reclaimed += demote_folio_list(&demote_folios, pgdat); /* Folios that could not be demoted are still in @demote_folios */ if (!list_empty(&demote_folios)) { - /* Folios which weren't demoted go back on @folio_list for retry: */ + /* + * Folios which weren't demoted go back on @folio_list. + */ list_splice_init(&demote_folios, folio_list); - do_demote_pass = false; - goto retry; + + /* + * goto retry to reclaim the undemoted folios in folio_list if + * desired. + */ + if (!only_demote_pass) { + do_demote_pass = false; + goto retry; + } } pgactivate = stat->nr_activate[0] + stat->nr_activate[1];