mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 15:24:02 -04:00
Remove test_generic_01.sh since block layer may reorder I/O, making the test prone to false positives. Apply the improvements to test_generic_02.sh instead, which supposes for covering ublk dispatch io order. Rework test_generic_02 to verify that ublk dispatch doesn't reorder I/O by comparing request start order with completion order using bpftrace. The bpftrace script now: - Tracks each request's start sequence number in a map keyed by sector - On completion, verifies the request's start order matches expected completion order - Reports any out-of-order completions detected The test script: - Wait bpftrace BEGIN code block is run - Pins fio to CPU 0 for deterministic behavior - Uses block_io_start and block_rq_complete tracepoints - Checks bpftrace output for reordering errors Reported-and-tested-by: Alexander Atanasov <alex@zazolabs.com> Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
54 lines
1.4 KiB
Plaintext
54 lines
1.4 KiB
Plaintext
/*
|
|
$1: dev_t
|
|
$2: RWBS
|
|
$3: strlen($2)
|
|
|
|
Track request order between block_io_start and block_rq_complete.
|
|
Sequence starts at 1 so 0 means "never seen". On first valid
|
|
completion, sync complete_seq to handle probe attachment races.
|
|
block_rq_complete listed first to reduce missed completion window.
|
|
*/
|
|
|
|
BEGIN {
|
|
@start_seq = (uint64)1;
|
|
@complete_seq = (uint64)0;
|
|
@out_of_order = (uint64)0;
|
|
@start_order[0] = (uint64)0;
|
|
delete(@start_order[0]);
|
|
printf("BPFTRACE_READY\n");
|
|
}
|
|
|
|
tracepoint:block:block_rq_complete
|
|
/(int64)args.dev == $1 && !strncmp(args.rwbs, str($2), $3)/
|
|
{
|
|
$expected = @start_order[args.sector];
|
|
if ($expected > 0) {
|
|
if (@complete_seq == 0) {
|
|
@complete_seq = $expected;
|
|
}
|
|
if ($expected != @complete_seq) {
|
|
printf("out_of_order: sector %llu started at seq %llu but completed at seq %llu\n",
|
|
args.sector, $expected, @complete_seq);
|
|
@out_of_order = @out_of_order + 1;
|
|
}
|
|
delete(@start_order[args.sector]);
|
|
@complete_seq = @complete_seq + 1;
|
|
}
|
|
}
|
|
|
|
tracepoint:block:block_io_start
|
|
/(int64)args.dev == $1 && !strncmp(args.rwbs, str($2), $3)/
|
|
{
|
|
@start_order[args.sector] = @start_seq;
|
|
@start_seq = @start_seq + 1;
|
|
}
|
|
|
|
END {
|
|
printf("total_start: %llu total_complete: %llu out_of_order: %llu\n",
|
|
@start_seq - 1, @complete_seq, @out_of_order);
|
|
clear(@start_order);
|
|
clear(@start_seq);
|
|
clear(@complete_seq);
|
|
clear(@out_of_order);
|
|
}
|