diff options
Diffstat (limited to 'arch/loongarch/vdso/vgetcpu.c')
| -rw-r--r-- | arch/loongarch/vdso/vgetcpu.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/loongarch/vdso/vgetcpu.c b/arch/loongarch/vdso/vgetcpu.c new file mode 100644 index 000000000000..5301cd9d0f83 --- /dev/null +++ b/arch/loongarch/vdso/vgetcpu.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Fast user context implementation of getcpu() + */ + +#include <asm/vdso.h> +#include <linux/getcpu.h> + +static __always_inline int read_cpu_id(void) +{ + int cpu_id; + + __asm__ __volatile__( + " rdtime.d $zero, %0\n" + : "=r" (cpu_id) + : + : "memory"); + + return cpu_id; +} + +extern +int __vdso_getcpu(unsigned int *cpu, unsigned int *node, struct getcpu_cache *unused); +int __vdso_getcpu(unsigned int *cpu, unsigned int *node, struct getcpu_cache *unused) +{ + int cpu_id; + + cpu_id = read_cpu_id(); + + if (cpu) + *cpu = cpu_id; + + if (node) + *node = vdso_u_arch_data.pdata[cpu_id].node; + + return 0; +} |
