Re: [PATCH] De-macro spin_trylock_irq, spin_trylock_irqsave, write_trylock_irqsave

From: Jiri Slaby
Date: Sat Aug 16 2008 - 09:31:21 EST


On 08/16/2008 11:59 AM, Alexey Dobriyan wrote:
1) de-macro, remove ({ usages as side-effect,
2) change calling convention to not accept "flags" by value -- trylock
functions can modify them, so by-value is misleading, and number of users
is relatively low.
3) de-macro spin_trylock_irq() for a change.

Doesn't this break on sparc -- is it tested there? Shouldn't all that be __always_inline?

--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -320,26 +320,38 @@ do { \
#define spin_trylock_bh(lock) __cond_lock(lock, _spin_trylock_bh(lock))
-#define spin_trylock_irq(lock) \
-({ \
- local_irq_disable(); \
- spin_trylock(lock) ? \
- 1 : ({ local_irq_enable(); 0; }); \
-})
-
-#define spin_trylock_irqsave(lock, flags) \
-({ \
- local_irq_save(flags); \
- spin_trylock(lock) ? \
- 1 : ({ local_irq_restore(flags); 0; }); \
-})
-
-#define write_trylock_irqsave(lock, flags) \
-({ \
- local_irq_save(flags); \
- write_trylock(lock) ? \
- 1 : ({ local_irq_restore(flags); 0; }); \
-})
+static inline int spin_trylock_irq(spinlock_t *lock)
+{
+ local_irq_disable();
+ if (spin_trylock(lock))
+ return 1;
+ else {
+ local_irq_enable();
+ return 0;
+ }
+}
+
+static inline int spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags)
+{
+ local_irq_save(*flags);
+ if (spin_trylock(lock))
+ return 1;
+ else {
+ local_irq_restore(*flags);
+ return 0;
+ }
+}
+
+static inline int write_trylock_irqsave(rwlock_t *lock, unsigned long *flags)
+{
+ local_irq_save(*flags);
+ if (write_trylock(lock))
+ return 1;
+ else {
+ local_irq_restore(*flags);
+ return 0;
+ }
+}
/*
* Pull the atomic_t declaration:

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