KVM

From KVM

(Difference between revisions)
Revision as of 20:44, 20 November 2007
AviKivity (Talk)
(mmu locking)
← Previous diff
Revision as of 14:25, 21 November 2007
AviKivity (Talk)
(more x86 emulator todos)
Next diff →
Line 34: Line 34:
* Add a NonPT flag (or maybe its inverse, Paging) to instructions that are never used for page table updates (like add, sub, call). Teach the mmu to unshadow page tables if a NonPT instruction is executed on them. * Add a NonPT flag (or maybe its inverse, Paging) to instructions that are never used for page table updates (like add, sub, call). Teach the mmu to unshadow page tables if a NonPT instruction is executed on them.
* Change the emulator initialization sequence not to read all segment registers (this is slow), instead read them on demand. On 64-bit, no segments are usually needed while on 32-bit only cs and ds are commenly required. * Change the emulator initialization sequence not to read all segment registers (this is slow), instead read them on demand. On 64-bit, no segments are usually needed while on 32-bit only cs and ds are commenly required.
 +* Add a String tag to the decoder tables, and use it to eliminate special rep_prefix processing
 +* Unify the various switch (b) into just two: one for regular insns and one for two byte insns.
Interactivity improvements: Interactivity improvements:

Revision as of 14:25, 21 November 2007

TODO


The following items need some love. Please post to the list if you are interested in helping out:

  • Real mode support: VT support for real mode is terrible, so we need to do it in software. This means extending the x86 emulator (x86_emulate.c) to handle more instructions, and changing the execution loop to call the emulator for real mode (in progress).
  • Emulate the architectural performance monitor counters/msrs, for Linux nmi watchdog support.
  • Emulate MSR_IA32_DEBUGCTL for guests which use it
  • Emulate x86 hardware task switching
  • Bring up Windows 95 and Windows 98 guests
  • Support connecting the host's /dev/sg* to qemu's SCSI emulation. This allows controlling tape drives and media changers from qemu. (in progress)
  • Batch writes to 4-plane vga memory and other side-effect-free mmio to improve performance
  • Implement MSR_EFER on i386, on processors which support it

The following smaller scale tasks can be a nice entry point to someone wishing to get involved:

  • Store command line options in an empty snapshot in a qcow2 format image file. This allows an image file to be self contained: qemu file.img should be enough to launch a fully configured virtual machine.
  • Allow all cpuid features supported by kvm to be passed to the guest; add a command line option to specifiy the cpuid explicitly to allow migration in a heterogeneous server farm.
  • Add a Unix domain socket device. With this, the guest can talk to a pci device which is connected to a Unix domain socket on the host.
  • Add a qemu interface for sharing memory between guests. Using a pci device to expose the shared memory is probably a good starting point.
  • Allow userspace to manage which msrs are emulated as no-ops (read zero, write ignored) to hack support for some guests

MMU related:

  • Support large pages (in conjunction with npt/ept) so that if the guest uses a large page mapping and the guest memory is backed by hugetlbfs, a large-page pte is created.
  • Improve mmu page eviction algorithm (currently FIFO, change to approximate LRU).
  • Add a read-only memory type.
  • Implement AM20 for dos and the like.
  • Implement direct page tables on paravirt_ops enabled Linux guests (in progress)
  • Change memory slot locking so that we can read and write guest memory without kvm->lock. RCU or a reader/writer lock may help. Maybe use mm->mmap_sem.
  • With the above, don't hold kvm->lock during instruction emulation.
  • Move set_pte_common(), set_pte(), set_pde(), and fetch() from paging_tmpl.h to mmu.c. These functions depend very little on the current paging mode.

x86 emulator updates:

  • Trap #UD and emulate sysenter/syscall/sysret/sysexit. These instructions don't exist on all cpus in all modes, so they hinder cross-vendor migration (in progress)
  • Add a NonPT flag (or maybe its inverse, Paging) to instructions that are never used for page table updates (like add, sub, call). Teach the mmu to unshadow page tables if a NonPT instruction is executed on them.
  • Change the emulator initialization sequence not to read all segment registers (this is slow), instead read them on demand. On 64-bit, no segments are usually needed while on 32-bit only cs and ds are commenly required.
  • Add a String tag to the decoder tables, and use it to eliminate special rep_prefix processing
  • Unify the various switch (b) into just two: one for regular insns and one for two byte insns.

Interactivity improvements:

  • If for several frames in a row a large proportion of the framebuffer pages are
changing, then for the next few frames don't bother to get the dirty page log
from kvm, but instead assume that all pages are dirty.  This will reduce page
fault overhead on highly interactive workloads.
  • When detecting keyboard/video/mouse activity, scale up the frame rate; when
activity dies down, scale it back down (applicable to qemu as well).

Bug fixes:

  • Less sexy bug ever important, fixing bugs is one of the most important contributions

For the adventurous:

  • Emulate the VT and SVM instructions, so that kvm can run in a virtual machine. Test by running a VM in a VT guest in an SVM guest on VT hardware, as well as running a VM in an SVM guest in a VT guest on SVM hardware.
  • Emulate the VT and SVM instruction sets on qemu. This would be very beneficial to debugging kvm.
  • Keep this TODO up to date
  • Add vmgl support to qemu. Port to virtio. Write a Windows driver.


Views Article Discussion Edit History
Personal tools:  Log in / create account
Toolbox What links here Related changes Upload file Special pages Printable version