|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 1/2] xen/pvh: take the p2m lock when doing logdirty ops from HVM domains
On 15/10/14 11:53, Roger Pau Monne wrote:
> Due to locking order, the p2m lock must be taken before the paging lock, or
> else the following panic occurs when trying to use logdirty ops from a PVH
> Dom0:
>
> (XEN) mm locking order violation: 292 > 222
> (XEN) Xen BUG at mm-locks.h:140
> (XEN) ----[ Xen-4.5-unstable x86_64 debug=y Not tainted ]----
> (XEN) CPU: 1
> (XEN) RIP: e008:[<ffff82d0801e9ea5>] get_page_from_gfn_p2m+0xb0/0x286
> (XEN) RFLAGS: 0000000000010282 CONTEXT: hypervisor
> (XEN) rax: 0000000000000000 rbx: ffff83019a1f7884 rcx: 0000000000000000
> (XEN) rdx: ffff83019a1f0000 rsi: 000000000000000a rdi: ffff82d0802926c0
> (XEN) rbp: ffff83019a1f77f8 rsp: ffff83019a1f7798 r8: ffff83019e830000
> (XEN) r9: 0000000000000003 r10: 00000000000000de r11: 0000000000000003
> (XEN) r12: ffff83019a1f77c4 r13: ffff83019a138820 r14: ffff83019a1f7974
> (XEN) r15: 0000000000057431 cr0: 0000000080050033 cr4: 00000000000026f0
> (XEN) cr3: 000000019ea86000 cr2: 000000080205d000
> (XEN) ds: 0000 es: 0000 fs: 0000 gs: 0000 ss: 0000 cs: e008
> [...]
> (XEN) Xen call trace:
> (XEN) [<ffff82d0801e9ea5>] get_page_from_gfn_p2m+0xb0/0x286
> (XEN) [<ffff82d0802223e9>] hap_p2m_ga_to_gfn_4_levels+0x59/0x2b7
> (XEN) [<ffff82d080222663>] hap_gva_to_gfn_4_levels+0x1c/0x29
> (XEN) [<ffff82d0801edf67>] paging_gva_to_gfn+0xb8/0xce
> (XEN) [<ffff82d0801b9bc0>] clear_user_hvm+0xd7/0x324
> (XEN) [<ffff82d0801e8776>] paging_log_dirty_op+0x358/0x552
> (XEN) [<ffff82d0801e8d47>] paging_domctl+0x140/0x177
> (XEN) [<ffff82d08015ccca>] arch_do_domctl+0x212/0x269e
> (XEN) [<ffff82d08010487c>] do_domctl+0x195d/0x1cd1
> (XEN) [<ffff82d0801bafba>] hvm_do_hypercall+0x1b8/0x31c
> (XEN) [<ffff82d0801e0d3f>] vmx_vmexit_handler+0xf91/0x1a5f
> (XEN) [<ffff82d0801e7a51>] vmx_asm_vmexit_handler+0x41/0xc0
> (XEN)
> (XEN)
> (XEN) ****************************************
> (XEN) Panic on CPU 1:
> (XEN) Xen BUG at mm-locks.h:140
> (XEN) ****************************************
> (XEN)
> (XEN) Reboot in five seconds...
>
> Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
Hmm. I suspect there might be more of these issues scattered around
with the other DOMCTL/SYSCTL hypercalls, none of which have ever been
used from an HVM guest before.
> ---
> xen/arch/x86/mm/paging.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> index 6b788f7..5af6309 100644
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -412,6 +412,8 @@ static int paging_log_dirty_op(struct domain *d,
>
> if ( !resuming )
> domain_pause(d);
> + if (has_hvm_container_vcpu(current))
> + p2m_lock(p2m_get_hostp2m(current->domain));
It appears as if there is some indentation issue here.
Also, can you pull current into a struct vcpu *curr on the stack?
~Andrew
> paging_lock(d);
>
> if ( !d->arch.paging.preempt.dom )
> @@ -421,6 +423,8 @@ static int paging_log_dirty_op(struct domain *d,
> d->arch.paging.preempt.op != sc->op )
> {
> paging_unlock(d);
> + if (has_hvm_container_vcpu(current))
> + p2m_unlock(p2m_get_hostp2m(current->domain));
> ASSERT(!resuming);
> domain_unpause(d);
> return -EBUSY;
> @@ -533,6 +537,8 @@ static int paging_log_dirty_op(struct domain *d,
> }
>
> paging_unlock(d);
> + if (has_hvm_container_vcpu(current))
> + p2m_unlock(p2m_get_hostp2m(current->domain));
>
> if ( rv )
> {
> @@ -555,6 +561,8 @@ static int paging_log_dirty_op(struct domain *d,
> out:
> d->arch.paging.preempt.dom = NULL;
> paging_unlock(d);
> + if (has_hvm_container_vcpu(current))
> + p2m_unlock(p2m_get_hostp2m(current->domain));
> domain_unpause(d);
>
> if ( l1 )
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |