temporary workaround for derefs on arm32
[platform/upstream/bcc.git] / tools / dbus-latency.c
index eabd22c..82f093c 100644 (file)
@@ -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;
 }