Home | History | Annotate | Download | only in linux_perf
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 'use strict';
      6 
      7 /**
      8  * @fileoverview Parses irq events in the Linux event trace format.
      9  */
     10 base.require('tracing.importer.linux_perf.parser');
     11 base.exportTo('tracing.importer.linux_perf', function() {
     12 
     13   var Parser = tracing.importer.linux_perf.Parser;
     14 
     15   /**
     16    * Parses linux irq trace events.
     17    * @constructor
     18    */
     19   function IrqParser(importer) {
     20     Parser.call(this, importer);
     21 
     22     importer.registerEventHandler('irq_handler_entry',
     23         IrqParser.prototype.irqHandlerEntryEvent.bind(this));
     24     importer.registerEventHandler('irq_handler_exit',
     25         IrqParser.prototype.irqHandlerExitEvent.bind(this));
     26     importer.registerEventHandler('softirq_raise',
     27         IrqParser.prototype.softirqRaiseEvent.bind(this));
     28     importer.registerEventHandler('softirq_entry',
     29         IrqParser.prototype.softirqEntryEvent.bind(this));
     30     importer.registerEventHandler('softirq_exit',
     31         IrqParser.prototype.softirqExitEvent.bind(this));
     32   }
     33 
     34   // Matches the irq_handler_entry record
     35   var irqHandlerEntryRE = /irq=(\d+) name=(.+)/;
     36 
     37   // Matches the irq_handler_exit record
     38   var irqHandlerExitRE = /irq=(\d+) ret=(.+)/;
     39 
     40   // Matches the softirq_raise record
     41   var softirqRE = /vec=(\d+) \[action=(.+)\]/;
     42 
     43   IrqParser.prototype = {
     44     __proto__: Parser.prototype,
     45 
     46     /**
     47      * Parses irq events and sets up state in the importer.
     48      */
     49     irqHandlerEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
     50       var event = irqHandlerEntryRE.exec(eventBase.details);
     51       if (!event)
     52         return false;
     53 
     54       var irq = parseInt(event[1]);
     55       var name = event[2];
     56 
     57       var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber);
     58       thread.lastEntryTs = ts;
     59       thread.irqName = name;
     60 
     61       return true;
     62     },
     63 
     64     irqHandlerExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
     65       var event = irqHandlerExitRE.exec(eventBase.details);
     66       if (!event)
     67         return false;
     68 
     69       var irq = parseInt(event[1]);
     70       var ret = event[2];
     71       var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber);
     72 
     73       if (thread.lastEntryTs !== undefined) {
     74         var duration = ts - thread.lastEntryTs;
     75         var slice = new tracing.trace_model.Slice(
     76             '', thread.irqName,
     77             tracing.getStringColorId(event[1]),
     78             thread.lastEntryTs, { ret: ret },
     79             duration);
     80         thread.thread.sliceGroup.pushSlice(slice);
     81       }
     82       thread.lastEntryTs = undefined;
     83       thread.irqName = undefined;
     84       return true;
     85     },
     86 
     87     softirqRaiseEvent: function(eventName, cpuNumber, pid, ts, eventBase) {return true},
     88 
     89     softirqEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
     90       var event = softirqRE.exec(eventBase.details);
     91       if (!event)
     92         return false;
     93 
     94       var action = event[2];
     95       var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber);
     96       thread.lastEntryTs = ts;
     97 
     98       return true;
     99     },
    100 
    101     softirqExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
    102       var event = softirqRE.exec(eventBase.details);
    103       if (!event)
    104         return false;
    105 
    106       var vec = parseInt(event[1]);
    107       var action = event[2];
    108       var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber);
    109 
    110       if (thread.lastEntryTs !== undefined) {
    111         var duration = ts - thread.lastEntryTs;
    112         var slice = new tracing.trace_model.Slice(
    113             '', action,
    114             tracing.getStringColorId(event[1]),
    115             thread.lastEntryTs, { vec: vec },
    116             duration);
    117         thread.thread.sliceGroup.pushSlice(slice);
    118       }
    119       thread.lastEntryTs = undefined;
    120       return true;
    121     }
    122   };
    123 
    124   Parser.registerSubtype(IrqParser);
    125 
    126   return {
    127     IrqParser: IrqParser,
    128   };
    129 });
    130