s390/vdso: reimplement getcpu vdso syscall

Implement the previously removed getcpu vdso syscall by using the
TOD programmable field to pass the cpu number to user space.

Reviewed-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
This commit is contained in:
Heiko Carstens 2020-11-16 08:06:41 +01:00
parent 062e527956
commit 80f0630624
8 changed files with 42 additions and 2 deletions

View File

@ -49,6 +49,13 @@ static inline void set_clock_comparator(__u64 time)
asm volatile("sckc %0" : : "Q" (time));
}
static inline void set_tod_programmable_field(u16 val)
{
register unsigned long reg0 asm("0") = val;
asm volatile("sckpf" : : "d" (reg0));
}
void clock_comparator_work(void);
void __init time_early_init(void);

View File

@ -14,5 +14,7 @@
extern struct vdso_data *vdso_data;
void vdso_getcpu_init(void);
#endif /* __ASSEMBLY__ */
#endif /* __S390_VDSO_H__ */

View File

@ -54,6 +54,7 @@
#include <asm/nmi.h>
#include <asm/stacktrace.h>
#include <asm/topology.h>
#include <asm/vdso.h>
#include "entry.h"
enum {
@ -858,6 +859,7 @@ static void smp_init_secondary(void)
preempt_disable();
init_cpu_timer();
vtime_init();
vdso_getcpu_init();
pfault_init();
notify_cpu_starting(cpu);
if (topology_cpu_dedicated(cpu))

View File

@ -29,6 +29,7 @@
#include <asm/sections.h>
#include <asm/vdso.h>
#include <asm/facility.h>
#include <asm/timex.h>
extern char vdso64_start, vdso64_end;
static void *vdso64_kbase = &vdso64_start;
@ -100,6 +101,11 @@ static union {
} vdso_data_store __page_aligned_data;
struct vdso_data *vdso_data = (struct vdso_data *)&vdso_data_store.data;
void vdso_getcpu_init(void)
{
set_tod_programmable_field(smp_processor_id());
}
/*
* This is called from binfmt_elf, we create the special vma for the
* vDSO and insert it into the mm struct tree
@ -170,6 +176,7 @@ static int __init vdso_init(void)
{
int i;
vdso_getcpu_init();
/* Calculate the size of the 64 bit vDSO */
vdso64_pages = ((&vdso64_end - &vdso64_start
+ PAGE_SIZE - 1) >> PAGE_SHIFT) + 1;

View File

@ -7,7 +7,8 @@ ARCH_REL_TYPE_ABS += R_390_GOT|R_390_PLT
include $(srctree)/lib/vdso/Makefile
obj-vdso64 = vdso_user_wrapper.o note.o
obj-cvdso64 = vdso64_generic.o
obj-cvdso64 = vdso64_generic.o getcpu.o
CFLAGS_REMOVE_getcpu.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)
CFLAGS_REMOVE_vdso64_generic.o = -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE)
# Build rules

View File

@ -0,0 +1,20 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright IBM Corp. 2020 */
#include <linux/compiler.h>
#include <linux/getcpu.h>
#include <asm/timex.h>
int __s390_vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused)
{
__u16 todval[8];
/* CPU number is stored in the programmable field of the TOD clock */
get_tod_clock_ext((char *)todval);
if (cpu)
*cpu = todval[7];
/* NUMA node is always zero */
if (node)
*node = 0;
return 0;
}

View File

@ -135,7 +135,7 @@ VERSION
__kernel_gettimeofday;
__kernel_clock_gettime;
__kernel_clock_getres;
__kernel_getcpu;
local: *;
};
}

View File

@ -36,3 +36,4 @@ __kernel_\func:
vdso_func gettimeofday
vdso_func clock_getres
vdso_func clock_gettime
vdso_func getcpu