4
0
mirror of https://github.com/RT-Thread/rt-thread.git synced 2025-02-27 23:47:05 +08:00

🐞 fix: fix taskset (#8211)

This commit is contained in:
xqyjlj 2023-11-02 23:12:44 +08:00 committed by GitHub
parent f806d6edd1
commit 5ad6a6f2c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 17 deletions

View File

@ -350,6 +350,9 @@ rt_lwp_t lwp_create(rt_base_t flags)
/* minimal setup of lwp object */ /* minimal setup of lwp object */
new_lwp->session = -1; new_lwp->session = -1;
new_lwp->ref = 1; new_lwp->ref = 1;
#ifdef RT_USING_SMP
new_lwp->bind_cpu = RT_CPUS_NR;
#endif
rt_list_init(&new_lwp->wait_list); rt_list_init(&new_lwp->wait_list);
rt_list_init(&new_lwp->t_grp); rt_list_init(&new_lwp->t_grp);
rt_list_init(&new_lwp->timer); rt_list_init(&new_lwp->timer);

View File

@ -5217,20 +5217,24 @@ ssize_t sys_readlink(char* path, char *buf, size_t bufsz)
return bufsz; return bufsz;
} }
sysret_t sys_setaffinity(pid_t pid, size_t size, void *set) sysret_t sys_sched_setaffinity(pid_t pid, size_t size, void *set)
{ {
void *kset = RT_NULL; void *kset = RT_NULL;
if (!lwp_user_accessable((void *)set, sizeof(cpu_set_t))) if (size <= 0 || size > sizeof(cpu_set_t))
{
return -EINVAL;
}
if (!lwp_user_accessable((void *)set, size))
return -EFAULT; return -EFAULT;
kset = kmem_get(sizeof(*kset)); kset = kmem_get(size);
if (kset == RT_NULL) if (kset == RT_NULL)
{ {
return -ENOMEM; return -ENOMEM;
} }
if (lwp_get_from_user(kset, set, sizeof(cpu_set_t)) != sizeof(cpu_set_t)) if (lwp_get_from_user(kset, set, size) != size)
{ {
kmem_put(kset); kmem_put(kset);
return -EINVAL; return -EINVAL;
@ -5238,7 +5242,7 @@ sysret_t sys_setaffinity(pid_t pid, size_t size, void *set)
for (int i = 0;i < size * 8; i++) for (int i = 0;i < size * 8; i++)
{ {
if (CPU_ISSET(i, (cpu_set_t *)kset)) if (CPU_ISSET_S(i, size, kset))
{ {
kmem_put(kset); kmem_put(kset);
return lwp_setaffinity(pid, i); return lwp_setaffinity(pid, i);
@ -5250,11 +5254,11 @@ sysret_t sys_setaffinity(pid_t pid, size_t size, void *set)
return -1; return -1;
} }
sysret_t sys_getaffinity(const pid_t pid, size_t size, void *set) sysret_t sys_sched_getaffinity(const pid_t pid, size_t size, void *set)
{ {
#ifdef ARCH_MM_MMU #ifdef ARCH_MM_MMU
DEF_RETURN_CODE(rc); DEF_RETURN_CODE(rc);
cpu_set_t mask; void *mask;
struct rt_lwp *lwp; struct rt_lwp *lwp;
rt_bool_t need_release = RT_FALSE; rt_bool_t need_release = RT_FALSE;
@ -5266,6 +5270,13 @@ sysret_t sys_getaffinity(const pid_t pid, size_t size, void *set)
{ {
return -EFAULT; return -EFAULT;
} }
mask = kmem_get(size);
if (!mask)
{
return -ENOMEM;
}
CPU_ZERO_S(size, mask);
if (pid == 0) if (pid == 0)
{ {
@ -5284,29 +5295,34 @@ sysret_t sys_getaffinity(const pid_t pid, size_t size, void *set)
} }
else else
{ {
#ifdef RT_USING_SMP #ifdef RT_USING_SMP
if (lwp->bind_cpu == RT_CPUS_NR) /* not bind */ if (lwp->bind_cpu == RT_CPUS_NR) /* not bind */
{ {
CPU_ZERO_S(size, &mask); for(int i = 0; i < RT_CPUS_NR; i++)
{
CPU_SET_S(i, size, mask);
}
} }
else /* set bind cpu */ else /* set bind cpu */
{ {
/* TODO: only single-core bindings are now supported of rt-smart */ /* TODO: only single-core bindings are now supported of rt-smart */
CPU_SET_S(lwp->bind_cpu, size, &mask); CPU_SET_S(lwp->bind_cpu, size, mask);
} }
#else #else
CPU_SET_S(0, size, &mask); CPU_SET_S(0, size, mask);
#endif #endif
if (lwp_put_to_user(set, &mask, size) != size) if (lwp_put_to_user(set, mask, size) != size)
rc = -EFAULT; rc = -EFAULT;
else else
rc = 0; rc = size;
} }
if (need_release) if (need_release)
lwp_pid_lock_release(); lwp_pid_lock_release();
kmem_put(mask);
RETURN(rc); RETURN(rc);
#else #else
return -1; return -1;
@ -6760,7 +6776,7 @@ const static struct rt_syscall_def func_table[] =
SYSCALL_SIGN(sys_sched_get_priority_min), SYSCALL_SIGN(sys_sched_get_priority_min),
SYSCALL_SIGN(sys_sched_setscheduler), SYSCALL_SIGN(sys_sched_setscheduler),
SYSCALL_SIGN(sys_sched_getscheduler), SYSCALL_SIGN(sys_sched_getscheduler),
SYSCALL_SIGN(sys_setaffinity), SYSCALL_SIGN(sys_sched_setaffinity),
SYSCALL_SIGN(sys_fsync), /* 155 */ SYSCALL_SIGN(sys_fsync), /* 155 */
SYSCALL_SIGN(sys_clock_nanosleep), SYSCALL_SIGN(sys_clock_nanosleep),
SYSCALL_SIGN(sys_timer_create), SYSCALL_SIGN(sys_timer_create),
@ -6786,7 +6802,7 @@ const static struct rt_syscall_def func_table[] =
SYSCALL_SIGN(sys_umount2), SYSCALL_SIGN(sys_umount2),
SYSCALL_SIGN(sys_link), SYSCALL_SIGN(sys_link),
SYSCALL_SIGN(sys_symlink), SYSCALL_SIGN(sys_symlink),
SYSCALL_SIGN(sys_getaffinity), /* 180 */ SYSCALL_SIGN(sys_sched_getaffinity), /* 180 */
SYSCALL_SIGN(sys_sysinfo), SYSCALL_SIGN(sys_sysinfo),
SYSCALL_SIGN(sys_chmod), SYSCALL_SIGN(sys_chmod),
SYSCALL_SIGN(sys_reboot), SYSCALL_SIGN(sys_reboot),