On Wed, 2005-03-09 at 19:47 -0800, Linus Torvalds wrote:
> 
> On Wed, 9 Mar 2005, Omkhar Arasaratnam wrote:
> > 
> > I confirmed that this occurs with the 2.6.11 code straight from 
> > kernel.org Here is an error from the bringup:
> 
> So if 2.6.9 works, and 2.6.11 does not, can you check 2.6.10? And perhaps 
> hunt it down even more, to a -rc release?
> 
> > sym0: No NVRAM, ID 7, Fast-80 LVD, parity checking
> > CACHE TEST FAILED: DMA error (dstat=0xa0) .sym0: CACHE INCORRECTLY 
> > CONFIGURED
> > sym0: giving up ...
> 
> There are certainly sym changes in there too since 2.6.9, let's see if 
> James or Willy have any suggestions. It might not be ppc64-specific.

Ok, we have it working here on a similar machine with 2.6.11 and failing
in a similar way with bk which is why I asked ;)

The bk problem is found & fixed here tho. I'll send a patch later, it's
a bug with ppc64 iounmap() not properly flushing the hash table after
the set_pte_at() patch due to some crap in our custom implementation of
that guy.

Here's the patch, but I want to get rid of that stuff anyway (at least
make unmap_vm_area take the "mm", or rather make an unmap_vm_area_mm()
and make unmap_vm_area() just call it and then use that instead of our
own implementation, but I'm waiting for Hugh cleanup to get in before
touching any of this).

--

This patch fixes a bug in ppc64 local implementation of iounmap() that
would cause it to incorrectly flush the hash table since the changes to
set_pte have been applied.

Signed-off-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]>

Index: working-2.6/arch/ppc64/mm/init.c
===================================================================
--- working-2.6.orig/arch/ppc64/mm/init.c       2005-03-07 13:06:23.000000000 
+1100
+++ working-2.6/arch/ppc64/mm/init.c    2005-03-10 12:59:50.000000000 +1100
@@ -288,7 +288,7 @@
 static void unmap_im_area_pte(pmd_t *pmd, unsigned long address,
                                  unsigned long size)
 {
-       unsigned long end;
+       unsigned long base, end;
        pte_t *pte;
 
        if (pmd_none(*pmd))
@@ -300,6 +300,7 @@
        }
 
        pte = pte_offset_kernel(pmd, address);
+       base = address & PMD_MASK;
        address &= ~PMD_MASK;
        end = address + size;
        if (end > PMD_SIZE)
@@ -307,7 +308,7 @@
 
        do {
                pte_t page;
-               page = ptep_get_and_clear(&ioremap_mm, address, pte);
+               page = ptep_get_and_clear(&ioremap_mm, base + address, pte);
                address += PAGE_SIZE;
                pte++;
                if (pte_none(page))
@@ -321,7 +322,7 @@
 static void unmap_im_area_pmd(pgd_t *dir, unsigned long address,
                                  unsigned long size)
 {
-       unsigned long end;
+       unsigned long base, end;
        pmd_t *pmd;
 
        if (pgd_none(*dir))
@@ -333,13 +334,14 @@
        }
 
        pmd = pmd_offset(dir, address);
+       base = address & PGDIR_MASK;
        address &= ~PGDIR_MASK;
        end = address + size;
        if (end > PGDIR_SIZE)
                end = PGDIR_SIZE;
 
        do {
-               unmap_im_area_pte(pmd, address, end - address);
+               unmap_im_area_pte(pmd, base + address, end - address);
                address = (address + PMD_SIZE) & PMD_MASK;
                pmd++;
        } while (address < end);


 

Ben.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to