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>