From 9e3c226782f2592d703cc15cc87128f658a8b3ad Mon Sep 17 00:00:00 2001 From: liangjiayuan <1134570045@qq.com> Date: Mon, 30 May 2022 16:53:39 +0800 Subject: [PATCH] add top_priority & add syscall about priority --- components/lwp/lwp.c | 19 +++++- components/lwp/lwp.h | 5 +- components/lwp/lwp_syscall.c | 111 ++++++++++++++++++++++++++++++++++- 3 files changed, 130 insertions(+), 5 deletions(-) diff --git a/components/lwp/lwp.c b/components/lwp/lwp.c index c842e831db..acdb4b8ac4 100644 --- a/components/lwp/lwp.c +++ b/components/lwp/lwp.c @@ -1087,7 +1087,7 @@ struct rt_lwp *lwp_self(void) return RT_NULL; } -pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) +pid_t _lwp_execve(int top_priority, char *filename, int debug, int argc, char **argv, char **envp) { int result; rt_base_t level; @@ -1151,7 +1151,7 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) if (result == RT_EOK) { rt_thread_t thread = RT_NULL; - rt_uint32_t priority = 25, tick = 200; + rt_uint32_t priority = top_priority, tick = 200; lwp_copy_stdio_fdt(lwp); @@ -1169,6 +1169,7 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) tick = app_head->tick; } #endif /* not defined ARCH_MM_MMU */ + lwp->top_priority = priority; thread = rt_thread_create(thread_name, lwp_thread_entry, RT_NULL, LWP_TASK_STACK_SIZE, priority, tick); if (thread != RT_NULL) @@ -1260,6 +1261,20 @@ pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) return -RT_ERROR; } +#define LWP_SERVICE_PRIO_TOP 15 +#define LWP_NORMAL_PRIO_TOP 25 + +pid_t lwp_execve_service(char *filename, int debug, int argc, char **argv, char **envp) +{ + return _lwp_execve(LWP_SERVICE_PRIO_TOP, filename, debug, argc, argv, envp); +} + +pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp) +{ + return _lwp_execve(LWP_NORMAL_PRIO_TOP, filename, debug, argc, argv, envp); +} + + #ifdef RT_USING_MUSL extern char **__environ; #else diff --git a/components/lwp/lwp.h b/components/lwp/lwp.h index 8a66f09ad2..df53666fe1 100644 --- a/components/lwp/lwp.h +++ b/components/lwp/lwp.h @@ -109,6 +109,8 @@ struct rt_lwp rt_uint32_t signal_in_process; lwp_sighandler_t signal_handler[_LWP_NSIG]; + int top_priority; + struct lwp_avl_struct *object_root; struct rt_mutex object_mutex; struct rt_user_context user_ctx; @@ -157,7 +159,8 @@ void lwp_mmu_switch(struct rt_thread *thread); void lwp_user_setting_save(rt_thread_t thread); void lwp_user_setting_restore(rt_thread_t thread); int lwp_setaffinity(pid_t pid, int cpu); - +pid_t lwp_execve_service(char *filename, int debug, int argc, char **argv, char **envp); +pid_t lwp_execve(char *filename, int debug, int argc, char **argv, char **envp); #ifdef RT_USING_USERSPACE struct __pthread { /* Part 1 -- these fields may be external or diff --git a/components/lwp/lwp_syscall.c b/components/lwp/lwp_syscall.c index d9916d5434..ebab06547d 100644 --- a/components/lwp/lwp_syscall.c +++ b/components/lwp/lwp_syscall.c @@ -56,7 +56,7 @@ #include #include "lwp_ipc_internal.h" - +#include #ifndef GRND_NONBLOCK #define GRND_NONBLOCK 0x0001 #endif /* GRND_NONBLOCK */ @@ -1303,6 +1303,10 @@ rt_thread_t sys_thread_create(void *arg[]) int tid = 0; lwp = rt_thread_self()->lwp; + if ((rt_uint8_t)(size_t)arg[4] < (rt_uint8_t)lwp->top_priority) + { + return RT_NULL; + } lwp_ref_inc(lwp); #ifdef RT_USING_USERSPACE user_stack = lwp_map_user(lwp, 0, (size_t)arg[3], 0); @@ -1571,6 +1575,7 @@ static void lwp_struct_copy(struct rt_lwp *dst, struct rt_lwp *src) dst->tty_old_pgrp = 0; dst->__pgrp = src->__pgrp; dst->tty = src->tty; + dst->top_priority = src->top_priority; rt_memcpy(dst->cmd, src->cmd, RT_NAME_MAX); dst->sa_flags = src->sa_flags; @@ -1693,7 +1698,7 @@ int _sys_fork(void) RT_NULL, RT_NULL, self_thread->stack_size, - self_thread->init_priority, + lwp->top_priority, self_thread->init_tick); if (!thread) { @@ -4026,6 +4031,102 @@ int sys_setaffinity(pid_t pid, int cpu) return lwp_setaffinity(pid, cpu); } +int sys_sched_setparam(pid_t pid, void *param) +{ + struct sched_param *sched_param = (struct sched_param *)param; + struct rt_lwp *lwp = NULL; + rt_thread_t main_thread; + int ret = -1; + if (!lwp_user_accessable(param, sizeof(struct sched_param))) + { + return -EFAULT; + } + if (pid > 0) + { + lwp = lwp_from_pid(pid); + } + else if (pid == 0) + { + lwp = lwp_self(); + } + if (lwp) + { + main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); + return rt_thread_control(main_thread, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&sched_param->sched_priority); + } + return ret; +} + +int sys_sched_getparam(pid_t pid, void *param) +{ + struct sched_param *sched_param = (struct sched_param *)param; + struct rt_lwp *lwp = NULL; + rt_thread_t main_thread; + int ret = -1; + if (!lwp_user_accessable(param, sizeof(struct sched_param))) + { + return -EFAULT; + } + if (pid > 0) + { + lwp = lwp_from_pid(pid); + } + else if (pid == 0) + { + lwp = lwp_self(); + } + if (lwp) + { + main_thread = rt_list_entry(lwp->t_grp.prev, struct rt_thread, sibling); + sched_param->sched_priority = main_thread->current_priority; + ret = 0; + } + return ret; +} + +int sys_sched_get_priority_max(int policy) +{ + struct rt_lwp *lwp = NULL; + int ret = -1; + lwp = lwp_self(); + if (lwp) + { + return 31 - lwp->top_priority; + } + return ret; +} + +int sys_sched_get_priority_min(int policy) +{ + return 0; +} + +int sys_sched_setscheduler(int tid, int policy, void *param) +{ + struct sched_param *sched_param = (struct sched_param *)param; + rt_thread_t thread = lwp_tid_get_thread(tid); + + if (!lwp_user_accessable(param, sizeof(struct sched_param))) + { + return -EFAULT; + } + return rt_thread_control(thread, RT_THREAD_CTRL_CHANGE_PRIORITY, (void *)&sched_param->sched_priority); + return 0; +} + +int sys_sched_getscheduler(int tid, int *policy, void *param) +{ + struct sched_param *sched_param = (struct sched_param *)param; + rt_thread_t thread = lwp_tid_get_thread(tid); + if (!lwp_user_accessable(sched_param, sizeof(struct sched_param))) + { + return -EFAULT; + } + sched_param->sched_priority = thread->current_priority; + *policy = 0; + return 0; +} + const static void* func_table[] = { (void *)sys_exit, /* 01 */ @@ -4214,6 +4315,12 @@ const static void* func_table[] = (void *)sys_notimpl, // (void *)sys_readlink /* 145 */ SYSCALL_USPACE(sys_mremap), SYSCALL_USPACE(sys_madvise), + (void *)sys_sched_setparam, + (void *)sys_sched_getparam, + (void *)sys_sched_get_priority_max, + (void *)sys_sched_get_priority_min, + (void *)sys_sched_setscheduler, + (void *)sys_sched_getscheduler, }; const void *lwp_get_sys_api(rt_uint32_t number) -- Gitee