From patchwork Tue May 30 16:21:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 13260684 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 326C7C77B7A for ; Tue, 30 May 2023 16:21:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C1F18900003; Tue, 30 May 2023 12:21:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BA7C8900002; Tue, 30 May 2023 12:21:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A21A5900003; Tue, 30 May 2023 12:21:58 -0400 (EDT) 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 8B21F900002 for ; Tue, 30 May 2023 12:21:58 -0400 (EDT) Received: from smtpin17.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 03537C029E for ; Tue, 30 May 2023 16:21:57 +0000 (UTC) X-FDA: 80847437916.17.61C9839 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) by imf01.hostedemail.com (Postfix) with ESMTP id 1EA0740024 for ; Tue, 30 May 2023 16:21:55 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=H+oNAVDf; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.214.173 as permitted sender) smtp.mailfrom=nphamcs@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1685463716; 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-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=S/WBtGzBcsO34AYbOMyFXDghwkOVFx66YphlIfOblWg=; b=YsnoruKqLVGL0l1XtaKZ3dCuMezAwaLVRkIgoK9cmSn6buyMfr2Fh6d4eJGPyRLmzpLcI3 uyMPo5xFkFk2ztYUec82XvyRI669KjyR2vSIa0U30XIeAEbNLFCb42ss2gFovsdTpVttzX ODPUFje2a4YgBXSKVlR96Cz3ZknTsmY= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20221208 header.b=H+oNAVDf; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.214.173 as permitted sender) smtp.mailfrom=nphamcs@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1685463716; a=rsa-sha256; cv=none; b=oxjlLviZe99w0SLvi63V3h/OS69LJCWV7JwvLcowhn092TegcsFBzsA1skLiSvSxG2yrev LBsc2z+Ofbkd4ZiiJ3nlYj5RqZ+fc6KNsKQs275xPxSNrgMOl5o7KlJRFvlVAouVAh5dyf 7SjDhmFvDdIY6UafHuxcFosUH2wmyh4= Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-1b04782fe07so15059705ad.3 for ; Tue, 30 May 2023 09:21:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1685463715; x=1688055715; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=S/WBtGzBcsO34AYbOMyFXDghwkOVFx66YphlIfOblWg=; b=H+oNAVDf06d8gfWS/ueuFsRlVJTJWp3TvWHjC/HwSply/gryn+bKivg61AiFR6E2aj O2HVh3cAIIATR30eJia+jDxgsvPqfrjlFCGPcbYPq96S7Tyff2u2T6DbyCwhFp7jjRdG AOYIyNMjalsZX9lTKjpEr0DxRKLZniD0xUWj2vg8e3RM3ZjYpI/hdmeG9XKQw9ud4fW5 XQIOtK6N4jUJr+oFy+puEuHpzbHVDeBZh71hz7RTYp3ZAHQx9o3hBL+CmdQfzFVzS6U5 GvskRPwYSR8DmR8El1kBVTD7jhARzkHbTp9wAAMe7q9hNo2fKRSIj6iymw0IX7xJqbtD KMnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685463715; x=1688055715; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=S/WBtGzBcsO34AYbOMyFXDghwkOVFx66YphlIfOblWg=; b=TODdMz73iaaZs6BFR9LY5goV9kjmVU0n2h6YLWApjocKF4WusWYUB35qxyxPIvygnL MTJFQbiuD8cXLgOD07GH1c5iD/Txya2l4Wg+4Pvo4NLZlnWHoaaBYb2RIoRGNG8rwS3Z CD8hVs/IE6wzTa0fS7gKjzTB2LQoRjjoIjo3NXCfWyB8eQfDs+DDN1pG0gAzPiN8w0DF w+aFVOPv/2ritSrfnksJ3oOrCwWabyXFoqXDPM06na7yP25M1/UXdST6qU0XOgwtPr1Y kvNp0CInjPkaUtbTqg+qzS5XeC1O/ZhP2/F43j62UGzEDFPjN+Q7x1nyhbDp2915Iput cjFA== X-Gm-Message-State: AC+VfDyxjqYSoEMlzyqWwJxYy9hFd2Q3wDJEjQyvcH4fr4o7Up1UxZ32 hg4R3ISG42MYoCbnvahtw9Y= X-Google-Smtp-Source: ACHHUZ4wIBrz7z1GLUlZDavbbGlwP8PKAGax8z3iOvcuXCkTM4/ECdwkSo6366Osgjy18g/g1Ode4A== X-Received: by 2002:a17:902:e543:b0:1b0:49e1:6dc4 with SMTP id n3-20020a170902e54300b001b049e16dc4mr3220345plf.56.1685463714705; Tue, 30 May 2023 09:21:54 -0700 (PDT) Received: from localhost (fwdproxy-prn-000.fbsv.net. [2a03:2880:ff::face:b00c]) by smtp.gmail.com with ESMTPSA id jj4-20020a170903048400b001b04aee1f99sm3593171plb.228.2023.05.30.09.21.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 May 2023 09:21:54 -0700 (PDT) From: Nhat Pham To: akpm@linux-foundation.org Cc: hannes@cmpxchg.org, cerasuolodomenico@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, sjenning@redhat.com, ddstreet@ieee.org, vitaly.wool@konsulko.com, kernel-team@meta.com Subject: [PATCH] zswap: do not shrink when memory.zswap.max is 0 Date: Tue, 30 May 2023 09:21:53 -0700 Message-Id: <20230530162153.836565-1-nphamcs@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Rspam-User: X-Stat-Signature: bzqx8qpk4jn41ctutiz8ydoh5636x8wy X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 1EA0740024 X-HE-Tag: 1685463715-360334 X-HE-Meta: U2FsdGVkX1+d9Hr7xrd2rMZbiANrVvjCLR+1+RtNy/3IOpcGimXuyXMSAJrcENb0NF3LbSSwDTpxrDqjl36XfOf2iVA7fnjsGNTqF0BFnh5MbLWzWQaEVh4cEeJn48ZR40LMaxl3TXTxyXkk7+F1wCipAaKxAdd9R6EgXJ55a1MMQMuvRbMDYijFLZk9V3e9eaNvJmCyzXppVeoLD5IKToTcPGwIm5eela53M33M5J/C/BesjcxoTU/A99/dcAQt8wGX3xwgv7OMcobJzRwHe6LR4FRLs3IVQUIiwyvtwAvkDakZC2r04gPV61Tct3jGyfROCRB+e085eQgTIDpX2NRuaCoSuXXy7rAUqSf+DuD4L9wFQGqtUhewXrvUdJqZYCbD+fn0lKKvarhAVNw94Vrk48VC0d4YA8hpG2GAPkUlmH2Y5jxsyXaGhVNYOTIqQo6EnAR5SfLnvGEWIoX+F5w9ZOYYxRoBYi8+NQEmVAJNrUTlS0YwNnQrTXqilHocz8W3JsiT6Hy12ruHYodY1Vyo+HDNhC/uhGGlm5OKskM6OWKAFOElUOawTT6YHE45CFvC+wc3zB48/XmVsR8Vlg9VgiCwjzlx7F83tPEING1vaaeIm14CR+h43/x5zbpWTMZg18/KtWPg7czcU7IDC0NQ3QOv204zsq/yE3FqqJ7mZYBJxXkIo9iFFtaqf1QZOpkMGkkREoGJplY37trFjzNUIL526XuWv0Sr/Hb9JPo0sqT8RmqQsxcyjV84i9CGVZWvJowjYCuFEvHrwOC0CffD7ppd3NMiDZA8Wu/9LnLt8iviTrbPHbMYoUg+4nlQ8IMGajI7O8x6URxKKF/L9xH5cYAH6ol+8Rv1S0cP8HY3iBHmFgQwYZ+j9iloxgLl88a7ZV0UVDYa/B0Yv066fuabENdsd9z8HDL8shpOp4nxub86RXLHjoZboj4TZz5cXiLPHw2uK7PYwtFwPTk +3MAGyeG Po+xtXL0no1mu5HYkNWbtqDYmYHP/AJc+MQM+c7h0v5m6OqTPu2SrQphwvF/MgOGj+9JKy+0n9AQPUHW6IphRol2qJdcGXp8muh1h0igRCx7mXGnWKTyxcZrLuATJYc9pv1YvB8CFMPRkpj69zAmYmpr4LI8dXWlsf/BQszVNPw7A1Heyr6qlD9nSMiQWG0jQ0nd8KqDEC6gKA6yT6TSYVCFJkl3TqKXLcXqOomAbDww3dXYIxmAFIxo4i3o9DsyJDoQUw2BxMonPfKvwhT0T8ty8+Y+F/Y+gqB55OVoqCXOkuIkHVabu5TOeR8HsGk83qvcSFUsNTl86f5WhlrJPDkpyvdoUpTPgmX2ymiEhwSbE5ljM0ZFxG3Sc+lv8hEz1DXNoBtrnSheArHWvp2t9p84j1xKzxMqgrj0u9lobE2JdslI= 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: Before storing a page, zswap first checks if the number of stored pages exceeds the limit specified by memory.zswap.max, for each cgroup in the hierarchy. If this limit is reached or exceeded, then zswap shrinking is triggered and short-circuits the store attempt. However, if memory.zswap.max = 0 for a cgroup, no amount of writeback will allow future store attempts from processes in this cgroup to succeed. Furthermore, this create a pathological behavior in a system where some cgroups have memory.zswap.max = 0 and some do not: the processes in the former cgroups, under memory pressure, will evict pages stored by the latter continually, until the need for swap ceases or the pool becomes empty. As a result of this, we observe a disproportionate amount of zswap writeback and a perpetually small zswap pool in our experiments, even though the pool limit is never hit. This patch fixes the issue by rejecting zswap store attempt without shrinking the pool when memory.zswap.max is 0. Fixes: f4840ccfca25 ("zswap: memcg accounting") Signed-off-by: Nhat Pham Signed-off-by: Nhat Pham Signed-off-by: Andrew Morton Reviewed-by: Yosry Ahmed Acked-by: Johannes Weiner --- include/linux/memcontrol.h | 6 +++--- mm/memcontrol.c | 8 ++++---- mm/zswap.c | 9 +++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 222d7370134c..507bed3a28b0 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -1899,13 +1899,13 @@ static inline void count_objcg_event(struct obj_cgroup *objcg, #endif /* CONFIG_MEMCG_KMEM */ #if defined(CONFIG_MEMCG_KMEM) && defined(CONFIG_ZSWAP) -bool obj_cgroup_may_zswap(struct obj_cgroup *objcg); +int obj_cgroup_may_zswap(struct obj_cgroup *objcg); void obj_cgroup_charge_zswap(struct obj_cgroup *objcg, size_t size); void obj_cgroup_uncharge_zswap(struct obj_cgroup *objcg, size_t size); #else -static inline bool obj_cgroup_may_zswap(struct obj_cgroup *objcg) +static inline int obj_cgroup_may_zswap(struct obj_cgroup *objcg) { - return true; + return 0; } static inline void obj_cgroup_charge_zswap(struct obj_cgroup *objcg, size_t size) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 4b27e245a055..09aad0e6f2ea 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -7783,10 +7783,10 @@ static struct cftype memsw_files[] = { * spending cycles on compression when there is already no room left * or zswap is disabled altogether somewhere in the hierarchy. */ -bool obj_cgroup_may_zswap(struct obj_cgroup *objcg) +int obj_cgroup_may_zswap(struct obj_cgroup *objcg) { struct mem_cgroup *memcg, *original_memcg; - bool ret = true; + int ret = 0; if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) return true; @@ -7800,7 +7800,7 @@ bool obj_cgroup_may_zswap(struct obj_cgroup *objcg) if (max == PAGE_COUNTER_MAX) continue; if (max == 0) { - ret = false; + ret = -ENODEV; break; } @@ -7808,7 +7808,7 @@ bool obj_cgroup_may_zswap(struct obj_cgroup *objcg) pages = memcg_page_state(memcg, MEMCG_ZSWAP_B) / PAGE_SIZE; if (pages < max) continue; - ret = false; + ret = -ENOMEM; break; } mem_cgroup_put(original_memcg); diff --git a/mm/zswap.c b/mm/zswap.c index 59da2a415fbb..7b13dc865438 100644 --- a/mm/zswap.c +++ b/mm/zswap.c @@ -1175,8 +1175,13 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, } objcg = get_obj_cgroup_from_page(page); - if (objcg && !obj_cgroup_may_zswap(objcg)) - goto shrink; + if (objcg) { + ret = obj_cgroup_may_zswap(objcg); + if (ret == -ENODEV) + goto reject; + if (ret == -ENOMEM) + goto shrink; + } /* reclaim space if needed */ if (zswap_is_full()) {