virtio-kbd: modified elem index and mutex lock
authorsungmin ha <sungmin82.ha@samsung.com>
Fri, 29 Mar 2013 02:36:08 +0000 (11:36 +0900)
committersungmin ha <sungmin82.ha@samsung.com>
Fri, 29 Mar 2013 02:36:08 +0000 (11:36 +0900)
When elem index was higher than 9, Data was written from index 0.
But kernel read queue from index 0 to index 9 always.
If index 9 is key press event and index 0 is key release event, their order is changed.
So key press event is repeated in X platform.
It is modified that elem index must start from 0.

Signed-off-by: Sungmin Ha <sungmin82.ha@samsung.com>
package/changelog
package/pkginfo.manifest
tizen/src/hw/maru_virtio_keyboard.c

index b136d1178b5a2db89088aa57f184493a8a673625..ac9900b4887d878f6ecd6067283b8ca345b0a02f 100644 (file)
@@ -1,3 +1,6 @@
+* 1.5.17
+- modified elem index and mutex lock in virtio-kbd
+== Sungmin Ha <sungmin82.ha@samsung.com> 2013-03-29
 * 1.5.16
 - modified Makefile to library load on mac from check-gl
 == Sungmin Ha <sungmin82.ha@samsung.com> 2013-03-26
index 29e479390602a5b8bfe124c25a471cac4fdfd554..7b9513612119f7d28e1ea7fee78b9a04ef12f672 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.5.16
+Version: 1.5.17
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index 00c4f3d6d84d5d308d0a08f185978ffe27419764..97f4d2a0d2f4a2ad6741321228848030ac1853f8 100644 (file)
@@ -61,22 +61,13 @@ void virtio_keyboard_notify(void *opaque)
     EmulKbdEvent *kbdevt;
     int index = 0;
     int written_cnt = 0;
-    int *rptr = NULL;
 
     if (!vkbd) {
         ERR("VirtIOKeyboard is NULL.\n");
         return;
     }
 
-    qemu_mutex_lock(&vkbd->event_mutex);
-    written_cnt = vkbd->kbdqueue.wptr;
     TRACE("[Enter] virtqueue notifier. %d\n", written_cnt);
-    qemu_mutex_unlock(&vkbd->event_mutex);
-    if (written_cnt < 0) {
-        TRACE("there is no input data to copy to guest.\n");
-        return;
-    }
-    rptr = &vkbd->kbdqueue.rptr;
 
     if (!virtio_queue_ready(vkbd->vq)) {
         INFO("virtqueue is not ready.\n");
@@ -84,30 +75,32 @@ void virtio_keyboard_notify(void *opaque)
     }
 
     if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
-        *rptr = 0;
+        vkbd->kbdqueue.rptr = 0;
     }
 
+    qemu_mutex_lock(&vkbd->event_mutex);
+    written_cnt = vkbd->kbdqueue.wptr;
+
     while ((written_cnt--)) {
-        index = *rptr;
-        kbdevt = &vkbd->kbdqueue.kbdevent[index];
+        kbdevt = &vkbd->kbdqueue.kbdevent[vkbd->kbdqueue.rptr];
 
         /* Copy keyboard data into guest side. */
-        TRACE("copy: keycode %d, type %d, index %d\n",
+        TRACE("copy: keycode %d, type %d, elem_index %d\n",
             kbdevt->code, kbdevt->type, index);
-        memcpy(elem.in_sg[index].iov_base, kbdevt, sizeof(EmulKbdEvent));
+        memcpy(elem.in_sg[index++].iov_base, kbdevt, sizeof(EmulKbdEvent));
         memset(kbdevt, 0x00, sizeof(EmulKbdEvent));
 
-        qemu_mutex_lock(&vkbd->event_mutex);
         if (vkbd->kbdqueue.wptr > 0) {
             vkbd->kbdqueue.wptr--;
+            TRACE("written_cnt: %d, wptr: %d, qemu_index: %d\n", written_cnt, vkbd->kbdqueue.wptr, vkbd->kbdqueue.rptr);
         }
-        qemu_mutex_unlock(&vkbd->event_mutex);
 
-        (*rptr)++;
-        if (*rptr == VIRTIO_KBD_QUEUE_SIZE) {
-            *rptr = 0;
+        vkbd->kbdqueue.rptr++;
+        if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
+            vkbd->kbdqueue.rptr = 0;
         }
     }
+    qemu_mutex_unlock(&vkbd->event_mutex);
 
     virtqueue_push(vkbd->vq, &elem, sizeof(EmulKbdEvent));
     virtio_notify(&vkbd->vdev, vkbd->vq);
@@ -199,11 +192,11 @@ static void virtio_keyboard_event(void *opaque, int keycode)
         vkbd->extension_key = 1;
     }
 
+    qemu_mutex_lock(&vkbd->event_mutex);
     memcpy(&vkbd->kbdqueue.kbdevent[(*index)++], &kbdevt, sizeof(kbdevt));
     TRACE("event: keycode %d, type %d, index %d.\n",
         kbdevt.code, kbdevt.type, ((*index) - 1));
 
-    qemu_mutex_lock(&vkbd->event_mutex);
     vkbd->kbdqueue.wptr++;
     qemu_mutex_unlock(&vkbd->event_mutex);