Skip to content

Commit

Permalink
perf machine: Move machine's threads into its own abstraction
Browse files Browse the repository at this point in the history
Move thread_rb_node into the machine.c file. This hides the
implementation of threads from the rest of the code allowing for it to
be refactored.

Locking discipline is tightened up in this change. As the lock is now
encapsulated in threads, the findnew function requires holding it (as
it already did in machine). Rather than do conditionals with locks
based on whether the thread should be created (which could potentially
be error prone with a read lock match with a write unlock), have a
separate threads__find that won't create the thread and only holds the
read lock. This effectively duplicates the findnew logic, with the
existing findnew logic only operating under a write lock assuming
creation is necessary as a previous find failed. The creation may
still fail with the write lock due to another thread. The duplication
is removed in a later next patch that delegates the implementation to
hashtable.

Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Yang Jihong <yangjihong1@huawei.com>
Cc: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240301053646.1449657-5-irogers@google.com
  • Loading branch information
Ian Rogers authored and Namhyung Kim committed Mar 4, 2024
1 parent 45ac496 commit d436f90
Show file tree
Hide file tree
Showing 5 changed files with 243 additions and 203 deletions.
4 changes: 2 additions & 2 deletions tools/perf/util/bpf_lock_contention.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ static const char *lock_contention_get_name(struct lock_contention *con,

/* do not update idle comm which contains CPU number */
if (pid) {
struct thread *t = __machine__findnew_thread(machine, /*pid=*/-1, pid);
struct thread *t = machine__findnew_thread(machine, /*pid=*/-1, pid);

if (t == NULL)
return name;
Expand Down Expand Up @@ -422,7 +422,7 @@ int lock_contention_read(struct lock_contention *con)
account_end_timestamp(con);

if (con->aggr_mode == LOCK_AGGR_TASK) {
struct thread *idle = __machine__findnew_thread(machine,
struct thread *idle = machine__findnew_thread(machine,
/*pid=*/0,
/*tid=*/0);
thread__set_comm(idle, "swapper", /*timestamp=*/0);
Expand Down
Loading

0 comments on commit d436f90

Please sign in to comment.