Re: Fast gettimeofday(2) and static linking

2013-01-29 Thread Marius Strobl
On Mon, Jan 28, 2013 at 05:55:24PM +0200, Konstantin Belousov wrote:
 On Mon, Jan 28, 2013 at 04:45:17PM +0100, Marius Strobl wrote:
  On Fri, Jan 25, 2013 at 02:35:54PM +0200, Konstantin Belousov wrote:
   Bruce Evans reported that statically linked binaries on HEAD an stable/9
   use the syscall for gettimeofday(2) and clock_gettime(2). Apparently, this
   is due to my use of the weak reference to the __vdso* symbols in the
   libc implementations.
   
   Patch below reworks the __vdso* attributes to only make the symbols
   weak, but keep the references strong. Since I have to add a stub for
   each architecture, I would like to ask non-x86 machines owners to test
   the patch.
   
  
  Hi Konstantin,
  
  what's the appropriate way to test this?
 
 Please rebuild the world with the patch and check that gettimeofday(2) still
 works on your architecture, both for the static and dynamic binaries.
 I think that just booting multiuser is enough.

Okay, looks good on sparc64 (tested with a dynamically as well as a
statically built time(1)).

Marius

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


Re: Fast gettimeofday(2) and static linking

2013-01-29 Thread Konstantin Belousov
On Tue, Jan 29, 2013 at 11:16:00PM +0100, Marius Strobl wrote:
 On Mon, Jan 28, 2013 at 05:55:24PM +0200, Konstantin Belousov wrote:
  Please rebuild the world with the patch and check that gettimeofday(2) still
  works on your architecture, both for the static and dynamic binaries.
  I think that just booting multiuser is enough.
 
 Okay, looks good on sparc64 (tested with a dynamically as well as a
 statically built time(1)).

Thank you very much.


pgpiVhtGb1QVT.pgp
Description: PGP signature


Re: Fast gettimeofday(2) and static linking

2013-01-28 Thread Marius Strobl
On Fri, Jan 25, 2013 at 02:35:54PM +0200, Konstantin Belousov wrote:
 Bruce Evans reported that statically linked binaries on HEAD an stable/9
 use the syscall for gettimeofday(2) and clock_gettime(2). Apparently, this
 is due to my use of the weak reference to the __vdso* symbols in the
 libc implementations.
 
 Patch below reworks the __vdso* attributes to only make the symbols
 weak, but keep the references strong. Since I have to add a stub for
 each architecture, I would like to ask non-x86 machines owners to test
 the patch.
 

Hi Konstantin,

what's the appropriate way to test this?

Marius

___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


Re: Fast gettimeofday(2) and static linking

2013-01-28 Thread Konstantin Belousov
On Mon, Jan 28, 2013 at 04:45:17PM +0100, Marius Strobl wrote:
 On Fri, Jan 25, 2013 at 02:35:54PM +0200, Konstantin Belousov wrote:
  Bruce Evans reported that statically linked binaries on HEAD an stable/9
  use the syscall for gettimeofday(2) and clock_gettime(2). Apparently, this
  is due to my use of the weak reference to the __vdso* symbols in the
  libc implementations.
  
  Patch below reworks the __vdso* attributes to only make the symbols
  weak, but keep the references strong. Since I have to add a stub for
  each architecture, I would like to ask non-x86 machines owners to test
  the patch.
  
 
 Hi Konstantin,
 
 what's the appropriate way to test this?

Please rebuild the world with the patch and check that gettimeofday(2) still
works on your architecture, both for the static and dynamic binaries.
I think that just booting multiuser is enough.


pgp8FAd4XY1qW.pgp
Description: PGP signature


Fast gettimeofday(2) and static linking

2013-01-25 Thread Konstantin Belousov
Bruce Evans reported that statically linked binaries on HEAD an stable/9
use the syscall for gettimeofday(2) and clock_gettime(2). Apparently, this
is due to my use of the weak reference to the __vdso* symbols in the
libc implementations.

Patch below reworks the __vdso* attributes to only make the symbols
weak, but keep the references strong. Since I have to add a stub for
each architecture, I would like to ask non-x86 machines owners to test
the patch.

Thank you.

diff --git a/lib/libc/amd64/sys/__vdso_gettc.c 
b/lib/libc/amd64/sys/__vdso_gettc.c
index 091fe26..c6f2dfb 100644
--- a/lib/libc/amd64/sys/__vdso_gettc.c
+++ b/lib/libc/amd64/sys/__vdso_gettc.c
@@ -27,9 +27,11 @@
 __FBSDID($FreeBSD$);
 
 #include sys/types.h
+#include sys/elf.h
 #include sys/time.h
 #include sys/vdso.h
 #include machine/cpufunc.h
+#include libc_private.h
 
 static u_int
 __vdso_gettc_low(const struct vdso_timehands *th)
@@ -41,9 +43,18 @@ __vdso_gettc_low(const struct vdso_timehands *th)
return (rv);
 }
 
+#pragma weak __vdso_gettc
 u_int
 __vdso_gettc(const struct vdso_timehands *th)
 {
 
return (th-th_x86_shift  0 ? __vdso_gettc_low(th) : rdtsc32());
 }
+
+#pragma weak __vdso_gettimekeep
+int
+__vdso_gettimekeep(struct vdso_timekeep **tk)
+{
+
+   return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk)));
+}
diff --git a/lib/libc/arm/sys/Makefile.inc b/lib/libc/arm/sys/Makefile.inc
index 1a58eae..fd251c8 100644
--- a/lib/libc/arm/sys/Makefile.inc
+++ b/lib/libc/arm/sys/Makefile.inc
@@ -1,5 +1,7 @@
 # $FreeBSD$
 
+SRCS+= __vdso_gettc.c
+
 MDASM= Ovfork.S brk.S cerror.S pipe.S ptrace.S sbrk.S shmat.S sigreturn.S 
syscall.S
 
 # Don't generate default code for these syscalls:
diff --git a/lib/libc/arm/sys/__vdso_gettc.c b/lib/libc/arm/sys/__vdso_gettc.c
new file mode 100644
index 000..b99bbc4
--- /dev/null
+++ b/lib/libc/arm/sys/__vdso_gettc.c
@@ -0,0 +1,48 @@
+/*-
+ * Copyright (c) 2013 Konstantin Belousov k...@freebsd.org
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *notice, this list of conditions and the following disclaimer in the
+ *documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include sys/cdefs.h
+__FBSDID($FreeBSD$);
+
+#include sys/types.h
+#include sys/time.h
+#include sys/vdso.h
+#include errno.h
+
+#pragma weak __vdso_gettc
+u_int
+__vdso_gettc(const struct vdso_timehands *th)
+{
+
+   return (0);
+}
+
+#pragma weak __vdso_gettimekeep
+int
+__vdso_gettimekeep(struct vdso_timekeep **tk)
+{
+
+   return (ENOSYS);
+}
diff --git a/lib/libc/i386/sys/__vdso_gettc.c b/lib/libc/i386/sys/__vdso_gettc.c
index 4419141..c6f2dfb 100644
--- a/lib/libc/i386/sys/__vdso_gettc.c
+++ b/lib/libc/i386/sys/__vdso_gettc.c
@@ -27,9 +27,11 @@
 __FBSDID($FreeBSD$);
 
 #include sys/types.h
+#include sys/elf.h
 #include sys/time.h
 #include sys/vdso.h
 #include machine/cpufunc.h
+#include libc_private.h
 
 static u_int
 __vdso_gettc_low(const struct vdso_timehands *th)
@@ -48,3 +50,11 @@ __vdso_gettc(const struct vdso_timehands *th)
 
return (th-th_x86_shift  0 ? __vdso_gettc_low(th) : rdtsc32());
 }
+
+#pragma weak __vdso_gettimekeep
+int
+__vdso_gettimekeep(struct vdso_timekeep **tk)
+{
+
+   return (_elf_aux_info(AT_TIMEKEEP, tk, sizeof(*tk)));
+}
diff --git a/lib/libc/ia64/sys/Makefile.inc b/lib/libc/ia64/sys/Makefile.inc
index 3876d3a..2846590 100644
--- a/lib/libc/ia64/sys/Makefile.inc
+++ b/lib/libc/ia64/sys/Makefile.inc
@@ -1,5 +1,7 @@
 # $FreeBSD$
 
+SRCS+= __vdso_gettc.c
+
 MDASM+=Ovfork.S brk.S cerror.S exect.S fork.S getcontext.S pipe.S 
ptrace.S \
sbrk.S setlogin.S sigreturn.S swapcontext.S
 
diff --git a/lib/libc/ia64/sys/__vdso_gettc.c b/lib/libc/ia64/sys/__vdso_gettc.c
new file mode 100644
index 000..b99bbc4
--- /dev/null
+++ b/lib/libc/ia64/sys/__vdso_gettc.c
@@ -0,0 +1,48 @@
+/*-
+ * Copyright (c) 2013 Konstantin Belousov