From patchwork Thu Dec 17 22:08:10 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Airlie X-Patchwork-Id: 41352 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id BB7CAB6EEF for ; Fri, 18 Dec 2009 09:21:13 +1100 (EST) Received: from localhost ([127.0.0.1]:46967 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLOic-0006gP-Fo for incoming@patchwork.ozlabs.org; Thu, 17 Dec 2009 17:21:10 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NLOYZ-0001mH-Nq for qemu-devel@nongnu.org; Thu, 17 Dec 2009 17:10:47 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NLOYS-0001hB-E8 for qemu-devel@nongnu.org; Thu, 17 Dec 2009 17:10:45 -0500 Received: from [199.232.76.173] (port=36359 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NLOYR-0001gk-US for qemu-devel@nongnu.org; Thu, 17 Dec 2009 17:10:40 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59303) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NLOYR-0003lr-CX for qemu-devel@nongnu.org; Thu, 17 Dec 2009 17:10:39 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nBHMAcoq015996 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Dec 2009 17:10:38 -0500 Received: from localhost.localdomain (dhcp-0-222.bne.redhat.com [10.64.0.222]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nBHMAUQF005737 for ; Thu, 17 Dec 2009 17:10:37 -0500 From: Dave Airlie To: qemu-devel@nongnu.org Date: Fri, 18 Dec 2009 08:08:10 +1000 Message-Id: <1261087691-8319-6-git-send-email-airlied@gmail.com> In-Reply-To: <1261087691-8319-5-git-send-email-airlied@gmail.com> References: <1261087691-8319-1-git-send-email-airlied@gmail.com> <1261087691-8319-2-git-send-email-airlied@gmail.com> <1261087691-8319-3-git-send-email-airlied@gmail.com> <1261087691-8319-4-git-send-email-airlied@gmail.com> <1261087691-8319-5-git-send-email-airlied@gmail.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: [Qemu-devel] [PATCH 5/6] VMware VGA: Only enable dirty log tracking when fifo is disabled X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Anthony Liguori This patch enables dirty log tracking whenever it's needed and disables it when it is not. We unconditionally enable dirty log tracking on reset, restart dirty log tracking when PCI IO regions are remapped, and disable/enable it based on commands from the guest. Rebased-by: Dave Airlie Signed-off-by: Anthony Liguori --- hw/vga.c | 22 ++++++++++++++++++++++ hw/vga_int.h | 2 ++ hw/vmware_vga.c | 16 ++++++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/hw/vga.c b/hw/vga.c index 5b0c55e..d05f1f9 100644 --- a/hw/vga.c +++ b/hw/vga.c @@ -1606,7 +1606,29 @@ void vga_dirty_log_start(VGACommonState *s) kvm_log_start(VBE_DISPI_LFB_PHYSICAL_ADDRESS, s->vram_size); } #endif +} + +void vga_dirty_log_stop(VGACommonState *s) +{ + if (kvm_enabled() && s->map_addr) + kvm_log_stop(s->map_addr, s->map_end - s->map_addr); + + if (kvm_enabled() && s->lfb_vram_mapped) { + kvm_log_stop(isa_mem_base + 0xa0000, 0x80000); + kvm_log_stop(isa_mem_base + 0xa8000, 0x80000); + } +#ifdef CONFIG_BOCHS_VBE + if (kvm_enabled() && s->vbe_mapped) { + kvm_log_stop(VBE_DISPI_LFB_PHYSICAL_ADDRESS, s->vram_size); + } +#endif +} + +void vga_dirty_log_restart(VGACommonState *s) +{ + vga_dirty_log_stop(s); + vga_dirty_log_start(s); } /* diff --git a/hw/vga_int.h b/hw/vga_int.h index b5302c1..23a42ef 100644 --- a/hw/vga_int.h +++ b/hw/vga_int.h @@ -194,6 +194,8 @@ void vga_init(VGACommonState *s); void vga_common_reset(VGACommonState *s); void vga_dirty_log_start(VGACommonState *s); +void vga_dirty_log_stop(VGACommonState *s); +void vga_dirty_log_restart(VGACommonState *s); extern const VMStateDescription vmstate_vga_common; uint32_t vga_ioport_read(void *opaque, uint32_t addr); diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c index ae91327..e3d5706 100644 --- a/hw/vmware_vga.c +++ b/hw/vmware_vga.c @@ -771,8 +771,12 @@ static void vmsvga_value_write(void *opaque, uint32_t address, uint32_t value) s->height = -1; s->invalidated = 1; s->vga.invalidate(&s->vga); - if (s->enable) - s->fb_size = ((s->depth + 7) >> 3) * s->new_width * s->new_height; + if (s->enable) { + s->fb_size = ((s->depth + 7) >> 3) * s->new_width * s->new_height; + vga_dirty_log_stop(&s->vga); + } else { + vga_dirty_log_start(&s->vga); + } break; case SVGA_REG_WIDTH: @@ -948,6 +952,8 @@ static void vmsvga_reset(struct vmsvga_state_s *s) break; } s->syncing = 0; + + vga_dirty_log_start(&s->vga); } static void vmsvga_invalidate_display(void *opaque) @@ -1119,7 +1125,6 @@ static void vmsvga_init(struct vmsvga_state_s *s, int vga_ram_size) vmsvga_screen_dump, vmsvga_text_update, s); - vmsvga_reset(s); s->fifo_size = SVGA_FIFO_SIZE; s->fifo_offset = qemu_ram_alloc(s->fifo_size); @@ -1130,7 +1135,10 @@ static void vmsvga_init(struct vmsvga_state_s *s, int vga_ram_size) vmstate_register(0, &vmstate_vga_common, &s->vga); vga_init_vbe(&s->vga); + rom_add_vga(VGABIOS_FILENAME); + + vmsvga_reset(s); } static void pci_vmsvga_map_ioport(PCIDevice *pci_dev, int region_num, @@ -1172,7 +1180,7 @@ static void pci_vmsvga_map_mem(PCIDevice *pci_dev, int region_num, s->vga.map_addr = addr; s->vga.map_end = addr + s->vga.vram_size; - vga_dirty_log_start(&s->vga); + vga_dirty_log_restart(&s->vga); } static void pci_vmsvga_map_fifo(PCIDevice *pci_dev, int region_num,