summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@kernel.org>2026-03-03 19:35:07 +0300
committerAlexei Starovoitov <ast@kernel.org>2026-03-03 19:36:12 +0300
commit74fef05ef11846515f4386d451b176ccb9e062b5 (patch)
treeade91f9d2ca3f424da9d4f109db585845f79459f
parent309d8808eef93d29b65ae69241a4475b2c8bd6fe (diff)
parent0f87614c4dbdd14bbcc23c69b09be58177ce7b9b (diff)
downloadlinux-74fef05ef11846515f4386d451b176ccb9e062b5.tar.xz
Merge branch 'bpf-s390-implement-get_preempt_count'
Ilya Leoshkevich says: ==================== bpf/s390: Implement get_preempt_count() This series adds get_preempt_count() BPF implementation for s390. On s390 preempt_count lives in lowcore: a per-cpu data structure mapped at virtual address 0 or 0x70000 depending on the kernel command line. Patch 1 adds a kfunc to obtain lowcore address. Patch 2 is the implementation that delegates to it. ==================== Link: https://patch.msgid.link/20260217160813.100855-1-iii@linux.ibm.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-rw-r--r--arch/s390/kernel/Makefile2
-rw-r--r--arch/s390/kernel/bpf.c12
-rw-r--r--kernel/bpf/helpers.c3
-rw-r--r--tools/testing/selftests/bpf/bpf_experimental.h11
4 files changed, 28 insertions, 0 deletions
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
index 42c83d60d6fa..b522c6649fcc 100644
--- a/arch/s390/kernel/Makefile
+++ b/arch/s390/kernel/Makefile
@@ -80,5 +80,7 @@ obj-$(CONFIG_PERF_EVENTS) += perf_pai.o
obj-$(CONFIG_TRACEPOINTS) += trace.o
+obj-$(CONFIG_BPF_SYSCALL) += bpf.o
+
# vdso
obj-y += vdso/
diff --git a/arch/s390/kernel/bpf.c b/arch/s390/kernel/bpf.c
new file mode 100644
index 000000000000..713337fae626
--- /dev/null
+++ b/arch/s390/kernel/bpf.c
@@ -0,0 +1,12 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <asm/lowcore.h>
+#include <linux/btf.h>
+
+__bpf_kfunc_start_defs();
+
+__bpf_kfunc struct lowcore *bpf_get_lowcore(void)
+{
+ return get_lowcore();
+}
+
+__bpf_kfunc_end_defs();
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c
index 6eb6c82ed2ee..cb6d242bd093 100644
--- a/kernel/bpf/helpers.c
+++ b/kernel/bpf/helpers.c
@@ -4578,6 +4578,9 @@ BTF_ID_FLAGS(func, bpf_key_put, KF_RELEASE)
BTF_ID_FLAGS(func, bpf_verify_pkcs7_signature, KF_SLEEPABLE)
#endif
#endif
+#ifdef CONFIG_S390
+BTF_ID_FLAGS(func, bpf_get_lowcore)
+#endif
BTF_KFUNCS_END(generic_btf_ids)
static const struct btf_kfunc_id_set generic_kfunc_set = {
diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
index 9df77e59d4f5..44466acf8083 100644
--- a/tools/testing/selftests/bpf/bpf_experimental.h
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
@@ -627,6 +627,10 @@ struct task_struct___preempt_rt {
int softirq_disable_cnt;
} __attribute__((preserve_access_index));
+#ifdef bpf_target_s390
+extern struct lowcore *bpf_get_lowcore(void) __weak __ksym;
+#endif
+
static inline int get_preempt_count(void)
{
#if defined(bpf_target_x86)
@@ -647,6 +651,8 @@ static inline int get_preempt_count(void)
return bpf_get_current_task_btf()->thread_info.preempt.count;
#elif defined(bpf_target_powerpc)
return bpf_get_current_task_btf()->thread_info.preempt_count;
+#elif defined(bpf_target_s390)
+ return bpf_get_lowcore()->preempt_count;
#endif
return 0;
}
@@ -656,6 +662,7 @@ static inline int get_preempt_count(void)
* * x86
* * arm64
* * powerpc64
+ * * s390x
*/
static inline int bpf_in_interrupt(void)
{
@@ -676,6 +683,7 @@ static inline int bpf_in_interrupt(void)
* * x86
* * arm64
* * powerpc64
+ * * s390x
*/
static inline int bpf_in_nmi(void)
{
@@ -687,6 +695,7 @@ static inline int bpf_in_nmi(void)
* * x86
* * arm64
* * powerpc64
+ * * s390x
*/
static inline int bpf_in_hardirq(void)
{
@@ -698,6 +707,7 @@ static inline int bpf_in_hardirq(void)
* * x86
* * arm64
* * powerpc64
+ * * s390x
*/
static inline int bpf_in_serving_softirq(void)
{
@@ -717,6 +727,7 @@ static inline int bpf_in_serving_softirq(void)
* * x86
* * arm64
* * powerpc64
+ * * s390x
*/
static inline int bpf_in_task(void)
{