Commit 3059303f authored by Alexei Starovoitov's avatar Alexei Starovoitov Committed by David S. Miller

samples/bpf: update tracex[23] examples to use per-cpu maps

Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent df570f57
...@@ -70,7 +70,7 @@ struct hist_key { ...@@ -70,7 +70,7 @@ struct hist_key {
}; };
struct bpf_map_def SEC("maps") my_hist_map = { struct bpf_map_def SEC("maps") my_hist_map = {
.type = BPF_MAP_TYPE_HASH, .type = BPF_MAP_TYPE_PERCPU_HASH,
.key_size = sizeof(struct hist_key), .key_size = sizeof(struct hist_key),
.value_size = sizeof(long), .value_size = sizeof(long),
.max_entries = 1024, .max_entries = 1024,
......
...@@ -37,6 +37,8 @@ struct hist_key { ...@@ -37,6 +37,8 @@ struct hist_key {
static void print_hist_for_pid(int fd, void *task) static void print_hist_for_pid(int fd, void *task)
{ {
struct hist_key key = {}, next_key; struct hist_key key = {}, next_key;
unsigned int nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
long values[nr_cpus];
char starstr[MAX_STARS]; char starstr[MAX_STARS];
long value; long value;
long data[MAX_INDEX] = {}; long data[MAX_INDEX] = {};
...@@ -49,7 +51,10 @@ static void print_hist_for_pid(int fd, void *task) ...@@ -49,7 +51,10 @@ static void print_hist_for_pid(int fd, void *task)
key = next_key; key = next_key;
continue; continue;
} }
bpf_lookup_elem(fd, &next_key, &value); bpf_lookup_elem(fd, &next_key, values);
value = 0;
for (i = 0; i < nr_cpus; i++)
value += values[i];
ind = next_key.index; ind = next_key.index;
data[ind] = value; data[ind] = value;
if (value && ind > max_ind) if (value && ind > max_ind)
......
...@@ -20,7 +20,7 @@ struct bpf_map_def SEC("maps") my_map = { ...@@ -20,7 +20,7 @@ struct bpf_map_def SEC("maps") my_map = {
/* kprobe is NOT a stable ABI. If kernel internals change this bpf+kprobe /* kprobe is NOT a stable ABI. If kernel internals change this bpf+kprobe
* example will no longer be meaningful * example will no longer be meaningful
*/ */
SEC("kprobe/blk_mq_start_request") SEC("kprobe/blk_start_request")
int bpf_prog1(struct pt_regs *ctx) int bpf_prog1(struct pt_regs *ctx)
{ {
long rq = PT_REGS_PARM1(ctx); long rq = PT_REGS_PARM1(ctx);
...@@ -42,13 +42,13 @@ static unsigned int log2l(unsigned long long n) ...@@ -42,13 +42,13 @@ static unsigned int log2l(unsigned long long n)
#define SLOTS 100 #define SLOTS 100
struct bpf_map_def SEC("maps") lat_map = { struct bpf_map_def SEC("maps") lat_map = {
.type = BPF_MAP_TYPE_ARRAY, .type = BPF_MAP_TYPE_PERCPU_ARRAY,
.key_size = sizeof(u32), .key_size = sizeof(u32),
.value_size = sizeof(u64), .value_size = sizeof(u64),
.max_entries = SLOTS, .max_entries = SLOTS,
}; };
SEC("kprobe/blk_update_request") SEC("kprobe/blk_account_io_completion")
int bpf_prog2(struct pt_regs *ctx) int bpf_prog2(struct pt_regs *ctx)
{ {
long rq = PT_REGS_PARM1(ctx); long rq = PT_REGS_PARM1(ctx);
...@@ -81,7 +81,7 @@ int bpf_prog2(struct pt_regs *ctx) ...@@ -81,7 +81,7 @@ int bpf_prog2(struct pt_regs *ctx)
value = bpf_map_lookup_elem(&lat_map, &index); value = bpf_map_lookup_elem(&lat_map, &index);
if (value) if (value)
__sync_fetch_and_add((long *)value, 1); *value += 1;
return 0; return 0;
} }
......
...@@ -20,11 +20,13 @@ ...@@ -20,11 +20,13 @@
static void clear_stats(int fd) static void clear_stats(int fd)
{ {
unsigned int nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
__u64 values[nr_cpus];
__u32 key; __u32 key;
__u64 value = 0;
memset(values, 0, sizeof(values));
for (key = 0; key < SLOTS; key++) for (key = 0; key < SLOTS; key++)
bpf_update_elem(fd, &key, &value, BPF_ANY); bpf_update_elem(fd, &key, values, BPF_ANY);
} }
const char *color[] = { const char *color[] = {
...@@ -75,15 +77,20 @@ static void print_banner(void) ...@@ -75,15 +77,20 @@ static void print_banner(void)
static void print_hist(int fd) static void print_hist(int fd)
{ {
__u32 key; unsigned int nr_cpus = sysconf(_SC_NPROCESSORS_CONF);
__u64 value;
__u64 cnt[SLOTS];
__u64 max_cnt = 0;
__u64 total_events = 0; __u64 total_events = 0;
long values[nr_cpus];
__u64 max_cnt = 0;
__u64 cnt[SLOTS];
__u64 value;
__u32 key;
int i;
for (key = 0; key < SLOTS; key++) { for (key = 0; key < SLOTS; key++) {
bpf_lookup_elem(fd, &key, values);
value = 0; value = 0;
bpf_lookup_elem(fd, &key, &value); for (i = 0; i < nr_cpus; i++)
value += values[i];
cnt[key] = value; cnt[key] = value;
total_events += value; total_events += value;
if (value > max_cnt) if (value > max_cnt)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment