Philippe Gerum wrote:
> Steven A. Falco wrote:
>> I applied the uic patch:
>>
>> diff --git a/arch/powerpc/sysdev/uic.c b/arch/powerpc/sysdev/uic.c
>> index eeb38e2..5a38086 100644
>> --- a/arch/powerpc/sysdev/uic.c
>> +++ b/arch/powerpc/sysdev/uic.c
>> @@ -48,7 +48,7 @@ struct uic {
>>     int index;
>>     int dcrbase;
>>
>> -    spinlock_t lock;
>> +    ipipe_spinlock_t lock;
>>
>>     /* The remapper for this UIC */
>>     struct irq_host    *irqhost;
>>
>> However, this would not compile because of a type mismatch.  I have
>> added the attached patch, and it now compiles and runs.  But I'm not
>> sure if this is the right way to fix it.  Comments?
>>
> 
> This will work for the purpose of running an I-pipe enabled kernel, but
> would fail with CONFIG_IPIPE disabled. Since we need to provide both,
> I'm going to work on the proper patch for fixing the issue both ways.
> Still, your patch will work as expected for running Xenomai.

To be consequent, we would have to wrap spin_lock_init just like the
other operations. Suggestion (not really tested):

Index: linux-2.6.23-ipipe/include/linux/spinlock.h
===================================================================
--- linux-2.6.23-ipipe.orig/include/linux/spinlock.h
+++ linux-2.6.23-ipipe/include/linux/spinlock.h
@@ -89,10 +89,22 @@ extern int __lockfunc generic__raw_read_
 # include <linux/spinlock_up.h>
 #endif
 
+#undef TYPE_EQUAL
+#define TYPE_EQUAL(lock, type) \
+       __builtin_types_compatible_p(typeof(lock), type *)
+
+#define spin_lock_init(lock)                                           \
+do {                                                                   \
+       if (TYPE_EQUAL((lock), __ipipe_spinlock_t))                     \
+               *(__ipipe_spinlock_t *)(lock) = IPIPE_SPIN_LOCK_UNLOCKED; \
+       else if (TYPE_EQUAL(lock, spinlock_t))                          \
+               _spin_lock_init((spinlock_t *)(lock));                  \
+} while (0)
+
 #ifdef CONFIG_DEBUG_SPINLOCK
   extern void __spin_lock_init(spinlock_t *lock, const char *name,
                               struct lock_class_key *key);
-# define spin_lock_init(lock)                                  \
+# define _spin_lock_init(lock)                                 \
 do {                                                           \
        static struct lock_class_key __key;                     \
                                                                \
@@ -100,7 +112,7 @@ do {                                                        
        \
 } while (0)
 
 #else
-# define spin_lock_init(lock)                                  \
+# define _spin_lock_init(lock)                                 \
        do { *(lock) = SPIN_LOCK_UNLOCKED; } while (0)
 #endif
 
@@ -172,10 +184,6 @@ do {                                                       
        \
 #define read_trylock(lock)             __cond_lock(lock, _read_trylock(lock))
 #define write_trylock(lock)            __cond_lock(lock, _write_trylock(lock))
 
-#undef TYPE_EQUAL
-#define TYPE_EQUAL(lock, type) \
-       __builtin_types_compatible_p(typeof(lock), type *)
-
 #define PICK_SPINOP(op, lock)                                          \
 do {                                                                   \
        if (TYPE_EQUAL((lock), __ipipe_spinlock_t))                     \


Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to