Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Dec 2008 23:09:06 +0100
From:      Juergen Lock <nox@jelal.kn-bremen.de>
To:        qemu-devel@nongnu.org, freebsd-emulation@FreeBSD.org
Subject:   testing qemu svn r5890 on FreeBSD - virtio, and a patch enabling -clock dynticks
Message-ID:  <20081206220906.GA34210@saturn.kn-bremen.de>

next in thread | raw e-mail | index | archive | help
Hi!

 Jung-uk Kim sent me a patch to enable -clock dynticks on FreeBSD hosts
(the configure check is mine, only FreeBSD >= 7.x has posix timers that
this uses), I'll append it below.

 This is the experimental qemu-devel port update I used:
	http://people.freebsd.org/~nox/qemu/qemu-devel-20081206.patch
As already mentioned I had to add a missing `#include <sys/uio.h>'
(files/patch-qemu-common.h), as also posted here:
	http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg00216.html

 I only had one (type of) guest that actually had virtio drivers (three
versions of sidux isos), and the speed difference between virtio-blk and
scsi was small.  (I tested dd bs=64k count=500 </dev/vda >/dev/null and
similar with a raw image, both scsi and virtio were always faster than ide.)
I noted tho that even virtio there was not half as fast as ide (and scsi)
on KNOPPIX_V5.3.1DVD-2008-03-26-EN.iso, so either overhead has increased
greatly from 2.6.24.4 to 2.6.26, or this has something to do with
the sidux kernel using CONFIG_NO_HZ and the Knoppix one (apparently) not
and qemu (possibly, I also suspected that with the usb slowness) not
handling CONFIG_NO_HZ guests too well.  scsi on a FreeBSD
7.1-BETA-i386-livefs.iso guest btw was even yet (noticeably) faster than
on the Knoppix iso.  It will be interesting how virtio-net will fare once
that gets committed...

 Here comes the dynticks patch (files/patch-dynticks), it assumes that
NetBSD either always has posix timers, or -lrt is not needed otherwise
there.  (FreeBSD before 7.x doesn't have -lrt.)

--- qemu/Makefile.target.orig	2008-11-21 11:49:37.000000000 -0500
+++ qemu/Makefile.target	2008-12-03 15:46:24.000000000 -0500
@@ -598,7 +598,7 @@
 OBJS+=block-raw-posix.o
 endif
 
-LIBS+=-lz
+LIBS += $(RTLIBS) -lz
 ifdef CONFIG_ALSA
 LIBS += -lasound
 endif
Index: qemu/configure
@@ -99,6 +99,7 @@
 fmod_lib=""
 fmod_inc=""
 oss_lib=""
+rt_lib=""
 vnc_tls="yes"
 bsd="no"
 linux="no"
@@ -157,13 +158,15 @@
 if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
     kqemu="yes"
 fi
+rt_lib="-lrt"
 ;;
 NetBSD)
 bsd="yes"
 audio_drv_list="oss"
 audio_possible_drivers="oss sdl esd"
 oss_lib="-lossaudio"
-aio_lib="-lrt -lpthread"
+aio_lib="-lpthread"
+rt_lib="-lrt"
 ;;
 OpenBSD)
 bsd="yes"
@@ -231,6 +234,7 @@
     kqemu="yes"
     audio_possible_drivers="$audio_possible_drivers fmod"
 fi
+rt_lib="-lrt"
 ;;
 esac
 
@@ -1053,6 +1057,20 @@
   iovec=yes
 fi
 
+##########################################
+# posix timer probe
+cat > $TMPC <<EOF
+#include <time.h>
+int main(void) { timer_create(CLOCK_REALTIME, (struct sigevent *)NULL, (timer_t *)NULL); return 0; }
+EOF
+posixtimer=no
+if $cc $ARCH_CFLAGS -o $TMPE $TMPC $rt_lib 2> /dev/null ; then
+  posixtimer=yes
+else
+  rt_lib=""
+fi
+RTLIBS="$rt_lib"
+
 # Check if tools are available to build documentation.
 if [ "x$NOPORTDOCS" != "x" -o -x "`which texi2html 2>/dev/null`" ] && \
    [ -x "`which pod2man 2>/dev/null`" ]; then
@@ -1174,6 +1192,7 @@
 echo "LDFLAGS=$LDFLAGS" >> $config_mak
 echo "EXESUF=$EXESUF" >> $config_mak
 echo "AIOLIBS=$AIOLIBS" >> $config_mak
+echo "RTLIBS=$RTLIBS" >> $config_mak
 case "$cpu" in
   i386)
     echo "ARCH=i386" >> $config_mak
@@ -1425,6 +1444,9 @@
 if test "$iovec" = "yes" ; then
   echo "#define HAVE_IOVEC 1" >> $config_h
 fi
+if test "$posixtimer" = "yes" ; then
+  echo "#define HAVE_POSIX_TIMER 1" >> $config_h
+fi
 
 # XXX: suppress that
 if [ "$bsd" = "yes" ] ; then
Index: qemu/vl.c
@@ -918,12 +918,16 @@
 static int unix_start_timer(struct qemu_alarm_timer *t);
 static void unix_stop_timer(struct qemu_alarm_timer *t);
 
-#ifdef __linux__
+#ifdef HAVE_POSIX_TIMER
 
 static int dynticks_start_timer(struct qemu_alarm_timer *t);
 static void dynticks_stop_timer(struct qemu_alarm_timer *t);
 static void dynticks_rearm_timer(struct qemu_alarm_timer *t);
 
+#endif
+
+#ifdef __linux__
+
 static int hpet_start_timer(struct qemu_alarm_timer *t);
 static void hpet_stop_timer(struct qemu_alarm_timer *t);
 
@@ -1001,9 +1005,11 @@
 
 static struct qemu_alarm_timer alarm_timers[] = {
 #ifndef _WIN32
-#ifdef __linux__
+#ifdef HAVE_POSIX_TIMER
     {"dynticks", ALARM_FLAG_DYNTICKS, dynticks_start_timer,
      dynticks_stop_timer, dynticks_rearm_timer, NULL},
+#endif
+#ifdef __linux__
     /* HPET - if available - is preferred */
     {"hpet", 0, hpet_start_timer, hpet_stop_timer, NULL, NULL},
     /* ...otherwise try RTC */
@@ -1361,7 +1367,7 @@
     return delta;
 }
 
-#if defined(__linux__) || defined(_WIN32)
+#if defined(HAVE_POSIX_TIMER) || defined(_WIN32)
 static uint64_t qemu_next_deadline_dyntick(void)
 {
     int64_t delta;
@@ -1506,6 +1512,10 @@
     close(rtc_fd);
 }
 
+#endif /* defined(__linux__) */
+
+#ifdef HAVE_POSIX_TIMER
+
 static int dynticks_start_timer(struct qemu_alarm_timer *t)
 {
     struct sigevent ev;
@@ -1577,7 +1587,7 @@
     }
 }
 
-#endif /* defined(__linux__) */
+#endif /* defined(HAVE_POSIX_TIMER) */
 
 static int unix_start_timer(struct qemu_alarm_timer *t)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081206220906.GA34210>