From: Ian Rogers <irogers@google.com>
To: irogers@google.com, acme@kernel.org, elver@google.com,
namhyung@kernel.org
Cc: adrian.hunter@intel.com, james.clark@linaro.org,
jolsa@kernel.org, justinstitt@google.com,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
ljs@kernel.org, llvm@lists.linux.dev, mingo@redhat.com,
morbo@google.com, nathan@kernel.org, ndesaulniers@google.com,
peterz@infradead.org
Subject: [PATCH v3 15/17] perf config, intel-tpebs, env: Add __guarded_by and __must_hold annotations
Date: Fri, 16 Oct 2026 10:31:04 -0700 [thread overview]
Message-ID: <20261016173106.679725-16-irogers@google.com> (raw)
In-Reply-To: <20261016173106.679725-1-irogers@google.com>
Add __guarded_by() and __must_hold() annotations to static parser and
config state in util/config.c, TPEBS state in util/intel-tpebs.c, and
bpf_progs and cgroups trees in struct perf_env.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/util/bpf-event.h | 5 ++--
tools/perf/util/config.c | 43 ++++++++++++++++++++++-------------
tools/perf/util/env.c | 1 +
tools/perf/util/env.h | 19 +++++++++-------
tools/perf/util/intel-tpebs.c | 7 +++---
5 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/tools/perf/util/bpf-event.h b/tools/perf/util/bpf-event.h
index da4eeb4a1a73..3f3323f98f49 100644
--- a/tools/perf/util/bpf-event.h
+++ b/tools/perf/util/bpf-event.h
@@ -6,11 +6,11 @@
#include <linux/rbtree.h>
#include <api/fd/array.h>
#include <stdio.h>
+#include "env.h"
struct bpf_prog_info;
struct machine;
union perf_event;
-struct perf_env;
struct perf_sample;
struct perf_session;
struct record_opts;
@@ -42,7 +42,8 @@ int machine__process_bpf(struct machine *machine, union perf_event *event,
int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env);
void __bpf_event__print_bpf_prog_info(struct perf_bpil *info_linear,
struct perf_env *env,
- FILE *fp);
+ FILE *fp)
+ __must_hold_shared(&env->bpf_progs.lock);
void bpf_metadata_free(struct bpf_metadata *metadata);
#else
static inline int machine__process_bpf(struct machine *machine __maybe_unused,
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c
index 287401f159e6..a55f7062a09b 100644
--- a/tools/perf/util/config.c
+++ b/tools/perf/util/config.c
@@ -64,15 +64,29 @@ struct perf_stat_config stat_config = {
char buildid_dir[MAXPATHLEN]; /* root dir for buildid, binary cache */
-static FILE *config_file;
-static const char *config_file_name;
-static int config_linenr;
-static int config_file_eof;
-static struct perf_config_set *config_set;
+/* Parsing and rewriting share the static parser state. */
+static DEFINE_MUTEX(config_mutex);
+
+/* Serializes whole perf_config__set_variable() updates. */
+static DEFINE_MUTEX(config_update_mutex);
+
+/*
+ * Protects the global config_set. Separate from config_mutex because
+ * initializing config_set parses the config files, which acquires
+ * config_mutex.
+ */
+static DEFINE_MUTEX(config_set_mutex);
+
+static FILE *config_file __guarded_by(&config_mutex);
+static const char *config_file_name __guarded_by(&config_mutex);
+static int config_linenr __guarded_by(&config_mutex);
+static int config_file_eof __guarded_by(&config_mutex);
+static struct perf_config_set *config_set __guarded_by(&config_set_mutex);
const char *config_exclusive_filename;
static int get_next_char(void)
+ __must_hold(&config_mutex)
{
int c;
FILE *f;
@@ -99,6 +113,7 @@ static int get_next_char(void)
}
static char *parse_value(void)
+ __must_hold(&config_mutex)
{
static char value[1024];
int quote = 0, comment = 0, space = 0;
@@ -170,6 +185,7 @@ static inline int iskeychar(int c)
}
static int get_value(config_fn_t fn, void *data, char *name, unsigned int len)
+ __must_hold(&config_mutex)
{
int c;
char *value;
@@ -201,6 +217,7 @@ static int get_value(config_fn_t fn, void *data, char *name, unsigned int len)
}
static int get_extended_base_var(char *name, int baselen, int c)
+ __must_hold(&config_mutex)
{
do {
if (c == '\n')
@@ -237,6 +254,7 @@ static int get_extended_base_var(char *name, int baselen, int c)
}
static int get_base_var(char *name)
+ __must_hold(&config_mutex)
{
int baselen = 0;
@@ -257,6 +275,7 @@ static int get_base_var(char *name)
}
static int perf_parse_file(config_fn_t fn, void *data)
+ __must_hold(&config_mutex)
{
int comment = 0;
int baselen = 0;
@@ -549,12 +568,6 @@ int perf_default_config(const char *var, const char *value,
return 0;
}
-/* Parsing and rewriting share the static parser state. */
-static DEFINE_MUTEX(config_mutex);
-
-/* Serializes whole perf_config__set_variable() updates. */
-static DEFINE_MUTEX(config_update_mutex);
-
static int perf_config_from_file(config_fn_t fn, const char *filename, void *data)
{
int ret;
@@ -737,6 +750,7 @@ static int set_value(struct perf_config_item *item, const char *value)
static int collect_config(const char *var, const char *value,
void *perf_config_set)
+ __must_hold(&config_mutex)
{
int ret = -1;
char *ptr, *key;
@@ -853,11 +867,8 @@ struct perf_config_set *perf_config_set__load_file(const char *file)
return set;
}
-/* Not config_mutex: building the set parses the config files, which takes it. */
-static DEFINE_MUTEX(config_set_mutex);
-
-/* Called with config_set_mutex held. */
static int perf_config__init(void)
+ __must_hold(&config_set_mutex)
{
if (config_set == NULL)
config_set = perf_config_set__new();
@@ -975,7 +986,7 @@ int perf_config__set_variable(const char *var, const char *value)
/* Static: the parser publishes it as config_file_name. */
{
- static char path[PATH_MAX];
+ static char path[PATH_MAX] __guarded_by(&config_update_mutex);
char *user_config = mkpath(path, sizeof(path), "%s/.perfconfig", getenv("HOME"));
config_filename = config_exclusive_filename ?: user_config;
diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c
index 50993b0dedc5..9e8e5d1d822a 100644
--- a/tools/perf/util/env.c
+++ b/tools/perf/util/env.c
@@ -302,6 +302,7 @@ void perf_env__exit(struct perf_env *env)
}
void perf_env__init(struct perf_env *env)
+ __context_unsafe(/* initialization */)
{
memset(env, 0, sizeof(*env));
#ifdef HAVE_LIBBPF_SUPPORT
diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h
index 23d35425efe3..6b2083e3640c 100644
--- a/tools/perf/util/env.h
+++ b/tools/perf/util/env.h
@@ -139,16 +139,16 @@ struct perf_env {
*/
struct {
struct rw_semaphore lock;
- struct rb_root infos;
- u32 infos_cnt;
- struct rb_root btfs;
- u32 btfs_cnt;
+ struct rb_root infos __guarded_by(&lock);
+ u32 infos_cnt __guarded_by(&lock);
+ struct rb_root btfs __guarded_by(&lock);
+ u32 btfs_cnt __guarded_by(&lock);
} bpf_progs;
#endif // HAVE_LIBBPF_SUPPORT
/* same reason as above (for perf-top) */
struct {
struct rw_semaphore lock;
- struct rb_root tree;
+ struct rb_root tree __guarded_by(&lock);
} cgroups;
/* For fast cpu to numa node lookup via perf_env__numa_node */
@@ -223,7 +223,8 @@ int perf_env__nr_cpus_avail(struct perf_env *env);
void perf_env__init(struct perf_env *env);
#ifdef HAVE_LIBBPF_SUPPORT
bool __perf_env__insert_bpf_prog_info(struct perf_env *env,
- struct bpf_prog_info_node *info_node);
+ struct bpf_prog_info_node *info_node)
+ __must_hold(&env->bpf_progs.lock);
bool perf_env__insert_bpf_prog_info(struct perf_env *env,
struct bpf_prog_info_node *info_node);
struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env,
@@ -233,9 +234,11 @@ void perf_env__iterate_bpf_prog_info(struct perf_env *env,
void *data),
void *data);
bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
-bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node);
+bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node)
+ __must_hold(&env->bpf_progs.lock);
struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id);
-struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id);
+struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id)
+ __must_hold_shared(&env->bpf_progs.lock);
#endif // HAVE_LIBBPF_SUPPORT
int perf_env__numa_node(struct perf_env *env, struct perf_cpu cpu);
diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c
index 57e08476a13d..13f88fc3ceed 100644
--- a/tools/perf/util/intel-tpebs.c
+++ b/tools/perf/util/intel-tpebs.c
@@ -37,11 +37,11 @@
bool tpebs_recording;
enum tpebs_mode tpebs_mode;
static DEFINE_MUTEX(tpebs_mtx);
-static LIST_HEAD(tpebs_results);
-static pthread_t tpebs_reader_thread;
+static struct list_head tpebs_results __guarded_by(&tpebs_mtx) = LIST_HEAD_INIT(tpebs_results);
+static pthread_t tpebs_reader_thread __guarded_by(&tpebs_mtx);
static struct child_process tpebs_cmd;
static int control_fd[2] = { -1, -1 }, ack_fd[2] = { -1, -1 };
-static bool tpebs_stopping;
+static bool tpebs_stopping __guarded_by(&tpebs_mtx);
struct tpebs_retire_lat {
struct list_head nd;
@@ -61,6 +61,7 @@ static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel)
__must_hold(&tpebs_mtx);
static int evsel__tpebs_start_perf_record(struct evsel *evsel)
+ __must_hold(&tpebs_mtx)
{
const char **record_argv;
int tpebs_event_size = 0, i = 0, ret;
--
2.56.0.212.g129ede20d9-goog
next prev parent reply other threads:[~2026-10-16 17:31 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 18:24 [PATCH v1 00/10] tools/perf: Adopt kernel compiler-context-analysis.h annotations Ian Rogers
2026-10-13 18:24 ` [PATCH v1 01/10] compiler-context-analysis: Avoid unused parameter warning in _context_unsafe_alias() Ian Rogers
2026-10-13 18:30 ` sashiko-bot
2026-10-13 19:44 ` Bart Van Assche
2026-10-13 22:10 ` Ian Rogers
2026-10-13 22:14 ` Bart Van Assche
2026-10-13 22:26 ` Ian Rogers
2026-10-13 22:47 ` Bart Van Assche
2026-10-13 22:59 ` Ian Rogers
2026-10-14 9:59 ` Peter Zijlstra
2026-10-13 18:24 ` [PATCH v1 02/10] tools headers compiler: Synchronize compiler_types.h with the kernel sources Ian Rogers
2026-10-13 18:33 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 03/10] tools headers: Synchronize linux/compiler-context-analysis.h " Ian Rogers
2026-10-13 18:34 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 04/10] perf mutex: Use kernel style compiler-context-analysis.h annotations Ian Rogers
2026-10-13 18:36 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 05/10] perf build: Enable additional Clang thread-safety flags Ian Rogers
2026-10-13 18:35 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 06/10] perf comm: Add __guarded_by annotations to struct comm_strs Ian Rogers
2026-10-13 18:35 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 07/10] perf dso: Fix unlocked __dsos__add() in vdso and expand lock annotations Ian Rogers
2026-10-13 18:41 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 08/10] perf thread: Expand context analysis annotations to threads and namespaces_lock Ian Rogers
2026-10-13 18:35 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 09/10] perf config, intel-tpebs, env: Add __guarded_by and __must_hold annotations Ian Rogers
2026-10-13 18:42 ` sashiko-bot
2026-10-13 18:24 ` [PATCH v1 10/10] perf maps: Add context analysis annotations Ian Rogers
2026-10-13 18:43 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 00/10] tools/perf: Adopt kernel compiler-context-analysis.h annotations Ian Rogers
2026-10-13 22:26 ` [PATCH v2 01/10] compiler-context-analysis: Avoid unused parameter warning in _context_unsafe_alias() Ian Rogers
2026-10-13 22:30 ` sashiko-bot
2026-10-14 5:38 ` Marco Elver
2026-10-13 22:26 ` [PATCH v2 02/10] tools headers compiler: Synchronize compiler_types.h with the kernel sources Ian Rogers
2026-10-13 22:36 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 03/10] tools headers: Synchronize linux/compiler-context-analysis.h " Ian Rogers
2026-10-13 22:34 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 04/10] perf mutex: Use kernel style compiler-context-analysis.h annotations Ian Rogers
2026-10-13 22:42 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 05/10] perf build: Enable additional Clang thread-safety flags Ian Rogers
2026-10-13 22:34 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 06/10] perf comm: Add __guarded_by annotations to struct comm_strs Ian Rogers
2026-10-13 22:36 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 07/10] perf dso: Fix unlocked __dsos__add() in vdso and expand lock annotations Ian Rogers
2026-10-13 22:43 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 08/10] perf thread: Expand context analysis annotations to threads and namespaces_lock Ian Rogers
2026-10-13 22:36 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 09/10] perf config, intel-tpebs, env: Add __guarded_by and __must_hold annotations Ian Rogers
2026-10-13 22:41 ` sashiko-bot
2026-10-13 22:26 ` [PATCH v2 10/10] perf maps: Add context analysis annotations Ian Rogers
2026-10-13 22:38 ` sashiko-bot
2026-10-13 22:52 ` [PATCH v2 00/10] tools/perf: Adopt kernel compiler-context-analysis.h annotations Bart Van Assche
2026-10-13 23:09 ` Ian Rogers
2026-10-13 23:18 ` Bart Van Assche
2026-10-13 23:26 ` Ian Rogers
2026-10-16 17:30 ` [PATCH v3 00/17] " Ian Rogers
2026-10-16 17:30 ` [PATCH v3 01/17] compiler-context-analysis: Avoid unused parameter warning in _context_unsafe_alias() Ian Rogers
2026-10-16 17:36 ` sashiko-bot
2026-10-16 17:30 ` [PATCH v3 02/17] tools headers compiler: Synchronize compiler_types.h with the kernel sources Ian Rogers
2026-10-16 17:30 ` [PATCH v3 03/17] tools headers: Synchronize linux/compiler-context-analysis.h " Ian Rogers
2026-10-16 17:30 ` [PATCH v3 04/17] perf mutex: Use kernel style compiler-context-analysis.h annotations Ian Rogers
2026-10-16 17:30 ` [PATCH v3 05/17] perf build: Enable additional Clang thread-safety flags Ian Rogers
2026-10-16 17:30 ` [PATCH v3 06/17] perf comm: Add __guarded_by annotations to struct comm_strs Ian Rogers
2026-10-16 17:30 ` [PATCH v3 07/17] perf vdso: Fix unlocked __dsos__add() and race in __machine__addnew_vdso() Ian Rogers
2026-10-16 17:30 ` [PATCH v3 08/17] perf dso: Pass dso_data to close_data_fd() and dso__list_del() Ian Rogers
2026-10-16 17:30 ` [PATCH v3 09/17] perf dso: Use DEFINE_MUTEX for dso__data_open_lock Ian Rogers
2026-10-16 17:30 ` [PATCH v3 10/17] perf dsos: Use read lock fast path in dsos__findnew_id() Ian Rogers
2026-10-16 17:31 ` [PATCH v3 11/17] perf dso: Expand context analysis annotations Ian Rogers
2026-10-16 17:31 ` [PATCH v3 12/17] perf thread: Expand context analysis annotations to threads and namespaces_lock Ian Rogers
2026-10-16 17:31 ` [PATCH v3 13/17] perf intel-tpebs: Fix race in tpebs_stop() and tpebs_cmd.out fd handling Ian Rogers
2026-10-16 17:31 ` [PATCH v3 14/17] perf intel-tpebs: Use DEFINE_MUTEX for tpebs_mtx Ian Rogers
2026-10-16 17:31 ` Ian Rogers [this message]
2026-10-16 17:31 ` [PATCH v3 16/17] perf maps: Fix lock inversion in maps__load_first() and bounds check in __maps__remove() Ian Rogers
2026-10-16 17:31 ` [PATCH v3 17/17] perf maps: Add context analysis annotations Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261016173106.679725-16-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=elver@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=justinstitt@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=llvm@lists.linux.dev \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=namhyung@kernel.org \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox