From 7c2751e37f97e95d77898d68b7c08cbf1be7f7d9 Mon Sep 17 00:00:00 2001 From: Sultan Alsawaf Date: Mon, 12 Jul 2021 15:31:36 -0500 Subject: [PATCH] task_finder_vma: add autoconf check for hlist_add_tail_rcu() The 3.10 version check for hlist_add_tail_rcu() only works for RHEL kernels. Kernels older than 4.7 that lack the hlist_add_tail_rcu() backport won't compile (such as Debian kernels). Add an autoconf stub to know for certain if hlist_add_tail_rcu() is present. --- buildrun.cxx | 2 ++ runtime/linux/autoconf-hlist_add_tail_rcu.c | 6 ++++++ runtime/task_finder_vma.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 runtime/linux/autoconf-hlist_add_tail_rcu.c diff --git a/buildrun.cxx b/buildrun.cxx index ba3daa0a0..0c244db72 100644 --- a/buildrun.cxx +++ b/buildrun.cxx @@ -520,6 +520,8 @@ compile_pass (systemtap_session& s) "STAPCONF_ATOMIC_FETCH_ADD_UNLESS", NULL); output_autoconf(s, o, cs, "autoconf-lockdown-debugfs.c", "STAPCONF_LOCKDOWN_DEBUGFS", NULL); output_autoconf(s, o, cs, "autoconf-lockdown-kernel.c", "STAPCONF_LOCKDOWN_KERNEL", NULL); + output_autoconf(s, o, cs, "autoconf-hlist_add_tail_rcu.c", + "STAPCONF_HLIST_ADD_TAIL_RCU", NULL); // used by runtime/linux/netfilter.c output_exportconf(s, o2, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK"); diff --git a/runtime/linux/autoconf-hlist_add_tail_rcu.c b/runtime/linux/autoconf-hlist_add_tail_rcu.c new file mode 100644 index 000000000..2c4660837 --- /dev/null +++ b/runtime/linux/autoconf-hlist_add_tail_rcu.c @@ -0,0 +1,6 @@ +#include + +void foo(struct hlist_node *n, struct hlist_head *h) +{ + hlist_add_tail_rcu(n, h); +} diff --git a/runtime/task_finder_vma.c b/runtime/task_finder_vma.c index 965bbdae4..81a96c7cf 100644 --- a/runtime/task_finder_vma.c +++ b/runtime/task_finder_vma.c @@ -21,7 +21,7 @@ static inline bool atomic_try_cmpxchg(atomic_t *v, int *old, int new) } #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) +#ifndef STAPCONF_HLIST_ADD_TAIL_RCU // Added in linux 4.7, backported to rhel 7, not present in rhel 6 #define hlist_first_rcu(head) (*((struct hlist_node __rcu **)(&(head)->first))) #define hlist_next_rcu(node) (*((struct hlist_node __rcu **)(&(node)->next))) -- 2.43.5