@@ -38,8 +38,8 @@ bpf_text += """
3838#define OP_NAME_LEN 6
3939typedef struct {
4040 u64 ts;
41- u64 flags;
4241 u64 size;
42+ u32 direction;
4343} iscsi_data_t;
4444
4545// Key structure for scalar aggegations maps
@@ -52,7 +52,8 @@ typedef struct {
5252
5353HIST_KEY(iscsi_hist_key_t, iscsi_key_t);
5454
55- BPF_HASH(iscsi_base_data, u64, iscsi_data_t);
55+ BPF_HASH(iscsi_start_ts, u64, u64);
56+ BPF_HASH(iscsi_base_data, u32, iscsi_data_t);
5657$maps:{map|
5758BPF_HASH($map.name$, iscsi_key_t, $map.type$);
5859}$
@@ -64,13 +65,31 @@ BPF_HASH($hist.name$, iscsi_hist_key_t, u64);
6465int iscsi_target_start(struct pt_regs *ctx, struct iscsi_conn *conn,
6566 struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr)
6667{
67- iscsi_data_t data = {};
68- data.ts = bpf_ktime_get_ns();
69- data.flags = hdr->flags;
70- data.size = hdr->data_length;
71- iscsi_base_data.update((u64 *) &cmd, &data);
68+ u64 ts = bpf_ktime_get_ns();
69+ iscsi_start_ts.update((u64 *) &cmd, &ts);
7270
73- return 0;
71+ return (0);
72+ }
73+
74+ int iscsi_target_response(struct pt_regs *ctx, struct iscsi_conn *conn,
75+ struct iscsi_cmd *cmd, int state)
76+ {
77+ u32 tid = bpf_get_current_pid_tgid();
78+ iscsi_data_t data = {};
79+
80+ u64 *tsp = iscsi_start_ts.lookup((u64 *) &cmd);
81+ if (tsp == 0) {
82+ return (0); // missed issue
83+ }
84+
85+ data.ts = *tsp;
86+ data.size = cmd->se_cmd.data_length;
87+ data.direction = cmd->data_direction;
88+
89+ iscsi_base_data.update(&tid, &data);
90+ iscsi_start_ts.delete((u64 *) &cmd);
91+
92+ return (0);
7493}
7594
7695static int aggregate_data(iscsi_data_t *data, u64 ts, char *opstr)
@@ -99,33 +118,31 @@ static int aggregate_data(iscsi_data_t *data, u64 ts, char *opstr)
99118 return 0;
100119}
101120
102- int iscsi_target_end(struct pt_regs *ctx, struct iscsi_cmd *cmd )
121+ int iscsi_target_end(struct pt_regs *ctx)
103122{
104- u64 ts = bpf_ktime_get_ns();
105- iscsi_data_t *data = iscsi_base_data.lookup((u64 *) &cmd);
106- u64 delta;
107- iscsi_key_t key = {};
108- char *opstr;
109-
110- if (data == 0) {
111- return 0; // missed issue
112- }
113-
114- if (data->flags & ISCSI_FLAG_CMD_READ) {
115- aggregate_data(data, ts, READ_STR);
116- } else if (data->flags & ISCSI_FLAG_CMD_WRITE) {
117- aggregate_data(data, ts, WRITE_STR);
118- }
119- iscsi_base_data.delete((u64 *) &cmd);
120-
121- return 0;
123+ u64 ts = bpf_ktime_get_ns();
124+ u32 tid = bpf_get_current_pid_tgid();
125+ iscsi_data_t *data = iscsi_base_data.lookup(&tid);
126+
127+ if (data == 0) {
128+ return (0); // missed issue
129+ }
130+
131+ if (data->direction == DMA_FROM_DEVICE) {
132+ aggregate_data(data, ts, READ_STR);
133+ } else if (data->direction == DMA_TO_DEVICE) {
134+ aggregate_data(data, ts, WRITE_STR);
135+ }
136+ iscsi_base_data.delete(&tid);
137+
138+ return (0);
122139}
123-
124140""" # noqa: W293
125141b = BPF(text=bpf_text)
126142
127143b.attach_kprobe(event="iscsit_process_scsi_cmd", fn_name="iscsi_target_start")
128- b.attach_kprobe(event="iscsit_build_rsp_pdu", fn_name="iscsi_target_end")
144+ b.attach_kprobe(event="iscsit_response_queue", fn_name="iscsi_target_response")
145+ b.attach_kretprobe(event="iscsit_response_queue", fn_name="iscsi_target_end")
129146
130147helper = BCCHelper(b, BCCHelper.ANALYTICS_PRINT_MODE)
131148$maps:{map|
0 commit comments