Merge branch 'wireguard-patches-for-5-20-rc1'
Jason A. Donenfeld says: ==================== wireguard patches for 5.20-rc1 I had planned to send these out eventually as net.git patches, but as you emailed earlier, I figure there's no harm in just doing this now for net-next.git. Please apply the following small fixes: 1) Rather than using msleep() in order to approximate ktime_get_coarse_ boottime_ns(), instead use an hrtimer, rounded heuristically. 2) An update in selftest config fragments, from Lukas. 3) Linus noticed that a debugging WARN_ON() to detect (impossible) stack corruption would still allow the corruption to happen, making it harder to get the report about the corruption subsequently. 4) Support for User Mode Linux in the test suite. This depends on some UML patches that are slated for 5.20. Richard hasn't sent his pull in, but they're in his tree, so I assume it'll happen. ==================== Link: https://lore.kernel.org/r/20220802125613.340848-1-Jason@zx2c4.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9017462f00
|
@ -6,6 +6,8 @@
|
|||
#include "allowedips.h"
|
||||
#include "peer.h"
|
||||
|
||||
enum { MAX_ALLOWEDIPS_BITS = 128 };
|
||||
|
||||
static struct kmem_cache *node_cache;
|
||||
|
||||
static void swap_endian(u8 *dst, const u8 *src, u8 bits)
|
||||
|
@ -40,7 +42,8 @@ static void push_rcu(struct allowedips_node **stack,
|
|||
struct allowedips_node __rcu *p, unsigned int *len)
|
||||
{
|
||||
if (rcu_access_pointer(p)) {
|
||||
WARN_ON(IS_ENABLED(DEBUG) && *len >= 128);
|
||||
if (WARN_ON(IS_ENABLED(DEBUG) && *len >= MAX_ALLOWEDIPS_BITS))
|
||||
return;
|
||||
stack[(*len)++] = rcu_dereference_raw(p);
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +55,7 @@ static void node_free_rcu(struct rcu_head *rcu)
|
|||
|
||||
static void root_free_rcu(struct rcu_head *rcu)
|
||||
{
|
||||
struct allowedips_node *node, *stack[128] = {
|
||||
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = {
|
||||
container_of(rcu, struct allowedips_node, rcu) };
|
||||
unsigned int len = 1;
|
||||
|
||||
|
@ -65,7 +68,7 @@ static void root_free_rcu(struct rcu_head *rcu)
|
|||
|
||||
static void root_remove_peer_lists(struct allowedips_node *root)
|
||||
{
|
||||
struct allowedips_node *node, *stack[128] = { root };
|
||||
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = { root };
|
||||
unsigned int len = 1;
|
||||
|
||||
while (len > 0 && (node = stack[--len])) {
|
||||
|
|
|
@ -593,10 +593,10 @@ bool __init wg_allowedips_selftest(void)
|
|||
wg_allowedips_remove_by_peer(&t, a, &mutex);
|
||||
test_negative(4, a, 192, 168, 0, 1);
|
||||
|
||||
/* These will hit the WARN_ON(len >= 128) in free_node if something
|
||||
* goes wrong.
|
||||
/* These will hit the WARN_ON(len >= MAX_ALLOWEDIPS_BITS) in free_node
|
||||
* if something goes wrong.
|
||||
*/
|
||||
for (i = 0; i < 128; ++i) {
|
||||
for (i = 0; i < MAX_ALLOWEDIPS_BITS; ++i) {
|
||||
part = cpu_to_be64(~(1LLU << (i % 64)));
|
||||
memset(&ip, 0xff, 16);
|
||||
memcpy((u8 *)&ip + (i < 64) * 8, &part, 8);
|
||||
|
|
|
@ -6,28 +6,29 @@
|
|||
#ifdef DEBUG
|
||||
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/hrtimer.h>
|
||||
|
||||
static const struct {
|
||||
bool result;
|
||||
unsigned int msec_to_sleep_before;
|
||||
u64 nsec_to_sleep_before;
|
||||
} expected_results[] __initconst = {
|
||||
[0 ... PACKETS_BURSTABLE - 1] = { true, 0 },
|
||||
[PACKETS_BURSTABLE] = { false, 0 },
|
||||
[PACKETS_BURSTABLE + 1] = { true, MSEC_PER_SEC / PACKETS_PER_SECOND },
|
||||
[PACKETS_BURSTABLE + 1] = { true, NSEC_PER_SEC / PACKETS_PER_SECOND },
|
||||
[PACKETS_BURSTABLE + 2] = { false, 0 },
|
||||
[PACKETS_BURSTABLE + 3] = { true, (MSEC_PER_SEC / PACKETS_PER_SECOND) * 2 },
|
||||
[PACKETS_BURSTABLE + 3] = { true, (NSEC_PER_SEC / PACKETS_PER_SECOND) * 2 },
|
||||
[PACKETS_BURSTABLE + 4] = { true, 0 },
|
||||
[PACKETS_BURSTABLE + 5] = { false, 0 }
|
||||
};
|
||||
|
||||
static __init unsigned int maximum_jiffies_at_index(int index)
|
||||
{
|
||||
unsigned int total_msecs = 2 * MSEC_PER_SEC / PACKETS_PER_SECOND / 3;
|
||||
u64 total_nsecs = 2 * NSEC_PER_SEC / PACKETS_PER_SECOND / 3;
|
||||
int i;
|
||||
|
||||
for (i = 0; i <= index; ++i)
|
||||
total_msecs += expected_results[i].msec_to_sleep_before;
|
||||
return msecs_to_jiffies(total_msecs);
|
||||
total_nsecs += expected_results[i].nsec_to_sleep_before;
|
||||
return nsecs_to_jiffies(total_nsecs);
|
||||
}
|
||||
|
||||
static __init int timings_test(struct sk_buff *skb4, struct iphdr *hdr4,
|
||||
|
@ -42,8 +43,12 @@ static __init int timings_test(struct sk_buff *skb4, struct iphdr *hdr4,
|
|||
loop_start_time = jiffies;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(expected_results); ++i) {
|
||||
if (expected_results[i].msec_to_sleep_before)
|
||||
msleep(expected_results[i].msec_to_sleep_before);
|
||||
if (expected_results[i].nsec_to_sleep_before) {
|
||||
ktime_t timeout = ktime_add(ktime_add_ns(ktime_get_coarse_boottime(), TICK_NSEC * 4 / 3),
|
||||
ns_to_ktime(expected_results[i].nsec_to_sleep_before));
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
schedule_hrtimeout_range_clock(&timeout, 0, HRTIMER_MODE_ABS, CLOCK_BOOTTIME);
|
||||
}
|
||||
|
||||
if (time_is_before_jiffies(loop_start_time +
|
||||
maximum_jiffies_at_index(i)))
|
||||
|
@ -127,7 +132,7 @@ bool __init wg_ratelimiter_selftest(void)
|
|||
if (IS_ENABLED(CONFIG_KASAN) || IS_ENABLED(CONFIG_UBSAN))
|
||||
return true;
|
||||
|
||||
BUILD_BUG_ON(MSEC_PER_SEC % PACKETS_PER_SECOND != 0);
|
||||
BUILD_BUG_ON(NSEC_PER_SEC % PACKETS_PER_SECOND != 0);
|
||||
|
||||
if (wg_ratelimiter_init())
|
||||
goto out;
|
||||
|
@ -176,7 +181,6 @@ bool __init wg_ratelimiter_selftest(void)
|
|||
test += test_count;
|
||||
goto err;
|
||||
}
|
||||
msleep(500);
|
||||
continue;
|
||||
} else if (ret < 0) {
|
||||
test += test_count;
|
||||
|
@ -195,7 +199,6 @@ bool __init wg_ratelimiter_selftest(void)
|
|||
test += test_count;
|
||||
goto err;
|
||||
}
|
||||
msleep(50);
|
||||
continue;
|
||||
}
|
||||
test += test_count;
|
||||
|
|
|
@ -2311,6 +2311,7 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
|
|||
|
||||
return !t.task ? 0 : -EINTR;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock);
|
||||
|
||||
/**
|
||||
* schedule_hrtimeout_range - sleep until timeout
|
||||
|
|
|
@ -248,8 +248,13 @@ QEMU_MACHINE := -cpu host,accel=kvm -machine s390-ccw-virtio -append $(KERNEL_CM
|
|||
else
|
||||
QEMU_MACHINE := -cpu max -machine s390-ccw-virtio -append $(KERNEL_CMDLINE)
|
||||
endif
|
||||
else ifeq ($(ARCH),um)
|
||||
CHOST := $(HOST_ARCH)-linux-musl
|
||||
KERNEL_BZIMAGE := $(KERNEL_BUILD_PATH)/vmlinux
|
||||
KERNEL_ARCH := um
|
||||
KERNEL_CMDLINE := $(shell sed -n 's/CONFIG_CMDLINE=\(.*\)/\1/p' arch/um.config)
|
||||
else
|
||||
$(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64, powerpc64le, powerpc, m68k, riscv64, riscv32, s390x)
|
||||
$(error I only build: x86_64, i686, arm, armeb, aarch64, aarch64_be, mips, mipsel, mips64, mips64el, powerpc64, powerpc64le, powerpc, m68k, riscv64, riscv32, s390x, um)
|
||||
endif
|
||||
|
||||
TOOLCHAIN_FILENAME := $(CHOST)-cross.tgz
|
||||
|
@ -262,7 +267,9 @@ $(eval $(call file_download,$(TOOLCHAIN_FILENAME),$(TOOLCHAIN_DIR),,$(DISTFILES_
|
|||
STRIP := $(CHOST)-strip
|
||||
CROSS_COMPILE_FLAG := --build=$(CBUILD) --host=$(CHOST)
|
||||
$(info Building for $(CHOST) using $(CBUILD))
|
||||
ifneq ($(ARCH),um)
|
||||
export CROSS_COMPILE := $(CHOST)-
|
||||
endif
|
||||
export PATH := $(TOOLCHAIN_PATH)/bin:$(PATH)
|
||||
export CC := $(CHOST)-gcc
|
||||
CCACHE_PATH := $(shell which ccache 2>/dev/null)
|
||||
|
@ -279,6 +286,7 @@ comma := ,
|
|||
build: $(KERNEL_BZIMAGE)
|
||||
qemu: $(KERNEL_BZIMAGE)
|
||||
rm -f $(BUILD_PATH)/result
|
||||
ifneq ($(ARCH),um)
|
||||
timeout --foreground 20m qemu-system-$(QEMU_ARCH) \
|
||||
-nodefaults \
|
||||
-nographic \
|
||||
|
@ -291,6 +299,13 @@ qemu: $(KERNEL_BZIMAGE)
|
|||
-no-reboot \
|
||||
-monitor none \
|
||||
-kernel $<
|
||||
else
|
||||
timeout --foreground 20m $< \
|
||||
$(KERNEL_CMDLINE) \
|
||||
mem=$$(grep -q CONFIG_DEBUG_KMEMLEAK=y $(KERNEL_BUILD_PATH)/.config && echo 1G || echo 256M) \
|
||||
noreboot \
|
||||
con1=fd:51 51>$(BUILD_PATH)/result </dev/null 2>&1 | cat
|
||||
endif
|
||||
grep -Fq success $(BUILD_PATH)/result
|
||||
|
||||
$(BUILD_PATH)/init-cpio-spec.txt: $(TOOLCHAIN_PATH)/.installed $(BUILD_PATH)/init
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
CONFIG_64BIT=y
|
||||
CONFIG_CMDLINE="wg.success=tty1 panic_on_warn=1"
|
||||
CONFIG_FRAME_WARN=1280
|
|
@ -18,15 +18,12 @@ CONFIG_DEBUG_VM=y
|
|||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
CONFIG_HAVE_ARCH_KMEMCHECK=y
|
||||
CONFIG_HAVE_ARCH_KASAN=y
|
||||
CONFIG_KASAN=y
|
||||
CONFIG_KASAN_INLINE=y
|
||||
CONFIG_UBSAN=y
|
||||
CONFIG_UBSAN_SANITIZE_ALL=y
|
||||
CONFIG_UBSAN_NULL=y
|
||||
CONFIG_DEBUG_KMEMLEAK=y
|
||||
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=8192
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
CONFIG_WQ_WATCHDOG=y
|
||||
|
@ -35,7 +32,6 @@ CONFIG_SCHED_INFO=y
|
|||
CONFIG_SCHEDSTATS=y
|
||||
CONFIG_SCHED_STACK_END_CHECK=y
|
||||
CONFIG_DEBUG_TIMEKEEPING=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
|
@ -49,7 +45,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_DEBUG_PLIST=y
|
||||
CONFIG_PROVE_RCU=y
|
||||
CONFIG_SPARSE_RCU_POINTER=y
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=21
|
||||
CONFIG_RCU_TRACE=y
|
||||
CONFIG_RCU_EQS_DEBUG=y
|
||||
|
|
|
@ -19,7 +19,6 @@ CONFIG_NETFILTER_XTABLES=y
|
|||
CONFIG_NETFILTER_XT_NAT=y
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=y
|
||||
CONFIG_NETFILTER_XT_MARK=y
|
||||
CONFIG_NF_NAT_IPV4=y
|
||||
CONFIG_IP_NF_IPTABLES=y
|
||||
CONFIG_IP_NF_FILTER=y
|
||||
CONFIG_IP_NF_MANGLE=y
|
||||
|
|
Loading…
Reference in New Issue