| Submitter | Amit Shah |
|---|---|
| Date | March 21, 2011, 1:09 p.m. |
| Message ID | <fee063c07f20b442ef4bedef834ab0a3bf55b562.1300712809.git.amit.shah@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/87777/ |
| State | New |
| Headers | show |
Comments
Amit Shah <amit.shah@redhat.com> wrote: > After a port unplug operation, the port->info->have_data() pointer was > set to NULL. The problem is, the ->info struct is shared by all ports, > effectively disabling writes to other ports. > > Reported-by: juzhang <juzhang@redhat.com> > Signed-off-by: Amit Shah <amit.shah@redhat.com> > --- > hw/virtio-console.c | 1 - > 1 files changed, 0 insertions(+), 1 deletions(-) > > diff --git a/hw/virtio-console.c b/hw/virtio-console.c > index 4440784..be59558 100644 > --- a/hw/virtio-console.c > +++ b/hw/virtio-console.c > @@ -82,7 +82,6 @@ static int virtconsole_exitfn(VirtIOSerialPort *port) > VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); > > if (vcon->chr) { > - port->info->have_data = NULL; > qemu_chr_close(vcon->chr); > } Discussed with Amit over irc, I think that we are missing setup of have_data for non console devices, but that is a different bug that the one being fixed here. Later, Juan.
On (Wed) 23 Mar 2011 [14:33:25], Juan Quintela wrote: > Amit Shah <amit.shah@redhat.com> wrote: > > After a port unplug operation, the port->info->have_data() pointer was > > set to NULL. The problem is, the ->info struct is shared by all ports, > > effectively disabling writes to other ports. > > > > Reported-by: juzhang <juzhang@redhat.com> > > Signed-off-by: Amit Shah <amit.shah@redhat.com> > > --- > > hw/virtio-console.c | 1 - > > 1 files changed, 0 insertions(+), 1 deletions(-) > > > > diff --git a/hw/virtio-console.c b/hw/virtio-console.c > > index 4440784..be59558 100644 > > --- a/hw/virtio-console.c > > +++ b/hw/virtio-console.c > > @@ -82,7 +82,6 @@ static int virtconsole_exitfn(VirtIOSerialPort *port) > > VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); > > > > if (vcon->chr) { > > - port->info->have_data = NULL; > > qemu_chr_close(vcon->chr); > > } > > Discussed with Amit over irc, I think that we are missing setup of > have_data for non console devices, but that is a different bug that the > one being fixed here. Actually other virtio_serial devices will provide their own have_data, like spice did earlier (now it's a chardev, so it uses this code path). I think the bug is that we should set have_data regardless of a chardev backend and call qemu_chr_write() in have_data only if a chardev exists. Amit
Patch
diff --git a/hw/virtio-console.c b/hw/virtio-console.c index 4440784..be59558 100644 --- a/hw/virtio-console.c +++ b/hw/virtio-console.c @@ -82,7 +82,6 @@ static int virtconsole_exitfn(VirtIOSerialPort *port) VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port); if (vcon->chr) { - port->info->have_data = NULL; qemu_chr_close(vcon->chr); }
After a port unplug operation, the port->info->have_data() pointer was set to NULL. The problem is, the ->info struct is shared by all ports, effectively disabling writes to other ports. Reported-by: juzhang <juzhang@redhat.com> Signed-off-by: Amit Shah <amit.shah@redhat.com> --- hw/virtio-console.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)