xen-devel
Re: [Xen-devel][Pv-ops][PATCH] Netback multiple tasklet support
On Wed, 2009-12-09 at 20:23 +0000, Jeremy Fitzhardinge wrote:
>
> I've pushed this out in its own branch:
> xen/dom0/backend/netback-tasklet; please post any future patches
> against
> this branch.
This is probably a bit pointless given the code is commented out but I
wanted to get it out there while it was in my head:
Subject: xen: ensure locking gnttab_copy_grant_page is safe against interrupts.
Now that netback processing occurs in a thread instead of a tasklet
gnttab_copy_grant_page needs to be safe against interrupts.
The code is currently commented out in this tree but on 2.6.18 we observed a
deadlock where the netback thread called gnttab_copy_grant_page, locked
gnttab_dma_lock for writing, was interrupted and on return from interrupt the
network stack's TX tasklet ended up calling __gnttab_dma_map_page via the
hardware driver->swiotlb and tries to take gnttab_dma_lock for reading.
Correct the commented code so we don't get bitten if/when it is re-enabled.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>#
Cc: "Xu, Dongxiao" <dongxiao.xu@xxxxxxxxx>
---
drivers/xen/grant-table.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index c653970..f25a2bc 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -828,14 +828,14 @@ int gnttab_copy_grant_page(grant_ref_t ref, struct page
**pagep)
mfn = pfn_to_mfn(pfn);
new_mfn = virt_to_mfn(new_addr);
-// write_seqlock(&gnttab_dma_lock); /* protects __gnttab_dma_map_page on
2.6.18 */
+// write_seqlock_irq(&gnttab_dma_lock); /* protects __gnttab_dma_map_page
on 2.6.18 */
/* Make seq visible before checking page_mapped. */
smp_mb();
/* Has the page been DMA-mapped? */
if (unlikely(page_mapped(page))) {
- //write_sequnlock(&gnttab_dma_lock);
+ //write_sequnlock_irq(&gnttab_dma_lock);
put_page(new_page);
err = -EBUSY;
goto out;
@@ -855,7 +855,7 @@ int gnttab_copy_grant_page(grant_ref_t ref, struct page
**pagep)
BUG_ON(err);
BUG_ON(unmap.status);
-// write_sequnlock(&gnttab_dma_lock);
+// write_sequnlock_irq(&gnttab_dma_lock);
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
set_phys_to_machine(page_to_pfn(new_page), INVALID_P2M_ENTRY);
--
1.5.6.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|