Message ID | 20200416052618.804515-4-avagin@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: add the time namespace support | expand |
Hi Andrei, On Wed, Apr 15, 2020 at 10:26:15PM -0700, Andrei Vagin wrote: > diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h > index 07468428fd29..351c145d3808 100644 > --- a/arch/arm64/include/asm/vdso.h > +++ b/arch/arm64/include/asm/vdso.h > @@ -12,6 +12,12 @@ > */ > #define VDSO_LBASE 0x0 > > +#ifdef CONFIG_TIME_NS > +#define __VVAR_PAGES 2 > +#else > +#define __VVAR_PAGES 1 > +#endif > + > #ifndef __ASSEMBLY__ > +#ifdef CONFIG_TIME_NS > +static __always_inline const struct vdso_data *__arch_get_timens_vdso_data(void) > +{ > + const struct vdso_data *ret; > + > + ret = _timens_data; > + OPTIMIZER_HIDE_VAR(ret); > + > + return ret; > +} > +#endif Sorry for the confusion here, but please either: * Add a preparatory patch making __arch_get_vdso_data() use OPTIMIZER_HIDE_VAR(), and use OPTIMIZER_HIDE_VAR() here. * Use the same assembly as __arch_get_vdso_data() currently does. ... and either way add a comment here: /* See __arch_get_vdso_data() */ ... so taht the rationale is obvious. [...] > +enum vvar_pages { > + VVAR_DATA_PAGE_OFFSET = 0, > +#ifdef CONFIG_TIME_NS > + VVAR_TIMENS_PAGE_OFFSET = 1, > +#endif /* CONFIG_TIME_NS */ > + VVAR_NR_PAGES = __VVAR_PAGES, > +}; Pet peeve, but we don't need the initializers here, as enums start from zero. The last element shouldn't have a trailing comma as we don't expect to add elements after it in future. Rather than assigning to VVAR_NR_PAGES, it'd be better to use a BUILD_BUG_ON() to verify that it is the number we expect: enum vvar_pages { VVAR_DATA_PAGE, #ifdef CONFIG_TIME_NS VVAR_TIMENS_PAGE, #endif VVAR_NR_PAGES }; BUILD_BUG_ON(VVAR_NR_PAGES != __VVAR_PAGES); Thanks, Mark.
On Thu, Apr 16, 2020 at 11:45:27AM +0100, Mark Rutland wrote: > Hi Andrei, > > On Wed, Apr 15, 2020 at 10:26:15PM -0700, Andrei Vagin wrote: > > diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h > > index 07468428fd29..351c145d3808 100644 > > --- a/arch/arm64/include/asm/vdso.h > > +++ b/arch/arm64/include/asm/vdso.h ... > > +#ifdef CONFIG_TIME_NS > > +static __always_inline const struct vdso_data *__arch_get_timens_vdso_data(void) > > +{ > > + const struct vdso_data *ret; > > + > > + ret = _timens_data; > > + OPTIMIZER_HIDE_VAR(ret); > > + > > + return ret; > > +} > > +#endif > > Sorry for the confusion here, but please either: > > * Add a preparatory patch making __arch_get_vdso_data() use > OPTIMIZER_HIDE_VAR(), and use OPTIMIZER_HIDE_VAR() here. > > * Use the same assembly as __arch_get_vdso_data() currently does. > > ... and either way add a comment here: > > /* See __arch_get_vdso_data() */ > > ... so taht the rationale is obvious. > > [...] > > > +enum vvar_pages { > > + VVAR_DATA_PAGE_OFFSET = 0, > > +#ifdef CONFIG_TIME_NS > > + VVAR_TIMENS_PAGE_OFFSET = 1, > > +#endif /* CONFIG_TIME_NS */ > > + VVAR_NR_PAGES = __VVAR_PAGES, > > +}; > > Pet peeve, but we don't need the initializers here, as enums start from > zero. The last element shouldn't have a trailing comma as we don't > expect to add elements after it in future. > > Rather than assigning to VVAR_NR_PAGES, it'd be better to use a > BUILD_BUG_ON() to verify that it is the number we expect: > > enum vvar_pages { > VVAR_DATA_PAGE, > #ifdef CONFIG_TIME_NS > VVAR_TIMENS_PAGE, > #endif > VVAR_NR_PAGES > }; > > BUILD_BUG_ON(VVAR_NR_PAGES != __VVAR_PAGES); Hi Mark, Thank you for the review. I have sent a fixed version of this patch in replay to the origin patch. Thanks, Andrei
diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 07468428fd29..351c145d3808 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -12,6 +12,12 @@ */ #define VDSO_LBASE 0x0 +#ifdef CONFIG_TIME_NS +#define __VVAR_PAGES 2 +#else +#define __VVAR_PAGES 1 +#endif + #ifndef __ASSEMBLY__ #include <generated/vdso-offsets.h> diff --git a/arch/arm64/include/asm/vdso/compat_gettimeofday.h b/arch/arm64/include/asm/vdso/compat_gettimeofday.h index b6907ae78e53..6ce9cdf5e08b 100644 --- a/arch/arm64/include/asm/vdso/compat_gettimeofday.h +++ b/arch/arm64/include/asm/vdso/compat_gettimeofday.h @@ -7,6 +7,8 @@ #ifndef __ASSEMBLY__ +#include <linux/compiler.h> + #include <asm/unistd.h> #include <asm/errno.h> @@ -152,6 +154,18 @@ static __always_inline const struct vdso_data *__arch_get_vdso_data(void) return ret; } +#ifdef CONFIG_TIME_NS +static __always_inline const struct vdso_data *__arch_get_timens_vdso_data(void) +{ + const struct vdso_data *ret; + + ret = _timens_data; + OPTIMIZER_HIDE_VAR(ret); + + return ret; +} +#endif + #endif /* !__ASSEMBLY__ */ #endif /* __ASM_VDSO_GETTIMEOFDAY_H */ diff --git a/arch/arm64/include/asm/vdso/gettimeofday.h b/arch/arm64/include/asm/vdso/gettimeofday.h index afba6ba332f8..cf39eae5eaaf 100644 --- a/arch/arm64/include/asm/vdso/gettimeofday.h +++ b/arch/arm64/include/asm/vdso/gettimeofday.h @@ -96,6 +96,14 @@ const struct vdso_data *__arch_get_vdso_data(void) return _vdso_data; } +#ifdef CONFIG_TIME_NS +static __always_inline +const struct vdso_data *__arch_get_timens_vdso_data(void) +{ + return _timens_data; +} +#endif + #endif /* !__ASSEMBLY__ */ #endif /* __ASM_VDSO_GETTIMEOFDAY_H */ diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 6ac9cdeac5be..b3e7ce24e59b 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -46,6 +46,14 @@ enum arch_vdso_type { #define VDSO_TYPES (ARM64_VDSO + 1) #endif /* CONFIG_COMPAT_VDSO */ +enum vvar_pages { + VVAR_DATA_PAGE_OFFSET = 0, +#ifdef CONFIG_TIME_NS + VVAR_TIMENS_PAGE_OFFSET = 1, +#endif /* CONFIG_TIME_NS */ + VVAR_NR_PAGES = __VVAR_PAGES, +}; + struct __vdso_abi { const char *name; const char *vdso_code_start; @@ -81,6 +89,12 @@ static union { } vdso_data_store __page_aligned_data; struct vdso_data *vdso_data = vdso_data_store.data; + +struct vdso_data *arch_get_vdso_data(void *vvar_page) +{ + return (struct vdso_data *)(vvar_page); +} + static int __vdso_remap(enum arch_vdso_type arch_index, const struct vm_special_mapping *sm, struct vm_area_struct *new_vma) @@ -182,7 +196,7 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index, vdso_text_len = vdso_lookup[arch_index].vdso_pages << PAGE_SHIFT; /* Be sure to map the data page */ - vdso_mapping_len = vdso_text_len + PAGE_SIZE; + vdso_mapping_len = vdso_text_len + VVAR_NR_PAGES * PAGE_SIZE; vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0); if (IS_ERR_VALUE(vdso_base)) { @@ -190,13 +204,13 @@ static int __setup_additional_pages(enum arch_vdso_type arch_index, goto up_fail; } - ret = _install_special_mapping(mm, vdso_base, PAGE_SIZE, + ret = _install_special_mapping(mm, vdso_base, VVAR_NR_PAGES * PAGE_SIZE, VM_READ|VM_MAYREAD|VM_PFNMAP, vdso_lookup[arch_index].dm); if (IS_ERR(ret)) goto up_fail; - vdso_base += PAGE_SIZE; + vdso_base += VVAR_NR_PAGES * PAGE_SIZE; mm->context.vdso = (void *)vdso_base; ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC| diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.lds.S index 7ad2d3a0cd48..d808ad31e01f 100644 --- a/arch/arm64/kernel/vdso/vdso.lds.S +++ b/arch/arm64/kernel/vdso/vdso.lds.S @@ -17,7 +17,10 @@ OUTPUT_ARCH(aarch64) SECTIONS { - PROVIDE(_vdso_data = . - PAGE_SIZE); + PROVIDE(_vdso_data = . - __VVAR_PAGES * PAGE_SIZE); +#ifdef CONFIG_TIME_NS + PROVIDE(_timens_data = _vdso_data + PAGE_SIZE); +#endif . = VDSO_LBASE + SIZEOF_HEADERS; .hash : { *(.hash) } :text diff --git a/arch/arm64/kernel/vdso32/vdso.lds.S b/arch/arm64/kernel/vdso32/vdso.lds.S index a3944927eaeb..06cc60a9630f 100644 --- a/arch/arm64/kernel/vdso32/vdso.lds.S +++ b/arch/arm64/kernel/vdso32/vdso.lds.S @@ -17,7 +17,10 @@ OUTPUT_ARCH(arm) SECTIONS { - PROVIDE_HIDDEN(_vdso_data = . - PAGE_SIZE); + PROVIDE_HIDDEN(_vdso_data = . - __VVAR_PAGES * PAGE_SIZE); +#ifdef CONFIG_TIME_NS + PROVIDE_HIDDEN(_timens_data = _vdso_data + PAGE_SIZE); +#endif . = VDSO_LBASE + SIZEOF_HEADERS; .hash : { *(.hash) } :text diff --git a/include/vdso/datapage.h b/include/vdso/datapage.h index 5cbc9fcbfd45..2022e8c653c1 100644 --- a/include/vdso/datapage.h +++ b/include/vdso/datapage.h @@ -109,6 +109,7 @@ struct vdso_data { * relocation, and this is what we need. */ extern struct vdso_data _vdso_data[CS_BASES] __attribute__((visibility("hidden"))); +extern struct vdso_data _timens_data[CS_BASES] __attribute__((visibility("hidden"))); /* * The generic vDSO implementation requires that gettimeofday.h