Commit 1b2db9fb authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds

[PATCH] sys_move_pages: 32bit support (i386, x86_64)

sys_move_pages() support for 32bit (i386 plus x86_64 compat layer)

Add support for move_pages() on i386 and also add the compat functions
necessary to run 32 bit binaries on x86_64.

Add compat_sys_move_pages to the x86_64 32bit binary layer.  Note that it is
not up to date so I added the missing pieces.  Not sure if this is done the
right way.

[akpm@osdl.org: compile fix]
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
Cc: Andi Kleen <ak@muc.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b63d64a3
...@@ -316,3 +316,4 @@ ENTRY(sys_call_table) ...@@ -316,3 +316,4 @@ ENTRY(sys_call_table)
.long sys_sync_file_range .long sys_sync_file_range
.long sys_tee /* 315 */ .long sys_tee /* 315 */
.long sys_vmsplice .long sys_vmsplice
.long sys_move_pages
...@@ -696,4 +696,5 @@ ia32_sys_call_table: ...@@ -696,4 +696,5 @@ ia32_sys_call_table:
.quad sys_sync_file_range .quad sys_sync_file_range
.quad sys_tee .quad sys_tee
.quad compat_sys_vmsplice .quad compat_sys_vmsplice
.quad compat_sys_move_pages
ia32_syscall_end: ia32_syscall_end:
...@@ -322,10 +322,11 @@ ...@@ -322,10 +322,11 @@
#define __NR_sync_file_range 314 #define __NR_sync_file_range 314
#define __NR_tee 315 #define __NR_tee 315
#define __NR_vmsplice 316 #define __NR_vmsplice 316
#define __NR_move_pages 317
#ifdef __KERNEL__ #ifdef __KERNEL__
#define NR_syscalls 317 #define NR_syscalls 318
/* /*
* user-visible error numbers are in the range -1 - -128: see * user-visible error numbers are in the range -1 - -128: see
......
...@@ -521,6 +521,11 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages, ...@@ -521,6 +521,11 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages,
const int __user *nodes, const int __user *nodes,
int __user *status, int __user *status,
int flags); int flags);
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
void __user *pages,
const int __user *nodes,
int __user *status,
int flags);
asmlinkage long sys_mbind(unsigned long start, unsigned long len, asmlinkage long sys_mbind(unsigned long start, unsigned long len,
unsigned long mode, unsigned long mode,
unsigned long __user *nmask, unsigned long __user *nmask,
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/migrate.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -934,3 +935,25 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) ...@@ -934,3 +935,25 @@ asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
return ret; return ret;
} }
#ifdef CONFIG_NUMA
asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
void __user *pages32,
const int __user *nodes,
int __user *status,
int flags)
{
const void __user * __user *pages;
int i;
pages = compat_alloc_user_space(nr_pages * sizeof(void *));
for (i = 0; i < nr_pages; i++) {
compat_uptr_t p;
if (get_user(p, (compat_uptr_t *)(pages32 + i)) ||
put_user(compat_ptr(p), pages + i))
return -EFAULT;
}
return sys_move_pages(pid, nr_pages, pages, nodes, status, flags);
}
#endif
...@@ -133,3 +133,4 @@ cond_syscall(sys_mincore); ...@@ -133,3 +133,4 @@ cond_syscall(sys_mincore);
cond_syscall(sys_madvise); cond_syscall(sys_madvise);
cond_syscall(sys_mremap); cond_syscall(sys_mremap);
cond_syscall(sys_remap_file_pages); cond_syscall(sys_remap_file_pages);
cond_syscall(compat_sys_move_pages);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment