[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1395094933-14252-1-git-send-email-stefani@seibold.net>
Date: Mon, 17 Mar 2014 23:22:00 +0100
From: Stefani Seibold <stefani@...bold.net>
To: gregkh@...uxfoundation.org, linux-kernel@...r.kernel.org,
x86@...nel.org, tglx@...utronix.de, mingo@...hat.com,
hpa@...or.com, ak@...ux.intel.com, aarcange@...hat.com,
john.stultz@...aro.org, luto@...capital.net, xemul@...allels.com,
gorcunov@...nvz.org, andriy.shevchenko@...ux.intel.com
Cc: Martin.Runge@...de-schwarz.com, Andreas.Brief@...de-schwarz.com,
Stefani Seibold <stefani@...bold.net>
Subject: [PATCH v23 00/13] x86: Add x86 32 bit VDSO time function support
This patch add the functions vdso_gettimeofday(), vdso_clock_gettime()
and vdso_time() to the x86 32 bit VDSO.
The reason to do this was to get a fast reliable time stamp. Many developers
uses TSC to get a fast time stamp, without knowing the pitfalls. VDSO
time functions a fast and a reliable way, because the kernel knows the
best time source and the P- and C-state of the CPU.
The helper library to use the VDSO functions can be download at
http://http://seibold.net/vdso.c
The libary is very small, only 228 lines of code. Compile it with
gcc -Wall -O3 -fpic vdso.c -lrt -shared -o libvdso.so
and use it with LD_PRELOAD=<path>/libvdso.so
There is also a patch http://seibold.net/glibc.patch for glibc 2.19 which also
works for glibc 2.18. This patch must be integrated into glibc.
Some linux 32 bit kernel benchmark results (all measurements are in nano
seconds):
Intel(R) Celeron(TM) CPU 400MHz
Average time kernel call:
gettimeofday(): 1039
clock_gettime(): 1578
time(): 526
Average time VDSO call:
gettimeofday(): 378
clock_gettime(): 303
time(): 60
Celeron(R) Dual-Core CPU T3100 1.90GHz
Average time kernel call:
gettimeofday(): 209
clock_gettime(): 406
time(): 135
Average time VDSO call:
gettimeofday(): 51
clock_gettime(): 43
time(): 10
So you can see a performance increase between 4 and 13, depending on the
CPU and the function.
The IA32 Emulation uses the whole 4 GB address space, so there is no
fixed address available.
The VDSO for a 32 bit application has now three pages:
^ Higher Address
|
+----------------------------------------+
+ VDSO page (includes code) ro+x +
+----------------------------------------+
+ VVAR page (export kernel variables) ro +
+----------------------------------------+
+ HPET page (mapped registers) ro
+----------------------------------------+
|
^ Lower Address
The VDSO page for a 32 bit resided still on 0xffffe000, the the VVAR and
HPET page are mapped before.
In the non compat mode the VMA of the VDSO is now 3 pages for a 32 bit kernel.
So this decrease the available logical address room by 2 pages.
The patch is against tip x86/vdso (1f2cbcf648962cdcf511d234cb39745baa9f5d07)
Changelog:
25.11.2012 - first release and proof of concept for linux 3.4
11.12.2012 - Port to linux 3.7 and code cleanup
12.12.2012 - fixes suggested by Andy Lutomirski
- fixes suggested by John Stultz
- use call VDSO32_vsyscall instead of int 80
- code cleanup
17.12.2012 - support for IA32_EMULATION, this includes
- code cleanup
- include cleanup to fix compile warnings and errors
- move out seqcount from seqlock, enable use in VDSO
- map FIXMAP and HPET into the 32 bit address space
18.12.2012 - split into separate patches
30.01.2014 - revamp the code
- code clean up
- VDSO layout changed
- no fixed addresses
- port to 3.14
01.02.2014 - code cleanup
02.02.2014 - code cleanup
- split into more patches
- use HPET_COUNTER instead of hard coded value
- fix changelog to the right year ;-)
02.02.2014 - reverse the mapping, this make the new VDSO 32 bit support
full compatible.
03.02.2014 - code cleanup
- fix comment
- fix ABI break in vdso32.lds.S
04.02.2014 - revamp IA32 emulation support
- introduce VVAR macro
- rearranged vsyscall_gtod_data struture for IA32 emulation support
- code cleanup
05.02.2014 - revamp IA32 emulation support
- replace seqcount_t by an unsigned, to make the vsyscall_gtod_data
structure independed of kernel config and functions.
08.02.2014 - revamp IA32 emulation support
- replace all internal structures by fix size elements
10.02.2014 - code cleanup
- add commets
- revamp inline assembly
12.02.2014 - add conditional fixmap of vvar and hpet pages for 32 bit kernel
14.02.2014 - fix CONFIG_PARAVIRT_CLOCK, which is not supported in 32 bit VDSO
15.02.2014 - fix tsc
code cleanup
tested make ARCH=i386 allyesconfig and make allyesconfig
16.02.2014 - code cleanup
- fix all C=1 warnings, also some one not introduced by this patch
- hack to fix C=1 32 bit VDSO spinlock for a 64 bit kernel
- fix VDSO Makefile for newer gcc
tested for gcc 4.3.4 and 4.8.1
tested ARCH=i386 allyesconfig, defconfig and allmodconfig
tested X86_64 allyesconfig, defconfig and allmodconfig
17.02.2014 - In case of a 32 bit VDSO for a 64 bit kernel fake a 32 bit kernel
configuration.
19.02.2014 - Add missing #undef and #define to fake proper 32 bit kernel config
Add a missing #ifdef CONFIG_HPET_TIMER
tested again ARCH=i386 allyesconfig, defconfig and allmodconfig
tested again ARCH=X86_64 allyesconfig, defconfig and allmodconfig
02.03.2014 - Add fixes suggested by Andy Lutomirski
- Patch alternatives in the 32 bit VDSO
- Use the default ABI for the 32 bit VDSO
- Inline the CLOCK MONOTONIC VDSO code
- Zero pad the VVAR page
- fix "patch alternatives" compile for 32 bit kernel
03.03.2014 - Add glibc.patch http://seibold.net/glibc.patch
Add reviewed-by tags
17.03.2014 - Rebase on tip x86/vdso 1f2cbcf648962cdcf511d234cb39745baa9f5d07
remove fixmap and compat mode dependencies
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists