From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=41811 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OuTXA-0004LA-AF for qemu-devel@nongnu.org; Sat, 11 Sep 2010 13:06:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OuTX6-0001Oe-52 for qemu-devel@nongnu.org; Sat, 11 Sep 2010 13:06:36 -0400 Received: from fmmailgate03.web.de ([217.72.192.234]:57495) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OuTX5-0001OX-Pl for qemu-devel@nongnu.org; Sat, 11 Sep 2010 13:06:32 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Sat, 11 Sep 2010 19:05:55 +0200 Message-Id: <1284224755-11299-1-git-send-email-andreas.faerber@web.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: andreas.faerber@web.de Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH] Introduce qemu_madvise() List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl , =?UTF-8?q?Andreas=20F=C3=A4rber?= From: Andreas F=C3=A4rber vl.c has a Sun-specific hack to supply a prototype for madvise(), but the call site has apparently moved to arch_init.c. The underlying issue is that madvise() is not a POSIX function, therefore Solaris' _POSIX_C_SOURCE suppresses the prototype. Haiku doesn't implement madvise() at all. OpenBSD however doesn't implement posix_madvise(). Check for posix_madvise() in configure and supply qemu_madvise() as wrapp= er. Use qemu_madvise() in arch_init.c's ram_load(). http://www.opengroup.org/onlinepubs/9699919799/functions/posix_madvise.ht= ml Remaining madvise() users: exec.c: limited to __linux__ and/or MADV_MERGEABLE (no POSIX equivalent) kvm-all.c: limited to MADV_DONTFORK (no POSIX equivalent), otherwise runtime error if !kvm_has_sync_mmu() hw/virtio-balloon.c: limited to __linux__ v1 -> v2: * Don't rely on posix_madvise() availability, add qemu_madvise(). Suggested by Blue Swirl. Signed-off-by: Andreas F=C3=A4rber Cc: Blue Swirl --- arch_init.c | 2 +- configure | 11 +++++++++++ osdep.c | 26 ++++++++++++++++++++++++++ osdep.h | 4 ++++ vl.c | 3 --- 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/arch_init.c b/arch_init.c index e468c0c..a910033 100644 --- a/arch_init.c +++ b/arch_init.c @@ -396,7 +396,7 @@ int ram_load(QEMUFile *f, void *opaque, int version_i= d) #ifndef _WIN32 if (ch =3D=3D 0 && (!kvm_enabled() || kvm_has_sync_mmu())) { - madvise(host, TARGET_PAGE_SIZE, MADV_DONTNEED); + qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED)= ; } #endif } else if (flags & RAM_SAVE_FLAG_PAGE) { diff --git a/configure b/configure index 4061cb7..5e6f3e1 100755 --- a/configure +++ b/configure @@ -2069,6 +2069,17 @@ if compile_prog "" "" ; then fi =20 ########################################## +# check if we have posix_madvise + +cat > $TMPC << EOF +#include +int main(void) { posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); return 0; = } +EOF +if compile_prog "" "" ; then + QEMU_CFLAGS=3D"-DCONFIG_POSIX_MADVISE ${QEMU_CFLAGS}" +fi + +########################################## # check if trace backend exists =20 sh "$source_path/tracetool" "--$trace_backend" --check-backend > /dev/nu= ll 2> /dev/null diff --git a/osdep.c b/osdep.c index 30426ff..8c09597 100644 --- a/osdep.c +++ b/osdep.c @@ -28,6 +28,7 @@ #include #include #include +#include =20 /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" @@ -139,6 +140,31 @@ void qemu_vfree(void *ptr) =20 #endif =20 +int qemu_madvise(void *addr, size_t len, int advice) +{ +#ifdef CONFIG_POSIX_MADVISE + switch (advice) { + case QEMU_MADV_DONTNEED: + advice =3D POSIX_MADV_DONTNEED; + break; + default: + fprintf(stderr, "Advice %d unhandled.\n", advice); + abort(); + } + return posix_madvise(addr, len, advice); +#else + switch (advice) { + case QEMU_MADV_DONTNEED: + advice =3D MADV_DONTNEED; + break; + default: + fprintf(stderr, "Advice %d unhandled.\n", advice); + abort(); + } + return madvise(addr, len, advice); +#endif +} + int qemu_create_pidfile(const char *filename) { char buffer[128]; diff --git a/osdep.h b/osdep.h index 1cdc7e2..9f0da46 100644 --- a/osdep.h +++ b/osdep.h @@ -90,6 +90,10 @@ void *qemu_memalign(size_t alignment, size_t size); void *qemu_vmalloc(size_t size); void qemu_vfree(void *ptr); =20 +#define QEMU_MADV_DONTNEED 1 + +int qemu_madvise(void *addr, size_t len, int advice); + int qemu_create_pidfile(const char *filename); =20 #ifdef _WIN32 diff --git a/vl.c b/vl.c index 3f45aa9..d352d18 100644 --- a/vl.c +++ b/vl.c @@ -80,9 +80,6 @@ #include #include #include -/* See MySQL bug #7156 (http://bugs.mysql.com/bug.php?id=3D7156) for - discussion about Solaris header problems */ -extern int madvise(caddr_t, size_t, int); #endif #endif #endif --=20 1.7.2.2