(sorry, untested for lack of hardware)
--
xmon uses a bit lock spinlock but doesn't close the critical section
when releasing it. It doesn't seem like a big deal because it will
eventually break out of the lock anyway, but presumably that's only
in exceptional cases where some error is tolerated, while the lack of a memory
barrier could allow incorrect results during normal functioning operation
as well.

Convert it to use a regular spinlock instead.

Signed-off-by: Nick Piggin <[EMAIL PROTECTED]>
Acked-by: Benjamin Herrenschmidt <[EMAIL PROTECTED]>
---
Index: linux-2.6/arch/ppc/xmon/start.c
===================================================================
--- linux-2.6.orig/arch/ppc/xmon/start.c
+++ linux-2.6/arch/ppc/xmon/start.c
@@ -92,16 +92,14 @@ xmon_write(void *handle, void *ptr, int 
 {
        char *p = ptr;
        int i, c, ct;
-
-#ifdef CONFIG_SMP
-       static unsigned long xmon_write_lock;
+       static DEFINE_SPINLOCK(xmon_write_lock);
        int lock_wait = 1000000;
        int locked;
 
-       while ((locked = test_and_set_bit(0, &xmon_write_lock)) != 0)
+       while (!(locked = spin_trylock(&xmon_write_lock))) {
                if (--lock_wait == 0)
                        break;
-#endif
+       }
 
        if (!scc_initialized)
                xmon_init_scc();
@@ -122,10 +120,9 @@ xmon_write(void *handle, void *ptr, int 
                eieio();
        }
 
-#ifdef CONFIG_SMP
-       if (!locked)
-               clear_bit(0, &xmon_write_lock);
-#endif
+       if (locked)
+               spin_unlock(&xmon_write_lock);
+
        return nb;
 }
 
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to