Commit c3921ab71507b108d51a0f1ee960f80cd668a93d

Authored by Linus Torvalds
1 parent 9662369786

Add new 'cond_resched_bkl()' helper function

It acts exactly like a regular 'cond_resched()', but will not get
optimized away when CONFIG_PREEMPT is set.

Normal kernel code is already preemptable in the presense of
CONFIG_PREEMPT, so cond_resched() is optimized away (see commit
02b67cc3ba36bdba351d6c3a00593f4ec550d9d3 "sched: do not do
cond_resched() when CONFIG_PREEMPT").

But when wanting to conditionally reschedule while holding a lock, you
need to use "cond_sched_lock(lock)", and the new function is the BKL
equivalent of that.

Also make fs/locks.c use it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 3 changed files with 6 additions and 4 deletions Side-by-side Diff

... ... @@ -773,7 +773,7 @@
773 773 * give it the opportunity to lock the file.
774 774 */
775 775 if (found)
776   - cond_resched();
  776 + cond_resched_bkl();
777 777  
778 778 find_conflict:
779 779 for_each_lock(inode, before) {
include/linux/sched.h
... ... @@ -2037,13 +2037,13 @@
2037 2037 * cond_resched_lock() will drop the spinlock before scheduling,
2038 2038 * cond_resched_softirq() will enable bhs before scheduling.
2039 2039 */
  2040 +extern int _cond_resched(void);
2040 2041 #ifdef CONFIG_PREEMPT
2041 2042 static inline int cond_resched(void)
2042 2043 {
2043 2044 return 0;
2044 2045 }
2045 2046 #else
2046   -extern int _cond_resched(void);
2047 2047 static inline int cond_resched(void)
2048 2048 {
2049 2049 return _cond_resched();
... ... @@ -2051,6 +2051,10 @@
2051 2051 #endif
2052 2052 extern int cond_resched_lock(spinlock_t * lock);
2053 2053 extern int cond_resched_softirq(void);
  2054 +static inline int cond_resched_bkl(void)
  2055 +{
  2056 + return _cond_resched();
  2057 +}
2054 2058  
2055 2059 /*
2056 2060 * Does a critical section need to be broken due to another
... ... @@ -5525,7 +5525,6 @@
5525 5525 } while (need_resched());
5526 5526 }
5527 5527  
5528   -#if !defined(CONFIG_PREEMPT) || defined(CONFIG_PREEMPT_VOLUNTARY)
5529 5528 int __sched _cond_resched(void)
5530 5529 {
5531 5530 if (need_resched() && !(preempt_count() & PREEMPT_ACTIVE) &&
... ... @@ -5536,7 +5535,6 @@
5536 5535 return 0;
5537 5536 }
5538 5537 EXPORT_SYMBOL(_cond_resched);
5539   -#endif
5540 5538  
5541 5539 /*
5542 5540 * cond_resched_lock() - if a reschedule is pending, drop the given lock,