sparclinux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next v1 1/2] string: Make memscan() to take const
@ 2023-02-16 11:42 Andy Shevchenko
  2023-02-16 11:42 ` [PATCH net-next v1 2/2] dns: use memscan() instead of open coded variant Andy Shevchenko
  2023-02-21  0:26 ` [PATCH net-next v1 1/2] string: Make memscan() to take const Jakub Kicinski
  0 siblings, 2 replies; 4+ messages in thread
From: Andy Shevchenko @ 2023-02-16 11:42 UTC (permalink / raw)
  To: Andy Shevchenko, Kees Cook, linux-s390, linux-kernel, sparclinux, netdev
  Cc: Heiko Carstens, Vasily Gorbik, Alexander Gordeev,
	Christian Borntraeger, Sven Schnelle, David S. Miller,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
	H. Peter Anvin, Andy Shevchenko, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

Make memscan() to take const so it will be easier replace
some memchr() cases with it.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/s390/include/asm/string.h          | 4 ++--
 arch/s390/lib/string.c                  | 2 +-
 arch/sparc/include/asm/asm-prototypes.h | 4 ++--
 arch/sparc/include/asm/string.h         | 7 ++++---
 arch/x86/include/asm/string_32.h        | 2 +-
 arch/x86/lib/string_32.c                | 2 +-
 include/linux/string.h                  | 2 +-
 lib/string.c                            | 2 +-
 8 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/arch/s390/include/asm/string.h b/arch/s390/include/asm/string.h
index 3fae93ddb322..0196fd466a39 100644
--- a/arch/s390/include/asm/string.h
+++ b/arch/s390/include/asm/string.h
@@ -120,7 +120,7 @@ static inline void *memchr(const void * s, int c, size_t n)
 #endif
 
 #ifdef __HAVE_ARCH_MEMSCAN
-static inline void *memscan(void *s, int c, size_t n)
+static inline void *memscan(const void *s, int c, size_t n)
 {
 	const void *ret = s + n;
 
@@ -205,7 +205,7 @@ static inline size_t strnlen(const char * s, size_t n)
 #endif
 #else /* IN_ARCH_STRING_C */
 void *memchr(const void * s, int c, size_t n);
-void *memscan(void *s, int c, size_t n);
+void *memscan(const void *s, int c, size_t n);
 char *strcat(char *dst, const char *src);
 char *strcpy(char *dst, const char *src);
 size_t strlen(const char *s);
diff --git a/arch/s390/lib/string.c b/arch/s390/lib/string.c
index 7d8741818239..ec9786fde1dd 100644
--- a/arch/s390/lib/string.c
+++ b/arch/s390/lib/string.c
@@ -331,7 +331,7 @@ EXPORT_SYMBOL(memcmp);
  * the area if @c is not found
  */
 #ifdef __HAVE_ARCH_MEMSCAN
-void *memscan(void *s, int c, size_t n)
+void *memscan(const void *s, int c, size_t n)
 {
 	const void *ret = s + n;
 
diff --git a/arch/sparc/include/asm/asm-prototypes.h b/arch/sparc/include/asm/asm-prototypes.h
index 4987c735ff56..3a82a86a27a6 100644
--- a/arch/sparc/include/asm/asm-prototypes.h
+++ b/arch/sparc/include/asm/asm-prototypes.h
@@ -13,8 +13,8 @@
 #include <asm/oplib.h>
 #include <linux/atomic.h>
 
-void *__memscan_zero(void *, size_t);
-void *__memscan_generic(void *, int, size_t);
+void *__memscan_zero(const void *, size_t);
+void *__memscan_generic(const void *, int, size_t);
 void *__bzero(void *, size_t);
 void VISenter(void); /* Dummy prototype to supress warning */
 #undef memcpy
diff --git a/arch/sparc/include/asm/string.h b/arch/sparc/include/asm/string.h
index 001a17baf2d5..7761a037b377 100644
--- a/arch/sparc/include/asm/string.h
+++ b/arch/sparc/include/asm/string.h
@@ -21,10 +21,11 @@ void *memmove(void *, const void *, __kernel_size_t);
 
 #define memscan(__arg0, __char, __arg2)						\
 ({										\
-	void *__memscan_zero(void *, size_t);					\
-	void *__memscan_generic(void *, int, size_t);				\
-	void *__retval, *__addr = (__arg0);					\
+	void *__memscan_zero(const void *, size_t);				\
+	void *__memscan_generic(const void *, int, size_t);			\
+	const void *__addr = (__arg0);						\
 	size_t __size = (__arg2);						\
+	void *__retval;								\
 										\
 	if(__builtin_constant_p(__char) && !(__char))				\
 		__retval = __memscan_zero(__addr, __size);			\
diff --git a/arch/x86/include/asm/string_32.h b/arch/x86/include/asm/string_32.h
index 32c0d981a82a..30245f7707e7 100644
--- a/arch/x86/include/asm/string_32.h
+++ b/arch/x86/include/asm/string_32.h
@@ -223,7 +223,7 @@ static inline void *memset32(uint32_t *s, uint32_t v, size_t n)
  * find the first occurrence of byte 'c', or 1 past the area if none
  */
 #define __HAVE_ARCH_MEMSCAN
-extern void *memscan(void *addr, int c, size_t size);
+extern void *memscan(const void *addr, int c, size_t size);
 
 #endif /* __KERNEL__ */
 
diff --git a/arch/x86/lib/string_32.c b/arch/x86/lib/string_32.c
index 53b3f202267c..4124d6678f72 100644
--- a/arch/x86/lib/string_32.c
+++ b/arch/x86/lib/string_32.c
@@ -198,7 +198,7 @@ EXPORT_SYMBOL(memchr);
 #endif
 
 #ifdef __HAVE_ARCH_MEMSCAN
-void *memscan(void *addr, int c, size_t size)
+void *memscan(const void *addr, int c, size_t size)
 {
 	if (!size)
 		return addr;
diff --git a/include/linux/string.h b/include/linux/string.h
index c062c581a98b..a7bff7ed3cb0 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -150,7 +150,7 @@ extern void * memcpy(void *,const void *,__kernel_size_t);
 extern void * memmove(void *,const void *,__kernel_size_t);
 #endif
 #ifndef __HAVE_ARCH_MEMSCAN
-extern void * memscan(void *,int,__kernel_size_t);
+extern void * memscan(const void *,int,__kernel_size_t);
 #endif
 #ifndef __HAVE_ARCH_MEMCMP
 extern int memcmp(const void *,const void *,__kernel_size_t);
diff --git a/lib/string.c b/lib/string.c
index 3d55ef890106..30a63048d4cc 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -725,7 +725,7 @@ EXPORT_SYMBOL(bcmp);
  * returns the address of the first occurrence of @c, or 1 byte past
  * the area if @c is not found
  */
-void *memscan(void *addr, int c, size_t size)
+void *memscan(const void *addr, int c, size_t size)
 {
 	unsigned char *p = addr;
 
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH net-next v1 2/2] dns: use memscan() instead of open coded variant
  2023-02-16 11:42 [PATCH net-next v1 1/2] string: Make memscan() to take const Andy Shevchenko
@ 2023-02-16 11:42 ` Andy Shevchenko
  2023-02-21  0:26 ` [PATCH net-next v1 1/2] string: Make memscan() to take const Jakub Kicinski
  1 sibling, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2023-02-16 11:42 UTC (permalink / raw)
  To: Andy Shevchenko, Kees Cook, linux-s390, linux-kernel, sparclinux, netdev
  Cc: Heiko Carstens, Vasily Gorbik, Alexander Gordeev,
	Christian Borntraeger, Sven Schnelle, David S. Miller,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
	H. Peter Anvin, Andy Shevchenko, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni

memscan() is a standard API to provide an equivalent to

	memchr(foo, $CHAR, end - foo) ?: end

so use it.

Memory footprint (x86_64):

  Function                                     old     new   delta
  dns_resolver_preparse                       1429    1393     -36
  Total: Before=3229, After=3193, chg -1.11%

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 net/dns_resolver/dns_key.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/net/dns_resolver/dns_key.c b/net/dns_resolver/dns_key.c
index 01e54b46ae0b..835be6e2dd83 100644
--- a/net/dns_resolver/dns_key.c
+++ b/net/dns_resolver/dns_key.c
@@ -134,8 +134,8 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
 
 	/* deal with any options embedded in the data */
 	end = data + datalen;
-	opt = memchr(data, '#', datalen);
-	if (!opt) {
+	opt = memscan(data, '#', datalen);
+	if (opt == end) {
 		/* no options: the entire data is the result */
 		kdebug("no options");
 		result_len = datalen;
@@ -150,7 +150,7 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
 			const char *eq;
 			char optval[128];
 
-			next_opt = memchr(opt, '#', end - opt) ?: end;
+			next_opt = memscan(opt, '#', end - opt);
 			opt_len = next_opt - opt;
 			if (opt_len <= 0 || opt_len > sizeof(optval)) {
 				pr_warn_ratelimited("Invalid option length (%d) for dns_resolver key\n",
@@ -158,16 +158,10 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
 				return -EINVAL;
 			}
 
-			eq = memchr(opt, '=', opt_len);
-			if (eq) {
-				opt_nlen = eq - opt;
-				eq++;
-				memcpy(optval, eq, next_opt - eq);
-				optval[next_opt - eq] = '\0';
-			} else {
-				opt_nlen = opt_len;
-				optval[0] = '\0';
-			}
+			eq = memscan(opt, '=', opt_len);
+			opt_nlen = eq - opt;
+			memcpy(optval, eq, next_opt - eq);
+			optval[next_opt - eq] = '\0';
 
 			kdebug("option '%*.*s' val '%s'",
 			       opt_nlen, opt_nlen, opt, optval);
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH net-next v1 1/2] string: Make memscan() to take const
  2023-02-16 11:42 [PATCH net-next v1 1/2] string: Make memscan() to take const Andy Shevchenko
  2023-02-16 11:42 ` [PATCH net-next v1 2/2] dns: use memscan() instead of open coded variant Andy Shevchenko
@ 2023-02-21  0:26 ` Jakub Kicinski
  2023-02-21  9:37   ` Andy Shevchenko
  1 sibling, 1 reply; 4+ messages in thread
From: Jakub Kicinski @ 2023-02-21  0:26 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Kees Cook, linux-s390, linux-kernel, sparclinux, netdev,
	Heiko Carstens, Vasily Gorbik, Alexander Gordeev,
	Christian Borntraeger, Sven Schnelle, David S. Miller,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
	H. Peter Anvin, Andy Shevchenko, Eric Dumazet, Paolo Abeni

On Thu, 16 Feb 2023 13:42:33 +0200 Andy Shevchenko wrote:
> Make memscan() to take const so it will be easier replace
> some memchr() cases with it.

Let's do this after the merge window.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH net-next v1 1/2] string: Make memscan() to take const
  2023-02-21  0:26 ` [PATCH net-next v1 1/2] string: Make memscan() to take const Jakub Kicinski
@ 2023-02-21  9:37   ` Andy Shevchenko
  0 siblings, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2023-02-21  9:37 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Kees Cook, linux-s390, linux-kernel, sparclinux, netdev,
	Heiko Carstens, Vasily Gorbik, Alexander Gordeev,
	Christian Borntraeger, Sven Schnelle, David S. Miller,
	Thomas Gleixner, Ingo Molnar, Borislav Petkov, Dave Hansen, x86,
	H. Peter Anvin, Eric Dumazet, Paolo Abeni

On Mon, Feb 20, 2023 at 04:26:53PM -0800, Jakub Kicinski wrote:
> On Thu, 16 Feb 2023 13:42:33 +0200 Andy Shevchenko wrote:
> > Make memscan() to take const so it will be easier replace
> > some memchr() cases with it.
> 
> Let's do this after the merge window.

Sure, it needs to be revised anyway. I just noticed that one corner case might
not work properly.

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-02-21  9:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-16 11:42 [PATCH net-next v1 1/2] string: Make memscan() to take const Andy Shevchenko
2023-02-16 11:42 ` [PATCH net-next v1 2/2] dns: use memscan() instead of open coded variant Andy Shevchenko
2023-02-21  0:26 ` [PATCH net-next v1 1/2] string: Make memscan() to take const Jakub Kicinski
2023-02-21  9:37   ` Andy Shevchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).