The attached file
supports AMD-V nested paging live migration. Please comment. I will create an
updated version after collecting feedbacks.
arch/x86/hvm/hvm.c
| 2
arch/x86/hvm/io.c
| 2
arch/x86/hvm/svm/svm.c
| 3
arch/x86/mm.c
| 12
+- arch/x86/mm/hap/hap.c
| 220
+++++++++++++++++++++++++++++++++++++++++- arch/x86/mm/p2m.c
| 92
+++++++++++++++-- arch/x86/mm/paging.c
| 12
++ include/asm-x86/domain.h
| 8 + include/asm-x86/grant_table.h
| 2
include/asm-x86/hap.h
| 1
include/asm-x86/p2m.h
| 5
include/asm-x86/page.h
| 2
include/asm-x86/paging.h
| 2
include/asm-x86/shadow.h
| 7 - 14 files changed, 341 insertions(+), 29
deletions(-)
Design:
1. We handle four
live migration operators as follow: *
XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY ** Allocates log_dirty_bitmap ** Set
log dirty bit in paging mode ** Goes through the P2M table and mark all
physical memory as NOT WRITABLE ** Continues to run the guest as
usual
*
XEN_DOMCTL_SHADOW_OP_PEEK ** There is nothing special here. It is pretty
similar to shadow code. Just copy dirty bitmap information to live migration
handler.
*
XEN_DOMCTL_SHADOW_OP_CLEAN ** Clean dirty bitmap to all 0's. ** Goes
through the P2M table and marks all physical memory as NOT WRITABLE **
Continues to run the guest as usual
*
XEN_DOMCTL_SHADOW_OP_OFF ** Fix P2M table and mark all physical memory as
WRITABLE ** De-allocate dirty bitmap resources ** Clear log dirty bit in
paging mode
2. We handle nested
page fault as follow:
* Nested Paging
Fault ** If it is MMIO space, call handle_mmio() ** Otherwise, call
p2m_fix_table() to mark a specific page as WRITABLE. Additionally, we call
paging_mark_dirty() to update dirty bitmap. By doing this, we only receive one
NPF for each dirty page (in each cycle).
The following areas
require special attention:
1. paging_mark_dirty() Currently,
paging_mark_dirty() dispatches to sh_mark_dirty() or hap_mark_dirty() based on paging support. I personally prefer a function
pointer. However, current paging interface only provides a function pointer for
vcpu-level functions, not for domain-level functions. This is a bit annoying.
2. locking in
p2m_set_l1e_flags() p2m_set_l1e_flags(), which is invoked by hap.c, calls
hap_write_p2m_entry(). hap_lock() is called twice. I currently remove hap_lock() in hap_write_p2m_entry(). A better solution is needed
here.
Thanks,
-Wei
npt_live_migrate_RFC.txt
Description: npt_live_migrate_RFC.txt
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|