sched_{set/get}affinity(): fix error codes (also fixes KMP_AFFINITY behavior)

This commit is contained in:
Balazs Gerofi
2016-11-24 21:23:35 +09:00
parent d07a196c8e
commit f634a750c5
2 changed files with 16 additions and 6 deletions

View File

@ -408,6 +408,7 @@ process_procfs_request(unsigned long rarg)
*/ */
#define BITMASKS_BUF_SIZE 2048 #define BITMASKS_BUF_SIZE 2048
if (strcmp(p, "status") == 0) { if (strcmp(p, "status") == 0) {
extern int num_processors; /* kernel/ap.c */
struct vm_range *range; struct vm_range *range;
unsigned long lockedsize = 0; unsigned long lockedsize = 0;
char *tmp; char *tmp;
@ -443,7 +444,7 @@ process_procfs_request(unsigned long rarg)
cpu_bitmask = &bitmasks[bitmasks_offset]; cpu_bitmask = &bitmasks[bitmasks_offset];
bitmasks_offset += bitmap_scnprintf(cpu_bitmask, bitmasks_offset += bitmap_scnprintf(cpu_bitmask,
BITMASKS_BUF_SIZE - bitmasks_offset, BITMASKS_BUF_SIZE - bitmasks_offset,
thread->cpu_set.__bits, __CPU_SETSIZE); thread->cpu_set.__bits, num_processors);
bitmasks_offset++; bitmasks_offset++;
cpu_list = &bitmasks[bitmasks_offset]; cpu_list = &bitmasks[bitmasks_offset];

View File

@ -5781,7 +5781,7 @@ SYSCALL_DECLARE(sched_setaffinity)
extern int num_processors; extern int num_processors;
if (!u_cpu_set) { if (!u_cpu_set) {
return -EINVAL; return -EFAULT;
} }
if (sizeof(k_cpu_set) > len) { if (sizeof(k_cpu_set) > len) {
@ -5838,7 +5838,7 @@ SYSCALL_DECLARE(sched_setaffinity)
memcpy(&thread->cpu_set, &cpu_set, sizeof(cpu_set)); memcpy(&thread->cpu_set, &cpu_set, sizeof(cpu_set));
if (!CPU_ISSET(cpu_id, &thread->cpu_set)) { if (!CPU_ISSET(cpu_id, &thread->cpu_set)) {
dkprintf("sched_setaffinity(): tid %d sched_request_migrate\n", dkprintf("sched_setaffinity(): tid %d sched_request_migrate: %d\n",
cpu_local_var(current)->tid, cpu_id); cpu_local_var(current)->tid, cpu_id);
sched_request_migrate(cpu_id, thread); sched_request_migrate(cpu_id, thread);
} }
@ -5855,9 +5855,13 @@ SYSCALL_DECLARE(sched_getaffinity)
struct thread *thread; struct thread *thread;
int ret; int ret;
dkprintf("%s() len: %d, mask: %p\n", __FUNCTION__, len, u_cpu_set);
if (!len) if (!len)
return -EINVAL; return -EINVAL;
if ((len * BITS_PER_BYTE) < __CPU_SETSIZE)
return -EINVAL;
len = MIN2(len, sizeof(k_cpu_set)); len = MIN2(len, sizeof(k_cpu_set));
if(tid == 0){ if(tid == 0){
@ -5883,9 +5887,14 @@ SYSCALL_DECLARE(sched_getaffinity)
ret = copy_to_user(u_cpu_set, &thread->cpu_set, len); ret = copy_to_user(u_cpu_set, &thread->cpu_set, len);
release_thread(thread); release_thread(thread);
dkprintf("%s() ret: %d\n", __FUNCTION__, ret); if (ret < 0) {
if (ret < 0) ret = -EFAULT;
return ret; }
else {
ret = len;
}
dkprintf("%s() len: %d, ret: %d\n", __FUNCTION__, len, ret);
return len; return len;
} }