Re: Debugging an inconsistent shadow page table

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

 



Avi Kivity wrote:
> Jan Kiszka wrote:
>> Hi,
>>
>> turning on MMU_DEBUG and AUDIT in arch/x86/kvm/mmu.c (and fixing a build
>> error, patch will follow) I got this (and then a #GP :( - patch will
>> follow):
>>
>> ...
>> kvm_mmu_get_page: looking gfn 0 role f0120
>> kvm_mmu_get_page: found
>> kvm_mmu_get_page: looking gfn 0 role f0220
>> kvm_mmu_get_page: found
>> kvm_mmu_get_page: looking gfn 0 role f0320
>> kvm_mmu_get_page: found
>> kvm_mmu_get_page: looking gfn e1f role e0044
>> kvm_mmu_get_page: adding gfn e1f role e0044
>> rmap_write_protect: spte ffff8100660a60f8 7ca98067
>> paging64_page_fault: addr 100105 err 19
>> audit_write_protection: (pre page fault) shadow page has writable
>> mappings: gfn e1f role e0044
>> audit: (pre page fault) nontrapping pte in nonleaf level: levels 4 gva
>> 8000000000 level 4 pte 0
>>
>> Is the last message indicating a problem? I get it very early during
>> guest boot. oos_shadow is disabled.
>>   
> 
> Yes.  It means the guest will receive a page fault if is accesses
> anything this pte points to.  Theoretically we could have made this
> work, but we never did.
> 
> But the message is self-contradictory.  Level 4 PTEs map 0.5TB each, and
> the gva mentioned isn't 0.5TB aligned.
> 
>> I'm currently trying to understand an obvious inconsistency in the pte
>> describing a page of the virtio-net rx ring. On some guests with some
>> qemu (upstream) command lines I can trigger this with '-smb /some/path'
>> and then doing smbclient -L in the guest. Once the inconsistency slipped
>> in, host and guest see different page contents and virtio-net stops to
>> work. Very strange, but fortunately easily reproducible here. Any hints
>> or debugging suggestions welcome!
>>   
> 
> What type of inconsistency? pfn or flags?
> 

The former. Here is a before-after walk of the shadow and the host page
table (format: <entry address> (<entry value>) ):

[good]
gva=ffff88001ef22000: 000000002fc57000 -> 000000002fc57880
(000000003d119027) -> 000000003d119000 (000000005d9bf027) ->
000000005d9bf7b8 (000000003d159027) -> 000000003d159910
(000000002fbce063) -> 000000002fbce000 = 01 00 07 00
hva=00007f4665cac000: 00000000701f4000 -> 00000000701f47f0
(000000005d925067) -> 000000005d9258c8 (000000005d8c5067) ->
000000005d8c5970 (000000003d2b4067) -> 000000003d2b4560
(800000002fbce067) -> 800000002fbce000 = 01 00 07 00

[bad]
gva=ffff88001ef22000: 000000002fc57000 -> 000000002fc57880
(000000003d119027) -> 000000003d119000 (000000005d9bf027) ->
000000005d9bf7b8 (000000003d159027) -> 000000003d159910
(000000002fbce063) -> 000000002fbce000 = 01 00 0a 00
hva=00007f4665cac000: 00000000701f4000 -> 00000000701f47f0
(000000005d925067) -> 000000005d9258c8 (000000005d8c5067) ->
000000005d8c5970 (000000003d2b4067) -> 000000003d2b4560
(800000006576d067) -> 800000006576d000 = 01 00 10 00

That raise a question for a kvm-mmu newbie like me:

If a page of the qemu process gets pushed around (here likely due to
fork()->exec(smbd)->COW), how will kvm's shadow table catch up? Via
MMU_NOTIFIER?

I'm on a 2.6.25 kernel, and that means without CONFIG_MMU_NOTIFIER. So
far I assumed that kernels without this feature do not work optimally,
but they won't break my guests...

Jan

Attachment: signature.asc
Description: OpenPGP digital signature


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux