From patchwork Sun Feb 19 21:28:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alon Levy X-Patchwork-Id: 142072 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 4C555B6FAF for ; Mon, 20 Feb 2012 08:28:41 +1100 (EST) Received: from localhost ([::1]:54074 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzEJC-0004g5-Nq for incoming@patchwork.ozlabs.org; Sun, 19 Feb 2012 16:28:38 -0500 Received: from eggs.gnu.org ([140.186.70.92]:48570) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzEIv-0004LG-SO for qemu-devel@nongnu.org; Sun, 19 Feb 2012 16:28:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RzEIu-0004Tv-8j for qemu-devel@nongnu.org; Sun, 19 Feb 2012 16:28:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:10240) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RzEIt-0004Tm-U2 for qemu-devel@nongnu.org; Sun, 19 Feb 2012 16:28:20 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1JLSJCN001199 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 19 Feb 2012 16:28:19 -0500 Received: from garlic.redhat.com (vpn-200-5.tlv.redhat.com [10.35.200.5]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q1JLS6Ys003257; Sun, 19 Feb 2012 16:28:17 -0500 From: Alon Levy To: qemu-devel@nongnu.org, kraxel@redhat.com, elmarco@redhat.com Date: Sun, 19 Feb 2012 23:28:03 +0200 Message-Id: <1329686886-6853-5-git-send-email-alevy@redhat.com> In-Reply-To: <1329686886-6853-1-git-send-email-alevy@redhat.com> References: <1329686886-6853-1-git-send-email-alevy@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC 4/7] qxl: make qxl_render_update async X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org RHBZ# 747011 Removes the last user of QXL_SYNC when using update drivers that use the _ASYNC io ports. The last user is qxl_render_update, it is called both by qxl_hw_update which is the vga_hw_update_ptr passed to graphic_console_init, and by qxl_hw_screen_dump. At the same time the QXLRect area being passed to the red_worker thread is passed as a copy, allocated and copied before passing, deallocated on the interface_async_complete callback. Signed-off-by: Alon Levy --- hw/qxl-render.c | 43 ++++++++++++++++++++++++++++++++----------- hw/qxl.c | 33 ++++++++++++++++++++++++++++++--- ui/spice-display.h | 1 + 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/hw/qxl-render.c b/hw/qxl-render.c index b238b96..7f9fbca 100644 --- a/hw/qxl-render.c +++ b/hw/qxl-render.c @@ -71,12 +71,19 @@ void qxl_render_resize(PCIQXLDevice *qxl) } } +typedef struct QXLRenderUpdateData { + int redraw; + QXLRect dirty[32]; + QXLRect area; +} QXLRenderUpdateData; + void qxl_render_update(PCIQXLDevice *qxl) { VGACommonState *vga = &qxl->vga; - QXLRect dirty[32], update; + QXLRect dirty[32]; void *ptr; - int i, redraw = 0; + int redraw = 0; + QXLRenderUpdateData *data; if (!is_buffer_shared(vga->ds->surface)) { dprint(qxl, 1, "%s: restoring shared displaysurface\n", __func__); @@ -126,20 +133,33 @@ void qxl_render_update(PCIQXLDevice *qxl) } qxl->guest_primary.commands = 0; - update.left = 0; - update.right = qxl->guest_primary.surface.width; - update.top = 0; - update.bottom = qxl->guest_primary.surface.height; + data = g_malloc0(sizeof(*data)); + data->redraw = redraw; + data->area.left = 0; + data->area.right = qxl->guest_primary.surface.width; + data->area.top = 0; + data->area.bottom = qxl->guest_primary.surface.height; + qxl_spice_update_area(qxl, 0, &data->area, + data->dirty, ARRAY_SIZE(dirty), 1, QXL_ASYNC, + qxl_cookie_new(QXL_COOKIE_TYPE_RENDER_UPDATE_AREA, + 0, + (uint64_t)data)); +} + +void qxl_render_update_area_done(PCIQXLDevice *qxl, QXLCookie *cookie) +{ + QXLRenderUpdateData *data = (QXLRenderUpdateData *)cookie->data; + QXLRect update = data->area; + QXLRect *dirty = data->dirty; + VGACommonState *vga = &qxl->vga; + int i; - memset(dirty, 0, sizeof(dirty)); - qxl_spice_update_area(qxl, 0, &update, - dirty, ARRAY_SIZE(dirty), 1, QXL_SYNC, NULL); - if (redraw) { + if (data->redraw) { memset(dirty, 0, sizeof(dirty)); dirty[0] = update; } - for (i = 0; i < ARRAY_SIZE(dirty); i++) { + for (i = 0; i < ARRAY_SIZE(data->dirty); i++) { if (qemu_spice_rect_is_empty(dirty+i)) { break; } @@ -151,6 +171,7 @@ void qxl_render_update(PCIQXLDevice *qxl) dirty[i].right - dirty[i].left, dirty[i].bottom - dirty[i].top); } + g_free(data); } static QEMUCursor *qxl_cursor(PCIQXLDevice *qxl, QXLCursor *cursor) diff --git a/hw/qxl.c b/hw/qxl.c index 9d3b848..5563293 100644 --- a/hw/qxl.c +++ b/hw/qxl.c @@ -145,15 +145,19 @@ void qxl_spice_update_area(PCIQXLDevice *qxl, uint32_t surface_id, uint32_t clear_dirty_region, qxl_async_io async, QXLCookie *cookie) { + struct QXLRect *area_copy; if (async == QXL_SYNC) { qxl->ssd.worker->update_area(qxl->ssd.worker, surface_id, area, dirty_rects, num_dirty_rects, clear_dirty_region); } else { #if SPICE_INTERFACE_QXL_MINOR >= 1 if (cookie == NULL) { + area_copy = g_malloc0(sizeof(*area_copy)); + memcpy(area_copy, area, sizeof(*area)); + area = area_copy; cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO, QXL_IO_UPDATE_AREA_ASYNC, - 0); + (uint64_t)area_copy); } spice_qxl_update_area_async(&qxl->ssd.qxl, surface_id, area, clear_dirty_region, (uint64_t)cookie); @@ -193,7 +197,7 @@ static void qxl_spice_destroy_surface_wait(PCIQXLDevice *qxl, uint32_t id, #if SPICE_INTERFACE_QXL_MINOR >= 1 static void qxl_spice_flush_surfaces_async(PCIQXLDevice *qxl) { - spice_qxl_flush_surfaces_async(&qxl->ssd.qxl, + spice_qxl_flush_surfaces_async(&qxl->ssd.qxl, (uint64_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO, QXL_IO_FLUSH_SURFACES_ASYNC, 0)); @@ -765,6 +769,10 @@ static void interface_async_complete_io(PCIQXLDevice *qxl, QXLCookie *cookie) } switch (current_async) { + case QXL_IO_MEMSLOT_ADD_ASYNC: + case QXL_IO_DESTROY_PRIMARY_ASYNC: + case QXL_IO_FLUSH_SURFACES_ASYNC: + break; case QXL_IO_CREATE_PRIMARY_ASYNC: qxl_create_guest_primary_complete(qxl); break; @@ -774,6 +782,12 @@ static void interface_async_complete_io(PCIQXLDevice *qxl, QXLCookie *cookie) case QXL_IO_DESTROY_SURFACE_ASYNC: qxl_spice_destroy_surface_wait_complete(qxl, (uint32_t)cookie->data); break; + case QXL_IO_UPDATE_AREA_ASYNC: + g_free((void *)cookie->data); + break; + default: + fprintf(stderr, "qxl: %s: unexpected current_async %d\n", __func__, + current_async); } qxl_send_events(qxl, QXL_INTERRUPT_IO_CMD); } @@ -788,6 +802,9 @@ static void interface_async_complete(QXLInstance *sin, uint64_t cookie_token) case QXL_COOKIE_TYPE_IO: interface_async_complete_io(qxl, cookie); break; + case QXL_COOKIE_TYPE_RENDER_UPDATE_AREA: + qxl_render_update_area_done(qxl, cookie); + break; default: fprintf(stderr, "qxl: %s: unexpected cookie type %d\n", __func__, cookie->type); } @@ -1243,8 +1260,18 @@ async_common: case QXL_IO_UPDATE_AREA: { QXLRect update = d->ram->update_area; + QXLRect *area_copy = &update; + QXLCookie *cookie = NULL; + + if (async == QXL_ASYNC) { + area_copy = g_malloc0(sizeof(*area_copy)); + memcpy(area_copy, &d->ram->update_area, sizeof(*area_copy)); + cookie = qxl_cookie_new(QXL_COOKIE_TYPE_IO, + QXL_IO_UPDATE_AREA_ASYNC, + (uint64_t)area_copy); + } qxl_spice_update_area(d, d->ram->update_surface, - &update, NULL, 0, 0, async, NULL); + area_copy, NULL, 0, 0, async, cookie); break; } case QXL_IO_NOTIFY_CMD: diff --git a/ui/spice-display.h b/ui/spice-display.h index c8747ab..8f286f8 100644 --- a/ui/spice-display.h +++ b/ui/spice-display.h @@ -50,6 +50,7 @@ typedef enum qxl_async_io { enum { QXL_COOKIE_TYPE_IO, + QXL_COOKIE_TYPE_RENDER_UPDATE_AREA, }; typedef struct QXLCookie {