From patchwork Thu Dec 8 20:28:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nhat Pham X-Patchwork-Id: 13068847 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 17312C4332F for ; Thu, 8 Dec 2022 20:28:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9F5D58E0008; Thu, 8 Dec 2022 15:28:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 9A36A8E0009; Thu, 8 Dec 2022 15:28:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 82C368E0001; Thu, 8 Dec 2022 15:28:17 -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 743CC8E0001 for ; Thu, 8 Dec 2022 15:28:17 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 4C54280C73 for ; Thu, 8 Dec 2022 20:28:17 +0000 (UTC) X-FDA: 80220276234.15.76A9F07 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) by imf24.hostedemail.com (Postfix) with ESMTP id 9F82118000F for ; Thu, 8 Dec 2022 20:28:15 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=N3M8dzC7; spf=pass (imf24.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.215.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1670531295; 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=gHlLt6aWAsdCI5Y5mp+WVK1u7mkTRlfHIjBLtpnt7a4=; b=4l2LBIOD8zkXEs1J/0MTICaRUjmg0P0st0L+rUOwGt4rWKx3tixk7LCYp+S5BZy1nJWf9j B6kVYFxW8UQ4xIGVfErZtQfua0/DKcBvrFv52l/S9++HDklg89X2WTSmEj7Kit/zonmEIm VdbV6reGIkISLJFz/Nn8CqPzteCP4so= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=N3M8dzC7; spf=pass (imf24.hostedemail.com: domain of nphamcs@gmail.com designates 209.85.215.175 as permitted sender) smtp.mailfrom=nphamcs@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1670531295; a=rsa-sha256; cv=none; b=sKzyJteGvpZdft0qUeDpXEUPEJXxOv519hpRLztqLYrDHe3163HoVHi6C+N/Zby5ORwizI m4A5/j8TZKjWpVMNwtLp7DZckDJKbar7yi0PXUonBLUpPiN80SNNqBroRQI3s66PpWcPhb 7KL2adZaheiLL7b9eIYjv0TGaReMe0M= Received: by mail-pg1-f175.google.com with SMTP id r18so2072938pgr.12 for ; Thu, 08 Dec 2022 12:28:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; 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=gHlLt6aWAsdCI5Y5mp+WVK1u7mkTRlfHIjBLtpnt7a4=; b=N3M8dzC7SB5Ru5QsrRLNYoBMAzhR8GmN/iwfvDMnqWpLxUQ5lP8RABY9JHwziygBBP FfebVYUGm7o42AdWO7a6gOy6/5S+3SVNTwZQYJv4pREi/ZajSGsx16mpLlaDQwPl8VtK 8Q0/Jo84C8fY43oYVQdBs8TlhKUZItSM5kPU/5htVdLs9zzKli92jymYGstdBKNAam/1 bLeG9o5iXIW1iIoIEHYw1fJ4a312pEXcoDtZ0Mc/LrAl6cG1vdQWD79ateZ1I00fpmuS mPbCEQ2LbkFZIN/7mNC7C1MZKZVduua5Bf1XH/0aY7QSS5TjAqUwFw+wc+YWwkjDU1rz Di4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=gHlLt6aWAsdCI5Y5mp+WVK1u7mkTRlfHIjBLtpnt7a4=; b=INufSvfxwJvuMuHVgAzPqFx2OdUOCsCvnlhdEgWHhS2A9K3OCAK6BD5OtJpcATP67x WVC3vR6MolIsz7lVW3u5jrUWEWSHh80iLtrAfW1lJp/gUbfTO4r5w3yRaUoznx4ZF2Jz Jcja9lF4l3SPCwqLjtSjLTAF3OOQd/dcaahG9Sue0j6hUFSep+K7HRXVAoLyKJ5uxRr2 I9Abm2FrbB6NddBxWTDcpcSX4eEa2qa2dYgNNMm6rAitCoZQru8LdF+jcB7fGxddbjyk GJUtIJfV90U+choiaYBSrVeYO9urCsPcO/t/HBI8BYZ9x9DfkFiD4NFHNY0Ju0x349CT DE0g== X-Gm-Message-State: ANoB5pkpjvFogKpjPIDmlfFdY4O6SKVs3iDwtmCx3p9BW3HDjRMxP7fz Y8J7XIodj0WNJE4Mk9ZlPxQ= X-Google-Smtp-Source: AA0mqf7bB1fsNiUIfGt54Z28MHiEvcKog5d25ZWm3PH+b8dbVs0v+JXrmwc6bMqO4MSlV0D5vUHxMQ== X-Received: by 2002:a62:2702:0:b0:572:8766:598b with SMTP id n2-20020a622702000000b005728766598bmr77349901pfn.21.1670531294542; Thu, 08 Dec 2022 12:28:14 -0800 (PST) Received: from localhost (fwdproxy-prn-014.fbsv.net. [2a03:2880:ff:e::face:b00c]) by smtp.gmail.com with ESMTPSA id e8-20020a17090301c800b00189b2b8dbedsm15105213plh.228.2022.12.08.12.28.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Dec 2022 12:28:14 -0800 (PST) From: Nhat Pham To: akpm@linux-foundation.org Cc: hannes@cmpxchg.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, bfoster@redhat.com, willy@infradead.org, kernel-team@meta.com Subject: [PATCH v3 4/4] selftests: Add selftests for cachestat Date: Thu, 8 Dec 2022 12:28:08 -0800 Message-Id: <20221208202808.908690-5-nphamcs@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221208202808.908690-1-nphamcs@gmail.com> References: <20221208202808.908690-1-nphamcs@gmail.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 9F82118000F X-Stat-Signature: 74ijkzuz7ao9jie79fwzixd5ij8t7gub X-HE-Tag: 1670531295-631859 X-HE-Meta: U2FsdGVkX19yF3V9SOsfjG7H6jKpPvb2dsJCAJ0TW8LDRYrdRX1G90Tf8DuR72WQatljC0WcrzfcJSn+gtpD/zIrbuhtATm33WQXZGjRHZ2StuXhlVBLIFp3pdxsnxIMxiErEzxgpE24DNBFju88bdN1x9OhEawmUCtqKgNlKb2DK5XilbRsA8Y9ZnQb7QD+v+eL1n034WXeF6fxd1lS3Toh/WsZc5fZvMOWN+pge3Ruy6UxRUm5f10N64eeiUSKc/pjU5j+8Qmjlt4dHAXrPySzbN5ePQ21FFR3rFIw1u0woo1jALt9ESCW0IDWmlspzbgT7ZOAp2rAltz9yqXDSDXss+5zi7Rb5DyctbR3T2DOIRhWTR0l/20ngdbdug+NUroQY0lOC54ddloBGR7QAscbEydKilXlIRwVmuzAY9iXyPp+jIR/aRR3+DCsDqoKt47tLMxYj5OoiAZ1QebKJALApVBCvl/LleZ+Ei6vjgUTF/PMb7NXCc51CPzSgtCWRzXfucEGcGkwqRgJrsvVIiQjdY8LGsxh5gyM+ShqQbOQa/uKv37nusFrYjG2TXoSKBhbkpoFI1XoYmclagDlm71xG/rbW2NxuheZ3nEqZd1yosUfgKAYzJbZ82Wz0EaQ7M3K0s4gIL6oUlTHX69OzIanSGsaLp+R+9gSYfMgugOLEfNK5KzMP/oiEDeIpGaZZZc9FoPJ+EDcRDUJwhTc6bMkxPlsFKVJvtx6kMHGl6s8uGggq1Qv/z7rKnEQLSEWbyzFPy6mGqC8Y5BmMrbWxQKg++Je9oCRIwhxryQuenBV8VcUVvkJudpi5yW+j+OfPtFTf13/rvGGI0KlxHcIir1XyNXqOeEZ0dmCN3jq3lc5YVB2C7L+nH4lZIqhFfz6C8hwYJRdtG+ma6u4yao3s4GXhOK6X+qLmkLFhyDsYnj0fp0XFA5AKwLqnPifO3QH7X7sLD6P4mm2XNlgSPJ rCSzHqxt TRQ2vCNA+5IRj5WFxK2WP7epxFr+GdKj71XbeP8660QFQhhO8f1Gufb4MxfMlxL4Kyka5jYzr+6kZYK0AaEVZeTTEsnpbTziZGX2oePjVjpVNjLbaJ3BwSNLBST3in1BJNScc X-Bogosity: Ham, tests=bogofilter, spamicity=0.000011, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Test cachestat on a newly created file, /dev/ files, and /proc/ files. Signed-off-by: Nhat Pham --- MAINTAINERS | 1 + tools/testing/selftests/Makefile | 1 + tools/testing/selftests/cachestat/.gitignore | 2 + tools/testing/selftests/cachestat/Makefile | 7 + .../selftests/cachestat/test_cachestat.c | 186 ++++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 tools/testing/selftests/cachestat/.gitignore create mode 100644 tools/testing/selftests/cachestat/Makefile create mode 100644 tools/testing/selftests/cachestat/test_cachestat.c -- 2.30.2 diff --git a/MAINTAINERS b/MAINTAINERS index baa081a1fe52..1b8bc6151e86 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4558,6 +4558,7 @@ M: Johannes Weiner L: linux-mm@kvack.org S: Maintained F: mm/cachestat.c +F: tools/testing/selftests/cachestat/test_cachestat.c CADENCE MIPI-CSI2 BRIDGES M: Maxime Ripard diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index 0464b2c6c1e4..3cad0b38c5c2 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -4,6 +4,7 @@ TARGETS += amd-pstate TARGETS += arm64 TARGETS += bpf TARGETS += breakpoints +TARGETS += cachestat TARGETS += capabilities TARGETS += cgroup TARGETS += clone3 diff --git a/tools/testing/selftests/cachestat/.gitignore b/tools/testing/selftests/cachestat/.gitignore new file mode 100644 index 000000000000..d6c30b43a4bb --- /dev/null +++ b/tools/testing/selftests/cachestat/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +test_cachestat diff --git a/tools/testing/selftests/cachestat/Makefile b/tools/testing/selftests/cachestat/Makefile new file mode 100644 index 000000000000..04e84fd7d8ce --- /dev/null +++ b/tools/testing/selftests/cachestat/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 +TEST_GEN_PROGS := test_cachestat + +CFLAGS += $(KHDR_INCLUDES) +CFLAGS += -Wall + +include ../lib.mk diff --git a/tools/testing/selftests/cachestat/test_cachestat.c b/tools/testing/selftests/cachestat/test_cachestat.c new file mode 100644 index 000000000000..bb767147d08f --- /dev/null +++ b/tools/testing/selftests/cachestat/test_cachestat.c @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../kselftest.h" + +static const char * const dev_files[] = { + "/dev/zero", "/dev/null", "/dev/urandom", + "/proc/version", "/proc" +}; + +/* + * Open/create the file at filename, (optionally) write random data to it + * (exactly num_pages), then test the cachestat syscall on this file. + * + * If test_fsync == true, fsync the file, then check the number of dirty + * pages. + */ +bool test_cachestat(const char *filename, bool write_random, bool create, + bool test_fsync, int num_pages, int open_flags, mode_t open_mode) +{ + int cachestat_nr = 451; + size_t PS = sysconf(_SC_PAGESIZE); + int filesize = num_pages * PS; + bool ret = true; + int random_fd; + long syscall_ret; + struct cachestat cs; + + int fd = open(filename, open_flags, open_mode); + + if (fd == -1) { + ksft_print_msg("Unable to create/open file.\n"); + goto out; + } else { + ksft_print_msg("Create/open %s\n", filename); + } + + if (write_random) { + char data[filesize]; + + random_fd = open("/dev/urandom", O_RDONLY); + + if (random_fd < 0) { + ksft_print_msg("Unable to access urandom.\n"); + ret = false; + goto out1; + } else { + int remained = filesize; + char *cursor = data; + + while (remained) { + ssize_t read_len = read(random_fd, cursor, remained); + + if (read_len <= 0) { + ksft_print_msg("Unable to read from urandom.\n"); + ret = false; + goto out2; + } + + remained -= read_len; + cursor += read_len; + } + + /* write random data to fd */ + remained = filesize; + cursor = data; + while (remained) { + ssize_t write_len = write(fd, cursor, remained); + + if (write_len <= 0) { + ksft_print_msg("Unable write random data to file.\n"); + ret = false; + goto out2; + } + + remained -= write_len; + cursor += write_len; + } + } + } + + syscall_ret = syscall(cachestat_nr, fd, 0, filesize, + sizeof(struct cachestat), &cs, 0); + + ksft_print_msg("Cachestat call returned %ld\n", syscall_ret); + + if (syscall_ret) { + ksft_print_msg("Cachestat returned non-zero.\n"); + ret = false; + + if (write_random) + goto out2; + else + goto out1; + + } else { + ksft_print_msg( + "Using cachestat: Cached: %lu, Dirty: %lu, Writeback: %lu, Evicted: %lu, Recently Evicted: %lu\n", + cs.nr_cache, cs.nr_dirty, cs.nr_writeback, + cs.nr_evicted, cs.nr_recently_evicted); + + if (write_random) { + if (cs.nr_cache + cs.nr_evicted != num_pages) { + ksft_print_msg( + "Total number of cached and evicted pages is off.\n"); + ret = false; + } + } + } + + if (test_fsync) { + if (fsync(fd)) { + ksft_print_msg("fsync fails.\n"); + ret = false; + } else { + syscall_ret = syscall(cachestat_nr, fd, 0, filesize, + sizeof(struct cachestat), &cs, 0); + + ksft_print_msg("Cachestat call (after fsync) returned %ld\n", + syscall_ret); + + if (!syscall_ret) { + ksft_print_msg( + "Using cachestat: Cached: %lu, Dirty: %lu, Writeback: %lu, Evicted: %lu, Recently Evicted: %lu\n", + cs.nr_cache, cs.nr_dirty, cs.nr_writeback, + cs.nr_evicted, cs.nr_recently_evicted); + + if (cs.nr_dirty) { + ret = false; + ksft_print_msg( + "Number of dirty should be zero after fsync.\n"); + } + } else { + ksft_print_msg("Cachestat (after fsync) returned non-zero.\n"); + ret = false; + + if (write_random) + goto out2; + else + goto out1; + } + } + } + +out2: + if (write_random) + close(random_fd); +out1: + close(fd); + + if (create) + remove(filename); +out: + return ret; +} + +int main(void) +{ + for (int i = 0; i < 5; i++) { + const char *dev_filename = dev_files[i]; + + if (test_cachestat(dev_filename, false, false, false, + 4, O_RDONLY, 0400)) + ksft_test_result_pass("cachestat works with %s\n", dev_filename); + else + ksft_test_result_fail("cachestat fails with %s\n", dev_filename); + } + + if (test_cachestat("tmpfilecachestat", true, true, + true, 4, O_CREAT | O_RDWR, 0400 | 0600)) + ksft_test_result_pass("cachestat works with a normal file\n"); + else + ksft_test_result_fail("cachestat fails with normal file\n"); + + return 0; +}