blob: c4b7f57f8445d0f91917b38ec4c770934f1c9b63 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2012 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/tracing/extras/importer/linux_perf/parser.html">
<script>
'use strict';
/**
* @fileoverview Parses drm driver events in the Linux event trace format.
*/
tr.exportTo('tr.e.importer.linux_perf', function() {
var Parser = tr.e.importer.linux_perf.Parser;
/**
* Parses linux vmscan trace events.
* @constructor
*/
function MemReclaimParser(importer) {
Parser.call(this, importer);
importer.registerEventHandler('mm_vmscan_kswapd_wake',
MemReclaimParser.prototype.kswapdWake.bind(this));
importer.registerEventHandler('mm_vmscan_kswapd_sleep',
MemReclaimParser.prototype.kswapdSleep.bind(this));
importer.registerEventHandler('mm_vmscan_direct_reclaim_begin',
MemReclaimParser.prototype.reclaimBegin.bind(this));
importer.registerEventHandler('mm_vmscan_direct_reclaim_end',
MemReclaimParser.prototype.reclaimEnd.bind(this));
}
// Matches the mm_vmscan_kswapd_wake record
// mm_vmscan_kswapd_wake: nid=%d order=%d
var kswapdWakeRE = /nid=(\d+) order=(\d+)/;
// Matches the mm_vmscan_kswapd_sleep record
// mm_vmscan_kswapd_sleep: order=%d
var kswapdSleepRE = /nid=(\d+)/;
// Matches the mm_vmscan_direct_reclaim_begin record
// mm_vmscan_direct_reclaim_begin: order=%d may_writepage=%d gfp_flags=%s
var reclaimBeginRE = /order=(\d+) may_writepage=\d+ gfp_flags=(.+)/;
// Matches the mm_vmscan_direct_reclaim_end record
// mm_vmscan_direct_reclaim_end: nr_reclaimed=%lu
var reclaimEndRE = /nr_reclaimed=(\d+)/;
MemReclaimParser.prototype = {
__proto__: Parser.prototype,
/**
* Parses memreclaim events and sets up state in the importer.
*/
kswapdWake: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = kswapdWakeRE.exec(eventBase.details);
if (!event)
return false;
var tgid = parseInt(eventBase.tgid);
var nid = parseInt(event[1]);
var order = parseInt(event[2]);
var kthread = this.importer.getOrCreateKernelThread(
eventBase.threadName, tgid, pid);
if (kthread.openSliceTS) {
if (order > kthread.order) {
kthread.order = order;
}
} else {
kthread.openSliceTS = ts;
kthread.order = order;
}
return true;
},
kswapdSleep: function(eventName, cpuNumber, pid, ts, eventBase) {
var tgid = parseInt(eventBase.tgid);
var kthread = this.importer.getOrCreateKernelThread(
eventBase.threadName, tgid, pid);
if (kthread.openSliceTS) {
kthread.thread.sliceGroup.pushCompleteSlice(
'memreclaim', eventBase.threadName, kthread.openSliceTS,
ts - kthread.openSliceTS, 0, 0,
{
order: kthread.order
});
}
kthread.openSliceTS = undefined;
kthread.order = undefined;
return true;
},
reclaimBegin: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = reclaimBeginRE.exec(eventBase.details);
if (!event)
return false;
var order = parseInt(event[1]);
var gfp = event[2];
var tgid = parseInt(eventBase.tgid);
var kthread = this.importer.getOrCreateKernelThread(
eventBase.threadName, tgid, pid);
kthread.openSliceTS = ts;
kthread.order = order;
kthread.gfp = gfp;
return true;
},
reclaimEnd: function(eventName, cpuNumber, pid, ts, eventBase) {
var event = reclaimEndRE.exec(eventBase.details);
if (!event)
return false;
var nr_reclaimed = parseInt(event[1]);
var tgid = parseInt(eventBase.tgid);
var kthread = this.importer.getOrCreateKernelThread(
eventBase.threadName, tgid, pid);
if (kthread.openSliceTS !== undefined) {
kthread.thread.sliceGroup.pushCompleteSlice('memreclaim',
'direct reclaim', kthread.openSliceTS, ts - kthread.openSliceTS,
0, 0,
{
order: kthread.order,
gfp: kthread.gfp,
nr_reclaimed: nr_reclaimed
});
}
kthread.openSliceTS = undefined;
kthread.order = undefined;
kthread.gfp = undefined;
return true;
}
};
Parser.register(MemReclaimParser);
return {
MemReclaimParser: MemReclaimParser
};
});
</script>