WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH]: Better checking in range_straddles_page_boundary

To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH]: Better checking in range_straddles_page_boundary
From: Chris Lalancette <clalance@xxxxxxxxxx>
Date: Wed, 22 Oct 2008 11:05:39 +0200
Delivery-date: Wed, 22 Oct 2008 02:07:02 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.16 (X11/20080723)
All,
    Attached is a simple patch to slightly rework the logic in
range_straddles_page_boundary().  The reason for this is to avoid a crash we are
seeing on 32-bit dom0.  Basically, the contiguous_bitmap is allocated based on
max_low_pfn.  However, the swiotlb code can be passed a request (in
swiotlb_map_sg) that is > 1 page (I've seen 2 pages), and is also a page
(sg->page) > max_low_pfn.  If this combination happens, then you get a fatal
page fault when doing the test_bit(pfn, contiguous_bitmap).  For that reason,
rework the logic in range_straddles_page_boundary so that if it gets a request >
1 page, and it's above max_low_pfn, then we force the splitting of the request.
 In our testing, this seems to fix the issue.

Note that the patch is against the RHEL-5 2.6.18 code, but the patch should
apply with a little fuzz to the linux-2.6.18-xen.hg tree.

Signed-off-by: Chris Lalancette <clalance@xxxxxxxxxx>
--- linux-2.6.18.noarch/arch/i386/kernel/pci-dma-xen.c.orig     2008-10-17 
16:58:03.000000000 +0200
+++ linux-2.6.18.noarch/arch/i386/kernel/pci-dma-xen.c  2008-10-17 
16:58:34.000000000 +0200
@@ -13,6 +13,7 @@
 #include <linux/pci.h>
 #include <linux/module.h>
 #include <linux/version.h>
+#include <linux/bootmem.h>
 #include <asm/io.h>
 #include <xen/balloon.h>
 #include <asm/swiotlb.h>
@@ -134,12 +135,33 @@ int range_straddles_page_boundary(paddr_
        unsigned long pfn = p >> PAGE_SHIFT;
        unsigned int offset = p & ~PAGE_MASK;
 
+       /*
+        * 1.  If this request is going to stay on this page, it won't
+        * cross a page boundary
+        */
        if (offset + size <= PAGE_SIZE)
                return 0;
-       if (test_bit(pfn, contiguous_bitmap))
-               return 0;
+       /*
+        * 2.  If all of the pages here are physically contiguous, we
+        * technically cross a page boundary, but that's OK
+        */
        if (check_pages_physically_contiguous(pfn, offset, size))
                return 0;
+       /*
+        * 3.  If the above two tests failed, *and* we are a page > max_low_pfn,
+        * then we have to straddle a page boundary (we won't be in the
+        * contiguous_bitmap, and attempting to access it will cause a
+        * page fault
+        */
+       if (pfn > max_low_pfn)
+               return 1;
+       /*
+        * 4.  Finally, check the contiguous bitmap for this pfn; if it's in
+        * there, we are OK.
+        */
+         
+       if (test_bit(pfn, contiguous_bitmap))
+               return 0;
        return 1;
 }
 
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>