In this version, we fix the bugs in the v1: - fix broken read emulation spans a page boundary - fix invalid spte point is got if we walk shadow page table out of the mmu lock And, we also introduce some rules to modify spte in this version, then it does not need to atomically clear/set spte on x86_32 host anymore, the performance report of x86_32 host is in the later section Avi, I have sampled the operation of lockless shadow page walking as below steps: - mark walk_shadow_page_get_mmio_spte as 'noinline' - do the netperf test, the client is on the guest(NIC is e1000) and the server is on the host, it can generate large press of mmio access - using perf to sample it, and the result of 'perf report' is attached The ratio of walk_shadow_page_get_mmio_spte is 0.09%, the ratio of handle_ept_misconfig is 0.11%, the ratio of handle_mmio_page_fault_common is 0.07% I think it is acceptable, your opinion? The structure of this patchset: - Patch 1 ~ patch 3, fix the bugs in KVM - Patch 4 ~ patch 7, cleanup read/write emulation and cache mmio info for them to quickly mmio emulate - Patch 8 ~ patch 13, cleanup/prepare for mmio page fault support - Patch 14 ~ patch 18, optimize for spte operation for x86_32 host - Patch 19 ~ patch 22, implement mmio page fault Performance report on X86_32 host: Netperf (TCP_RR, NIC=e1000): =========================== ept is enabled: Before After 1st 677.28 697.58 2nd 670.93 703.94 3rd 677.19 692.17 ept is disabled Before After 1st 648.06 725.54 2nd 644.71 729.56 3rd 650.80 724.67 Kernbech (do not redirect the output) ========================== ept is enabled: Before After 1st 1m29.525s 1m26.904s 2nd 1m27.101s 1m26.423s 3rd 1m25.552s 1m26.070s ept is disabled Before After 1st 3m15.126s 3m11.754s 2nd 3m16.090s 3m10.382s 3rd 3m14.428s 3m9.056s By the way, you can find the performance report of x86_64 host in the v1 version: https://lkml.org/lkml/2011/6/7/190