From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751471AbaBBL0b (ORCPT ); Sun, 2 Feb 2014 06:26:31 -0500 Received: from www84.your-server.de ([213.133.104.84]:37457 "EHLO www84.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751049AbaBBL02 (ORCPT ); Sun, 2 Feb 2014 06:26:28 -0500 From: stefani@seibold.net To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, x86@kernel.org, tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, ak@linux.intel.com, aarcange@redhat.com, john.stultz@linaro.org, luto@amacapital.net, xemul@parallels.com, gorcunov@openvz.org, andriy.shevchenko@linux.intel.com Cc: Martin.Runge@rohde-schwarz.com, Andreas.Brief@rohde-schwarz.com, Stefani Seibold Subject: [PATCH 0/8] Add 32 bit VDSO time function support Date: Sun, 2 Feb 2014 12:27:07 +0100 Message-Id: <1391340435-5130-1-git-send-email-stefani@seibold.net> X-Mailer: git-send-email 1.8.5.3 X-Authenticated-Sender: stefani@seibold.net Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Stefani Seibold This patch add the functions vdso_gettimeofday(), vdso_clock_gettime() and vdso_time() to the 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=/libvdso.so This kind of helper must be integrated into glibc, for x86 64 bit and PowerPC it is already there. 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 address layout of the VDSO has changed, because there is no fixed address space available on a x86 32 bit kernel, despite the name. Because someone decided to add an offset to the __FIXADDR_TOP for virtualization. Also the IA32 Emulation uses the whole 4 GB address space, so there is no fixed address available. This was the reason not depend on this kind of address and change the layout of the VDSO. The VDSO for a 32 bit application has now three pages: +----------------------------------------+ + VDSO page (includes code) ro+x + +----------------------------------------+ + VVAR page (export kernel variables) ro + +----------------------------------------+ + HPET page (mapped registers) ro +----------------------------------------+ The VDSO page for a 32 bit resided now on 0xffffc000, followed by the VVAR and HPET page. 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 kernel 3.14 (e7651b819e90da924991d727d3c007200a18670d) 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 ;-)