All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Christoph Hellwig <hch@infradead.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Eric Biederman <ebiederm@xmission.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-arch@vger.kernel.org,
	linux-mm@kvack.org, kexec@lists.infradead.org
Subject: Re: [PATCH 3/4] mm: remove compat_sys_move_pages
Date: Sat, 19 Sep 2020 06:38:07 +0100	[thread overview]
Message-ID: <20200919053807.GK30063@infradead.org> (raw)
In-Reply-To: <20200918132439.1475479-4-arnd@arndb.de>

On Fri, Sep 18, 2020 at 03:24:38PM +0200, Arnd Bergmann wrote:
> The compat move_pages() implementation uses compat_alloc_user_space()
> for converting the pointer array. Moving the compat handling into
> the function itself is a bit simpler and lets us avoid the
> compat_alloc_user_space() call.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/arm64/include/asm/unistd32.h         |  2 +-
>  arch/mips/kernel/syscalls/syscall_n32.tbl |  2 +-
>  arch/mips/kernel/syscalls/syscall_o32.tbl |  2 +-
>  arch/parisc/kernel/syscalls/syscall.tbl   |  2 +-
>  arch/powerpc/kernel/syscalls/syscall.tbl  |  2 +-
>  arch/s390/kernel/syscalls/syscall.tbl     |  2 +-
>  arch/sparc/kernel/syscalls/syscall.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_32.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_64.tbl    |  2 +-
>  include/linux/compat.h                    |  5 ---
>  include/uapi/asm-generic/unistd.h         |  2 +-
>  kernel/sys_ni.c                           |  1 -
>  mm/migrate.c                              | 45 +++++++++++------------
>  13 files changed, 32 insertions(+), 39 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
> index b6517df74037..af793775ba98 100644
> --- a/arch/arm64/include/asm/unistd32.h
> +++ b/arch/arm64/include/asm/unistd32.h
> @@ -699,7 +699,7 @@ __SYSCALL(__NR_tee, sys_tee)
>  #define __NR_vmsplice 343
>  __SYSCALL(__NR_vmsplice, compat_sys_vmsplice)
>  #define __NR_move_pages 344
> -__SYSCALL(__NR_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #define __NR_getcpu 345
>  __SYSCALL(__NR_getcpu, sys_getcpu)
>  #define __NR_epoll_pwait 346
> diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl
> index ad157aab4c09..7fa1ca45e44c 100644
> --- a/arch/mips/kernel/syscalls/syscall_n32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl
> @@ -279,7 +279,7 @@
>  268	n32	sync_file_range			sys_sync_file_range
>  269	n32	tee				sys_tee
>  270	n32	vmsplice			compat_sys_vmsplice
> -271	n32	move_pages			compat_sys_move_pages
> +271	n32	move_pages			sys_move_pages
>  272	n32	set_robust_list			compat_sys_set_robust_list
>  273	n32	get_robust_list			compat_sys_get_robust_list
>  274	n32	kexec_load			sys_kexec_load
> diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl
> index 57baf6c8008f..194c7fbeedf7 100644
> --- a/arch/mips/kernel/syscalls/syscall_o32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl
> @@ -319,7 +319,7 @@
>  305	o32	sync_file_range			sys_sync_file_range		sys32_sync_file_range
>  306	o32	tee				sys_tee
>  307	o32	vmsplice			sys_vmsplice			compat_sys_vmsplice
> -308	o32	move_pages			sys_move_pages			compat_sys_move_pages
> +308	o32	move_pages			sys_move_pages
>  309	o32	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
>  310	o32	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  311	o32	kexec_load			sys_kexec_load
> diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/syscalls/syscall.tbl
> index 778bf166d7bd..5c17edaffe70 100644
> --- a/arch/parisc/kernel/syscalls/syscall.tbl
> +++ b/arch/parisc/kernel/syscalls/syscall.tbl
> @@ -331,7 +331,7 @@
>  292	64	sync_file_range		sys_sync_file_range
>  293	common	tee			sys_tee
>  294	common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -295	common	move_pages		sys_move_pages			compat_sys_move_pages
> +295	common	move_pages		sys_move_pages
>  296	common	getcpu			sys_getcpu
>  297	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  298	common	statfs64		sys_statfs64			compat_sys_statfs64
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index f128ba8b9a71..04fb42d7b377 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -389,7 +389,7 @@
>  298	common	faccessat			sys_faccessat
>  299	common	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  300	common	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
> -301	common	move_pages			sys_move_pages			compat_sys_move_pages
> +301	common	move_pages			sys_move_pages
>  302	common	getcpu				sys_getcpu
>  303	nospu	epoll_pwait			sys_epoll_pwait			compat_sys_epoll_pwait
>  304	32	utimensat			sys_utimensat_time32
> diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl
> index d45952058be2..3197965d45e9 100644
> --- a/arch/s390/kernel/syscalls/syscall.tbl
> +++ b/arch/s390/kernel/syscalls/syscall.tbl
> @@ -317,7 +317,7 @@
>  307  common	sync_file_range		sys_sync_file_range		compat_sys_s390_sync_file_range
>  308  common	tee			sys_tee				sys_tee
>  309  common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -310  common	move_pages		sys_move_pages			compat_sys_move_pages
> +310  common	move_pages		sys_move_pages
>  311  common	getcpu			sys_getcpu			sys_getcpu
>  312  common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  313  common	utimes			sys_utimes			sys_utimes_time32
> diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/syscalls/syscall.tbl
> index a46edcdd950d..e36ac364e61a 100644
> --- a/arch/sparc/kernel/syscalls/syscall.tbl
> +++ b/arch/sparc/kernel/syscalls/syscall.tbl
> @@ -370,7 +370,7 @@
>  304	common	get_mempolicy		sys_get_mempolicy		compat_sys_get_mempolicy
>  305	common	set_mempolicy		sys_set_mempolicy		compat_sys_set_mempolicy
>  306	common	kexec_load		sys_kexec_load			sys_kexec_load
> -307	common	move_pages		sys_move_pages			compat_sys_move_pages
> +307	common	move_pages		sys_move_pages
>  308	common	getcpu			sys_getcpu
>  309	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  310	32	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
> index 7e4140b78aad..b3263b8b2eae 100644
> --- a/arch/x86/entry/syscalls/syscall_32.tbl
> +++ b/arch/x86/entry/syscalls/syscall_32.tbl
> @@ -328,7 +328,7 @@
>  314	i386	sync_file_range		sys_ia32_sync_file_range
>  315	i386	tee			sys_tee
>  316	i386	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -317	i386	move_pages		sys_move_pages			compat_sys_move_pages
> +317	i386	move_pages		sys_move_pages
>  318	i386	getcpu			sys_getcpu
>  319	i386	epoll_pwait		sys_epoll_pwait
>  320	i386	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
> index 9986f5f08278..4a997a0cbf47 100644
> --- a/arch/x86/entry/syscalls/syscall_64.tbl
> +++ b/arch/x86/entry/syscalls/syscall_64.tbl
> @@ -389,7 +389,7 @@
>  530	x32	set_robust_list		compat_sys_set_robust_list
>  531	x32	get_robust_list		compat_sys_get_robust_list
>  532	x32	vmsplice		compat_sys_vmsplice
> -533	x32	move_pages		compat_sys_move_pages
> +533	x32	move_pages		sys_move_pages
>  534	x32	preadv			compat_sys_preadv64
>  535	x32	pwritev			compat_sys_pwritev64
>  536	x32	rt_tgsigqueueinfo	compat_sys_rt_tgsigqueueinfo
> diff --git a/include/linux/compat.h b/include/linux/compat.h
> index a7a5a0ff59ef..db1d7ac2c9e0 100644
> --- a/include/linux/compat.h
> +++ b/include/linux/compat.h
> @@ -763,11 +763,6 @@ asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
>  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);
> -asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
> -				      __u32 __user *pages,
> -				      const int __user *nodes,
> -				      int __user *status,
> -				      int flags);
>  
>  asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
>  					compat_pid_t pid, int sig,
> diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
> index 83f1fc7fd3d7..4da51702fb21 100644
> --- a/include/uapi/asm-generic/unistd.h
> +++ b/include/uapi/asm-generic/unistd.h
> @@ -681,7 +681,7 @@ __SC_COMP(__NR_set_mempolicy, sys_set_mempolicy, compat_sys_set_mempolicy)
>  #define __NR_migrate_pages 238
>  __SC_COMP(__NR_migrate_pages, sys_migrate_pages, compat_sys_migrate_pages)
>  #define __NR_move_pages 239
> -__SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #endif
>  
>  #define __NR_rt_tgsigqueueinfo 240
> diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
> index c925d1e1777e..783a24ceee88 100644
> --- a/kernel/sys_ni.c
> +++ b/kernel/sys_ni.c
> @@ -290,7 +290,6 @@ COND_SYSCALL_COMPAT(set_mempolicy);
>  COND_SYSCALL(migrate_pages);
>  COND_SYSCALL_COMPAT(migrate_pages);
>  COND_SYSCALL(move_pages);
> -COND_SYSCALL_COMPAT(move_pages);
>  
>  COND_SYSCALL(perf_event_open);
>  COND_SYSCALL(accept4);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 34a842a8eb6a..e9dfbde5f12c 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1835,6 +1835,27 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
>  	mmap_read_unlock(mm);
>  }
>  
> +static int put_pages_array(const void __user *chunk_pages[],
> +			   const void __user * __user *pages,
> +			   unsigned long chunk_nr)
> +{
> +	compat_uptr_t __user *pages32 = (compat_uptr_t __user *)pages;
> +	compat_uptr_t p;
> +	int i;
> +
> +	if (!in_compat_syscall())
> +		return copy_from_user(chunk_pages, pages,
> +				      chunk_nr * sizeof(*chunk_pages));
> +
> +	for (i = 0; i < chunk_nr; i++) {
> +		if (get_user(p, pages32 + i))
> +			return -EFAULT;
> +		chunk_pages[i] = compat_ptr(p);
> +	}
> +
> +	return 0;

I'd just keep the native version inline and have the compat one in
a helper, but that is just a minor detail.

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@infradead.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arch@vger.kernel.org, kexec@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	linux-mm@kvack.org, Alexander Viro <viro@zeniv.linux.org.uk>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-arm-kernel@lists.infradead.org,
	Eric Biederman <ebiederm@xmission.com>
Subject: Re: [PATCH 3/4] mm: remove compat_sys_move_pages
Date: Sat, 19 Sep 2020 06:38:07 +0100	[thread overview]
Message-ID: <20200919053807.GK30063@infradead.org> (raw)
In-Reply-To: <20200918132439.1475479-4-arnd@arndb.de>

On Fri, Sep 18, 2020 at 03:24:38PM +0200, Arnd Bergmann wrote:
> The compat move_pages() implementation uses compat_alloc_user_space()
> for converting the pointer array. Moving the compat handling into
> the function itself is a bit simpler and lets us avoid the
> compat_alloc_user_space() call.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/arm64/include/asm/unistd32.h         |  2 +-
>  arch/mips/kernel/syscalls/syscall_n32.tbl |  2 +-
>  arch/mips/kernel/syscalls/syscall_o32.tbl |  2 +-
>  arch/parisc/kernel/syscalls/syscall.tbl   |  2 +-
>  arch/powerpc/kernel/syscalls/syscall.tbl  |  2 +-
>  arch/s390/kernel/syscalls/syscall.tbl     |  2 +-
>  arch/sparc/kernel/syscalls/syscall.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_32.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_64.tbl    |  2 +-
>  include/linux/compat.h                    |  5 ---
>  include/uapi/asm-generic/unistd.h         |  2 +-
>  kernel/sys_ni.c                           |  1 -
>  mm/migrate.c                              | 45 +++++++++++------------
>  13 files changed, 32 insertions(+), 39 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
> index b6517df74037..af793775ba98 100644
> --- a/arch/arm64/include/asm/unistd32.h
> +++ b/arch/arm64/include/asm/unistd32.h
> @@ -699,7 +699,7 @@ __SYSCALL(__NR_tee, sys_tee)
>  #define __NR_vmsplice 343
>  __SYSCALL(__NR_vmsplice, compat_sys_vmsplice)
>  #define __NR_move_pages 344
> -__SYSCALL(__NR_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #define __NR_getcpu 345
>  __SYSCALL(__NR_getcpu, sys_getcpu)
>  #define __NR_epoll_pwait 346
> diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl
> index ad157aab4c09..7fa1ca45e44c 100644
> --- a/arch/mips/kernel/syscalls/syscall_n32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl
> @@ -279,7 +279,7 @@
>  268	n32	sync_file_range			sys_sync_file_range
>  269	n32	tee				sys_tee
>  270	n32	vmsplice			compat_sys_vmsplice
> -271	n32	move_pages			compat_sys_move_pages
> +271	n32	move_pages			sys_move_pages
>  272	n32	set_robust_list			compat_sys_set_robust_list
>  273	n32	get_robust_list			compat_sys_get_robust_list
>  274	n32	kexec_load			sys_kexec_load
> diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl
> index 57baf6c8008f..194c7fbeedf7 100644
> --- a/arch/mips/kernel/syscalls/syscall_o32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl
> @@ -319,7 +319,7 @@
>  305	o32	sync_file_range			sys_sync_file_range		sys32_sync_file_range
>  306	o32	tee				sys_tee
>  307	o32	vmsplice			sys_vmsplice			compat_sys_vmsplice
> -308	o32	move_pages			sys_move_pages			compat_sys_move_pages
> +308	o32	move_pages			sys_move_pages
>  309	o32	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
>  310	o32	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  311	o32	kexec_load			sys_kexec_load
> diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/syscalls/syscall.tbl
> index 778bf166d7bd..5c17edaffe70 100644
> --- a/arch/parisc/kernel/syscalls/syscall.tbl
> +++ b/arch/parisc/kernel/syscalls/syscall.tbl
> @@ -331,7 +331,7 @@
>  292	64	sync_file_range		sys_sync_file_range
>  293	common	tee			sys_tee
>  294	common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -295	common	move_pages		sys_move_pages			compat_sys_move_pages
> +295	common	move_pages		sys_move_pages
>  296	common	getcpu			sys_getcpu
>  297	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  298	common	statfs64		sys_statfs64			compat_sys_statfs64
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index f128ba8b9a71..04fb42d7b377 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -389,7 +389,7 @@
>  298	common	faccessat			sys_faccessat
>  299	common	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  300	common	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
> -301	common	move_pages			sys_move_pages			compat_sys_move_pages
> +301	common	move_pages			sys_move_pages
>  302	common	getcpu				sys_getcpu
>  303	nospu	epoll_pwait			sys_epoll_pwait			compat_sys_epoll_pwait
>  304	32	utimensat			sys_utimensat_time32
> diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl
> index d45952058be2..3197965d45e9 100644
> --- a/arch/s390/kernel/syscalls/syscall.tbl
> +++ b/arch/s390/kernel/syscalls/syscall.tbl
> @@ -317,7 +317,7 @@
>  307  common	sync_file_range		sys_sync_file_range		compat_sys_s390_sync_file_range
>  308  common	tee			sys_tee				sys_tee
>  309  common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -310  common	move_pages		sys_move_pages			compat_sys_move_pages
> +310  common	move_pages		sys_move_pages
>  311  common	getcpu			sys_getcpu			sys_getcpu
>  312  common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  313  common	utimes			sys_utimes			sys_utimes_time32
> diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/syscalls/syscall.tbl
> index a46edcdd950d..e36ac364e61a 100644
> --- a/arch/sparc/kernel/syscalls/syscall.tbl
> +++ b/arch/sparc/kernel/syscalls/syscall.tbl
> @@ -370,7 +370,7 @@
>  304	common	get_mempolicy		sys_get_mempolicy		compat_sys_get_mempolicy
>  305	common	set_mempolicy		sys_set_mempolicy		compat_sys_set_mempolicy
>  306	common	kexec_load		sys_kexec_load			sys_kexec_load
> -307	common	move_pages		sys_move_pages			compat_sys_move_pages
> +307	common	move_pages		sys_move_pages
>  308	common	getcpu			sys_getcpu
>  309	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  310	32	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
> index 7e4140b78aad..b3263b8b2eae 100644
> --- a/arch/x86/entry/syscalls/syscall_32.tbl
> +++ b/arch/x86/entry/syscalls/syscall_32.tbl
> @@ -328,7 +328,7 @@
>  314	i386	sync_file_range		sys_ia32_sync_file_range
>  315	i386	tee			sys_tee
>  316	i386	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -317	i386	move_pages		sys_move_pages			compat_sys_move_pages
> +317	i386	move_pages		sys_move_pages
>  318	i386	getcpu			sys_getcpu
>  319	i386	epoll_pwait		sys_epoll_pwait
>  320	i386	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
> index 9986f5f08278..4a997a0cbf47 100644
> --- a/arch/x86/entry/syscalls/syscall_64.tbl
> +++ b/arch/x86/entry/syscalls/syscall_64.tbl
> @@ -389,7 +389,7 @@
>  530	x32	set_robust_list		compat_sys_set_robust_list
>  531	x32	get_robust_list		compat_sys_get_robust_list
>  532	x32	vmsplice		compat_sys_vmsplice
> -533	x32	move_pages		compat_sys_move_pages
> +533	x32	move_pages		sys_move_pages
>  534	x32	preadv			compat_sys_preadv64
>  535	x32	pwritev			compat_sys_pwritev64
>  536	x32	rt_tgsigqueueinfo	compat_sys_rt_tgsigqueueinfo
> diff --git a/include/linux/compat.h b/include/linux/compat.h
> index a7a5a0ff59ef..db1d7ac2c9e0 100644
> --- a/include/linux/compat.h
> +++ b/include/linux/compat.h
> @@ -763,11 +763,6 @@ asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
>  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);
> -asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
> -				      __u32 __user *pages,
> -				      const int __user *nodes,
> -				      int __user *status,
> -				      int flags);
>  
>  asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
>  					compat_pid_t pid, int sig,
> diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
> index 83f1fc7fd3d7..4da51702fb21 100644
> --- a/include/uapi/asm-generic/unistd.h
> +++ b/include/uapi/asm-generic/unistd.h
> @@ -681,7 +681,7 @@ __SC_COMP(__NR_set_mempolicy, sys_set_mempolicy, compat_sys_set_mempolicy)
>  #define __NR_migrate_pages 238
>  __SC_COMP(__NR_migrate_pages, sys_migrate_pages, compat_sys_migrate_pages)
>  #define __NR_move_pages 239
> -__SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #endif
>  
>  #define __NR_rt_tgsigqueueinfo 240
> diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
> index c925d1e1777e..783a24ceee88 100644
> --- a/kernel/sys_ni.c
> +++ b/kernel/sys_ni.c
> @@ -290,7 +290,6 @@ COND_SYSCALL_COMPAT(set_mempolicy);
>  COND_SYSCALL(migrate_pages);
>  COND_SYSCALL_COMPAT(migrate_pages);
>  COND_SYSCALL(move_pages);
> -COND_SYSCALL_COMPAT(move_pages);
>  
>  COND_SYSCALL(perf_event_open);
>  COND_SYSCALL(accept4);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 34a842a8eb6a..e9dfbde5f12c 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1835,6 +1835,27 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
>  	mmap_read_unlock(mm);
>  }
>  
> +static int put_pages_array(const void __user *chunk_pages[],
> +			   const void __user * __user *pages,
> +			   unsigned long chunk_nr)
> +{
> +	compat_uptr_t __user *pages32 = (compat_uptr_t __user *)pages;
> +	compat_uptr_t p;
> +	int i;
> +
> +	if (!in_compat_syscall())
> +		return copy_from_user(chunk_pages, pages,
> +				      chunk_nr * sizeof(*chunk_pages));
> +
> +	for (i = 0; i < chunk_nr; i++) {
> +		if (get_user(p, pages32 + i))
> +			return -EFAULT;
> +		chunk_pages[i] = compat_ptr(p);
> +	}
> +
> +	return 0;

I'd just keep the native version inline and have the compat one in
a helper, but that is just a minor detail.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@infradead.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arch@vger.kernel.org, kexec@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	linux-mm@kvack.org, Alexander Viro <viro@zeniv.linux.org.uk>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-arm-kernel@lists.infradead.org,
	Eric Biederman <ebiederm@xmission.com>
Subject: Re: [PATCH 3/4] mm: remove compat_sys_move_pages
Date: Sat, 19 Sep 2020 06:38:07 +0100	[thread overview]
Message-ID: <20200919053807.GK30063@infradead.org> (raw)
In-Reply-To: <20200918132439.1475479-4-arnd@arndb.de>

On Fri, Sep 18, 2020 at 03:24:38PM +0200, Arnd Bergmann wrote:
> The compat move_pages() implementation uses compat_alloc_user_space()
> for converting the pointer array. Moving the compat handling into
> the function itself is a bit simpler and lets us avoid the
> compat_alloc_user_space() call.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
>  arch/arm64/include/asm/unistd32.h         |  2 +-
>  arch/mips/kernel/syscalls/syscall_n32.tbl |  2 +-
>  arch/mips/kernel/syscalls/syscall_o32.tbl |  2 +-
>  arch/parisc/kernel/syscalls/syscall.tbl   |  2 +-
>  arch/powerpc/kernel/syscalls/syscall.tbl  |  2 +-
>  arch/s390/kernel/syscalls/syscall.tbl     |  2 +-
>  arch/sparc/kernel/syscalls/syscall.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_32.tbl    |  2 +-
>  arch/x86/entry/syscalls/syscall_64.tbl    |  2 +-
>  include/linux/compat.h                    |  5 ---
>  include/uapi/asm-generic/unistd.h         |  2 +-
>  kernel/sys_ni.c                           |  1 -
>  mm/migrate.c                              | 45 +++++++++++------------
>  13 files changed, 32 insertions(+), 39 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h
> index b6517df74037..af793775ba98 100644
> --- a/arch/arm64/include/asm/unistd32.h
> +++ b/arch/arm64/include/asm/unistd32.h
> @@ -699,7 +699,7 @@ __SYSCALL(__NR_tee, sys_tee)
>  #define __NR_vmsplice 343
>  __SYSCALL(__NR_vmsplice, compat_sys_vmsplice)
>  #define __NR_move_pages 344
> -__SYSCALL(__NR_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #define __NR_getcpu 345
>  __SYSCALL(__NR_getcpu, sys_getcpu)
>  #define __NR_epoll_pwait 346
> diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/syscalls/syscall_n32.tbl
> index ad157aab4c09..7fa1ca45e44c 100644
> --- a/arch/mips/kernel/syscalls/syscall_n32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl
> @@ -279,7 +279,7 @@
>  268	n32	sync_file_range			sys_sync_file_range
>  269	n32	tee				sys_tee
>  270	n32	vmsplice			compat_sys_vmsplice
> -271	n32	move_pages			compat_sys_move_pages
> +271	n32	move_pages			sys_move_pages
>  272	n32	set_robust_list			compat_sys_set_robust_list
>  273	n32	get_robust_list			compat_sys_get_robust_list
>  274	n32	kexec_load			sys_kexec_load
> diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/syscalls/syscall_o32.tbl
> index 57baf6c8008f..194c7fbeedf7 100644
> --- a/arch/mips/kernel/syscalls/syscall_o32.tbl
> +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl
> @@ -319,7 +319,7 @@
>  305	o32	sync_file_range			sys_sync_file_range		sys32_sync_file_range
>  306	o32	tee				sys_tee
>  307	o32	vmsplice			sys_vmsplice			compat_sys_vmsplice
> -308	o32	move_pages			sys_move_pages			compat_sys_move_pages
> +308	o32	move_pages			sys_move_pages
>  309	o32	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
>  310	o32	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  311	o32	kexec_load			sys_kexec_load
> diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/syscalls/syscall.tbl
> index 778bf166d7bd..5c17edaffe70 100644
> --- a/arch/parisc/kernel/syscalls/syscall.tbl
> +++ b/arch/parisc/kernel/syscalls/syscall.tbl
> @@ -331,7 +331,7 @@
>  292	64	sync_file_range		sys_sync_file_range
>  293	common	tee			sys_tee
>  294	common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -295	common	move_pages		sys_move_pages			compat_sys_move_pages
> +295	common	move_pages		sys_move_pages
>  296	common	getcpu			sys_getcpu
>  297	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  298	common	statfs64		sys_statfs64			compat_sys_statfs64
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index f128ba8b9a71..04fb42d7b377 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -389,7 +389,7 @@
>  298	common	faccessat			sys_faccessat
>  299	common	get_robust_list			sys_get_robust_list		compat_sys_get_robust_list
>  300	common	set_robust_list			sys_set_robust_list		compat_sys_set_robust_list
> -301	common	move_pages			sys_move_pages			compat_sys_move_pages
> +301	common	move_pages			sys_move_pages
>  302	common	getcpu				sys_getcpu
>  303	nospu	epoll_pwait			sys_epoll_pwait			compat_sys_epoll_pwait
>  304	32	utimensat			sys_utimensat_time32
> diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/syscalls/syscall.tbl
> index d45952058be2..3197965d45e9 100644
> --- a/arch/s390/kernel/syscalls/syscall.tbl
> +++ b/arch/s390/kernel/syscalls/syscall.tbl
> @@ -317,7 +317,7 @@
>  307  common	sync_file_range		sys_sync_file_range		compat_sys_s390_sync_file_range
>  308  common	tee			sys_tee				sys_tee
>  309  common	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -310  common	move_pages		sys_move_pages			compat_sys_move_pages
> +310  common	move_pages		sys_move_pages
>  311  common	getcpu			sys_getcpu			sys_getcpu
>  312  common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  313  common	utimes			sys_utimes			sys_utimes_time32
> diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/syscalls/syscall.tbl
> index a46edcdd950d..e36ac364e61a 100644
> --- a/arch/sparc/kernel/syscalls/syscall.tbl
> +++ b/arch/sparc/kernel/syscalls/syscall.tbl
> @@ -370,7 +370,7 @@
>  304	common	get_mempolicy		sys_get_mempolicy		compat_sys_get_mempolicy
>  305	common	set_mempolicy		sys_set_mempolicy		compat_sys_set_mempolicy
>  306	common	kexec_load		sys_kexec_load			sys_kexec_load
> -307	common	move_pages		sys_move_pages			compat_sys_move_pages
> +307	common	move_pages		sys_move_pages
>  308	common	getcpu			sys_getcpu
>  309	common	epoll_pwait		sys_epoll_pwait			compat_sys_epoll_pwait
>  310	32	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
> index 7e4140b78aad..b3263b8b2eae 100644
> --- a/arch/x86/entry/syscalls/syscall_32.tbl
> +++ b/arch/x86/entry/syscalls/syscall_32.tbl
> @@ -328,7 +328,7 @@
>  314	i386	sync_file_range		sys_ia32_sync_file_range
>  315	i386	tee			sys_tee
>  316	i386	vmsplice		sys_vmsplice			compat_sys_vmsplice
> -317	i386	move_pages		sys_move_pages			compat_sys_move_pages
> +317	i386	move_pages		sys_move_pages
>  318	i386	getcpu			sys_getcpu
>  319	i386	epoll_pwait		sys_epoll_pwait
>  320	i386	utimensat		sys_utimensat_time32
> diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl
> index 9986f5f08278..4a997a0cbf47 100644
> --- a/arch/x86/entry/syscalls/syscall_64.tbl
> +++ b/arch/x86/entry/syscalls/syscall_64.tbl
> @@ -389,7 +389,7 @@
>  530	x32	set_robust_list		compat_sys_set_robust_list
>  531	x32	get_robust_list		compat_sys_get_robust_list
>  532	x32	vmsplice		compat_sys_vmsplice
> -533	x32	move_pages		compat_sys_move_pages
> +533	x32	move_pages		sys_move_pages
>  534	x32	preadv			compat_sys_preadv64
>  535	x32	pwritev			compat_sys_pwritev64
>  536	x32	rt_tgsigqueueinfo	compat_sys_rt_tgsigqueueinfo
> diff --git a/include/linux/compat.h b/include/linux/compat.h
> index a7a5a0ff59ef..db1d7ac2c9e0 100644
> --- a/include/linux/compat.h
> +++ b/include/linux/compat.h
> @@ -763,11 +763,6 @@ asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
>  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);
> -asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
> -				      __u32 __user *pages,
> -				      const int __user *nodes,
> -				      int __user *status,
> -				      int flags);
>  
>  asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
>  					compat_pid_t pid, int sig,
> diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h
> index 83f1fc7fd3d7..4da51702fb21 100644
> --- a/include/uapi/asm-generic/unistd.h
> +++ b/include/uapi/asm-generic/unistd.h
> @@ -681,7 +681,7 @@ __SC_COMP(__NR_set_mempolicy, sys_set_mempolicy, compat_sys_set_mempolicy)
>  #define __NR_migrate_pages 238
>  __SC_COMP(__NR_migrate_pages, sys_migrate_pages, compat_sys_migrate_pages)
>  #define __NR_move_pages 239
> -__SC_COMP(__NR_move_pages, sys_move_pages, compat_sys_move_pages)
> +__SYSCALL(__NR_move_pages, sys_move_pages)
>  #endif
>  
>  #define __NR_rt_tgsigqueueinfo 240
> diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
> index c925d1e1777e..783a24ceee88 100644
> --- a/kernel/sys_ni.c
> +++ b/kernel/sys_ni.c
> @@ -290,7 +290,6 @@ COND_SYSCALL_COMPAT(set_mempolicy);
>  COND_SYSCALL(migrate_pages);
>  COND_SYSCALL_COMPAT(migrate_pages);
>  COND_SYSCALL(move_pages);
> -COND_SYSCALL_COMPAT(move_pages);
>  
>  COND_SYSCALL(perf_event_open);
>  COND_SYSCALL(accept4);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 34a842a8eb6a..e9dfbde5f12c 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1835,6 +1835,27 @@ static void do_pages_stat_array(struct mm_struct *mm, unsigned long nr_pages,
>  	mmap_read_unlock(mm);
>  }
>  
> +static int put_pages_array(const void __user *chunk_pages[],
> +			   const void __user * __user *pages,
> +			   unsigned long chunk_nr)
> +{
> +	compat_uptr_t __user *pages32 = (compat_uptr_t __user *)pages;
> +	compat_uptr_t p;
> +	int i;
> +
> +	if (!in_compat_syscall())
> +		return copy_from_user(chunk_pages, pages,
> +				      chunk_nr * sizeof(*chunk_pages));
> +
> +	for (i = 0; i < chunk_nr; i++) {
> +		if (get_user(p, pages32 + i))
> +			return -EFAULT;
> +		chunk_pages[i] = compat_ptr(p);
> +	}
> +
> +	return 0;

I'd just keep the native version inline and have the compat one in
a helper, but that is just a minor detail.

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2020-09-19  5:38 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-18 13:24 [PATCH 0/4] syscalls: remove compat_alloc_user_space callers Arnd Bergmann
2020-09-18 13:24 ` Arnd Bergmann
2020-09-18 13:24 ` Arnd Bergmann
2020-09-18 13:24 ` [PATCH 1/4] x86: add __X32_COND_SYSCALL() macro Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-19  5:35   ` Christoph Hellwig
2020-09-19  5:35     ` Christoph Hellwig
2020-09-19  5:35     ` Christoph Hellwig
2020-09-19 16:23     ` Andy Lutomirski
2020-09-19 16:23       ` Andy Lutomirski
2020-09-19 16:23       ` Andy Lutomirski
2020-09-19 16:23       ` Andy Lutomirski
2020-09-19 17:14       ` hpa
2020-09-19 17:14         ` hpa
2020-09-19 17:14         ` hpa
2020-09-19 17:39         ` Andy Lutomirski
2020-09-19 17:39           ` Andy Lutomirski
2020-09-19 17:39           ` Andy Lutomirski
2020-09-19 17:45         ` Brian Gerst
2020-09-19 17:45           ` Brian Gerst
2020-09-19 17:45           ` Brian Gerst
2020-09-19 17:45           ` Brian Gerst
2020-09-18 13:24 ` [PATCH 2/4] kexec: remove compat_sys_kexec_load syscall Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-19  5:37   ` Christoph Hellwig
2020-09-19  5:37     ` Christoph Hellwig
2020-09-19  5:37     ` Christoph Hellwig
2020-09-26 21:10     ` Arnd Bergmann
2020-09-26 21:10       ` Arnd Bergmann
2020-09-26 21:10       ` Arnd Bergmann
2020-09-26 21:10       ` Arnd Bergmann
2020-09-18 13:24 ` [PATCH 3/4] mm: remove compat_sys_move_pages Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-19  5:38   ` Christoph Hellwig [this message]
2020-09-19  5:38     ` Christoph Hellwig
2020-09-19  5:38     ` Christoph Hellwig
2020-09-26 15:21     ` Arnd Bergmann
2020-09-26 15:21       ` Arnd Bergmann
2020-09-26 15:21       ` Arnd Bergmann
2020-09-26 15:21       ` Arnd Bergmann
2020-09-18 13:24 ` [PATCH 4/4] mm: remove compat numa syscalls Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-18 13:24   ` Arnd Bergmann
2020-09-19  5:41   ` Christoph Hellwig
2020-09-19  5:41     ` Christoph Hellwig
2020-09-19  5:41     ` Christoph Hellwig
2020-09-26 15:14     ` Arnd Bergmann
2020-09-26 15:14       ` Arnd Bergmann
2020-09-26 15:14       ` Arnd Bergmann
2020-09-26 15:14       ` Arnd Bergmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200919053807.GK30063@infradead.org \
    --to=hch@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=ebiederm@xmission.com \
    --cc=kexec@lists.infradead.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.