Sebastian Smolorz wrote:
> Hello Philippe,
> 
> here comes a more serious bug than the one from yesterday. When I try to
>  boot a system patched with the latest ipipe on a PIII the attached boot
> log will show up. config also attached.
>

This bug affects all UP configurations that do not enable any spinlock debugging
option. Fixed in 2.6.27-x86-2.1-02. Given the severity of this bug, 2.4.6.1 is
due soon, with the fixed patch.

http://download.gna.org/adeos/patches/v2.6/x86/adeos-ipipe-2.6.27-x86-2.1-02.patch

Thanks,

diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
index daa90f8..2044388 100644
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -255,6 +255,14 @@ do {                                                       
                \
                flags = _spin_lock_irqsave((spinlock_t *)(lock));       \
        else __bad_spinlock_type();                                     \
 } while (0)
+#define PICK_SPINLOCK_IRQSAVE_NESTED(lock, flags, subclass)            \
+do {                                                                   \
+       if (TYPE_EQUAL((lock), __ipipe_spinlock_t)) {                   \
+               (flags) = __ipipe_spin_lock_irqsave(&((__ipipe_spinlock_t
*)(lock))->__raw_lock); \
+       } else if (TYPE_EQUAL(lock, spinlock_t))                        \
+               flags = _spin_lock_irqsave_nested((spinlock_t *)(lock), 
subclass); \
+       else __bad_spinlock_type();                                     \
+} while (0)
 #else
 #define PICK_SPINLOCK_IRQSAVE(lock, flags)                             \
 do {                                                                   \
@@ -312,13 +320,13 @@ do {                                                      
                \
 #define spin_lock_irqsave_nested(lock, flags, subclass)                        
\
        do {                                                            \
                typecheck(unsigned long, flags);                        \
-               flags = _spin_lock_irqsave_nested(lock, subclass);      \
+               PICK_SPINLOCK_IRQSAVE_NESTED(lock, flags, subclass);    \
        } while (0)
 #else
 #define spin_lock_irqsave_nested(lock, flags, subclass)                        
\
        do {                                                            \
                typecheck(unsigned long, flags);                        \
-               flags = _spin_lock_irqsave(lock);                       \
+               PICK_SPINLOCK_IRQSAVE(lock, flags);                     \
        } while (0)
 #endif

@@ -327,7 +335,7 @@ do {                                                        
                \
 #define spin_lock_irqsave(lock, flags)                 \
        do {                                            \
                typecheck(unsigned long, flags);        \
-               _spin_lock_irqsave(lock, flags);        \
+               PICK_SPINLOCK_IRQSAVE(lock, flags);     \
        } while (0)
 #define read_lock_irqsave(lock, flags)                 \
        do {                                            \


-- 
Philippe.

_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main

Reply via email to