[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] fixing qemu busy wait
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] fixing qemu busy wait |
Date: |
Fri, 31 May 2013 16:17:20 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6 |
Il 18/04/2013 20:47, Orr Dvory ha scritto:
> is this better?
Yes -- but I don't remember if this was fixed elsewhere. Can you
reproduce the problem in 1.5.0? If so, please send the patch according
to the guidelines at http://wiki.qemu.org/Contribute/SubmitAPatch.
Paolo
> diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
> --- qemu-1.4.1/gdbstub.c 2013-04-15 23:25:18.000000000 +0300
> +++ qemu-1.4.1-fix/gdbstub.c 2013-04-18 21:35:00.000000000 +0300
> @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
> {
> #ifdef CONFIG_USER_ONLY
> int ret;
> -
> + int fd_flags = fcntl (s->fd, F_GETFL, 0);
> + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
> while (len > 0) {
> ret = send(s->fd, buf, len, 0);
> if (ret < 0) {
>
> if (errno != EINTR && errno != EAGAIN)
> + {
> + fcntl (s->fd, F_SETFL, fd_flags);
> return;
> + }
> } else {
> buf += ret;
> len -= ret;
> }
> }
> + fcntl (s->fd, F_SETFL, fd_flags);
> #else
> qemu_chr_fe_write(s->chr, buf, len);
> #endif
> @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
> GDBState *s;
> char buf[256];
> int n;
> + int fd_flags;
>
> s = gdbserver_state;
> if (gdbserver_fd < 0 || s->fd < 0)
> @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
> connection. */
> if (s->fd < 0)
> return sig;
> -
> + fd_flags = fcntl (s->fd, F_GETFL, 0);
> + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
> sig = 0;
> s->state = RS_IDLE;
> s->running_state = 0;
> @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
> {
> /* XXX: Connection closed. Should probably wait for another
> connection before continuing. */
> + fcntl (s->fd, F_SETFL, fd_flags);
> return sig;
> }
> }
> + fcntl (s->fd, F_SETFL, fd_flags);
> sig = s->signal;
> s->signal = 0;
> return sig;
>
>
> On Thu, Apr 18, 2013 at 9:46 PM, Orr Dvory <address@hidden
> <mailto:address@hidden>> wrote:
>
> is this better?
>
> diff -uprN qemu-1.4.1/gdbstub.c qemu-1.4.1-fix/gdbstub.c
> --- qemu-1.4.1/gdbstub.c 2013-04-15 23:25:18.000000000 +0300
> +++ qemu-1.4.1-fix/gdbstub.c 2013-04-18 21:35:00.000000000 +0300
> @@ -379,17 +379,22 @@ static void put_buffer(GDBState *s, cons
> {
> #ifdef CONFIG_USER_ONLY
> int ret;
> -
> + int fd_flags = fcntl (s->fd, F_GETFL, 0);
> + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
> while (len > 0) {
> ret = send(s->fd, buf, len, 0);
> if (ret < 0) {
>
> if (errno != EINTR && errno != EAGAIN)
> + {
> + fcntl (s->fd, F_SETFL, fd_flags);
> return;
> + }
> } else {
> buf += ret;
> len -= ret;
> }
> }
> + fcntl (s->fd, F_SETFL, fd_flags);
> #else
> qemu_chr_fe_write(s->chr, buf, len);
> #endif
> @@ -2775,6 +2780,7 @@ gdb_handlesig (CPUArchState *env, int si
> GDBState *s;
> char buf[256];
> int n;
> + int fd_flags;
>
> s = gdbserver_state;
> if (gdbserver_fd < 0 || s->fd < 0)
> @@ -2793,7 +2799,8 @@ gdb_handlesig (CPUArchState *env, int si
> connection. */
> if (s->fd < 0)
> return sig;
> -
> + fd_flags = fcntl (s->fd, F_GETFL, 0);
> + fcntl (s->fd, F_SETFL, fd_flags & ~O_NONBLOCK);
> sig = 0;
> s->state = RS_IDLE;
> s->running_state = 0;
> @@ -2810,9 +2817,11 @@ gdb_handlesig (CPUArchState *env, int si
> {
> /* XXX: Connection closed. Should probably wait for another
> connection before continuing. */
> + fcntl (s->fd, F_SETFL, fd_flags);
> return sig;
> }
> }
> + fcntl (s->fd, F_SETFL, fd_flags);
> sig = s->signal;
> s->signal = 0;
> return sig;
>
>
> On Wed, Feb 20, 2013 at 10:38 PM, Paolo Bonzini <address@hidden
> <mailto:address@hidden>> wrote:
>
> Il 20/02/2013 20:39, Orr Dvory ha scritto:
> > if (errno != EINTR && errno != EAGAIN)
> > + /* there's no need to restore the
> > + O_NONBLOCK option. */
> > return;
> > +
>
> But it's cleaner to do it anyway. :)
>
> Paolo
>
>
>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] fixing qemu busy wait,
Paolo Bonzini <=