Skip to content

Commit cf2c974

Browse files
david-laightummakynes
authored andcommitted
ipvs: Fix clamp() of ip_vs_conn_tab on small memory systems
The 'max_avail' value is calculated from the system memory size using order_base_2(). order_base_2(x) is defined as '(x) ? fn(x) : 0'. The compiler generates two copies of the code that follows and then expands clamp(max, min, PAGE_SHIFT - 12) (11 on 32bit). This triggers a compile-time assert since min is 5. In reality a system would have to have less than 512MB memory for the bounds passed to clamp to be reversed. Swap the order of the arguments to clamp() to avoid the warning. Replace the clamp_val() on the line below with clamp(). clamp_val() is just 'an accident waiting to happen' and not needed here. Detected by compile time checks added to clamp(), specifically: minmax.h: use BUILD_BUG_ON_MSG() for the lo < hi test in clamp() Reported-by: Linux Kernel Functional Testing <[email protected]> Closes: https://lore.kernel.org/all/CA+G9fYsT34UkGFKxus63H6UVpYi5GRZkezT9MRLfAbM3f6ke0g@mail.gmail.com/ Fixes: 4f325e2 ("ipvs: dynamically limit the connection hash table") Tested-by: Bartosz Golaszewski <[email protected]> Reviewed-by: Bartosz Golaszewski <[email protected]> Signed-off-by: David Laight <[email protected]> Acked-by: Julian Anastasov <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 954a2b4 commit cf2c974

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

net/netfilter/ipvs/ip_vs_conn.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,8 +1495,8 @@ int __init ip_vs_conn_init(void)
14951495
max_avail -= 2; /* ~4 in hash row */
14961496
max_avail -= 1; /* IPVS up to 1/2 of mem */
14971497
max_avail -= order_base_2(sizeof(struct ip_vs_conn));
1498-
max = clamp(max, min, max_avail);
1499-
ip_vs_conn_tab_bits = clamp_val(ip_vs_conn_tab_bits, min, max);
1498+
max = clamp(max_avail, min, max);
1499+
ip_vs_conn_tab_bits = clamp(ip_vs_conn_tab_bits, min, max);
15001500
ip_vs_conn_tab_size = 1 << ip_vs_conn_tab_bits;
15011501
ip_vs_conn_tab_mask = ip_vs_conn_tab_size - 1;
15021502

0 commit comments

Comments
 (0)