sched_{set/get}affinity(): fix error codes (also fixes KMP_AFFINITY behavior)
This commit is contained in:
@ -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];
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user