Re: [linux-audio-dev] Re: [announce] [patch] Voluntary Kernel Preemption Patch

Andrea Arcangeli
2004-09-02T22:10:43Z

Hi Ingo,

On Mon, Jul 19, 2004 at 01:59:52PM +0200, Ingo Molnar wrote:
> yes. Btw., i'm not sure whether you've noticed but last week i've also
> created a 'clean' variant of the patch. The latest version against -mm
> is:
>
> http://redhat.com/~mingo/voluntary-preempt/voluntary-preempt-clean-2.6.7-mm7-H4
>
> this one doesnt have any of the debugging/development helpers and
> switches. I have still made it a .config option. Note how minimal the
> patch became this way.

as said in a part of a previous email might_sleep() just like BUG() can
be defined to noop.

cond_resched() is the API to use.

if you're scared that there are too many cond_resched (I'm not scared
and people should enable them anyways if they make a difference, they
still should be less than the number of spin_unlocks with preempt
enabled), then you should add a cond_resched_costly and add a config
option that turns it off. I think you don't even need to add the config
option, you can define cond_resched_costly as cond_resched, and to just
use it to mark the places that might be expensive.

Then you should change cond_resched to call might_sleep in the else
branch (as I discussed with Andrew last month).

this was the core of the patch I was playing with last month which
should be still valid and it solves the preprocessor issues with
cond_resched (and I hope the bug was not in the below code ;)

could you modify your patch accordingly? thanks!

Index: linux-2.5/include/linux/kernel.h
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/include/linux/kernel.h,v
retrieving revision 1.53
diff -u -p -r1.53 kernel.h
--- linux-2.5/include/linux/kernel.h 27 Jun 2004 17:55:19 -0000 1.53
+++ linux-2.5/include/linux/kernel.h 13 Jul 2004 02:19:43 -0000
@@ -48,12 +48,23 @@ struct completion;
#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
void __might_sleep(char *file, int line);
#define might_sleep() __might_sleep(__FILE__, __LINE__)
-#define might_sleep_if(cond) do { if (unlikely(cond)) might_sleep(); } while (0)
#else
#define might_sleep() do {} while(0)
-#define might_sleep_if(cond) do {} while (0)
#endif

+#define need_resched() unlikely(test_thread_flag(TIF_NEED_RESCHED))
+
+extern void __cond_resched(void);
+#define cond_resched() \
+do { \
+ if (need_resched()) \
+ __cond_resched(); \
+ else \
+ might_sleep(); \
+} while (0)
+
+#define cond_resched_if(cond) do { if (unlikely(cond)) cond_resched(); } while (0)
+
#define abs(x) ({ \
int __x = (x); \
(__x < 0) ? -__x : __x; \
Index: linux-2.5/include/linux/sched.h
===================================================================
RCS file: /home/andrea/crypto/cvs/linux-2.5/include/linux/sched.h,v
retrieving revision 1.245
diff -u -p -r1.245 sched.h
--- linux-2.5/include/linux/sched.h 2 Jul 2004 17:31:23 -0000 1.245
+++ linux-2.5/include/linux/sched.h 13 Jul 2004 02:33:12 -0000
@@ -1012,18 +1013,6 @@ static inline int signal_pending(struct
{
return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING));
}
-
-static inline int need_resched(void)
-{
- return unlikely(test_thread_flag(TIF_NEED_RESCHED));
-}
-
-extern void __cond_resched(void);
-static inline void cond_resched(void)
-{
- if (need_resched())
- __cond_resched();
-}

/*
* cond_resched_lock() - if a reschedule is pending, drop the given lock,