linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Axel Rasmussen <axelrasmussen@google.com>,
	Christian Brauner <brauner@kernel.org>,
	Shuah Khan <skhan@linuxfoundation.org>,
	Sasha Levin <sashal@kernel.org>,
	shuah@kernel.org, linux-kselftest@vger.kernel.org
Subject: [PATCH AUTOSEL 5.10 10/23] pidfd: fix test failure due to stack overflow on some arches
Date: Tue, 15 Feb 2022 10:29:44 -0500	[thread overview]
Message-ID: <20220215152957.581303-10-sashal@kernel.org> (raw)
In-Reply-To: <20220215152957.581303-1-sashal@kernel.org>

From: Axel Rasmussen <axelrasmussen@google.com>

[ Upstream commit 4cbd93c3c110447adc66cb67c08af21f939ae2d7 ]

When running the pidfd_fdinfo_test on arm64, it fails for me. After some
digging, the reason is that the child exits due to SIGBUS, because it
overflows the 1024 byte stack we've reserved for it.

To fix the issue, increase the stack size to 8192 bytes (this number is
somewhat arbitrary, and was arrived at through experimentation -- I kept
doubling until the failure no longer occurred).

Also, let's make the issue easier to debug. wait_for_pid() returns an
ambiguous value: it may return -1 in all of these cases:

1. waitpid() itself returned -1
2. waitpid() returned success, but we found !WIFEXITED(status).
3. The child process exited, but it did so with a -1 exit code.

There's no way for the caller to tell the difference. So, at least log
which occurred, so the test runner can debug things.

While debugging this, I found that we had !WIFEXITED(), because the
child exited due to a signal. This seems like a reasonably common case,
so also print out whether or not we have WIFSIGNALED(), and the
associated WTERMSIG() (if any). This lets us see the SIGBUS I'm fixing
clearly when it occurs.

Finally, I'm suspicious of allocating the child's stack on our stack.
man clone(2) suggests that the correct way to do this is with mmap(),
and in particular by setting MAP_STACK. So, switch to doing it that way
instead.

Signed-off-by: Axel Rasmussen <axelrasmussen@google.com>
Acked-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 tools/testing/selftests/pidfd/pidfd.h         | 13 ++++++++---
 .../selftests/pidfd/pidfd_fdinfo_test.c       | 22 +++++++++++++++----
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/tools/testing/selftests/pidfd/pidfd.h b/tools/testing/selftests/pidfd/pidfd.h
index 01f8d3c0cf2cb..6922d6417e1cf 100644
--- a/tools/testing/selftests/pidfd/pidfd.h
+++ b/tools/testing/selftests/pidfd/pidfd.h
@@ -68,7 +68,7 @@
 #define PIDFD_SKIP 3
 #define PIDFD_XFAIL 4
 
-int wait_for_pid(pid_t pid)
+static inline int wait_for_pid(pid_t pid)
 {
 	int status, ret;
 
@@ -78,13 +78,20 @@ int wait_for_pid(pid_t pid)
 		if (errno == EINTR)
 			goto again;
 
+		ksft_print_msg("waitpid returned -1, errno=%d\n", errno);
 		return -1;
 	}
 
-	if (!WIFEXITED(status))
+	if (!WIFEXITED(status)) {
+		ksft_print_msg(
+		       "waitpid !WIFEXITED, WIFSIGNALED=%d, WTERMSIG=%d\n",
+		       WIFSIGNALED(status), WTERMSIG(status));
 		return -1;
+	}
 
-	return WEXITSTATUS(status);
+	ret = WEXITSTATUS(status);
+	ksft_print_msg("waitpid WEXITSTATUS=%d\n", ret);
+	return ret;
 }
 
 static inline int sys_pidfd_open(pid_t pid, unsigned int flags)
diff --git a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c
index 22558524f71c3..3fd8e903118f5 100644
--- a/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c
+++ b/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <syscall.h>
 #include <sys/wait.h>
+#include <sys/mman.h>
 
 #include "pidfd.h"
 #include "../kselftest.h"
@@ -80,7 +81,10 @@ static inline int error_check(struct error *err, const char *test_name)
 	return err->code;
 }
 
+#define CHILD_STACK_SIZE 8192
+
 struct child {
+	char *stack;
 	pid_t pid;
 	int   fd;
 };
@@ -89,17 +93,22 @@ static struct child clone_newns(int (*fn)(void *), void *args,
 				struct error *err)
 {
 	static int flags = CLONE_PIDFD | CLONE_NEWPID | CLONE_NEWNS | SIGCHLD;
-	size_t stack_size = 1024;
-	char *stack[1024] = { 0 };
 	struct child ret;
 
 	if (!(flags & CLONE_NEWUSER) && geteuid() != 0)
 		flags |= CLONE_NEWUSER;
 
+	ret.stack = mmap(NULL, CHILD_STACK_SIZE, PROT_READ | PROT_WRITE,
+			 MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
+	if (ret.stack == MAP_FAILED) {
+		error_set(err, -1, "mmap of stack failed (errno %d)", errno);
+		return ret;
+	}
+
 #ifdef __ia64__
-	ret.pid = __clone2(fn, stack, stack_size, flags, args, &ret.fd);
+	ret.pid = __clone2(fn, ret.stack, CHILD_STACK_SIZE, flags, args, &ret.fd);
 #else
-	ret.pid = clone(fn, stack + stack_size, flags, args, &ret.fd);
+	ret.pid = clone(fn, ret.stack + CHILD_STACK_SIZE, flags, args, &ret.fd);
 #endif
 
 	if (ret.pid < 0) {
@@ -129,6 +138,11 @@ static inline int child_join(struct child *child, struct error *err)
 	else if (r > 0)
 		error_set(err, r, "child %d reported: %d", child->pid, r);
 
+	if (munmap(child->stack, CHILD_STACK_SIZE)) {
+		error_set(err, -1, "munmap of child stack failed (errno %d)", errno);
+		r = -1;
+	}
+
 	return r;
 }
 
-- 
2.34.1


  parent reply	other threads:[~2022-02-15 15:34 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-15 15:29 [PATCH AUTOSEL 5.10 01/23] ARM: OMAP2+: hwmod: Add of_node_put() before break Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 02/23] ARM: OMAP2+: adjust the location of put_device() call in omapdss_init_of Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 03/23] phy: usb: Leave some clocks running during suspend Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 04/23] usb: usb251xb: add boost-up property support Sasha Levin
2022-02-20 10:12   ` Pavel Machek
2022-02-28 12:23     ` Richard Leitner
2022-03-02  9:24       ` Tommaso Merciai
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 05/23] irqchip/sifive-plic: Add missing thead,c900-plic match string Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 06/23] netfilter: conntrack: don't refresh sctp entries in closed state Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 07/23] arm64: dts: meson-gx: add ATF BL32 reserved-memory region Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 08/23] arm64: dts: meson-g12: " Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 09/23] arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610 Sasha Levin
2022-02-15 15:29 ` Sasha Levin [this message]
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 11/23] selftests: fixup build warnings in pidfd / clone3 tests Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 12/23] kconfig: let 'shell' return enough output for deep path names Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 13/23] scsi: lpfc: Remove NVMe support if kernel has NVME_FC disabled Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 14/23] scsi: lpfc: Reduce log messages seen after firmware download Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 15/23] ata: libata-core: Disable TRIM on M88V29 Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 16/23] soc: aspeed: lpc-ctrl: Block error printing on probe defer cases Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 17/23] xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 18/23] drm/rockchip: dw_hdmi: Do not leave clock enabled in error case Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 19/23] tracing: Fix tp_printk option related with tp_printk_stop_on_boot Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 20/23] NFSD: Fix offset type in I/O trace points Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 21/23] net: usb: qmi_wwan: Add support for Dell DW5829e Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 22/23] net: macb: Align the dma and coherent dma masks Sasha Levin
2022-02-15 15:29 ` [PATCH AUTOSEL 5.10 23/23] kconfig: fix failing to generate auto.conf Sasha Levin

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=20220215152957.581303-10-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=axelrasmussen@google.com \
    --cc=brauner@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=stable@vger.kernel.org \
    /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;
as well as URLs for NNTP newsgroup(s).