-
Notifications
You must be signed in to change notification settings - Fork 304
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1421 from puranjaymohan/amzn2023-tests
test/integration/amzn-2023: Add integration tests for AL2023
- Loading branch information
Showing
16 changed files
with
530 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#!/bin/bash | ||
|
||
grep "kpatch: 5" /proc/meminfo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c | ||
--- src.orig/fs/proc/meminfo.c 2023-01-12 11:20:07.184710563 -0500 | ||
+++ src/fs/proc/meminfo.c 2023-01-12 11:20:08.166716386 -0500 | ||
@@ -29,6 +29,8 @@ static void show_val_kb(struct seq_file | ||
seq_write(m, " kB\n", 4); | ||
} | ||
|
||
+static int foo = 5; | ||
+ | ||
static int meminfo_proc_show(struct seq_file *m, void *v) | ||
{ | ||
struct sysinfo i; | ||
@@ -154,6 +156,7 @@ static int meminfo_proc_show(struct seq_ | ||
show_val_kb(m, "CmaFree: ", | ||
global_zone_page_state(NR_FREE_CMA_PAGES)); | ||
#endif | ||
+ seq_printf(m, "kpatch: %d\n", foo); | ||
|
||
hugetlb_report_meminfo(m); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
diff -Nupr src.orig/net/ipv6/netfilter.c src/net/ipv6/netfilter.c | ||
--- src.orig/net/ipv6/netfilter.c 2023-01-12 11:20:07.630713207 -0500 | ||
+++ src/net/ipv6/netfilter.c 2023-01-12 11:20:29.874845095 -0500 | ||
@@ -96,6 +96,8 @@ static int nf_ip6_reroute(struct sk_buff | ||
return 0; | ||
} | ||
|
||
+#include "kpatch-macros.h" | ||
+ | ||
int __nf_ip6_route(struct net *net, struct dst_entry **dst, | ||
struct flowi *fl, bool strict) | ||
{ | ||
@@ -109,6 +111,9 @@ int __nf_ip6_route(struct net *net, stru | ||
struct dst_entry *result; | ||
int err; | ||
|
||
+ if (!jiffies) | ||
+ printk("kpatch nf_ip6_route foo\n"); | ||
+ | ||
result = ip6_route_output(net, sk, &fl->u.ip6); | ||
err = result->error; | ||
if (err) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
diff -Nupr src.orig/drivers/input/joydev.c src/drivers/input/joydev.c | ||
--- src.orig/drivers/input/joydev.c 2023-01-12 11:20:06.597707083 -0500 | ||
+++ src/drivers/input/joydev.c 2023-01-12 11:20:38.032893465 -0500 | ||
@@ -1096,3 +1096,47 @@ static void __exit joydev_exit(void) | ||
|
||
module_init(joydev_init); | ||
module_exit(joydev_exit); | ||
+ | ||
+#include <linux/module.h> | ||
+#include "kpatch-macros.h" | ||
+ | ||
+static const char *const module_state[] = { | ||
+ [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", | ||
+ [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", | ||
+ [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", | ||
+ [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", | ||
+}; | ||
+ | ||
+static void callback_info(const char *callback, patch_object *obj) | ||
+{ | ||
+ if (obj->mod) | ||
+ pr_info("%s: %s -> %s\n", callback, obj->mod->name, | ||
+ module_state[obj->mod->state]); | ||
+ else | ||
+ pr_info("%s: vmlinux\n", callback); | ||
+} | ||
+ | ||
+static int pre_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+ return 0; /* return -ENODEV; */ | ||
+} | ||
+KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); | ||
+ | ||
+static void post_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_PATCH_CALLBACK(post_patch_callback); | ||
+ | ||
+static void pre_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); | ||
+ | ||
+static void post_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback); | ||
diff -Nupr src.orig/drivers/input/misc/pcspkr.c src/drivers/input/misc/pcspkr.c | ||
--- src.orig/drivers/input/misc/pcspkr.c 2023-01-12 11:20:06.578706970 -0500 | ||
+++ src/drivers/input/misc/pcspkr.c 2023-01-12 11:20:38.032893465 -0500 | ||
@@ -134,3 +134,46 @@ static struct platform_driver pcspkr_pla | ||
}; | ||
module_platform_driver(pcspkr_platform_driver); | ||
|
||
+#include <linux/module.h> | ||
+#include "kpatch-macros.h" | ||
+ | ||
+static const char *const module_state[] = { | ||
+ [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", | ||
+ [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", | ||
+ [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", | ||
+ [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", | ||
+}; | ||
+ | ||
+static void callback_info(const char *callback, patch_object *obj) | ||
+{ | ||
+ if (obj->mod) | ||
+ pr_info("%s: %s -> %s\n", callback, obj->mod->name, | ||
+ module_state[obj->mod->state]); | ||
+ else | ||
+ pr_info("%s: vmlinux\n", callback); | ||
+} | ||
+ | ||
+static int pre_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+ return 0; | ||
+} | ||
+KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); | ||
+ | ||
+static void post_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_PATCH_CALLBACK(post_patch_callback); | ||
+ | ||
+static void pre_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); | ||
+ | ||
+static void post_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback); | ||
diff -Nupr src.orig/fs/aio.c src/fs/aio.c | ||
--- src.orig/fs/aio.c 2023-01-12 11:20:07.273711091 -0500 | ||
+++ src/fs/aio.c 2023-01-12 11:20:38.033893471 -0500 | ||
@@ -50,6 +50,50 @@ | ||
|
||
#define KIOCB_KEY 0 | ||
|
||
+#include <linux/module.h> | ||
+#include "kpatch-macros.h" | ||
+ | ||
+static const char *const module_state[] = { | ||
+ [MODULE_STATE_LIVE] = "[MODULE_STATE_LIVE] Normal state", | ||
+ [MODULE_STATE_COMING] = "[MODULE_STATE_COMING] Full formed, running module_init", | ||
+ [MODULE_STATE_GOING] = "[MODULE_STATE_GOING] Going away", | ||
+ [MODULE_STATE_UNFORMED] = "[MODULE_STATE_UNFORMED] Still setting it up", | ||
+}; | ||
+ | ||
+static void callback_info(const char *callback, patch_object *obj) | ||
+{ | ||
+ if (obj->mod) | ||
+ pr_info("%s: %s -> %s\n", callback, obj->mod->name, | ||
+ module_state[obj->mod->state]); | ||
+ else | ||
+ pr_info("%s: vmlinux\n", callback); | ||
+} | ||
+ | ||
+static int pre_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+ return 0; | ||
+} | ||
+KPATCH_PRE_PATCH_CALLBACK(pre_patch_callback); | ||
+ | ||
+static void post_patch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_PATCH_CALLBACK(post_patch_callback); | ||
+ | ||
+static void pre_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_PRE_UNPATCH_CALLBACK(pre_unpatch_callback); | ||
+ | ||
+static void post_unpatch_callback(patch_object *obj) | ||
+{ | ||
+ callback_info(__func__, obj); | ||
+} | ||
+KPATCH_POST_UNPATCH_CALLBACK(post_unpatch_callback); | ||
+ | ||
#define AIO_RING_MAGIC 0xa10a10a1 | ||
#define AIO_RING_COMPAT_FEATURES 1 | ||
#define AIO_RING_INCOMPAT_FEATURES 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
#!/bin/bash | ||
|
||
set -o errexit | ||
|
||
sudo modprobe xfs | ||
sleep 5 | ||
echo "file fs/xfs/xfs_stats.c +p" > /sys/kernel/debug/dynamic_debug/control | ||
grep -q kpatch /sys/fs/xfs/stats/stats | ||
dmesg | grep -q "kpatch: pr_debug" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
kpatch module integration test | ||
|
||
This tests several things related to the patching of modules: | ||
|
||
- 'kpatch_string' tests the referencing of a symbol which is outside the | ||
.o, but inside the patch module. | ||
|
||
- alternatives patching (.altinstructions) | ||
|
||
- paravirt patching (.parainstructions) | ||
|
||
- jump labels (5.8+ kernels only) -- including dynamic printk | ||
|
||
Signed-off-by: Josh Poimboeuf <[email protected]> | ||
|
||
diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c | ||
index 90a77cd3ebad..f65df90ae8e1 100644 | ||
--- a/fs/xfs/xfs_stats.c | ||
+++ b/fs/xfs/xfs_stats.c | ||
@@ -16,6 +16,8 @@ static int counter_val(struct xfsstats __percpu *stats, int idx) | ||
return val; | ||
} | ||
|
||
+extern char *kpatch_string(void); | ||
+ | ||
int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) | ||
{ | ||
int i, j; | ||
@@ -85,6 +87,34 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) | ||
0); | ||
#endif | ||
|
||
+ /* Reference a symbol outside the .o yet inside the patch module: */ | ||
+ len += scnprintf(buf + len, PATH_MAX-len, "%s\n", kpatch_string()); | ||
+ | ||
+#ifdef CONFIG_X86_64 | ||
+ /* Test alternatives patching: */ | ||
+ alternative("ud2", "nop", X86_FEATURE_ALWAYS); | ||
+ alternative("nop", "ud2", X86_FEATURE_IA64); | ||
+ | ||
+ /* Test paravirt patching: */ | ||
+ slow_down_io(); /* paravirt call */ | ||
+#endif | ||
+ | ||
+ /* Test pr_debug: */ | ||
+ pr_debug("kpatch: pr_debug() test\n"); | ||
+ | ||
+{ | ||
+ /* Test static branches: */ | ||
+ static DEFINE_STATIC_KEY_TRUE(kpatch_key); | ||
+ | ||
+ if (static_branch_unlikely(&memcg_kmem_enabled_key)) | ||
+ printk("kpatch: memcg_kmem_enabled_key\n"); | ||
+ | ||
+ BUG_ON(!static_branch_likely(&kpatch_key)); | ||
+ static_branch_disable(&kpatch_key); | ||
+ BUG_ON(static_branch_likely(&kpatch_key)); | ||
+ static_branch_enable(&kpatch_key); | ||
+} | ||
+ | ||
return len; | ||
} | ||
|
||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c | ||
index c64277659753..05b753c2ec84 100644 | ||
--- a/net/netlink/af_netlink.c | ||
+++ b/net/netlink/af_netlink.c | ||
@@ -2980,4 +2980,9 @@ static int __init netlink_proto_init(void) | ||
panic("netlink_init: Cannot allocate nl_table\n"); | ||
} | ||
|
||
+char *kpatch_string(void) | ||
+{ | ||
+ return "kpatch"; | ||
+} | ||
+ | ||
core_initcall(netlink_proto_init); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#!/bin/bash | ||
|
||
SCRIPTDIR="$(readlink -f $(dirname $(type -p $0)))" | ||
|
||
declare -a blacklist=(meminfo-string-LOADED.test) | ||
|
||
source ${SCRIPTDIR}/../common/multiple.template |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
diff -Nupr src.orig/drivers/tty/n_tty.c src/drivers/tty/n_tty.c | ||
--- src.orig/drivers/tty/n_tty.c 2023-01-12 11:20:06.978709342 -0500 | ||
+++ src/drivers/tty/n_tty.c 2023-01-12 11:20:54.149989024 -0500 | ||
@@ -2315,7 +2315,7 @@ more_to_be_read: | ||
* (note that the process_output*() functions take this lock themselves) | ||
*/ | ||
|
||
-static ssize_t n_tty_write(struct tty_struct *tty, struct file *file, | ||
+static ssize_t noinline kpatch_n_tty_write(struct tty_struct *tty, struct file *file, | ||
const unsigned char *buf, size_t nr) | ||
{ | ||
const unsigned char *b = buf; | ||
@@ -2402,6 +2402,12 @@ break_out: | ||
return (b - buf) ? b - buf : retval; | ||
} | ||
|
||
+static ssize_t __attribute__((optimize("-fno-optimize-sibling-calls"))) n_tty_write(struct tty_struct *tty, struct file *file, | ||
+ const unsigned char *buf, size_t nr) | ||
+{ | ||
+ return kpatch_n_tty_write(tty, file, buf, nr); | ||
+} | ||
+ | ||
/** | ||
* n_tty_poll - poll method for N_TTY | ||
* @tty: terminal device |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
diff -Nupr src.orig/fs/proc/cmdline.c src/fs/proc/cmdline.c | ||
--- src.orig/fs/proc/cmdline.c 2023-01-12 11:20:07.184710563 -0500 | ||
+++ src/fs/proc/cmdline.c 2023-01-12 11:21:02.411038005 -0500 | ||
@@ -21,3 +21,10 @@ static int __init proc_cmdline_init(void | ||
return 0; | ||
} | ||
fs_initcall(proc_cmdline_init); | ||
+ | ||
+#include <linux/printk.h> | ||
+void kpatch_print_message(void) | ||
+{ | ||
+ if (!jiffies) | ||
+ printk("hello there!\n"); | ||
+} | ||
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c | ||
--- src.orig/fs/proc/meminfo.c 2023-01-12 11:20:07.184710563 -0500 | ||
+++ src/fs/proc/meminfo.c 2023-01-12 11:21:02.411038005 -0500 | ||
@@ -19,6 +19,8 @@ | ||
#include <asm/page.h> | ||
#include "internal.h" | ||
|
||
+void kpatch_print_message(void); | ||
+ | ||
void __attribute__((weak)) arch_report_meminfo(struct seq_file *m) | ||
{ | ||
} | ||
@@ -55,6 +57,7 @@ static int meminfo_proc_show(struct seq_ | ||
sreclaimable = global_node_page_state_pages(NR_SLAB_RECLAIMABLE_B); | ||
sunreclaim = global_node_page_state_pages(NR_SLAB_UNRECLAIMABLE_B); | ||
|
||
+ kpatch_print_message(); | ||
show_val_kb(m, "MemTotal: ", i.totalram); | ||
show_val_kb(m, "MemFree: ", i.freeram); | ||
show_val_kb(m, "MemAvailable: ", available); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#!/bin/bash | ||
|
||
grep -q newpid: /proc/$$/status |
Oops, something went wrong.