Skip to content

Commit 62748f3

Browse files
edumazetdavem330
authored andcommitted
net: introduce SO_MAX_PACING_RATE
As mentioned in commit afe4fd0 ("pkt_sched: fq: Fair Queue packet scheduler"), this patch adds a new socket option. SO_MAX_PACING_RATE offers the application the ability to cap the rate computed by transport layer. Value is in bytes per second. u32 val = 1000000; setsockopt(sockfd, SOL_SOCKET, SO_MAX_PACING_RATE, &val, sizeof(val)); To be effectively paced, a flow must use FQ packet scheduler. Note that a packet scheduler takes into account the headers for its computations. The effective payload rate depends on MSS and retransmits if any. I chose to make this pacing rate a SOL_SOCKET option instead of a TCP one because this can be used by other protocols. Signed-off-by: Eric Dumazet <[email protected]> Cc: Steinar H. Gunderson <[email protected]> Cc: Michael Kerrisk <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4aa0a03 commit 62748f3

File tree

18 files changed

+45
-2
lines changed

18 files changed

+45
-2
lines changed

arch/alpha/include/uapi/asm/socket.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@
8181

8282
#define SO_SELECT_ERR_QUEUE 45
8383

84-
#define SO_BUSY_POLL 46
84+
#define SO_BUSY_POLL 46
85+
86+
#define SO_MAX_PACING_RATE 47
8587

8688
#endif /* _UAPI_ASM_SOCKET_H */

arch/avr32/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@
7676

7777
#define SO_BUSY_POLL 46
7878

79+
#define SO_MAX_PACING_RATE 47
80+
7981
#endif /* __ASM_AVR32_SOCKET_H */

arch/cris/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@
7878

7979
#define SO_BUSY_POLL 46
8080

81+
#define SO_MAX_PACING_RATE 47
82+
8183
#endif /* _ASM_SOCKET_H */
8284

8385

arch/frv/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,7 @@
7676

7777
#define SO_BUSY_POLL 46
7878

79+
#define SO_MAX_PACING_RATE 47
80+
7981
#endif /* _ASM_SOCKET_H */
8082

arch/h8300/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@
7676

7777
#define SO_BUSY_POLL 46
7878

79+
#define SO_MAX_PACING_RATE 47
80+
7981
#endif /* _ASM_SOCKET_H */

arch/ia64/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,6 @@
8585

8686
#define SO_BUSY_POLL 46
8787

88+
#define SO_MAX_PACING_RATE 47
89+
8890
#endif /* _ASM_IA64_SOCKET_H */

arch/m32r/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@
7676

7777
#define SO_BUSY_POLL 46
7878

79+
#define SO_MAX_PACING_RATE 47
80+
7981
#endif /* _ASM_M32R_SOCKET_H */

arch/mips/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,6 @@
9494

9595
#define SO_BUSY_POLL 46
9696

97+
#define SO_MAX_PACING_RATE 47
98+
9799
#endif /* _UAPI_ASM_SOCKET_H */

arch/mn10300/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,6 @@
7676

7777
#define SO_BUSY_POLL 46
7878

79+
#define SO_MAX_PACING_RATE 47
80+
7981
#endif /* _ASM_SOCKET_H */

arch/parisc/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575

7676
#define SO_BUSY_POLL 0x4027
7777

78+
#define SO_MAX_PACING_RATE 0x4048
79+
7880
/* O_NONBLOCK clashes with the bits used for socket types. Therefore we
7981
* have to define SOCK_NONBLOCK to a different value here.
8082
*/

arch/powerpc/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,6 @@
8383

8484
#define SO_BUSY_POLL 46
8585

86+
#define SO_MAX_PACING_RATE 47
87+
8688
#endif /* _ASM_POWERPC_SOCKET_H */

arch/s390/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,6 @@
8282

8383
#define SO_BUSY_POLL 46
8484

85+
#define SO_MAX_PACING_RATE 47
86+
8587
#endif /* _ASM_SOCKET_H */

arch/sparc/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272

7373
#define SO_BUSY_POLL 0x0030
7474

75+
#define SO_MAX_PACING_RATE 0x0031
76+
7577
/* Security levels - as per NRL IPv6 - don't actually do anything */
7678
#define SO_SECURITY_AUTHENTICATION 0x5001
7779
#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002

arch/xtensa/include/uapi/asm/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,6 @@
8787

8888
#define SO_BUSY_POLL 46
8989

90+
#define SO_MAX_PACING_RATE 47
91+
9092
#endif /* _XTENSA_SOCKET_H */

include/net/sock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ struct sock {
363363
int sk_wmem_queued;
364364
gfp_t sk_allocation;
365365
u32 sk_pacing_rate; /* bytes per second */
366+
u32 sk_max_pacing_rate;
366367
netdev_features_t sk_route_caps;
367368
netdev_features_t sk_route_nocaps;
368369
int sk_gso_type;

include/uapi/asm-generic/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,6 @@
7878

7979
#define SO_BUSY_POLL 46
8080

81+
#define SO_MAX_PACING_RATE 47
82+
8183
#endif /* __ASM_GENERIC_SOCKET_H */

net/core/sock.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
914914
}
915915
break;
916916
#endif
917+
918+
case SO_MAX_PACING_RATE:
919+
sk->sk_max_pacing_rate = val;
920+
sk->sk_pacing_rate = min(sk->sk_pacing_rate,
921+
sk->sk_max_pacing_rate);
922+
break;
923+
917924
default:
918925
ret = -ENOPROTOOPT;
919926
break;
@@ -1177,6 +1184,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
11771184
break;
11781185
#endif
11791186

1187+
case SO_MAX_PACING_RATE:
1188+
v.val = sk->sk_max_pacing_rate;
1189+
break;
1190+
11801191
default:
11811192
return -ENOPROTOOPT;
11821193
}
@@ -2319,6 +2330,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
23192330
sk->sk_ll_usec = sysctl_net_busy_read;
23202331
#endif
23212332

2333+
sk->sk_max_pacing_rate = ~0U;
23222334
/*
23232335
* Before updating sk_refcnt, we must commit prior changes to memory
23242336
* (Documentation/RCU/rculist_nulls.txt for details)

net/ipv4/tcp_input.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ static void tcp_update_pacing_rate(struct sock *sk)
735735
if (tp->srtt > 8 + 2)
736736
do_div(rate, tp->srtt);
737737

738-
sk->sk_pacing_rate = min_t(u64, rate, ~0U);
738+
sk->sk_pacing_rate = min_t(u64, rate, sk->sk_max_pacing_rate);
739739
}
740740

741741
/* Calculate rto without backoff. This is the second half of Van Jacobson's

0 commit comments

Comments
 (0)