net_dropmonitor.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # Monitor the system for dropped packets and proudce a report of drop locations and counts
  2. import os
  3. import sys
  4. sys.path.append(os.environ['PERF_EXEC_PATH'] + \
  5. '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
  6. from perf_trace_context import *
  7. from Core import *
  8. from Util import *
  9. drop_log = {}
  10. kallsyms = []
  11. def get_kallsyms_table():
  12. global kallsyms
  13. try:
  14. f = open("/proc/kallsyms", "r")
  15. linecount = 0
  16. for line in f:
  17. linecount = linecount+1
  18. f.seek(0)
  19. except:
  20. return
  21. j = 0
  22. for line in f:
  23. loc = int(line.split()[0], 16)
  24. name = line.split()[2]
  25. j = j +1
  26. if ((j % 100) == 0):
  27. print "\r" + str(j) + "/" + str(linecount),
  28. kallsyms.append({ 'loc': loc, 'name' : name})
  29. print "\r" + str(j) + "/" + str(linecount)
  30. kallsyms.sort()
  31. return
  32. def get_sym(sloc):
  33. loc = int(sloc)
  34. for i in kallsyms:
  35. if (i['loc'] >= loc):
  36. return (i['name'], i['loc']-loc)
  37. return (None, 0)
  38. def print_drop_table():
  39. print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")
  40. for i in drop_log.keys():
  41. (sym, off) = get_sym(i)
  42. if sym == None:
  43. sym = i
  44. print "%25s %25s %25s" % (sym, off, drop_log[i])
  45. def trace_begin():
  46. print "Starting trace (Ctrl-C to dump results)"
  47. def trace_end():
  48. print "Gathering kallsyms data"
  49. get_kallsyms_table()
  50. print_drop_table()
  51. # called from perf, when it finds a correspoinding event
  52. def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
  53. skbaddr, protocol, location):
  54. slocation = str(location)
  55. try:
  56. drop_log[slocation] = drop_log[slocation] + 1
  57. except:
  58. drop_log[slocation] = 1