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

[Xen-devel] Re: [PATCH][RFC] fix some spinlock issues in vmsi



On Fri, 2009-03-06 at 10:55 +0800, Kouya Shimura wrote:
> Hi,
> 
> This patch fixes some spinlock issues related to changeset:
>  19246:9bc5799566be "passthrough MSI-X mask bit acceleration"
>  19263:9c5b4efc934d "hvm: passthrough MSI-X: fix ia64 link and MSI-X clean up"
> 
> Without this patch, I got:
> (XEN) Assertion '_spin_is_locked(&pcidevs_lock)' failed at vmsi.c:389
> or
> (XEN) Xen BUG at spinlock.c:25
> 
> 
> I'm not sure this fix is right. Please review it.
> 
> - d->arch.hvm_domain.msixtbl_list_lock is redundant.
>   irq_desc->lock covers it, thus remove the spinlock.

No, it's not redundant. msixtbl_list_lock is to protect msixtbl_list,
which may contain entries for multiple irqs, consider if two
pt_bind_irq are called simultaneously, irq_desc->lock wouldn't be
enough to protect the list.

> 
> - ASSERT(spin_is_locked(&pcidevs_lock)) is not needed.
>   At first, I intended to add the enclosure of pcidevs_lock.
>   But this assertion seems pointless. pcidevs_lock is
>   for alldevs_list and msixtbl_pt_xxx functions never refer it.

I was thinking that pcidevs_lock is already held for msixtbl_pt_xxx, but
obviously I was wrong:-) However, it's not that pointless, msixtbl_pt_xxx
refers to the content of pci_dev, the use of pcidevs_lock is intended to
protect it against destructive modification, like an improper
PHYDEVOP_manage_pci_remove. It may not be neccessary for a well-written
device model, but that's something we can't rely on.

A similar problem also exists in msixtbl_write/msixtbl_read. Currently,
these functions access the mapped msix table using the pointer stored
in pci_dev, and when pci_dev is removed without the knowledge of the
guest, pci_dev alongside the fixmaps will be removed and this
definitely will frustrate these functions. Unfortunately, adding
spinlocks to msixtbl_{read,write} seems quite expensive, especially for
multiple guest threads, that's why RCU based lock is used here. For a
completely secure handling of this, maybe we need a less brute,
asynchronous pci_remove hypercall or something.

> 
> - In "debug=y" environment, xmalloc must not be called from both
>   irq_enable and irq_disable state. Otherwise, 
>   the assertion failure occurs in check_lock().
>   So, in msixtbl_pt_register, xmalloc is called beforehand.
>   I thinks this is ugly, though.

This is fine to me, thank you for pointing out this.

Thanks,
Qing
> 
> 
> Thanks,
> Kouya
> 
> Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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