test/integration/rhel-8.10: add kernel-4.18.0-552.el8_10 tests

Signed-off-by: Ryan Sullivan <rysulliv@redhat.com>
This commit is contained in:
Joe Lawrence 2024-01-22 16:15:12 -05:00 committed by Ryan Sullivan
parent 0edd6e42bf
commit 560318641a
37 changed files with 924 additions and 0 deletions

View File

@ -0,0 +1,12 @@
diff -Nupr src.orig/fs/proc/proc_sysctl.c src/fs/proc/proc_sysctl.c
--- src.orig/fs/proc/proc_sysctl.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/proc_sysctl.c 2024-04-18 14:12:03.887374205 -0400
@@ -338,6 +338,8 @@ static void start_unregistering(struct c
static struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
{
+ if (jiffies == 0)
+ printk("kpatch-test: testing __bug_table section changes\n");
BUG_ON(!head);
spin_lock(&sysctl_lock);
if (!use_table(head))

View File

@ -0,0 +1,3 @@
#!/bin/bash
grep kpatch=1 /proc/cmdline

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/fs/proc/cmdline.c src/fs/proc/cmdline.c
--- src.orig/fs/proc/cmdline.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/cmdline.c 2024-04-18 14:12:10.803359173 -0400
@@ -6,8 +6,7 @@
static int cmdline_proc_show(struct seq_file *m, void *v)
{
- seq_puts(m, saved_command_line);
- seq_putc(m, '\n');
+ seq_printf(m, "%s kpatch=1\n", saved_command_line);
return 0;
}

View File

@ -0,0 +1,3 @@
#!/bin/bash
grep "kpatch: 5" /proc/meminfo

View File

@ -0,0 +1,20 @@
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c
--- src.orig/fs/proc/meminfo.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/meminfo.c 2024-04-18 14:12:13.626353038 -0400
@@ -31,6 +31,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;
@@ -150,6 +152,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);

View File

@ -0,0 +1,11 @@
diff -Nupr src.orig/net/core/dev.c src/net/core/dev.c
--- src.orig/net/core/dev.c 2024-04-18 14:12:03.639374744 -0400
+++ src/net/core/dev.c 2024-04-18 14:12:15.656348626 -0400
@@ -5469,6 +5469,7 @@ skip_classify:
case RX_HANDLER_PASS:
break;
default:
+ printk("BUG!\n");
BUG();
}
}

View File

@ -0,0 +1,11 @@
diff -Nupr src.orig/fs/readdir.c src/fs/readdir.c
--- src.orig/fs/readdir.c 2024-04-18 14:12:03.462375128 -0400
+++ src/fs/readdir.c 2024-04-18 14:12:17.665344260 -0400
@@ -189,6 +189,7 @@ static int filldir(struct dir_context *c
goto efault;
}
dirent = buf->current_dir;
+ asm("nop");
if (__put_user(d_ino, &dirent->d_ino))
goto efault;
if (__put_user(reclen, &dirent->d_reclen))

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/kernel/time/timekeeping.c src/kernel/time/timekeeping.c
--- src.orig/kernel/time/timekeeping.c 2024-04-18 14:12:03.614374798 -0400
+++ src/kernel/time/timekeeping.c 2024-04-18 14:12:19.675339891 -0400
@@ -1231,6 +1231,9 @@ void do_gettimeofday(struct timeval *tv)
{
struct timespec64 now;
+ if (!tv)
+ return;
+
getnstimeofday64(&now);
tv->tv_sec = now.tv_sec;
tv->tv_usec = now.tv_nsec/1000;

View File

@ -0,0 +1,11 @@
diff -Nupr src.orig/fs/proc/proc_sysctl.c src/fs/proc/proc_sysctl.c
--- src.orig/fs/proc/proc_sysctl.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/proc_sysctl.c 2024-04-18 14:12:21.710335469 -0400
@@ -53,6 +53,7 @@ void proc_sys_poll_notify(struct ctl_tab
if (!poll)
return;
+ printk("kpatch-test: testing gcc .isra function name mangling\n");
atomic_inc(&poll->event);
wake_up_interruptible(&poll->wait);
}

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/mm/slub.c src/mm/slub.c
--- src.orig/mm/slub.c 2024-04-18 14:12:03.629374765 -0400
+++ src/mm/slub.c 2024-04-18 14:12:23.903330702 -0400
@@ -6192,6 +6192,9 @@ void get_slabinfo(struct kmem_cache *s,
int node;
struct kmem_cache_node *n;
+ if (!jiffies)
+ printk("slabinfo\n");
+
for_each_kmem_cache_node(s, node, n) {
nr_slabs += node_nr_slabs(n);
nr_objs += node_nr_objs(n);

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/mm/mmap.c src/mm/mmap.c
--- src.orig/mm/mmap.c 2024-04-18 14:12:03.628374767 -0400
+++ src/mm/mmap.c 2024-04-18 14:12:25.958326236 -0400
@@ -1691,6 +1691,9 @@ unsigned long mmap_region(struct file *f
struct rb_node **rb_link, *rb_parent;
unsigned long charged = 0;
+ if (!jiffies)
+ printk("kpatch mmap foo\n");
+
/* Check against address space limit. */
if (!may_expand_vm(mm, vm_flags, len >> PAGE_SHIFT)) {
unsigned long nr_pages;

View File

@ -0,0 +1,19 @@
diff -Nupr src.orig/kernel/reboot.c src/kernel/reboot.c
--- src.orig/kernel/reboot.c 2024-04-18 14:12:03.612374802 -0400
+++ src/kernel/reboot.c 2024-04-18 14:12:27.985321831 -0400
@@ -393,8 +393,15 @@ SYSCALL_DEFINE4(reboot, int, magic1, int
return ret;
}
+void kpatch_bar(void)
+{
+ if (!jiffies)
+ printk("kpatch_foo\n");
+}
+
static void deferred_cad(struct work_struct *dummy)
{
+ kpatch_bar();
kernel_restart(NULL);
}

View File

@ -0,0 +1,23 @@
diff -Nupr src.orig/fs/aio.c src/fs/aio.c
--- src.orig/fs/aio.c 2024-04-18 14:12:03.428375202 -0400
+++ src/fs/aio.c 2024-04-18 14:12:30.010317430 -0400
@@ -247,11 +247,18 @@ static int __init aio_setup(void)
}
__initcall(aio_setup);
-static void put_aio_ring_file(struct kioctx *ctx)
+void kpatch_aio_foo(void)
+{
+ if (!jiffies)
+ printk("kpatch aio foo\n");
+}
+
+__always_inline static void put_aio_ring_file(struct kioctx *ctx)
{
struct file *aio_ring_file = ctx->aio_ring_file;
struct address_space *i_mapping;
+ kpatch_aio_foo();
if (aio_ring_file) {
truncate_setsize(file_inode(aio_ring_file), 0);

View File

@ -0,0 +1,8 @@
#!/bin/bash
set -o pipefail
if ! $(eu-readelf --wide --symbols test-gcc-static-local-var-4.ko | awk '$NF == "free_ioctx" { exit 1 }'); then
exit 1
else
exit 0
fi

View File

@ -0,0 +1,45 @@
diff -Nupr src.orig/kernel/audit.c src/kernel/audit.c
--- src.orig/kernel/audit.c 2024-04-18 14:12:03.604374820 -0400
+++ src/kernel/audit.c 2024-04-18 14:12:32.055312985 -0400
@@ -327,6 +327,12 @@ void audit_panic(const char *message)
}
}
+void kpatch_audit_foo(void)
+{
+ if (!jiffies)
+ printk("kpatch audit foo\n");
+}
+
static inline int audit_rate_check(void)
{
static unsigned long last_check = 0;
@@ -337,6 +343,7 @@ static inline int audit_rate_check(void)
unsigned long elapsed;
int retval = 0;
+ kpatch_audit_foo();
if (!audit_rate_limit) return 1;
spin_lock_irqsave(&lock, flags);
@@ -356,6 +363,11 @@ static inline int audit_rate_check(void)
return retval;
}
+noinline void kpatch_audit_check(void)
+{
+ audit_rate_check();
+}
+
/**
* audit_log_lost - conditionally log lost audit message event
* @message: the message stating reason for lost audit message
@@ -402,6 +414,8 @@ static int audit_log_config_change(char
struct audit_buffer *ab;
int rc = 0;
+ kpatch_audit_check();
+
ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_CONFIG_CHANGE);
if (unlikely(!ab))
return rc;

View File

@ -0,0 +1,22 @@
diff -Nupr src.orig/net/ipv6/netfilter.c src/net/ipv6/netfilter.c
--- src.orig/net/ipv6/netfilter.c 2024-04-18 14:12:03.648374724 -0400
+++ src/net/ipv6/netfilter.c 2024-04-18 14:12:34.140308454 -0400
@@ -93,6 +93,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)
{
@@ -106,6 +108,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)

View File

@ -0,0 +1,155 @@
diff -Nupr src.orig/drivers/input/joydev.c src/drivers/input/joydev.c
--- src.orig/drivers/input/joydev.c 2024-04-18 14:12:03.003376126 -0400
+++ src/drivers/input/joydev.c 2024-04-18 14:12:36.165304053 -0400
@@ -1087,3 +1087,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 2024-04-18 14:12:03.007376117 -0400
+++ src/drivers/input/misc/pcspkr.c 2024-04-18 14:12:36.166304050 -0400
@@ -133,3 +133,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 2024-04-18 14:12:03.428375202 -0400
+++ src/fs/aio.c 2024-04-18 14:12:36.166304050 -0400
@@ -48,6 +48,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

View File

@ -0,0 +1,149 @@
diff -Nupr src.orig/net/ipv4/fib_frontend.c src/net/ipv4/fib_frontend.c
--- src.orig/net/ipv4/fib_frontend.c 2024-04-18 14:12:03.644374733 -0400
+++ src/net/ipv4/fib_frontend.c 2024-04-18 14:12:38.274299469 -0400
@@ -798,6 +798,7 @@ errout:
return err;
}
+#include "kpatch-macros.h"
static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
struct netlink_ext_ack *extack)
{
@@ -819,6 +820,7 @@ static int inet_rtm_newroute(struct sk_b
err = fib_table_insert(net, tb, &cfg, extack);
if (!err && cfg.fc_type == RTN_LOCAL)
net->ipv4.fib_has_custom_local_routes = true;
+ KPATCH_PRINTK("[inet_rtm_newroute]: err is %d\n", err);
errout:
return err;
}
diff -Nupr src.orig/net/ipv4/fib_semantics.c src/net/ipv4/fib_semantics.c
--- src.orig/net/ipv4/fib_semantics.c 2024-04-18 14:12:03.644374733 -0400
+++ src/net/ipv4/fib_semantics.c 2024-04-18 14:12:38.275299467 -0400
@@ -1028,6 +1028,7 @@ static bool fib_valid_prefsrc(struct fib
return true;
}
+#include "kpatch-macros.h"
struct fib_info *fib_create_info(struct fib_config *cfg,
struct netlink_ext_ack *extack)
{
@@ -1061,6 +1062,7 @@ struct fib_info *fib_create_info(struct
#endif
err = -ENOBUFS;
+ KPATCH_PRINTK("[fib_create_info]: create error err is %d\n",err);
if (fib_info_cnt >= fib_info_hash_size) {
unsigned int new_size = fib_info_hash_size << 1;
struct hlist_head *new_info_hash;
@@ -1081,6 +1083,7 @@ struct fib_info *fib_create_info(struct
if (!fib_info_hash_size)
goto failure;
}
+ KPATCH_PRINTK("[fib_create_info]: 2 create error err is %d\n",err);
fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
if (!fi)
@@ -1094,6 +1097,8 @@ struct fib_info *fib_create_info(struct
}
fib_info_cnt++;
+ KPATCH_PRINTK("[fib_create_info]: 3 create error err is %d\n",err);
+
fi->fib_net = net;
fi->fib_protocol = cfg->fc_protocol;
fi->fib_scope = cfg->fc_scope;
@@ -1149,9 +1154,11 @@ struct fib_info *fib_create_info(struct
"LWT encap type not specified");
goto err_inval;
}
+ KPATCH_PRINTK("[fib_create_info]: 4 create error err is %d\n",err);
err = lwtunnel_build_state(cfg->fc_encap_type,
cfg->fc_encap, AF_INET, cfg,
&lwtstate, extack);
+ KPATCH_PRINTK("[fib_create_info]: 5 create error err is %d\n",err);
if (err)
goto failure;
@@ -1169,6 +1176,7 @@ struct fib_info *fib_create_info(struct
nh->nh_weight = 1;
#endif
}
+ KPATCH_PRINTK("[fib_create_info]: 6 create error err is %d\n",err);
if (fib_props[cfg->fc_type].error) {
if (cfg->fc_gw || cfg->fc_oif || cfg->fc_mp) {
@@ -1190,6 +1198,7 @@ struct fib_info *fib_create_info(struct
goto err_inval;
}
}
+ KPATCH_PRINTK("[fib_create_info]: 7 create error err is %d\n",err);
if (cfg->fc_scope > RT_SCOPE_HOST) {
NL_SET_ERR_MSG(extack, "Invalid scope");
@@ -1228,6 +1237,7 @@ struct fib_info *fib_create_info(struct
if (linkdown == fi->fib_nhs)
fi->fib_flags |= RTNH_F_LINKDOWN;
}
+ KPATCH_PRINTK("[fib_create_info]: 8 create error err is %d\n",err);
if (fi->fib_prefsrc && !fib_valid_prefsrc(cfg, fi->fib_prefsrc)) {
NL_SET_ERR_MSG(extack, "Invalid prefsrc address");
@@ -1237,6 +1247,7 @@ struct fib_info *fib_create_info(struct
change_nexthops(fi) {
fib_info_update_nh_saddr(net, nexthop_nh);
} endfor_nexthops(fi)
+ KPATCH_PRINTK("[fib_create_info]: 9 create error err is %d\n",err);
fib_rebalance(fi);
@@ -1248,6 +1259,7 @@ link_it:
ofi->fib_treeref++;
return ofi;
}
+ KPATCH_PRINTK("[fib_create_info]: 10 create error err is %d\n",err);
fi->fib_treeref++;
refcount_set(&fi->fib_clntref, 1);
@@ -1271,6 +1283,7 @@ link_it:
hlist_add_head(&nexthop_nh->nh_hash, head);
} endfor_nexthops(fi)
spin_unlock_bh(&fib_info_lock);
+ KPATCH_PRINTK("[fib_create_info]: 11 create error err is %d\n",err);
return fi;
err_inval:
@@ -1281,6 +1294,7 @@ failure:
fi->fib_dead = 1;
free_fib_info(fi);
}
+ KPATCH_PRINTK("[fib_create_info]: 12 create error err is %d\n",err);
return ERR_PTR(err);
}
diff -Nupr src.orig/net/ipv4/fib_trie.c src/net/ipv4/fib_trie.c
--- src.orig/net/ipv4/fib_trie.c 2024-04-18 14:12:03.644374733 -0400
+++ src/net/ipv4/fib_trie.c 2024-04-18 14:12:38.275299467 -0400
@@ -1174,6 +1174,7 @@ static void fib_remove_alias(struct trie
struct key_vector *l, struct fib_alias *old);
/* Caller must hold RTNL. */
+#include "kpatch-macros.h"
int fib_table_insert(struct net *net, struct fib_table *tb,
struct fib_config *cfg, struct netlink_ext_ack *extack)
{
@@ -1195,11 +1196,14 @@ int fib_table_insert(struct net *net, st
pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
+ KPATCH_PRINTK("[fib_table_insert]: start\n");
fi = fib_create_info(cfg, extack);
if (IS_ERR(fi)) {
err = PTR_ERR(fi);
+ KPATCH_PRINTK("[fib_table_insert]: create error err is %d\n",err);
goto err;
}
+ KPATCH_PRINTK("[fib_table_insert]: cross\n");
l = fib_find_node(t, &tp, key);
fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority,

View File

@ -0,0 +1,11 @@
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c
--- src.orig/fs/proc/meminfo.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/meminfo.c 2024-04-18 14:12:42.540290197 -0400
@@ -160,6 +160,7 @@ static int meminfo_proc_show(struct seq_
static int __init proc_meminfo_init(void)
{
+ printk("a\n");
proc_create_single("meminfo", 0, NULL, meminfo_proc_show);
return 0;
}

View File

@ -0,0 +1,19 @@
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c
--- src.orig/fs/proc/meminfo.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/meminfo.c 2024-04-18 14:12:40.414294818 -0400
@@ -41,6 +41,7 @@ static int meminfo_proc_show(struct seq_
unsigned long sreclaimable, sunreclaim;
int lru;
+ printk("a\n");
si_meminfo(&i);
si_swapinfo(&i);
committed = percpu_counter_read_positive(&vm_committed_as);
@@ -160,6 +161,7 @@ static int meminfo_proc_show(struct seq_
static int __init proc_meminfo_init(void)
{
+ printk("a\n");
proc_create_single("meminfo", 0, NULL, meminfo_proc_show);
return 0;
}

View File

@ -0,0 +1,3 @@
#!/bin/bash
grep VMALLOCCHUNK /proc/meminfo

View File

@ -0,0 +1,12 @@
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c
--- src.orig/fs/proc/meminfo.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/meminfo.c 2024-04-18 14:12:44.665285579 -0400
@@ -124,7 +124,7 @@ static int meminfo_proc_show(struct seq_
seq_printf(m, "VmallocTotal: %8lu kB\n",
(unsigned long)VMALLOC_TOTAL >> 10);
show_val_kb(m, "VmallocUsed: ", vmalloc_nr_pages());
- show_val_kb(m, "VmallocChunk: ", 0ul);
+ show_val_kb(m, "VMALLOCCHUNK: ", 0ul);
show_val_kb(m, "Percpu: ", pcpu_nr_pages());
#ifdef CONFIG_MEMORY_FAILURE

View File

@ -0,0 +1,11 @@
#!/bin/bash
set -o errexit
sudo modprobe xfs
sleep 5
grep -q kpatch /sys/fs/xfs/stats/stats
# TODO: This will trigger a printk on newer kernels which have the .klp.arch
# removal. Don't actually do the grep until running on a newer kernel.
echo "file fs/xfs/xfs_stats.c +p" > /sys/kernel/debug/dynamic_debug/control
# dmesg | grep -q "kpatch: pr_debug"

View File

@ -0,0 +1,60 @@
diff -Nupr src.orig/fs/xfs/xfs_stats.c src/fs/xfs/xfs_stats.c
--- src.orig/fs/xfs/xfs_stats.c 2024-04-18 14:12:03.471375109 -0400
+++ src/fs/xfs/xfs_stats.c 2024-04-18 14:12:46.797280945 -0400
@@ -16,6 +16,8 @@ static int counter_val(struct xfsstats _
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 __p
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 -Nupr src.orig/net/netlink/af_netlink.c src/net/netlink/af_netlink.c
--- src.orig/net/netlink/af_netlink.c 2024-04-18 14:12:03.660374698 -0400
+++ src/net/netlink/af_netlink.c 2024-04-18 14:12:46.798280943 -0400
@@ -2888,4 +2888,9 @@ panic:
panic("netlink_init: Cannot allocate nl_table\n");
}
+char *kpatch_string(void)
+{
+ return "kpatch";
+}
+
core_initcall(netlink_proto_init);

View File

@ -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

View File

@ -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 2024-04-18 14:12:03.376375315 -0400
+++ src/drivers/tty/n_tty.c 2024-04-18 14:12:48.938276292 -0400
@@ -2298,7 +2298,7 @@ static ssize_t n_tty_read(struct tty_str
* 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;
@@ -2385,6 +2385,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

View File

@ -0,0 +1,34 @@
diff -Nupr src.orig/fs/proc/cmdline.c src/fs/proc/cmdline.c
--- src.orig/fs/proc/cmdline.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/cmdline.c 2024-04-18 14:12:51.049271704 -0400
@@ -17,3 +17,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 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/meminfo.c 2024-04-18 14:12:51.049271704 -0400
@@ -21,6 +21,8 @@
#include <asm/pgtable.h>
#include "internal.h"
+void kpatch_print_message(void);
+
void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
{
}
@@ -57,6 +59,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);

View File

@ -0,0 +1,11 @@
diff -Nupr src.orig/fs/proc/generic.c src/fs/proc/generic.c
--- src.orig/fs/proc/generic.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/generic.c 2024-04-18 14:12:53.192267047 -0400
@@ -205,6 +205,7 @@ int proc_alloc_inum(unsigned int *inum)
{
int i;
+ printk("kpatch-test: testing change to .parainstructions section\n");
i = ida_simple_get(&proc_inum_ida, 0, UINT_MAX - PROC_DYNAMIC_FIRST + 1,
GFP_KERNEL);
if (i < 0)

View File

@ -0,0 +1,3 @@
#!/bin/bash
grep -q newpid: /proc/$$/status

View File

@ -0,0 +1,75 @@
diff -Nupr src.orig/fs/proc/array.c src/fs/proc/array.c
--- src.orig/fs/proc/array.c 2024-04-18 14:12:03.460375133 -0400
+++ src/fs/proc/array.c 2024-04-18 14:12:55.335262389 -0400
@@ -372,12 +372,19 @@ static inline void task_seccomp(struct s
seq_putc(m, '\n');
}
+#include <linux/livepatch.h>
static inline void task_context_switch_counts(struct seq_file *m,
struct task_struct *p)
{
+ int *newpid;
+
seq_put_decimal_ull(m, "voluntary_ctxt_switches:\t", p->nvcsw);
seq_put_decimal_ull(m, "\nnonvoluntary_ctxt_switches:\t", p->nivcsw);
seq_putc(m, '\n');
+
+ newpid = klp_shadow_get(p, 0);
+ if (newpid)
+ seq_printf(m, "newpid:\t%d\n", *newpid);
}
static void task_cpus_allowed(struct seq_file *m, struct task_struct *task)
diff -Nupr src.orig/kernel/exit.c src/kernel/exit.c
--- src.orig/kernel/exit.c 2024-04-18 14:12:03.608374811 -0400
+++ src/kernel/exit.c 2024-04-18 14:12:55.335262389 -0400
@@ -704,6 +704,7 @@ static void check_stack_usage(void)
static inline void check_stack_usage(void) {}
#endif
+#include <linux/livepatch.h>
void __noreturn do_exit(long code)
{
struct task_struct *tsk = current;
@@ -804,6 +805,8 @@ void __noreturn do_exit(long code)
exit_task_work(tsk);
exit_thread(tsk);
+ klp_shadow_free(tsk, 0, NULL);
+
/*
* Flush inherited counters to the parent - before the parent
* gets woken up by child-exit notifications.
diff -Nupr src.orig/kernel/fork.c src/kernel/fork.c
--- src.orig/kernel/fork.c 2024-04-18 14:12:03.608374811 -0400
+++ src/kernel/fork.c 2024-04-18 14:12:55.336262387 -0400
@@ -2475,6 +2475,7 @@ struct mm_struct *copy_init_mm(void)
* It copies the process, and if successful kick-starts
* it and waits for it to finish using the VM if required.
*/
+#include <linux/livepatch.h>
long _do_fork(unsigned long clone_flags,
unsigned long stack_start,
unsigned long stack_size,
@@ -2487,6 +2488,8 @@ long _do_fork(unsigned long clone_flags,
struct task_struct *p;
int trace = 0;
long nr;
+ int *newpid;
+ static int ctr = 0;
/*
* Determine whether and which event to report to ptracer. When
@@ -2513,6 +2516,11 @@ long _do_fork(unsigned long clone_flags,
if (IS_ERR(p))
return PTR_ERR(p);
+ newpid = klp_shadow_get_or_alloc(p, 0, sizeof(*newpid), GFP_KERNEL,
+ NULL, NULL);
+ if (newpid)
+ *newpid = ctr++;
+
/*
* Do this prior waking up the new thread - the thread pointer
* might get invalid after that point, if the thread exits quickly.

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/drivers/tty/tty_buffer.c src/drivers/tty/tty_buffer.c
--- src.orig/drivers/tty/tty_buffer.c 2024-04-18 14:12:03.380375306 -0400
+++ src/drivers/tty/tty_buffer.c 2024-04-18 14:12:57.481257725 -0400
@@ -256,6 +256,9 @@ static int __tty_buffer_request_room(str
struct tty_buffer *b, *n;
int left, change;
+ if (!size)
+ printk("kpatch-test: testing .smp_locks section changes\n");
+
b = buf->tail;
if (b->flags & TTYB_NORMAL)
left = 2 * b->size - b->used;

View File

@ -0,0 +1,22 @@
diff -Nupr src.orig/kernel/fork.c src/kernel/fork.c
--- src.orig/kernel/fork.c 2024-04-18 14:12:03.608374811 -0400
+++ src/kernel/fork.c 2024-04-18 14:12:59.608253102 -0400
@@ -1661,10 +1661,18 @@ static void posix_cpu_timers_init_group(
posix_cputimers_group_init(pct, cpu_limit);
}
+void kpatch_foo(void)
+{
+ if (!jiffies)
+ printk("kpatch copy signal\n");
+}
+
static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
{
struct signal_struct *sig;
+ kpatch_foo();
+
if (clone_flags & CLONE_THREAD)
return 0;

View File

@ -0,0 +1,24 @@
diff -Nupr src.orig/drivers/base/core.c src/drivers/base/core.c
--- src.orig/drivers/base/core.c 2024-04-18 14:12:02.743376691 -0400
+++ src/drivers/base/core.c 2024-04-18 14:13:01.732248486 -0400
@@ -34,6 +34,8 @@
#include "physical_location.h"
#include "power/power.h"
+#include <linux/blktrace_api.h>
+
#ifdef CONFIG_SYSFS_DEPRECATED
#ifdef CONFIG_SYSFS_DEPRECATED_V2
long sysfs_deprecated = 1;
diff -Nupr src.orig/drivers/usb/core/usb.c src/drivers/usb/core/usb.c
--- src.orig/drivers/usb/core/usb.c 2024-04-18 14:12:03.383375300 -0400
+++ src/drivers/usb/core/usb.c 2024-04-18 14:13:01.733248484 -0400
@@ -769,6 +769,8 @@ EXPORT_SYMBOL_GPL(usb_alloc_dev);
*/
struct usb_device *usb_get_dev(struct usb_device *dev)
{
+ barrier();
+
if (dev)
get_device(&dev->dev);
return dev;

View File

@ -0,0 +1,3 @@
#!/bin/bash
uname -s | grep -q kpatch

View File

@ -0,0 +1,25 @@
diff -Nupr src.orig/kernel/sys.c src/kernel/sys.c
--- src.orig/kernel/sys.c 2024-04-18 14:12:03.613374800 -0400
+++ src/kernel/sys.c 2024-04-18 14:13:03.847243889 -0400
@@ -1241,14 +1241,18 @@ static int override_release(char __user
return ret;
}
-SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
+#include "kpatch-syscall.h"
+KPATCH_SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
{
+ struct new_utsname tmp;
int errno = 0;
down_read(&uts_sem);
- if (copy_to_user(name, utsname(), sizeof *name))
- errno = -EFAULT;
+ memcpy(&tmp, utsname(), sizeof(tmp));
up_read(&uts_sem);
+ strcat(tmp.sysname, ".kpatch");
+ if (copy_to_user(name, &tmp, sizeof(tmp)))
+ errno = -EFAULT;
if (!errno && override_release(name->release, sizeof(name->release)))
errno = -EFAULT;

View File

@ -0,0 +1,13 @@
diff -Nupr src.orig/kernel/time/timer.c src/kernel/time/timer.c
--- src.orig/kernel/time/timer.c 2024-04-18 14:12:03.614374798 -0400
+++ src/kernel/time/timer.c 2024-04-18 14:13:05.967239282 -0400
@@ -1988,6 +1988,9 @@ static __latent_entropy void run_timer_s
{
struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
+ if (!base)
+ printk("kpatch-test: testing __tracepoints section changes\n");
+
__run_timers(base);
if (IS_ENABLED(CONFIG_NO_HZ_COMMON))
__run_timers(this_cpu_ptr(&timer_bases[BASE_DEF]));

View File

@ -0,0 +1,9 @@
diff -Nupr src.orig/arch/x86/kvm/x86.c src/arch/x86/kvm/x86.c
--- src.orig/arch/x86/kvm/x86.c 2024-04-18 14:12:02.707376769 -0400
+++ src/arch/x86/kvm/x86.c 2024-04-18 14:13:08.122234598 -0400
@@ -1,4 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
+
/*
* Kernel-based Virtual Machine driver for Linux
*