Hi David,

I have formulated a patch that prevents the update_mmu_cache from doing enything if there is no context available. This apears to have no immediate, undesirable side effects.

This worked better than the alternative of setting up a context to work with.

Can you for see any issues in doing this?

If not, can you check+apply the attached (un-mangled) patch.

diff -ruNpd linux-2.6/arch/sparc/mm/sun4c.c linux-test/arch/sparc/mm/sun4c.c
--- linux-2.6/arch/sparc/mm/sun4c.c     2007-07-30 03:19:15.000000000 +0100
+++ linux-test/arch/sparc/mm/sun4c.c    2007-07-31 08:28:13.000000000 +0100
@@ -1999,6 +2029,9 @@ void sun4c_update_mmu_cache(struct vm_ar
        unsigned long flags;
        int pseg;

+       if (vma->vm_mm->context == NO_CONTEXT)
+               return;
+
        local_irq_save(flags);
        address &= PAGE_MASK;
        if ((pseg = sun4c_get_segmap(address)) == invalid_segment) {

Regards
        Mark Fortescue.
From: Mark Fortescue <[EMAIL PROTECTED]>

This deals with a sun4c issue caused by commit 
b6a2fea39318e43fee84fa7b0b90d68bed92d2ba:
mm: variable length argument support.
The new way the code works means that sun4c_update_mmu_cache gets called before 
a context
has been selected, which results in invalid operation of the underling mm code.

Simply ignoring update requests when there is no valid context solves the 
problem.

Signed-off-by Mark Fortescue <[EMAIL PROTECTED]>
---
This worked better than the alternative of setting up a context to work with.
I definatly need to spend some time writting up the sun4c MMU and how Linux 
code uses it.
diff -ruNpd -x '.[a-z]*' linux-2.6/arch/sparc/mm/sun4c.c 
linux-test/arch/sparc/mm/sun4c.c
--- linux-2.6/arch/sparc/mm/sun4c.c     2007-07-30 03:19:15.000000000 +0100
+++ linux-test/arch/sparc/mm/sun4c.c    2007-07-31 08:28:13.000000000 +0100
@@ -1999,6 +2029,9 @@ void sun4c_update_mmu_cache(struct vm_ar
        unsigned long flags;
        int pseg;
 
+       if (vma->vm_mm->context == NO_CONTEXT)
+               return;
+
        local_irq_save(flags);
        address &= PAGE_MASK;
        if ((pseg = sun4c_get_segmap(address)) == invalid_segment) {

Reply via email to