perf lock contention: Add lock_data.h for common data

Accessing BPF maps should use the same data types.  Add bpf_skel/lock_data.h
to define the common data structures.  No functional changes.

Committer notes:

Fixed contention_key.stack_id missing rename to contention_key.stack_or_task_id.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Blake Jones <blakejones@google.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <song@kernel.org>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20221209190727.759804-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Namhyung Kim 2022-12-09 11:07:24 -08:00 committed by Arnaldo Carvalho de Melo
parent 3cad53a6f9
commit fd507d3e35
3 changed files with 39 additions and 29 deletions

View File

@ -12,17 +12,10 @@
#include <bpf/bpf.h>
#include "bpf_skel/lock_contention.skel.h"
#include "bpf_skel/lock_data.h"
static struct lock_contention_bpf *skel;
struct lock_contention_data {
u64 total_time;
u64 min_time;
u64 max_time;
u32 count;
u32 flags;
};
int lock_contention_prepare(struct lock_contention *con)
{
int i, fd;
@ -110,8 +103,8 @@ int lock_contention_stop(void)
int lock_contention_read(struct lock_contention *con)
{
int fd, stack, err = 0;
s32 prev_key, key;
struct lock_contention_data data = {};
struct contention_key *prev_key, key;
struct contention_data data = {};
struct lock_stat *st = NULL;
struct machine *machine = con->machine;
u64 *stack_trace;
@ -126,8 +119,8 @@ int lock_contention_read(struct lock_contention *con)
if (stack_trace == NULL)
return -1;
prev_key = 0;
while (!bpf_map_get_next_key(fd, &prev_key, &key)) {
prev_key = NULL;
while (!bpf_map_get_next_key(fd, prev_key, &key)) {
struct map *kmap;
struct symbol *sym;
int idx = 0;
@ -184,7 +177,7 @@ int lock_contention_read(struct lock_contention *con)
}
hlist_add_head(&st->hash_entry, con->result);
prev_key = key;
prev_key = &key;
/* we're fine now, reset the values */
st = NULL;

View File

@ -5,24 +5,11 @@
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>
/* maximum stack trace depth */
#define MAX_STACKS 8
#include "lock_data.h"
/* default buffer size */
#define MAX_ENTRIES 10240
struct contention_key {
__s32 stack_id;
};
struct contention_data {
__u64 total_time;
__u64 min_time;
__u64 max_time;
__u32 count;
__u32 flags;
};
struct tstamp_data {
__u64 timestamp;
__u64 lock;
@ -34,7 +21,7 @@ struct tstamp_data {
struct {
__uint(type, BPF_MAP_TYPE_STACK_TRACE);
__uint(key_size, sizeof(__u32));
__uint(value_size, MAX_STACKS * sizeof(__u64));
__uint(value_size, sizeof(__u64));
__uint(max_entries, MAX_ENTRIES);
} stacks SEC(".maps");
@ -154,7 +141,7 @@ int contention_end(u64 *ctx)
duration = bpf_ktime_get_ns() - pelem->timestamp;
key.stack_id = pelem->stack_id;
key.stack_or_task_id = pelem->stack_id;
data = bpf_map_lookup_elem(&lock_stat, &key);
if (!data) {
struct contention_data first = {

View File

@ -0,0 +1,30 @@
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/* Data structures shared between BPF and tools. */
#ifndef UTIL_BPF_SKEL_LOCK_DATA_H
#define UTIL_BPF_SKEL_LOCK_DATA_H
struct contention_key {
s32 stack_or_task_id;
};
#define TASK_COMM_LEN 16
struct contention_task_data {
char comm[TASK_COMM_LEN];
};
struct contention_data {
u64 total_time;
u64 min_time;
u64 max_time;
u32 count;
u32 flags;
};
enum lock_aggr_mode {
LOCK_AGGR_ADDR = 0,
LOCK_AGGR_TASK,
LOCK_AGGR_CALLER,
};
#endif /* UTIL_BPF_SKEL_LOCK_DATA_H */