Commit cae73471 authored by Christophe Leroy (CS GROUP)'s avatar Christophe Leroy (CS GROUP) Committed by Madhavan Srinivasan
Browse files

powerpc/net: Inline checksum wrappers and convert to scoped user access



Commit 861574d5 ("powerpc/uaccess: Implement masked user access")
provides optimised user access by avoiding the cost of access_ok().

Convert csum_and_copy_to_user() and csum_and_copy_from_user() to
scoped user access to benefit from masked user access.

csum_and_copy_to_user() and csum_and_copy_from_user() are only
called respectively by csum_and_copy_to_iter() and
csum_and_copy_from_iter_full() and they are only called twice.

Those functions used to be large but they were first reduced by
commit c693cc46 ("saner calling conventions for
csum_and_copy_..._user()") then commit 70d65cd5 ("ppc: propagate
the calling conventions change down to csum_partial_copy_generic()").
With the additional size reduction provided by conversion to scoped
user access they are not worth being kept out of line.

  $ ./scripts/bloat-o-meter vmlinux.0 vmlinux.1
  add/remove: 0/2 grow/shrink: 2/0 up/down: 136/-176 (-40)
  Function                                     old     new   delta
  csum_and_copy_to_iter                       2416    2488     +72
  csum_and_copy_from_iter_full                2272    2336     +64
  csum_and_copy_to_user                         88       -     -88
  csum_and_copy_from_user                       88       -     -88
  Total: Before=11514471, After=11514431, chg -0.00%

Signed-off-by: default avatarChristophe Leroy (CS GROUP) <chleroy@kernel.org>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/f44e1b2760dbed35b237040001a91bc8304b726b.1773137098.git.chleroy@kernel.org
parent cd54714e
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@

#include <linux/bitops.h>
#include <linux/in6.h>
#include <linux/uaccess.h>
/*
 * Computes the checksum of a memory block at src, length len,
 * and adds in "sum" (32-bit), while copying the block to dst.
@@ -21,11 +22,24 @@
extern __wsum csum_partial_copy_generic(const void *src, void *dst, int len);

#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER
extern __wsum csum_and_copy_from_user(const void __user *src, void *dst,
				      int len);
static inline __wsum csum_and_copy_from_user(const void __user *src, void *dst, int len)
{
	scoped_user_read_access_size(src, len, efault)
		return csum_partial_copy_generic((void __force *)src, dst, len);

efault:
	return 0;
}

#define HAVE_CSUM_COPY_USER
extern __wsum csum_and_copy_to_user(const void *src, void __user *dst,
				    int len);
static inline __wsum csum_and_copy_to_user(const void *src, void __user *dst, int len)
{
	scoped_user_write_access_size(dst, len, efault)
		return csum_partial_copy_generic(src, (void __force *)dst, len);

efault:
	return 0;
}

#define _HAVE_ARCH_CSUM_AND_COPY
#define csum_partial_copy_nocheck(src, dst, len)   \
+1 −2
Original line number Diff line number Diff line
@@ -62,8 +62,7 @@ obj64-$(CONFIG_ALTIVEC) += vmx-helper.o
obj64-$(CONFIG_KPROBES_SANITY_TEST)	+= test_emulate_step.o \
					   test_emulate_step_exec_instr.o

obj-y			+= checksum_$(BITS).o checksum_wrappers.o \
			   string_$(BITS).o
obj-y			+= checksum_$(BITS).o string_$(BITS).o

obj-y			+= sstep.o
obj-$(CONFIG_PPC_FPU)	+= ldstfp.o
+0 −39
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *
 * Copyright (C) IBM Corporation, 2010
 *
 * Author: Anton Blanchard <anton@au.ibm.com>
 */
#include <linux/export.h>
#include <linux/compiler.h>
#include <linux/types.h>
#include <asm/checksum.h>
#include <linux/uaccess.h>

__wsum csum_and_copy_from_user(const void __user *src, void *dst,
			       int len)
{
	__wsum csum;

	if (unlikely(!user_read_access_begin(src, len)))
		return 0;

	csum = csum_partial_copy_generic((void __force *)src, dst, len);

	user_read_access_end();
	return csum;
}

__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len)
{
	__wsum csum;

	if (unlikely(!user_write_access_begin(dst, len)))
		return 0;

	csum = csum_partial_copy_generic(src, (void __force *)dst, len);

	user_write_access_end();
	return csum;
}