From owner-freebsd-arch@FreeBSD.ORG Mon Jun 11 08:56:56 2012 Return-Path: Delivered-To: arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 174BE1065673 for ; Mon, 11 Jun 2012 08:56:56 +0000 (UTC) (envelope-from rwatson@freeBSd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id E4E668FC18 for ; Mon, 11 Jun 2012 08:56:55 +0000 (UTC) Received: from fledge.watson.org (fledge.watson.org [65.122.17.41]) by cyrus.watson.org (Postfix) with ESMTPS id 2B43846B0A; Mon, 11 Jun 2012 04:56:55 -0400 (EDT) Date: Mon, 11 Jun 2012 09:56:54 +0100 (BST) From: Robert Watson X-X-Sender: robert@fledge.watson.org To: Konstantin Belousov In-Reply-To: <20120606165115.GQ85127@deviant.kiev.zoral.com.ua> Message-ID: References: <20120606165115.GQ85127@deviant.kiev.zoral.com.ua> User-Agent: Alpine 2.00 (BSF 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: arch@freebsd.org Subject: Re: Fast gettimeofday(2) and clock_gettime(2) X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Jun 2012 08:56:56 -0000 On Wed, 6 Jun 2012, Konstantin Belousov wrote: > The whole struct vdso_timekeep is versioned, as well as individual struct > vdso_timehands, which should allow to implement future algorithms without > breaking binary compatibility. The code is structured to eventually move > __vdso_* functions out of libc into VDSO, if it ever materialize. This > desire explains vdso prefix and header file names. > > I implemented and tested the userspace timecounter on amd64, both for 64 and > 32 bit binaries, it would probably work for i386 too. Other architecture > maintainers are welcome to add neccessary support there. You need to provide > machine/vdso.h header with definitions of VDSO_TIMEHANDS_MD fields for > struct vdso_timehands, which should provide information for userspace to > implement fast tc_get_timecount(). The fields are filled in per-arch > cpu_fill_vdso_timehands(9) function. If your architecture support 32bit > compat, there are cpu_fill_vdso_timehands32(9) and VDSO_TIMEHANDS_MD32 to > code as well. After that, the lib/libc//sys/__vdso_gettc.c should > contain an implemention of __vdso_gettc() function, exact analogue of > tc_get_timecount(). Hi Kostik: I'm glad to see someone is finally grappling with this issue. I could never entirely decide how I felt about the Linux VSDO mechanism, but having some solution here is actually quite important. A few thoughts that you might comment on: 1) It would be nice if we linked any (future) notion of VDSO to the same mechanism we use for ELF branding/ABI emulation -- you conceivably want to support it not just for native ABI and perhaps 32-bit compat ABIs, but also the Linux ABI, alternative userspace ABIs (vis o32 on an n64 MIPS kernel), and so on. 2) Once the VDSO mechanism is there, you get into feature creep space, and looking at how Linux handles pluggable system call mechanisms for the C library is actually interesting. 3) For the purposes of adaptive mutexes in userspace, it really would be quite nice to know whether remote threads are running or not, in the same way that cheap access to remote thread run state in the kernel makes for much more efficient adaptive spinning. I wonder if we could use this mechanism for that purpose as well. I guess for now, at least, you're using a single global page, but in the future, per-process pages might be quite beneficial. Robert