From: Christoph Lameter 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. This probably needs some fixups - what about sys_vmsplice on x86_64? [akpm@osdl.org: compile fix] Signed-off-by: Christoph Lameter Cc: Andi Kleen Signed-off-by: Andrew Morton --- arch/i386/kernel/syscall_table.S | 1 + arch/x86_64/ia32/ia32entry.S | 1 + include/asm-i386/unistd.h | 3 ++- include/linux/syscalls.h | 5 +++++ kernel/compat.c | 23 +++++++++++++++++++++++ kernel/sys_ni.c | 1 + 6 files changed, 33 insertions(+), 1 deletion(-) diff -puN arch/i386/kernel/syscall_table.S~page-migration-support-moving-of-individual-pages-x86-support arch/i386/kernel/syscall_table.S --- 25/arch/i386/kernel/syscall_table.S~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:55:38 2006 +++ 25-akpm/arch/i386/kernel/syscall_table.S Tue Jun 20 15:55:38 2006 @@ -316,3 +316,4 @@ ENTRY(sys_call_table) .long sys_sync_file_range .long sys_tee /* 315 */ .long sys_vmsplice + .long sys_move_pages diff -puN arch/x86_64/ia32/ia32entry.S~page-migration-support-moving-of-individual-pages-x86-support arch/x86_64/ia32/ia32entry.S --- 25/arch/x86_64/ia32/ia32entry.S~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:55:38 2006 +++ 25-akpm/arch/x86_64/ia32/ia32entry.S Tue Jun 20 15:55:38 2006 @@ -699,4 +699,5 @@ ia32_sys_call_table: .quad sys_sync_file_range .quad sys_tee .quad compat_sys_vmsplice + .quad compat_sys_move_pages ia32_syscall_end: diff -puN include/asm-i386/unistd.h~page-migration-support-moving-of-individual-pages-x86-support include/asm-i386/unistd.h --- 25/include/asm-i386/unistd.h~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:55:38 2006 +++ 25-akpm/include/asm-i386/unistd.h Tue Jun 20 15:55:38 2006 @@ -322,10 +322,11 @@ #define __NR_sync_file_range 314 #define __NR_tee 315 #define __NR_vmsplice 316 +#define __NR_move_pages 317 #ifdef __KERNEL__ -#define NR_syscalls 317 +#define NR_syscalls 318 /* * user-visible error numbers are in the range -1 - -128: see diff -puN include/linux/syscalls.h~page-migration-support-moving-of-individual-pages-x86-support include/linux/syscalls.h --- 25/include/linux/syscalls.h~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:55:38 2006 +++ 25-akpm/include/linux/syscalls.h Tue Jun 20 15:55:38 2006 @@ -521,6 +521,11 @@ asmlinkage long sys_move_pages(pid_t pid const int __user *nodes, int __user *status, 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, unsigned long mode, unsigned long __user *nmask, diff -puN kernel/compat.c~page-migration-support-moving-of-individual-pages-x86-support kernel/compat.c --- 25/kernel/compat.c~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:55:38 2006 +++ 25-akpm/kernel/compat.c Tue Jun 20 15:55:38 2006 @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -934,3 +935,25 @@ asmlinkage long compat_sys_adjtimex(stru 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 diff -puN kernel/sys_ni.c~page-migration-support-moving-of-individual-pages-x86-support kernel/sys_ni.c --- 25/kernel/sys_ni.c~page-migration-support-moving-of-individual-pages-x86-support Tue Jun 20 15:56:57 2006 +++ 25-akpm/kernel/sys_ni.c Tue Jun 20 15:56:57 2006 @@ -133,3 +133,4 @@ cond_syscall(sys_mincore); cond_syscall(sys_madvise); cond_syscall(sys_mremap); cond_syscall(sys_remap_file_pages); +cond_syscall(compat_sys_move_pages); _