| #!/usr/bin/env python |
| # |
| # Usage: |
| # scripts/throttle.py trace-dat |
| # |
| # Shows how often the trace throttles and for how long. |
| |
| import getopt |
| from tracecmd import * |
| import sys |
| |
| requests = {} |
| throttle = {} |
| prev_throttle = 0; |
| |
| def read_events(t): |
| for cpu in range(0, t.cpus): |
| e = t.read_event(cpu) |
| while e: |
| if e.name == 'i915_gem_request_complete': |
| seqno = e.num_field('seqno') |
| requests[seqno] = e.ts; |
| |
| if e.name == 'i915_gem_request_throttle_begin': |
| seqno = e.num_field('seqno') |
| throttle[seqno] = e.ts |
| |
| if e.name == 'i915_gem_request_throttle_end': |
| global prev_throttle |
| |
| ts = 0 |
| sum_dispatch = 0 |
| num_dispatch = 0 |
| max_dispatch = 0 |
| |
| seqno = e.num_field('seqno') |
| s = prev_throttle |
| if s == 0: |
| s = seqno |
| while s <= seqno: |
| if requests.has_key(s): |
| if ts: |
| delta = requests[s] - ts |
| num_dispatch += 1 |
| sum_dispatch += delta |
| if delta > max_dispatch: max_dispatch = delta |
| ts = requests[s] |
| s += 1 |
| |
| if throttle.has_key(seqno) and throttle.has_key(prev_throttle) and num_dispatch: |
| print "throttle +%d: %dms -- %d dispatch, avg %.3fms, max %dus" % ((throttle[seqno]-throttle[prev_throttle])/1000000, (e.ts - throttle[seqno]) / 1000000, num_dispatch, sum_dispatch / (1000000. * num_dispatch), max_dispatch / 1000) |
| throttle[seqno] = e.ts |
| |
| prev_throttle = seqno |
| |
| e = t.read_event(cpu) |
| |
| if __name__ == "__main__": |
| if len(sys.argv) >=2: |
| filename = sys.argv[1] |
| else: |
| filename = "trace.dat" |
| |
| print "Initializing trace '%s'..." % (filename) |
| trace = Trace(filename) |
| read_events(trace) |
| |