Skip to content

Commit a23ac2d

Browse files
Geliang Tangmatttbe
authored andcommitted
mptcp: add sched_data helpers
Add a new helper mptcp_sched_data_set_contexts() to set the subflow pointers array in struct mptcp_sched_data. Add a new helper mptcp_subflow_ctx_by_pos() to get the given pos subflow from the contexts array in struct mptcp_sched_data. They will be invoked by the BPF schedulers to export the subflow pointers to the BPF contexts. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> Reviewed-by: Mat Martineau <martineau@kernel.org>
1 parent dbc0995 commit a23ac2d

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

net/mptcp/bpf.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,14 @@ __bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk)
114114
WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
115115
}
116116

117+
__bpf_kfunc struct mptcp_subflow_context *
118+
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
119+
{
120+
if (pos >= MPTCP_SUBFLOWS_MAX)
121+
return NULL;
122+
return data->contexts[pos];
123+
}
124+
117125
__bpf_kfunc_end_defs();
118126

119127
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)

net/mptcp/protocol.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,8 @@ void __mptcp_subflow_send_ack(struct sock *ssk);
713713
void mptcp_subflow_reset(struct sock *ssk);
714714
void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
715715
void mptcp_sock_graft(struct sock *sk, struct socket *parent);
716+
struct mptcp_subflow_context *
717+
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
716718
struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
717719
bool __mptcp_close(struct sock *sk, long timeout);
718720
void mptcp_cancel_work(struct sock *sk);

net/mptcp/sched.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,26 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
141141
WRITE_ONCE(subflow->scheduled, scheduled);
142142
}
143143

144+
static void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
145+
struct mptcp_sched_data *data)
146+
{
147+
struct mptcp_subflow_context *subflow;
148+
int i = 0;
149+
150+
mptcp_for_each_subflow(msk, subflow) {
151+
if (i == MPTCP_SUBFLOWS_MAX) {
152+
pr_warn_once("too many subflows");
153+
break;
154+
}
155+
mptcp_subflow_set_scheduled(subflow, false);
156+
data->contexts[i++] = subflow;
157+
}
158+
data->subflows = i;
159+
160+
for (; i < MPTCP_SUBFLOWS_MAX; i++)
161+
data->contexts[i] = NULL;
162+
}
163+
144164
int mptcp_sched_get_send(struct mptcp_sock *msk)
145165
{
146166
struct mptcp_subflow_context *subflow;
@@ -167,6 +187,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
167187
data.reinject = false;
168188
if (msk->sched == &mptcp_sched_default || !msk->sched)
169189
return mptcp_sched_default_get_subflow(msk, &data);
190+
mptcp_sched_data_set_contexts(msk, &data);
170191
return msk->sched->get_subflow(msk, &data);
171192
}
172193

@@ -189,5 +210,6 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
189210
data.reinject = true;
190211
if (msk->sched == &mptcp_sched_default || !msk->sched)
191212
return mptcp_sched_default_get_subflow(msk, &data);
213+
mptcp_sched_data_set_contexts(msk, &data);
192214
return msk->sched->get_subflow(msk, &data);
193215
}

0 commit comments

Comments
 (0)