From patchwork Fri Feb 2 18:44:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Beau Belgrave X-Patchwork-Id: 196004 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:9bc1:b0:106:209c:c626 with SMTP id op1csp643562dyc; Fri, 2 Feb 2024 11:10:47 -0800 (PST) X-Google-Smtp-Source: AGHT+IHx1nRyJt+Hn4pjPHxWjmFzVKFqQN/8wUe0jTLO+30T+DHS/IltHH16hQ0V07D77jYK8ILf X-Received: by 2002:a05:6a20:9719:b0:19c:8447:1c41 with SMTP id hr25-20020a056a20971900b0019c84471c41mr8770646pzc.44.1706901047543; Fri, 02 Feb 2024 11:10:47 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706901047; cv=pass; d=google.com; s=arc-20160816; b=kGosPE5q+sXj4PvfCFFW4XggVmYpd4u8TKgssXWabsdRtqrBChgE7AZ0tE3Vz5ge1E qGfl1w0ea86TpVWYe8AqZKG17J0hdcCmfuYvkPgxI1SOb6OQeuY9J/qTL2lsX4P5OYQY J0DTuwm2Z0JPrcCeUkaa/npeOsOFqfNniv8m6VkAPXxoH36bi8aNaQGHZNqJjJQnHHtW mOjl041JwAalPs3+woBBszR1LumBbzeU+LjEKrcOEQELDQoPoi8VNPeu1G0sLu3K3qfQ MMvfWIzLUxrPs0vPEg50BDatGmX9NhOJ2wWEB2QMwzbXCaotOWaYVL0MeeQoP4xS3hEX Wvgw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature:dkim-filter; bh=KUDMkr8RLsAYmhZAS3vUhiwE/jC9o4CeWLT+JtE+tIA=; fh=zKKt6k94H8Ff+3OlTPD1kootH4Ys7tp+SJA6p2pu5oU=; b=ZRw2zREBmdZUwB5w0QZkXj23Y4mwec8Ctlq+qtPZmVuoBVbaWLN5dzRhlahi+wG+BH 6dEutZRhJvwWa8V0GRtOsyN3pvKuMwcZ3wT9oHcbJxQoG32R9MrzPHovinBs2H8WZ4mp O67zltkAmi0Dh7fJa1edt2Pfq8n0seIWGB56lNF1m9E+VAi8iepMzoo920gf6LpU2duA Pr3MoIeOxX31SzY7qjxLxAkgkrYbJ/xCRlX58dZxrkNCB0n0vU328QdXNHVinsVKfg2G 2066CEfqKxJM21LJRSdokpQUlQNslSPLKHH6N01qYX3FD/WcG7npU1WrhZ3dKaGYVsVh hgYg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=CrihQ6FJ; arc=pass (i=1 spf=pass spfdomain=linux.microsoft.com dkim=pass dkdomain=linux.microsoft.com dmarc=pass fromdomain=linux.microsoft.com); spf=pass (google.com: domain of linux-kernel+bounces-50443-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-50443-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com X-Forwarded-Encrypted: i=1; AJvYcCUhE5PSdN+VyQ4+x3LuNw8NTvqYDTedsiA6kFmTxMQMf1qR1wppQKOhBqApgHldIFrLV9Bw5g4i7fjRRJS1PgNn9K73fA== Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id p11-20020a63e64b000000b005cd6507bb84si2020986pgj.183.2024.02.02.11.10.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Feb 2024 11:10:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-50443-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=CrihQ6FJ; arc=pass (i=1 spf=pass spfdomain=linux.microsoft.com dkim=pass dkdomain=linux.microsoft.com dmarc=pass fromdomain=linux.microsoft.com); spf=pass (google.com: domain of linux-kernel+bounces-50443-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-50443-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id EB85C29501B for ; Fri, 2 Feb 2024 19:05:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EA8E285922; Fri, 2 Feb 2024 18:45:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="CrihQ6FJ" Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E05948063D; Fri, 2 Feb 2024 18:44:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706899502; cv=none; b=gIDFwzOfrhwOZGpKXl+vYY0G9B0bSnt2npSA8FJgJl6EEz8fo/f6S8UDbV59leZWA4aa3ACSeGYmhh+rXhTNp4IaTshR3Cc7EBPAf4fdLEA3lf1ofBP52l7MVGCCDkcrZOsXtyd4jgfQVW36vstfaGvTsjVR5IkwvWfJs3+gS0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706899502; c=relaxed/simple; bh=GOTOl32tyEUqyiUqhLrtlUNFRb2MzjMvHRjHDbTATds=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=X1DsWpBh1UVXTfFCBfTG9c5Rz8FBxys93p+z5XUyqQ8Z9BH6+skKEJeq5pRscpqR+a8iTQ+zFBU48s3UeIoag6EjOsz+LeogjMFzEw7MUaZHRzepN7YYnpvhoYlMT2rlly1t7P0qPTNmDfOjnEM8ANJKb9ynnEIXm7RzGdWFSlw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=CrihQ6FJ; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Received: from localhost.localdomain (unknown [4.155.48.115]) by linux.microsoft.com (Postfix) with ESMTPSA id D8B8520B2003; Fri, 2 Feb 2024 10:44:58 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com D8B8520B2003 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1706899498; bh=KUDMkr8RLsAYmhZAS3vUhiwE/jC9o4CeWLT+JtE+tIA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CrihQ6FJTtYTCwYDlu0e3y0carlrbGPga2EFZvSlqG2DlZ7fflirlfAuttNUW8ssp CULnETctYnIY+xC8P7gvi+aHoOs8kUQR6tMfIfjMYS3PcG2lQE3dRyC1qmhe2C5NpU mMsyHvoYtoFHwhkpEs22uCYo3UojXPalmk06C7yQ= From: Beau Belgrave To: rostedt@goodmis.org, mhiramat@kernel.org Cc: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, mathieu.desnoyers@efficios.com Subject: [PATCH v2 3/4] selftests/user_events: Test multi-format events Date: Fri, 2 Feb 2024 18:44:48 +0000 Message-Id: <20240202184449.1674-4-beaub@linux.microsoft.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240202184449.1674-1-beaub@linux.microsoft.com> References: <20240202184449.1674-1-beaub@linux.microsoft.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789815472910723749 X-GMAIL-MSGID: 1789815472910723749 User_events now has multi-format events which allow for the same register name, but with different formats. When this occurs, different tracepoints are created with unique names. Add a new test that ensures the same name can be used for two different formats. Ensure they are isolated from each other and that name and arg matching still works if yet another register comes in with the same format as one of the two. Signed-off-by: Beau Belgrave --- .../testing/selftests/user_events/abi_test.c | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/tools/testing/selftests/user_events/abi_test.c b/tools/testing/selftests/user_events/abi_test.c index cef1ff1af223..7288a05136ba 100644 --- a/tools/testing/selftests/user_events/abi_test.c +++ b/tools/testing/selftests/user_events/abi_test.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include #include "../kselftest_harness.h" @@ -23,6 +25,62 @@ const char *data_file = "/sys/kernel/tracing/user_events_data"; const char *enable_file = "/sys/kernel/tracing/events/user_events/__abi_event/enable"; +const char *multi_dir_glob = "/sys/kernel/tracing/events/user_events_multi/__abi_event.*"; + +static int wait_for_delete(char *dir) +{ + struct stat buf; + int i; + + for (i = 0; i < 10000; ++i) { + if (stat(dir, &buf) == -1 && errno == ENOENT) + return 0; + + usleep(1000); + } + + return -1; +} + +static int find_multi_event_dir(char *unique_field, char *out_dir, int dir_len) +{ + char path[256]; + glob_t buf; + int i, ret; + + ret = glob(multi_dir_glob, GLOB_ONLYDIR, NULL, &buf); + + if (ret) + return -1; + + ret = -1; + + for (i = 0; i < buf.gl_pathc; ++i) { + FILE *fp; + + snprintf(path, sizeof(path), "%s/format", buf.gl_pathv[i]); + fp = fopen(path, "r"); + + if (!fp) + continue; + + while (fgets(path, sizeof(path), fp) != NULL) { + if (strstr(path, unique_field)) { + fclose(fp); + /* strscpy is not available, use snprintf */ + snprintf(out_dir, dir_len, "%s", buf.gl_pathv[i]); + ret = 0; + goto out; + } + } + + fclose(fp); + } +out: + globfree(&buf); + + return ret; +} static bool event_exists(void) { @@ -74,6 +132,39 @@ static int event_delete(void) return ret; } +static int reg_enable_multi(void *enable, int size, int bit, int flags, + char *args) +{ + struct user_reg reg = {0}; + char full_args[512] = {0}; + int fd = open(data_file, O_RDWR); + int len; + int ret; + + if (fd < 0) + return -1; + + len = snprintf(full_args, sizeof(full_args), "__abi_event %s", args); + + if (len > sizeof(full_args)) { + ret = -E2BIG; + goto out; + } + + reg.size = sizeof(reg); + reg.name_args = (__u64)full_args; + reg.flags = USER_EVENT_REG_MULTI_FORMAT | flags; + reg.enable_bit = bit; + reg.enable_addr = (__u64)enable; + reg.enable_size = size; + + ret = ioctl(fd, DIAG_IOCSREG, ®); +out: + close(fd); + + return ret; +} + static int reg_enable_flags(void *enable, int size, int bit, int flags) { struct user_reg reg = {0}; @@ -207,6 +298,49 @@ TEST_F(user, bit_sizes) { ASSERT_NE(0, reg_enable(&self->check, 128, 0)); } +TEST_F(user, multi_format) { + char first_dir[256]; + char second_dir[256]; + struct stat buf; + + /* Multiple formats for the same name should work */ + ASSERT_EQ(0, reg_enable_multi(&self->check, sizeof(int), 0, + 0, "u32 multi_first")); + + ASSERT_EQ(0, reg_enable_multi(&self->check, sizeof(int), 1, + 0, "u64 multi_second")); + + /* Same name with same format should also work */ + ASSERT_EQ(0, reg_enable_multi(&self->check, sizeof(int), 2, + 0, "u64 multi_second")); + + ASSERT_EQ(0, find_multi_event_dir("multi_first", + first_dir, sizeof(first_dir))); + + ASSERT_EQ(0, find_multi_event_dir("multi_second", + second_dir, sizeof(second_dir))); + + /* Should not be found in the same dir */ + ASSERT_NE(0, strcmp(first_dir, second_dir)); + + /* First dir should still exist */ + ASSERT_EQ(0, stat(first_dir, &buf)); + + /* Disabling first register should remove first dir */ + ASSERT_EQ(0, reg_disable(&self->check, 0)); + ASSERT_EQ(0, wait_for_delete(first_dir)); + + /* Second dir should still exist */ + ASSERT_EQ(0, stat(second_dir, &buf)); + + /* Disabling second register should remove second dir */ + ASSERT_EQ(0, reg_disable(&self->check, 1)); + /* Ensure bit 1 and 2 are tied together, should not delete yet */ + ASSERT_EQ(0, stat(second_dir, &buf)); + ASSERT_EQ(0, reg_disable(&self->check, 2)); + ASSERT_EQ(0, wait_for_delete(second_dir)); +} + TEST_F(user, forks) { int i;