Skip to content

Commit cb08b23

Browse files
cpaasch-oaiintel-lab-lkp
authored andcommitted
mptcp: Add support for SO_MAX_PACING_RATE
Add support for SO_MAX_PACING_RATE. It will limit the rate of each individual TCP subflow to the specified rate. Signed-off-by: Christoph Paasch <[email protected]>
1 parent 9a3f944 commit cb08b23

File tree

1 file changed

+30
-1
lines changed

1 file changed

+30
-1
lines changed

net/mptcp/sockopt.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
308308

309309
ret = sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen);
310310
if (ret == 0) {
311+
/* Record the option at the msk for subsequent subflows */
311312
if (optname == SO_REUSEPORT)
312313
sk->sk_reuseport = ssk->sk_reuseport;
313314
else if (optname == SO_REUSEADDR)
@@ -340,6 +341,25 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
340341
optval, optlen);
341342
case SO_LINGER:
342343
return mptcp_setsockopt_sol_socket_linger(msk, optval, optlen);
344+
case SO_MAX_PACING_RATE: {
345+
struct mptcp_subflow_context *subflow;
346+
347+
ret = sock_setsockopt(sk->sk_socket, SOL_SOCKET, optname, optval, optlen);
348+
if (ret < 0)
349+
return ret;
350+
351+
lock_sock(sk);
352+
sockopt_seq_inc(msk);
353+
354+
mptcp_for_each_subflow(msk, subflow) {
355+
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
356+
357+
sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen);
358+
}
359+
360+
release_sock(sk);
361+
break;
362+
}
343363
case SO_RCVLOWAT:
344364
case SO_RCVTIMEO_OLD:
345365
case SO_RCVTIMEO_NEW:
@@ -373,7 +393,6 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname,
373393
* explicitly the sk_protocol field
374394
*
375395
* SO_PEEK_OFF is unsupported, as it is for plain TCP
376-
* SO_MAX_PACING_RATE is unsupported, we must be careful with subflows
377396
* SO_CNX_ADVICE is currently unsupported, could possibly be relevant,
378397
* but likely needs careful design
379398
*
@@ -1532,6 +1551,7 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
15321551
{
15331552
static const unsigned int tx_rx_locks = SOCK_RCVBUF_LOCK | SOCK_SNDBUF_LOCK;
15341553
struct sock *sk = (struct sock *)msk;
1554+
unsigned long max_pacing_rate;
15351555

15361556
if (ssk->sk_prot->keepalive) {
15371557
if (sock_flag(sk, SOCK_KEEPOPEN))
@@ -1579,6 +1599,15 @@ static void sync_socket_options(struct mptcp_sock *msk, struct sock *ssk)
15791599
tcp_sock_set_keepcnt(ssk, msk->keepalive_cnt);
15801600
tcp_sock_set_maxseg(ssk, msk->maxseg);
15811601

1602+
/* Keep pacing settings in sync as well. */
1603+
max_pacing_rate = READ_ONCE(sk->sk_max_pacing_rate);
1604+
1605+
WRITE_ONCE(ssk->sk_max_pacing_rate, max_pacing_rate);
1606+
if (max_pacing_rate != ~0UL)
1607+
cmpxchg(&ssk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);
1608+
if (READ_ONCE(ssk->sk_pacing_rate) > max_pacing_rate)
1609+
WRITE_ONCE(ssk->sk_pacing_rate, max_pacing_rate);
1610+
15821611
inet_assign_bit(TRANSPARENT, ssk, inet_test_bit(TRANSPARENT, sk));
15831612
inet_assign_bit(FREEBIND, ssk, inet_test_bit(FREEBIND, sk));
15841613
inet_assign_bit(BIND_ADDRESS_NO_PORT, ssk, inet_test_bit(BIND_ADDRESS_NO_PORT, sk));

0 commit comments

Comments
 (0)