Skip to content

Commit 7a1656a

Browse files
authored
DLPX-78745 Apply estat iscsi approach to stbtrace script (#72)
1 parent 729786d commit 7a1656a

File tree

1 file changed

+46
-29
lines changed

1 file changed

+46
-29
lines changed

bpf/stbtrace/iscsi.st

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ bpf_text += """
3838
#define OP_NAME_LEN 6
3939
typedef 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

5353
HIST_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|
5758
BPF_HASH($map.name$, iscsi_key_t, $map.type$);
5859
}$
@@ -64,13 +65,31 @@ BPF_HASH($hist.name$, iscsi_hist_key_t, u64);
6465
int 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

7695
static 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
125141
b = BPF(text=bpf_text)
126142

127143
b.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

130147
helper = BCCHelper(b, BCCHelper.ANALYTICS_PRINT_MODE)
131148
$maps:{map|

0 commit comments

Comments
 (0)