qemu-stable
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-stable] [PATCH] configure: Don't fall back to gthread coroutin


From: Brad Smith
Subject: Re: [Qemu-stable] [PATCH] configure: Don't fall back to gthread coroutine backend
Date: Thu, 16 May 2013 14:12:56 -0400
User-agent: Mutt/1.5.21 (2010-09-15)

On Sun, Apr 14, 2013 at 02:24:06AM -0400, Brad Smith wrote:
> This is a back port of 7c2acc7062fe863cb71ff5849bb121deafe8df4b to the
> 1.4 stable branch without needing the new error_exit() function.
> 
> configure: Don't fall back to gthread coroutine backend
> 
> The gthread coroutine backend is broken and does not produce a working
> QEMU; it is only useful for some very limited debugging situations.
> Clean up the backend selection logic in configure so that it now runs
> "if on windows use windows; else prefer ucontext; else sigaltstack".
> 
> To do this we refactor the configure code to separate out "test
> whether we have a working ucontext", "pick a default if user didn't
> specify" and "validate that user didn't specify something invalid",
> rather than having all three of these run together. We also simplify
> the Makefile logic so it just links in the backend the configure
> script selects.
> 
> Signed-off-by: Peter Maydell <address@hidden>
> Message-id: address@hidden
> Signed-off-by: Anthony Liguori <address@hidden>

Signed-off-by: Brad Smith <address@hidden>

> diff --git a/Makefile.objs b/Makefile.objs
> index 21e9c91..3884790 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -16,16 +16,7 @@ block-obj-y += qapi-types.o qapi-visit.o
>  
>  block-obj-y += qemu-coroutine.o qemu-coroutine-lock.o qemu-coroutine-io.o
>  block-obj-y += qemu-coroutine-sleep.o
> -ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
> -block-obj-$(CONFIG_POSIX) += coroutine-ucontext.o
> -else
> -ifeq ($(CONFIG_SIGALTSTACK_COROUTINE),y)
> -block-obj-$(CONFIG_POSIX) += coroutine-sigaltstack.o
> -else
> -block-obj-$(CONFIG_POSIX) += coroutine-gthread.o
> -endif
> -endif
> -block-obj-$(CONFIG_WIN32) += coroutine-win32.o
> +block-obj-y += coroutine-$(CONFIG_COROUTINE_BACKEND).o
>  
>  ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
>  # Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
> diff --git a/configure b/configure
> index e7468a9..8271757 100755
> --- a/configure
> +++ b/configure
> @@ -3035,34 +3035,67 @@ fi
>  ##########################################
>  # check and set a backend for coroutine
>  
> -# default is ucontext, but always fallback to gthread
> -# windows autodetected by make
> -if test "$coroutine" = "" -o "$coroutine" = "ucontext"; then
> -  if test "$darwin" != "yes"; then
> -    cat > $TMPC << EOF
> +# We prefer ucontext, but it's not always possible. The fallback
> +# is sigcontext. gthread is not selectable except explicitly, because
> +# it is not functional enough to run QEMU proper. (It is occasionally
> +# useful for debugging purposes.)  On Windows the only valid backend
> +# is the Windows-specific one.
> +
> +ucontext_works=no
> +if test "$darwin" != "yes"; then
> +  cat > $TMPC << EOF
>  #include <ucontext.h>
>  #ifdef __stub_makecontext
>  #error Ignoring glibc stub makecontext which will always fail
>  #endif
>  int main(void) { makecontext(0, 0, 0); return 0; }
>  EOF
> -    if compile_prog "" "" ; then
> -        coroutine_backend=ucontext
> -    else
> -     coroutine_backend=gthread
> -    fi
> +  if compile_prog "" "" ; then
> +    ucontext_works=yes
> +  fi
> +fi
> +
> +if test "$coroutine" = ""; then
> +  if test "$mingw32" = "yes"; then
> +    coroutine=win32
> +  elif test "$ucontext_works" = "yes"; then
> +    coroutine=ucontext
> +  else
> +    coroutine=sigaltstack
>    fi
> -elif test "$coroutine" = "gthread" ; then
> -  coroutine_backend=gthread
> -elif test "$coroutine" = "windows" ; then
> -  coroutine_backend=windows
> -elif test "$coroutine" = "sigaltstack" ; then
> -  coroutine_backend=sigaltstack
>  else
> -  echo
> -  echo "Error: unknown coroutine backend $coroutine"
> -  echo
> -  exit 1
> +  case $coroutine in
> +  windows)
> +    if test "$mingw32" != "yes"; then
> +      echo
> +      echo "Error: 'windows' coroutine backend only valid for Windows"
> +      echo
> +      exit 1
> +    fi
> +    # Unfortunately the user visible backend name doesn't match the
> +    # coroutine-*.c filename for this case, so we have to adjust it here.
> +    coroutine=win32
> +    ;;
> +  ucontext)
> +    if test "$ucontext_works" != "yes"; then
> +      feature_not_found "ucontext"
> +    fi
> +    ;;
> +  gthread|sigaltstack)
> +    if test "$mingw32" = "yes"; then
> +      echo
> +      echo "Error: only the 'windows' coroutine backend is valid for Windows"
> +      echo
> +      exit 1
> +    fi
> +    ;;
> +  *)
> +    echo
> +    echo "Error: unknown coroutine backend $coroutine"
> +    echo
> +    exit 1
> +    ;;
> +  esac
>  fi
>  
>  ##########################################
> @@ -3345,7 +3378,7 @@ echo "OpenGL support    $opengl"
>  echo "libiscsi support  $libiscsi"
>  echo "build guest agent $guest_agent"
>  echo "seccomp support   $seccomp"
> -echo "coroutine backend $coroutine_backend"
> +echo "coroutine backend $coroutine"
>  echo "GlusterFS support $glusterfs"
>  echo "virtio-blk-data-plane $virtio_blk_data_plane"
>  echo "gcov              $gcov_tool"
> @@ -3668,11 +3701,7 @@ if test "$rbd" = "yes" ; then
>    echo "CONFIG_RBD=y" >> $config_host_mak
>  fi
>  
> -if test "$coroutine_backend" = "ucontext" ; then
> -  echo "CONFIG_UCONTEXT_COROUTINE=y" >> $config_host_mak
> -elif test "$coroutine_backend" = "sigaltstack" ; then
> -  echo "CONFIG_SIGALTSTACK_COROUTINE=y" >> $config_host_mak
> -fi
> +echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
>  
>  if test "$open_by_handle_at" = "yes" ; then
>    echo "CONFIG_OPEN_BY_HANDLE=y" >> $config_host_mak
> diff --git a/tests/Makefile b/tests/Makefile
> index a2d62b8..894446d 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -24,19 +24,7 @@ gcov-files-test-string-input-visitor-y = 
> qapi/string-input-visitor.c
>  check-unit-y += tests/test-string-output-visitor$(EXESUF)
>  gcov-files-test-string-output-visitor-y = qapi/string-output-visitor.c
>  check-unit-y += tests/test-coroutine$(EXESUF)
> -ifeq ($(CONFIG_WIN32),y)
> -gcov-files-test-coroutine-y = coroutine-win32.c
> -else
> -ifeq ($(CONFIG_UCONTEXT_COROUTINE),y)
> -gcov-files-test-coroutine-y = coroutine-ucontext.c
> -else
> -ifeq ($(CONFIG_SIGALTSTACK_COROUTINE),y)
> -gcov-files-test-coroutine-y = coroutine-sigaltstack.c
> -else
> -gcov-files-test-coroutine-y = coroutine-gthread.c
> -endif
> -endif
> -endif
> +gcov-files-test-coroutine-y = coroutine-$(CONFIG_COROUTINE_BACKEND).c
>  check-unit-y += tests/test-visitor-serialization$(EXESUF)
>  check-unit-y += tests/test-iov$(EXESUF)
>  gcov-files-test-iov-y = util/iov.c

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]