seq_io.bt 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. $1: dev_t
  3. $2: RWBS
  4. $3: strlen($2)
  5. Track request order between block_io_start and block_rq_complete.
  6. Sequence starts at 1 so 0 means "never seen". On first valid
  7. completion, sync complete_seq to handle probe attachment races.
  8. block_rq_complete listed first to reduce missed completion window.
  9. */
  10. BEGIN {
  11. @start_seq = (uint64)1;
  12. @complete_seq = (uint64)0;
  13. @out_of_order = (uint64)0;
  14. @start_order[0] = (uint64)0;
  15. delete(@start_order[0]);
  16. printf("BPFTRACE_READY\n");
  17. }
  18. tracepoint:block:block_rq_complete
  19. /(int64)args.dev == $1 && !strncmp(args.rwbs, str($2), $3)/
  20. {
  21. $expected = @start_order[args.sector];
  22. if ($expected > 0) {
  23. if (@complete_seq == 0) {
  24. @complete_seq = $expected;
  25. }
  26. if ($expected != @complete_seq) {
  27. printf("out_of_order: sector %llu started at seq %llu but completed at seq %llu\n",
  28. args.sector, $expected, @complete_seq);
  29. @out_of_order = @out_of_order + 1;
  30. }
  31. delete(@start_order[args.sector]);
  32. @complete_seq = @complete_seq + 1;
  33. }
  34. }
  35. tracepoint:block:block_io_start
  36. /(int64)args.dev == $1 && !strncmp(args.rwbs, str($2), $3)/
  37. {
  38. @start_order[args.sector] = @start_seq;
  39. @start_seq = @start_seq + 1;
  40. }
  41. END {
  42. printf("total_start: %llu total_complete: %llu out_of_order: %llu\n",
  43. @start_seq - 1, @complete_seq, @out_of_order);
  44. clear(@start_order);
  45. clear(@start_seq);
  46. clear(@complete_seq);
  47. clear(@out_of_order);
  48. }