Merge tag 'v5.2-rc4' into mauro
We need to pick up post-rc1 changes to various document files so they don't get lost in Mauro's massive RST conversion push.
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
#!/usr/bin/perl -w
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright 2015 - Steven Rostedt, Red Hat Inc.
|
||||
# Copyright 2017 - Steven Rostedt, VMware, Inc.
|
||||
#
|
||||
# Licensed under the terms of the GNU GPL License version 2
|
||||
#
|
||||
|
||||
# usage:
|
||||
# config-bisect.pl [options] good-config bad-config [good|bad]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl -w
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
|
||||
# Licensed under the terms of the GNU GPL License version 2
|
||||
#
|
||||
|
||||
use strict;
|
||||
|
@@ -1,14 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2016, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include "test/nfit_test.h"
|
||||
#include <linux/mm.h>
|
||||
|
@@ -1,14 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014-2016, Intel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include "test/nfit_test.h"
|
||||
#include <linux/blkdev.h>
|
||||
|
@@ -1,14 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
#include <linux/memremap.h>
|
||||
#include <linux/rculist.h>
|
||||
|
@@ -1,14 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#include <linux/platform_device.h>
|
||||
|
@@ -1,14 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
#ifndef __NFIT_TEST_H__
|
||||
#define __NFIT_TEST_H__
|
||||
|
@@ -1,15 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* benchmark.c:
|
||||
* Author: Konstantin Khlebnikov <koct9i@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include <linux/radix-tree.h>
|
||||
#include <linux/slab.h>
|
||||
|
@@ -1,15 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* idr-test.c: Test the IDR API
|
||||
* Copyright (c) 2016 Matthew Wilcox <willy@infradead.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/idr.h>
|
||||
|
@@ -1,16 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* iteration_check.c: test races having to do with xarray iteration
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
* Author: Ross Zwisler <ross.zwisler@linux.intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include <pthread.h>
|
||||
#include "test.h"
|
||||
|
@@ -1,17 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* multiorder.c: Multi-order radix tree entry testing
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
* Author: Ross Zwisler <ross.zwisler@linux.intel.com>
|
||||
* Author: Matthew Wilcox <matthew.r.wilcox@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#include <linux/radix-tree.h>
|
||||
#include <linux/slab.h>
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS += -I. -I../../include -g -O2 -Wall -fsanitize=address
|
||||
LDFLAGS += -fsanitize=address -fsanitize=undefined
|
||||
TARGETS = main
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
SUBDIRS := ion
|
||||
|
||||
TEST_PROGS := run.sh
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
INCLUDEDIR := -I. -I../../../../../drivers/staging/android/uapi/ -I../../../../../usr/include/
|
||||
CFLAGS := $(CFLAGS) $(INCLUDEDIR) -Wall -O2 -g
|
||||
|
@@ -1,17 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* ion.h
|
||||
*
|
||||
* Copyright (C) 2011 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* This file is copied from drivers/staging/android/uapi/ion.h
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* ionapp_export.c
|
||||
*
|
||||
@@ -7,16 +8,6 @@
|
||||
* So, this server has to be started first before the client.
|
||||
*
|
||||
* Copyright (C) 2017 Pintu Kumar <pintu.ping@gmail.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* ionapp_import.c
|
||||
*
|
||||
@@ -6,16 +7,6 @@
|
||||
* This acts like a client for ionapp_export.
|
||||
*
|
||||
* Copyright (C) 2017 Pintu Kumar <pintu.ping@gmail.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
1
tools/testing/selftests/bpf/.gitignore
vendored
1
tools/testing/selftests/bpf/.gitignore
vendored
@@ -31,6 +31,7 @@ test_section_names
|
||||
test_tcpnotify_user
|
||||
test_libbpf
|
||||
test_tcp_check_syncookie_user
|
||||
test_sysctl
|
||||
alu32
|
||||
libbpf.pc
|
||||
libbpf.so.*
|
||||
|
@@ -278,7 +278,7 @@ static int (*bpf_skb_change_type)(void *ctx, __u32 type) =
|
||||
(void *) BPF_FUNC_skb_change_type;
|
||||
static unsigned int (*bpf_get_hash_recalc)(void *ctx) =
|
||||
(void *) BPF_FUNC_get_hash_recalc;
|
||||
static unsigned long long (*bpf_get_current_task)(void *ctx) =
|
||||
static unsigned long long (*bpf_get_current_task)(void) =
|
||||
(void *) BPF_FUNC_get_current_task;
|
||||
static int (*bpf_skb_change_tail)(void *ctx, __u32 len, __u64 flags) =
|
||||
(void *) BPF_FUNC_skb_change_tail;
|
||||
|
1
tools/testing/selftests/bpf/map_tests/.gitignore
vendored
Normal file
1
tools/testing/selftests/bpf/map_tests/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
tests.h
|
@@ -242,12 +242,12 @@ void test_flow_dissector(void)
|
||||
*/
|
||||
|
||||
err = bpf_prog_attach(prog_fd, 0, BPF_FLOW_DISSECTOR, 0);
|
||||
CHECK(err, "bpf_prog_attach", "err %d errno %d", err, errno);
|
||||
CHECK(err, "bpf_prog_attach", "err %d errno %d\n", err, errno);
|
||||
|
||||
tap_fd = create_tap("tap0");
|
||||
CHECK(tap_fd < 0, "create_tap", "tap_fd %d errno %d", tap_fd, errno);
|
||||
CHECK(tap_fd < 0, "create_tap", "tap_fd %d errno %d\n", tap_fd, errno);
|
||||
err = ifup("tap0");
|
||||
CHECK(err, "ifup", "err %d errno %d", err, errno);
|
||||
CHECK(err, "ifup", "err %d errno %d\n", err, errno);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tests); i++) {
|
||||
struct bpf_flow_keys flow_keys = {};
|
||||
@@ -255,7 +255,7 @@ void test_flow_dissector(void)
|
||||
__u32 key = 0;
|
||||
|
||||
err = tx_tap(tap_fd, &tests[i].pkt, sizeof(tests[i].pkt));
|
||||
CHECK(err < 0, "tx_tap", "err %d errno %d", err, errno);
|
||||
CHECK(err < 0, "tx_tap", "err %d errno %d\n", err, errno);
|
||||
|
||||
err = bpf_map_lookup_elem(keys_fd, &key, &flow_keys);
|
||||
CHECK_ATTR(err, tests[i].name, "bpf_map_lookup_elem %d\n", err);
|
||||
@@ -264,5 +264,6 @@ void test_flow_dissector(void)
|
||||
CHECK_FLOW_KEYS(tests[i].name, flow_keys, tests[i].keys);
|
||||
}
|
||||
|
||||
bpf_prog_detach(prog_fd, BPF_FLOW_DISSECTOR);
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
@@ -1,8 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2017 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include <linux/bpf.h>
|
||||
|
@@ -1,8 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2017 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
@@ -1,8 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2017 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
@@ -1,8 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2017 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,8 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2016 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef _TEST_IPTNL_COMMON_H
|
||||
#define _TEST_IPTNL_COMMON_H
|
||||
|
@@ -1,9 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2016 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
@@ -18,9 +15,11 @@
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <bpf/bpf.h>
|
||||
#include <bpf/libbpf.h>
|
||||
|
||||
#include "bpf_util.h"
|
||||
#include "bpf_rlimit.h"
|
||||
#include "../../../include/linux/filter.h"
|
||||
|
||||
#define LOCAL_FREE_TARGET (128)
|
||||
#define PERCPU_FREE_TARGET (4)
|
||||
@@ -40,6 +39,68 @@ static int create_map(int map_type, int map_flags, unsigned int size)
|
||||
return map_fd;
|
||||
}
|
||||
|
||||
static int bpf_map_lookup_elem_with_ref_bit(int fd, unsigned long long key,
|
||||
void *value)
|
||||
{
|
||||
struct bpf_load_program_attr prog;
|
||||
struct bpf_create_map_attr map;
|
||||
struct bpf_insn insns[] = {
|
||||
BPF_LD_MAP_VALUE(BPF_REG_9, 0, 0),
|
||||
BPF_LD_MAP_FD(BPF_REG_1, fd),
|
||||
BPF_LD_IMM64(BPF_REG_3, key),
|
||||
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
|
||||
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, 0),
|
||||
BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
|
||||
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4),
|
||||
BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
|
||||
BPF_STX_MEM(BPF_DW, BPF_REG_9, BPF_REG_1, 0),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 42),
|
||||
BPF_JMP_IMM(BPF_JA, 0, 0, 1),
|
||||
BPF_MOV64_IMM(BPF_REG_0, 1),
|
||||
BPF_EXIT_INSN(),
|
||||
};
|
||||
__u8 data[64] = {};
|
||||
int mfd, pfd, ret, zero = 0;
|
||||
__u32 retval = 0;
|
||||
|
||||
memset(&map, 0, sizeof(map));
|
||||
map.map_type = BPF_MAP_TYPE_ARRAY;
|
||||
map.key_size = sizeof(int);
|
||||
map.value_size = sizeof(unsigned long long);
|
||||
map.max_entries = 1;
|
||||
|
||||
mfd = bpf_create_map_xattr(&map);
|
||||
if (mfd < 0)
|
||||
return -1;
|
||||
|
||||
insns[0].imm = mfd;
|
||||
|
||||
memset(&prog, 0, sizeof(prog));
|
||||
prog.prog_type = BPF_PROG_TYPE_SCHED_CLS;
|
||||
prog.insns = insns;
|
||||
prog.insns_cnt = ARRAY_SIZE(insns);
|
||||
prog.license = "GPL";
|
||||
|
||||
pfd = bpf_load_program_xattr(&prog, NULL, 0);
|
||||
if (pfd < 0) {
|
||||
close(mfd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = bpf_prog_test_run(pfd, 1, data, sizeof(data),
|
||||
NULL, NULL, &retval, NULL);
|
||||
if (ret < 0 || retval != 42) {
|
||||
ret = -1;
|
||||
} else {
|
||||
assert(!bpf_map_lookup_elem(mfd, &zero, value));
|
||||
ret = 0;
|
||||
}
|
||||
close(pfd);
|
||||
close(mfd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int map_subset(int map0, int map1)
|
||||
{
|
||||
unsigned long long next_key = 0;
|
||||
@@ -87,7 +148,7 @@ static int sched_next_online(int pid, int *next_to_try)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Size of the LRU amp is 2
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1
|
||||
@@ -157,7 +218,7 @@ static void test_lru_sanity0(int map_type, int map_flags)
|
||||
* stop LRU from removing key=1
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
@@ -167,7 +228,8 @@ static void test_lru_sanity0(int map_type, int map_flags)
|
||||
|
||||
/* key=2 has been removed from the LRU */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1);
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
@@ -221,7 +283,7 @@ static void test_lru_sanity1(int map_type, int map_flags, unsigned int tgt_free)
|
||||
/* Lookup 1 to tgt_free/2 */
|
||||
end_key = 1 + batch_size;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
@@ -322,10 +384,11 @@ static void test_lru_sanity2(int map_type, int map_flags, unsigned int tgt_free)
|
||||
end_key = 1 + batch_size;
|
||||
value[0] = 4321;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 4321);
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
@@ -404,7 +467,7 @@ static void test_lru_sanity3(int map_type, int map_flags, unsigned int tgt_free)
|
||||
/* Lookup key 1 to tgt_free*3/2 */
|
||||
end_key = tgt_free + batch_size;
|
||||
for (key = 1; key < end_key; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
@@ -463,7 +526,7 @@ static void test_lru_sanity4(int map_type, int map_flags, unsigned int tgt_free)
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
for (key = 1; key <= tgt_free; key++) {
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
}
|
||||
@@ -494,16 +557,16 @@ static void do_test_lru_sanity5(unsigned long long last_key, int map_fd)
|
||||
unsigned long long key, value[nr_cpus];
|
||||
|
||||
/* Ensure the last key inserted by previous CPU can be found */
|
||||
assert(!bpf_map_lookup_elem(map_fd, &last_key, value));
|
||||
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(map_fd, last_key, value));
|
||||
value[0] = 1234;
|
||||
|
||||
key = last_key + 1;
|
||||
assert(!bpf_map_update_elem(map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_lookup_elem(map_fd, &key, value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(map_fd, key, value));
|
||||
|
||||
/* Cannot find the last key because it was removed by LRU */
|
||||
assert(bpf_map_lookup_elem(map_fd, &last_key, value));
|
||||
assert(bpf_map_lookup_elem(map_fd, &last_key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
}
|
||||
|
||||
/* Test map with only one element */
|
||||
@@ -590,8 +653,8 @@ static void test_lru_sanity6(int map_type, int map_flags, int tgt_free)
|
||||
/* Make ref bit sticky for key: [1, tgt_free] */
|
||||
for (stable_key = 1; stable_key <= tgt_free; stable_key++) {
|
||||
/* Mark the ref bit */
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &stable_key,
|
||||
value));
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd,
|
||||
stable_key, value));
|
||||
}
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
@@ -612,6 +675,198 @@ static void test_lru_sanity6(int map_type, int map_flags, int tgt_free)
|
||||
printf("Pass\n");
|
||||
}
|
||||
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1 (datapath)
|
||||
* Lookup Key=2 (syscall)
|
||||
* Add Key=3
|
||||
* => Key=2 will be removed by LRU
|
||||
* Iterate map. Only found key=1 and key=3
|
||||
*/
|
||||
static void test_lru_sanity7(int map_type, int map_flags)
|
||||
{
|
||||
unsigned long long key, value[nr_cpus];
|
||||
int lru_map_fd, expected_map_fd;
|
||||
int next_cpu = 0;
|
||||
|
||||
printf("%s (map_type:%d map_flags:0x%X): ", __func__, map_type,
|
||||
map_flags);
|
||||
|
||||
assert(sched_next_online(0, &next_cpu) != -1);
|
||||
|
||||
if (map_flags & BPF_F_NO_COMMON_LRU)
|
||||
lru_map_fd = create_map(map_type, map_flags, 2 * nr_cpus);
|
||||
else
|
||||
lru_map_fd = create_map(map_type, map_flags, 2);
|
||||
assert(lru_map_fd != -1);
|
||||
|
||||
expected_map_fd = create_map(BPF_MAP_TYPE_HASH, 0, 2);
|
||||
assert(expected_map_fd != -1);
|
||||
|
||||
value[0] = 1234;
|
||||
|
||||
/* insert key=1 element */
|
||||
|
||||
key = 1;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* BPF_NOEXIST means: add new element if it doesn't exist */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST) == -1
|
||||
/* key=1 already exists */
|
||||
&& errno == EEXIST);
|
||||
|
||||
/* insert key=2 element */
|
||||
|
||||
/* check that key=2 is not found */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* BPF_EXIST means: update existing element */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_EXIST) == -1 &&
|
||||
/* key=2 is not there */
|
||||
errno == ENOENT);
|
||||
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
/* insert key=3 element */
|
||||
|
||||
/* check that key=3 is not found */
|
||||
key = 3;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* check that key=1 can be found and mark the ref bit to
|
||||
* stop LRU from removing key=1
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
/* check that key=2 can be found and do _not_ mark ref bit.
|
||||
* this will be evicted on next update.
|
||||
*/
|
||||
key = 2;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* key=2 has been removed from the LRU */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
close(expected_map_fd);
|
||||
close(lru_map_fd);
|
||||
|
||||
printf("Pass\n");
|
||||
}
|
||||
|
||||
/* Size of the LRU map is 2
|
||||
* Add key=1 (+1 key)
|
||||
* Add key=2 (+1 key)
|
||||
* Lookup Key=1 (syscall)
|
||||
* Lookup Key=2 (datapath)
|
||||
* Add Key=3
|
||||
* => Key=1 will be removed by LRU
|
||||
* Iterate map. Only found key=2 and key=3
|
||||
*/
|
||||
static void test_lru_sanity8(int map_type, int map_flags)
|
||||
{
|
||||
unsigned long long key, value[nr_cpus];
|
||||
int lru_map_fd, expected_map_fd;
|
||||
int next_cpu = 0;
|
||||
|
||||
printf("%s (map_type:%d map_flags:0x%X): ", __func__, map_type,
|
||||
map_flags);
|
||||
|
||||
assert(sched_next_online(0, &next_cpu) != -1);
|
||||
|
||||
if (map_flags & BPF_F_NO_COMMON_LRU)
|
||||
lru_map_fd = create_map(map_type, map_flags, 2 * nr_cpus);
|
||||
else
|
||||
lru_map_fd = create_map(map_type, map_flags, 2);
|
||||
assert(lru_map_fd != -1);
|
||||
|
||||
expected_map_fd = create_map(BPF_MAP_TYPE_HASH, 0, 2);
|
||||
assert(expected_map_fd != -1);
|
||||
|
||||
value[0] = 1234;
|
||||
|
||||
/* insert key=1 element */
|
||||
|
||||
key = 1;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
|
||||
/* BPF_NOEXIST means: add new element if it doesn't exist */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST) == -1
|
||||
/* key=1 already exists */
|
||||
&& errno == EEXIST);
|
||||
|
||||
/* insert key=2 element */
|
||||
|
||||
/* check that key=2 is not found */
|
||||
key = 2;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* BPF_EXIST means: update existing element */
|
||||
assert(bpf_map_update_elem(lru_map_fd, &key, value, BPF_EXIST) == -1 &&
|
||||
/* key=2 is not there */
|
||||
errno == ENOENT);
|
||||
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* insert key=3 element */
|
||||
|
||||
/* check that key=3 is not found */
|
||||
key = 3;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
/* check that key=1 can be found and do _not_ mark ref bit.
|
||||
* this will be evicted on next update.
|
||||
*/
|
||||
key = 1;
|
||||
assert(!bpf_map_lookup_elem(lru_map_fd, &key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
/* check that key=2 can be found and mark the ref bit to
|
||||
* stop LRU from removing key=2
|
||||
*/
|
||||
key = 2;
|
||||
assert(!bpf_map_lookup_elem_with_ref_bit(lru_map_fd, key, value));
|
||||
assert(value[0] == 1234);
|
||||
|
||||
key = 3;
|
||||
assert(!bpf_map_update_elem(lru_map_fd, &key, value, BPF_NOEXIST));
|
||||
assert(!bpf_map_update_elem(expected_map_fd, &key, value,
|
||||
BPF_NOEXIST));
|
||||
|
||||
/* key=1 has been removed from the LRU */
|
||||
key = 1;
|
||||
assert(bpf_map_lookup_elem(lru_map_fd, &key, value) == -1 &&
|
||||
errno == ENOENT);
|
||||
|
||||
assert(map_equal(lru_map_fd, expected_map_fd));
|
||||
|
||||
close(expected_map_fd);
|
||||
close(lru_map_fd);
|
||||
|
||||
printf("Pass\n");
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int map_types[] = {BPF_MAP_TYPE_LRU_HASH,
|
||||
@@ -637,6 +892,8 @@ int main(int argc, char **argv)
|
||||
test_lru_sanity4(map_types[t], map_flags[f], tgt_free);
|
||||
test_lru_sanity5(map_types[t], map_flags[f]);
|
||||
test_lru_sanity6(map_types[t], map_flags[f], tgt_free);
|
||||
test_lru_sanity7(map_types[t], map_flags[f]);
|
||||
test_lru_sanity8(map_types[t], map_flags[f]);
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
@@ -1,12 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Testsuite for eBPF maps
|
||||
*
|
||||
* Copyright (c) 2014 PLUMgrid, http://plumgrid.com
|
||||
* Copyright (c) 2016 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,8 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2017 Facebook
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
#include "test_progs.h"
|
||||
#include "bpf_rlimit.h"
|
||||
|
@@ -1,13 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Testsuite for eBPF verifier
|
||||
*
|
||||
* Copyright (c) 2014 PLUMgrid, http://plumgrid.com
|
||||
* Copyright (c) 2017 Facebook
|
||||
* Copyright (c) 2018 Covalent IO, Inc. http://covalent.io
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <endian.h>
|
||||
|
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2011 Red Hat, Inc., Frederic Weisbecker <fweisbec@redhat.com>
|
||||
*
|
||||
* Licensed under the terms of the GNU GPL License version 2
|
||||
*
|
||||
* Selftests for breakpoints (and more generally the do_debug() path) in x86.
|
||||
*/
|
||||
|
||||
|
@@ -1,20 +1,11 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2016 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Original Code by Pavel Labath <labath@google.com>
|
||||
*
|
||||
* Code modified by Pratyush Anand <panand@redhat.com>
|
||||
* for testing different byte select for each access size.
|
||||
*
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
@@ -1,15 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2016 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
@@ -198,7 +198,7 @@ static int test_cgcore_no_internal_process_constraint_on_threads(const char *roo
|
||||
char *parent = NULL, *child = NULL;
|
||||
|
||||
if (cg_read_strstr(root, "cgroup.controllers", "cpu") ||
|
||||
cg_read_strstr(root, "cgroup.subtree_control", "cpu")) {
|
||||
cg_write(root, "cgroup.subtree_control", "+cpu")) {
|
||||
ret = KSFT_SKIP;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -376,6 +376,11 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (cg_find_unified_root(root, sizeof(root)))
|
||||
ksft_exit_skip("cgroup v2 isn't mounted\n");
|
||||
|
||||
if (cg_read_strstr(root, "cgroup.subtree_control", "memory"))
|
||||
if (cg_write(root, "cgroup.subtree_control", "+memory"))
|
||||
ksft_exit_skip("Failed to set memory controller\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tests); i++) {
|
||||
switch (tests[i].fn(root)) {
|
||||
case KSFT_PASS:
|
||||
|
@@ -1205,6 +1205,10 @@ int main(int argc, char **argv)
|
||||
if (cg_read_strstr(root, "cgroup.controllers", "memory"))
|
||||
ksft_exit_skip("memory controller isn't available\n");
|
||||
|
||||
if (cg_read_strstr(root, "cgroup.subtree_control", "memory"))
|
||||
if (cg_write(root, "cgroup.subtree_control", "+memory"))
|
||||
ksft_exit_skip("Failed to set memory controller\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tests); i++) {
|
||||
switch (tests[i].fn(root)) {
|
||||
case KSFT_PASS:
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS += -I../../../../../usr/include/
|
||||
|
||||
TEST_GEN_PROGS := udmabuf
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS = -Wall
|
||||
|
||||
TEST_GEN_FILES := open-unlink create-read
|
||||
|
@@ -1,8 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2014 Google, Inc.
|
||||
*
|
||||
* Licensed under the terms of the GNU GPL License version 2
|
||||
*
|
||||
* Selftests for execveat(2).
|
||||
*/
|
||||
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Makefile for firmware loading selftests
|
||||
|
||||
# No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
|
||||
|
@@ -318,6 +318,7 @@ run_test() { # testfile
|
||||
local testlog=/proc/self/fd/1
|
||||
fi
|
||||
export TMPDIR=`mktemp -d /tmp/ftracetest-dir.XXXXXX`
|
||||
export FTRACETEST_ROOT=$TOP_DIR
|
||||
echo "execute$INSTANCE: "$1 > $testlog
|
||||
SIG_RESULT=0
|
||||
if [ $VERBOSE -eq -1 ]; then
|
||||
|
@@ -3,7 +3,7 @@
|
||||
# description: Kprobe dynamic event with function tracer
|
||||
|
||||
[ -f kprobe_events ] || exit_unsupported # this is configurable
|
||||
grep function available_tracers || exit_unsupported # this is configurable
|
||||
grep "function" available_tracers || exit_unsupported # this is configurable
|
||||
|
||||
# prepare
|
||||
echo nop > current_tracer
|
||||
|
21
tools/testing/selftests/ftrace/test.d/selftest/bashisms.tc
Normal file
21
tools/testing/selftests/ftrace/test.d/selftest/bashisms.tc
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# description: Meta-selftest: Checkbashisms
|
||||
|
||||
if [ ! -f $FTRACETEST_ROOT/ftracetest ]; then
|
||||
echo "Hmm, we can not find ftracetest"
|
||||
exit_unresolved
|
||||
fi
|
||||
|
||||
if ! which checkbashisms > /dev/null 2>&1 ; then
|
||||
echo "No checkbashisms found. skipped."
|
||||
exit_unresolved
|
||||
fi
|
||||
|
||||
checkbashisms $FTRACETEST_ROOT/ftracetest
|
||||
checkbashisms $FTRACETEST_ROOT/test.d/functions
|
||||
for t in $(find $FTRACETEST_ROOT/test.d -name \*.tc); do
|
||||
checkbashisms $t
|
||||
done
|
||||
|
||||
exit 0
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2006-2008
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* This test excercises the futex syscall op codes needed for requeuing
|
||||
* priority inheritance aware POSIX condition variables and mutexes.
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* 1. Block a thread using FUTEX_WAIT
|
||||
* 2. Attempt to use FUTEX_CMP_REQUEUE_PI on the futex from 1.
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2006-2008
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* This test exercises the futex_wait_requeue_pi() signal handling both
|
||||
* before and after the requeue. The first should be restarted by the
|
||||
|
@@ -1,13 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright FUJITSU LIMITED 2010
|
||||
* Copyright KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Internally, Futex has two handling mode, anon and file. The private file
|
||||
* mapping is special. At first it behave as file, but after write anything
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Block on a futex and wait for timeout.
|
||||
*
|
||||
|
@@ -1,13 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright FUJITSU LIMITED 2010
|
||||
* Copyright KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Wait on uninitialized heap. It shold be zero and FUTEX_WAIT should
|
||||
* return immediately. This test is intent to test zero page handling in
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Test if FUTEX_WAIT op returns -EWOULDBLOCK if the futex value differs
|
||||
* from the expected one.
|
||||
|
@@ -1,14 +1,10 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright © International Business Machines Corp., 2009
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Run tests in the current directory.
|
||||
#
|
||||
|
@@ -1,12 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* GCC atomic builtin wrappers
|
||||
* http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
|
||||
|
@@ -1,12 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Glibc independent futex library for testing kernel functionality.
|
||||
*
|
||||
|
@@ -1,12 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/******************************************************************************
|
||||
*
|
||||
* Copyright © International Business Machines Corp., 2009
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Glibc independent futex library for testing kernel functionality.
|
||||
*
|
||||
|
@@ -1,14 +1,10 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Copyright © International Business Machines Corp., 2009
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Run all tests under the functional, performance, and stress directories.
|
||||
# Format and summarize the results.
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS += -I../../../../usr/include/
|
||||
|
||||
TEST_GEN_PROGS := kcmp_test
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Makefile for kexec tests
|
||||
|
||||
uname_M := $(shell uname -m 2>/dev/null || echo not)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Makefile for kmod loading selftests
|
||||
|
||||
# No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
|
||||
|
@@ -24,16 +24,6 @@ tap_prefix()
|
||||
fi
|
||||
}
|
||||
|
||||
# If stdbuf is unavailable, we must fall back to line-at-a-time piping.
|
||||
tap_unbuffer()
|
||||
{
|
||||
if ! which stdbuf >/dev/null ; then
|
||||
"$@"
|
||||
else
|
||||
stdbuf -i0 -o0 -e0 "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
run_one()
|
||||
{
|
||||
DIR="$1"
|
||||
@@ -54,7 +44,7 @@ run_one()
|
||||
echo "not ok $test_num $TEST_HDR_MSG"
|
||||
else
|
||||
cd `dirname $TEST` > /dev/null
|
||||
(((((tap_unbuffer ./$BASENAME_TEST 2>&1; echo $? >&3) |
|
||||
(((((./$BASENAME_TEST 2>&1; echo $? >&3) |
|
||||
tap_prefix >&4) 3>&1) |
|
||||
(read xs; exit $xs)) 4>>"$logfile" &&
|
||||
echo "ok $test_num $TEST_HDR_MSG") ||
|
||||
|
@@ -62,6 +62,7 @@
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define TEST_TIMEOUT_DEFAULT 30
|
||||
|
||||
/* Utilities exposed to the test definitions */
|
||||
#ifndef TH_LOG_STREAM
|
||||
@@ -169,7 +170,8 @@
|
||||
static void test_name(struct __test_metadata *_metadata); \
|
||||
static struct __test_metadata _##test_name##_object = \
|
||||
{ .name = "global." #test_name, \
|
||||
.fn = &test_name, .termsig = _signal }; \
|
||||
.fn = &test_name, .termsig = _signal, \
|
||||
.timeout = TEST_TIMEOUT_DEFAULT, }; \
|
||||
static void __attribute__((constructor)) _register_##test_name(void) \
|
||||
{ \
|
||||
__register_test(&_##test_name##_object); \
|
||||
@@ -280,12 +282,15 @@
|
||||
*/
|
||||
/* TODO(wad) register fixtures on dedicated test lists. */
|
||||
#define TEST_F(fixture_name, test_name) \
|
||||
__TEST_F_IMPL(fixture_name, test_name, -1)
|
||||
__TEST_F_IMPL(fixture_name, test_name, -1, TEST_TIMEOUT_DEFAULT)
|
||||
|
||||
#define TEST_F_SIGNAL(fixture_name, test_name, signal) \
|
||||
__TEST_F_IMPL(fixture_name, test_name, signal)
|
||||
__TEST_F_IMPL(fixture_name, test_name, signal, TEST_TIMEOUT_DEFAULT)
|
||||
|
||||
#define __TEST_F_IMPL(fixture_name, test_name, signal) \
|
||||
#define TEST_F_TIMEOUT(fixture_name, test_name, timeout) \
|
||||
__TEST_F_IMPL(fixture_name, test_name, -1, timeout)
|
||||
|
||||
#define __TEST_F_IMPL(fixture_name, test_name, signal, tmout) \
|
||||
static void fixture_name##_##test_name( \
|
||||
struct __test_metadata *_metadata, \
|
||||
FIXTURE_DATA(fixture_name) *self); \
|
||||
@@ -307,6 +312,7 @@
|
||||
.name = #fixture_name "." #test_name, \
|
||||
.fn = &wrapper_##fixture_name##_##test_name, \
|
||||
.termsig = signal, \
|
||||
.timeout = tmout, \
|
||||
}; \
|
||||
static void __attribute__((constructor)) \
|
||||
_register_##fixture_name##_##test_name(void) \
|
||||
@@ -632,6 +638,7 @@ struct __test_metadata {
|
||||
int termsig;
|
||||
int passed;
|
||||
int trigger; /* extra handler after the evaluation */
|
||||
int timeout;
|
||||
__u8 step;
|
||||
bool no_print; /* manual trigger when TH_LOG_STREAM is not available */
|
||||
struct __test_metadata *prev, *next;
|
||||
@@ -696,7 +703,7 @@ void __run_test(struct __test_metadata *t)
|
||||
t->passed = 1;
|
||||
t->trigger = 0;
|
||||
printf("[ RUN ] %s\n", t->name);
|
||||
alarm(30);
|
||||
alarm(t->timeout);
|
||||
child_pid = fork();
|
||||
if (child_pid < 0) {
|
||||
printf("ERROR SPAWNING TEST CHILD\n");
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
include ../../../../scripts/Kbuild.include
|
||||
|
||||
all:
|
||||
@@ -34,7 +35,9 @@ LIBKVM += $(LIBKVM_$(UNAME_M))
|
||||
INSTALL_HDR_PATH = $(top_srcdir)/usr
|
||||
LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/
|
||||
LINUX_TOOL_INCLUDE = $(top_srcdir)/tools/include
|
||||
CFLAGS += -O2 -g -std=gnu99 -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -Iinclude/$(UNAME_M) -I..
|
||||
CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \
|
||||
-fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \
|
||||
-I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -Iinclude/$(UNAME_M) -I..
|
||||
|
||||
no-pie-option := $(call try-run, echo 'int main() { return 0; }' | \
|
||||
$(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie)
|
||||
|
@@ -131,6 +131,7 @@ static void *vcpu_worker(void *data)
|
||||
while (!READ_ONCE(host_quit)) {
|
||||
/* Let the guest dirty the random pages */
|
||||
ret = _vcpu_run(vm, VCPU_ID);
|
||||
TEST_ASSERT(ret == 0, "vcpu_run failed: %d\n", ret);
|
||||
if (get_ucall(vm, VCPU_ID, &uc) == UCALL_SYNC) {
|
||||
pages_count += TEST_PAGES_PER_LOOP;
|
||||
generate_random_array(guest_array, TEST_PAGES_PER_LOOP);
|
||||
@@ -292,7 +293,7 @@ static void run_test(enum vm_guest_mode mode, unsigned long iterations,
|
||||
* A little more than 1G of guest page sized pages. Cover the
|
||||
* case where the size is not aligned to 64 pages.
|
||||
*/
|
||||
guest_num_pages = (1ul << (30 - guest_page_shift)) + 3;
|
||||
guest_num_pages = (1ul << (30 - guest_page_shift)) + 16;
|
||||
host_page_size = getpagesize();
|
||||
host_num_pages = (guest_num_pages * guest_page_size) / host_page_size +
|
||||
!!((guest_num_pages * guest_page_size) % host_page_size);
|
||||
@@ -426,8 +427,11 @@ int main(int argc, char *argv[])
|
||||
unsigned long interval = TEST_HOST_LOOP_INTERVAL;
|
||||
bool mode_selected = false;
|
||||
uint64_t phys_offset = 0;
|
||||
unsigned int mode, host_ipa_limit;
|
||||
unsigned int mode;
|
||||
int opt, i;
|
||||
#ifdef __aarch64__
|
||||
unsigned int host_ipa_limit;
|
||||
#endif
|
||||
|
||||
#ifdef USE_CLEAR_DIRTY_LOG
|
||||
if (!kvm_check_cap(KVM_CAP_MANUAL_DIRTY_LOG_PROTECT2)) {
|
||||
|
@@ -118,10 +118,12 @@ void vcpu_events_get(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
struct kvm_vcpu_events *events);
|
||||
void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
struct kvm_vcpu_events *events);
|
||||
#ifdef __x86_64__
|
||||
void vcpu_nested_state_get(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
struct kvm_nested_state *state);
|
||||
int vcpu_nested_state_set(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
struct kvm_nested_state *state, bool ignore_error);
|
||||
#endif
|
||||
|
||||
const char *exit_reason_str(unsigned int exit_reason);
|
||||
|
||||
|
@@ -7,6 +7,8 @@
|
||||
|
||||
#define _GNU_SOURCE /* for program_invocation_name */
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include "kvm_util.h"
|
||||
#include "../kvm_util_internal.h"
|
||||
#include "processor.h"
|
||||
@@ -67,15 +69,13 @@ static uint64_t ptrs_per_pgd(struct kvm_vm *vm)
|
||||
return 1 << (vm->va_bits - shift);
|
||||
}
|
||||
|
||||
static uint64_t ptrs_per_pte(struct kvm_vm *vm)
|
||||
static uint64_t __maybe_unused ptrs_per_pte(struct kvm_vm *vm)
|
||||
{
|
||||
return 1 << (vm->page_shift - 3);
|
||||
}
|
||||
|
||||
void virt_pgd_alloc(struct kvm_vm *vm, uint32_t pgd_memslot)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!vm->pgd_created) {
|
||||
vm_paddr_t paddr = vm_phy_pages_alloc(vm,
|
||||
page_align(vm, ptrs_per_pgd(vm) * 8) / vm->page_size,
|
||||
@@ -181,6 +181,7 @@ vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
|
||||
unmapped_gva:
|
||||
TEST_ASSERT(false, "No mapping for vm virtual address, "
|
||||
"gva: 0x%lx", gva);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void pte_dump(FILE *stream, struct kvm_vm *vm, uint8_t indent, uint64_t page, int level)
|
||||
@@ -226,7 +227,7 @@ struct kvm_vm *vm_create_default(uint32_t vcpuid, uint64_t extra_mem_pages,
|
||||
uint64_t extra_pg_pages = (extra_mem_pages / ptrs_per_4k_pte) * 2;
|
||||
struct kvm_vm *vm;
|
||||
|
||||
vm = vm_create(VM_MODE_P52V48_4K, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
|
||||
vm = vm_create(VM_MODE_P40V48_4K, DEFAULT_GUEST_PHY_PAGES + extra_pg_pages, O_RDWR);
|
||||
|
||||
kvm_vm_elf_load(vm, program_invocation_name, 0, 0);
|
||||
vm_vcpu_add_default(vm, vcpuid, guest_code);
|
||||
@@ -312,6 +313,6 @@ void vcpu_dump(FILE *stream, struct kvm_vm *vm, uint32_t vcpuid, uint8_t indent)
|
||||
get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pstate), &pstate);
|
||||
get_reg(vm, vcpuid, ARM64_CORE_REG(regs.pc), &pc);
|
||||
|
||||
fprintf(stream, "%*spstate: 0x%.16llx pc: 0x%.16llx\n",
|
||||
fprintf(stream, "%*spstate: 0x%.16lx pc: 0x%.16lx\n",
|
||||
indent, "", pstate, pc);
|
||||
}
|
||||
|
@@ -135,7 +135,6 @@ struct kvm_vm *_vm_create(enum vm_guest_mode mode, uint64_t phy_pages,
|
||||
int perm, unsigned long type)
|
||||
{
|
||||
struct kvm_vm *vm;
|
||||
int kvm_fd;
|
||||
|
||||
vm = calloc(1, sizeof(*vm));
|
||||
TEST_ASSERT(vm != NULL, "Insufficient Memory");
|
||||
@@ -556,7 +555,6 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm,
|
||||
uint32_t flags)
|
||||
{
|
||||
int ret;
|
||||
unsigned long pmem_size = 0;
|
||||
struct userspace_mem_region *region;
|
||||
size_t huge_page_size = KVM_UTIL_PGS_PER_HUGEPG * vm->page_size;
|
||||
|
||||
@@ -1250,6 +1248,7 @@ void vcpu_events_set(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
ret, errno);
|
||||
}
|
||||
|
||||
#ifdef __x86_64__
|
||||
void vcpu_nested_state_get(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
struct kvm_nested_state *state)
|
||||
{
|
||||
@@ -1281,6 +1280,7 @@ int vcpu_nested_state_set(struct kvm_vm *vm, uint32_t vcpuid,
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* VM VCPU System Regs Get
|
||||
@@ -1334,7 +1334,6 @@ void vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_sregs *sregs)
|
||||
int _vcpu_sregs_set(struct kvm_vm *vm, uint32_t vcpuid, struct kvm_sregs *sregs)
|
||||
{
|
||||
struct vcpu *vcpu = vcpu_find(vm, vcpuid);
|
||||
int ret;
|
||||
|
||||
TEST_ASSERT(vcpu != NULL, "vcpu not found, vcpuid: %u", vcpuid);
|
||||
|
||||
|
@@ -142,7 +142,7 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
|
||||
vm_vaddr_t gva;
|
||||
TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8,
|
||||
"Unexpected ucall exit mmio address access");
|
||||
gva = *(vm_vaddr_t *)run->mmio.data;
|
||||
memcpy(&gva, run->mmio.data, sizeof(gva));
|
||||
memcpy(uc, addr_gva2hva(vm, gva), sizeof(*uc));
|
||||
}
|
||||
|
||||
|
@@ -229,8 +229,6 @@ void sregs_dump(FILE *stream, struct kvm_sregs *sregs,
|
||||
|
||||
void virt_pgd_alloc(struct kvm_vm *vm, uint32_t pgd_memslot)
|
||||
{
|
||||
int rc;
|
||||
|
||||
TEST_ASSERT(vm->mode == VM_MODE_P52V48_4K, "Attempt to use "
|
||||
"unknown or unsupported guest mode, mode: 0x%x", vm->mode);
|
||||
|
||||
@@ -549,7 +547,6 @@ vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
|
||||
struct pageDirectoryPointerEntry *pdpe;
|
||||
struct pageDirectoryEntry *pde;
|
||||
struct pageTableEntry *pte;
|
||||
void *hva;
|
||||
|
||||
TEST_ASSERT(vm->mode == VM_MODE_P52V48_4K, "Attempt to use "
|
||||
"unknown or unsupported guest mode, mode: 0x%x", vm->mode);
|
||||
@@ -582,6 +579,7 @@ vm_paddr_t addr_gva2gpa(struct kvm_vm *vm, vm_vaddr_t gva)
|
||||
unmapped_gva:
|
||||
TEST_ASSERT(false, "No mapping for vm virtual address, "
|
||||
"gva: 0x%lx", gva);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void kvm_setup_gdt(struct kvm_vm *vm, struct kvm_dtable *dt, int gdt_memslot,
|
||||
|
@@ -87,6 +87,7 @@ int main(int argc, char *argv[])
|
||||
while (1) {
|
||||
rc = _vcpu_run(vm, VCPU_ID);
|
||||
|
||||
TEST_ASSERT(rc == 0, "vcpu_run failed: %d\n", rc);
|
||||
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
||||
"Unexpected exit reason: %u (%s),\n",
|
||||
run->exit_reason,
|
||||
|
@@ -19,8 +19,6 @@
|
||||
|
||||
#define VCPU_ID 5
|
||||
|
||||
static bool have_nested_state;
|
||||
|
||||
void l2_guest_code(void)
|
||||
{
|
||||
GUEST_SYNC(6);
|
||||
@@ -73,7 +71,6 @@ void guest_code(struct vmx_pages *vmx_pages)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct vmx_pages *vmx_pages = NULL;
|
||||
vm_vaddr_t vmx_pages_gva = 0;
|
||||
|
||||
struct kvm_regs regs1, regs2;
|
||||
@@ -88,8 +85,6 @@ int main(int argc, char *argv[])
|
||||
.args[0] = (unsigned long)&evmcs_ver
|
||||
};
|
||||
|
||||
struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1);
|
||||
|
||||
/* Create VM */
|
||||
vm = vm_create_default(VCPU_ID, 0, guest_code);
|
||||
|
||||
@@ -113,7 +108,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
vcpu_regs_get(vm, VCPU_ID, ®s1);
|
||||
|
||||
vmx_pages = vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
|
||||
|
||||
for (stage = 1;; stage++) {
|
||||
|
@@ -52,15 +52,11 @@ static void test_hv_cpuid(struct kvm_cpuid2 *hv_cpuid_entries,
|
||||
TEST_ASSERT(entry->index == 0,
|
||||
".index field should be zero");
|
||||
|
||||
TEST_ASSERT(entry->index == 0,
|
||||
".index field should be zero");
|
||||
|
||||
TEST_ASSERT(entry->flags == 0,
|
||||
".flags field should be zero");
|
||||
|
||||
TEST_ASSERT(entry->padding[0] == entry->padding[1]
|
||||
== entry->padding[2] == 0,
|
||||
".index field should be zero");
|
||||
TEST_ASSERT(!entry->padding[0] && !entry->padding[1] &&
|
||||
!entry->padding[2], "padding should be zero");
|
||||
|
||||
/*
|
||||
* If needed for debug:
|
||||
@@ -90,7 +86,6 @@ struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(struct kvm_vm *vm)
|
||||
{
|
||||
int nent = 20; /* should be enough */
|
||||
static struct kvm_cpuid2 *cpuid;
|
||||
int ret;
|
||||
|
||||
cpuid = malloc(sizeof(*cpuid) + nent * sizeof(struct kvm_cpuid_entry2));
|
||||
|
||||
|
@@ -81,7 +81,6 @@ static void test_msr_platform_info_disabled(struct kvm_vm *vm)
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct kvm_vm *vm;
|
||||
struct kvm_run *state;
|
||||
int rv;
|
||||
uint64_t msr_platform_info;
|
||||
|
||||
|
@@ -87,7 +87,6 @@ void guest_code(struct vmx_pages *vmx_pages)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct vmx_pages *vmx_pages = NULL;
|
||||
vm_vaddr_t vmx_pages_gva = 0;
|
||||
|
||||
struct kvm_regs regs;
|
||||
@@ -115,7 +114,7 @@ int main(int argc, char *argv[])
|
||||
vcpu_set_msr(vm, VCPU_ID, MSR_IA32_SMBASE, SMRAM_GPA);
|
||||
|
||||
if (kvm_check_cap(KVM_CAP_NESTED_STATE)) {
|
||||
vmx_pages = vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
|
||||
} else {
|
||||
printf("will skip SMM test with VMX enabled\n");
|
||||
|
@@ -22,8 +22,6 @@
|
||||
|
||||
#define VCPU_ID 5
|
||||
|
||||
static bool have_nested_state;
|
||||
|
||||
void l2_guest_code(void)
|
||||
{
|
||||
GUEST_SYNC(6);
|
||||
@@ -122,7 +120,6 @@ void guest_code(struct vmx_pages *vmx_pages)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct vmx_pages *vmx_pages = NULL;
|
||||
vm_vaddr_t vmx_pages_gva = 0;
|
||||
|
||||
struct kvm_regs regs1, regs2;
|
||||
@@ -132,8 +129,6 @@ int main(int argc, char *argv[])
|
||||
struct ucall uc;
|
||||
int stage;
|
||||
|
||||
struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1);
|
||||
|
||||
/* Create VM */
|
||||
vm = vm_create_default(VCPU_ID, 0, guest_code);
|
||||
vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
|
||||
@@ -142,7 +137,7 @@ int main(int argc, char *argv[])
|
||||
vcpu_regs_get(vm, VCPU_ID, ®s1);
|
||||
|
||||
if (kvm_check_cap(KVM_CAP_NESTED_STATE)) {
|
||||
vmx_pages = vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
|
||||
} else {
|
||||
printf("will skip nested state checks\n");
|
||||
|
@@ -25,9 +25,15 @@
|
||||
|
||||
void guest_code(void)
|
||||
{
|
||||
/*
|
||||
* use a callee-save register, otherwise the compiler
|
||||
* saves it around the call to GUEST_SYNC.
|
||||
*/
|
||||
register u32 stage asm("rbx");
|
||||
for (;;) {
|
||||
GUEST_SYNC(0);
|
||||
asm volatile ("inc %r11");
|
||||
stage++;
|
||||
asm volatile ("" : : "r" (stage));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,7 +153,7 @@ int main(int argc, char *argv[])
|
||||
compare_vcpu_events(&events, &run->s.regs.events);
|
||||
|
||||
/* Set and verify various register values. */
|
||||
run->s.regs.regs.r11 = 0xBAD1DEA;
|
||||
run->s.regs.regs.rbx = 0xBAD1DEA;
|
||||
run->s.regs.sregs.apic_base = 1 << 11;
|
||||
/* TODO run->s.regs.events.XYZ = ABC; */
|
||||
|
||||
@@ -158,9 +164,9 @@ int main(int argc, char *argv[])
|
||||
"Unexpected exit reason: %u (%s),\n",
|
||||
run->exit_reason,
|
||||
exit_reason_str(run->exit_reason));
|
||||
TEST_ASSERT(run->s.regs.regs.r11 == 0xBAD1DEA + 1,
|
||||
"r11 sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.r11);
|
||||
TEST_ASSERT(run->s.regs.regs.rbx == 0xBAD1DEA + 1,
|
||||
"rbx sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.rbx);
|
||||
TEST_ASSERT(run->s.regs.sregs.apic_base == 1 << 11,
|
||||
"apic_base sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.sregs.apic_base);
|
||||
@@ -179,15 +185,15 @@ int main(int argc, char *argv[])
|
||||
*/
|
||||
run->kvm_valid_regs = TEST_SYNC_FIELDS;
|
||||
run->kvm_dirty_regs = 0;
|
||||
run->s.regs.regs.r11 = 0xDEADBEEF;
|
||||
run->s.regs.regs.rbx = 0xDEADBEEF;
|
||||
rv = _vcpu_run(vm, VCPU_ID);
|
||||
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
||||
"Unexpected exit reason: %u (%s),\n",
|
||||
run->exit_reason,
|
||||
exit_reason_str(run->exit_reason));
|
||||
TEST_ASSERT(run->s.regs.regs.r11 != 0xDEADBEEF,
|
||||
"r11 sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.r11);
|
||||
TEST_ASSERT(run->s.regs.regs.rbx != 0xDEADBEEF,
|
||||
"rbx sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.rbx);
|
||||
|
||||
/* Clear kvm_valid_regs bits and kvm_dirty_bits.
|
||||
* Verify s.regs values are not overwritten with existing guest values
|
||||
@@ -195,21 +201,21 @@ int main(int argc, char *argv[])
|
||||
*/
|
||||
run->kvm_valid_regs = 0;
|
||||
run->kvm_dirty_regs = 0;
|
||||
run->s.regs.regs.r11 = 0xAAAA;
|
||||
regs.r11 = 0xBAC0;
|
||||
run->s.regs.regs.rbx = 0xAAAA;
|
||||
regs.rbx = 0xBAC0;
|
||||
vcpu_regs_set(vm, VCPU_ID, ®s);
|
||||
rv = _vcpu_run(vm, VCPU_ID);
|
||||
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
||||
"Unexpected exit reason: %u (%s),\n",
|
||||
run->exit_reason,
|
||||
exit_reason_str(run->exit_reason));
|
||||
TEST_ASSERT(run->s.regs.regs.r11 == 0xAAAA,
|
||||
"r11 sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.r11);
|
||||
TEST_ASSERT(run->s.regs.regs.rbx == 0xAAAA,
|
||||
"rbx sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.rbx);
|
||||
vcpu_regs_get(vm, VCPU_ID, ®s);
|
||||
TEST_ASSERT(regs.r11 == 0xBAC0 + 1,
|
||||
"r11 guest value incorrect 0x%llx.",
|
||||
regs.r11);
|
||||
TEST_ASSERT(regs.rbx == 0xBAC0 + 1,
|
||||
"rbx guest value incorrect 0x%llx.",
|
||||
regs.rbx);
|
||||
|
||||
/* Clear kvm_valid_regs bits. Verify s.regs values are not overwritten
|
||||
* with existing guest values but that guest values are overwritten
|
||||
@@ -217,19 +223,19 @@ int main(int argc, char *argv[])
|
||||
*/
|
||||
run->kvm_valid_regs = 0;
|
||||
run->kvm_dirty_regs = TEST_SYNC_FIELDS;
|
||||
run->s.regs.regs.r11 = 0xBBBB;
|
||||
run->s.regs.regs.rbx = 0xBBBB;
|
||||
rv = _vcpu_run(vm, VCPU_ID);
|
||||
TEST_ASSERT(run->exit_reason == KVM_EXIT_IO,
|
||||
"Unexpected exit reason: %u (%s),\n",
|
||||
run->exit_reason,
|
||||
exit_reason_str(run->exit_reason));
|
||||
TEST_ASSERT(run->s.regs.regs.r11 == 0xBBBB,
|
||||
"r11 sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.r11);
|
||||
TEST_ASSERT(run->s.regs.regs.rbx == 0xBBBB,
|
||||
"rbx sync regs value incorrect 0x%llx.",
|
||||
run->s.regs.regs.rbx);
|
||||
vcpu_regs_get(vm, VCPU_ID, ®s);
|
||||
TEST_ASSERT(regs.r11 == 0xBBBB + 1,
|
||||
"r11 guest value incorrect 0x%llx.",
|
||||
regs.r11);
|
||||
TEST_ASSERT(regs.rbx == 0xBBBB + 1,
|
||||
"rbx guest value incorrect 0x%llx.",
|
||||
regs.rbx);
|
||||
|
||||
kvm_vm_free(vm);
|
||||
|
||||
|
@@ -39,8 +39,6 @@ static void l1_guest_code(struct vmx_pages *vmx_pages)
|
||||
{
|
||||
#define L2_GUEST_STACK_SIZE 64
|
||||
unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE];
|
||||
uint32_t control;
|
||||
uintptr_t save_cr3;
|
||||
|
||||
GUEST_ASSERT(prepare_for_vmx_operation(vmx_pages));
|
||||
GUEST_ASSERT(load_vmcs(vmx_pages));
|
||||
@@ -55,7 +53,6 @@ static void l1_guest_code(struct vmx_pages *vmx_pages)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct vmx_pages *vmx_pages;
|
||||
vm_vaddr_t vmx_pages_gva;
|
||||
struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1);
|
||||
|
||||
@@ -68,7 +65,7 @@ int main(int argc, char *argv[])
|
||||
vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
|
||||
|
||||
/* Allocate VMX pages and shared descriptors (vmx_pages). */
|
||||
vmx_pages = vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
|
||||
|
||||
for (;;) {
|
||||
|
@@ -75,7 +75,7 @@ void set_revision_id_for_vmcs12(struct kvm_nested_state *state,
|
||||
u32 vmcs12_revision)
|
||||
{
|
||||
/* Set revision_id in vmcs12 to vmcs12_revision. */
|
||||
*(u32 *)(state->data) = vmcs12_revision;
|
||||
memcpy(state->data, &vmcs12_revision, sizeof(u32));
|
||||
}
|
||||
|
||||
void set_default_state(struct kvm_nested_state *state)
|
||||
|
@@ -121,7 +121,7 @@ static void l1_guest_code(struct vmx_pages *vmx_pages)
|
||||
GUEST_DONE();
|
||||
}
|
||||
|
||||
void report(int64_t val)
|
||||
static void report(int64_t val)
|
||||
{
|
||||
printf("IA32_TSC_ADJUST is %ld (%lld * TSC_ADJUST_VALUE + %lld).\n",
|
||||
val, val / TSC_ADJUST_VALUE, val % TSC_ADJUST_VALUE);
|
||||
@@ -129,7 +129,6 @@ void report(int64_t val)
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct vmx_pages *vmx_pages;
|
||||
vm_vaddr_t vmx_pages_gva;
|
||||
struct kvm_cpuid_entry2 *entry = kvm_get_supported_cpuid_entry(1);
|
||||
|
||||
@@ -142,7 +141,7 @@ int main(int argc, char *argv[])
|
||||
vcpu_set_cpuid(vm, VCPU_ID, kvm_get_supported_cpuid());
|
||||
|
||||
/* Allocate VMX pages and shared descriptors (vmx_pages). */
|
||||
vmx_pages = vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_alloc_vmx(vm, &vmx_pages_gva);
|
||||
vcpu_args_set(vm, VCPU_ID, 1, vmx_pages_gva);
|
||||
|
||||
for (;;) {
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# Makefile for lib/ function selftests
|
||||
|
||||
# No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS += -g -I../../../../usr/include/
|
||||
|
||||
TEST_GEN_PROGS := membarrier_test
|
||||
|
@@ -15,6 +15,7 @@ GW_IP6=2001:db8:1::2
|
||||
SRC_IP6=2001:db8:1::3
|
||||
|
||||
DEV_ADDR=192.51.100.1
|
||||
DEV_ADDR6=2001:db8:1::1
|
||||
DEV=dummy0
|
||||
|
||||
log_test()
|
||||
@@ -55,8 +56,8 @@ setup()
|
||||
|
||||
$IP link add dummy0 type dummy
|
||||
$IP link set dev dummy0 up
|
||||
$IP address add 198.51.100.1/24 dev dummy0
|
||||
$IP -6 address add 2001:db8:1::1/64 dev dummy0
|
||||
$IP address add $DEV_ADDR/24 dev dummy0
|
||||
$IP -6 address add $DEV_ADDR6/64 dev dummy0
|
||||
|
||||
set +e
|
||||
}
|
||||
@@ -186,8 +187,13 @@ fib_rule4_test()
|
||||
match="oif $DEV"
|
||||
fib_rule4_test_match_n_redirect "$match" "$match" "oif redirect to table"
|
||||
|
||||
# need enable forwarding and disable rp_filter temporarily as all the
|
||||
# addresses are in the same subnet and egress device == ingress device.
|
||||
ip netns exec testns sysctl -w net.ipv4.ip_forward=1
|
||||
ip netns exec testns sysctl -w net.ipv4.conf.$DEV.rp_filter=0
|
||||
match="from $SRC_IP iif $DEV"
|
||||
fib_rule4_test_match_n_redirect "$match" "$match" "iif redirect to table"
|
||||
ip netns exec testns sysctl -w net.ipv4.ip_forward=0
|
||||
|
||||
match="tos 0x10"
|
||||
fib_rule4_test_match_n_redirect "$match" "$match" "tos redirect to table"
|
||||
|
@@ -145,16 +145,19 @@ bc_forwarding_disable()
|
||||
{
|
||||
sysctl_set net.ipv4.conf.all.bc_forwarding 0
|
||||
sysctl_set net.ipv4.conf.$rp1.bc_forwarding 0
|
||||
sysctl_set net.ipv4.conf.$rp2.bc_forwarding 0
|
||||
}
|
||||
|
||||
bc_forwarding_enable()
|
||||
{
|
||||
sysctl_set net.ipv4.conf.all.bc_forwarding 1
|
||||
sysctl_set net.ipv4.conf.$rp1.bc_forwarding 1
|
||||
sysctl_set net.ipv4.conf.$rp2.bc_forwarding 1
|
||||
}
|
||||
|
||||
bc_forwarding_restore()
|
||||
{
|
||||
sysctl_restore net.ipv4.conf.$rp2.bc_forwarding
|
||||
sysctl_restore net.ipv4.conf.$rp1.bc_forwarding
|
||||
sysctl_restore net.ipv4.conf.all.bc_forwarding
|
||||
}
|
||||
@@ -171,7 +174,7 @@ ping_test_from()
|
||||
log_info "ping $dip, expected reply from $from"
|
||||
ip vrf exec $(master_name_get $oif) \
|
||||
$PING -I $oif $dip -c 10 -i 0.1 -w $PING_TIMEOUT -b 2>&1 \
|
||||
| grep $from &> /dev/null
|
||||
| grep "bytes from $from" > /dev/null
|
||||
check_err_fail $fail $?
|
||||
}
|
||||
|
||||
|
@@ -208,8 +208,8 @@ tunnel6_a_addr="fd00:2::a"
|
||||
tunnel6_b_addr="fd00:2::b"
|
||||
tunnel6_mask="64"
|
||||
|
||||
dummy6_0_addr="fc00:1000::0"
|
||||
dummy6_1_addr="fc00:1001::0"
|
||||
dummy6_0_prefix="fc00:1000::"
|
||||
dummy6_1_prefix="fc00:1001::"
|
||||
dummy6_mask="64"
|
||||
|
||||
cleanup_done=1
|
||||
@@ -430,15 +430,15 @@ setup_xfrm() {
|
||||
veth_a_addr="${2}"
|
||||
veth_b_addr="${3}"
|
||||
|
||||
run_cmd "${ns_a} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel" || return 1
|
||||
run_cmd "${ns_a} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_a} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel"
|
||||
run_cmd "${ns_a} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel"
|
||||
run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel || return 1
|
||||
run_cmd ${ns_a} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_a} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
|
||||
run_cmd ${ns_a} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
|
||||
|
||||
run_cmd "${ns_b} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel"
|
||||
run_cmd "${ns_b} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel"
|
||||
run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_a_addr} dst ${veth_b_addr} spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm state add src ${veth_b_addr} dst ${veth_a_addr} spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm policy add dir out mark 10 tmpl src ${veth_b_addr} dst ${veth_a_addr} proto esp mode tunnel
|
||||
run_cmd ${ns_b} ip -${proto} xfrm policy add dir in mark 10 tmpl src ${veth_a_addr} dst ${veth_b_addr} proto esp mode tunnel
|
||||
}
|
||||
|
||||
setup_xfrm4() {
|
||||
@@ -1005,13 +1005,13 @@ test_pmtu_vti6_link_change_mtu() {
|
||||
run_cmd ${ns_a} ip link set dummy0 up
|
||||
run_cmd ${ns_a} ip link set dummy1 up
|
||||
|
||||
run_cmd ${ns_a} ip addr add ${dummy6_0_addr}/${dummy6_mask} dev dummy0
|
||||
run_cmd ${ns_a} ip addr add ${dummy6_1_addr}/${dummy6_mask} dev dummy1
|
||||
run_cmd ${ns_a} ip addr add ${dummy6_0_prefix}1/${dummy6_mask} dev dummy0
|
||||
run_cmd ${ns_a} ip addr add ${dummy6_1_prefix}1/${dummy6_mask} dev dummy1
|
||||
|
||||
fail=0
|
||||
|
||||
# Create vti6 interface bound to device, passing MTU, check it
|
||||
run_cmd ${ns_a} ip link add vti6_a mtu 1300 type vti6 remote ${dummy6_0_addr} local ${dummy6_0_addr}
|
||||
run_cmd ${ns_a} ip link add vti6_a mtu 1300 type vti6 remote ${dummy6_0_prefix}2 local ${dummy6_0_prefix}1
|
||||
mtu="$(link_get_mtu "${ns_a}" vti6_a)"
|
||||
if [ ${mtu} -ne 1300 ]; then
|
||||
err " vti6 MTU ${mtu} doesn't match configured value 1300"
|
||||
@@ -1020,7 +1020,7 @@ test_pmtu_vti6_link_change_mtu() {
|
||||
|
||||
# Move to another device with different MTU, without passing MTU, check
|
||||
# MTU is adjusted
|
||||
run_cmd ${ns_a} ip link set vti6_a type vti6 remote ${dummy6_1_addr} local ${dummy6_1_addr}
|
||||
run_cmd ${ns_a} ip link set vti6_a type vti6 remote ${dummy6_1_prefix}2 local ${dummy6_1_prefix}1
|
||||
mtu="$(link_get_mtu "${ns_a}" vti6_a)"
|
||||
if [ ${mtu} -ne $((3000 - 40)) ]; then
|
||||
err " vti MTU ${mtu} is not dummy MTU 3000 minus IPv6 header length"
|
||||
@@ -1028,7 +1028,7 @@ test_pmtu_vti6_link_change_mtu() {
|
||||
fi
|
||||
|
||||
# Move it back, passing MTU, check MTU is not overridden
|
||||
run_cmd ${ns_a} ip link set vti6_a mtu 1280 type vti6 remote ${dummy6_0_addr} local ${dummy6_0_addr}
|
||||
run_cmd ${ns_a} ip link set vti6_a mtu 1280 type vti6 remote ${dummy6_0_prefix}2 local ${dummy6_0_prefix}1
|
||||
mtu="$(link_get_mtu "${ns_a}" vti6_a)"
|
||||
if [ ${mtu} -ne 1280 ]; then
|
||||
err " vti6 MTU ${mtu} doesn't match configured value 1280"
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2013 Google Inc.
|
||||
* Author: Willem de Bruijn (willemb@google.com)
|
||||
@@ -24,21 +25,6 @@
|
||||
*
|
||||
* Todo:
|
||||
* - functionality: PACKET_FANOUT_FLAG_DEFRAG
|
||||
*
|
||||
* License (GPLv2):
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE /* for sched_setaffinity */
|
||||
|
@@ -1,22 +1,8 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2013 Google Inc.
|
||||
* Author: Willem de Bruijn <willemb@google.com>
|
||||
* Daniel Borkmann <dborkman@redhat.com>
|
||||
*
|
||||
* License (GPLv2):
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef PSOCK_LIB_H
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2013 Red Hat, Inc.
|
||||
* Author: Daniel Borkmann <dborkman@redhat.com>
|
||||
@@ -19,21 +20,6 @@
|
||||
* - TPACKET_V1: RX_RING, TX_RING
|
||||
* - TPACKET_V2: RX_RING, TX_RING
|
||||
* - TPACKET_V3: RX_RING
|
||||
*
|
||||
* License (GPLv2):
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,19 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2018 Google Inc.
|
||||
* Author: Soheil Hassas Yeganeh (soheil@google.com)
|
||||
*
|
||||
* Simple example on how to use TCP_INQ and TCP_CM_INQ.
|
||||
*
|
||||
* License (GPLv2):
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2018 Google Inc.
|
||||
* Author: Eric Dumazet (edumazet@google.com)
|
||||
@@ -44,21 +45,6 @@
|
||||
* cpu usage user:0.046 sys:3.559, 110.016 usec per MB, 65529 c-switches
|
||||
* received 32768 MB (99.9939 % mmap'ed) in 7.43764 s, 36.9577 Gbit
|
||||
* cpu usage user:0.035 sys:3.467, 106.873 usec per MB, 65530 c-switches
|
||||
*
|
||||
* License (GPLv2):
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <pthread.h>
|
||||
|
@@ -442,6 +442,21 @@ TEST_F(tls, multiple_send_single_recv)
|
||||
EXPECT_EQ(memcmp(send_mem, recv_mem + send_len, send_len), 0);
|
||||
}
|
||||
|
||||
TEST_F(tls, single_send_multiple_recv_non_align)
|
||||
{
|
||||
const unsigned int total_len = 15;
|
||||
const unsigned int recv_len = 10;
|
||||
char recv_mem[recv_len * 2];
|
||||
char send_mem[total_len];
|
||||
|
||||
EXPECT_GE(send(self->fd, send_mem, total_len, 0), 0);
|
||||
memset(recv_mem, 0, total_len);
|
||||
|
||||
EXPECT_EQ(recv(self->cfd, recv_mem, recv_len, 0), recv_len);
|
||||
EXPECT_EQ(recv(self->cfd, recv_mem + recv_len, recv_len, 0), 5);
|
||||
EXPECT_EQ(memcmp(send_mem, recv_mem, total_len), 0);
|
||||
}
|
||||
|
||||
TEST_F(tls, recv_partial)
|
||||
{
|
||||
char const *test_str = "test_read_partial";
|
||||
@@ -575,6 +590,25 @@ TEST_F(tls, recv_peek_large_buf_mult_recs)
|
||||
EXPECT_EQ(memcmp(test_str, buf, len), 0);
|
||||
}
|
||||
|
||||
TEST_F(tls, recv_lowat)
|
||||
{
|
||||
char send_mem[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
|
||||
char recv_mem[20];
|
||||
int lowat = 8;
|
||||
|
||||
EXPECT_EQ(send(self->fd, send_mem, 10, 0), 10);
|
||||
EXPECT_EQ(send(self->fd, send_mem, 5, 0), 5);
|
||||
|
||||
memset(recv_mem, 0, 20);
|
||||
EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVLOWAT,
|
||||
&lowat, sizeof(lowat)), 0);
|
||||
EXPECT_EQ(recv(self->cfd, recv_mem, 1, MSG_WAITALL), 1);
|
||||
EXPECT_EQ(recv(self->cfd, recv_mem + 1, 6, MSG_WAITALL), 6);
|
||||
EXPECT_EQ(recv(self->cfd, recv_mem + 7, 10, 0), 8);
|
||||
|
||||
EXPECT_EQ(memcmp(send_mem, recv_mem, 10), 0);
|
||||
EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
|
||||
}
|
||||
|
||||
TEST_F(tls, pollin)
|
||||
{
|
||||
|
@@ -2,6 +2,6 @@
|
||||
# Makefile for netfilter selftests
|
||||
|
||||
TEST_PROGS := nft_trans_stress.sh nft_nat.sh bridge_brouter.sh \
|
||||
conntrack_icmp_related.sh
|
||||
conntrack_icmp_related.sh nft_flowtable.sh
|
||||
|
||||
include ../lib.mk
|
||||
|
324
tools/testing/selftests/netfilter/nft_flowtable.sh
Executable file
324
tools/testing/selftests/netfilter/nft_flowtable.sh
Executable file
@@ -0,0 +1,324 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# This tests basic flowtable functionality.
|
||||
# Creates following topology:
|
||||
#
|
||||
# Originator (MTU 9000) <-Router1-> MTU 1500 <-Router2-> Responder (MTU 2000)
|
||||
# Router1 is the one doing flow offloading, Router2 has no special
|
||||
# purpose other than having a link that is smaller than either Originator
|
||||
# and responder, i.e. TCPMSS announced values are too large and will still
|
||||
# result in fragmentation and/or PMTU discovery.
|
||||
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
ret=0
|
||||
|
||||
ns1in=""
|
||||
ns2in=""
|
||||
ns1out=""
|
||||
ns2out=""
|
||||
|
||||
log_netns=$(sysctl -n net.netfilter.nf_log_all_netns)
|
||||
|
||||
nft --version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without nft tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
ip -Version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
which nc > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without nc (netcat)"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
ip netns add nsr1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not create net namespace"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
ip netns add ns1
|
||||
ip netns add ns2
|
||||
|
||||
ip netns add nsr2
|
||||
|
||||
cleanup() {
|
||||
for i in 1 2; do
|
||||
ip netns del ns$i
|
||||
ip netns del nsr$i
|
||||
done
|
||||
|
||||
rm -f "$ns1in" "$ns1out"
|
||||
rm -f "$ns2in" "$ns2out"
|
||||
|
||||
[ $log_netns -eq 0 ] && sysctl -q net.netfilter.nf_log_all_netns=$log_netns
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
sysctl -q net.netfilter.nf_log_all_netns=1
|
||||
|
||||
ip link add veth0 netns nsr1 type veth peer name eth0 netns ns1
|
||||
ip link add veth1 netns nsr1 type veth peer name veth0 netns nsr2
|
||||
|
||||
ip link add veth1 netns nsr2 type veth peer name eth0 netns ns2
|
||||
|
||||
for dev in lo veth0 veth1; do
|
||||
for i in 1 2; do
|
||||
ip -net nsr$i link set $dev up
|
||||
done
|
||||
done
|
||||
|
||||
ip -net nsr1 addr add 10.0.1.1/24 dev veth0
|
||||
ip -net nsr1 addr add dead:1::1/64 dev veth0
|
||||
|
||||
ip -net nsr2 addr add 10.0.2.1/24 dev veth1
|
||||
ip -net nsr2 addr add dead:2::1/64 dev veth1
|
||||
|
||||
# set different MTUs so we need to push packets coming from ns1 (large MTU)
|
||||
# to ns2 (smaller MTU) to stack either to perform fragmentation (ip_no_pmtu_disc=1),
|
||||
# or to do PTMU discovery (send ICMP error back to originator).
|
||||
# ns2 is going via nsr2 with a smaller mtu, so that TCPMSS announced by both peers
|
||||
# is NOT the lowest link mtu.
|
||||
|
||||
ip -net nsr1 link set veth0 mtu 9000
|
||||
ip -net ns1 link set eth0 mtu 9000
|
||||
|
||||
ip -net nsr2 link set veth1 mtu 2000
|
||||
ip -net ns2 link set eth0 mtu 2000
|
||||
|
||||
# transfer-net between nsr1 and nsr2.
|
||||
# these addresses are not used for connections.
|
||||
ip -net nsr1 addr add 192.168.10.1/24 dev veth1
|
||||
ip -net nsr1 addr add fee1:2::1/64 dev veth1
|
||||
|
||||
ip -net nsr2 addr add 192.168.10.2/24 dev veth0
|
||||
ip -net nsr2 addr add fee1:2::2/64 dev veth0
|
||||
|
||||
for i in 1 2; do
|
||||
ip netns exec nsr$i sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null
|
||||
ip netns exec nsr$i sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null
|
||||
|
||||
ip -net ns$i link set lo up
|
||||
ip -net ns$i link set eth0 up
|
||||
ip -net ns$i addr add 10.0.$i.99/24 dev eth0
|
||||
ip -net ns$i route add default via 10.0.$i.1
|
||||
ip -net ns$i addr add dead:$i::99/64 dev eth0
|
||||
ip -net ns$i route add default via dead:$i::1
|
||||
ip netns exec ns$i sysctl net.ipv4.tcp_no_metrics_save=1 > /dev/null
|
||||
|
||||
# don't set ip DF bit for first two tests
|
||||
ip netns exec ns$i sysctl net.ipv4.ip_no_pmtu_disc=1 > /dev/null
|
||||
done
|
||||
|
||||
ip -net nsr1 route add default via 192.168.10.2
|
||||
ip -net nsr2 route add default via 192.168.10.1
|
||||
|
||||
ip netns exec nsr1 nft -f - <<EOF
|
||||
table inet filter {
|
||||
flowtable f1 {
|
||||
hook ingress priority 0
|
||||
devices = { veth0, veth1 }
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# flow offloaded? Tag ct with mark 1, so we can detect when it fails.
|
||||
meta oif "veth1" tcp dport 12345 flow offload @f1 counter
|
||||
|
||||
# use packet size to trigger 'should be offloaded by now'.
|
||||
# otherwise, if 'flow offload' expression never offloads, the
|
||||
# test will pass.
|
||||
tcp dport 12345 meta length gt 200 ct mark set 1 counter
|
||||
|
||||
# this turns off flow offloading internally, so expect packets again
|
||||
tcp flags fin,rst ct mark set 0 accept
|
||||
|
||||
# this allows large packets from responder, we need this as long
|
||||
# as PMTUd is off.
|
||||
# This rule is deleted for the last test, when we expect PMTUd
|
||||
# to kick in and ensure all packets meet mtu requirements.
|
||||
meta length gt 1500 accept comment something-to-grep-for
|
||||
|
||||
# next line blocks connection w.o. working offload.
|
||||
# we only do this for reverse dir, because we expect packets to
|
||||
# enter slow path due to MTU mismatch of veth0 and veth1.
|
||||
tcp sport 12345 ct mark 1 counter log prefix "mark failure " drop
|
||||
|
||||
ct state established,related accept
|
||||
|
||||
# for packets that we can't offload yet, i.e. SYN (any ct that is not confirmed)
|
||||
meta length lt 200 oif "veth1" tcp dport 12345 counter accept
|
||||
|
||||
meta nfproto ipv4 meta l4proto icmp accept
|
||||
meta nfproto ipv6 meta l4proto icmpv6 accept
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "SKIP: Could not load nft ruleset"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
# test basic connectivity
|
||||
ip netns exec ns1 ping -c 1 -q 10.0.2.99 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
echo "ERROR: ns1 cannot reach ns2" 1>&2
|
||||
bash
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ip netns exec ns2 ping -c 1 -q 10.0.1.99 > /dev/null
|
||||
if [ $? -ne 0 ];then
|
||||
echo "ERROR: ns2 cannot reach ns1" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $ret -eq 0 ];then
|
||||
echo "PASS: netns routing/connectivity: ns1 can reach ns2"
|
||||
fi
|
||||
|
||||
ns1in=$(mktemp)
|
||||
ns1out=$(mktemp)
|
||||
ns2in=$(mktemp)
|
||||
ns2out=$(mktemp)
|
||||
|
||||
make_file()
|
||||
{
|
||||
name=$1
|
||||
who=$2
|
||||
|
||||
SIZE=$((RANDOM % (1024 * 8)))
|
||||
TSIZE=$((SIZE * 1024))
|
||||
|
||||
dd if=/dev/urandom of="$name" bs=1024 count=$SIZE 2> /dev/null
|
||||
|
||||
SIZE=$((RANDOM % 1024))
|
||||
SIZE=$((SIZE + 128))
|
||||
TSIZE=$((TSIZE + SIZE))
|
||||
dd if=/dev/urandom conf=notrunc of="$name" bs=1 count=$SIZE 2> /dev/null
|
||||
}
|
||||
|
||||
check_transfer()
|
||||
{
|
||||
in=$1
|
||||
out=$2
|
||||
what=$3
|
||||
|
||||
cmp "$in" "$out" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ] ;then
|
||||
echo "FAIL: file mismatch for $what" 1>&2
|
||||
ls -l "$in"
|
||||
ls -l "$out"
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
test_tcp_forwarding()
|
||||
{
|
||||
local nsa=$1
|
||||
local nsb=$2
|
||||
local lret=0
|
||||
|
||||
ip netns exec $nsb nc -w 5 -l -p 12345 < "$ns2in" > "$ns2out" &
|
||||
lpid=$!
|
||||
|
||||
sleep 1
|
||||
ip netns exec $nsa nc -w 4 10.0.2.99 12345 < "$ns1in" > "$ns1out" &
|
||||
cpid=$!
|
||||
|
||||
sleep 3
|
||||
|
||||
kill $lpid
|
||||
kill $cpid
|
||||
wait
|
||||
|
||||
check_transfer "$ns1in" "$ns2out" "ns1 -> ns2"
|
||||
if [ $? -ne 0 ];then
|
||||
lret=1
|
||||
fi
|
||||
|
||||
check_transfer "$ns2in" "$ns1out" "ns1 <- ns2"
|
||||
if [ $? -ne 0 ];then
|
||||
lret=1
|
||||
fi
|
||||
|
||||
return $lret
|
||||
}
|
||||
|
||||
make_file "$ns1in" "ns1"
|
||||
make_file "$ns2in" "ns2"
|
||||
|
||||
# First test:
|
||||
# No PMTU discovery, nsr1 is expected to fragment packets from ns1 to ns2 as needed.
|
||||
test_tcp_forwarding ns1 ns2
|
||||
if [ $? -eq 0 ] ;then
|
||||
echo "PASS: flow offloaded for ns1/ns2"
|
||||
else
|
||||
echo "FAIL: flow offload for ns1/ns2:" 1>&2
|
||||
ip netns exec nsr1 nft list ruleset
|
||||
ret=1
|
||||
fi
|
||||
|
||||
# delete default route, i.e. ns2 won't be able to reach ns1 and
|
||||
# will depend on ns1 being masqueraded in nsr1.
|
||||
# expect ns1 has nsr1 address.
|
||||
ip -net ns2 route del default via 10.0.2.1
|
||||
ip -net ns2 route del default via dead:2::1
|
||||
ip -net ns2 route add 192.168.10.1 via 10.0.2.1
|
||||
|
||||
# Second test:
|
||||
# Same, but with NAT enabled.
|
||||
ip netns exec nsr1 nft -f - <<EOF
|
||||
table ip nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 0; policy accept;
|
||||
meta oifname "veth1" masquerade
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
test_tcp_forwarding ns1 ns2
|
||||
|
||||
if [ $? -eq 0 ] ;then
|
||||
echo "PASS: flow offloaded for ns1/ns2 with NAT"
|
||||
else
|
||||
echo "FAIL: flow offload for ns1/ns2 with NAT" 1>&2
|
||||
ip netns exec nsr1 nft list ruleset
|
||||
ret=1
|
||||
fi
|
||||
|
||||
# Third test:
|
||||
# Same as second test, but with PMTU discovery enabled.
|
||||
handle=$(ip netns exec nsr1 nft -a list table inet filter | grep something-to-grep-for | cut -d \# -f 2)
|
||||
|
||||
ip netns exec nsr1 nft delete rule inet filter forward $handle
|
||||
if [ $? -ne 0 ] ;then
|
||||
echo "FAIL: Could not delete large-packet accept rule"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ip netns exec ns1 sysctl net.ipv4.ip_no_pmtu_disc=0 > /dev/null
|
||||
ip netns exec ns2 sysctl net.ipv4.ip_no_pmtu_disc=0 > /dev/null
|
||||
|
||||
test_tcp_forwarding ns1 ns2
|
||||
if [ $? -eq 0 ] ;then
|
||||
echo "PASS: flow offloaded for ns1/ns2 with NAT and pmtu discovery"
|
||||
else
|
||||
echo "FAIL: flow offload for ns1/ns2 with NAT and pmtu discovery" 1>&2
|
||||
ip netns exec nsr1 nft list ruleset
|
||||
fi
|
||||
|
||||
exit $ret
|
@@ -8,6 +8,11 @@ ksft_skip=4
|
||||
ret=0
|
||||
test_inet_nat=true
|
||||
|
||||
cleanup()
|
||||
{
|
||||
for i in 0 1 2; do ip netns del ns$i;done
|
||||
}
|
||||
|
||||
nft --version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without nft tool"
|
||||
@@ -21,10 +26,21 @@ if [ $? -ne 0 ];then
|
||||
fi
|
||||
|
||||
ip netns add ns0
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not create net namespace"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
ip netns add ns1
|
||||
ip netns add ns2
|
||||
|
||||
ip link add veth0 netns ns0 type veth peer name eth0 netns ns1
|
||||
ip link add veth0 netns ns0 type veth peer name eth0 netns ns1 > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: No virtual ethernet pair device support in kernel"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
ip link add veth1 netns ns0 type veth peer name eth0 netns ns2
|
||||
|
||||
ip -net ns0 link set lo up
|
||||
@@ -347,7 +363,7 @@ EOF
|
||||
test_masquerade6()
|
||||
{
|
||||
local family=$1
|
||||
local natflags=$1
|
||||
local natflags=$2
|
||||
local lret=0
|
||||
|
||||
ip netns exec ns0 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
|
||||
@@ -392,18 +408,13 @@ EOF
|
||||
|
||||
ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
<<<<<<< HEAD
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerading"
|
||||
=======
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerade $natflags"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
# ns1 should have seen packets from ns0, due to masquerade
|
||||
expect="packets 1 bytes 104"
|
||||
for dir in "in6" "out6" ; do
|
||||
|
||||
cnt=$(ip netns exec ns1 nft list counter inet filter ns0${dir} | grep -q "$expect")
|
||||
if [ $? -ne 0 ]; then
|
||||
bad_counter ns1 ns0$dir "$expect"
|
||||
@@ -433,38 +444,27 @@ EOF
|
||||
fi
|
||||
done
|
||||
|
||||
<<<<<<< HEAD
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
=======
|
||||
ip netns exec ns2 ping -q -c 1 dead:1::99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ipv6 masquerade $natflags (attempt 2)"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
ip netns exec ns0 nft flush chain ip6 nat postrouting
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Could not flush $family nat postrouting" 1>&2
|
||||
lret=1
|
||||
fi
|
||||
|
||||
<<<<<<< HEAD
|
||||
test $lret -eq 0 && echo "PASS: $family IPv6 masquerade for ns2"
|
||||
=======
|
||||
test $lret -eq 0 && echo "PASS: IPv6 masquerade $natflags for ns2"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
test $lret -eq 0 && echo "PASS: $family IPv6 masquerade $natflags for ns2"
|
||||
|
||||
return $lret
|
||||
}
|
||||
|
||||
test_masquerade()
|
||||
{
|
||||
<<<<<<< HEAD
|
||||
local family=$1
|
||||
=======
|
||||
local natflags=$1
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
local natflags=$2
|
||||
local lret=0
|
||||
|
||||
ip netns exec ns0 sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null
|
||||
@@ -509,11 +509,7 @@ EOF
|
||||
|
||||
ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
<<<<<<< HEAD
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerading"
|
||||
=======
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ip masquere $natflags"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active $family masquerade $natflags"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
@@ -549,27 +545,19 @@ EOF
|
||||
fi
|
||||
done
|
||||
|
||||
<<<<<<< HEAD
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
=======
|
||||
ip netns exec ns2 ping -q -c 1 10.0.1.99 > /dev/null # ping ns2->ns1
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "ERROR: cannot ping ns1 from ns2 with active ip masquerade $natflags (attempt 2)"
|
||||
lret=1
|
||||
fi
|
||||
|
||||
ip netns exec ns0 nft flush chain ip nat postrouting
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
ip netns exec ns0 nft flush chain $family nat postrouting
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR: Could not flush $family nat postrouting" 1>&2
|
||||
lret=1
|
||||
fi
|
||||
|
||||
<<<<<<< HEAD
|
||||
test $lret -eq 0 && echo "PASS: $family IP masquerade for ns2"
|
||||
=======
|
||||
test $lret -eq 0 && echo "PASS: IP masquerade $natflags for ns2"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
test $lret -eq 0 && echo "PASS: $family IP masquerade $natflags for ns2"
|
||||
|
||||
return $lret
|
||||
}
|
||||
@@ -842,21 +830,14 @@ reset_counters
|
||||
$test_inet_nat && test_local_dnat inet
|
||||
$test_inet_nat && test_local_dnat6 inet
|
||||
|
||||
for flags in "" "fully-random"; do
|
||||
reset_counters
|
||||
<<<<<<< HEAD
|
||||
test_masquerade ip
|
||||
test_masquerade6 ip6
|
||||
test_masquerade ip $flags
|
||||
test_masquerade6 ip6 $flags
|
||||
reset_counters
|
||||
$test_inet_nat && test_masquerade inet
|
||||
$test_inet_nat && test_masquerade6 inet
|
||||
=======
|
||||
test_masquerade ""
|
||||
test_masquerade6 ""
|
||||
|
||||
reset_counters
|
||||
test_masquerade "fully-random"
|
||||
test_masquerade6 "fully-random"
|
||||
>>>>>>> cd8dead0c39457e58ec1d36db93aedca811d48f1
|
||||
$test_inet_nat && test_masquerade inet $flags
|
||||
$test_inet_nat && test_masquerade6 inet $flags
|
||||
done
|
||||
|
||||
reset_counters
|
||||
test_redirect ip
|
||||
@@ -865,6 +846,4 @@ reset_counters
|
||||
$test_inet_nat && test_redirect inet
|
||||
$test_inet_nat && test_redirect6 inet
|
||||
|
||||
for i in 0 1 2; do ip netns del ns$i;done
|
||||
|
||||
exit $ret
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* This program demonstrates how the various time stamping features in
|
||||
* the Linux kernel work. It emulates the behavior of a PTP
|
||||
@@ -14,19 +15,6 @@
|
||||
*
|
||||
* Copyright (C) 2009 Intel Corporation.
|
||||
* Author: Patrick Ohly <patrick.ohly@intel.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2014 Google Inc.
|
||||
* Author: willemb@google.com (Willem de Bruijn)
|
||||
@@ -14,20 +15,6 @@
|
||||
*
|
||||
* This test requires a dummy TCP server.
|
||||
* A simple `nc6 [-u] -l -p $DESTPORT` will do
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
TEST_GEN_PROGS := owner pidns
|
||||
|
||||
CFLAGS := -Wall -Werror
|
||||
|
@@ -1,16 +1,7 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
# Copyright (c) 2016 Microsemi. All Rights Reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it would be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# Author: Logan Gunthorpe <logang@deltatee.com>
|
||||
|
||||
REMOTE_HOST=
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
CFLAGS += -g -I../../../../usr/include/
|
||||
|
||||
TEST_GEN_PROGS := pidfd_test
|
||||
|
@@ -16,6 +16,10 @@
|
||||
|
||||
#include "../kselftest.h"
|
||||
|
||||
#ifndef __NR_pidfd_send_signal
|
||||
#define __NR_pidfd_send_signal -1
|
||||
#endif
|
||||
|
||||
static inline int sys_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
|
||||
unsigned int flags)
|
||||
{
|
||||
|
@@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
TEST_GEN_PROGS := copy_first_unaligned alignment_handler
|
||||
|
||||
top_srcdir = ../../../../..
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Test the powerpc alignment handler on POWER8/POWER9
|
||||
*
|
||||
* Copyright (C) 2017 IBM Corporation (Michael Neuling, Andrew Donnellan)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@@ -1,14 +1,9 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Copyright 2016, Chris Smart, IBM Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* Calls to copy_first which are not 128-byte aligned should be
|
||||
* caught and sent a SIGBUS.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <signal.h>
|
||||
|
@@ -1,12 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Context switch microbenchmark.
|
||||
*
|
||||
* Copyright (C) 2015 Anton Blanchard <anton@au.ibm.com>, IBM
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user