@@ -38,8 +38,8 @@ bpf_text += """
38
38
#define OP_NAME_LEN 6
39
39
typedef struct {
40
40
u64 ts;
41
- u64 flags;
42
41
u64 size;
42
+ u32 direction;
43
43
} iscsi_data_t;
44
44
45
45
// Key structure for scalar aggegations maps
@@ -52,7 +52,8 @@ typedef struct {
52
52
53
53
HIST_KEY(iscsi_hist_key_t, iscsi_key_t);
54
54
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);
56
57
$maps:{map|
57
58
BPF_HASH($map.name$, iscsi_key_t, $map.type$);
58
59
}$
@@ -62,15 +63,32 @@ BPF_HASH($hist.name$, iscsi_hist_key_t, u64);
62
63
63
64
// Probe functions to initialize thread local data
64
65
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)
66
67
{
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);
72
70
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);
74
92
}
75
93
76
94
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)
99
117
return 0;
100
118
}
101
119
102
- int iscsi_target_end(struct pt_regs *ctx, struct iscsi_cmd *cmd)
120
+ int
121
+ iscsi_target_end(struct pt_regs *ctx)
103
122
{
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);
122
139
}
123
-
124
140
""" # noqa: W293
125
141
b = BPF(text=bpf_text)
126
142
127
143
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")
129
146
130
147
helper = BCCHelper(b, BCCHelper.ANALYTICS_PRINT_MODE)
131
148
$maps:{map|
0 commit comments