Hi Daniel & Paolo,

Commit 9894dc0c "char: convert from GIOChannel to QIOChannel", about

the below code segment:

-static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
+static gboolean tcp_chr_read(QIOChannel *chan, GIOCondition cond, void *opaque)
{
     CharDriverState *chr = opaque;
     TCPCharDriver *s = chr->opaque;
@@ -2938,9 +2801,7 @@ static gboolean tcp_chr_read(GIOChannel *chan, 
GIOCondition cond, void *opaque)
     if (len > s->max_size)
         len = s->max_size;
     size = tcp_chr_recv(chr, (void *)buf, len);
-    if (size == 0 ||
-        (size < 0 &&
-         socket_error() != EAGAIN && socket_error() != EWOULDBLOCK)) {
+    if (size == 0 || size == -1) {
         /* connection closed */
         tcp_chr_disconnect(chr);
     } else if (size > 0) {

The old version will not call tcp_chr_disconnect when error is not EAGAIN.
The new version will call tcp_chr_disconnect when size==-1. From the 
tcp_chr_recv function we see EAGIN will return -1, so EAGIN will call 
tcp_chr_disconnect.

We meet an issue when Guest VM use DPDK(1.6.0) l2fwd, it may exit since link 
status is not up. The link is down because tcp_chr_disconnect will set it.

Can you explain it why EAGIN here changes the behavior ?

Thanks,
Haifeng Gao

Reply via email to