mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 08:51:13 +00:00
65 lines
2.8 KiB
Diff
65 lines
2.8 KiB
Diff
|
From cba59b243d542f3de9c534d99b2f3f33e50b3ebb Mon Sep 17 00:00:00 2001
|
||
|
From: Jason Uhlenkott <jasonuhl@jasonuhl.org>
|
||
|
Date: Fri, 25 Jul 2008 23:06:20 +0100
|
||
|
Subject: [PATCH] sdio: use interruptible sleep in kthread main loops
|
||
|
|
||
|
My FreeRunner's load average was leveling off at 2.00 as a result of
|
||
|
these two kernel threads:
|
||
|
|
||
|
SDIO Helper D c02b4500 0 255 2
|
||
|
[<c02b4298>] (schedule+0x0/0x2d4) from [<c02b4040>] (__down+0x100/0x158)
|
||
|
[<c02b3f40>] (__down+0x0/0x158) from [<c02b3e2c>] (__down_failed+0xc/0x20)
|
||
|
r7:00000000 r6:c01fbd64 r5:c7cb7134 r4:c7d58000
|
||
|
[<c01fa6fc>] (CardDetectHelperFunction+0x0/0x1ac) from [<c01fbd80>] (HelperLaunch+0x1c/0x28)
|
||
|
r5:c7cb7134 r4:c7cb7134
|
||
|
[<c01fbd64>] (HelperLaunch+0x0/0x28) from [<c005bbd0>] (kthread+0x60/0x94)
|
||
|
r4:c7d58000
|
||
|
[<c005bb70>] (kthread+0x0/0x94) from [<c0048f7c>] (do_exit+0x0/0x744)
|
||
|
r6:00000000 r5:00000000 r4:00000000
|
||
|
|
||
|
SDIO Helper D c02b4500 0 259 2
|
||
|
[<c02b4298>] (schedule+0x0/0x2d4) from [<c02b4040>] (__down+0x100/0x158)
|
||
|
[<c02b3f40>] (__down+0x0/0x158) from [<c02b3e2c>] (__down_failed+0xc/0x20)
|
||
|
r7:c0382bb4 r6:c0382b34 r5:c7d5a000 r4:00000001
|
||
|
[<c01f9104>] (SDIOIrqHelperFunction+0x0/0x29c) from [<c01fbd80>] (HelperLaunch+0x1c/0x28)
|
||
|
r8:00000000 r7:00000000 r6:c01fbd64 r5:c0382bb4 r4:c0382bb4
|
||
|
[<c01fbd64>] (HelperLaunch+0x0/0x28) from [<c005bbd0>] (kthread+0x60/0x94)
|
||
|
r4:c7d5a000
|
||
|
[<c005bb70>] (kthread+0x0/0x94) from [<c0048f7c>] (do_exit+0x0/0x744)
|
||
|
r6:00000000 r5:00000000 r4:00000000
|
||
|
|
||
|
This fixes them to use interruptible sleep primitives while waiting in
|
||
|
their main loops, as is conventional for kernel threads. They can't
|
||
|
actually be interrupted since kernel threads ignore all signals, but
|
||
|
by sleeping this way they get classified as long term waiters, and
|
||
|
don't get counted as running for purposes of load average calculation.
|
||
|
|
||
|
This is intended as a minimal fix. In the longer term, it'd probably
|
||
|
make sense to replace the semaphores with completions or something,
|
||
|
and to do away with some of these StudlyCapped wrapper functions.
|
||
|
|
||
|
Signed-off-by: Jason Uhlenkott <jasonuhl@jasonuhl.org>
|
||
|
--
|
||
|
|
||
|
This is untested, but what could possibly go wrong? ;)
|
||
|
---
|
||
|
include/linux/sdio/ctsystem_linux.h | 2 +-
|
||
|
1 files changed, 1 insertions(+), 1 deletions(-)
|
||
|
|
||
|
diff --git a/include/linux/sdio/ctsystem_linux.h b/include/linux/sdio/ctsystem_linux.h
|
||
|
index 0de89a6..c9e44f2 100644
|
||
|
--- a/include/linux/sdio/ctsystem_linux.h
|
||
|
+++ b/include/linux/sdio/ctsystem_linux.h
|
||
|
@@ -968,7 +968,7 @@ typedef struct _OSKERNEL_HELPER {
|
||
|
}
|
||
|
|
||
|
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
||
|
-#define SD_WAIT_FOR_WAKEUP(p) SignalWait(&(p)->WakeSignal);
|
||
|
+#define SD_WAIT_FOR_WAKEUP(p) SignalWaitInterruptible(&(p)->WakeSignal);
|
||
|
|
||
|
#define CT_LE16_TO_CPU_ENDIAN(x) __le16_to_cpu(x)
|
||
|
#define CT_LE32_TO_CPU_ENDIAN(x) __le32_to_cpu(x)
|
||
|
--
|
||
|
1.5.6.3
|
||
|
|