Patchwork Add configure clock_gettime() monotonic time test

login
register
mail settings
Submitter Brad
Date April 2, 2013, 3:42 p.m.
Message ID <20130402154214.GJ26146@rox.home.comstyle.com>
Download mbox | patch
Permalink /patch/233066/
State New
Headers show

Comments

Brad - April 2, 2013, 3:42 p.m.
Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic
time with a configure test. This is to fix the use of monotonic time on
OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also
utilize clock_gettime().


Signed-off-by: Brad Smith <brad@comstyle.com>
Paolo Bonzini - April 2, 2013, 4:45 p.m.
Il 02/04/2013 17:42, Brad Smith ha scritto:
> Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic
> time with a configure test. This is to fix the use of monotonic time on
> OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also
> utilize clock_gettime().

I thought the list of OSes was supposed to filter out those that somehow
had a broken CLOCK_MONOTONIC.

Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the
configure test completely.

Paolo

> 
> Signed-off-by: Brad Smith <brad@comstyle.com>
> 
> diff --git a/configure b/configure
> index fbea75e..352d6a6 100755
> --- a/configure
> +++ b/configure
> @@ -2896,6 +2896,21 @@ if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
>  fi
>  
>  ##########################################
> +# clock_gettime() probe, used for monotonic time
> +clock_monotonic="no"
> +cat > $TMPC << EOF
> +#include <time.h>
> +int main(void)
> +{
> +    clock_gettime(CLOCK_MONOTONIC, NULL);
> +    return 0;  
> +}   
> +EOF
> +if compile_prog "" "" ; then
> +   clock_monotonic="yes"
> +fi
> +
> +##########################################
>  # spice probe
>  if test "$spice" != "no" ; then
>    cat > $TMPC << EOF
> @@ -3671,6 +3686,9 @@ fi
>  if test "$bswap_h" = "yes" ; then
>    echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
>  fi
> +if test "$clock_monotonic" = "yes" ; then
> +  echo "CONFIG_CLOCK_MONOTONIC=y" >> $config_host_mak
> +fi
>  if test "$curl" = "yes" ; then
>    echo "CONFIG_CURL=y" >> $config_host_mak
>    echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
> diff --git a/include/qemu/timer.h b/include/qemu/timer.h
> index 1766b2d..d87dfa4 100644
> --- a/include/qemu/timer.h
> +++ b/include/qemu/timer.h
> @@ -117,8 +117,7 @@ extern int use_rt_clock;
>  
>  static inline int64_t get_clock(void)
>  {
> -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
> -    || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
> +#ifdef CONFIG_CLOCK_MONOTONIC
>      if (use_rt_clock) {
>          struct timespec ts;
>          clock_gettime(CLOCK_MONOTONIC, &ts);
> diff --git a/util/qemu-timer-common.c b/util/qemu-timer-common.c
> index 16f5e75..1506942 100644
> --- a/util/qemu-timer-common.c
> +++ b/util/qemu-timer-common.c
> @@ -49,9 +49,7 @@ int use_rt_clock;
>  static void __attribute__((constructor)) init_get_clock(void)
>  {
>      use_rt_clock = 0;
> -#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
> -    || defined(__DragonFly__) || defined(__FreeBSD_kernel__) \
> -    || defined(__OpenBSD__)
> +#ifdef CONFIG_CLOCK_MONOTONIC
>      {
>          struct timespec ts;
>          if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
>
Brad - April 2, 2013, 10:28 p.m.
On Tue, Apr 02, 2013 at 06:45:17PM +0200, Paolo Bonzini wrote:
> Il 02/04/2013 17:42, Brad Smith ha scritto:
> > Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic
> > time with a configure test. This is to fix the use of monotonic time on
> > OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also
> > utilize clock_gettime().
> 
> I thought the list of OSes was supposed to filter out those that somehow
> had a broken CLOCK_MONOTONIC.
> 
> Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the
> configure test completely.

I only wrote the test as that was what was suggested and even if there
are OS's that have broken monotonic support it is better to put any
exclusion logic in the configure script over having more hardcoded
lists of OS's directly in the code. What OS's have broken monotonic
support?

I would have no problem going in that direction if no one can actually
come up with an OS (or more) that have monotonic support but it is
somehow broken; as in having clock_gettime() and the CLOCK_MONOTONIC
define but not functioning properly.
Peter Maydell - April 2, 2013, 10:52 p.m.
On 2 April 2013 17:45, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Il 02/04/2013 17:42, Brad Smith ha scritto:
>> Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic
>> time with a configure test. This is to fix the use of monotonic time on
>> OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also
>> utilize clock_gettime().
>
> I thought the list of OSes was supposed to filter out those that somehow
> had a broken CLOCK_MONOTONIC.

Judging from wading through git history, it's mostly just
historic accretion from an initial #ifdef __linux__ which was
put in by Fabrice way back when configure was barely doing
compile-this-code checks at all.

Google does suggest that some OSes do provide a CLOCK_MONOTONIC
but clock_gettime(CLOCK_MONOTONIC) always fails, eg Centos 3.

> Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the
> configure test completely.

Tempting.

-- PMM
Paolo Bonzini - April 3, 2013, 8:18 a.m.
Il 03/04/2013 00:52, Peter Maydell ha scritto:
> On 2 April 2013 17:45, Paolo Bonzini <pbonzini@redhat.com> wrote:
>> Il 02/04/2013 17:42, Brad Smith ha scritto:
>>> Replace the hardcoded list of OS's utilizing clock_gettime() for monotonic
>>> time with a configure test. This is to fix the use of monotonic time on
>>> OpenBSD but allows for other POSIX compliant OS's such as NetBSD to also
>>> utilize clock_gettime().
>>
>> I thought the list of OSes was supposed to filter out those that somehow
>> had a broken CLOCK_MONOTONIC.
> 
> Judging from wading through git history, it's mostly just
> historic accretion from an initial #ifdef __linux__ which was
> put in by Fabrice way back when configure was barely doing
> compile-this-code checks at all.
> 
> Google does suggest that some OSes do provide a CLOCK_MONOTONIC
> but clock_gettime(CLOCK_MONOTONIC) always fails, eg Centos 3.

It would already fail, and no one reported it.

CentOS 3 has a 2.4 kernel.  I doubt anyone is using it with a recent QEMU.

Paolo

>> Otherwise, you might as well use "#ifdef CLOCK_MONOTONIC" and skip the
>> configure test completely.
> 
> Tempting.
> 
> -- PMM
> 
>

Patch

diff --git a/configure b/configure
index fbea75e..352d6a6 100755
--- a/configure
+++ b/configure
@@ -2896,6 +2896,21 @@  if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
 fi
 
 ##########################################
+# clock_gettime() probe, used for monotonic time
+clock_monotonic="no"
+cat > $TMPC << EOF
+#include <time.h>
+int main(void)
+{
+    clock_gettime(CLOCK_MONOTONIC, NULL);
+    return 0;  
+}   
+EOF
+if compile_prog "" "" ; then
+   clock_monotonic="yes"
+fi
+
+##########################################
 # spice probe
 if test "$spice" != "no" ; then
   cat > $TMPC << EOF
@@ -3671,6 +3686,9 @@  fi
 if test "$bswap_h" = "yes" ; then
   echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
 fi
+if test "$clock_monotonic" = "yes" ; then
+  echo "CONFIG_CLOCK_MONOTONIC=y" >> $config_host_mak
+fi
 if test "$curl" = "yes" ; then
   echo "CONFIG_CURL=y" >> $config_host_mak
   echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
diff --git a/include/qemu/timer.h b/include/qemu/timer.h
index 1766b2d..d87dfa4 100644
--- a/include/qemu/timer.h
+++ b/include/qemu/timer.h
@@ -117,8 +117,7 @@  extern int use_rt_clock;
 
 static inline int64_t get_clock(void)
 {
-#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
-    || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
+#ifdef CONFIG_CLOCK_MONOTONIC
     if (use_rt_clock) {
         struct timespec ts;
         clock_gettime(CLOCK_MONOTONIC, &ts);
diff --git a/util/qemu-timer-common.c b/util/qemu-timer-common.c
index 16f5e75..1506942 100644
--- a/util/qemu-timer-common.c
+++ b/util/qemu-timer-common.c
@@ -49,9 +49,7 @@  int use_rt_clock;
 static void __attribute__((constructor)) init_get_clock(void)
 {
     use_rt_clock = 0;
-#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD_version >= 500000) \
-    || defined(__DragonFly__) || defined(__FreeBSD_kernel__) \
-    || defined(__OpenBSD__)
+#ifdef CONFIG_CLOCK_MONOTONIC
     {
         struct timespec ts;
         if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {