From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:55781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RxbJ6-0007kp-Lw for qemu-devel@nongnu.org; Wed, 15 Feb 2012 04:37:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RxbJ0-0008DP-2K for qemu-devel@nongnu.org; Wed, 15 Feb 2012 04:37:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:32147) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RxbIz-0008Bm-IM for qemu-devel@nongnu.org; Wed, 15 Feb 2012 04:37:41 -0500 Date: Wed, 15 Feb 2012 11:37:34 +0200 From: Alon Levy Message-ID: <20120215093734.GS15812@garlic.tlv.redhat.com> References: <1329297736-3049-1-git-send-email-yhalperi@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1329297736-3049-1-git-send-email-yhalperi@redhat.com> Subject: Re: [Qemu-devel] [Spice-devel] [PATCH v2 1/2] qxl: set only off-screen surfaces dirty instead of the whole vram List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Yonit Halperin Cc: qemu-devel@nongnu.org, spice-devel@freedesktop.org On Wed, Feb 15, 2012 at 11:22:15AM +0200, Yonit Halperin wrote: > We used to assure the guest surfaces were saved before migration by > setting the whole vram dirty. This patch sets dirty only the areas > that are actually used in the vram. > Series is Reviewed-by: Alon Levy > Signed-off-by: Yonit Halperin > --- > hw/qxl.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- > 1 files changed, 44 insertions(+), 9 deletions(-) > > diff --git a/hw/qxl.c b/hw/qxl.c > index bc03c1d..df55de1 100644 > --- a/hw/qxl.c > +++ b/hw/qxl.c > @@ -1006,7 +1006,7 @@ static void qxl_reset_surfaces(PCIQXLDevice *d) > qxl_spice_destroy_surfaces(d, QXL_SYNC); > } > > -/* called from spice server thread context only */ > +/* can be also called from spice server thread context */ > void *qxl_phys2virt(PCIQXLDevice *qxl, QXLPHYSICAL pqxl, int group_id) > { > uint64_t phys = le64_to_cpu(pqxl); > @@ -1465,6 +1465,46 @@ static void qxl_hw_text_update(void *opaque, console_ch_t *chardata) > } > } > > +static void qxl_dirty_surfaces(PCIQXLDevice *qxl) > +{ > + intptr_t vram_start; > + int i; > + > + if (qxl->mode != QXL_MODE_NATIVE) { > + return; > + } > + > + /* dirty the primary surface */ > + qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset, > + qxl->shadow_rom.surface0_area_size); > + > + vram_start = (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar); > + > + /* dirty the off-screen surfaces */ > + for (i = 0; i < NUM_SURFACES; i++) { > + QXLSurfaceCmd *cmd; > + intptr_t surface_offset; > + int surface_size; > + > + if (qxl->guest_surfaces.cmds[i] == 0) { > + continue; > + } > + > + cmd = qxl_phys2virt(qxl, qxl->guest_surfaces.cmds[i], > + MEMSLOT_GROUP_GUEST); > + assert(cmd->type == QXL_SURFACE_CMD_CREATE); > + surface_offset = (intptr_t)qxl_phys2virt(qxl, > + cmd->u.surface_create.data, > + MEMSLOT_GROUP_GUEST); > + surface_offset -= vram_start; > + surface_size = cmd->u.surface_create.height * > + abs(cmd->u.surface_create.stride); > + dprint(qxl, 3, "%s: dirty surface %d, offset %d, size %d\n", __func__, > + i, (int)surface_offset, surface_size); > + qxl_set_dirty(&qxl->vram_bar, surface_offset, surface_size); > + } > +} > + > static void qxl_vm_change_state_handler(void *opaque, int running, > RunState state) > { > @@ -1478,14 +1518,9 @@ static void qxl_vm_change_state_handler(void *opaque, int running, > * called > */ > qxl_update_irq(qxl); > - } else if (qxl->mode == QXL_MODE_NATIVE) { > - /* dirty all vram (which holds surfaces) and devram (primary surface) > - * to make sure they are saved */ > - /* FIXME #1: should go out during "live" stage */ > - /* FIXME #2: we only need to save the areas which are actually used */ > - qxl_set_dirty(&qxl->vram_bar, 0, qxl->vram_size); > - qxl_set_dirty(&qxl->vga.vram, qxl->shadow_rom.draw_area_offset, > - qxl->shadow_rom.surface0_area_size); > + } else { > + /* make sure surfaces are saved before migration */ > + qxl_dirty_surfaces(qxl); > } > } > > -- > 1.7.7.6 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/spice-devel