|
@@ -982,4 +982,37 @@ asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_pages,
|
|
|
}
|
|
|
return sys_move_pages(pid, nr_pages, pages, nodes, status, flags);
|
|
|
}
|
|
|
+
|
|
|
+asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
|
|
|
+ compat_ulong_t maxnode,
|
|
|
+ const compat_ulong_t __user *old_nodes,
|
|
|
+ const compat_ulong_t __user *new_nodes)
|
|
|
+{
|
|
|
+ unsigned long __user *old = NULL;
|
|
|
+ unsigned long __user *new = NULL;
|
|
|
+ nodemask_t tmp_mask;
|
|
|
+ unsigned long nr_bits;
|
|
|
+ unsigned long size;
|
|
|
+
|
|
|
+ nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES);
|
|
|
+ size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
|
|
|
+ if (old_nodes) {
|
|
|
+ if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits))
|
|
|
+ return -EFAULT;
|
|
|
+ old = compat_alloc_user_space(new_nodes ? size * 2 : size);
|
|
|
+ if (new_nodes)
|
|
|
+ new = old + size / sizeof(unsigned long);
|
|
|
+ if (copy_to_user(old, nodes_addr(tmp_mask), size))
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+ if (new_nodes) {
|
|
|
+ if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits))
|
|
|
+ return -EFAULT;
|
|
|
+ if (new == NULL)
|
|
|
+ new = compat_alloc_user_space(size);
|
|
|
+ if (copy_to_user(new, nodes_addr(tmp_mask), size))
|
|
|
+ return -EFAULT;
|
|
|
+ }
|
|
|
+ return sys_migrate_pages(pid, nr_bits + 1, old, new);
|
|
|
+}
|
|
|
#endif
|