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 3ECC9E776DE for ; Tue, 3 Oct 2023 00:18:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A617F8D0052; Mon, 2 Oct 2023 20:18:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9E03B8D0003; Mon, 2 Oct 2023 20:18:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 796798D0052; Mon, 2 Oct 2023 20:18:36 -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 5C6F38D0003 for ; Mon, 2 Oct 2023 20:18:36 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 38C05B372D for ; Tue, 3 Oct 2023 00:18:36 +0000 (UTC) X-FDA: 81302239032.09.23F0298 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) by imf11.hostedemail.com (Postfix) with ESMTP id 63FE94000E for ; Tue, 3 Oct 2023 00:18:34 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=TqZsISiW; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.210.174 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=1696292314; 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:in-reply-to:references:references:dkim-signature; bh=vY+Soyh4ezPzEsiTwAjxm3PLfRjJVUJ94CEs1TUSu9g=; b=pP3/3aw8RjMrwRwnrG7WrlUGzEgQ9tLNRuubFyplQwXKQBouaiRwikCWmbjSi1/m5PPyjo M/jqEdZhokWN0b0I1T0h7MuZ4TivPdRb6S77PTd8vNo3ptf55tK6GbQm6qGyVEr9VkLdzl TXnN5KPFMMF7jBRyOgDACMZNL8fjYC0= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=TqZsISiW; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.210.174 as permitted sender) smtp.mailfrom=nphamcs@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696292314; a=rsa-sha256; cv=none; b=gKeXeRDQp4mySF/6GAxjU8KTuho9SfvHd2I+qKWC64O/IiQ//2t3C/NqrQyyHphBRsIqiY C2ldvFNzS1nkp7hGkQpmgkIZm5pZFQosqBNsez9IElC/QY0V3P8NhJfuTjPaUOOhJEYQ0o DzF1c38NGqauzYgqPJBswnryJEZeJkM= Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-690f7bf73ddso254043b3a.2 for ; Mon, 02 Oct 2023 17:18:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696292313; x=1696897113; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vY+Soyh4ezPzEsiTwAjxm3PLfRjJVUJ94CEs1TUSu9g=; b=TqZsISiW0tEGy9MufOM9n7btxjtkXUjbJ8KzWPjf6/C0ygFY+CkfdY3CsG3Te9yDKt YRIiYh7YS0rjGwr6LvNEJEiWIyS7wPjwU4atzrRQysZfJH9sxo4Q2xRevZi6VzkOLbEZ i3SNu5J7RuDAO2alRDJdiixSuW/C/C2f0jfrG67c0eo/QHW30Ei5PRgMDowkNOgG0S+W NjnqSNuJ+hNp03IAHK7Q9gljuo7TxEEcfKKxWFjQzCyB+VhPJpfr6bz63v+Utwb/Wgmk t2eW+DSfQMJuLOcZW6Qre8jnh6R85VRxzOW6hN6Db6tQkYf9t2E9X7grHJ1lypP7iZHn tD9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696292313; x=1696897113; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vY+Soyh4ezPzEsiTwAjxm3PLfRjJVUJ94CEs1TUSu9g=; b=no1O6A/tNezVYtMgRp5b1iBwqOi3CShqgFg8/VPLdqDn9XmjcEtujjh+6khkAoNqC3 ZN7C3TKx6KY4PHzNsGcyHn77Y2hcUaZ5x9/UsaERUIqhVbhCC5p9/sUQOCKdU49/FFpA Lbty3EEItHldCQEby2BtxnAzxddty3/V967X+yVk6WtoDYjqQ01eWMlKaQfY85p2s9ho 5vqe7gyIV6K80+PBqnYkeNVAxTqQlmrxuDFD1ywQcDe0b7tmoccATb22lbhMDZ+nuOao 7pSZTZ+rzGuYJ119+8xkfHDx9tBeoGNplKQz2QNDt0h7PAyqNvO5O4RQc7wq/JphCsKi dosA== X-Gm-Message-State: AOJu0Yw7yYbgps+s2DjxCfr0T0RWnyujy/CrRnJuNKsfwEh+G7rAbnDj WwBqhHmDKCtyqDPL7SN7zBM= X-Google-Smtp-Source: AGHT+IEmhPXWxliXuOtMzjnYVzhxuPmmze2DXVfJcRKH51ghReKXZNZYRTeU37cNrXhyi0RIQd0ChA== X-Received: by 2002:a05:6a20:258d:b0:161:27c5:9c41 with SMTP id k13-20020a056a20258d00b0016127c59c41mr12322478pzd.28.1696292313120; Mon, 02 Oct 2023 17:18:33 -0700 (PDT) Received: from localhost (fwdproxy-prn-010.fbsv.net. [2a03:2880:ff:a::face:b00c]) by smtp.gmail.com with ESMTPSA id c1-20020aa78801000000b0068fda1db80bsm84015pfo.75.2023.10.02.17.18.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Oct 2023 17:18:32 -0700 (PDT) From: Nhat Pham To: akpm@linux-foundation.org Cc: riel@surriel.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeelb@google.com, muchun.song@linux.dev, tj@kernel.org, lizefan.x@bytedance.com, shuah@kernel.org, mike.kravetz@oracle.com, yosryahmed@google.com, fvdl@google.com, linux-mm@kvack.org, kernel-team@meta.com, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org Subject: [PATCH v3 3/3] selftests: add a selftest to verify hugetlb usage in memcg Date: Mon, 2 Oct 2023 17:18:28 -0700 Message-Id: <20231003001828.2554080-4-nphamcs@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231003001828.2554080-1-nphamcs@gmail.com> References: <20231003001828.2554080-1-nphamcs@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Stat-Signature: skppzcw53z6wpqzprxmn4knuj8kcroj9 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 63FE94000E X-HE-Tag: 1696292314-352973 X-HE-Meta: U2FsdGVkX189zN/IKaKGi6uov+ZJ9CytXKB9ennzDFIqHvmIpElf8A2THkiOaUfa0kZ58PkC6pi6SIVDR4FCvDFeNGoKH8ob12ah2OoGPTBpEZrUq/LY74kBQ5gjtYc67a3gKnMZEN1G+e5zi58PkYqEeNF6Pth1ChJTRX8Y7EUh9ajvimWJoiajIHbG9tGBlXVwcf/qJwbCvy9q2wee8ACl/F8d5FzSOHpkcUMRkTVpF57WXHrY0n3rmlS4Q0jdJldeq5WYJGh/+jTz3k4taZ2jLEAkmivU9iR9UxuvYPHy3sjEE0nKHIfSbjGEA6Qq99cBYht4885rDCR92NTKI0xiNsEoFuqAATynC83qqOqSlAVGU9KRMR1UazZo2VAstCHRJP/ZCa5Rg3HoqzYCmVDXIslD8zZglaHSxxj0EKxhGtMpSuPdq5QD7RGqpgOC6LqqL2j8WYhZBIBTcPteMGuDnFDdKvt+1bDCBlQaFcNs6lqgBJ1BNd8uHlthh8YdnKmQ7PMQ65Od6ORr2EOHkIi/qV0ZpfZRITpVx5NVqZFF8BLSrLOIMzyh/LPjkAYPlF5az2gm5QSKDSScLXWID1BUbJutLvaXozCkr9N+Y39Q9CImGM8WXFertQ0ZySJsBQ2DVrIgnOuSRewZED/8AIDqtOZSL3pcGn4DoEHofTfQ4j+5AbtWA8LU7RVJ0zM/idodD9o/uh6/PUSqGqqCX14luc/n7tDXmDLAOM+qH8+Mzpf82MHS8KU3uWvCo1H9vu4lmllf9MFtVlfZvM9+mJirCGzicyolRtaNXnfdmH3/70gNlc9x7RLtQ3L9UHbHDCnZ6f8YrNzaJrET9lPWwImUWpibP/diHVTBGXNo9XCjm/lDdkIG+kfpDWrFQi4PYWdyQFUB2t/lyu6H2syQOXBwm/YkLjCBJupHIRE+FMiZHQ2G97B8kv2p2E40bG0aFfVq3BFtw4tf8uhBm6Z 6ti9cBfs T/Zfk8pFnR7MloL9mt0ddU1LqfQ5l1s2Y1VRE5hoQYfYB/wSDDCotbWj8osdcxHsW7w2OqtuJ78cWxp45gNY/oAmGbgzHuLGxlvTYOaX9bY69trVdZckK3KOGS6/g7ApaBD3oMxXsaet662VeaSYFMLwRm4Yeq99utlKURbRMa5BzFY43XMscFsoOEuBnN2wIx4aF5KjEAF2/KWJibHDtJ7iNXAKM1IdVynvAlvrKWaabJj+ugfIUQN0srtSDQ9561IJT4snbDp7DPF1H/MSFerndtdkl/LckPpY0KN+f5x0gZ+Sv9n5W6RUsqYLDDqjOdvnCplp7btIe5MVPPyHV6bldoPa4XG7m7VSdijXYO/D4tXY3WASDddfFqfvc4qI+DgYlMRFUZTDSMLlr4IBhWjOPIzUTCmHag9FrGCerfdgpimvA7L93iHziM2mrjx/B9RtpWI3y2gbMZMyA3UxdaVnkjI7XssHqewORGwLxy/85+Tc= X-Bogosity: Ham, tests=bogofilter, spamicity=0.419965, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This patch add a new kselftest to demonstrate and verify the new hugetlb memcg accounting behavior. Signed-off-by: Nhat Pham --- MAINTAINERS | 2 + tools/testing/selftests/cgroup/.gitignore | 1 + tools/testing/selftests/cgroup/Makefile | 2 + .../selftests/cgroup/test_hugetlb_memcg.c | 234 ++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 tools/testing/selftests/cgroup/test_hugetlb_memcg.c diff --git a/MAINTAINERS b/MAINTAINERS index bf0f54c24f81..ce9f40bcc2ba 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -5269,6 +5269,7 @@ S: Maintained F: mm/memcontrol.c F: mm/swap_cgroup.c F: tools/testing/selftests/cgroup/memcg_protection.m +F: tools/testing/selftests/cgroup/test_hugetlb_memcg.c F: tools/testing/selftests/cgroup/test_kmem.c F: tools/testing/selftests/cgroup/test_memcontrol.c @@ -9652,6 +9653,7 @@ F: include/linux/hugetlb.h F: mm/hugetlb.c F: mm/hugetlb_vmemmap.c F: mm/hugetlb_vmemmap.h +F: tools/testing/selftests/cgroup/test_hugetlb_memcg.c HVA ST MEDIA DRIVER M: Jean-Christophe Trotin diff --git a/tools/testing/selftests/cgroup/.gitignore b/tools/testing/selftests/cgroup/.gitignore index af8c3f30b9c1..2732e0b29271 100644 --- a/tools/testing/selftests/cgroup/.gitignore +++ b/tools/testing/selftests/cgroup/.gitignore @@ -7,4 +7,5 @@ test_kill test_cpu test_cpuset test_zswap +test_hugetlb_memcg wait_inotify diff --git a/tools/testing/selftests/cgroup/Makefile b/tools/testing/selftests/cgroup/Makefile index c27f05f6ce9b..00b441928909 100644 --- a/tools/testing/selftests/cgroup/Makefile +++ b/tools/testing/selftests/cgroup/Makefile @@ -14,6 +14,7 @@ TEST_GEN_PROGS += test_kill TEST_GEN_PROGS += test_cpu TEST_GEN_PROGS += test_cpuset TEST_GEN_PROGS += test_zswap +TEST_GEN_PROGS += test_hugetlb_memcg LOCAL_HDRS += $(selfdir)/clone3/clone3_selftests.h $(selfdir)/pidfd/pidfd.h @@ -27,3 +28,4 @@ $(OUTPUT)/test_kill: cgroup_util.c $(OUTPUT)/test_cpu: cgroup_util.c $(OUTPUT)/test_cpuset: cgroup_util.c $(OUTPUT)/test_zswap: cgroup_util.c +$(OUTPUT)/test_hugetlb_memcg: cgroup_util.c diff --git a/tools/testing/selftests/cgroup/test_hugetlb_memcg.c b/tools/testing/selftests/cgroup/test_hugetlb_memcg.c new file mode 100644 index 000000000000..f0fefeb4cc24 --- /dev/null +++ b/tools/testing/selftests/cgroup/test_hugetlb_memcg.c @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include "../kselftest.h" +#include "cgroup_util.h" + +#define ADDR ((void *)(0x0UL)) +#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) +/* mapping 8 MBs == 4 hugepages */ +#define LENGTH (8UL*1024*1024) +#define PROTECTION (PROT_READ | PROT_WRITE) + +/* borrowed from mm/hmm-tests.c */ +static long get_hugepage_size(void) +{ + int fd; + char buf[2048]; + int len; + char *p, *q, *path = "/proc/meminfo", *tag = "Hugepagesize:"; + long val; + + fd = open(path, O_RDONLY); + if (fd < 0) { + /* Error opening the file */ + return -1; + } + + len = read(fd, buf, sizeof(buf)); + close(fd); + if (len < 0) { + /* Error in reading the file */ + return -1; + } + if (len == sizeof(buf)) { + /* Error file is too large */ + return -1; + } + buf[len] = '\0'; + + /* Search for a tag if provided */ + if (tag) { + p = strstr(buf, tag); + if (!p) + return -1; /* looks like the line we want isn't there */ + p += strlen(tag); + } else + p = buf; + + val = strtol(p, &q, 0); + if (*q != ' ') { + /* Error parsing the file */ + return -1; + } + + return val; +} + +static int set_file(const char *path, long value) +{ + FILE *file; + int ret; + + file = fopen(path, "w"); + if (!file) + return -1; + ret = fprintf(file, "%ld\n", value); + fclose(file); + return ret; +} + +static int set_nr_hugepages(long value) +{ + return set_file("/proc/sys/vm/nr_hugepages", value); +} + +static unsigned int check_first(char *addr) +{ + return *(unsigned int *)addr; +} + +static void write_data(char *addr) +{ + unsigned long i; + + for (i = 0; i < LENGTH; i++) + *(addr + i) = (char)i; +} + +static int hugetlb_test_program(const char *cgroup, void *arg) +{ + char *test_group = (char *)arg; + void *addr; + long old_current, expected_current, current; + int ret = EXIT_FAILURE; + + old_current = cg_read_long(test_group, "memory.current"); + set_nr_hugepages(20); + current = cg_read_long(test_group, "memory.current"); + if (current - old_current >= MB(2)) { + ksft_print_msg( + "setting nr_hugepages should not increase hugepage usage.\n"); + ksft_print_msg("before: %ld, after: %ld\n", old_current, current); + return EXIT_FAILURE; + } + + addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); + if (addr == MAP_FAILED) { + ksft_print_msg("fail to mmap.\n"); + return EXIT_FAILURE; + } + current = cg_read_long(test_group, "memory.current"); + if (current - old_current >= MB(2)) { + ksft_print_msg("mmap should not increase hugepage usage.\n"); + ksft_print_msg("before: %ld, after: %ld\n", old_current, current); + goto out_failed_munmap; + } + old_current = current; + + /* read the first page */ + check_first(addr); + expected_current = old_current + MB(2); + current = cg_read_long(test_group, "memory.current"); + if (!values_close(expected_current, current, 5)) { + ksft_print_msg("memory usage should increase by around 2MB.\n"); + ksft_print_msg( + "expected memory: %ld, actual memory: %ld\n", + expected_current, current); + goto out_failed_munmap; + } + + /* write to the whole range */ + write_data(addr); + current = cg_read_long(test_group, "memory.current"); + expected_current = old_current + MB(8); + if (!values_close(expected_current, current, 5)) { + ksft_print_msg("memory usage should increase by around 8MB.\n"); + ksft_print_msg( + "expected memory: %ld, actual memory: %ld\n", + expected_current, current); + goto out_failed_munmap; + } + + /* unmap the whole range */ + munmap(addr, LENGTH); + current = cg_read_long(test_group, "memory.current"); + expected_current = old_current; + if (!values_close(expected_current, current, 5)) { + ksft_print_msg("memory usage should go back down.\n"); + ksft_print_msg( + "expected memory: %ld, actual memory: %ld\n", + expected_current, current); + return ret; + } + + ret = EXIT_SUCCESS; + return ret; + +out_failed_munmap: + munmap(addr, LENGTH); + return ret; +} + +static int test_hugetlb_memcg(char *root) +{ + int ret = KSFT_FAIL; + char *test_group; + + test_group = cg_name(root, "hugetlb_memcg_test"); + if (!test_group || cg_create(test_group)) { + ksft_print_msg("fail to create cgroup.\n"); + goto out; + } + + if (cg_write(test_group, "memory.max", "100M")) { + ksft_print_msg("fail to set cgroup memory limit.\n"); + goto out; + } + + /* disable swap */ + if (cg_write(test_group, "memory.swap.max", "0")) { + ksft_print_msg("fail to disable swap.\n"); + goto out; + } + + if (!cg_run(test_group, hugetlb_test_program, (void *)test_group)) + ret = KSFT_PASS; +out: + cg_destroy(test_group); + free(test_group); + return ret; +} + +int main(int argc, char **argv) +{ + char root[PATH_MAX]; + int ret = EXIT_SUCCESS, has_memory_hugetlb_acc; + + has_memory_hugetlb_acc = proc_mount_contains("memory_hugetlb_accounting"); + if (has_memory_hugetlb_acc < 0) + ksft_exit_skip("Failed to query cgroup mount option\n"); + else if (!has_memory_hugetlb_acc) + ksft_exit_skip("memory hugetlb accounting is disabled\n"); + + /* Unit is kB! */ + if (get_hugepage_size() != 2048) { + ksft_print_msg("test_hugetlb_memcg requires 2MB hugepages\n"); + ksft_test_result_skip("test_hugetlb_memcg\n"); + return ret; + } + + if (cg_find_unified_root(root, sizeof(root))) + ksft_exit_skip("cgroup v2 isn't mounted\n"); + + switch (test_hugetlb_memcg(root)) { + case KSFT_PASS: + ksft_test_result_pass("test_hugetlb_memcg\n"); + break; + case KSFT_SKIP: + ksft_test_result_skip("test_hugetlb_memcg\n"); + break; + default: + ret = EXIT_FAILURE; + ksft_test_result_fail("test_hugetlb_memcg\n"); + break; + } + + return ret; +} -- 2.34.1