From 9c5f93142abd8e45a8cb66fd16cdf5761dfdbab3 Mon Sep 17 00:00:00 2001 From: NicJA Date: Wed, 13 May 2015 00:42:49 +0000 Subject: [PATCH] fix usage of krnspinlock & wip changes to set TS_SPIN for tasks spinning on spin locks. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@50655 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- arch/arm-native/exec/exec_platform.h | 16 +++++++--- arch/arm-native/exec/platform_init.c | 59 +++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 6 deletions(-) diff --git a/arch/arm-native/exec/exec_platform.h b/arch/arm-native/exec/exec_platform.h index 5cbed9a4e0..41faf14c32 100644 --- a/arch/arm-native/exec/exec_platform.h +++ b/arch/arm-native/exec/exec_platform.h @@ -10,13 +10,19 @@ #if defined(__AROSEXEC_SMP__) #include +#include + +extern struct Hook Exec_TaskSpinLockFailHook; +extern void Exec_TaskSpinUnlock(spinlock_t *); extern void Kernel_40_KrnSpinInit(spinlock_t *, void *); -#define EXEC_SPINLOCK_INIT(a) Kernel_40_KrnSpinInit(a,NULL) -extern void Kernel_43_KrnSpinLock(spinlock_t *, ULONG, void *); -#define EXEC_SPINLOCK_LOCK(a,b) Kernel_43_KrnSpinLock(a,b,NULL) +#define EXEC_SPINLOCK_INIT(a) Kernel_40_KrnSpinInit((a), NULL) +extern spinlock_t *Kernel_43_KrnSpinLock(spinlock_t *, struct Hook *, ULONG, void *); +#define EXEC_SPINLOCK_LOCK(a,b) Kernel_43_KrnSpinLock((a), &Exec_TaskSpinLockFailHook, (b), NULL) extern void Kernel_44_KrnSpinUnLock(spinlock_t *, void *); -#define EXEC_SPINLOCK_UNLOCK(a) Kernel_44_KrnSpinUnLock(a,NULL) +#define EXEC_SPINLOCK_UNLOCK(a) Kernel_44_KrnSpinUnLock((a), NULL); \ + Exec_TaskSpinUnlock((a)) + #endif #include "tls.h" @@ -31,7 +37,7 @@ struct Exec_PlatformData #define SET_THIS_TASK(x) TLS_SET(ThisTask,(x)) #else #define SET_THIS_TASK(x) TLS_SET(ThisTask,(x)); \ - KrnSpinLock(&PrivExecBase(SysBase)->TaskRunningSpinLock, SPINLOCK_MODE_WRITE); \ + KrnSpinLock(&PrivExecBase(SysBase)->TaskRunningSpinLock, NULL, SPINLOCK_MODE_WRITE); \ AddHead(&PrivExecBase(SysBase)->TaskRunning, (struct Node *)(x)); \ KrnSpinUnLock(&PrivExecBase(SysBase)->TaskRunningSpinLock) #endif diff --git a/arch/arm-native/exec/platform_init.c b/arch/arm-native/exec/platform_init.c index 8f578c2ea2..9041d06cc8 100644 --- a/arch/arm-native/exec/platform_init.c +++ b/arch/arm-native/exec/platform_init.c @@ -22,6 +22,9 @@ #include #include "exec_intern.h" +#if defined(__AROSEXEC_SMP__) +#include "etask.h" +#endif /* Linked from kernel.resource, * need to retrieve in a cleaner fashion .. */ @@ -67,7 +70,12 @@ int Exec_ARMCPUInit(struct ExecBase *SysBase) if (CPUIdleTask) { - D(bug("[Exec] %s: %s Task created @ 0x%p\n", __PRETTY_FUNCTION__, CPUIdleTask->tc_Node.ln_Name, CPUIdleTask)); + D( + bug("[Exec] %s: %s Task created @ 0x%p\n", __PRETTY_FUNCTION__, CPUIdleTask->tc_Node.ln_Name, CPUIdleTask); +#if defined(__AROSEXEC_SMP__) + bug("[Exec] %s: CPU Affinity : %08x\n", __PRETTY_FUNCTION__, GetIntETask(CPUIdleTask)->iet_CpuAffinity); +#endif + ) } #if defined(__AROSEXEC_SMP__) } @@ -76,4 +84,53 @@ int Exec_ARMCPUInit(struct ExecBase *SysBase) return TRUE; } +#if defined(__AROSEXEC_SMP__) +struct Hook Exec_TaskSpinLockFailHook; + +AROS_UFH3(void, Exec_TaskSpinLockFailFunc, + AROS_UFHA(struct Hook *, h, A0), + AROS_UFHA(void *, unused, A2), + AROS_UFHA(APTR, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct Task *thisTask = GET_THIS_TASK; + + /* tell the schedular that the task is waiting on a spinlock */ + thisTask->tc_State = TS_SPIN; + + AROS_USERFUNC_EXIT +} + +void Exec_TaskSpinUnlock(spinlock_t *thisLock) +{ +#if (0) + struct Task *curTask, *tmp; + + ForeachNodeSafe(&PrivExecBase(SysBase)->TaskSpinning, (struct Node *)curTask, tmp) + { + if (curTask-> == thisLock) + { + Kernel_43_KrnSpinLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL, + SPINLOCK_MODE_WRITE); + Disable(); + Remove(&curTask->tc_Node); + Enqueue(&SysBase->TaskReady, &task->tc_Node); + Kernel_44_KrnSpinUnLock(&PrivExecBase(SysBase)->TaskReadySpinLock, NULL); + Enable(); + } + } + Kernel_44_KrnSpinUnLock(&PrivExecBase(SysBase)->TaskSpinningLock, NULL); +#endif +} + +int Exec_TaskSpinningInit(struct ExecBase *SysBase) +{ + /* setup the task spinning hook */ + Exec_TaskSpinLockFailHook.h_Entry = (HOOKFUNC)Exec_TaskSpinLockFailFunc; +} + +ADD2INITLIB(Exec_TaskSpinningInit, 125) +#endif + ADD2INITLIB(Exec_ARMCPUInit, 0) -- 2.11.4.GIT