On (Fri) 29 Mar 2013 [09:03:10], Anthony Liguori wrote: > Amit Shah <amit.s...@redhat.com> writes: > > > On (Fri) 29 Mar 2013 [07:24:07], Anthony Liguori wrote: > >> Amit Shah <amit.s...@redhat.com> writes: > >> > >> > On (Tue) 05 Mar 2013 [23:21:18], Amit Shah wrote: > >> >> From: Anthony Liguori <aligu...@us.ibm.com> > >> >> > >> >> This is a special GSource that supports CharDriverState style > >> >> poll callbacks. > >> >> > >> >> For reviewability and bisectability, this code is #if 0'd out in this > >> >> patch to avoid unused warnings since all of the functions are static. > >> >> > >> >> Signed-off-by: Anthony Liguori <aligu...@us.ibm.com> > >> >> Signed-off-by: Amit Shah <amit.s...@redhat.com> > >> > > >> > > >> >> +static int io_channel_send_all(GIOChannel *fd, const void *_buf, int > >> >> len1) > >> >> +{ > >> >> + GIOStatus status; > >> >> + gsize bytes_written; > >> >> + int len; > >> >> + const uint8_t *buf = _buf; > >> >> + > >> >> + len = len1; > >> >> + while (len > 0) { > >> >> + status = g_io_channel_write_chars(fd, (const gchar *)buf, len, > >> >> + &bytes_written, NULL); > >> >> + if (status != G_IO_STATUS_NORMAL) { > >> >> + if (status != G_IO_STATUS_AGAIN) { > >> >> + return -1; > >> >> + } > >> > > >> > It's not quite right to return -1 here; previous iterations of the > >> > while loop could have successfully written data, and (len1 - len) > >> > could be +ve. > >> > >> Once -1 is returned, it's a terminal error. It doesn't matter that we > >> may have written some data. > > > > Why do you say that? > > Because you're quoting the wrong patch :-)
Indeed. > This bit is rewritten by a > later patch which is the source of your problem below. In the patch you > quote, we busy spin until all data is written. However, with: > > commit 23673ca740e0eda66901ca801a5a901df378b063 > Author: Anthony Liguori <aligu...@us.ibm.com> > Date: Tue Mar 5 23:21:23 2013 +0530 > > qemu-char: add watch support > > We started to return EAGAIN even if we have a partially successful > write. I'm running a patch through testing right now that rewrites this > function to have sane semantics (return bytes written on partial write). Yes, that's where the problem is: EINTR and EAGAIN returns. > I'll post as soon as testing completes. Thanks! Amit