Skip to content

Commit 73f3c68

Browse files
Geliang Tangintel-lab-lkp
authored andcommitted
Squash to "selftests/bpf: Add bpf_burst scheduler & test"
Use the newly added bpf_for_each() helper to walk the conn_list. Use bpf_mptcp_send_info_to_ssk() helper. Drop bpf_subflow_send_info, use subflow_send_info instead. Signed-off-by: Geliang Tang <[email protected]>
1 parent 08c8de8 commit 73f3c68

File tree

1 file changed

+21
-33
lines changed

1 file changed

+21
-33
lines changed

tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ char _license[] SEC("license") = "GPL";
1111

1212
#define min(a, b) ((a) < (b) ? (a) : (b))
1313

14-
struct bpf_subflow_send_info {
15-
__u8 subflow_id;
16-
__u64 linger_time;
17-
};
18-
1914
extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
2015
extern void mptcp_set_timeout(struct sock *sk) __ksym;
2116
extern __u64 mptcp_wnd_end(const struct mptcp_sock *msk) __ksym;
@@ -70,7 +65,7 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
7065
static int bpf_burst_get_send(struct mptcp_sock *msk,
7166
struct mptcp_sched_data *data)
7267
{
73-
struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
68+
struct subflow_send_info send_info[SSK_MODE_MAX];
7469
struct mptcp_subflow_context *subflow;
7570
struct sock *sk = (struct sock *)msk;
7671
__u32 pace, burst, wmem;
@@ -80,17 +75,13 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
8075

8176
/* pick the subflow with the lower wmem/wspace ratio */
8277
for (i = 0; i < SSK_MODE_MAX; ++i) {
83-
send_info[i].subflow_id = MPTCP_SUBFLOWS_MAX;
78+
send_info[i].ssk = NULL;
8479
send_info[i].linger_time = -1;
8580
}
8681

87-
for (i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
82+
bpf_for_each(mptcp_subflow, subflow, msk) {
8883
bool backup;
8984

90-
subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
91-
if (!subflow)
92-
break;
93-
9485
backup = subflow->backup || subflow->request_bkup;
9586

9687
ssk = mptcp_subflow_tcp_sock(subflow);
@@ -109,23 +100,24 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
109100

110101
linger_time = div_u64((__u64)ssk->sk_wmem_queued << 32, pace);
111102
if (linger_time < send_info[backup].linger_time) {
112-
send_info[backup].subflow_id = i;
103+
send_info[backup].ssk = ssk;
113104
send_info[backup].linger_time = linger_time;
114105
}
115106
}
116107
mptcp_set_timeout(sk);
117108

118109
/* pick the best backup if no other subflow is active */
119110
if (!nr_active)
120-
send_info[SSK_MODE_ACTIVE].subflow_id = send_info[SSK_MODE_BACKUP].subflow_id;
111+
send_info[SSK_MODE_ACTIVE].ssk = send_info[SSK_MODE_BACKUP].ssk;
121112

122-
subflow = bpf_mptcp_subflow_ctx_by_pos(data, send_info[SSK_MODE_ACTIVE].subflow_id);
123-
if (!subflow)
124-
return -1;
125-
ssk = mptcp_subflow_tcp_sock(subflow);
113+
ssk = bpf_mptcp_send_info_to_ssk(&send_info[SSK_MODE_ACTIVE]);
126114
if (!ssk || !sk_stream_memory_free(ssk))
127115
return -1;
128116

117+
subflow = bpf_mptcp_subflow_ctx(ssk);
118+
if (!subflow)
119+
return -1;
120+
129121
burst = min(MPTCP_SEND_BURST_SIZE, mptcp_wnd_end(msk) - msk->snd_nxt);
130122
wmem = ssk->sk_wmem_queued;
131123
if (!burst)
@@ -144,16 +136,12 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
144136
static int bpf_burst_get_retrans(struct mptcp_sock *msk,
145137
struct mptcp_sched_data *data)
146138
{
147-
int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
139+
struct sock *backup = NULL, *pick = NULL;
148140
struct mptcp_subflow_context *subflow;
149141
int min_stale_count = INT_MAX;
150142
struct sock *ssk;
151143

152-
for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
153-
subflow = bpf_mptcp_subflow_ctx_by_pos(data, i);
154-
if (!subflow)
155-
break;
156-
144+
bpf_for_each(mptcp_subflow, subflow, msk) {
157145
if (!mptcp_subflow_active(subflow))
158146
continue;
159147

@@ -166,23 +154,23 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
166154
}
167155

168156
if (subflow->backup || subflow->request_bkup) {
169-
if (backup == MPTCP_SUBFLOWS_MAX)
170-
backup = i;
157+
if (!backup)
158+
backup = ssk;
171159
continue;
172160
}
173161

174-
if (pick == MPTCP_SUBFLOWS_MAX)
175-
pick = i;
162+
if (!pick)
163+
pick = ssk;
176164
}
177165

178-
if (pick < MPTCP_SUBFLOWS_MAX) {
179-
subflow_id = pick;
166+
if (pick)
180167
goto out;
181-
}
182-
subflow_id = min_stale_count > 1 ? backup : MPTCP_SUBFLOWS_MAX;
168+
pick = min_stale_count > 1 ? backup : NULL;
183169

184170
out:
185-
subflow = bpf_mptcp_subflow_ctx_by_pos(data, subflow_id);
171+
if (!pick)
172+
return -1;
173+
subflow = bpf_mptcp_subflow_ctx(pick);
186174
if (!subflow)
187175
return -1;
188176
mptcp_subflow_set_scheduled(subflow, true);

0 commit comments

Comments
 (0)