get_mempolicy: Support (MPOL_F_NODE | MPOL_F_ADDR) specified
If flags specifies both MPOL_F_NODE and MPOL_F_ADDR, get_mempolicy() will return the node ID of the node on which the address addr is allocated into the location pointed to by mode. Change-Id: Id485e3f4838e3679d877a95e53b21e3421cac88a
This commit is contained in:
committed by
Masamichi Takagi
parent
aef50d710c
commit
9f1e6d707c
41
kernel/mem.c
41
kernel/mem.c
@ -2931,3 +2931,44 @@ retry:
|
|||||||
|
|
||||||
return ptep;
|
return ptep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int phys_to_nid(unsigned long p)
|
||||||
|
{
|
||||||
|
int i, numa_id = -1, _numa_id;
|
||||||
|
unsigned long _start, _end;
|
||||||
|
|
||||||
|
for (i = 0; i < ihk_mc_get_nr_memory_chunks(); i++) {
|
||||||
|
ihk_mc_get_memory_chunk(i, &_start, &_end, &_numa_id);
|
||||||
|
|
||||||
|
if (p >= _start && p < _end) {
|
||||||
|
numa_id = _numa_id;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
return numa_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lookup_node(struct process_vm *vm, void *addr)
|
||||||
|
{
|
||||||
|
int node, err, reason = PF_POPULATE | PF_USER;
|
||||||
|
pte_t *ptep;
|
||||||
|
|
||||||
|
err = page_fault_process_vm(vm, (void *)addr, reason);
|
||||||
|
if (err) {
|
||||||
|
node = err;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptep = ihk_mc_pt_lookup_pte(vm->address_space->page_table,
|
||||||
|
(void *)addr, 0, NULL, NULL, NULL);
|
||||||
|
if (!ptep || !pte_is_present(ptep)) {
|
||||||
|
node = -ENOENT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = phys_to_nid(pte_get_phys(ptep));
|
||||||
|
out:
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|||||||
@ -10153,6 +10153,20 @@ SYSCALL_DECLARE(get_mempolicy)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* case of MPOL_F_NODE and MPOL_F_ADDR are specified */
|
||||||
|
if (flags & MPOL_F_NODE && flags & MPOL_F_ADDR) {
|
||||||
|
/* return the node ID which addr is allocated by mode */
|
||||||
|
int nid;
|
||||||
|
|
||||||
|
nid = lookup_node(vm, (void *)addr);
|
||||||
|
error = copy_to_user(mode, &nid, sizeof(int));
|
||||||
|
if (error) {
|
||||||
|
error = -EFAULT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/* Special case of MPOL_F_MEMS_ALLOWED */
|
/* Special case of MPOL_F_MEMS_ALLOWED */
|
||||||
if (flags == MPOL_F_MEMS_ALLOWED) {
|
if (flags == MPOL_F_MEMS_ALLOWED) {
|
||||||
if (nodemask) {
|
if (nodemask) {
|
||||||
|
|||||||
@ -20,6 +20,8 @@ struct process_vm;
|
|||||||
|
|
||||||
unsigned long virt_to_phys(void *v);
|
unsigned long virt_to_phys(void *v);
|
||||||
void *phys_to_virt(unsigned long p);
|
void *phys_to_virt(unsigned long p);
|
||||||
|
int phys_to_nid(unsigned long p);
|
||||||
|
int lookup_node(struct process_vm *vm, void *addr);
|
||||||
int copy_from_user(void *dst, const void *src, size_t siz);
|
int copy_from_user(void *dst, const void *src, size_t siz);
|
||||||
int strlen_user(const char *s);
|
int strlen_user(const char *s);
|
||||||
int strcpy_from_user(char *dst, const char *src);
|
int strcpy_from_user(char *dst, const char *src);
|
||||||
|
|||||||
Reference in New Issue
Block a user