[Qemu-devel] testing qemu svn r5890 on FreeBSD - virtio, and a patch enabling -clock dynticks

Anthony Liguori anthony at codemonkey.ws
Sat Dec 6 19:02:38 PST 2008


Juergen Lock wrote:
> 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...
>   

I don't have much experience with perf benchmarking and TCG.  TCG may 
has interesting side effects.  For instance, it's more expensive to do 
things in the guest instead of the host so the emulation overhead of 
IDE/SCSI shouldn't matter much.

A straight dd test is not the best test BTW.  If you want to measure 
performance, you should use O_DIRECT in the guest (iflag=direct) and 
probably O_DIRECT in the host (cache=none).

Regards,

Anthony Liguori

>  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)
>  {
>
>
>   



More information about the freebsd-emulation mailing list