git: 4690e20eed17 - main - tools/uma/smrstress: fix kthread exit
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 30 Jul 2022 21:40:52 UTC
The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=4690e20eed17a6e79a67a8d10874fdc67a1c4ccf commit 4690e20eed17a6e79a67a8d10874fdc67a1c4ccf Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2022-07-30 18:54:34 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2022-07-30 21:40:12 +0000 tools/uma/smrstress: fix kthread exit By convention, kernel threads must call kthread_exit() instead of blindly returning from the thread function. We have some safety measure in fork_exit(), which checks for the P_KPROC p_flag and does kthread_exit() for kernel thread that forgot to do it itself. But this workaround only works for kernel threads belonging to the kernel process. If a kernel thread is attached to the normal process with live userspace, and does not call kthread_exit(), then the workaround is not activated, and for amd64 at least, the return from the thread function/fork_exit() results in the return to userspace with the copy of frame from the thread that did kthread_add(). Practically for smrstress, this destroys the user stack of the still active frame in the other thread, which was the caller of kthread_add(). Fix it by adding kthread_exit() to the thread function. Reported and tested by: pho Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D35999 --- tools/uma/smrstress/smrstress.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/uma/smrstress/smrstress.c b/tools/uma/smrstress/smrstress.c index 7e7ee4ea065c..2cf5f50ffae4 100644 --- a/tools/uma/smrstress/smrstress.c +++ b/tools/uma/smrstress/smrstress.c @@ -123,6 +123,7 @@ smrs_thread(void *arg) else smrs_read(); atomic_add_int(&smrs_completed, 1); + kthread_exit(); } static void