struct data_t {
int pid;
char comm[TASK_COMM_LEN];
- u32 ts;
+ u64 ts;
};
struct header_data {
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();
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;
}