qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 5/6] vga: Use linear mapping + dirty logging


From: Avi Kivity
Subject: Re: [Qemu-devel] [PATCH v2 5/6] vga: Use linear mapping + dirty logging in chain 4 memory access mode
Date: Wed, 17 Aug 2011 16:38:30 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20110707 Thunderbird/5.0

On 08/17/2011 03:41 PM, Jan Kiszka wrote:
From: Jan Kiszka<address@hidden>

Most VGA memory access modes require MMIO handling as they demand weird
logic to get a byte from or into the video RAM. However, there is one
exception: chain 4 mode with all memory planes enabled for writing. This
mode actually allows lineary mapping, which can then be combined with
dirty logging to accelerate KVM.

This patch accelerates specifically VBE accesses like they are used by
grub in graphical mode. Not only the standard VGA adapter benefits from
this, also vmware and spice in VGA mode.

Excellent, this slowness is very annoying.


+static void vga_update_memory_access(VGACommonState *s)
+{
+    MemoryRegion *region, *old_region = s->chain4_alias;
+    target_phys_addr_t base, offset, size;
+
+    s->chain4_alias = NULL;
+
+    if ((s->sr[0x02]&  0xf) == 0xf&&  s->sr[0x04]&  0x08) {
+        offset = 0;
+        switch ((s->gr[6]>>  2)&  3) {
+        case 0:
+            base = 0xa0000;
+            size = 0x20000;
+            break;
+        case 1:
+            base = 0xa0000;
+            size = 0x10000;
+            offset = s->bank_offset;
+            break;
+        case 2:
+            base = 0xb0000;
+            size = 0x8000;
+            break;
+        case 3:
+            base = 0xb8000;
+            size = 0x8000;
+            break;
+        }
+        region = qemu_malloc(sizeof(*region));
+        memory_region_init_alias(region, "vga.chain4",&s->vram, offset, size);
+        memory_region_add_subregion_overlap(get_system_memory(), base,
+                                            region, 2);

get_system_memory() has been excised from vga in batch 4 of my patches, please adjust.

+        s->chain4_alias = region;
+    }
+    if (old_region) {
+        memory_region_del_subregion(get_system_memory(), old_region);
+        memory_region_destroy(old_region);
+        qemu_free(old_region);
+    }
+}
+


The mmio code has

            s->plane_updated |= mask; /* only used to detect font change */

aren't we losing it?  we could easily recover it via dirty logging.

--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]