Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH] fiber: set diag error on madvise, mprotect fails
@ 2020-01-10 14:27 Cyrill Gorcunov
  2020-01-11  7:03 ` Oleg Babin
  2020-01-15 13:35 ` Alexander Turenko
  0 siblings, 2 replies; 6+ messages in thread
From: Cyrill Gorcunov @ 2020-01-10 14:27 UTC (permalink / raw)
  To: tml

Currently we use say_x to log if error happened.
Strictly speaking when madvise is used to relax
pressue on mm subsystem since we started to use
bigger stacks (due to libreadline increased memory
usage).

Same time mprotect usage is more sensitive -- we
setup guard pages with its help and when failing
it is definitely an error which we should not only
mention in logger but provide a caller diag error.
Here is an example from memcached

 |	expire_fiber = fiber_new(name, memcached_expire_loop);
 |	const box_error_t *err = box_error_last();
 |	if (err) {
 |		say_error("Can't start the expire fiber");
 |		say_error("%s", box_error_message(err));
 |		return -1;
 |	}

Thus make fiber_madivse and fiber_mprotect being inline
functions instead of macros and setup diag error accordingly.

Fixes #4722

Reported-by: Alexander Turenko <alexander.turenko@tarantool.org>
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
---
issue https://github.com/tarantool/tarantool/issues/4722
branch gorcunov/gh-4722-mprotect-diag-error

 src/lib/core/fiber.c | 36 +++++++++++++++++++++---------------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c
index 00ae8cded..724260bad 100644
--- a/src/lib/core/fiber.c
+++ b/src/lib/core/fiber.c
@@ -173,21 +173,27 @@ static int (*fiber_invoke)(fiber_func f, va_list ap);
 #define ASAN_FINISH_SWITCH_FIBER(var_name)
 #endif
 
-#define fiber_madvise(addr, len, advice)				\
-({									\
-	int err = madvise((addr), (len), (advice));			\
-	if (err)							\
-		say_syserror("madvise");				\
-	err;								\
-})
-
-#define fiber_mprotect(addr, len, prot)					\
-({									\
-	int err = mprotect((addr), (len), (prot));			\
-	if (err)							\
-		say_syserror("mprotect");				\
-	err;								\
-})
+static inline int
+fiber_madvise(void *addr, size_t len, int advice)
+{
+	if (madvise(addr, len, advice)) {
+		diag_set(SystemError, "fiber madvise %p:%zu:%d failed",
+			 addr, len, advice);
+		return -1;
+	}
+	return 0;
+}
+
+static inline int
+fiber_mprotect(void *addr, size_t len, int prot)
+{
+	if (mprotect(addr, len, prot)) {
+		diag_set(SystemError, "fiber mprotect %p:%zu:%d failed",
+			 addr, len, prot);
+		return -1;
+	}
+	return 0;
+}
 
 #if ENABLE_FIBER_TOP
 static __thread bool fiber_top_enabled = false;
-- 
2.20.1

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

end of thread, other threads:[~2020-01-15 13:39 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-10 14:27 [Tarantool-patches] [PATCH] fiber: set diag error on madvise, mprotect fails Cyrill Gorcunov
2020-01-11  7:03 ` Oleg Babin
2020-01-11  7:38   ` Cyrill Gorcunov
2020-01-12  9:27   ` Cyrill Gorcunov
2020-01-15 13:35 ` Alexander Turenko
2020-01-15 13:39   ` Cyrill Gorcunov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox