You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2024/04/30 14:34:31 UTC
(nuttx) branch master updated: sched/sched: There is no need to use sched_[un]lock
This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 8a6aa5f5bf sched/sched: There is no need to use sched_[un]lock
8a6aa5f5bf is described below
commit 8a6aa5f5bfe064caad96a41ace1bcd02e7e8dbab
Author: hujun5 <hu...@xiaomi.com>
AuthorDate: Tue Apr 16 09:36:10 2024 +0800
sched/sched: There is no need to use sched_[un]lock
purpose:
1 sched_lock is very time-consuming, and reducing its invocations can improve performance.
2 sched_lock is prone to misuse, and narrowing its scope of use is to prevent people from referencing incorrect code and using it
test:
We can use qemu for testing.
compiling
make distclean -j20; ./tools/configure.sh -l qemu-armv8a:nsh_smp ;make -j20
running
qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic -machine virt,virtualization=on,gic-version=3 -net none -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -kernel ./nuttx
We have also tested this patch on other ARM hardware platforms.
Signed-off-by: hujun5 <hu...@xiaomi.com>
---
sched/sched/sched_getaffinity.c | 6 ++++--
sched/sched/sched_getparam.c | 5 +++--
sched/sched/sched_waitid.c | 22 ++--------------------
sched/sched/sched_waitpid.c | 30 ++----------------------------
4 files changed, 11 insertions(+), 52 deletions(-)
diff --git a/sched/sched/sched_getaffinity.c b/sched/sched/sched_getaffinity.c
index b94f997eb2..5c350758e9 100644
--- a/sched/sched/sched_getaffinity.c
+++ b/sched/sched/sched_getaffinity.c
@@ -69,13 +69,15 @@
int nxsched_get_affinity(pid_t pid, size_t cpusetsize, FAR cpu_set_t *mask)
{
FAR struct tcb_s *tcb;
+ irqstate_t flags;
int ret;
DEBUGASSERT(cpusetsize == sizeof(cpu_set_t) && mask != NULL);
/* Verify that the PID corresponds to a real task */
- sched_lock();
+ flags = enter_critical_section();
+
if (pid == 0)
{
tcb = this_task();
@@ -97,7 +99,7 @@ int nxsched_get_affinity(pid_t pid, size_t cpusetsize, FAR cpu_set_t *mask)
ret = OK;
}
- sched_unlock();
+ leave_critical_section(flags);
return ret;
}
diff --git a/sched/sched/sched_getparam.c b/sched/sched/sched_getparam.c
index fd196be53b..89320cd886 100644
--- a/sched/sched/sched_getparam.c
+++ b/sched/sched/sched_getparam.c
@@ -70,6 +70,7 @@ int nxsched_get_param(pid_t pid, FAR struct sched_param *param)
{
FAR struct tcb_s *rtcb;
FAR struct tcb_s *tcb;
+ irqstate_t flags;
int ret = OK;
if (param == NULL)
@@ -93,7 +94,7 @@ int nxsched_get_param(pid_t pid, FAR struct sched_param *param)
{
/* Get the TCB associated with this PID */
- sched_lock();
+ flags = enter_critical_section();
tcb = nxsched_get_tcb(pid);
if (!tcb)
{
@@ -137,7 +138,7 @@ int nxsched_get_param(pid_t pid, FAR struct sched_param *param)
#endif
}
- sched_unlock();
+ leave_critical_section(flags);
}
return ret;
diff --git a/sched/sched/sched_waitid.c b/sched/sched/sched_waitid.c
index 0dcbb087fe..22188f5755 100644
--- a/sched/sched/sched_waitid.c
+++ b/sched/sched/sched_waitid.c
@@ -152,6 +152,7 @@ int waitid(idtype_t idtype, id_t id, FAR siginfo_t *info, int options)
FAR struct child_status_s *child;
bool retains;
#endif
+ irqstate_t flags;
sigset_t set;
int errcode;
int ret;
@@ -198,18 +199,7 @@ int waitid(idtype_t idtype, id_t id, FAR siginfo_t *info, int options)
sigemptyset(&set);
nxsig_addset(&set, SIGCHLD);
-
- /* NOTE: sched_lock() is not enough for SMP
- * because the child task is running on another CPU
- */
-
-#ifdef CONFIG_SMP
- irqstate_t flags = enter_critical_section();
-#else
- /* Disable pre-emption so that nothing changes while the loop executes */
-
- sched_lock();
-#endif
+ flags = enter_critical_section();
/* Verify that this task actually has children and that the requested
* TCB is actually a child of this task.
@@ -464,20 +454,12 @@ int waitid(idtype_t idtype, id_t id, FAR siginfo_t *info, int options)
}
}
-#ifdef CONFIG_SMP
leave_critical_section(flags);
-#else
- sched_unlock();
-#endif
leave_cancellation_point();
return OK;
errout:
-#ifdef CONFIG_SMP
leave_critical_section(flags);
-#else
- sched_unlock();
-#endif
leave_cancellation_point();
set_errno(errcode);
return ERROR;
diff --git a/sched/sched/sched_waitpid.c b/sched/sched/sched_waitpid.c
index 078a35a7ba..ff77a83e44 100644
--- a/sched/sched/sched_waitpid.c
+++ b/sched/sched/sched_waitpid.c
@@ -101,13 +101,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
* because the child task is running on another CPU
*/
-#ifdef CONFIG_SMP
irqstate_t flags = enter_critical_section();
-#else
- /* Disable pre-emption so that nothing changes in the following tests */
-
- sched_lock();
-#endif
/* Get the TCB corresponding to this PID */
@@ -198,12 +192,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
ret = pid;
errout:
-#ifdef CONFIG_SMP
leave_critical_section(flags);
-#else
- sched_unlock();
-#endif
-
return ret;
}
@@ -230,6 +219,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
bool retains;
#endif
FAR struct siginfo info;
+ irqstate_t flags;
sigset_t set;
int ret;
@@ -237,18 +227,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
sigemptyset(&set);
nxsig_addset(&set, SIGCHLD);
-
- /* NOTE: sched_lock() is not enough for SMP
- * because the child task is running on another CPU
- */
-
-#ifdef CONFIG_SMP
- irqstate_t flags = enter_critical_section();
-#else
- /* Disable pre-emption so that nothing changes while the loop executes */
-
- sched_lock();
-#endif
+ flags = enter_critical_section();
/* Verify that this task actually has children and that the requested PID
* is actually a child of this task.
@@ -495,12 +474,7 @@ pid_t nxsched_waitpid(pid_t pid, int *stat_loc, int options)
ret = pid;
errout:
-#ifdef CONFIG_SMP
leave_critical_section(flags);
-#else
- sched_unlock();
-#endif
-
return ret;
}
#endif /* CONFIG_SCHED_HAVE_PARENT */