From patchwork Sat Apr 23 15:56:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Vernet X-Patchwork-Id: 12824631 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 0EBB9C433FE for ; Sat, 23 Apr 2022 15:57:03 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 977576B0075; Sat, 23 Apr 2022 11:57:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 926306B0078; Sat, 23 Apr 2022 11:57:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7C8176B007B; Sat, 23 Apr 2022 11:57:02 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.27]) by kanga.kvack.org (Postfix) with ESMTP id 6D0B56B0075 for ; Sat, 23 Apr 2022 11:57:02 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay12.hostedemail.com (Postfix) with ESMTP id 399C81214F3 for ; Sat, 23 Apr 2022 15:57:02 +0000 (UTC) X-FDA: 79388597484.21.0F899E9 Received: from mail-qt1-f179.google.com (mail-qt1-f179.google.com [209.85.160.179]) by imf01.hostedemail.com (Postfix) with ESMTP id 08BDB40027 for ; Sat, 23 Apr 2022 15:56:58 +0000 (UTC) Received: by mail-qt1-f179.google.com with SMTP id fu34so7590965qtb.8 for ; Sat, 23 Apr 2022 08:57:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mhe+ozq+IV2MAwRrDsZ/ZSWkxzhsnE8j2jwM5MH+fqc=; b=vAw/G5sBeDFyHb9s0kDW0SIoMeuaYuH6Qt4RUfUgSPNF38Cp11BK4DmUtBb5wnC5+x jtEPxmKtqvpJq1XH/clEfGyVdxMaGK88xzpAZUtn4qy/PaNgthZBu/iC8qnzQXWHGxAR fR4jgwsNb5z0g/n4+ubSeka3VA/n+zESXnLHzkQBKZSuq/3MQi61qvC7OFMadK7FEpjX CEdeS1G3lh0J+b663E7lLfyWqnt8c+OzQ4pokZD5VTmxTZnD1/etSA5ShCp/I7sDxsXH KDmW1180r3AHEjK+YgX9/6MvkcRh7Z2ADR4ymupc28eaodLBEH8iXbpZv++yOwVrsez9 XCVg== X-Gm-Message-State: AOAM5311nzkoUOcQQnGhkcsSmWXdnXJE6KgoFC0+mhEXC3EtS3QYPX3s p27OxSXsWqS5BXp7SAjOBrA= X-Google-Smtp-Source: ABdhPJytoSPlwHitp9twoxnBZ7MxFhgDBzJwzRKymTJHRnKFhp6540h96jk3b/p131t+VpieODtcCw== X-Received: by 2002:a05:622a:342:b0:2f3:5c21:1bed with SMTP id r2-20020a05622a034200b002f35c211bedmr4829541qtw.123.1650729420904; Sat, 23 Apr 2022 08:57:00 -0700 (PDT) Received: from localhost (fwdproxy-ash-119.fbsv.net. [2a03:2880:20ff:77::face:b00c]) by smtp.gmail.com with ESMTPSA id a1-20020ac844a1000000b002f364521df2sm149742qto.21.2022.04.23.08.57.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 08:57:00 -0700 (PDT) From: David Vernet To: akpm@linux-foundation.org Cc: tj@kernel.org, roman.gushchin@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, hannes@cmpxchg.org, mhocko@kernel.org, shakeelb@google.com, kernel-team@fb.com, void@manifault.com Subject: [PATCH v2 1/5] cgroups: Refactor children cgroups in memcg tests Date: Sat, 23 Apr 2022 08:56:17 -0700 Message-Id: <20220423155619.3669555-2-void@manifault.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220423155619.3669555-1-void@manifault.com> References: <20220423155619.3669555-1-void@manifault.com> MIME-Version: 1.0 X-Stat-Signature: njqmsohperyhbzuy931yqy5ihq5a5z7k X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 08BDB40027 Authentication-Results: imf01.hostedemail.com; dkim=none; spf=pass (imf01.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.160.179 as permitted sender) smtp.mailfrom=dcvernet@gmail.com; dmarc=none X-Rspam-User: X-HE-Tag: 1650729418-652805 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000298, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: In test_memcg_min() and test_memcg_low(), there is an array of four sibling cgroups. All but one of these sibling groups does a 50MB allocation, and the group that does no allocation is the third of four in the array. This is not a problem per se, but makes it a bit tricky to do some assertions in test_memcg_low(), as we want to make assertions on the siblings based on whether or not they performed allocations. Having a static index before which all groups have performed an allocation makes this cleaner. This patch therefore reorders the sibling groups so that the group that performs no allocations is the last in the array. A follow-on patch will leverage this to fix a bug in the test that incorrectly asserts that a sibling group that had performed an allocation, but only had protection from its parent, will not observe any memory.events.low events during reclaim. Signed-off-by: David Vernet Acked-by: Roman Gushchin --- .../selftests/cgroup/test_memcontrol.c | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c index 6b5259394e68..284d912e7d3e 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -244,8 +244,8 @@ static int cg_test_proc_killed(const char *cgroup) * A/B memory.min = 50M, memory.current = 50M * A/B/C memory.min = 75M, memory.current = 50M * A/B/D memory.min = 25M, memory.current = 50M - * A/B/E memory.min = 500M, memory.current = 0 - * A/B/F memory.min = 0, memory.current = 50M + * A/B/E memory.min = 0, memory.current = 50M + * A/B/F memory.min = 500M, memory.current = 0 * * Usages are pagecache, but the test keeps a running * process in every leaf cgroup. @@ -255,7 +255,7 @@ static int cg_test_proc_killed(const char *cgroup) * A/B memory.current ~= 50M * A/B/C memory.current ~= 33M * A/B/D memory.current ~= 17M - * A/B/E memory.current ~= 0 + * A/B/F memory.current ~= 0 * * After that it tries to allocate more than there is * unprotected memory in A available, and checks @@ -321,7 +321,7 @@ static int test_memcg_min(const char *root) if (cg_create(children[i])) goto cleanup; - if (i == 2) + if (i > 2) continue; cg_run_nowait(children[i], alloc_pagecache_50M_noexit, @@ -336,9 +336,9 @@ static int test_memcg_min(const char *root) goto cleanup; if (cg_write(children[1], "memory.min", "25M")) goto cleanup; - if (cg_write(children[2], "memory.min", "500M")) + if (cg_write(children[2], "memory.min", "0")) goto cleanup; - if (cg_write(children[3], "memory.min", "0")) + if (cg_write(children[3], "memory.min", "500M")) goto cleanup; attempts = 0; @@ -364,7 +364,7 @@ static int test_memcg_min(const char *root) if (!values_close(c[1], MB(17), 20)) goto cleanup; - if (!values_close(c[2], 0, 1)) + if (c[3] != 0) goto cleanup; if (!cg_run(parent[2], alloc_anon, (void *)MB(170))) @@ -401,8 +401,8 @@ static int test_memcg_min(const char *root) * A/B memory.low = 50M, memory.current = 50M * A/B/C memory.low = 75M, memory.current = 50M * A/B/D memory.low = 25M, memory.current = 50M - * A/B/E memory.low = 500M, memory.current = 0 - * A/B/F memory.low = 0, memory.current = 50M + * A/B/E memory.low = 0, memory.current = 50M + * A/B/F memory.low = 500M, memory.current = 0 * * Usages are pagecache. * Then it creates A/G an creates a significant @@ -412,7 +412,7 @@ static int test_memcg_min(const char *root) * A/B memory.current ~= 50M * A/B/ memory.current ~= 33M * A/B/D memory.current ~= 17M - * A/B/E memory.current ~= 0 + * A/B/F memory.current ~= 0 * * After that it tries to allocate more than there is * unprotected memory in A available, @@ -476,7 +476,7 @@ static int test_memcg_low(const char *root) if (cg_create(children[i])) goto cleanup; - if (i == 2) + if (i > 2) continue; if (cg_run(children[i], alloc_pagecache_50M, (void *)(long)fd)) @@ -491,9 +491,9 @@ static int test_memcg_low(const char *root) goto cleanup; if (cg_write(children[1], "memory.low", "25M")) goto cleanup; - if (cg_write(children[2], "memory.low", "500M")) + if (cg_write(children[2], "memory.low", "0")) goto cleanup; - if (cg_write(children[3], "memory.low", "0")) + if (cg_write(children[3], "memory.low", "500M")) goto cleanup; if (cg_run(parent[2], alloc_anon, (void *)MB(148))) @@ -511,7 +511,7 @@ static int test_memcg_low(const char *root) if (!values_close(c[1], MB(17), 20)) goto cleanup; - if (!values_close(c[2], 0, 1)) + if (c[3] != 0) goto cleanup; if (cg_run(parent[2], alloc_anon, (void *)MB(166))) { From patchwork Sat Apr 23 15:56:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Vernet X-Patchwork-Id: 12824632 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 8938FC433F5 for ; Sat, 23 Apr 2022 15:57:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 13A026B0078; Sat, 23 Apr 2022 11:57:12 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0E95E6B007B; Sat, 23 Apr 2022 11:57:12 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ECC9B6B007D; Sat, 23 Apr 2022 11:57:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.27]) by kanga.kvack.org (Postfix) with ESMTP id DD0786B0078 for ; Sat, 23 Apr 2022 11:57:11 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id B44DB61979 for ; Sat, 23 Apr 2022 15:57:11 +0000 (UTC) X-FDA: 79388597862.12.F5D9DDF Received: from mail-qv1-f54.google.com (mail-qv1-f54.google.com [209.85.219.54]) by imf02.hostedemail.com (Postfix) with ESMTP id 7B3BF80040 for ; Sat, 23 Apr 2022 15:57:09 +0000 (UTC) Received: by mail-qv1-f54.google.com with SMTP id a5so8428456qvx.1 for ; Sat, 23 Apr 2022 08:57:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=pdJh19mhSXyLFACX22MoCTE0boFuYhA324nOqBiKz+c=; b=4hyXoqv2V7KPrmUZIUuc2nyVnU8LDEeTqqUwYvG+8AiAatqGfEYMDxGHlxBLLoPtoJ kv0fw601pyEAPFU4OcLZDqQy7S3aw2jMnAlHZOgwpewj8KPxCEJf+8mZpxHEcl9bo/yN HY5VsINXN6/OOwCDaH9EQRbrnuqGKIktXUtOGTgtsuwJg+mFnFyM6QRgYQIfErAnxvI0 A3Gde942gX3hUyHkqmc0/l8JkwJJY7KT9kDz57UItu3GU1aVTcJjYle83JG+oB367PdI n5z413cbBmBscWq3ld6kzLHrMMK0aP9gGCZuIN9ZsY/KAPttV6jUJOFb3PXnSZVkL2Uw Po5w== X-Gm-Message-State: AOAM5303Zj3l5ECK6+i4ZvSlc2mQhbeNncXSgKjif2v3UU9AIM6NlKG9 ElIlG256POHsSEUr8eXvOYo= X-Google-Smtp-Source: ABdhPJzbIDyOnNIorYlI1wtlV5sgI0Le0m3m9xvp1ptF9YqnSRqNAZwZr0/K9T9eNh/Y3MXhnku5Rg== X-Received: by 2002:a05:6214:3001:b0:443:bb87:7f9a with SMTP id ke1-20020a056214300100b00443bb877f9amr7134623qvb.13.1650729430518; Sat, 23 Apr 2022 08:57:10 -0700 (PDT) Received: from localhost (fwdproxy-ash-022.fbsv.net. [2a03:2880:20ff:16::face:b00c]) by smtp.gmail.com with ESMTPSA id z15-20020a05622a060f00b002e2070bf899sm3048888qta.90.2022.04.23.08.57.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 08:57:10 -0700 (PDT) From: David Vernet To: akpm@linux-foundation.org Cc: tj@kernel.org, roman.gushchin@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, hannes@cmpxchg.org, mhocko@kernel.org, shakeelb@google.com, kernel-team@fb.com, void@manifault.com Subject: [PATCH v2 2/5] cgroup: Account for memory_recursiveprot in test_memcg_low() Date: Sat, 23 Apr 2022 08:56:19 -0700 Message-Id: <20220423155619.3669555-3-void@manifault.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220423155619.3669555-1-void@manifault.com> References: <20220423155619.3669555-1-void@manifault.com> MIME-Version: 1.0 X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 7B3BF80040 X-Stat-Signature: kskzded33t84xyuta9auh6w33uez39ot X-Rspam-User: Authentication-Results: imf02.hostedemail.com; dkim=none; spf=pass (imf02.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.219.54 as permitted sender) smtp.mailfrom=dcvernet@gmail.com; dmarc=none X-HE-Tag: 1650729429-819314 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000021, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The test_memcg_low() testcase in test_memcontrol.c verifies the expected behavior of groups using the memory.low knob. Part of the testcase verifies that a group with memory.low that experiences reclaim due to memory pressure elsewhere in the system, observes memory.events.low events as a result of that reclaim. In commit 8a931f801340 ("mm: memcontrol: recursive memory.low protection"), the memory controller was updated to propagate memory.low and memory.min protection from a parent group to its children via a configurable memory_recursiveprot mount option. This unfortunately broke the memcg tests, which asserts that a sibling that experienced reclaim but had a memory.low value of 0, would not observe any memory.low events. This patch updates test_memcg_low() to account for the new behavior introduced by memory_recursiveprot. So as to make the test resilient to multiple configurations, the patch also adds a new proc_mount_contains() helper that checks for a string in /proc/mounts, and is used to toggle behavior based on whether the default memory_recursiveprot was present. Signed-off-by: David Vernet Acked-by: Roman Gushchin Reported-by: Richard Palethorpe Signed-off-by: Michal Koutný --- tools/testing/selftests/cgroup/cgroup_util.c | 12 ++++++++++++ tools/testing/selftests/cgroup/cgroup_util.h | 1 + tools/testing/selftests/cgroup/test_memcontrol.c | 16 +++++++++++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/cgroup/cgroup_util.c b/tools/testing/selftests/cgroup/cgroup_util.c index dbaa7aabbb4a..e5d8d727bdcf 100644 --- a/tools/testing/selftests/cgroup/cgroup_util.c +++ b/tools/testing/selftests/cgroup/cgroup_util.c @@ -535,6 +535,18 @@ int set_oom_adj_score(int pid, int score) return 0; } +int proc_mount_contains(const char *option) +{ + char buf[4 * PAGE_SIZE]; + ssize_t read; + + read = read_text("/proc/mounts", buf, sizeof(buf)); + if (read < 0) + return read; + + return strstr(buf, option) != NULL; +} + ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size) { char path[PATH_MAX]; diff --git a/tools/testing/selftests/cgroup/cgroup_util.h b/tools/testing/selftests/cgroup/cgroup_util.h index 628738532ac9..756f76052b44 100644 --- a/tools/testing/selftests/cgroup/cgroup_util.h +++ b/tools/testing/selftests/cgroup/cgroup_util.h @@ -48,6 +48,7 @@ extern int is_swap_enabled(void); extern int set_oom_adj_score(int pid, int score); extern int cg_wait_for_proc_count(const char *cgroup, int count); extern int cg_killall(const char *cgroup); +int proc_mount_contains(const char *option); extern ssize_t proc_read_text(int pid, bool thread, const char *item, char *buf, size_t size); extern int proc_read_strstr(int pid, bool thread, const char *item, const char *needle); extern pid_t clone_into_cgroup(int cgroup_fd); diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c index 284d912e7d3e..d37e8dfb1248 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -21,6 +21,8 @@ #include "../kselftest.h" #include "cgroup_util.h" +static bool has_recursiveprot; + /* * This test creates two nested cgroups with and without enabling * the memory controller. @@ -521,15 +523,18 @@ static int test_memcg_low(const char *root) } for (i = 0; i < ARRAY_SIZE(children); i++) { + int no_low_events_index = has_recursiveprot ? 2 : 1; + oom = cg_read_key_long(children[i], "memory.events", "oom "); low = cg_read_key_long(children[i], "memory.events", "low "); if (oom) goto cleanup; - if (i < 2 && low <= 0) + if (i <= no_low_events_index && low <= 0) goto cleanup; - if (i >= 2 && low) + if (i > no_low_events_index && low) goto cleanup; + } ret = KSFT_PASS; @@ -1272,7 +1277,7 @@ struct memcg_test { int main(int argc, char **argv) { char root[PATH_MAX]; - int i, ret = EXIT_SUCCESS; + int i, proc_status, ret = EXIT_SUCCESS; if (cg_find_unified_root(root, sizeof(root))) ksft_exit_skip("cgroup v2 isn't mounted\n"); @@ -1288,6 +1293,11 @@ int main(int argc, char **argv) if (cg_write(root, "cgroup.subtree_control", "+memory")) ksft_exit_skip("Failed to set memory controller\n"); + proc_status = proc_mount_contains("memory_recursiveprot"); + if (proc_status < 0) + ksft_exit_skip("Failed to query cgroup mount option\n"); + has_recursiveprot = proc_status; + for (i = 0; i < ARRAY_SIZE(tests); i++) { switch (tests[i].fn(root)) { case KSFT_PASS: From patchwork Sat Apr 23 15:56:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Vernet X-Patchwork-Id: 12824633 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 AED9DC4332F for ; Sat, 23 Apr 2022 15:57:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4704B6B007B; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3D1FB6B007D; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1FC096B007E; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.25]) by kanga.kvack.org (Postfix) with ESMTP id 113976B007B for ; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id B9366190B for ; Sat, 23 Apr 2022 15:57:12 +0000 (UTC) X-FDA: 79388597904.20.158C38F Received: from mail-qt1-f173.google.com (mail-qt1-f173.google.com [209.85.160.173]) by imf16.hostedemail.com (Postfix) with ESMTP id 1B24D18003D for ; Sat, 23 Apr 2022 15:57:09 +0000 (UTC) Received: by mail-qt1-f173.google.com with SMTP id d14so7602565qtw.5 for ; Sat, 23 Apr 2022 08:57:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3Tpzhq0+TI5H5bdvK5Vbm+VLYv/+B/98xqWutaPHg68=; b=R/ehp81/YcYWX39bL3RrSH7FPgMwJ0eaIucNZOB3VdNvPRDNUVSaNOEAKXFhICZGYn 9Awd+SRz3XN3Qx+Gcb9XQVmcs2hajTpXDkk+Q/u61GRieSHN0AETarttaU5xIf/zARFw M7M/xKRs+c+doFHzk1E5Gj7QtH54kYtKeblxhdOHiHAa+0fRy4mpCsfuTCRPc/dIFWEW BKlaYQdICryWxZDTnuYx/Nldrtb4uhQUbQ/HSc284NrGuiJafOpklOrSgRLyfnGMx3mo XNjfuyvN9uwrUIm50Cyz9v7wI7x4o+YSRuN0HPEPJV9XJ+v2PfFQrxIACNtknZRVGLlQ ldug== X-Gm-Message-State: AOAM531sDjCoaTZsBwuRCYxR4c1srubFi+H5GZr7PJFp6nGQ8GJS8kBr eDOs+/or8Wx64Vl4PO/2ogE= X-Google-Smtp-Source: ABdhPJy3crThvLR/oO0Mz5YJCL0+y4Sy/Jx7i2E9UGDNE2Y8oLiSfFfMWXH4+Nf8j3wVjv8GhAHcBA== X-Received: by 2002:ac8:7a8a:0:b0:2f1:de6a:c044 with SMTP id x10-20020ac87a8a000000b002f1de6ac044mr6873334qtr.243.1650729431500; Sat, 23 Apr 2022 08:57:11 -0700 (PDT) Received: from localhost (fwdproxy-ash-006.fbsv.net. [2a03:2880:20ff:6::face:b00c]) by smtp.gmail.com with ESMTPSA id w15-20020ac857cf000000b002f33f220c76sm2959583qta.32.2022.04.23.08.57.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 08:57:11 -0700 (PDT) From: David Vernet To: akpm@linux-foundation.org Cc: tj@kernel.org, roman.gushchin@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, hannes@cmpxchg.org, mhocko@kernel.org, shakeelb@google.com, kernel-team@fb.com, void@manifault.com Subject: [PATCH v2 3/5] cgroup: Account for memory_localevents in test_memcg_oom_group_leaf_events() Date: Sat, 23 Apr 2022 08:56:20 -0700 Message-Id: <20220423155619.3669555-4-void@manifault.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220423155619.3669555-1-void@manifault.com> References: <20220423155619.3669555-1-void@manifault.com> MIME-Version: 1.0 X-Stat-Signature: tmr3whxypmuftinjtg6sqpxoqudinbdy Authentication-Results: imf16.hostedemail.com; dkim=none; spf=pass (imf16.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.160.173 as permitted sender) smtp.mailfrom=dcvernet@gmail.com; dmarc=none X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 1B24D18003D X-HE-Tag: 1650729429-645276 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000004, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The test_memcg_oom_group_leaf_events() testcase in the cgroup memcg tests validates that processes in a group that perform allocations exceeding memory.oom.group are killed. It also validates that the memory.events.oom_kill events are properly propagated in this case. Commit 06e11c907ea4 ("kselftests: memcg: update the oom group leaf events test") fixed test_memcg_oom_group_leaf_events() to account for the fact that the memory.events.oom_kill events in a child cgroup is propagated up to its parent. This behavior can actually be configured by the memory_localevents mount option, so this patch updates the testcase to properly account for the possible presence of this mount option. Signed-off-by: David Vernet Acked-by: Roman Gushchin --- .../selftests/cgroup/test_memcontrol.c | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c index d37e8dfb1248..e899b3f28c22 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -21,6 +21,7 @@ #include "../kselftest.h" #include "cgroup_util.h" +static bool has_localevents; static bool has_recursiveprot; /* @@ -1091,6 +1092,7 @@ static int test_memcg_oom_group_leaf_events(const char *root) { int ret = KSFT_FAIL; char *parent, *child; + long parent_oom_events; parent = cg_name(root, "memcg_test_0"); child = cg_name(root, "memcg_test_0/memcg_test_1"); @@ -1128,10 +1130,16 @@ static int test_memcg_oom_group_leaf_events(const char *root) if (cg_read_key_long(child, "memory.events", "oom_kill ") <= 0) goto cleanup; - if (cg_read_key_long(parent, "memory.events", "oom_kill ") <= 0) - goto cleanup; - - ret = KSFT_PASS; + parent_oom_events = cg_read_key_long( + parent, "memory.events", "oom_kill "); + /* + * If memory_localevents is not enabled (the default), the parent should + * count OOM events in its children groups. Otherwise, it should not + * have observed any events. + */ + if ((has_localevents && parent_oom_events == 0) || + parent_oom_events > 0) + ret = KSFT_PASS; cleanup: if (child) @@ -1298,6 +1306,11 @@ int main(int argc, char **argv) ksft_exit_skip("Failed to query cgroup mount option\n"); has_recursiveprot = proc_status; + proc_status = proc_mount_contains("memory_localevents"); + if (proc_status < 0) + ksft_exit_skip("Failed to query cgroup mount option\n"); + has_localevents = proc_status; + for (i = 0; i < ARRAY_SIZE(tests); i++) { switch (tests[i].fn(root)) { case KSFT_PASS: From patchwork Sat Apr 23 15:56:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Vernet X-Patchwork-Id: 12824634 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 11D08C433F5 for ; Sat, 23 Apr 2022 15:57:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E59CF6B007D; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D464F6B007E; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B4DA26B0080; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.25]) by kanga.kvack.org (Postfix) with ESMTP id A3EA66B007D for ; Sat, 23 Apr 2022 11:57:13 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay11.hostedemail.com (Postfix) with ESMTP id 88458814F2 for ; Sat, 23 Apr 2022 15:57:13 +0000 (UTC) X-FDA: 79388597946.15.BCEE418 Received: from mail-qt1-f181.google.com (mail-qt1-f181.google.com [209.85.160.181]) by imf21.hostedemail.com (Postfix) with ESMTP id 128E81C0038 for ; Sat, 23 Apr 2022 15:57:10 +0000 (UTC) Received: by mail-qt1-f181.google.com with SMTP id fu34so7591214qtb.8 for ; Sat, 23 Apr 2022 08:57:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=feBO+KbcIht+BPtu2AkAQpokc7FT3Bt17XhQc38rY6I=; b=W+t7VRlRlXvHMlCP7dfDnhg/ujerNVDL+ORxGyXykomwdmYDs8bQwc5rFZ9CA90sVF XI2d/9EgGEyl4+TkjeOYclDnHL597/n7Lh10QpKY7zImUqAWqN1jsy1tvQ6qnUT7xFf/ w6zExOJAZDGwCw7FCwffNfiDt8qNGe4vJvhSZB7OPTu1S2Ez3IjLp47jFyYQ/JpJyQwh vPJhW0WC6UFnLaDq6JN+Sj4M4d8EdQdH2oOYT3wXCy74HE7lItq/ab2Et5d1gDZCTT8j N+c8KBKym8/GeaYjxNl7UDDBGWlKNSDvV74R0J/eCsdisEPaCGSDxvxWnFNm+Xgyuxz9 70PQ== X-Gm-Message-State: AOAM531LYfaumu2xdQ63N/jVZ73UOfZmDY5sOkRv8GUnj4zeEf+TgxFh 9edfPc0EsdrAI/c7AaKbcGU= X-Google-Smtp-Source: ABdhPJxIXud5TfSFIhMm/UhJy9PJtx0SRoz2tqQh0wV2kl2SWYF7ZeJPEXsR6zpNHVRdizGPzQIUjw== X-Received: by 2002:ac8:5956:0:b0:2f2:521:7195 with SMTP id 22-20020ac85956000000b002f205217195mr6834676qtz.409.1650729432349; Sat, 23 Apr 2022 08:57:12 -0700 (PDT) Received: from localhost (fwdproxy-ash-014.fbsv.net. [2a03:2880:20ff:e::face:b00c]) by smtp.gmail.com with ESMTPSA id i68-20020a375447000000b006809e0adfffsm2529753qkb.25.2022.04.23.08.57.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 08:57:12 -0700 (PDT) From: David Vernet To: akpm@linux-foundation.org Cc: tj@kernel.org, roman.gushchin@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, hannes@cmpxchg.org, mhocko@kernel.org, shakeelb@google.com, kernel-team@fb.com, void@manifault.com Subject: [PATCH v2 4/5] cgroup: Removing racy check in test_memcg_sock() Date: Sat, 23 Apr 2022 08:56:21 -0700 Message-Id: <20220423155619.3669555-5-void@manifault.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220423155619.3669555-1-void@manifault.com> References: <20220423155619.3669555-1-void@manifault.com> MIME-Version: 1.0 X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 128E81C0038 X-Stat-Signature: ea36g4hcketgxs6jigtz1uxgsenzir4h X-Rspam-User: Authentication-Results: imf21.hostedemail.com; dkim=none; spf=pass (imf21.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.160.181 as permitted sender) smtp.mailfrom=dcvernet@gmail.com; dmarc=none X-HE-Tag: 1650729430-886628 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: test_memcg_sock() in the cgroup memcg tests, verifies expected memory accounting for sockets. The test forks a process which functions as a TCP server, and sends large buffers back and forth between itself (as the TCP client) and the forked TCP server. While doing so, it verifies that memory.current and memory.stat.sock look correct. There is currently a check in tcp_client() which asserts memory.current >= memory.stat.sock. This check is racy, as between memory.current and memory.stat.sock being queried, a packet could come in which causes mem_cgroup_charge_skmem() to be invoked. This could cause memory.stat.sock to exceed memory.current. Reversing the order of querying doesn't address the problem either, as memory may be reclaimed between the two calls. Instead, this patch just removes that assertion altogether, and instead relies on the values_close() check that follows to validate the expected accounting. Signed-off-by: David Vernet Acked-by: Roman Gushchin --- tools/testing/selftests/cgroup/test_memcontrol.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c index e899b3f28c22..38d2054eefe6 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -993,9 +993,6 @@ static int tcp_client(const char *cgroup, unsigned short port) if (current < 0 || sock < 0) goto close_sk; - if (current < sock) - goto close_sk; - if (values_close(current, sock, 10)) { ret = KSFT_PASS; break; From patchwork Sat Apr 23 15:56:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Vernet X-Patchwork-Id: 12824635 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 92691C433FE for ; Sat, 23 Apr 2022 15:57:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1611F6B007E; Sat, 23 Apr 2022 11:57:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0EBF96B0080; Sat, 23 Apr 2022 11:57:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E56F36B0081; Sat, 23 Apr 2022 11:57:14 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.26]) by kanga.kvack.org (Postfix) with ESMTP id CDA376B007E for ; Sat, 23 Apr 2022 11:57:14 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id A768025F12 for ; Sat, 23 Apr 2022 15:57:14 +0000 (UTC) X-FDA: 79388597988.08.40DA91E Received: from mail-qk1-f175.google.com (mail-qk1-f175.google.com [209.85.222.175]) by imf01.hostedemail.com (Postfix) with ESMTP id 8327340027 for ; Sat, 23 Apr 2022 15:57:11 +0000 (UTC) Received: by mail-qk1-f175.google.com with SMTP id d198so7942793qkc.12 for ; Sat, 23 Apr 2022 08:57:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gmXNl4tIfL5wRbTrjuvKfaCU9MK0lOXp83omTUSrSMo=; b=fsaaMUb8A5hnFKEgEUctPdX6YQjQfSprkIIoTZf29IKrvxI2dfMubOgusUrJ3GvxHh P0KJkNuUy4GNcOKJjsrVcQooT95yYZfe7Ufa+taeacuCErWCH+1htQmlJnvNaDluBMAI a2m2uwoXD1qN6sWezsuK0h6/iUhMMfc4miFdH/MGcyKjmndBxf/6W+Wu9Oa4sAKXQRa2 SJ+YTG8EM1YwkVlW98mWBzPd/xECWJEJ54SB5sz4j8PD7jGxbCJYR/VqTiY9cjMKAFA1 iw4Xe507OlT/I4xnmTUxfaad51JRhGhkWvWJA9SswJCnYGAHXIhhCYtZkM4YxZ7wwRH6 ibzw== X-Gm-Message-State: AOAM530JEs0TCa1gJKiC6+4YVzHcUTkmKhGygG0984tJQIPBlsuZNNgF L7j/Pd369p1KvwbfaNhmN1o= X-Google-Smtp-Source: ABdhPJxrka55ASWkCj+31Zq8g/DCOT2vSRE9a3/Q38M+L6ijF+65YD0/feALRFzYTD/HSx0KMyH5Rg== X-Received: by 2002:a05:620a:2588:b0:680:f657:fbd6 with SMTP id x8-20020a05620a258800b00680f657fbd6mr5649398qko.287.1650729433397; Sat, 23 Apr 2022 08:57:13 -0700 (PDT) Received: from localhost (fwdproxy-ash-119.fbsv.net. [2a03:2880:20ff:77::face:b00c]) by smtp.gmail.com with ESMTPSA id w4-20020a05620a0e8400b0067b1bcd081csm2321762qkm.66.2022.04.23.08.57.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Apr 2022 08:57:13 -0700 (PDT) From: David Vernet To: akpm@linux-foundation.org Cc: tj@kernel.org, roman.gushchin@linux.dev, linux-kernel@vger.kernel.org, linux-mm@kvack.org, cgroups@vger.kernel.org, hannes@cmpxchg.org, mhocko@kernel.org, shakeelb@google.com, kernel-team@fb.com, void@manifault.com Subject: [PATCH v2 5/5] cgroup: Fix racy check in alloc_pagecache_max_30M() helper function Date: Sat, 23 Apr 2022 08:56:22 -0700 Message-Id: <20220423155619.3669555-6-void@manifault.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220423155619.3669555-1-void@manifault.com> References: <20220423155619.3669555-1-void@manifault.com> MIME-Version: 1.0 Authentication-Results: imf01.hostedemail.com; dkim=none; spf=pass (imf01.hostedemail.com: domain of dcvernet@gmail.com designates 209.85.222.175 as permitted sender) smtp.mailfrom=dcvernet@gmail.com; dmarc=none X-Rspam-User: X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 8327340027 X-Stat-Signature: srnnp4k3uw9fic1xb9s9c93muwoux6fm X-HE-Tag: 1650729431-953044 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: alloc_pagecache_max_30M() in the cgroup memcg tests performs a 50MB pagecache allocation, which it expects to be capped at 30MB due to the calling process having a memory.high setting of 30MB. After the allocation, the function contains a check that verifies that MB(29) < memory.current <= MB(30). This check can actually fail non-deterministically. The testcases that use this function are test_memcg_high() and test_memcg_max(), which set memory.min and memory.max to 30MB respectively for the cgroup under test. The allocation can slightly exceed this number in both cases, and for memory.max, the process performing the allocation will not have the OOM killer invoked as it's performing a pagecache allocation. This patchset therefore updates the above check to instead use the verify_close() helper function. Signed-off-by: David Vernet Acked-by: Roman Gushchin --- tools/testing/selftests/cgroup/test_memcontrol.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/cgroup/test_memcontrol.c b/tools/testing/selftests/cgroup/test_memcontrol.c index 38d2054eefe6..3bac06999354 100644 --- a/tools/testing/selftests/cgroup/test_memcontrol.c +++ b/tools/testing/selftests/cgroup/test_memcontrol.c @@ -564,9 +564,14 @@ static int alloc_pagecache_max_30M(const char *cgroup, void *arg) { size_t size = MB(50); int ret = -1; - long current; + long current, high, max; int fd; + high = cg_read_long(cgroup, "memory.high"); + max = cg_read_long(cgroup, "memory.max"); + if (high != MB(30) && max != MB(30)) + goto cleanup; + fd = get_temp_fd(); if (fd < 0) return -1; @@ -575,7 +580,7 @@ static int alloc_pagecache_max_30M(const char *cgroup, void *arg) goto cleanup; current = cg_read_long(cgroup, "memory.current"); - if (current <= MB(29) || current > MB(30)) + if (!values_close(current, MB(30), 5)) goto cleanup; ret = 0;