From nobody Tue Sep 9 17:42:06 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3681C64EC4 for ; Tue, 21 Feb 2023 21:12:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230198AbjBUVMK (ORCPT ); Tue, 21 Feb 2023 16:12:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229969AbjBUVLx (ORCPT ); Tue, 21 Feb 2023 16:11:53 -0500 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6A8D1302A7; Tue, 21 Feb 2023 13:11:51 -0800 (PST) Received: from W11-BEAU-MD.localdomain (unknown [76.135.27.212]) by linux.microsoft.com (Postfix) with ESMTPSA id A3EA420B9C3F; Tue, 21 Feb 2023 13:11:50 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com A3EA420B9C3F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1677013911; bh=4Tw0x0REBVNQbPmE7YKz+0Y5T7GJmSyJL4LF57PSOTg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aesw7t9XQP/X5GQ8EiFfClorrUh6vVIIT2JPSMqWmamU/kxVxPj/z1e2ulC52oiIq z3PZ+4yeKsnEDUhPArL6QiFDuNKf7UaF9FzAshfM3yDYkfgEHU3tG+l7YUtUewIuXh c+LDOOEtb/Fo3dHw4yUvVtHGrfdsCyBqBmRE0Phs= From: Beau Belgrave To: rostedt@goodmis.org, mhiramat@kernel.org, mathieu.desnoyers@efficios.com, dcook@linux.microsoft.com, alanau@linux.microsoft.com, brauner@kernel.org, akpm@linux-foundation.org, ebiederm@xmission.com, keescook@chromium.org, tglx@linutronix.de Cc: linux-trace-devel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v8 06/11] tracing/user_events: Update self-tests to write ABI Date: Tue, 21 Feb 2023 13:11:38 -0800 Message-Id: <20230221211143.574-7-beaub@linux.microsoft.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230221211143.574-1-beaub@linux.microsoft.com> References: <20230221211143.574-1-beaub@linux.microsoft.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" ABI has been changed to remote writes, update existing test cases to use this new ABI to ensure existing functionality continues to work. Signed-off-by: Beau Belgrave --- .../testing/selftests/user_events/dyn_test.c | 2 +- .../selftests/user_events/ftrace_test.c | 162 ++++++++++-------- .../testing/selftests/user_events/perf_test.c | 39 ++--- 3 files changed, 105 insertions(+), 98 deletions(-) diff --git a/tools/testing/selftests/user_events/dyn_test.c b/tools/testing= /selftests/user_events/dyn_test.c index d6265d14cd51..8879a7b04c6a 100644 --- a/tools/testing/selftests/user_events/dyn_test.c +++ b/tools/testing/selftests/user_events/dyn_test.c @@ -16,7 +16,7 @@ =20 #include "../kselftest_harness.h" =20 -const char *dyn_file =3D "/sys/kernel/debug/tracing/dynamic_events"; +const char *dyn_file =3D "/sys/kernel/tracing/dynamic_events"; const char *clear =3D "!u:__test_event"; =20 static int Append(const char *value) diff --git a/tools/testing/selftests/user_events/ftrace_test.c b/tools/test= ing/selftests/user_events/ftrace_test.c index 404a2713dcae..aceafacfb126 100644 --- a/tools/testing/selftests/user_events/ftrace_test.c +++ b/tools/testing/selftests/user_events/ftrace_test.c @@ -12,20 +12,16 @@ #include #include #include +#include #include =20 #include "../kselftest_harness.h" =20 -const char *data_file =3D "/sys/kernel/debug/tracing/user_events_data"; -const char *status_file =3D "/sys/kernel/debug/tracing/user_events_status"; -const char *enable_file =3D "/sys/kernel/debug/tracing/events/user_events/= __test_event/enable"; -const char *trace_file =3D "/sys/kernel/debug/tracing/trace"; -const char *fmt_file =3D "/sys/kernel/debug/tracing/events/user_events/__t= est_event/format"; - -static inline int status_check(char *status_page, int status_bit) -{ - return status_page[status_bit >> 3] & (1 << (status_bit & 7)); -} +const char *data_file =3D "/sys/kernel/tracing/user_events_data"; +const char *status_file =3D "/sys/kernel/tracing/user_events_status"; +const char *enable_file =3D "/sys/kernel/tracing/events/user_events/__test= _event/enable"; +const char *trace_file =3D "/sys/kernel/tracing/trace"; +const char *fmt_file =3D "/sys/kernel/tracing/events/user_events/__test_ev= ent/format"; =20 static int trace_bytes(void) { @@ -106,13 +102,23 @@ static int get_print_fmt(char *buffer, int len) return -1; } =20 -static int clear(void) +static int clear(int *check) { + struct user_unreg unreg =3D {0}; + + unreg.size =3D sizeof(unreg); + unreg.disable_bit =3D 31; + unreg.disable_addr =3D (__u64)check; + int fd =3D open(data_file, O_RDWR); =20 if (fd =3D=3D -1) return -1; =20 + if (ioctl(fd, DIAG_IOCSUNREG, &unreg) =3D=3D -1) + if (errno !=3D ENOENT) + return -1; + if (ioctl(fd, DIAG_IOCSDEL, "__test_event") =3D=3D -1) if (errno !=3D ENOENT) return -1; @@ -122,7 +128,7 @@ static int clear(void) return 0; } =20 -static int check_print_fmt(const char *event, const char *expected) +static int check_print_fmt(const char *event, const char *expected, int *c= heck) { struct user_reg reg =3D {0}; char print_fmt[256]; @@ -130,7 +136,7 @@ static int check_print_fmt(const char *event, const cha= r *expected) int fd; =20 /* Ensure cleared */ - ret =3D clear(); + ret =3D clear(check); =20 if (ret !=3D 0) return ret; @@ -142,14 +148,19 @@ static int check_print_fmt(const char *event, const c= har *expected) =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)event; + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)check; + reg.enable_size =3D sizeof(*check); =20 /* Register should work */ ret =3D ioctl(fd, DIAG_IOCSREG, ®); =20 close(fd); =20 - if (ret !=3D 0) + if (ret !=3D 0) { + printf("Reg failed in fmt\n"); return ret; + } =20 /* Ensure correct print_fmt */ ret =3D get_print_fmt(print_fmt, sizeof(print_fmt)); @@ -164,6 +175,7 @@ FIXTURE(user) { int status_fd; int data_fd; int enable_fd; + int check; }; =20 FIXTURE_SETUP(user) { @@ -185,59 +197,56 @@ FIXTURE_TEARDOWN(user) { close(self->enable_fd); } =20 - ASSERT_EQ(0, clear()); + if (clear(&self->check) !=3D 0) + printf("WARNING: Clear didn't work!\n"); } =20 TEST_F(user, register_events) { struct user_reg reg =3D {0}; - int page_size =3D sysconf(_SC_PAGESIZE); - char *status_page; + struct user_unreg unreg =3D {0}; =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)"__test_event u32 field1; u32 field2"; + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)&self->check; + reg.enable_size =3D sizeof(self->check); =20 - status_page =3D mmap(NULL, page_size, PROT_READ, MAP_SHARED, - self->status_fd, 0); + unreg.size =3D sizeof(unreg); + unreg.disable_bit =3D 31; + unreg.disable_addr =3D (__u64)&self->check; =20 /* Register should work */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); =20 /* Multiple registers should result in same index */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); =20 /* Ensure disabled */ self->enable_fd =3D open(enable_file, O_RDWR); ASSERT_NE(-1, self->enable_fd); ASSERT_NE(-1, write(self->enable_fd, "0", sizeof("0"))) =20 - /* MMAP should work and be zero'd */ - ASSERT_NE(MAP_FAILED, status_page); - ASSERT_NE(NULL, status_page); - ASSERT_EQ(0, status_check(status_page, reg.status_bit)); - /* Enable event and ensure bits updated in status */ ASSERT_NE(-1, write(self->enable_fd, "1", sizeof("1"))) - ASSERT_NE(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(1 << reg.enable_bit, self->check); =20 /* Disable event and ensure bits updated in status */ ASSERT_NE(-1, write(self->enable_fd, "0", sizeof("0"))) - ASSERT_EQ(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(0, self->check); =20 /* File still open should return -EBUSY for delete */ ASSERT_EQ(-1, ioctl(self->data_fd, DIAG_IOCSDEL, "__test_event")); ASSERT_EQ(EBUSY, errno); =20 - /* Delete should work only after close */ + /* Unregister */ + ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSUNREG, &unreg)); + + /* Delete should work only after close and unregister */ close(self->data_fd); self->data_fd =3D open(data_file, O_RDWR); ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSDEL, "__test_event")); - - /* Unmap should work */ - ASSERT_EQ(0, munmap(status_page, page_size)); } =20 TEST_F(user, write_events) { @@ -245,11 +254,12 @@ TEST_F(user, write_events) { struct iovec io[3]; __u32 field1, field2; int before =3D 0, after =3D 0; - int page_size =3D sysconf(_SC_PAGESIZE); - char *status_page; =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)"__test_event u32 field1; u32 field2"; + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)&self->check; + reg.enable_size =3D sizeof(self->check); =20 field1 =3D 1; field2 =3D 2; @@ -261,18 +271,10 @@ TEST_F(user, write_events) { io[2].iov_base =3D &field2; io[2].iov_len =3D sizeof(field2); =20 - status_page =3D mmap(NULL, page_size, PROT_READ, MAP_SHARED, - self->status_fd, 0); - /* Register should work */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); - - /* MMAP should work and be zero'd */ - ASSERT_NE(MAP_FAILED, status_page); - ASSERT_NE(NULL, status_page); - ASSERT_EQ(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(0, self->check); =20 /* Write should fail on invalid slot with ENOENT */ io[0].iov_base =3D &field2; @@ -287,7 +289,7 @@ TEST_F(user, write_events) { ASSERT_NE(-1, write(self->enable_fd, "1", sizeof("1"))) =20 /* Event should now be enabled */ - ASSERT_NE(0, status_check(status_page, reg.status_bit)); + ASSERT_NE(1 << reg.enable_bit, self->check); =20 /* Write should make it out to ftrace buffers */ before =3D trace_bytes(); @@ -304,6 +306,9 @@ TEST_F(user, write_fault) { =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)"__test_event u64 anon"; + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)&self->check; + reg.enable_size =3D sizeof(self->check); =20 anon =3D mmap(NULL, l, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ASSERT_NE(MAP_FAILED, anon); @@ -316,7 +321,6 @@ TEST_F(user, write_fault) { /* Register should work */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); =20 /* Write should work normally */ ASSERT_NE(-1, writev(self->data_fd, (const struct iovec *)io, 2)); @@ -333,24 +337,17 @@ TEST_F(user, write_validator) { int loc, bytes; char data[8]; int before =3D 0, after =3D 0; - int page_size =3D sysconf(_SC_PAGESIZE); - char *status_page; - - status_page =3D mmap(NULL, page_size, PROT_READ, MAP_SHARED, - self->status_fd, 0); =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)"__test_event __rel_loc char[] data"; + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)&self->check; + reg.enable_size =3D sizeof(self->check); =20 /* Register should work */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); - - /* MMAP should work and be zero'd */ - ASSERT_NE(MAP_FAILED, status_page); - ASSERT_NE(NULL, status_page); - ASSERT_EQ(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(0, self->check); =20 io[0].iov_base =3D ®.write_index; io[0].iov_len =3D sizeof(reg.write_index); @@ -369,7 +366,7 @@ TEST_F(user, write_validator) { ASSERT_NE(-1, write(self->enable_fd, "1", sizeof("1"))) =20 /* Event should now be enabled */ - ASSERT_NE(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(1 << reg.enable_bit, self->check); =20 /* Full in-bounds write should work */ before =3D trace_bytes(); @@ -409,71 +406,88 @@ TEST_F(user, print_fmt) { int ret; =20 ret =3D check_print_fmt("__test_event __rel_loc char[] data", - "print fmt: \"data=3D%s\", __get_rel_str(data)"); + "print fmt: \"data=3D%s\", __get_rel_str(data)", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event __data_loc char[] data", - "print fmt: \"data=3D%s\", __get_str(data)"); + "print fmt: \"data=3D%s\", __get_str(data)", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event s64 data", - "print fmt: \"data=3D%lld\", REC->data"); + "print fmt: \"data=3D%lld\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event u64 data", - "print fmt: \"data=3D%llu\", REC->data"); + "print fmt: \"data=3D%llu\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event s32 data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event u32 data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event int data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event unsigned int data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event s16 data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event u16 data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event short data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event unsigned short data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event s8 data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event u8 data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event char data", - "print fmt: \"data=3D%d\", REC->data"); + "print fmt: \"data=3D%d\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event unsigned char data", - "print fmt: \"data=3D%u\", REC->data"); + "print fmt: \"data=3D%u\", REC->data", + &self->check); ASSERT_EQ(0, ret); =20 ret =3D check_print_fmt("__test_event char[4] data", - "print fmt: \"data=3D%s\", REC->data"); + "print fmt: \"data=3D%s\", REC->data", + &self->check); ASSERT_EQ(0, ret); } =20 diff --git a/tools/testing/selftests/user_events/perf_test.c b/tools/testin= g/selftests/user_events/perf_test.c index 8b4c7879d5a7..a070258d4449 100644 --- a/tools/testing/selftests/user_events/perf_test.c +++ b/tools/testing/selftests/user_events/perf_test.c @@ -18,10 +18,9 @@ =20 #include "../kselftest_harness.h" =20 -const char *data_file =3D "/sys/kernel/debug/tracing/user_events_data"; -const char *status_file =3D "/sys/kernel/debug/tracing/user_events_status"; -const char *id_file =3D "/sys/kernel/debug/tracing/events/user_events/__te= st_event/id"; -const char *fmt_file =3D "/sys/kernel/debug/tracing/events/user_events/__t= est_event/format"; +const char *data_file =3D "/sys/kernel/tracing/user_events_data"; +const char *id_file =3D "/sys/kernel/tracing/events/user_events/__test_eve= nt/id"; +const char *fmt_file =3D "/sys/kernel/tracing/events/user_events/__test_ev= ent/format"; =20 struct event { __u32 index; @@ -35,11 +34,6 @@ static long perf_event_open(struct perf_event_attr *pe, = pid_t pid, return syscall(__NR_perf_event_open, pe, pid, cpu, group_fd, flags); } =20 -static inline int status_check(char *status_page, int status_bit) -{ - return status_page[status_bit >> 3] & (1 << (status_bit & 7)); -} - static int get_id(void) { FILE *fp =3D fopen(id_file, "r"); @@ -88,45 +82,38 @@ static int get_offset(void) } =20 FIXTURE(user) { - int status_fd; int data_fd; + int check; }; =20 FIXTURE_SETUP(user) { - self->status_fd =3D open(status_file, O_RDONLY); - ASSERT_NE(-1, self->status_fd); - self->data_fd =3D open(data_file, O_RDWR); ASSERT_NE(-1, self->data_fd); } =20 FIXTURE_TEARDOWN(user) { - close(self->status_fd); close(self->data_fd); } =20 TEST_F(user, perf_write) { struct perf_event_attr pe =3D {0}; struct user_reg reg =3D {0}; - int page_size =3D sysconf(_SC_PAGESIZE); - char *status_page; struct event event; struct perf_event_mmap_page *perf_page; + int page_size =3D sysconf(_SC_PAGESIZE); int id, fd, offset; __u32 *val; =20 reg.size =3D sizeof(reg); reg.name_args =3D (__u64)"__test_event u32 field1; u32 field2"; - - status_page =3D mmap(NULL, page_size, PROT_READ, MAP_SHARED, - self->status_fd, 0); - ASSERT_NE(MAP_FAILED, status_page); + reg.enable_bit =3D 31; + reg.enable_addr =3D (__u64)&self->check; + reg.enable_size =3D sizeof(self->check); =20 /* Register should work */ ASSERT_EQ(0, ioctl(self->data_fd, DIAG_IOCSREG, ®)); ASSERT_EQ(0, reg.write_index); - ASSERT_NE(0, reg.status_bit); - ASSERT_EQ(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(0, self->check); =20 /* Id should be there */ id =3D get_id(); @@ -149,7 +136,7 @@ TEST_F(user, perf_write) { ASSERT_NE(MAP_FAILED, perf_page); =20 /* Status should be updated */ - ASSERT_NE(0, status_check(status_page, reg.status_bit)); + ASSERT_EQ(1 << reg.enable_bit, self->check); =20 event.index =3D reg.write_index; event.field1 =3D 0xc001; @@ -165,6 +152,12 @@ TEST_F(user, perf_write) { /* Ensure correct */ ASSERT_EQ(event.field1, *val++); ASSERT_EQ(event.field2, *val++); + + munmap(perf_page, page_size * 2); + close(fd); + + /* Status should be updated */ + ASSERT_EQ(0, self->check); } =20 int main(int argc, char **argv) --=20 2.25.1