Re: [PATCH] spin_unlock_bh() and preempt_check_resched()

From: Samuel Thibault
Date: Sat May 21 2005 - 10:52:06 EST


Hi,

Samuel Thibault, le Fri 20 May 2005 17:18:46 +0200, a dit :
> I'm wondering about macros like _spin_unlock_bh(lock):
> do { \
> _raw_spin_unlock(lock); \
> preempt_enable(); \
> local_bh_enable(); \
> __release(lock); \
> } while (0)
>
> Is there a reason for using preempt_enable() instead of a simple
> preempt_enable_no_resched() ?
>
> Since we know bottom halves are disabled, preempt_schedule() will always
> return at once (preempt_count!=0), and hence preempt_check_resched() is
> useless here...

Here is a patch.

Avoid useless preempt_check_resched() just before re-enabling bottom
halves.
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>

diff -urNp linux-2.6-git/include/linux/spinlock.h linux-2.6-git-mine/include/linux/spinlock.h
--- linux-2.6-git/include/linux/spinlock.h 2005-05-21 15:41:33.000000000 +0200
+++ linux-2.6-git-mine/include/linux/spinlock.h 2005-05-21 15:45:11.000000000 +0200
@@ -248,7 +248,7 @@

#define _spin_trylock_bh(lock) ({preempt_disable(); local_bh_disable(); \
_raw_spin_trylock(lock) ? \
- 1 : ({preempt_enable(); local_bh_enable(); 0;});})
+ 1 : ({preempt_enable_no_resched(); local_bh_enable(); 0;});})

#define _spin_lock(lock) \
do { \
@@ -383,7 +383,7 @@
#define _spin_unlock_bh(lock) \
do { \
_raw_spin_unlock(lock); \
- preempt_enable(); \
+ preempt_enable_no_resched(); \
local_bh_enable(); \
__release(lock); \
} while (0)
@@ -391,7 +391,7 @@
#define _write_unlock_bh(lock) \
do { \
_raw_write_unlock(lock); \
- preempt_enable(); \
+ preempt_enable_no_resched(); \
local_bh_enable(); \
__release(lock); \
} while (0)
@@ -423,8 +423,8 @@
#define _read_unlock_bh(lock) \
do { \
_raw_read_unlock(lock); \
+ preempt_enable_no_resched(); \
local_bh_enable(); \
- preempt_enable(); \
__release(lock); \
} while (0)

diff -urNp linux-2.6-git/kernel/spinlock.c linux-2.6-git-mine/kernel/spinlock.c
--- linux-2.6-git/kernel/spinlock.c 2005-05-21 15:41:08.000000000 +0200
+++ linux-2.6-git-mine/kernel/spinlock.c 2005-05-21 15:42:36.000000000 +0200
@@ -294,7 +294,7 @@
void __lockfunc _spin_unlock_bh(spinlock_t *lock)
{
_raw_spin_unlock(lock);
- preempt_enable();
+ preempt_enable_no_resched();
local_bh_enable();
}
EXPORT_SYMBOL(_spin_unlock_bh);
@@ -318,7 +318,7 @@
void __lockfunc _read_unlock_bh(rwlock_t *lock)
{
_raw_read_unlock(lock);
- preempt_enable();
+ preempt_enable_no_resched();
local_bh_enable();
}
EXPORT_SYMBOL(_read_unlock_bh);
@@ -342,7 +342,7 @@
void __lockfunc _write_unlock_bh(rwlock_t *lock)
{
_raw_write_unlock(lock);
- preempt_enable();
+ preempt_enable_no_resched();
local_bh_enable();
}
EXPORT_SYMBOL(_write_unlock_bh);
@@ -354,7 +354,7 @@ int __lockfunc _spin_trylock_bh(spinlock
if (_raw_spin_trylock(lock))
return 1;

- preempt_enable();
+ preempt_enable_no_resched();
local_bh_enable();
return 0;
}

Regards,
Samuel Thibault
-
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/