diff --git a/blktrace-fix-exit-directly-when-nthreads-running.patch b/blktrace-fix-exit-directly-when-nthreads-running.patch new file mode 100644 index 0000000000000000000000000000000000000000..ffd5090578d35469cb259325463a0d090530d846 --- /dev/null +++ b/blktrace-fix-exit-directly-when-nthreads-running.patch @@ -0,0 +1,65 @@ +From 3a1b1366d30375cdb0f5b299df4edda0c8ba3bcc Mon Sep 17 00:00:00 2001 +From: lijinlin +Date: Mon, 28 Jun 2021 13:41:32 -0600 +Subject: blktrace: exit directly when nthreads_running != ncpus in + run_tracers() + +We found blktrace got stuck when cgroup restricts blktrace to use cpu, +the messages and stack is: +[root@localhost ~]# blktrace -w 10 -o- /dev/sda +FAILED to start thread on CPU 1: 22/Invalid argument +FAILED to start thread on CPU 2: 22/Invalid argument +[root@localhost ~]# cat /proc/1385110/stack +[<0>] __switch_to+0xe8/0x150 +[<0>] futex_wait_queue_me+0xd4/0x158 +[<0>] futex_wait+0xf4/0x230 +[<0>] do_futex+0x470/0x900 +[<0>] __arm64_sys_futex+0x13c/0x188 +[<0>] el0_svc_common+0x80/0x200 +[<0>] el0_svc_handler+0x78/0xe0 +[<0>] el0_svc+0x10/0x260 +[<0>] 0xffffffffffffffff + +Blktrace failed to start thread is caused by thread can't lock on the +Restricted cpu. In this case, blktrace would't schedule an alarm after +defined time to set variable 'done' as 1. +We debug the code and found the call trace as bellow: +main() + ==>run_tracers() + ==>wait_tracers() + ==>process_trace_bufs() + ==>wait_empty_entries() + ==>t_pthread_cond_wait() +Blktrace was set to piped output, so the process is stuck in +wait_empty_entries() for wait variable 'done' have been set as 1. + +We set variable 'done' as 1 when 'nthreads_running' is not equal to +'ncpus' in run_tracers() to fix the problem. + +Signed-off-by: lijinlin +Signed-off-by: Zhiqiang Liu +Signed-off-by: Lixiaokeng +Signed-off-by: Jens Axboe +--- + blktrace.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/blktrace.c b/blktrace.c +index 82a6aad..3444fbb 100644 +--- a/blktrace.c ++++ b/blktrace.c +@@ -2705,8 +2705,10 @@ static int run_tracers(void) + printf("blktrace: connected!\n"); + if (stop_watch) + alarm(stop_watch); +- } else ++ } else { + stop_tracers(); ++ done = 1; ++ } + + wait_tracers(); + if (nthreads_running == ncpus) +-- +cgit 1.2.3-1.el7 + diff --git a/blktrace.spec b/blktrace.spec index 7b1ea0d97ae2542bed3d61dc3698aac7c29f581a..5095619f7fc8b6d34ee6fb1a0c3656e19ce10ed7 100644 --- a/blktrace.spec +++ b/blktrace.spec @@ -1,6 +1,6 @@ Name: blktrace Version: 1.2.0 -Release: 17 +Release: 18 Summary: Block IO tracer in the Linux kernel License: GPLv2+ Source: http://brick.kernel.dk/snaps/blktrace-%{version}.tar.bz2 @@ -14,6 +14,7 @@ Requires: python3 Patch0: blktrace-fix-btt-overflow.patch Patch1: remove-python2-dependency.patch Patch2: modify-python2-expression-to-python3.patch +Patch3: blktrace-fix-exit-directly-when-nthreads-running.patch %description blktrace is a block layer IO tracing mechanism which provides detailed @@ -48,6 +49,9 @@ make dest=%{buildroot} prefix=%{buildroot}/%{_prefix} mandir=%{buildroot}/%{_man %{_mandir}/man8/* %changelog +* Mon Jul 05 2021 linxiaoran - 1.2.0-18 +- blktrace fix exit direclty when nthreads running + * Tue Feb 9 2021 Zhiqiang Liu - 1.2.0-17 - set release num to 17 for CI