From: Cyrill Gorcunov <gorcunov@gmail.com> To: tml <tarantool-patches@dev.tarantool.org> Subject: [Tarantool-patches] [PATCH] fiber: set diag error on madvise, mprotect fails Date: Fri, 10 Jan 2020 17:27:49 +0300 [thread overview] Message-ID: <20200110142749.11577-1-gorcunov@gmail.com> (raw) 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
next reply other threads:[~2020-01-10 14:27 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-10 14:27 Cyrill Gorcunov [this message] 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
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=20200110142749.11577-1-gorcunov@gmail.com \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH] fiber: set diag error on madvise, mprotect fails' \ /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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox