Skip to content

Commit 2eb9331

Browse files
committed
Apply estat iscsi approach to stbtrace script
1 parent 5cb1777 commit 2eb9331

File tree

1 file changed

+47
-30
lines changed

1 file changed

+47
-30
lines changed

bpf/stbtrace/iscsi.st

Lines changed: 47 additions & 30 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
}$
@@ -62,15 +63,32 @@ BPF_HASH($hist.name$, iscsi_hist_key_t, u64);
6263

6364
// Probe functions to initialize thread local data
6465
int iscsi_target_start(struct pt_regs *ctx, struct iscsi_conn *conn,
65-
struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr)
66+
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, struct iscsi_cmd *cmd, int state)
75+
{
76+
u32 tid = bpf_get_current_pid_tgid();
77+
iscsi_data_t data = {};
78+
79+
u64 *tsp = iscsi_start_ts.lookup((u64 *) &cmd);
80+
if (tsp == 0) {
81+
return (0); // missed issue
82+
}
83+
84+
data.ts = *tsp;
85+
data.size = cmd->se_cmd.data_length;
86+
data.direction = cmd->data_direction;
87+
88+
iscsi_base_data.update(&tid, &data);
89+
iscsi_start_ts.delete((u64 *) &cmd);
90+
91+
return (0);
7492
}
7593

7694
static int aggregate_data(iscsi_data_t *data, u64 ts, char *opstr)
@@ -99,33 +117,32 @@ static int aggregate_data(iscsi_data_t *data, u64 ts, char *opstr)
99117
return 0;
100118
}
101119

102-
int iscsi_target_end(struct pt_regs *ctx, struct iscsi_cmd *cmd)
120+
int
121+
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)