aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuji Mano <yuji.mano@am.sony.com>2009-06-15 17:04:13 -0700
committerYuji Mano <yuji.mano@am.sony.com>2009-07-07 12:25:18 -0700
commit23b7bddecf5bf23f3ba6fd945c19a9ef6e4b3e2b (patch)
tree802899e9a93a42f7a49aeb002cd5fedf6412ebcc
parentf9f5991385dd833fd01f85df9d7cd75c2a310762 (diff)
downloadmars-src-23b7bddecf5bf23f3ba6fd945c19a9ef6e4b3e2b.tar.gz
base: kernel fix idle signal
This patch is a fix to a kernel bug that causes the kernel to remain in the idle wait state even when another MPU has sent a new signal to a workload that should cause it to change state. Signed-off-by: Yuji Mano <yuji.mano@am.sony.com> Acked-by: Kazunori Asayama <asayama@sm.sony.co.jp>
-rw-r--r--base/src/mpu/kernel/kernel.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/base/src/mpu/kernel/kernel.c b/base/src/mpu/kernel/kernel.c
index f30b1ec..b2bfc28 100644
--- a/base/src/mpu/kernel/kernel.c
+++ b/base/src/mpu/kernel/kernel.c
@@ -53,6 +53,7 @@
#define MARS_KERNEL_STATUS_BUSY 0x4
#define MARS_KERNEL_STATUS_RETRY 0x8
+#define MARS_KERNEL_UPDATE_HEADER_BITS_ACCESS 0x0
#define MARS_KERNEL_UPDATE_HEADER_BITS_STATE 0x1
#define MARS_KERNEL_UPDATE_HEADER_BITS_COUNTER 0x2
#define MARS_KERNEL_UPDATE_HEADER_BITS_COUNTER_RESET 0x4
@@ -243,7 +244,7 @@ static void update_header_bits(int mode, int block)
MARS_BITS_SET(block_bits, BLOCK_WAITING, block_waiting);
MARS_BITS_SET(block_bits, BLOCK_PRIORITY, block_priority);
/* update header bits counter */
- } else {
+ } else if (mode) {
/* reset is not specified so increment current block counter */
if (mode & MARS_KERNEL_UPDATE_HEADER_BITS_COUNTER) {
block_counter =
@@ -399,6 +400,9 @@ static uint64_t set_signal_bits(uint64_t bits, uint64_t signal)
{
MARS_BITS_SET(&bits, WORKLOAD_SIGNAL, signal);
+ /* update queue header bits access in case kernel is idle */
+ update_header_bits(MARS_KERNEL_UPDATE_HEADER_BITS_ACCESS, 0);
+
return bits;
}