GNU/Weeb Mailing List <[email protected]>
 help / color / mirror / Atom feed
From: Ammar Faizi <[email protected]>
To: Jens Axboe <[email protected]>
Cc: Ammar Faizi <[email protected]>,
	Pavel Begunkov <[email protected]>,
	io-uring Mailing List <[email protected]>,
	GNU/Weeb Mailing List <[email protected]>,
	Muhammad Rizki <[email protected]>,
	Alviro Iskandar Setiawan <[email protected]>,
	Gilang Fachrezy <[email protected]>,
	[email protected]
Subject: [RFC PATCH liburing v1 1/2] nolibc: Do not define `memset()` function in liburing
Date: Thu, 24 Nov 2022 12:46:15 +0700	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>

From: Ammar Faizi <[email protected]>

liburing has its own memset() in nolibc.c. liburing nolibc can be
linked to apps that use libc. libc has an optimized version of memset()
function.

Alviro reports that he found the memset() from liburing replaces the
optimized memset() from libc when he compiled liburing statically.

A simple reproducer:

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>

  int main(void)
  {
          static const size_t len = 1024ul  1024ul  1024ul * 4ul;
          char *p;

          p = malloc(len);
          __asm__ volatile ("":"+m"(p));
          memset(p, 0, len);
          __asm__ volatile ("":"+m"(p));
          return 0;
  }

Compile liburing with:

  # Build liburing nolibc.
  ./configure --nolibc;
  make -j8;

  # Without liburing, memset() comes from libc (good)
  gcc x.c -o x;
  objdump -d x;

  # With liburing.a, memset() comes from liburing (bad)
  gcc x.c -o x src/liburing.a;
  objdump -d x;

When we statically link liburing, the linker will choose the statically
linked memset() over the dynamically linked memset() that the libc
provides.

Change the function name to __uring_memset() and define a macro
memset() as:

   #define memset(PTR, C, LEN) __uring_memset(PTR, C, LEN)

when CONFIG_NOLIBC is enabled so we don't have to touch the callers.

Fixes: f48ee3168cdc325233825603269f304d348d323c ("Add nolibc build support")
Reported-by: Alviro Iskandar Setiawan <[email protected]>
Signed-off-by: Ammar Faizi <[email protected]>
---
 src/lib.h    | 5 +++++
 src/nolibc.c | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/lib.h b/src/lib.h
index f347191..5a9b87c 100644
--- a/src/lib.h
+++ b/src/lib.h
@@ -37,6 +37,7 @@
 #define __hot			__attribute__((__hot__))
 #define __cold			__attribute__((__cold__))
 
+void *__uring_memset(void *s, int c, size_t n);
 void *__uring_malloc(size_t len);
 void __uring_free(void *p);
 
@@ -58,4 +59,8 @@ static inline void uring_free(void *ptr)
 #endif
 }
 
+#ifdef CONFIG_NOLIBC
+#define memset(PTR, C, LEN)	__uring_memset(PTR, C, LEN)
+#endif
+
 #endif /* #ifndef LIBURING_LIB_H */
diff --git a/src/nolibc.c b/src/nolibc.c
index 9a04ead..3207e33 100644
--- a/src/nolibc.c
+++ b/src/nolibc.c
@@ -7,7 +7,7 @@
 #include "lib.h"
 #include "syscall.h"
 
-void *memset(void *s, int c, size_t n)
+void *__uring_memset(void *s, int c, size_t n)
 {
 	size_t i;
 	unsigned char *p = s;
-- 
Ammar Faizi


  reply	other threads:[~2022-11-24  5:46 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-24  5:46 [RFC PATCH liburing v1 0/2] Fix memset() issue and simplify function naming Ammar Faizi
2022-11-24  5:46 ` Ammar Faizi [this message]
2022-11-24  5:46 ` [RFC PATCH liburing v1 2/2] nolibc: Simplify " Ammar Faizi
2022-11-25 13:35 ` [RFC PATCH liburing v1 0/2] Fix memset() issue and simplify " Jens Axboe

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 \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox