Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.4
kvm.853
S390-0004-Always-notify-consumers-of-char-devic...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File S390-0004-Always-notify-consumers-of-char-devices-if-they-re-o.patch of Package kvm.853
From 9cea9cb45e96262cc48a10d31e8ecea40ae85c42 Mon Sep 17 00:00:00 2001 From: Alexander Graf <agraf@suse.de> Date: Thu, 1 Apr 2010 18:12:28 +0200 Subject: [PATCH 4/6] Always notify consumers of char devices if they're open When using virtio-console on s390, the input doesn't work. The root of the problem is rather simple. What happens is the following: 1) create character device for stdio 2) char device is done creating, sends OPENED event 3) virtio-console adds handlers 4) no event comes because the char device is open already 5) virtio-console doesn't accept input because it didn't receive an OPENED event To make that sure virtio-console gets notified that the character device is open even when it's been open from the beginning, this patch introduces a variable that keeps track of the opened state. If the device is open when the event handlers get installed, we just notify the handler. This fixes input with virtio-console on s390. Signed-off-by: Alexander Graf <agraf@suse.de> --- qemu-char.c | 20 ++++++++++++++++++++ qemu-char.h | 1 + 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/qemu-char.c b/qemu-char.c index 6ad6609..a9d9442 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -109,6 +109,16 @@ static QTAILQ_HEAD(CharDriverStateHead, CharDriverState) chardevs = static void qemu_chr_event(CharDriverState *s, int event) { + /* Keep track if the char device is open */ + switch (event) { + case CHR_EVENT_OPENED: + s->opened = 1; + break; + case CHR_EVENT_CLOSED: + s->opened = 0; + break; + } + if (!s->chr_event) return; s->chr_event(s->handler_opaque, event); @@ -193,6 +203,12 @@ void qemu_chr_add_handlers(CharDriverState *s, s->handler_opaque = opaque; if (s->chr_update_read_handler) s->chr_update_read_handler(s); + + /* We're connecting to an already opened device, so let's make sure we + also get the open event */ + if (s->opened) { + qemu_chr_generic_open(s); + } } static int null_chr_write(CharDriverState *chr, const uint8_t *buf, int len) @@ -475,6 +491,10 @@ static CharDriverState *qemu_chr_open_mux(CharDriverState *drv) chr->chr_write = mux_chr_write; chr->chr_update_read_handler = mux_chr_update_read_handler; chr->chr_accept_input = mux_chr_accept_input; + + /* Muxes are always open on creation */ + qemu_chr_generic_open(chr); + return chr; } diff --git a/qemu-char.h b/qemu-char.h index 3a9427b..e3a0783 100644 --- a/qemu-char.h +++ b/qemu-char.h @@ -67,6 +67,7 @@ struct CharDriverState { QEMUBH *bh; char *label; char *filename; + int opened; QTAILQ_ENTRY(CharDriverState) next; }; -- 1.6.0.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor