Skip to content

Commit 0aee14f

Browse files
authored
Merge pull request #207 from oracle/udp-bitshift
Udp bitshift
2 parents 69740fe + b97919a commit 0aee14f

3 files changed

Lines changed: 23 additions & 21 deletions

File tree

src/tcp_buffer_tuner.bpf.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static __always_inline bool tcp_nearly_out_of_memory(struct sock *sk,
5353
struct proto *prot = BPFTUNE_CORE_READ(sk, sk_prot);
5454
atomic_long_t *memory_allocated = BPFTUNE_CORE_READ(prot, memory_allocated);
5555
long *sysctl_mem = BPFTUNE_CORE_READ(prot, sysctl_mem);
56-
__u8 shift = 0;
56+
__s8 shift = 0;
5757
int i;
5858

5959
if (!sk || !prot || !memory_allocated)
@@ -67,20 +67,21 @@ static __always_inline bool tcp_nearly_out_of_memory(struct sock *sk,
6767
if (!mem[0] || !mem[1] || !mem[2])
6868
return false;
6969

70-
if (kernel_page_shift >= sk_mem_quantum_shift) {
71-
shift = kernel_page_shift - sk_mem_quantum_shift;
72-
if (shift >= 32)
73-
return false;
74-
} else {
70+
if (LINUX_KERNEL_VERSION < KERNEL_VERSION(5, 16, 0)) {
71+
/* we are on v5.15 or earlier; mem quantum is used
72+
* to shift limits.
73+
*/
7574
shift = sk_mem_quantum_shift - kernel_page_shift;
76-
if (shift >= 32)
75+
if (shift >= 32 || shift <= -32)
7776
return false;
7877
}
7978

8079
for (i = 0; i < 3; i++) {
8180
limit_sk_mem_quantum[i] = mem[i];
82-
if (shift)
81+
if (shift > 0)
8382
limit_sk_mem_quantum[i] >>= shift;
83+
else if (shift < 0)
84+
limit_sk_mem_quantum[i] <<= shift;
8485
if (limit_sk_mem_quantum[i] <= 0)
8586
return false;
8687
}

src/udp_buffer_tuner.bpf.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static __always_inline bool udp_nearly_out_of_memory(struct sock *sk,
4545
struct proto *prot = BPFTUNE_CORE_READ(sk, sk_prot);
4646
atomic_long_t *memory_allocated = BPFTUNE_CORE_READ(prot, memory_allocated);
4747
long *sysctl_mem = BPFTUNE_CORE_READ(prot, sysctl_mem);
48-
__u8 shift_left = 0, shift_right = 0;
48+
__s8 shift = 0;
4949
struct net *net;
5050
int i;
5151

@@ -64,22 +64,22 @@ static __always_inline bool udp_nearly_out_of_memory(struct sock *sk,
6464
if (!mem[0] || !mem[1] || !mem[2])
6565
return false;
6666

67-
if (kernel_page_shift >= sk_mem_quantum_shift) {
68-
shift_left = kernel_page_shift - sk_mem_quantum_shift;
69-
if (shift_left >= 32)
70-
return false;
71-
} else {
72-
shift_right = sk_mem_quantum_shift - kernel_page_shift;
73-
if (shift_right >= 32)
67+
if (LINUX_KERNEL_VERSION < KERNEL_VERSION(5, 16, 0)) {
68+
/* we are on v5.15 or earlier; mem quantum is used
69+
* to shift limits.
70+
*/
71+
shift = sk_mem_quantum_shift - kernel_page_shift;
72+
if (shift >= 32 || shift <= -32)
7473
return false;
7574
}
7675

7776
for (i = 0; i < 3; i++) {
7877
limit_sk_mem_quantum[i] = mem[i];
79-
if (shift_left)
80-
limit_sk_mem_quantum[i] <<= shift_left;
81-
if (shift_right)
82-
limit_sk_mem_quantum[i] >>= shift_right;
78+
if (shift > 0)
79+
limit_sk_mem_quantum[i] >>= shift;
80+
else if (shift < 0)
81+
limit_sk_mem_quantum[i] <<= shift;
82+
8383
if (limit_sk_mem_quantum[i] <= 0)
8484
return false;
8585
}
@@ -245,6 +245,7 @@ int BPF_PROG(bpftune_sock_exceed_buf_limit, struct sock *sk, struct proto *prot,
245245
{
246246
if (kind == SK_MEM_RECV) {
247247
__u16 proto = BPFTUNE_CORE_READ(sk, sk_protocol);
248+
248249
if (proto == IPPROTO_UDP)
249250
return udp_fail_rcv(-ENOBUFS, sk);
250251
}

test/udp_mem_exhaust_test.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ for FAMILY in $FAMILIES ; do
5656
wmem_default_orig=($(sysctl -n net.core.wmem_default))
5757
sysctl -w net.core.wmem_default=8192
5858

59-
mem_test=($(echo 50 100 150))
59+
mem_test=($(echo 20 45 50))
6060

6161
sysctl -w net.ipv4.udp_mem="${mem_test[0]} ${mem_test[1]} ${mem_test[2]}"
6262

0 commit comments

Comments
 (0)