mirror of https://github.com/xemu-project/xemu.git
input: limit kbd queue depth
input: don't queue delay if paused input: Add trace event for empty keyboard queue -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJZCsC1AAoJEEy22O7T6HE4IUMQAMmnkzlnFbhfKuTRhcVBwe7g vFlQku05gYmk/FcEC4gMkrqzgS9CvG8ogiHu0nwaTAPwaxU4f5g+asmTc4LVwB+U LGDtJ++kTRxcKr6JDl68IENr1WkF1xDlod/NgiI0H5MJjoB0WJIoP0W9hBiJfK8z m3Fc86AxneeyIexJyTf3hoeoCmrXx4WGVVqA1Pg0OhvYig/v5Yg7zGSZYBh0u8zF 4rG7VZz2euyPawHa8RvOhO9ZB0GSh0KujSFGPr8QGGniL3qmDGEd5ScvMAlKoNg0 hkH+Oymghcyy/OiYBGmb4pj/XrKmlPKN2IIvttGh00cFVmHcp8WqQXshg/aSz75A +ApI78enBI64uNypxvD38+DgT7EGA+1SbmOMQrlz8S1m/PlbLRS5XpcHMwqv0MrS Lj/6nKui5VLCFTlzCpERP2rVX1ysdH7RF+jte4MWWcindvx3QJ7yenJyqpTpvw6g 248H899diejhIJUcPBvbf3rNGsi9H7ORCfc9g0HKetr1bg8UHyu5zVWLlN/dTCUQ 6thHvTK1kqBKCshrIRe41Y2ikZQHak/r1983pOxddTy0SAc1mDteB9yq7uzgBKW5 UQ8TxSGcslygPfCvXd3T+kdO0puahqZdXMcKRRvDmKH0dzlmfMfhVcmzfDSJfjGy kR2fKHl+lf+qW7fJynA5 =Rzbi -----END PGP SIGNATURE----- Merge remote-tracking branch 'kraxel/tags/pull-input-20170504-1' into staging input: limit kbd queue depth input: don't queue delay if paused input: Add trace event for empty keyboard queue # gpg: Signature made Thu 04 May 2017 06:48:37 AM BST # gpg: using RSA key 0x4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * kraxel/tags/pull-input-20170504-1: input: Add trace event for empty keyboard queue input: don't queue delay if paused input: limit kbd queue depth Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
dd76c10f9f
|
@ -256,6 +256,10 @@ static void hid_keyboard_process_keycode(HIDState *hs)
|
|||
slot = hs->head & QUEUE_MASK; QUEUE_INCR(hs->head); hs->n--;
|
||||
keycode = hs->kbd.keycodes[slot];
|
||||
|
||||
if (!hs->n) {
|
||||
trace_hid_kbd_queue_empty();
|
||||
}
|
||||
|
||||
key = keycode & 0x7f;
|
||||
index = key | ((hs->kbd.modifiers & (1 << 8)) >> 1);
|
||||
hid_code = hid_usage_keys[index];
|
||||
|
|
|
@ -24,6 +24,7 @@ milkymist_softusb_pulse_irq(void) "Pulse IRQ"
|
|||
|
||||
# hw/input/hid.c
|
||||
hid_kbd_queue_full(void) "queue full"
|
||||
hid_kbd_queue_empty(void) "queue empty"
|
||||
|
||||
# hw/input/virtio
|
||||
virtio_input_queue_full(void) "queue full"
|
||||
|
|
18
ui/input.c
18
ui/input.c
|
@ -41,6 +41,8 @@ static QTAILQ_HEAD(QemuInputEventQueueHead, QemuInputEventQueue) kbd_queue =
|
|||
QTAILQ_HEAD_INITIALIZER(kbd_queue);
|
||||
static QEMUTimer *kbd_timer;
|
||||
static uint32_t kbd_default_delay_ms = 10;
|
||||
static uint32_t queue_count;
|
||||
static uint32_t queue_limit = 1024;
|
||||
|
||||
QemuInputHandlerState *qemu_input_handler_register(DeviceState *dev,
|
||||
QemuInputHandler *handler)
|
||||
|
@ -268,6 +270,7 @@ static void qemu_input_queue_process(void *opaque)
|
|||
break;
|
||||
}
|
||||
QTAILQ_REMOVE(queue, item, node);
|
||||
queue_count--;
|
||||
g_free(item);
|
||||
}
|
||||
}
|
||||
|
@ -282,6 +285,7 @@ static void qemu_input_queue_delay(struct QemuInputEventQueueHead *queue,
|
|||
item->delay_ms = delay_ms;
|
||||
item->timer = timer;
|
||||
QTAILQ_INSERT_TAIL(queue, item, node);
|
||||
queue_count++;
|
||||
|
||||
if (start_timer) {
|
||||
timer_mod(item->timer, qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL)
|
||||
|
@ -298,6 +302,7 @@ static void qemu_input_queue_event(struct QemuInputEventQueueHead *queue,
|
|||
item->src = src;
|
||||
item->evt = evt;
|
||||
QTAILQ_INSERT_TAIL(queue, item, node);
|
||||
queue_count++;
|
||||
}
|
||||
|
||||
static void qemu_input_queue_sync(struct QemuInputEventQueueHead *queue)
|
||||
|
@ -306,6 +311,7 @@ static void qemu_input_queue_sync(struct QemuInputEventQueueHead *queue)
|
|||
|
||||
item->type = QEMU_INPUT_QUEUE_SYNC;
|
||||
QTAILQ_INSERT_TAIL(queue, item, node);
|
||||
queue_count++;
|
||||
}
|
||||
|
||||
void qemu_input_event_send_impl(QemuConsole *src, InputEvent *evt)
|
||||
|
@ -381,7 +387,7 @@ void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down)
|
|||
qemu_input_event_send(src, evt);
|
||||
qemu_input_event_sync();
|
||||
qapi_free_InputEvent(evt);
|
||||
} else {
|
||||
} else if (queue_count < queue_limit) {
|
||||
qemu_input_queue_event(&kbd_queue, src, evt);
|
||||
qemu_input_queue_sync(&kbd_queue);
|
||||
}
|
||||
|
@ -405,12 +411,18 @@ void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool down)
|
|||
|
||||
void qemu_input_event_send_key_delay(uint32_t delay_ms)
|
||||
{
|
||||
if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!kbd_timer) {
|
||||
kbd_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, qemu_input_queue_process,
|
||||
&kbd_queue);
|
||||
}
|
||||
qemu_input_queue_delay(&kbd_queue, kbd_timer,
|
||||
delay_ms ? delay_ms : kbd_default_delay_ms);
|
||||
if (queue_count < queue_limit) {
|
||||
qemu_input_queue_delay(&kbd_queue, kbd_timer,
|
||||
delay_ms ? delay_ms : kbd_default_delay_ms);
|
||||
}
|
||||
}
|
||||
|
||||
InputEvent *qemu_input_event_new_btn(InputButton btn, bool down)
|
||||
|
|
Loading…
Reference in New Issue