aa5e65dc08
We can see that "Time namespaces are not supported" on LoongArch: (1) clone3 test # cd tools/testing/selftests/clone3 && make && ./clone3 ... # Time namespaces are not supported ok 18 # SKIP Skipping clone3() with CLONE_NEWTIME # Totals: pass:17 fail:0 xfail:0 xpass:0 skip:1 error:0 (2) timens test # cd tools/testing/selftests/timens && make && ./timens ... 1..0 # SKIP Time namespaces are not supported On LoongArch the current kernel does not support CONFIG_TIME_NS which depends on GENERIC_VDSO_TIME_NS, select GENERIC_VDSO_TIME_NS to enable CONFIG_TIME_NS to build kernel/time/namespace.c. Additionally, it needs to define some arch-dependent functions for the timens, such as __arch_get_timens_vdso_data(), arch_get_vdso_data() and vdso_join_timens(). At the same time, modify the layout of vvar to use one page size for generic vdso data, expand another page size for timens vdso data and assign LOONGARCH_VDSO_DATA_SIZE (maybe exceeds a page size if expand in the future) for loongarch vdso data, at last add the callback function vvar_fault() and modify stack_top(). With this patch under CONFIG_TIME_NS: (1) clone3 test # cd tools/testing/selftests/clone3 && make && ./clone3 ... ok 18 [739] Result (0) matches expectation (0) # Totals: pass:18 fail:0 xfail:0 xpass:0 skip:0 error:0 (2) timens test # cd tools/testing/selftests/timens && make && ./timens ... # Totals: pass:10 fail:0 xfail:0 xpass:0 skip:0 error:0 Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
46 lines
850 B
C
46 lines
850 B
C
// 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;
|
|
}
|
|
|
|
static __always_inline const struct vdso_pcpu_data *get_pcpu_data(void)
|
|
{
|
|
return (struct vdso_pcpu_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_START * PAGE_SIZE);
|
|
}
|
|
|
|
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;
|
|
const struct vdso_pcpu_data *data;
|
|
|
|
cpu_id = read_cpu_id();
|
|
|
|
if (cpu)
|
|
*cpu = cpu_id;
|
|
|
|
if (node) {
|
|
data = get_pcpu_data();
|
|
*node = data[cpu_id].node;
|
|
}
|
|
|
|
return 0;
|
|
}
|