qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] 答复: Re: [PATCH] chardev: fix parallel device can't be reco


From: peng.hao2
Subject: [Qemu-devel] 答复: Re: [PATCH] chardev: fix parallel device can't be reconnect.
Date: Mon, 10 Jul 2017 19:46:38 +0800 (CST)

原始邮件



发件人: <address@hidden>
收件人:彭浩10096742 <address@hidden>
抄送人:王业超10154425 <address@hidden>
日 期 :2017年07月10日 17:17
主 题 :Re: [Qemu-devel] [PATCH] chardev: fix parallel device can't be reconnect.






Hi



On Mon, Jul 10, 2017 at 10:36 AM Peng Hao <address@hidden> wrote:

Parallel device don't register be->chr_can_read function, but remote disconnect 
event is handled in chr_read.
 So connected parallel device can not detect remote disconnect event.
 

What is it that you call a parallel device? you are modifying the socket code 
here. Could you describe a test setup? even better would be to write a test in 
test-char.c.
 

Signed-off-by: Peng Hao <address@hidden>
 Reviewed-by: Wang Yechao <address@hidden>
 ---
  chardev/char-socket.c | 19 +++++++++++++++++++
  1 file changed, 19 insertions(+)
 
 diff --git a/chardev/char-socket.c b/chardev/char-socket.c
 index ccc499c..59509d4 100644
 --- a/chardev/char-socket.c
 +++ b/chardev/char-socket.c
 @@ -131,6 +131,14 @@ static int tcp_chr_write(Chardev *chr, const uint8_t 
*buf, int len)
      }
  }
 
 +static gboolean is_parallel_device(Chardev *chr)
 +{
 +    if (chr && chr->label && strstr(chr->label, "charparallel")) {
 +        return TRUE

What guarantees that a parallel device will have "charparallel" in its label?

/////I use libvirt command to create vm ,so charparallel is from libvirt.this 
is a problem.

 

+    }
 +    return FALSE
 +}
 +
  static int tcp_chr_read_poll(void *opaque)
  {
      Chardev *chr = CHARDEV(opaque)
 @@ -138,6 +146,8 @@ static int tcp_chr_read_poll(void *opaque)
      if (!s->connected) {
          return 0
      }
 +    if (is_parallel_device(chr)) {
 +        return 1

That means 1 byte can be read, but s->max_size isn't updated, this will confuse 
tcp_chr_read().
//////for parallel device s->max_size is always 0,because  s->max_size = 
qemu_chr_be_can_write(chr) but  qemu_chr_be_can_write

need be->chr_can_read and parallel device has no be->chr_can_read. 
tcp_chr_read_poll as  fd_can_read function ,reurn 1 just means can_read.


+    }
      s->max_size = qemu_chr_be_can_write(chr)
      return s->max_size
  }
 @@ -422,6 +432,15 @@ static gboolean tcp_chr_read(QIOChannel *chan, 
GIOCondition cond, void *opaque)
      uint8_t buf[CHR_READ_BUF_LEN]
      int len, size
 
 +    /* for parallel-device handle the socket close event here*/
 +    if (!s->max_size && is_parallel_device(chr)) {
 +        size = tcp_chr_recv(chr, (void *)buf, CHR_READ_BUF_LEN)
 +        if (size == 0 || size == -1) {
 +            tcp_chr_disconnect(chr)
 
I don't understand why that condition wouldn't be reached by the following 
tcp_chr_recv() handling. Furthermore, you may read more that s->max_size, which 
will likely break qemu_chr_be_write() in various cases.
///////for parallel device s->max_size is always 0.
 
+        }
 +        return TRUE
 +    }
 +
      if (!s->connected || s->max_size <= 0) {
          return TRUE
      }
 --
 1.8.3.1
 
qemu command : -chardev 
socket,id=charparallel0,host=0.0.0.0,port=5900,server,nowait -device 
isa-parallel,chardev=charparallel0,id=parallel0guset:front   <---->qemu:backend 
<----->remote tcp socket .      when remote tcp socket disconected,qemu can not 
detect the disconnet from remote.I think all the chardevs without 
CharBackend->chr_can_read has the same problem.
reproduce the problem:create vm with a parallel port ,and connect the parallel 
port ,then disconnect  at the remote.Try to reconnect the parallel port,you can 
find that you can't connect again.





Marc-André Lureau

reply via email to

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