Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=310adfdd9153f6ae818981a38a48dd2330990d8d
Commit:     310adfdd9153f6ae818981a38a48dd2330990d8d
Parent:     2fa8a050a0026eadbb39a2f281011991e00fe29a
Author:     Muli Ben-Yehuda <[EMAIL PROTECTED]>
AuthorDate: Tue Feb 13 13:26:24 2007 +0100
Committer:  Andi Kleen <[EMAIL PROTECTED]>
CommitDate: Tue Feb 13 13:26:24 2007 +0100

    [PATCH] x86-64: robustify bad_dma_address handling
    
    - set bad_dma_address explicitly to 0x0
    - reserve 32 pages from bad_dma_address and up
    - WARN_ON() a driver feeding us bad_dma_address
    
    Thanks to Leo Duran <[EMAIL PROTECTED]> for the suggestion.
    
    Signed-off-by: Muli Ben-Yehuda <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
    Cc: Leo Duran <[EMAIL PROTECTED]>
    Cc: Job Mason <[EMAIL PROTECTED]>
---
 arch/x86_64/kernel/pci-calgary.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c
index 3d65b1d..04480c3 100644
--- a/arch/x86_64/kernel/pci-calgary.c
+++ b/arch/x86_64/kernel/pci-calgary.c
@@ -138,6 +138,8 @@ static const unsigned long phb_debug_offsets[] = {
 
 #define PHB_DEBUG_STUFF_OFFSET 0x0020
 
+#define EMERGENCY_PAGES 32 /* = 128KB */
+
 unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED;
 static int translate_empty_slots __read_mostly = 0;
 static int calgary_detected __read_mostly = 0;
@@ -296,6 +298,16 @@ static void __iommu_free(struct iommu_table *tbl, 
dma_addr_t dma_addr,
 {
        unsigned long entry;
        unsigned long badbit;
+       unsigned long badend;
+
+       /* were we called with bad_dma_address? */
+       badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE);
+       if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) {
+               printk(KERN_ERR "Calgary: driver tried unmapping bad DMA "
+                      "address 0x%Lx\n", dma_addr);
+               WARN_ON(1);
+               return;
+       }
 
        entry = dma_addr >> PAGE_SHIFT;
 
@@ -656,8 +668,8 @@ static void __init calgary_reserve_regions(struct pci_dev 
*dev)
        u64 start;
        struct iommu_table *tbl = dev->sysdata;
 
-       /* reserve bad_dma_address in case it's a legal address */
-       iommu_range_reserve(tbl, bad_dma_address, 1);
+       /* reserve EMERGENCY_PAGES from bad_dma_address and up */
+       iommu_range_reserve(tbl, bad_dma_address, EMERGENCY_PAGES);
 
        /* avoid the BIOS/VGA first 640KB-1MB region */
        start = (640 * 1024);
@@ -1176,6 +1188,7 @@ int __init calgary_iommu_init(void)
        }
 
        force_iommu = 1;
+       bad_dma_address = 0x0;
        dma_ops = &calgary_dma_ops;
 
        return 0;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to