From patchwork Fri Apr 9 15:16:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 12194339 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED022C433ED for ; Fri, 9 Apr 2021 15:16:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CBC45610D1 for ; Fri, 9 Apr 2021 15:16:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234032AbhDIPQX (ORCPT ); Fri, 9 Apr 2021 11:16:23 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:55164 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233878AbhDIPQV (ORCPT ); Fri, 9 Apr 2021 11:16:21 -0400 Received: from sc9-mailhost1.vmware.com (10.113.161.71) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Fri, 9 Apr 2021 08:16:03 -0700 Received: from vypre.com (unknown [10.21.244.131]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id 386A020D49; Fri, 9 Apr 2021 08:16:07 -0700 (PDT) From: Steven Rostedt To: CC: "Steven Rostedt (VMware)" Subject: [PATCH 1/3] libtracefs: Do some cleanups to the trace_marker.c code Date: Fri, 9 Apr 2021 11:16:02 -0400 Message-ID: <20210409151604.2224578-2-rostedt@goodmis.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210409151604.2224578-1-rostedt@goodmis.org> References: <20210409151604.2224578-1-rostedt@goodmis.org> MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-001.vmware.com: rostedt@goodmis.org does not designate permitted sender hosts) Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: "Steven Rostedt (VMware)" Just some clean ups. - Make the if statement simpler in marker_init() - Remove unnecessary "+ 1" to string length when writing to the trace_marker file. Signed-off-by: Steven Rostedt (VMware) --- src/tracefs-marker.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/tracefs-marker.c b/src/tracefs-marker.c index 0dc72f6..924ceea 100644 --- a/src/tracefs-marker.c +++ b/src/tracefs-marker.c @@ -24,14 +24,13 @@ static inline int *get_marker_fd(struct tracefs_instance *instance, bool raw) static int marker_init(struct tracefs_instance *instance, bool raw) { + const char *file = raw ? "trace_marker_raw" : "trace_marker"; int *fd = get_marker_fd(instance, raw); if (*fd >= 0) return 0; - if (raw) - *fd = tracefs_instance_file_open(instance, "trace_marker_raw", O_WRONLY | O_CLOEXEC); - else - *fd = tracefs_instance_file_open(instance, "trace_marker", O_WRONLY | O_CLOEXEC); + + *fd = tracefs_instance_file_open(instance, file, O_WRONLY | O_CLOEXEC); return *fd < 0 ? -1 : 0; } @@ -95,7 +94,7 @@ int tracefs_vprintf(struct tracefs_instance *instance, const char *fmt, va_list ret = vasprintf(&str, fmt, ap); if (ret < 0) return ret; - ret = marker_write(instance, false, str, strlen(str) + 1); + ret = marker_write(instance, false, str, strlen(str)); free(str); return ret; From patchwork Fri Apr 9 15:16:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 12194341 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 16219C43460 for ; Fri, 9 Apr 2021 15:16:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E9137610CF for ; Fri, 9 Apr 2021 15:16:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233878AbhDIPQX (ORCPT ); Fri, 9 Apr 2021 11:16:23 -0400 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:36110 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234037AbhDIPQV (ORCPT ); Fri, 9 Apr 2021 11:16:21 -0400 Received: from sc9-mailhost1.vmware.com (10.113.161.71) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Fri, 9 Apr 2021 08:16:04 -0700 Received: from vypre.com (unknown [10.21.244.131]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id DB68720D41; Fri, 9 Apr 2021 08:16:07 -0700 (PDT) From: Steven Rostedt To: CC: "Steven Rostedt (VMware)" Subject: [PATCH 2/3] libtracefs: Add helper function trace_get_lock() Date: Fri, 9 Apr 2021 11:16:03 -0400 Message-ID: <20210409151604.2224578-3-rostedt@goodmis.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210409151604.2224578-1-rostedt@goodmis.org> References: <20210409151604.2224578-1-rostedt@goodmis.org> MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-002.vmware.com: rostedt@goodmis.org does not designate permitted sender hosts) Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: "Steven Rostedt (VMware)" Since more APIs will need to get the instance pthread mutex or the toplevel pthread mutex depending on if the lock needed to change an instance or the top level state, create trace_get_lock() to not need to reimplement the conditional for every instance it is used. Signed-off-by: Steven Rostedt (VMware) --- include/tracefs-local.h | 5 +++++ src/tracefs-tools.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/tracefs-local.h b/include/tracefs-local.h index ea441b5..1c06a40 100644 --- a/include/tracefs-local.h +++ b/include/tracefs-local.h @@ -27,6 +27,11 @@ struct tracefs_instance { extern pthread_mutex_t toplevel_lock; +static inline pthread_mutex_t *trace_get_lock(struct tracefs_instance *instance) +{ + return instance ? &instance->lock : &toplevel_lock; +} + /* Can be overridden */ void warning(const char *fmt, ...); diff --git a/src/tracefs-tools.c b/src/tracefs-tools.c index 037875f..6bab2b0 100644 --- a/src/tracefs-tools.c +++ b/src/tracefs-tools.c @@ -756,7 +756,7 @@ static int update_filter(const char *filter_path, int *fd, bool reset = flags & TRACEFS_FL_RESET; bool cont = flags & TRACEFS_FL_CONTINUE; bool future = flags & TRACEFS_FL_FUTURE; - pthread_mutex_t *lock = instance ? &instance->lock : &toplevel_lock; + pthread_mutex_t *lock = trace_get_lock(instance); int open_flags; int ret = 1; From patchwork Fri Apr 9 15:16:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 12194343 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED8C0C43462 for ; Fri, 9 Apr 2021 15:16:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CF652610D1 for ; Fri, 9 Apr 2021 15:16:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234037AbhDIPQY (ORCPT ); Fri, 9 Apr 2021 11:16:24 -0400 Received: from ex13-edg-ou-001.vmware.com ([208.91.0.189]:55164 "EHLO EX13-EDG-OU-001.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234058AbhDIPQX (ORCPT ); Fri, 9 Apr 2021 11:16:23 -0400 Received: from sc9-mailhost1.vmware.com (10.113.161.71) by EX13-EDG-OU-001.vmware.com (10.113.208.155) with Microsoft SMTP Server id 15.0.1156.6; Fri, 9 Apr 2021 08:16:04 -0700 Received: from vypre.com (unknown [10.21.244.131]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id 898D920D41; Fri, 9 Apr 2021 08:16:08 -0700 (PDT) From: Steven Rostedt To: CC: "Steven Rostedt (VMware)" Subject: [PATCH 3/3] libtracefs: Add lock around modifying the trace_marker file descriptor Date: Fri, 9 Apr 2021 11:16:04 -0400 Message-ID: <20210409151604.2224578-4-rostedt@goodmis.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210409151604.2224578-1-rostedt@goodmis.org> References: <20210409151604.2224578-1-rostedt@goodmis.org> MIME-Version: 1.0 Received-SPF: None (EX13-EDG-OU-001.vmware.com: rostedt@goodmis.org does not designate permitted sender hosts) Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: "Steven Rostedt (VMware)" Add a pthread mutex to protect the integrity of the file descriptor saved for writing to the trace_marker and trace_marker_raw files. This lock is only to protect the modification of the file descriptor and does not protect against one thread closing the descriptor and another thread writing to it. It is only used to make sure that the file descriptor gets opened if it is not already opened when doing a write, to protect opening the same file more than once, and to protect against closing the same file descriptor more than once. Signed-off-by: Steven Rostedt (VMware) --- src/tracefs-marker.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/tracefs-marker.c b/src/tracefs-marker.c index 924ceea..61a07ab 100644 --- a/src/tracefs-marker.c +++ b/src/tracefs-marker.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "tracefs.h" #include "tracefs-local.h" @@ -25,24 +26,43 @@ static inline int *get_marker_fd(struct tracefs_instance *instance, bool raw) static int marker_init(struct tracefs_instance *instance, bool raw) { const char *file = raw ? "trace_marker_raw" : "trace_marker"; + pthread_mutex_t *lock = trace_get_lock(instance); int *fd = get_marker_fd(instance, raw); + int ret; if (*fd >= 0) return 0; - *fd = tracefs_instance_file_open(instance, file, O_WRONLY | O_CLOEXEC); + /* + * The mutex is only to hold the integrity of the file descriptor + * to prevent opening it more than once, or closing the same + * file descriptor more than once. It does not protect against + * one thread closing the file descriptor and another thread + * writing to it. That is up to the application to prevent + * from happening. + */ + pthread_mutex_lock(lock); + /* The file could have been opened since we taken the lock */ + if (*fd < 0) + *fd = tracefs_instance_file_open(instance, file, O_WRONLY | O_CLOEXEC); + + ret = *fd < 0 ? -1 : 0; + pthread_mutex_unlock(lock); - return *fd < 0 ? -1 : 0; + return ret; } static void marker_close(struct tracefs_instance *instance, bool raw) { + pthread_mutex_t *lock = trace_get_lock(instance); int *fd = get_marker_fd(instance, raw); - if (*fd < 0) - return; - close(*fd); - *fd = -1; + pthread_mutex_lock(lock); + if (*fd >= 0) { + close(*fd); + *fd = -1; + } + pthread_mutex_unlock(lock); } static int marker_write(struct tracefs_instance *instance, bool raw, void *data, int len) @@ -50,6 +70,11 @@ static int marker_write(struct tracefs_instance *instance, bool raw, void *data, int *fd = get_marker_fd(instance, raw); int ret; + /* + * The lock does not need to be taken for writes. As a write + * does not modify the file descriptor. It's up to the application + * to prevent it from being closed if another thread is doing a write. + */ if (!data || len < 1) return -1; if (*fd < 0) {