On 03/28/2017 09:30 AM, Jens Axboe wrote:
> On 03/28/2017 10:25 AM, Bart Van Assche wrote:
>> I do not know whether it would be possible to modify the test such that only
>> the dm driver is involved but no SCSI code.
> 
> How about the other way around? Just SCSI, but no dm?

Hello Jens,

Sorry but it could take a long time to figure out how to reproduce this
issue if I start modifying the test. BTW, the patch I just posted 
("blk-mq: Export queue state through /sys/kernel/debug/block/*/state") 
allows me to trigger a blk-mq queue run from user space. If the lockup
occurs and I use that facility to trigger a queue run the test proceeds.
The command I used to trigger a queue run is as follows:

for a in /sys/kernel/debug/block/*/state; do echo 1 >$a; wait

> Thanks for running it again, but it's the wrong state file. I should have
> been more clear. The one I'm interested in is in the mq/<num>/ directories,
> like the 'tags' etc files.
> 
> Ala:
>  
>               for f in "$d"/{dispatch,state,tags*,cpu*/rq_list}; do

Ah, thanks, that makes it clear :-)
 
> Also, can you include the involved dm devices as well for this state
> dump?

I would like to, but the 02-sq-on-mq test configures the dm device 
nodes in single queue mode and there is only information available 
under /sys/kernel/debug/block/ for blk-mq devices ...

Anyway, the updated script:

#!/bin/bash

show_state() {
    local a dev=$1

    for a in device/state queue/scheduler; do
        [ -e "$dev/$a" ] && grep -aH '' "$dev/$a"
    done
}

cd /sys/class/block || exit $?
for dev in *; do
    if [ -e "$dev/mq" ]; then
        echo "$dev"
        pending=0
        for f in "$dev"/mq/*/{pending,*/rq_list}; do
            [ -e "$f" ] || continue
            if { read -r line1 && read -r line2; } <"$f"; then
                echo "$f"
                echo "$line1 $line2" >/dev/null
                head -n 9 "$f"
                ((pending++))
            fi
        done
        (
            busy=0
            cd /sys/kernel/debug/block >&/dev/null &&
            for d in "$dev"/mq/*; do
                [ ! -d "$d" ] && continue
                grep -q '^busy=0$' "$d/tags" && continue
                ((busy++))
                for f in "$d"/{dispatch,state,tags*,cpu*/rq_list}; do
                    [ -e "$f" ] && grep -aH '' "$f"
                done
            done
            exit $busy
        )
        pending=$((pending+$?))
        if [ "$pending" -gt 0 ]; then
            grep -aH '' /sys/kernel/debug/block/"$dev"/state
            show_state "$dev"
        fi
    fi
done


And the output for the test run of today:

sda
sdb
sdd
sdd/mq/0/dispatch:ffff88036437d140 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=53, .internal_tag=-1}
sdd/mq/0/state:0x4
sdd/mq/0/tags:nr_tags=62
sdd/mq/0/tags:nr_reserved_tags=0
sdd/mq/0/tags:active_queues=0
sdd/mq/0/tags:
sdd/mq/0/tags:bitmap_tags:
sdd/mq/0/tags:depth=62
sdd/mq/0/tags:busy=31
sdd/mq/0/tags:bits_per_word=8
sdd/mq/0/tags:map_nr=8
sdd/mq/0/tags:alloc_hint={48, 48, 38, 44, 54, 6, 52, 23, 30, 6, 51, 26, 61, 45, 
9, 56, 55, 13, 44, 45, 12, 12, 23, 42, 44, 24, 41, 0, 54, 4, 4, 45}
sdd/mq/0/tags:wake_batch=7
sdd/mq/0/tags:wake_index=0
sdd/mq/0/tags:ws={
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sdd/mq/0/tags:}
sdd/mq/0/tags:round_robin=0
sdd/mq/0/tags_bitmap:00000000: ffff 7f00 0000 e01f
sdd/mq/0/cpu7/rq_list:ffff88036437e880 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=54, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef0000 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=55, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef1740 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=56, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef2e80 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=57, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef45c0 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=58, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef5d00 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=59, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f7ef7440 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=60, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386760000 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=0, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386761740 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=1, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386762e80 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=2, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803867645c0 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=3, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386765d00 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=4, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386767440 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=5, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff880386768b80 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=6, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff88038676a2c0 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=7, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff88038676ba00 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=8, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff88038676d140 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=9, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff88038676e880 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=10, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8650000 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=11, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8651740 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=12, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8652e80 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=13, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f86545c0 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=14, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8655d00 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=15, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8657440 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=16, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f8658b80 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=17, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f865a2c0 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=18, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f865ba00 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=19, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f865d140 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=20, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803f865e880 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=21, .internal_tag=-1}
sdd/mq/0/cpu7/rq_list:ffff8803fb630000 {.cmd_flags=0xca01, .rq_flags=0x2040, 
.tag=22, .internal_tag=-1}
/sys/kernel/debug/block/sdd/state:SAME_COMP STACKABLE IO_STAT INIT_DONE POLL
sdd/device/state:running
sdd/queue/scheduler:[none] 
sde
sde/mq/0/state:0x0
sde/mq/0/tags:nr_tags=62
sde/mq/0/tags:nr_reserved_tags=0
sde/mq/0/tags:active_queues=0
sde/mq/0/tags:
sde/mq/0/tags:bitmap_tags:
sde/mq/0/tags:depth=62
sde/mq/0/tags:busy=31
sde/mq/0/tags:bits_per_word=8
sde/mq/0/tags:map_nr=8
sde/mq/0/tags:alloc_hint={48, 48, 38, 44, 54, 6, 52, 23, 30, 6, 51, 26, 61, 45, 
9, 56, 55, 13, 44, 45, 12, 12, 23, 42, 44, 24, 41, 0, 54, 4, 4, 45}
sde/mq/0/tags:wake_batch=7
sde/mq/0/tags:wake_index=0
sde/mq/0/tags:ws={
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:  {.wait_cnt=7, .wait=inactive},
sde/mq/0/tags:}
sde/mq/0/tags:round_robin=0
sde/mq/0/tags_bitmap:00000000: ffff 7f00 0000 e01f
/sys/kernel/debug/block/sde/state:SAME_COMP STACKABLE IO_STAT INIT_DONE POLL
sde/device/state:running
sde/queue/scheduler:[none] 
sdf
sdg
sdh
sdi
sdj
sdk
sr0

Reply via email to