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

Re: [Xen-devel] Deadlocks by p2m_lock and event_lock



> -----Original Message-----
> From: Tim Deegan [mailto:tim@xxxxxxx]
> Sent: Friday, March 09, 2012 7:20 PM
> To: Hao, Xudong
> Cc: JBeulich@xxxxxxxx; Andres Lagar-Cavilla; xen-devel@xxxxxxxxxxxxxxxxxxx;
> Keir Fraser; Zhang, Xiantao
> Subject: Re: [Xen-devel] Deadlocks by p2m_lock and event_lock
> 
> Hi,
> 
> At 10:58 +0000 on 09 Mar (1331290728), Hao, Xudong wrote:
> > ====CPU0===
> > map_domain_pirq()    Grab event_lock
> >   /
> > Pci_enable_msi()
> >   /
> > msix_capability_init()
> >   /
> > p2m_change_entry_type_global()   Trying to acquire p2m_lock
> >
> > ====CPU9===
> > hvm_hap_nested_page_fault() -> get_gfn_type_access()   Grab p2m_lock
> >   /
> > handle_mmio()
> >   /
> > ...
> >   /
> > notify_via_xen_event_channel()    Trying to acquire event_lock
> >
> >
> > The event_lock is used anywhere in Xen, I only have a patch of workaround
> this issue for proposal, but not for the final fix. Any good suggestion?
> >
> > diff -r f61120046915 xen/arch/x86/irq.c
> > --- a/xen/arch/x86/irq.c    Wed Mar 07 11:50:31 2012 +0100
> > +++ b/xen/arch/x86/irq.c    Sat Mar 10 02:06:18 2012 +0800
> > @@ -1875,10 +1875,12 @@ int map_domain_pirq(
> >          if ( !cpu_has_apic )
> >              goto done;
> >
> > +        spin_unlock(&d->event_lock);
> >          pdev = pci_get_pdev(msi->seg, msi->bus, msi->devfn);
> >          ret = pci_enable_msi(msi, &msi_desc);
> >          if ( ret )
> >              goto done;
> > +        spin_lock(&d->event_lock);
> >
> >          spin_lock_irqsave(&desc->lock, flags);
> >
> > Best Regards,
> > Xudong Hao
> 
> I don't know about the event lock, but it seems unwise to call in to
> handle_mmio with a gfn lock held.  How about fixing the other path?
> 
> diff -r 04673ecb9d78 xen/arch/x86/hvm/hvm.c
> --- a/xen/arch/x86/hvm/hvm.c  Thu Mar 08 16:40:05 2012 +0000
> +++ b/xen/arch/x86/hvm/hvm.c  Fri Mar 09 11:15:25 2012 +0000
> @@ -1324,10 +1324,11 @@ int hvm_hap_nested_page_fault(unsigned l
>      if ( (p2mt == p2m_mmio_dm) ||
>           (access_w && (p2mt == p2m_ram_ro)) )
>      {
> +        put_gfn(p2m->domain, gfn);
>          if ( !handle_mmio() )
>              hvm_inject_exception(TRAP_gp_fault, 0, 0);
>          rc = 1;
> -        goto out_put_gfn;
> +        goto out;
>      }
> 
>  #ifdef __x86_64__
> @@ -1379,6 +1380,7 @@ int hvm_hap_nested_page_fault(unsigned l
> 
>  out_put_gfn:
>      put_gfn(p2m->domain, gfn);
> +out:
>      if ( paged )
>          p2m_mem_paging_populate(v->domain, gfn);
>      if ( req_ptr )

Yes, that's fine to release the p2m lock earlier than handle_mmio.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.