From dc8dba8cbd94e204de4b2e308fd0c58e40dc2112 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Wed, 18 Oct 2017 12:50:47 +0200 Subject: [PATCH] temporary workaround for derefs on arm32 Change-Id: Ic3fa9045a008dfc0f6aba639bf2747ab0266d2c1 --- tools/dbus-connection-message-size.c | 22 ++++++++++++++-------- tools/dbus-latency.c | 32 ++++++++++++++++++-------------- tools/dbus-message-size.c | 2 +- tools/dbus-message-type.c | 12 +++++++----- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/tools/dbus-connection-message-size.c b/tools/dbus-connection-message-size.c index 8d1a7f2..1bdc3cc 100644 --- a/tools/dbus-connection-message-size.c +++ b/tools/dbus-connection-message-size.c @@ -63,9 +63,9 @@ struct bytes_t { int bytes; }; -BPF_HASH(g_message, struct data_t, unsigned long *) -BPF_HASH(msg_size, struct data_t, struct bytes_t) -BPF_HISTOGRAM(msg_size_hist) +BPF_HASH(g_message, struct data_t, unsigned long *); +BPF_HASH(msg_size, struct data_t, struct bytes_t); +BPF_HISTOGRAM(msg_size_hist); static int get_process_data(struct data_t *data) { data->pid = bpf_get_current_pid_tgid(); @@ -106,7 +106,8 @@ int g_get_message_size(struct pt_regs *ctx) { if (ptr_gsize == 0) { return 0; } - unsigned long *gsize = *ptr_gsize; + unsigned long *gsize = 0; + bpf_probe_read(&gsize, sizeof(gsize), ptr_gsize); unsigned long size = 0; bpf_probe_read(&size, sizeof(size), gsize); if(size > 0 && size < 1000000) { @@ -117,11 +118,16 @@ int g_get_message_size(struct pt_regs *ctx) { int dbus_message_size(struct pt_regs *ctx, void *conn, struct DBusMessage *message) { unsigned long size = 0; - if (message->header.data.len > 0) { - size += message->header.data.len; + int header_len = 0; + int body_len = 0; + + bpf_probe_read(&header_len, sizeof(header_len), (char*)message + offsetof(struct DBusMessage, header.data.len)); + if (header_len > 0) { + size += header_len; } - if (message->body.len > 0) { - size += message->body.len; + bpf_probe_read(&body_len, sizeof(body_len), (char*)message + offsetof(struct DBusMessage, body.len)); + if (body_len > 0) { + size += body_len; } if (size != 0) { message_size(size); diff --git a/tools/dbus-latency.c b/tools/dbus-latency.c index eabd22c..82f093c 100644 --- a/tools/dbus-latency.c +++ b/tools/dbus-latency.c @@ -149,7 +149,7 @@ struct DBusConnection { struct data_t { int pid; char comm[TASK_COMM_LEN]; - u32 ts; + u64 ts; }; struct header_data { @@ -168,10 +168,10 @@ struct stats_t { int max; }; -BPF_HASH(msg_sent_addr, u32 , struct data_t) -BPF_HASH(msg_latency, struct data_t , struct stats_t) -BPF_HASH(g_serial_addr, struct data_t, struct GDBusMessage *) -BPF_HISTOGRAM(latency_histo) +BPF_HASH(msg_sent_addr, u32 , struct data_t); +BPF_HASH(msg_latency, struct data_t , struct stats_t); +BPF_HASH(g_serial_addr, struct data_t, struct GDBusMessage *); +BPF_HISTOGRAM(latency_histo); static void get_process_data(struct data_t *data) { data->pid = bpf_get_current_pid_tgid(); @@ -224,27 +224,31 @@ static int get_delay(int serial, struct data_t receiver_data) { int get_msg_addr(struct pt_regs *ctx, struct DBusConnection *conn, struct DBusMessage *msg){ struct data_t data = {}; get_process_data(&data); - struct header_data *header = msg->header.data.str; - u32 serial = header->serial; + struct header_data *header = 0; + bpf_probe_read(&header, sizeof(header), (char*)msg + offsetof(struct DBusMessage, header.data.str)); + u32 serial = 0; + bpf_probe_read(&serial, sizeof(serial), (char*)header + offsetof(struct header_data, serial)); msg_sent_addr.update(&serial,&data); return 0; } int get_msg_latency(struct pt_regs *ctx, struct DBusConnection *conn) { struct data_t receiver_data = {}; - struct DBusMessage *msg; - struct header_data *header; - int serial; - struct DBusList *link = conn->incoming_messages; + struct DBusMessage *msg = 0; + struct header_data *header = 0; + int serial = 0; + struct DBusList *link = 0; + + bpf_probe_read(&link, sizeof(link), (char *)conn + offsetof(struct DBusConnection, incoming_messages)); if (link == 0) { return 0; } get_process_data(&receiver_data); - msg = conn->incoming_messages->data; - header = msg->header.data.str; - serial = header->serial; + bpf_probe_read(&msg, sizeof(msg), (char *)link + offsetof(struct DBusList, data)); + bpf_probe_read(&header, sizeof(header), (char*)msg + offsetof(struct DBusMessage, header.data.str)); + bpf_probe_read(&serial, sizeof(serial), (char*)header + offsetof(struct header_data, serial)); get_delay(serial, receiver_data); return 0; } diff --git a/tools/dbus-message-size.c b/tools/dbus-message-size.c index 80e2adc..b25fb88 100644 --- a/tools/dbus-message-size.c +++ b/tools/dbus-message-size.c @@ -9,7 +9,7 @@ struct data_t { }; struct bytes_t { - u32 bytes; + u64 bytes; }; BPF_HASH(size_sent, struct data_t, struct bytes_t) diff --git a/tools/dbus-message-type.c b/tools/dbus-message-type.c index 7b1345e..bf79e7c 100644 --- a/tools/dbus-message-type.c +++ b/tools/dbus-message-type.c @@ -136,8 +136,8 @@ struct data_t { char comm[TASK_COMM_LEN]; }; -BPF_HASH(message, struct data_t, int) -BPF_HISTOGRAM(msg_type, int) +BPF_HASH(message, struct data_t, int); +BPF_HISTOGRAM(msg_type, int); int g_get_message_type(struct pt_regs *ctx, void *conn, struct GDBusMessage *message) { msg_type.increment(message->type); @@ -150,8 +150,10 @@ int dbus_get_message_type(struct pt_regs *ctx, void *conn, struct DBusMessage *m } int message_type(struct pt_regs *ctx, void *conn, struct DBusMessage *message) { - const char *c = message->header.data.str; - c++; - msg_type.increment(*c); + char *addr = 0; + bpf_probe_read(&addr, sizeof(addr), (char*)message + offsetof(struct DBusMessage, header.data.str)); + char type; + bpf_probe_read(&type, sizeof(type), addr + 1); + msg_type.increment(type); return 0; } -- 2.7.4