ARM: VDSO
Subsystems (2)
v11 cover ARM: VDSO
Provide fast userspace implementations of gettimeofday and clock_gettime on systems that implement the generic timers extension defined in ARMv7. This follows the example of arm64 in conception but significantly differs in some aspects of the implementation (C vs assembly, mainly).
Clocks supported:
- CLOCK_REALTIME
- CLOCK_MONOTONIC
- CLOCK_REALTIME_COARSE
- CLOCK_MONOTONIC_COARSE
getcpu support is planned but not included at this time.
For applications to transparently benefit from this change, ARM-specific support code needs to be added to glibc. I hope to have that code added to glibc for the 2.22 release, pending acceptance of the kernel changes.
The VDSO symbols are available for lookup via dlsym even with an unpatched glibc.
Here are some tables demonstrating the improvement on one platform which benefits from the VDSO (OMAP5), and the hopefully acceptable cost on two platforms lacking the architected timer. The numbers are the cost in nanoseconds for a call to gettimeofday via glibc, measured with a microbenchmark.
| OMAP5 | glibc 2.21 | glibc 2.21 + | | (Cortex-A15) | | vdso support | |-----------------+------------+--------------| | v4.0-rc1 | 346 | 351 | | v4.0-rc1 + vdso | 343 | 118 |
| BeagleBone Black | glibc 2.21 | glibc 2.21 + | | (Cortex-A8) | | vdso support | |------------------+------------+--------------| | v4.0-rc1 | 651 | 668 | | v4.0-rc1 + vdso | 651 | 661 |
| i.MX6Q | glibc 2.21 | glibc 2.21 + | | (Cortex-A9) | | vdso support | |-----------------+------------+--------------| | v4.0-rc1 | 563 | 579 | | v4.0-rc1 + vdso | 569 | 584 |
These numbers vary slightly from one run to another (i.MX6Q in particular seems a little "noisy" with variances of +/-10ns).
I believe this is the minimum overhead (or very close to it) that can be achieved on systems lacking the arch timer, and it's due to adding a test and branch to the syscall wrappers in glibc. Previous versions of these patches caused glibc to dispatch through the VDSO unconditionally, imposing up to ~70ns penalty on i.MX6Q. See patch #3 for how this has been addressed.
I've been verifying and benchmarking this with some custom test code which I have hosted here:
https://github.com/nlynch-mentor/vdsotest
Unpatched FSF GDB may complain "warning: Could not load shared library symbols for linux-vdso.so.1." This is not an ARM-specific issue. Current Fedora and Debian patch their GDB packages to prevent this warning.
Changes since v10:
- Update to 4.0-rc1.
- Drop clock_getres support (easy to implement, but no use case).
- User access to virtual counter is always enabled since e1ce5c7adc73 "clocksource: arm_arch_timer: Enable counter access for 32-bit ARM"; drop runtime check.
- Zero out gettimeofday/clock_gettime entry points when the architected timer is unusable.
- Do not use the generic timer facility when the CPU registers are not initialized by firmware (arm,cpu-registers-not-fw-configured).
- Do not service coarse clocks if high-resolution clocks are not accelerated.
Changes since v9:
- Update to 3.17-rc5.
- Fixed minor checkpatch warnings (line length etc).
- Removed useless VDSO_LBASE constant.
- Added 'notrace' attributes to VDSO-internal functions.
- Removed unused debug code from vdsomunge host program.
Changes since v8:
- Update to 3.17-rc1.
- Split out arch timer changes into separate series.
- Ensure that VDSO will not attempt to read the counter if access is not enabled; this check can be removed after the arch timer changes are merged. See update_vsyscall and vdso_can_use_arch_timer in patch #5.
Changes since v7:
- Update to next-20140801.
- In arch_setup_additional_pages, fix call to get_unmapped_area - use bytes (not pages) for length argument.
- As x86 does, separate data and text into two VMAs, [vvar] and [vdso] respectively. These have different permissions; [vdso] will allow debuggers to set breakpoints, but [vvar] is read-only and cannot be modified even via ptrace.
- Use _install_special_mapping for signal page, vvar, and vdso mappings.
- Add -DDISABLE_BRANCH_PROFILING.
- Add --no-undefined -Bsymbolic to link options to cause linker to error out on unresolved references, making checkundef script unnecessary.
- Specify max-page-size, common-page-size in linker options so the true alignment is reflected in program header; otherwise gdb gets confused.
- Fix incremental build vs. generated auxvec.h.
- Use appropriate unwind directives in __get_datapage.
- Added vdso_install target and help text. Install build-id symlinks as x86 does.
- Adjust update_vsyscall for changes in struct timekeeper.
Changes since v6:
- Update to 3.16-rc1.
- Remove -lgcc from link step - need to support GCC installations without libgcc.
- Force -O2 compilation to prevent GCC from emitting calls to libgcc math routines.
- Use custom post-processing to clear the EF_ARM_ABI_FLOAT_SOFT flag if set in the ELF header to produce a shared object which is architecturally allowed to be used by both soft- and hard-float code.
- Consolidate common arch timer code instead of duplicating it.
- Prevent the VDSO from attempting CP15 access on memory-only architected timer implementations by renaming the clocksource.
Changes since v5:
- Update to 3.15-rc1.
- Place vdso at a randomized offset above the stack along with the sigpage.
- Properly export asm/auxvec.h.
- Split patch into series for ease of review.
Changes since v4:
- Map data page at the beginning of the VMA to prevent orphan sections at the end of output invalidating the calculated offset.
- Move checkundef into cmd_vdsold to avoid spurious rebuilds.
- Change vdso_init message to pr_debug.
- Add -fno-stack-protector to cflags.
Changes since v3:
- Update to 3.14-rc6.
- Record vdso base in mm context before installing mapping (for the sake of perf_mmap_event).
- Use a more seqcount-like API for critical sections. Using seqcount API directly, however, would leak kernel pointers to userspace when lockdep is enabled.
- Trap instead of looping forever in division-by-zero stubs.
Changes since v2:
- Update to 3.14-rc4.
- Make vDSO configurable, depending on AEABI and MMU.
- Defer shifting of nanosecond component of timespec: fixes observed 1ns inconsistencies for CLOCK_REALTIME, CLOCK_MONOTONIC (see 45a7905fc48f for arm64 equivalent).
- Force reload of seq_count when spinning: without a memory clobber after the load of vdata->seq_count, GCC can generate code like this:
2f8: e59c9020 ldr r9, [ip, #32]
2fc: e3190001 tst r9, #1
300: 1a000033 bne 3d4 <do_realtime+0x104>
304: f57ff05b dmb ish
308: e59c3034 ldr r3, [ip, #52] ; 0x34
...
3d4: eafffffe b 3d4 <do_realtime+0x104>- Build vdso.so with -lgcc: calls to __lshrdi3, __divsi3 sometimes emitted (especially with -Os). Override certain libgcc functions to prevent undefined symbols.
- Do not clear PG_reserved on vdso pages.
- Remove unnecessary get_page calls.
- Simplify ELF signature check during init.
- Use volatile for asm syscall fallbacks.
- Check whether vdso_pagelist is initialized in arm_install_vdso.
- Record clocksource mask in data page.
- Reduce code duplication in do_realtime, do_monotonic.
- Reduce calculations performed in critical sections.
- Simplify coarse clock handling.
- Move datapage load to its own assembly routine.
- Tune vdso_data layout and tweak field names.
- Check vdso shared object for undefined symbols during build.
Changes since v1:
- update to 3.14-rc1
- ensure cache coherency for data page
- Document the kernel-to-userspace protocol for vdso data page updates, and note that the timekeeping core prevents concurrent updates.
- update wall-to-monotonic fields unconditionally
- move vdso_start, vdso_end declarations to vdso.h
- correctly build and run when CONFIG_ARM_ARCH_TIMER=n
- rearrange linker script to avoid overlapping sections when CONFIG_DEBUGINFO=n
- remove use_syscall checks from coarse clock paths
- crib BUG_INSTR (0xe7f001f2) from asm/bug.h for text fill
Nathan Lynch (4):
ARM: miscellaneous vdso infrastructure, preparation
ARM: add VDSO user-space code
ARM: VDSO initialization, mapping, and synchronization
ARM: add CONFIG_VDSO Kconfig and Makefile bits
arch/arm/Makefile | 8 + arch/arm/include/asm/Kbuild | 1 - arch/arm/include/asm/auxvec.h | 1 + arch/arm/include/asm/elf.h | 9 + arch/arm/include/asm/mmu.h | 3 + arch/arm/include/asm/vdso.h | 32 ++++ arch/arm/include/asm/vdso_datapage.h | 60 +++++++ arch/arm/include/uapi/asm/Kbuild | 1 + arch/arm/include/uapi/asm/auxvec.h | 7 + arch/arm/kernel/Makefile | 1 + arch/arm/kernel/asm-offsets.c | 5 + arch/arm/kernel/process.c | 17 +- arch/arm/kernel/vdso.c | 337 +++++++++++++++++++++++++++++++++++ arch/arm/mm/Kconfig | 14 ++ arch/arm/vdso/.gitignore | 1 + arch/arm/vdso/Makefile | 74 ++++++++ arch/arm/vdso/datapage.S | 15 ++ arch/arm/vdso/vdso.S | 35 ++++ arch/arm/vdso/vdso.lds.S | 87 +++++++++ arch/arm/vdso/vdsomunge.c | 201 +++++++++++++++++++++ arch/arm/vdso/vgettimeofday.c | 282 +++++++++++++++++++++++++++++ 21 files changed, 1187 insertions(+), 4 deletions(-) create mode 100644 arch/arm/include/asm/auxvec.h create mode 100644 arch/arm/include/asm/vdso.h create mode 100644 arch/arm/include/asm/vdso_datapage.h create mode 100644 arch/arm/include/uapi/asm/auxvec.h create mode 100644 arch/arm/kernel/vdso.c create mode 100644 arch/arm/vdso/.gitignore create mode 100644 arch/arm/vdso/Makefile create mode 100644 arch/arm/vdso/datapage.S create mode 100644 arch/arm/vdso/vdso.S create mode 100644 arch/arm/vdso/vdso.lds.S create mode 100644 arch/arm/vdso/vdsomunge.c create mode 100644 arch/arm/vdso/vgettimeofday.c
Signature · 1 line
1.9.3
PATCH v11 1/4 ARM: miscellaneous vdso infrastructure, preparation
Define the layout of the data structure shared between kernel and userspace.
Track the vdso address in the mm_context; needed for communicating AT_SYSINFO_EHDR to the ELF loader.
Add declarations for arm_install_vdso; implementation is in a following patch.
Define AT_SYSINFO_EHDR, and, if CONFIG_VDSO=y, report the vdso shared object address via the ELF auxiliary vector.
Note - this adds the AT_SYSINFO_EHDR in a new user-visible header asm/auxvec.h; this is consistent with other architectures.
--- arch/arm/include/asm/Kbuild | 1 - arch/arm/include/asm/auxvec.h | 1 + arch/arm/include/asm/elf.h | 9 ++++++ arch/arm/include/asm/mmu.h | 3 ++ arch/arm/include/asm/vdso.h | 32 +++++++++++++++++++ arch/arm/include/asm/vdso_datapage.h | 60 ++++++++++++++++++++++++++++++++++++ arch/arm/include/uapi/asm/Kbuild | 1 + arch/arm/include/uapi/asm/auxvec.h | 7 +++++ 8 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 arch/arm/include/asm/auxvec.h create mode 100644 arch/arm/include/asm/vdso.h create mode 100644 arch/arm/include/asm/vdso_datapage.h create mode 100644 arch/arm/include/uapi/asm/auxvec.h
arch/arm/include/asm/Kbuild +0 -1
@@ -1,6 +1,5 @@ -generic-y += auxvec.h generic-y += bitsperlong.h generic-y += cputime.h generic-y += current.h
arch/arm/include/asm/auxvec.h new file +1 -0
@@ -0,0 +1 @@ +#include <uapi/asm/auxvec.h>
arch/arm/include/asm/elf.h +9 -0
@@ -1,7 +1,9 @@#ifndef __ASMARM_ELF_H#define __ASMARM_ELF_H +#include <asm/auxvec.h> #include <asm/hwcap.h> +#include <asm/vdso_datapage.h> /* * ELF register definitions..
@@ -130,6 +132,13 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm);#define arch_randomize_brk arch_randomize_brk#ifdef CONFIG_MMU +#ifdef CONFIG_VDSO +#define ARCH_DLINFO \ +do { \ + NEW_AUX_ENT(AT_SYSINFO_EHDR, \ + (elf_addr_t)current->mm->context.vdso); \ +} while (0) +#endif #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1struct linux_binprm ;int arch_setup_additional_pages (struct linux_binprm *,int );
arch/arm/include/asm/mmu.h +3 -0
@@ -11,6 +11,9 @@ typedef struct {#endif unsigned int vmalloc_seq;unsigned long sigpage; +#ifdef CONFIG_VDSO +unsigned long vdso; +#endif } mm_context_t;#ifdef CONFIG_CPU_HAS_ASID
arch/arm/include/asm/vdso.h new file +32 -0
@@ -0,0 +1,32 @@ +#ifndef __ASM_VDSO_H +#define __ASM_VDSO_H + +#ifdef __KERNEL__ + +#ifndef __ASSEMBLY__ + +struct mm_struct ; + +#ifdef CONFIG_VDSO + +void arm_install_vdso (struct mm_struct *mm,unsigned long addr); + +extern char vdso_start, vdso_end; + +extern unsigned int vdso_total_pages; + +#else /* CONFIG_VDSO */ + +static inline void arm_install_vdso (struct mm_struct *mm,unsigned long addr) +{ +} + +#define vdso_total_pages 0 + +#endif /* CONFIG_VDSO */ + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif /* __ASM_VDSO_H */
arch/arm/include/asm/vdso_datapage.h new file +60 -0
60 lines not on this page · raw message
arch/arm/include/uapi/asm/Kbuild +1 -0
@@ -1,6 +1,7 @@ # UAPI Header export list include include/uapi/asm-generic/Kbuild.asm +header-y += auxvec.h header-y += byteorder.h header-y += fcntl.h header-y += hwcap.h
arch/arm/include/uapi/asm/auxvec.h new file +7 -0
@@ -0,0 +1,7 @@ +#ifndef __ASM_AUXVEC_H +#define __ASM_AUXVEC_H + +/* VDSO location */ +#define AT_SYSINFO_EHDR 33 + +#endif
Signature · 1 line
1.9.3
PATCH v11 2/4 ARM: add VDSO user-space code
In reply to Nathan LynchPlace VDSO-related user-space code in arch/arm/kernel/vdso/.
It is almost completely written in C with some assembly helpers to load the data page address, sample the counter, and fall back to system calls when necessary.
The VDSO can service gettimeofday and clock_gettime when CONFIG_ARM_ARCH_TIMER is enabled and the architected timer is present (and correctly configured). It reads the CP15-based virtual counter to compute high-resolution timestamps.
Of particular note is that a post-processing step ("vdsomunge") is necessary to produce a shared object which is architecturally allowed to be used by both soft- and hard-float EABI programs.
The 2012 edition of the ARM ABI defines Tag_ABI_VFP_args = 3 "Code is compatible with both the base and VFP variants; the user did not permit non-variadic functions to pass FP parameters/results." Unfortunately current toolchains do not support this tag, which is ideally what we would use.
The best available option is to ensure that both EF_ARM_ABI_FLOAT_SOFT and EF_ARM_ABI_FLOAT_HARD are unset in the ELF header's e_flags, indicating that the shared object is "old" and should be accepted for backward compatibility's sake. While binutils < 2.24 appear to produce a vdso.so with both flags clear, 2.24 always sets EF_ARM_ABI_FLOAT_SOFT, with no way to inhibit this behavior. So we have to fix things up with a custom post-processing step.
In fact, the VDSO code in glibc does much less validation (including checking these flags) than the code for handling conventional file-backed shared libraries, so this is a bit moot unless glibc's VDSO code becomes more strict.
--- arch/arm/kernel/asm-offsets.c | 5 + arch/arm/vdso/.gitignore | 1 + arch/arm/vdso/Makefile | 74 +++++++++++ arch/arm/vdso/datapage.S | 15 +++ arch/arm/vdso/vdso.S | 35 ++++++ arch/arm/vdso/vdso.lds.S | 87 +++++++++++++ arch/arm/vdso/vdsomunge.c | 201 ++++++++++++++++++++++++++++++ arch/arm/vdso/vgettimeofday.c | 282 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 700 insertions(+) create mode 100644 arch/arm/vdso/.gitignore create mode 100644 arch/arm/vdso/Makefile create mode 100644 arch/arm/vdso/datapage.S create mode 100644 arch/arm/vdso/vdso.S create mode 100644 arch/arm/vdso/vdso.lds.S create mode 100644 arch/arm/vdso/vdsomunge.c create mode 100644 arch/arm/vdso/vgettimeofday.c
arch/arm/kernel/asm-offsets.c +5 -0
@@ -25,6 +25,7 @@#include <asm/memory.h> #include <asm/procinfo.h> #include <asm/suspend.h> +#include <asm/vdso_datapage.h> #include <asm/hardware/cache-l2x0.h> #include <linux/kbuild.h>
@@ -210,5 +211,9 @@ int main(void)#endif DEFINE(KVM_VTTBR, offsetof(struct kvm, arch.vttbr));#endif +BLANK (); +#ifdef CONFIG_VDSO +DEFINE (VDSO_DATA_SIZE ,sizeof (union vdso_data_store )); +#endif return 0 ; }
arch/arm/vdso/.gitignore new file +1 -0
@@ -0,0 +1 @@ +vdso.lds
arch/arm/vdso/Makefile new file +74 -0
74 lines not on this page · raw message
arch/arm/vdso/datapage.S new file +15 -0
@@ -0,0 +1,15 @@ +#include <linux/linkage.h> +#include <asm/asm-offsets.h> + + .align 2 +.L_vdso_data_ptr: + .long _start - . - VDSO_DATA_SIZE + +ENTRY(__get_datapage) + .fnstart + adr r0, .L_vdso_data_ptr + ldr r1, [r0] + add r0, r0, r1 + bx lr + .fnend +ENDPROC(__get_datapage)
arch/arm/vdso/vdso.S new file +35 -0
@@ -0,0 +1,35 @@ +/* + * Adapted from arm64 version. + * + * Copyright (C) 2012 ARM Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Author: Will Deacon <[email protected]> + */ + +#include <linux/init.h> +#include <linux/linkage.h> +#include <linux/const.h> +#include <asm/page.h> + + __PAGE_ALIGNED_DATA + + .globl vdso_start, vdso_end + .balign PAGE_SIZE +vdso_start: + .incbin "arch/arm/vdso/vdso.so" + .balign PAGE_SIZE +vdso_end: + + .previous
arch/arm/vdso/vdso.lds.S new file +87 -0
87 lines not on this page · raw message
arch/arm/vdso/vdsomunge.c new file +201 -0
201 lines not on this page · raw message
arch/arm/vdso/vgettimeofday.c new file +282 -0
282 lines not on this page · raw message
Signature · 1 line
1.9.3
PATCH v11 3/4 ARM: VDSO initialization, mapping, and synchronization
In reply to Nathan LynchInitialize the VDSO page list at boot, install the VDSO mapping at exec time, and update the data page during timer ticks. This code is not built if CONFIG_VDSO is not enabled.
Account for the VDSO length when randomizing the offset from the stack. The [vdso] and [vvar] pages are placed immediately following the sigpage with separate _install_special_mapping calls.
We want to "penalize" systems lacking the arch timer as little as possible. Previous versions of this code installed the VDSO unconditionally and unmodified, making it a measurably slower way for glibc to invoke the real syscalls on such systems. E.g. calling gettimeofday via glibc goes from ~560ns to ~630ns on i.MX6Q.
If we can indicate to glibc that the time-related APIs in the VDSO are not accelerated, glibc can continue to invoke the syscalls directly instead of dispatching through the VDSO only to fall back to the slow path.
Thus, if the architected timer is unusable for whatever reason, patch the VDSO at boot time so that symbol lookups for gettimeofday and clock_gettime return NULL. (This is similar to what powerpc does and borrows code from there.) This allows glibc to perform the syscall directly instead of passing control to the VDSO, which minimizes the penalty. In my measurements the time taken for a gettimeofday call via glibc goes from ~560ns to ~580ns (again on i.MX6Q), and this is solely due to adding a test and branch to glibc's gettimeofday syscall wrapper.
An alternative to patching the VDSO at boot would be to not install the VDSO at all when the arch timer isn't usable. Another alternative is to include a separate "dummy" vdso.so without gettimeofday and clock_gettime, which would be selected at boot time. Either of these would get cumbersome if the VDSO were to gain support for an API such as getcpu which is unrelated to arch timer support.
--- arch/arm/kernel/process.c | 17 ++- arch/arm/kernel/vdso.c | 337 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 351 insertions(+), 3 deletions(-) create mode 100644 arch/arm/kernel/vdso.c
arch/arm/kernel/process.c +14 -3
@@ -41,6 +41,7 @@#include <asm/system_misc.h> #include <asm/mach/time.h> #include <asm/tls.h> +#include <asm/vdso.h> #ifdef CONFIG_CC_STACKPROTECTOR #include <linux/stackprotector.h>
@@ -475,7 +476,7 @@ const char *arch_vma_name(struct vm_area_struct *vma) }/* If possible, provide a placement hint at a random offset from the -* stack for the signal page. +* stack for the sigpage and vdso pages. */ static unsigned long sigpage_addr (const struct mm_struct *mm,unsigned int npages)
@@ -519,6 +520,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) {struct mm_struct *mm = current->mm;struct vm_area_struct *vma; +unsigned long npages;unsigned long addr;unsigned long hint;int ret =0 ;
@@ -528,9 +530,12 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)if (!signal_page)return -ENOMEM ; + npages =1 ;/* for sigpage */ + npages += vdso_total_pages; +down_write (&mm->mmap_sem); - hint =sigpage_addr (mm,1 ); - addr =get_unmapped_area (NULL , hint,PAGE_SIZE ,0 ,0 ); + hint =sigpage_addr (mm, npages); + addr =get_unmapped_area (NULL , hint, npages <<PAGE_SHIFT ,0 ,0 );if (IS_ERR_VALUE (addr)) { ret = addr; goto up_fail;
@@ -547,6 +552,12 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) mm->context.sigpage = addr; +/* Unlike the sigpage, failure to install the vdso is unlikely +* to be fatal to the process, so no error check needed +* here. +*/ +arm_install_vdso (mm, addr +PAGE_SIZE ); + up_fail:up_write (&mm->mmap_sem);return ret;
arch/arm/kernel/vdso.c new file +337 -0
337 lines not on this page · raw message
Signature · 1 line
1.9.3
PATCH v11 4/4 ARM: add CONFIG_VDSO Kconfig and Makefile bits
In reply to Nathan LynchAllow users to enable the vdso in Kconfig; include the vdso in the build if CONFIG_VDSO is enabled. Add 'vdso_install' target.
--- arch/arm/Makefile | 8 ++++++++ arch/arm/kernel/Makefile | 1 + arch/arm/mm/Kconfig | 14 ++++++++++++++ 3 files changed, 23 insertions(+)
arch/arm/Makefile +8 -0
@@ -263,6 +263,7 @@ core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) core-$(CONFIG_VFP) += arch/arm/vfp/ core-$(CONFIG_XEN) += arch/arm/xen/ core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/ +core-$(CONFIG_VDSO) += arch/arm/vdso/ # If we have a machine-specific directory, then include it in the build. core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
@@ -320,6 +321,12 @@ dtbs: prepare scripts dtbs_install: $(Q)$(MAKE) $(dtbinst)=$(boot)/dts +PHONY += vdso_install +vdso_install: +ifeq ($(CONFIG_VDSO),y) + $(Q)$(MAKE) $(build)=arch/arm/vdso $@ +endif + # We use MRPROPER_FILES and CLEAN_FILES now archclean: $(Q)$(MAKE) $(clean)=$(boot)
@@ -344,4 +351,5 @@ define archhelp echo ' Install using (your) ~/bin/$(INSTALLKERNEL) or' echo ' (distribution) /sbin/$(INSTALLKERNEL) or' echo ' install to $$(INSTALL_PATH) and run lilo' + echo ' vdso_install - Install unstripped vdso.so to $$(INSTALL_MOD_PATH)/vdso' endef
arch/arm/kernel/Makefile +1 -0
@@ -75,6 +75,7 @@ obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o CFLAGS_pj4-cp0.o := -marm AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt obj-$(CONFIG_ARM_CPU_TOPOLOGY) += topology.o +obj-$(CONFIG_VDSO) += vdso.o ifneq ($(CONFIG_ARCH_EBSA110),y) obj-y += io.o
arch/arm/mm/Kconfig +14 -0
@@ -825,6 +825,20 @@ config KUSER_HELPERS Say N here only if you are absolutely certain that you do not need these helpers; otherwise, the safe option is to say Y. +config VDSO + bool "Enable VDSO for acceleration of some system calls" + depends on AEABI && MMU + default y if ARM_ARCH_TIMER + select GENERIC_TIME_VSYSCALL + help + Place in the process address space an ELF shared object + providing fast implementations of gettimeofday and + clock_gettime. Systems that implement the ARM architected + timer will receive maximum benefit. + + You must have glibc 2.22 or later for programs to seamlessly + take advantage of this. + config DMA_CACHE_RWFO bool "Enable read/write for ownership DMA cache maintenance" depends on CPU_V6K && SMP
Signature · 1 line
1.9.3
v11 cover ARM: VDSO
In reply to Nathan LynchQuoted 5 lines · Nathan Lynch
Provide fast userspace implementations of gettimeofday and
clock_gettimeon systems that implement the generic timers extension defined in ARMv7. This follows the example of arm64 in conception but significantly differs in some aspects of the implementation (C vs assembly, mainly).
Okay, having re-read the code, I'm happy with this now. I'll see about testing it out on the platforms I have here in the next few days. As I now have a Cortex A15 platform, I can hopefully also check what effect it has there (assuming ethernet gets fixed on it so I can get programs onto the platform.)
Signature · 2 lines
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up according to speedtest.net.
v11 cover ARM: VDSO
Quoted 7 lines · Russell King - ARM Linux
Quoted 5 lines · Nathan Lynch
Provide fast userspace implementations of gettimeofday and
clock_gettimeon systems that implement the generic timers extension defined in ARMv7. This follows the example of arm64 in conception but significantly differs in some aspects of the implementation (C vs assembly, mainly).
Quoted 5 lines
Okay, having re-read the code, I'm happy with this now. I'll see about testing it out on the platforms I have here in the next few days. As I now have a Cortex A15 platform, I can hopefully also check what effect it has there (assuming ethernet gets fixed on it so I can get programs onto the platform.)
Thanks Russell, I'll put it in the patch tracker today.
I'll follow up with a link to the glibc patch when I post that too.
v11 cover ARM: VDSO
In reply to Nathan LynchPatch for glibc posted here: