All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-next v2 0/9] split get_subflow interface into two
@ 2024-12-23  8:30 Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 1/9] mptcp: " Geliang Tang
                   ` (12 more replies)
  0 siblings, 13 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

v2:
 - use get_send for retransmit scheduling if get_retrans is NULL as Mat
   suggested (thanks)

I got the following error when running bpf burst sched selftests in auto-btf-debug mode:

[  167.258293][   T49] BUG: sleeping function called from invalid context at net/core/sock.c:3652
[  167.258981][   T49] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 49, name: kworker/0:2
[  167.259547][   T49] preempt_count: 0, expected: 0
[  167.259826][   T49] RCU nest depth: 1, expected: 0
[  167.259975][   T49] 5 locks held by kworker/0:2/49:
[  167.260137][   T49]  #0: ffff888001130948 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work+0x7e4/0x16b0
[  167.260741][   T49]  #1: ffffc90000347d90 ((work_completion)(&msk->work)){+.+.}-{0:0}, at: process_one_work+0xdf9/0x16b0
[  167.261206][   T49]  #2: ffff88800c620e58 (sk_lock-AF_INET){+.+.}-{0:0}, at: mptcp_worker+0x7b/0xad0
[  167.261476][   T49]  #3: ffffffff8977e620 (rcu_read_lock){....}-{1:2}, at: __bpf_prog_enter+0x1f/0x170
[  167.261742][   T49]  #4: ffff88800b6f8258 (k-sk_lock-AF_INET#2){+.+.}-{0:0}, at: bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
[  167.262309][   T49] CPU: 0 UID: 0 PID: 49 Comm: kworker/0:2 Tainted: G           OE      6.12.0-rc6+ #9
[  167.262591][   T49] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[  167.262774][   T49] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[  167.262950][   T49] Workqueue: events mptcp_worker
[  167.263097][   T49] Call Trace:
[  167.263211][   T49]  <TASK>
[  167.263301][   T49]  dump_stack_lvl+0x9e/0xe0
[  167.263453][   T49]  __might_resched+0x35d/0x590
[  167.263599][   T49]  ? __pfx___might_resched+0x10/0x10
[  167.263829][   T49]  __lock_sock_fast+0x2f/0xd0
[  167.264035][   T49]  mptcp_pm_nl_subflow_chk_stale+0x1e2/0x3c0
[  167.264304][   T49]  ? bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
[  167.264604][   T49]  bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
[  167.264995][   T49]  ? mptcp_sched_get_retrans+0x1f8/0x330
[  167.265215][   T49]  ? __pfx_mptcp_sched_get_retrans+0x10/0x10
[  167.265432][   T49]  ? mark_lock+0x371/0x3c0
[  167.265678][   T49]  ? __mptcp_retrans+0xf4/0x9a0
[  167.265973][   T49]  ? mptcp_worker+0x7b/0xad0

mptcp_pm_subflow_chk_stale is a sleeping function, it shouldn't be
invoked under BPF rcu_read_lock.

One solution is to set mptcp_pm_subflow_chk_stale with KF_SLEEPABLE
flag:

BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE)

Then set bpf_burst_get_subflow with BPF_F_SLEEPABLE:

      err = bpf_program__set_flags(skel->progs.bpf_burst_get_subflow,
                                   BPF_F_SLEEPABLE);

But another error ocurrs:

[  101.732098][    C0] BUG: sleeping function called from invalid context at kernel/bpf/trampoline.c:968
[  101.732781][    C0] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1640, name: test_progs-no_a
[  101.733477][    C0] preempt_count: 303, expected: 0
[  101.733793][    C0] RCU nest depth: 2, expected: 0
[  101.734043][    C0] 6 locks held by test_progs-no_a/1640:
[  101.734187][    C0] #0: ffff888007526e58 (sk_lock-AF_INET){+.+.}-{0:0}, at: sk_wait_data (net/core/sock.c:3131 (discriminator 2)) 
[  101.734440][    C0] #1: ffffffff95b7e620 (rcu_read_lock){....}-{1:2}, at: process_backlog (include/linux/local_lock_internal.h:38 (discriminator 1) net/core/dev.c:6115 (discriminator 1)) 
[  101.734728][    C0] #2: ffffffff95b7e620 (rcu_read_lock){....}-{1:2}, at: ip_local_deliver_finish (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) net/ipv4/ip_input.c:232 (discriminator 1)) 
[  101.735103][    C0] #3: ffff888008eb8e58 (k-slock-AF_INET/1){+.-.}-{2:2}, at: tcp_v4_rcv (include/linux/skbuff.h:1670 include/net/tcp.h:2530 net/ipv4/tcp_ipv4.c:2348) 
[  101.735560][    C0] #4: ffff8880075261d8 (slock-AF_INET){+.-.}-{2:2}, at: mptcp_incoming_options (net/mptcp/options.c:1053 net/mptcp/options.c:1203) 
[  101.736023][    C0] #5: ffffffff95b7d980 (rcu_read_lock_trace){....}-{0:0}, at: __bpf_prog_enter_sleepable (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate_trace.h:57 (discriminator 1) kernel/bpf/trampoline.c:966 (discriminator 1)) 
[  101.736325][    C0] CPU: 0 UID: 0 PID: 1640 Comm: test_progs-no_a Tainted: G           OE      6.12.0-rc7+ #5
[  101.736676][    C0] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[  101.736940][    C0] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[  101.737146][    C0] Call Trace:
[  101.737259][    C0]  <IRQ>
[  101.737331][    C0] dump_stack_lvl (lib/dump_stack.c:123) 
[  101.737489][    C0] __might_resched (kernel/sched/core.c:8657) 
[  101.737625][    C0] ? __lock_acquire (kernel/locking/lockdep.c:5202 (discriminator 1)) 
[  101.737772][    C0] ? __pfx___might_resched (kernel/sched/core.c:8611) 
[  101.737919][    C0] __might_fault (mm/memory.c:6715 (discriminator 1)) 
[  101.738051][    C0] __bpf_prog_enter_sleepable (include/linux/bpf.h:2089 (discriminator 1) kernel/bpf/trampoline.c:970 (discriminator 1)) 
[  101.738195][    C0] ? __bpf_prog_enter_sleepable (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate_trace.h:57 (discriminator 1) kernel/bpf/trampoline.c:966 (discriminator 1)) 
[  101.738357][    C0] ? mptcp_sched_get_send (net/mptcp/sched.c:183) 
[  101.738511][    C0] ? __pfx_mptcp_sched_get_send (net/mptcp/sched.c:158) 
[  101.738641][    C0] ? __bpf_tramp_enter (include/linux/rcupdate.h:347 (discriminator 1) include/linux/rcupdate.h:880 (discriminator 1) include/linux/percpu-refcount.h:209 (discriminator 1) include/linux/percpu-refcount.h:222 (discriminator 1) kernel/bpf/trampoline.c:1010 (discriminator 1)) 
[  101.738774][    C0] ? bpf_trampoline_6442561300+0x31/0xd7 
[  101.738911][    C0] ? mptcp_sched_get_send (net/mptcp/sched.c:158) 
[  101.739067][    C0] ? __mptcp_subflow_push_pending (net/mptcp/protocol.c:1682 (discriminator 1)) 
[  101.739231][    C0] ? __pfx___mptcp_subflow_push_pending (net/mptcp/protocol.c:1655) 
[  101.739378][    C0] ? do_raw_spin_lock (arch/x86/include/asm/atomic.h:107 (discriminator 1) include/linux/atomic/atomic-arch-fallback.h:2170 (discriminator 1) include/linux/atomic/atomic-instrumented.h:1302 (discriminator 1) include/asm-generic/qspinlock.h:111 (discriminator 1) kernel/locking/spinlock_debug.c:116 (discriminator 1)) 
[  101.739556][    C0] ? __pfx_do_raw_spin_lock (kernel/locking/spinlock_debug.c:114) 
[  101.739743][    C0] ? mptcp_incoming_options (net/mptcp/options.c:1067 net/mptcp/options.c:1203) 

This means get_send() interface of this scheduler can't be set with
BPF_F_SLEEPABLE flag since it's invoked in ack_update_msk() under mptcp
data lock.

So this patch has to split get_subflow() interface of packet scheduer into
two interfaces: get_send() and get_retrans(). Then we can set get_retrans()
interface alone with BPF_F_SLEEPABLE flag.

Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/529

Geliang Tang (9):
  mptcp: split get_subflow interface into two
  Squash to "bpf: Add bpf_mptcp_sched_ops"
  Squash to "selftests/bpf: Add bpf_first scheduler & test"
  Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
  Squash to "selftests/bpf: Add bpf_rr scheduler & test"
  Squash to "selftests/bpf: Add bpf_red scheduler & test"
  Squash to "selftests/bpf: Add bpf_burst scheduler & test"
  Squash to "bpf: Export mptcp packet scheduler helpers"
  Squash to "selftests/bpf: Add bpf_burst scheduler & test"

 include/net/mptcp.h                           |  5 +--
 net/mptcp/bpf.c                               | 13 +++++--
 net/mptcp/sched.c                             | 35 +++++++++++++------
 .../testing/selftests/bpf/prog_tests/mptcp.c  | 14 ++++++--
 .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  4 +--
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 22 +++++-------
 .../selftests/bpf/progs/mptcp_bpf_first.c     |  4 +--
 .../selftests/bpf/progs/mptcp_bpf_red.c       |  4 +--
 .../selftests/bpf/progs/mptcp_bpf_rr.c        |  4 +--
 9 files changed, 65 insertions(+), 40 deletions(-)

-- 
2.45.2


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 1/9] mptcp: split get_subflow interface into two
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 2/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
                   ` (11 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

get_retrans() interface of the burst packet scheduler invokes a sleeping
function mptcp_pm_subflow_chk_stale(), which calls __lock_sock_fast().
So get_retrans() interface should be set with BPF_F_SLEEPABLE flag in
BPF. But get_send() interface of this scheduler can't be set with
BPF_F_SLEEPABLE flag since it's invoked in ack_update_msk() under mptcp
data lock.

So this patch has to split get_subflow() interface of packet scheduer into
two interfaces: get_send() and get_retrans(). Then we can set get_retrans()
interface alone with BPF_F_SLEEPABLE flag.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h |  5 +++--
 net/mptcp/sched.c   | 35 ++++++++++++++++++++++++-----------
 2 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 94d5976f7b8d..72d6e6597add 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -103,13 +103,14 @@ struct mptcp_out_options {
 #define MPTCP_SUBFLOWS_MAX	8
 
 struct mptcp_sched_data {
-	bool	reinject;
 	u8	subflows;
 	struct mptcp_subflow_context *contexts[MPTCP_SUBFLOWS_MAX];
 };
 
 struct mptcp_sched_ops {
-	int (*get_subflow)(struct mptcp_sock *msk,
+	int (*get_send)(struct mptcp_sock *msk,
+			struct mptcp_sched_data *data);
+	int (*get_retrans)(struct mptcp_sock *msk,
 			   struct mptcp_sched_data *data);
 
 	char			name[MPTCP_SCHED_NAME_MAX];
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index 6da60e35932f..0b1e472e59a0 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -16,13 +16,25 @@
 static DEFINE_SPINLOCK(mptcp_sched_list_lock);
 static LIST_HEAD(mptcp_sched_list);
 
-static int mptcp_sched_default_get_subflow(struct mptcp_sock *msk,
+static int mptcp_sched_default_get_send(struct mptcp_sock *msk,
+					struct mptcp_sched_data *data)
+{
+	struct sock *ssk;
+
+	ssk = mptcp_subflow_get_send(msk);
+	if (!ssk)
+		return -EINVAL;
+
+	mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+	return 0;
+}
+
+static int mptcp_sched_default_get_retrans(struct mptcp_sock *msk,
 					   struct mptcp_sched_data *data)
 {
 	struct sock *ssk;
 
-	ssk = data->reinject ? mptcp_subflow_get_retrans(msk) :
-			       mptcp_subflow_get_send(msk);
+	ssk = mptcp_subflow_get_retrans(msk);
 	if (!ssk)
 		return -EINVAL;
 
@@ -31,7 +43,8 @@ static int mptcp_sched_default_get_subflow(struct mptcp_sock *msk,
 }
 
 static struct mptcp_sched_ops mptcp_sched_default = {
-	.get_subflow	= mptcp_sched_default_get_subflow,
+	.get_send	= mptcp_sched_default_get_send,
+	.get_retrans	= mptcp_sched_default_get_retrans,
 	.name		= "default",
 	.owner		= THIS_MODULE,
 };
@@ -73,7 +86,7 @@ void mptcp_get_available_schedulers(char *buf, size_t maxlen)
 
 int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
 {
-	if (!sched->get_subflow)
+	if (!sched->get_send)
 		return -EINVAL;
 
 	spin_lock(&mptcp_sched_list_lock);
@@ -184,11 +197,10 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
 			return 0;
 	}
 
-	data.reinject = false;
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_subflow(msk, &data);
+		return mptcp_sched_default_get_send(msk, &data);
 	mptcp_sched_data_set_contexts(msk, &data);
-	return msk->sched->get_subflow(msk, &data);
+	return msk->sched->get_send(msk, &data);
 }
 
 int mptcp_sched_get_retrans(struct mptcp_sock *msk)
@@ -207,9 +219,10 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
 			return 0;
 	}
 
-	data.reinject = true;
 	if (msk->sched == &mptcp_sched_default || !msk->sched)
-		return mptcp_sched_default_get_subflow(msk, &data);
+		return mptcp_sched_default_get_retrans(msk, &data);
 	mptcp_sched_data_set_contexts(msk, &data);
-	return msk->sched->get_subflow(msk, &data);
+	if (!msk->sched->get_retrans)
+		return msk->sched->get_send(msk, &data);
+	return msk->sched->get_retrans(msk, &data);
 }
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 2/9] Squash to "bpf: Add bpf_mptcp_sched_ops"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 1/9] mptcp: " Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 3/9] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Please update the subject to

        bpf: Add mptcp packet scheduler struct_ops

Split get_subflow interface into two.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/bpf.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 923895322b2c..8d4865177037 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -156,7 +156,13 @@ static int bpf_mptcp_sched_init(struct btf *btf)
 	return 0;
 }
 
-static int __bpf_mptcp_sched_get_subflow(struct mptcp_sock *msk,
+static int __bpf_mptcp_sched_get_send(struct mptcp_sock *msk,
+				      struct mptcp_sched_data *data)
+{
+	return 0;
+}
+
+static int __bpf_mptcp_sched_get_retrans(struct mptcp_sock *msk,
 					 struct mptcp_sched_data *data)
 {
 	return 0;
@@ -171,7 +177,8 @@ static void __bpf_mptcp_sched_release(struct mptcp_sock *msk)
 }
 
 static struct mptcp_sched_ops __bpf_mptcp_sched_ops = {
-	.get_subflow	= __bpf_mptcp_sched_get_subflow,
+	.get_send	= __bpf_mptcp_sched_get_send,
+	.get_retrans	= __bpf_mptcp_sched_get_retrans,
 	.init		= __bpf_mptcp_sched_init,
 	.release	= __bpf_mptcp_sched_release,
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 3/9] Squash to "selftests/bpf: Add bpf_first scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 1/9] mptcp: " Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 2/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 4/9] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Use new interface get_send() instead of get_subflow().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_first.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
index d57399b407a7..ab71ae3c6506 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_first.c
@@ -17,7 +17,7 @@ void BPF_PROG(mptcp_sched_first_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_first_get_subflow, struct mptcp_sock *msk,
+int BPF_PROG(bpf_first_get_send, struct mptcp_sock *msk,
 	     struct mptcp_sched_data *data)
 {
 	mptcp_subflow_set_scheduled(bpf_mptcp_subflow_ctx_by_pos(data, 0), true);
@@ -28,6 +28,6 @@ SEC(".struct_ops")
 struct mptcp_sched_ops first = {
 	.init		= (void *)mptcp_sched_first_init,
 	.release	= (void *)mptcp_sched_first_release,
-	.get_subflow	= (void *)bpf_first_get_subflow,
+	.get_send	= (void *)bpf_first_get_send,
 	.name		= "bpf_first",
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 4/9] Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (2 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 3/9] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 5/9] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Use new interface get_send() instead of get_subflow().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
index 296f0318d843..29be67e2f2ef 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_bkup.c
@@ -17,7 +17,7 @@ void BPF_PROG(mptcp_sched_bkup_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_bkup_get_subflow, struct mptcp_sock *msk,
+int BPF_PROG(bpf_bkup_get_send, struct mptcp_sock *msk,
 	     struct mptcp_sched_data *data)
 {
 	int nr = -1;
@@ -47,6 +47,6 @@ SEC(".struct_ops")
 struct mptcp_sched_ops bkup = {
 	.init		= (void *)mptcp_sched_bkup_init,
 	.release	= (void *)mptcp_sched_bkup_release,
-	.get_subflow	= (void *)bpf_bkup_get_subflow,
+	.get_send	= (void *)bpf_bkup_get_send,
 	.name		= "bpf_bkup",
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 5/9] Squash to "selftests/bpf: Add bpf_rr scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (3 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 4/9] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 6/9] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Use new interface get_send() instead of get_subflow().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
index 638ea6aa63b7..405e96c116d5 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_rr.c
@@ -31,7 +31,7 @@ void BPF_PROG(mptcp_sched_rr_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_rr_get_subflow, struct mptcp_sock *msk,
+int BPF_PROG(bpf_rr_get_send, struct mptcp_sock *msk,
 	     struct mptcp_sched_data *data)
 {
 	struct mptcp_subflow_context *subflow;
@@ -73,6 +73,6 @@ SEC(".struct_ops")
 struct mptcp_sched_ops rr = {
 	.init		= (void *)mptcp_sched_rr_init,
 	.release	= (void *)mptcp_sched_rr_release,
-	.get_subflow	= (void *)bpf_rr_get_subflow,
+	.get_send	= (void *)bpf_rr_get_send,
 	.name		= "bpf_rr",
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 6/9] Squash to "selftests/bpf: Add bpf_red scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (4 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 5/9] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 7/9] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Use new interface get_send() instead of get_subflow().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/progs/mptcp_bpf_red.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
index cc0aab732fc4..627502e3c851 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_red.c
@@ -17,7 +17,7 @@ void BPF_PROG(mptcp_sched_red_release, struct mptcp_sock *msk)
 }
 
 SEC("struct_ops")
-int BPF_PROG(bpf_red_get_subflow, struct mptcp_sock *msk,
+int BPF_PROG(bpf_red_get_send, struct mptcp_sock *msk,
 	     struct mptcp_sched_data *data)
 {
 	for (int i = 0; i < data->subflows && i < MPTCP_SUBFLOWS_MAX; i++) {
@@ -34,6 +34,6 @@ SEC(".struct_ops")
 struct mptcp_sched_ops red = {
 	.init		= (void *)mptcp_sched_red_init,
 	.release	= (void *)mptcp_sched_red_release,
-	.get_subflow	= (void *)bpf_red_get_subflow,
+	.get_send	= (void *)bpf_red_get_send,
 	.name		= "bpf_red",
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 7/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (5 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 6/9] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 8/9] Squash to "bpf: Export mptcp packet scheduler helpers" Geliang Tang
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Split get_subflow() interface into two: get_send() and get_retrans().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 .../selftests/bpf/progs/mptcp_bpf_burst.c     | 22 +++++++------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
index eb21119aa8f7..5743601df9dc 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_burst.c
@@ -67,8 +67,9 @@ void BPF_PROG(mptcp_sched_burst_release, struct mptcp_sock *msk)
 {
 }
 
-static int bpf_burst_get_send(struct mptcp_sock *msk,
-			      struct mptcp_sched_data *data)
+SEC("struct_ops")
+int BPF_PROG(bpf_burst_get_send, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	struct bpf_subflow_send_info send_info[SSK_MODE_MAX];
 	struct mptcp_subflow_context *subflow;
@@ -141,8 +142,9 @@ static int bpf_burst_get_send(struct mptcp_sock *msk,
 	return 0;
 }
 
-static int bpf_burst_get_retrans(struct mptcp_sock *msk,
-				 struct mptcp_sched_data *data)
+SEC("struct_ops")
+int BPF_PROG(bpf_burst_get_retrans, struct mptcp_sock *msk,
+	     struct mptcp_sched_data *data)
 {
 	int backup = MPTCP_SUBFLOWS_MAX, pick = MPTCP_SUBFLOWS_MAX, subflow_id;
 	struct mptcp_subflow_context *subflow;
@@ -189,19 +191,11 @@ static int bpf_burst_get_retrans(struct mptcp_sock *msk,
 	return 0;
 }
 
-SEC("struct_ops")
-int BPF_PROG(bpf_burst_get_subflow, struct mptcp_sock *msk,
-	     struct mptcp_sched_data *data)
-{
-	if (data->reinject)
-		return bpf_burst_get_retrans(msk, data);
-	return bpf_burst_get_send(msk, data);
-}
-
 SEC(".struct_ops")
 struct mptcp_sched_ops burst = {
 	.init		= (void *)mptcp_sched_burst_init,
 	.release	= (void *)mptcp_sched_burst_release,
-	.get_subflow	= (void *)bpf_burst_get_subflow,
+	.get_send	= (void *)bpf_burst_get_send,
+	.get_retrans	= (void *)bpf_burst_get_retrans,
 	.name		= "bpf_burst",
 };
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 8/9] Squash to "bpf: Export mptcp packet scheduler helpers"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (6 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 7/9] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:30 ` [PATCH mptcp-next v2 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test" Geliang Tang
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Set KF_SLEEPABLE flag for mptcp_pm_subflow_chk_stale.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/bpf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 8d4865177037..be222fa5f308 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -334,7 +334,7 @@ BTF_ID_FLAGS(func, mptcp_set_timeout)
 BTF_ID_FLAGS(func, mptcp_wnd_end)
 BTF_ID_FLAGS(func, tcp_stream_memory_free)
 BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
-BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
+BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE)
 BTF_KFUNCS_END(bpf_mptcp_sched_kfunc_ids)
 
 static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH mptcp-next v2 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test"
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (7 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 8/9] Squash to "bpf: Export mptcp packet scheduler helpers" Geliang Tang
@ 2024-12-23  8:30 ` Geliang Tang
  2024-12-23  8:44 ` [PATCH mptcp-next v2 0/9] split get_subflow interface into two MPTCP CI
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2024-12-23  8:30 UTC (permalink / raw)
  To: mptcp; +Cc: Geliang Tang

From: Geliang Tang <tanggeliang@kylinos.cn>

Set BPF_F_SLEEPABLE flags for bpf_burst_get_retrans.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 tools/testing/selftests/bpf/prog_tests/mptcp.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 1d68bbda3370..d7a640dce7da 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -726,12 +726,22 @@ static void test_red(void)
 static void test_burst(void)
 {
 	struct mptcp_bpf_burst *skel;
+	int err;
 
-	skel = mptcp_bpf_burst__open_and_load();
-	if (!ASSERT_OK_PTR(skel, "open_and_load: burst"))
+	skel = mptcp_bpf_burst__open();
+	if (!ASSERT_OK_PTR(skel, "open: burst"))
 		return;
 
+	err = bpf_program__set_flags(skel->progs.bpf_burst_get_retrans,
+				     BPF_F_SLEEPABLE);
+	if (!ASSERT_OK(err, "set sleepable flags"))
+		goto skel_destroy;
+
+	if (!ASSERT_OK(mptcp_bpf_burst__load(skel), "load: burst"))
+		goto skel_destroy;
+
 	test_bpf_sched(skel->obj, "burst", WITH_DATA, WITH_DATA);
+skel_destroy:
 	mptcp_bpf_burst__destroy(skel);
 }
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v2 0/9] split get_subflow interface into two
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (8 preceding siblings ...)
  2024-12-23  8:30 ` [PATCH mptcp-next v2 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test" Geliang Tang
@ 2024-12-23  8:44 ` MPTCP CI
  2024-12-23  9:21 ` MPTCP CI
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 14+ messages in thread
From: MPTCP CI @ 2024-12-23  8:44 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

Hi Geliang,

Thank you for your modifications, that's great!

But sadly, our CI spotted some issues with it when trying to build it.

You can find more details there:

  https://github.com/multipath-tcp/mptcp_net-next/actions/runs/12463812840

Status: failure
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/cc75b61e9055
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=920351

Feel free to reply to this email if you cannot access logs, if you need
some support to fix the error, if this doesn't seem to be caused by your
modifications or if the error is a false positive one.

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v2 0/9] split get_subflow interface into two
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (9 preceding siblings ...)
  2024-12-23  8:44 ` [PATCH mptcp-next v2 0/9] split get_subflow interface into two MPTCP CI
@ 2024-12-23  9:21 ` MPTCP CI
  2025-01-29 21:23 ` Mat Martineau
  2025-01-30 11:09 ` Matthieu Baerts
  12 siblings, 0 replies; 14+ messages in thread
From: MPTCP CI @ 2024-12-23  9:21 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp

Hi Geliang,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/12463812845

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/cc75b61e9055
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=920351


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-normal

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v2 0/9] split get_subflow interface into two
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (10 preceding siblings ...)
  2024-12-23  9:21 ` MPTCP CI
@ 2025-01-29 21:23 ` Mat Martineau
  2025-01-30 11:09 ` Matthieu Baerts
  12 siblings, 0 replies; 14+ messages in thread
From: Mat Martineau @ 2025-01-29 21:23 UTC (permalink / raw)
  To: Geliang Tang; +Cc: mptcp, Geliang Tang

On Mon, 23 Dec 2024, Geliang Tang wrote:

> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> v2:
> - use get_send for retransmit scheduling if get_retrans is NULL as Mat
>   suggested (thanks)
>

Hi Geliang -

v2 looks good for further testing on the export branch. Thanks for 
revising!

Reviewed-by: Mat Martineau <martineau@kernel.org>

> I got the following error when running bpf burst sched selftests in auto-btf-debug mode:
>
> [  167.258293][   T49] BUG: sleeping function called from invalid context at net/core/sock.c:3652
> [  167.258981][   T49] in_atomic(): 0, irqs_disabled(): 0, non_block: 0, pid: 49, name: kworker/0:2
> [  167.259547][   T49] preempt_count: 0, expected: 0
> [  167.259826][   T49] RCU nest depth: 1, expected: 0
> [  167.259975][   T49] 5 locks held by kworker/0:2/49:
> [  167.260137][   T49]  #0: ffff888001130948 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work+0x7e4/0x16b0
> [  167.260741][   T49]  #1: ffffc90000347d90 ((work_completion)(&msk->work)){+.+.}-{0:0}, at: process_one_work+0xdf9/0x16b0
> [  167.261206][   T49]  #2: ffff88800c620e58 (sk_lock-AF_INET){+.+.}-{0:0}, at: mptcp_worker+0x7b/0xad0
> [  167.261476][   T49]  #3: ffffffff8977e620 (rcu_read_lock){....}-{1:2}, at: __bpf_prog_enter+0x1f/0x170
> [  167.261742][   T49]  #4: ffff88800b6f8258 (k-sk_lock-AF_INET#2){+.+.}-{0:0}, at: bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
> [  167.262309][   T49] CPU: 0 UID: 0 PID: 49 Comm: kworker/0:2 Tainted: G           OE      6.12.0-rc6+ #9
> [  167.262591][   T49] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [  167.262774][   T49] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
> [  167.262950][   T49] Workqueue: events mptcp_worker
> [  167.263097][   T49] Call Trace:
> [  167.263211][   T49]  <TASK>
> [  167.263301][   T49]  dump_stack_lvl+0x9e/0xe0
> [  167.263453][   T49]  __might_resched+0x35d/0x590
> [  167.263599][   T49]  ? __pfx___might_resched+0x10/0x10
> [  167.263829][   T49]  __lock_sock_fast+0x2f/0xd0
> [  167.264035][   T49]  mptcp_pm_nl_subflow_chk_stale+0x1e2/0x3c0
> [  167.264304][   T49]  ? bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
> [  167.264604][   T49]  bpf_prog_87e3c1bd65224f1c_bpf_burst_get_subflow+0x12c/0x58b
> [  167.264995][   T49]  ? mptcp_sched_get_retrans+0x1f8/0x330
> [  167.265215][   T49]  ? __pfx_mptcp_sched_get_retrans+0x10/0x10
> [  167.265432][   T49]  ? mark_lock+0x371/0x3c0
> [  167.265678][   T49]  ? __mptcp_retrans+0xf4/0x9a0
> [  167.265973][   T49]  ? mptcp_worker+0x7b/0xad0
>
> mptcp_pm_subflow_chk_stale is a sleeping function, it shouldn't be
> invoked under BPF rcu_read_lock.
>
> One solution is to set mptcp_pm_subflow_chk_stale with KF_SLEEPABLE
> flag:
>
> BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale, KF_SLEEPABLE)
>
> Then set bpf_burst_get_subflow with BPF_F_SLEEPABLE:
>
>      err = bpf_program__set_flags(skel->progs.bpf_burst_get_subflow,
>                                   BPF_F_SLEEPABLE);
>
> But another error ocurrs:
>
> [  101.732098][    C0] BUG: sleeping function called from invalid context at kernel/bpf/trampoline.c:968
> [  101.732781][    C0] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1640, name: test_progs-no_a
> [  101.733477][    C0] preempt_count: 303, expected: 0
> [  101.733793][    C0] RCU nest depth: 2, expected: 0
> [  101.734043][    C0] 6 locks held by test_progs-no_a/1640:
> [  101.734187][    C0] #0: ffff888007526e58 (sk_lock-AF_INET){+.+.}-{0:0}, at: sk_wait_data (net/core/sock.c:3131 (discriminator 2))
> [  101.734440][    C0] #1: ffffffff95b7e620 (rcu_read_lock){....}-{1:2}, at: process_backlog (include/linux/local_lock_internal.h:38 (discriminator 1) net/core/dev.c:6115 (discriminator 1))
> [  101.734728][    C0] #2: ffffffff95b7e620 (rcu_read_lock){....}-{1:2}, at: ip_local_deliver_finish (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate.h:849 (discriminator 1) net/ipv4/ip_input.c:232 (discriminator 1))
> [  101.735103][    C0] #3: ffff888008eb8e58 (k-slock-AF_INET/1){+.-.}-{2:2}, at: tcp_v4_rcv (include/linux/skbuff.h:1670 include/net/tcp.h:2530 net/ipv4/tcp_ipv4.c:2348)
> [  101.735560][    C0] #4: ffff8880075261d8 (slock-AF_INET){+.-.}-{2:2}, at: mptcp_incoming_options (net/mptcp/options.c:1053 net/mptcp/options.c:1203)
> [  101.736023][    C0] #5: ffffffff95b7d980 (rcu_read_lock_trace){....}-{0:0}, at: __bpf_prog_enter_sleepable (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate_trace.h:57 (discriminator 1) kernel/bpf/trampoline.c:966 (discriminator 1))
> [  101.736325][    C0] CPU: 0 UID: 0 PID: 1640 Comm: test_progs-no_a Tainted: G           OE      6.12.0-rc7+ #5
> [  101.736676][    C0] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [  101.736940][    C0] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
> [  101.737146][    C0] Call Trace:
> [  101.737259][    C0]  <IRQ>
> [  101.737331][    C0] dump_stack_lvl (lib/dump_stack.c:123)
> [  101.737489][    C0] __might_resched (kernel/sched/core.c:8657)
> [  101.737625][    C0] ? __lock_acquire (kernel/locking/lockdep.c:5202 (discriminator 1))
> [  101.737772][    C0] ? __pfx___might_resched (kernel/sched/core.c:8611)
> [  101.737919][    C0] __might_fault (mm/memory.c:6715 (discriminator 1))
> [  101.738051][    C0] __bpf_prog_enter_sleepable (include/linux/bpf.h:2089 (discriminator 1) kernel/bpf/trampoline.c:970 (discriminator 1))
> [  101.738195][    C0] ? __bpf_prog_enter_sleepable (include/linux/rcupdate.h:337 (discriminator 1) include/linux/rcupdate_trace.h:57 (discriminator 1) kernel/bpf/trampoline.c:966 (discriminator 1))
> [  101.738357][    C0] ? mptcp_sched_get_send (net/mptcp/sched.c:183)
> [  101.738511][    C0] ? __pfx_mptcp_sched_get_send (net/mptcp/sched.c:158)
> [  101.738641][    C0] ? __bpf_tramp_enter (include/linux/rcupdate.h:347 (discriminator 1) include/linux/rcupdate.h:880 (discriminator 1) include/linux/percpu-refcount.h:209 (discriminator 1) include/linux/percpu-refcount.h:222 (discriminator 1) kernel/bpf/trampoline.c:1010 (discriminator 1))
> [  101.738774][    C0] ? bpf_trampoline_6442561300+0x31/0xd7
> [  101.738911][    C0] ? mptcp_sched_get_send (net/mptcp/sched.c:158)
> [  101.739067][    C0] ? __mptcp_subflow_push_pending (net/mptcp/protocol.c:1682 (discriminator 1))
> [  101.739231][    C0] ? __pfx___mptcp_subflow_push_pending (net/mptcp/protocol.c:1655)
> [  101.739378][    C0] ? do_raw_spin_lock (arch/x86/include/asm/atomic.h:107 (discriminator 1) include/linux/atomic/atomic-arch-fallback.h:2170 (discriminator 1) include/linux/atomic/atomic-instrumented.h:1302 (discriminator 1) include/asm-generic/qspinlock.h:111 (discriminator 1) kernel/locking/spinlock_debug.c:116 (discriminator 1))
> [  101.739556][    C0] ? __pfx_do_raw_spin_lock (kernel/locking/spinlock_debug.c:114)
> [  101.739743][    C0] ? mptcp_incoming_options (net/mptcp/options.c:1067 net/mptcp/options.c:1203)
>
> This means get_send() interface of this scheduler can't be set with
> BPF_F_SLEEPABLE flag since it's invoked in ack_update_msk() under mptcp
> data lock.
>
> So this patch has to split get_subflow() interface of packet scheduer into
> two interfaces: get_send() and get_retrans(). Then we can set get_retrans()
> interface alone with BPF_F_SLEEPABLE flag.
>
> Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/529
>
> Geliang Tang (9):
>  mptcp: split get_subflow interface into two
>  Squash to "bpf: Add bpf_mptcp_sched_ops"
>  Squash to "selftests/bpf: Add bpf_first scheduler & test"
>  Squash to "selftests/bpf: Add bpf_bkup scheduler & test"
>  Squash to "selftests/bpf: Add bpf_rr scheduler & test"
>  Squash to "selftests/bpf: Add bpf_red scheduler & test"
>  Squash to "selftests/bpf: Add bpf_burst scheduler & test"
>  Squash to "bpf: Export mptcp packet scheduler helpers"
>  Squash to "selftests/bpf: Add bpf_burst scheduler & test"
>
> include/net/mptcp.h                           |  5 +--
> net/mptcp/bpf.c                               | 13 +++++--
> net/mptcp/sched.c                             | 35 +++++++++++++------
> .../testing/selftests/bpf/prog_tests/mptcp.c  | 14 ++++++--
> .../selftests/bpf/progs/mptcp_bpf_bkup.c      |  4 +--
> .../selftests/bpf/progs/mptcp_bpf_burst.c     | 22 +++++-------
> .../selftests/bpf/progs/mptcp_bpf_first.c     |  4 +--
> .../selftests/bpf/progs/mptcp_bpf_red.c       |  4 +--
> .../selftests/bpf/progs/mptcp_bpf_rr.c        |  4 +--
> 9 files changed, 65 insertions(+), 40 deletions(-)
>
> -- 
> 2.45.2
>
>
>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH mptcp-next v2 0/9] split get_subflow interface into two
  2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
                   ` (11 preceding siblings ...)
  2025-01-29 21:23 ` Mat Martineau
@ 2025-01-30 11:09 ` Matthieu Baerts
  12 siblings, 0 replies; 14+ messages in thread
From: Matthieu Baerts @ 2025-01-30 11:09 UTC (permalink / raw)
  To: Geliang Tang, mptcp; +Cc: Geliang Tang

Hi Geliang, Mat,

On 23/12/2024 09:30, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
> 
> v2:
>  - use get_send for retransmit scheduling if get_retrans is NULL as Mat
>    suggested (thanks)

Thank you for the patches and the reviews!

Now in our tree (patch 1 added to feat. to net-next):

New patches for t/upstream:
- 194634e29ac3: mptcp: split get_subflow interface into two
- b46f5ea7b16c: conflict in t/mptcp-add-sched_data-helpers-2
- Results: 1f1bcdf21ce1..05c877c4d7a7 (export)

- 0553d2b03e93: "squashed" patch 2/9 in "bpf: Add bpf_mptcp_sched_ops"
- 83346f612335: "squashed" patch 3/9 in "selftests/bpf: Add bpf_first
scheduler & test"
- 337f2ca8dfb9: "squashed" patch 4/9 in "selftests/bpf: Add bpf_bkup
scheduler & test"
- 8c0d02a30a77: "squashed" patch 5/9 in "selftests/bpf: Add bpf_rr
scheduler & test"
- f4d508d1d445: "squashed" patch 6/9 in "selftests/bpf: Add bpf_red
scheduler & test"
- b1efae418f39: "squashed" patch 7/9 in "selftests/bpf: Add bpf_burst
scheduler & test"
- 1b873824d526: "squashed" patch 8/9 in "bpf: Export mptcp packet
scheduler helpers"
- 28a0417a3858: "squashed" patch 9/9 in "selftests/bpf: Add bpf_burst
scheduler & test"
- Results: 05c877c4d7a7..1ce205274e04 (export)

Tests are now in progress:

- export:
https://github.com/multipath-tcp/mptcp_net-next/commit/956c0cb0417154194171e66be6372589db32960f/checks

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-01-30 11:09 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-23  8:30 [PATCH mptcp-next v2 0/9] split get_subflow interface into two Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 1/9] mptcp: " Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 2/9] Squash to "bpf: Add bpf_mptcp_sched_ops" Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 3/9] Squash to "selftests/bpf: Add bpf_first scheduler & test" Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 4/9] Squash to "selftests/bpf: Add bpf_bkup " Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 5/9] Squash to "selftests/bpf: Add bpf_rr " Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 6/9] Squash to "selftests/bpf: Add bpf_red " Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 7/9] Squash to "selftests/bpf: Add bpf_burst " Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 8/9] Squash to "bpf: Export mptcp packet scheduler helpers" Geliang Tang
2024-12-23  8:30 ` [PATCH mptcp-next v2 9/9] Squash to "selftests/bpf: Add bpf_burst scheduler & test" Geliang Tang
2024-12-23  8:44 ` [PATCH mptcp-next v2 0/9] split get_subflow interface into two MPTCP CI
2024-12-23  9:21 ` MPTCP CI
2025-01-29 21:23 ` Mat Martineau
2025-01-30 11:09 ` Matthieu Baerts

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.