fix hang when BLKTRACESETUP fails and "-o -" is used

Resolves: RHEL-54661

Signed-off-by: Pavel Reichl <preichl@redhat.com>
This commit is contained in:
Pavel Reichl 2024-08-18 22:29:50 +02:00
parent 0595940960
commit d6d2450897
2 changed files with 63 additions and 1 deletions

View File

@ -1,7 +1,7 @@
Summary: Utilities for performing block layer IO tracing in the Linux kernel
Name: blktrace
Version: 1.2.0
Release: 19%{?dist}
Release: 20%{?dist}
License: GPLv2+
Source: http://brick.kernel.dk/snaps/blktrace-%{version}.tar.bz2
Url: http://brick.kernel.dk/snaps
@ -16,6 +16,8 @@ Patch0: blktrace-fix-btt-overflow.patch
Patch1: blktrace-python3.patch
Patch2: 0001-fix-parallel-build-failures.patch
Patch3: 0001-fix-parallel-build-of-btt-and-blkiomon.patch
# Upstream: blktrace-1.3.0-5-g1836be5
Patch4: for-next-fix-hang-when-BLKTRACESETUP-fails-and-o-is-used.patch
%description
blktrace is a block layer IO tracing mechanism which provides detailed
@ -32,6 +34,7 @@ information about IO patterns.
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
sed -i '1s=^#!/usr/bin/python3=#!%{__python3}=' \
btt/{btt_plot.py,bno_plot.py}
@ -85,6 +88,10 @@ information about IO patterns.
%{_mandir}/man1/iowatcher.*
%changelog
* Sun Aug 18 2024 Pavel Reichl <preichl@redhat.com> - 1.2.0-20
- fix hang when BLKTRACESETUP fails and "-o -" is used
- Related RHEL-54661
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1.2.0-19
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688

View File

@ -0,0 +1,55 @@
From 1836be5d99c9362f1e2b39206c95270f19cb7faa Mon Sep 17 00:00:00 2001
From: Eric Sandeen <sandeen@redhat.com>
Date: Wed, 5 Jun 2024 23:07:27 -0500
Subject: [PATCH] fix hang when BLKTRACESETUP fails and "-o -" is used
# blktrace -o - /dev/sda /dev/sdb /dev/sdc
has to be SIGKILLed if BLKTRACESETUP fails for any or all of the devices
listed. (I simulated this by just catching one of the devices in
setup_buts(), skipping the ioctl, and doing ret++).
This seems to be because with "-o -" on the command line, use_tracer_devpaths()
sees piped_output set, so we call process_trace_bufs which ends up waiting on
(!done) and "done" is never set. i.e.
atexit(exit_tracing)
wait_tracers
if (use_tracer_devpaths()) // true because "-o -"
process_trace_bufs
while (wait_empty_entries())
wait_empty_entries
while (!done ... )
<loop forever>
I think this can be avoided by just setting "done = 1" before returning
when setup_buts() fails in run_tracers().
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Link: https://lore.kernel.org/r/f3204c9d-1384-40b5-a5fb-3bb967ca2bec@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Pavel Reichl <preichl@redhat.com>
---
blktrace.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/blktrace.c b/blktrace.c
index 3444fbb..038b2cb 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -2684,8 +2684,10 @@ static int run_tracers(void)
if (net_mode == Net_client)
printf("blktrace: connecting to %s\n", hostname);
- if (setup_buts())
+ if (setup_buts()) {
+ done = 1;
return 1;
+ }
if (use_tracer_devpaths()) {
if (setup_tracer_devpaths())
--
2.46.0