At 09/25/2012 05:01 PM, Markus Armbruster Wrote: > Wen Congyang <we...@cn.fujitsu.com> writes: > >> At 09/24/2012 09:34 PM, Luiz Capitulino Wrote: >>> On Mon, 24 Sep 2012 14:27:17 +0800 >>> Wen Congyang <we...@cn.fujitsu.com> wrote: >>> >>>> At 09/22/2012 01:07 AM, Luiz Capitulino Wrote: >>>>> fd_write_vmcore() will indefinitely spin for a non-blocking >>>>> file-descriptor that would block. However, if the fd is non-blocking, >>>>> how does it make sense to spin? >>>>> >>>>> Change this behavior to return an error instead. >>>>> >>>>> Note that this can only happen with an fd provided by a management >>>>> application. The fd opened internally by dump-guest-memory is blocking. >>>>> >>>>> Signed-off-by: Luiz Capitulino <lcapitul...@redhat.com> >>>>> --- >>>>> dump.c | 13 +++---------- >>>>> 1 file changed, 3 insertions(+), 10 deletions(-) >>>>> >>>>> diff --git a/dump.c b/dump.c >>>>> index 2bf8d8d..5eea015 100644 >>>>> --- a/dump.c >>>>> +++ b/dump.c >>>>> @@ -100,18 +100,11 @@ static void dump_error(DumpState *s, const char >>>>> *reason) >>>>> static int fd_write_vmcore(void *buf, size_t size, void *opaque) >>>>> { >>>>> DumpState *s = opaque; >>>>> - int fd = s->fd; >>>>> size_t writen_size; >>>>> >>>>> - /* The fd may be passed from user, and it can be non-blocked */ >>>>> - while (size) { >>>>> - writen_size = qemu_write_full(fd, buf, size); >>>>> - if (writen_size != size && errno != EAGAIN) { >>>> >>>> Hmm, if the fd is a blocking fd, errno can't be EAGAIN. So the >>>> function doesn't spin. What problems do you meet? >>> >>> The problem is with non-blocking fds, where spinning isn't correct, for >>> two reasons: >> >> But, If the fd is non-blocking, errno can't be EAGAIN. So it doesn't spin. > > I'm afraid you're confused. > > http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html > > [EAGAIN] The O_NONBLOCK flag is set for the file descriptor and the > thread would be delayed in the write() operation. >
Ahh, you are right. Thanks Wen Congyang