From e3d17c1148fe8f3342dd4cf891e2f8c3f0e64cfe Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
Date: Wed, 15 Jun 2011 11:05:10 -0300
Subject: [RHEL6 qemu-kvm PATCH 01/10] Revert "hw/qxl-render: drop cursor locks, replace with pipe"

RH-Author: Gerd Hoffmann <kraxel@redhat.com>
Message-id: <1308135919-4065-2-git-send-email-kraxel@redhat.com>
Patchwork-id: 27145
O-Subject: [RHEL-6.2 kvm PATCH 01/10] Revert "hw/qxl-render: drop cursor locks, replace with pipe"
Bugzilla: 674583 705070
RH-Acked-by: Alon Levy <alevy@redhat.com>
RH-Acked-by: Hans de Goede <hdegoede@redhat.com>
RH-Acked-by: Arnon Gilboa <agilboa@redhat.com>

This reverts commit 7c479f57c89d8bf6713dcf37a5cb537d75df197d.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/qxl-render.c    |   25 +++++---------
 hw/qxl.c           |   90 ----------------------------------------------------
 hw/qxl.h           |    4 --
 ui/spice-display.h |   13 +-------
 4 files changed, 10 insertions(+), 122 deletions(-)

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/qxl-render.c    |   25 +++++---------
 hw/qxl.c           |   90 ----------------------------------------------------
 hw/qxl.h           |    4 --
 ui/spice-display.h |   13 +-------
 4 files changed, 10 insertions(+), 122 deletions(-)

diff --git a/hw/qxl-render.c b/hw/qxl-render.c
index 6759edb..58965e0 100644
--- a/hw/qxl-render.c
+++ b/hw/qxl-render.c
@@ -178,6 +178,7 @@ fail:
     return NULL;
 }
 
+
 /* called from spice server thread context only */
 void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
 {
@@ -208,26 +209,18 @@ void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext)
         if (c == NULL) {
             c = cursor_builtin_left_ptr();
         }
-        qxl_server_request_cursor_set(qxl, c, x, y);
+        qemu_mutex_lock_iothread();
+        qxl->ssd.ds->cursor_define(c);
+        qxl->ssd.ds->mouse_set(x, y, 1);
+        qemu_mutex_unlock_iothread();
+        cursor_put(c);
         break;
     case QXL_CURSOR_MOVE:
         x = cmd->u.position.x;
         y = cmd->u.position.y;
-        qxl_server_request_cursor_move(qxl, x, y);
+        qemu_mutex_lock_iothread();
+        qxl->ssd.ds->mouse_set(x, y, 1);
+        qemu_mutex_unlock_iothread();
         break;
     }
 }
-
-/* called from iothread only (via qxl.c:pipe_read) */
-void qxl_render_cursor_set(SimpleSpiceDisplay *ssd, QEMUCursor *c, int x, int y)
-{
-    ssd->ds->cursor_define(c);
-    ssd->ds->mouse_set(x, y, 1);
-    cursor_put(c);
-}
-
-/* called from iothread only (via qxl.c:pipe_read) */
-void qxl_render_cursor_move(SimpleSpiceDisplay *ssd, int x, int y)
-{
-    ssd->ds->mouse_set(x, y, 1);
-}
diff --git a/hw/qxl.c b/hw/qxl.c
index 010b9b2..465e355 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -117,27 +117,6 @@ static QXLMode qxl_modes[] = {
 #endif
 };
 
-typedef struct __attribute__ ((__packed__)) {
-    QEMUCursor *c;
-    int x;
-    int y;
-} QXLServerCursorSet;
-
-typedef struct __attribute__ ((__packed__)) {
-    int x;
-    int y;
-} QXLServerCursorMove;
-
-typedef struct __attribute__ ((__packed__)) {
-    unsigned char req;
-    QXLServerCursorMove data;
-} QXLServerCursorMoveRequest;
-
-typedef struct __attribute__ ((__packed__)) {
-    unsigned char req;
-    QXLServerCursorSet data;
-} QXLServerCursorSetRequest;
-
 static PCIQXLDevice *qxl0;
 
 static void qxl_send_events(PCIQXLDevice *d, uint32_t events);
@@ -358,33 +337,6 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
 }
 
 /* called from spice server thread context only */
-void qxl_server_request_cursor_set(PCIQXLDevice *qxl, QEMUCursor *c, int x, int y)
-{
-    QXLServerCursorSetRequest req;
-    int r;
-
-    req.req = QXL_SERVER_CURSOR_SET;
-    req.data.c = c;
-    req.data.x = x;
-    req.data.y = y;
-    r = write(qxl->ssd.pipe[1], &req, sizeof(req));
-    assert(r == sizeof(req));
-}
-
-/* called from spice server thread context only */
-void qxl_server_request_cursor_move(PCIQXLDevice *qxl, int x, int y)
-{
-    QXLServerCursorMoveRequest req;
-    int r;
-
-    req.req = QXL_SERVER_CURSOR_MOVE;
-    req.data.x = x;
-    req.data.y = y;
-    r = write(qxl->ssd.pipe[1], &req, sizeof(req));
-    assert(r == sizeof(req));
-}
-
-/* called from spice server thread context only */
 static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 {
     PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl);
@@ -1103,37 +1055,12 @@ static void qxl_map(PCIDevice *pci, int region_num,
     }
 }
 
-static void read_bytes(int fd, void *buf, int len_requested)
-{
-    int len;
-    int total_len = 0;
-
-    do {
-        len = read(fd, buf, len_requested - total_len);
-        if (len < 0) {
-            if (errno == EINTR || errno == EAGAIN) {
-                continue;
-            }
-            perror("qxl: pipe_read: read failed");
-            /* will abort once it's out of the while loop */
-            break;
-        }
-        total_len += len;
-        buf = (uint8_t *)buf + len;
-    } while (total_len < len_requested);
-    assert(total_len == len_requested);
-}
-
 static void pipe_read(void *opaque)
 {
     SimpleSpiceDisplay *ssd = opaque;
     unsigned char cmd;
     int len, set_irq = 0;
     int create_update = 0;
-    int cursor_set = 0;
-    int cursor_move = 0;
-    QXLServerCursorSet cursor_set_data;
-    QXLServerCursorMove cursor_move_data;
 
     while (1) {
         cmd = 0;
@@ -1155,17 +1082,6 @@ static void pipe_read(void *opaque)
         case QXL_SERVER_CREATE_UPDATE:
             create_update = 1;
             break;
-        case QXL_SERVER_CURSOR_SET:
-            if (cursor_set == 1) {
-                cursor_put(cursor_set_data.c);
-            }
-            cursor_set = 1;
-            read_bytes(ssd->pipe[0], &cursor_set_data, sizeof(cursor_set_data));
-            break;
-        case QXL_SERVER_CURSOR_MOVE:
-            cursor_move = 1;
-            read_bytes(ssd->pipe[0], &cursor_move_data, sizeof(cursor_move_data));
-            break;
         default:
             fprintf(stderr, "%s: unknown cmd %u\n", __FUNCTION__, cmd);
             abort();
@@ -1183,12 +1099,6 @@ static void pipe_read(void *opaque)
     if (set_irq) {
         qxl_set_irq(container_of(ssd, PCIQXLDevice, ssd));
     }
-    if (cursor_move) {
-        qxl_render_cursor_move(ssd, cursor_move_data.x, cursor_move_data.y);
-    }
-    if (cursor_set) {
-        qxl_render_cursor_set(ssd, cursor_set_data.c, cursor_set_data.x, cursor_set_data.y);
-    }
 }
 
 static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
diff --git a/hw/qxl.h b/hw/qxl.h
index f4f99ec..701245f 100644
--- a/hw/qxl.h
+++ b/hw/qxl.h
@@ -93,8 +93,6 @@ typedef struct PCIQXLDevice {
 
 /* qxl.c */
 void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL phys, int group_id);
-void qxl_server_request_cursor_set(PCIQXLDevice *qxl, QEMUCursor *c, int x, int y);
-void qxl_server_request_cursor_move(PCIQXLDevice *qxl, int x, int y);
 
 /* qxl-logger.c */
 void qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id);
@@ -104,5 +102,3 @@ void qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext);
 void qxl_render_resize(PCIQXLDevice *qxl);
 void qxl_render_update(PCIQXLDevice *qxl);
 void qxl_render_cursor(PCIQXLDevice *qxl, QXLCommandExt *ext);
-void qxl_render_cursor_set(SimpleSpiceDisplay *ssd, QEMUCursor *c, int x, int y);
-void qxl_render_cursor_move(SimpleSpiceDisplay *ssd, int x, int y);
diff --git a/ui/spice-display.h b/ui/spice-display.h
index bbfd689..2be6a34 100644
--- a/ui/spice-display.h
+++ b/ui/spice-display.h
@@ -31,22 +31,11 @@
 
 #define NUM_SURFACES 1024
 
-/*
- * Commands/requests from server thread to iothread.
- * Note that CREATE_UPDATE is used both with qxl and without it (spice-display)
- * the others are only used with the qxl device.
- *
- * SET_IRQ - just the request is sent (1 byte)
- * CREATE_UPDATE - jus the request is sent (1 byte)
- * CURSOR_SET - send QXLServerRequestCursorSet
- * CURSOR_MOVE - send QXLServerRequestCursorMove
- */
+/* For commands/requests from server thread to iothread */
 #define QXL_EMPTY_UPDATE ((void *)-1)
 enum {
     QXL_SERVER_SET_IRQ = 1,
     QXL_SERVER_CREATE_UPDATE,
-    QXL_SERVER_CURSOR_SET,
-    QXL_SERVER_CURSOR_MOVE
 };
 
 struct SimpleSpiceUpdate;
-- 
1.7.3.2

