temporary workaround for derefs on arm32 56/156456/1 submit/tizen_4.0/20171018.110122
authorAdrian Szyndela <adrian.s@samsung.com>
Wed, 18 Oct 2017 10:50:47 +0000 (12:50 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Wed, 18 Oct 2017 10:51:30 +0000 (12:51 +0200)
Change-Id: Ic3fa9045a008dfc0f6aba639bf2747ab0266d2c1

tools/dbus-connection-message-size.c
tools/dbus-latency.c
tools/dbus-message-size.c
tools/dbus-message-type.c

index 8d1a7f2..1bdc3cc 100644 (file)
@@ -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);
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;
 }
index 80e2adc..b25fb88 100644 (file)
@@ -9,7 +9,7 @@ struct data_t {
 };
 
 struct bytes_t {
-       u32 bytes;
+       u64 bytes;
 };
 
 BPF_HASH(size_sent, struct data_t, struct bytes_t)
index 7b1345e..bf79e7c 100644 (file)
@@ -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;
 }