From: Omar Sandoval Date: Tue, 24 Apr 2018 22:38:33 +0000 (-0700) Subject: block: add regression test for interruptible wait X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=257a3e555bf14f5cf05716c955a45459f56d76bd;p=users%2Fsagi%2Fblktests.git block: add regression test for interruptible wait Add a regression test for 1dc3039bc87a ("block: do not use interruptible wait anywhere") using null-blk. Signed-off-by: Omar Sandoval --- diff --git a/tests/block/016 b/tests/block/016 new file mode 100755 index 0000000..6ccfe98 --- /dev/null +++ b/tests/block/016 @@ -0,0 +1,57 @@ +#!/bin/bash +# +# Test a nasty case where receiving a signal while waiting for a frozen +# request_queue would result in EIO. Regression test for 1dc3039bc87a ("block: +# do not use interruptible wait anywhere"). +# +# Copyright (C) 2018 Omar Sandoval +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +DESCRIPTION="send a signal to a process waiting on a frozen queue" +QUICK=1 + +requires() { + _have_module null_blk +} + +test() { + echo "Running ${TEST_NAME}" + + modprobe -r null_blk + + modprobe null_blk queue_mode=2 irqmode=2 completion_nsec=2000000000 + + # Start an I/O, which will take two seconds. + dd if=/dev/nullb0 of=/dev/null bs=512 iflag=direct count=1 status=none & + sleep 0.5 + + # This will freeze the queue, and since we have an I/O in flight, it + # will stay frozen until the I/O completes. + echo 64 > /sys/block/nullb0/queue/nr_requests & + sleep 0.5 + + # Do an I/O, which will wait for the queue to unfreeze. + dd if=/dev/nullb0 of=/dev/null bs=512 iflag=direct count=1 status=none & + sleep 0.5 + + # While dd is blocked, send a signal which we know dd has a handler + # for. + kill -USR1 $! + wait + + modprobe -r null_blk + + echo "Test complete" +} diff --git a/tests/block/016.out b/tests/block/016.out new file mode 100644 index 0000000..e851e8e --- /dev/null +++ b/tests/block/016.out @@ -0,0 +1,2 @@ +Running block/016 +Test complete