Hi, > -----Original Message----- > From: Gonglei (Arei) > Sent: Thursday, April 17, 2014 9:16 PM > To: qemu-devel@nongnu.org > Cc: kra...@redhat.com; aligu...@amazon.com; Huangweidong (C); Gonglei > (Arei) > Subject: [PATCH RFC] ps2: set the keybord output buffer size as the same as > kernel > > From: Gonglei <arei.gong...@huawei.com> > > According to the PS/2 Mouse/Keyboard Protocol, the keyboard outupt buffer > size > is 16 bytes. And the PS2_QUEUE_SIZE 256 was introduced in Qemu from the > very > beginning. > > When I started a redhat5.6 32bit guest, meanwhile tapped the keyboard as > quickly as > possible, the screen would show me "i8042.c: No controller found". As a > result, > I couldn't use the keyboard in the VNC client. > > Previous discussion about the issue in maillist: > http://thread.gmane.org/gmane.comp.emulators.qemu/43294/focus=47180 > > This patch has been tested on redhat5.6 32-bit/suse11sp3 64-bit guests. > More easy meathod to reproduce: > 1.boot a guest with libvirt. > 2.connect to VNC client. > 3.as you see the BIOS, bootloader, Linux booting, run the follow simply shell > script: > for((i=0;i<10000000;i++)) do virsh send-key redhat5.6 KEY_A; done > > Actual results: > dmesg show "i8042.c: No controller found." And the keyboard is out of work. > > Signed-off-by: Gonglei <arei.gong...@huawei.com> > --- > hw/input/ps2.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/hw/input/ps2.c b/hw/input/ps2.c > index 3412079..a754fef 100644 > --- a/hw/input/ps2.c > +++ b/hw/input/ps2.c > @@ -71,7 +71,7 @@ > #define MOUSE_STATUS_ENABLED 0x20 > #define MOUSE_STATUS_SCALE21 0x10 > > -#define PS2_QUEUE_SIZE 256 > +#define PS2_QUEUE_SIZE 16 /* Keyboard output buffer size */ > > typedef struct { > uint8_t data[PS2_QUEUE_SIZE]; > @@ -137,7 +137,7 @@ void ps2_queue(void *opaque, int b) > PS2State *s = (PS2State *)opaque; > PS2Queue *q = &s->queue; > > - if (q->count >= PS2_QUEUE_SIZE) > + if (q->count >= PS2_QUEUE_SIZE - 1) > return; > q->data[q->wptr] = b; > if (++q->wptr == PS2_QUEUE_SIZE) > @@ -375,7 +375,7 @@ static void ps2_mouse_event(void *opaque, > } > > if (!(s->mouse_status & MOUSE_STATUS_REMOTE) && > - (s->common.queue.count < (PS2_QUEUE_SIZE - 16))) { > + (s->common.queue.count < PS2_QUEUE_SIZE)) { > for(;;) { > /* if not remote, send event. Multiple events are sent if > too big deltas */ > -- > 1.6.0.2 >
Ping... Any comments will be appreciated. Best regards, -Gonglei