/usr/share/systemtap/runtime/perf.c is in systemtap-common 1.7-1+deb7u1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | /* -*- linux-c -*-
* Perf Functions
* Copyright (C) 2006 Red Hat Inc.
* Copyright (C) 2010 Red Hat Inc.
*
* This file is part of systemtap, and is free software. You can
* redistribute it and/or modify it under the terms of the GNU General
* Public License (GPL); either version 2, or (at your option) any
* later version.
*/
#ifndef _PERF_C_
#define _PERF_C_
#include <linux/perf_event.h>
#include "perf.h"
/** @file perf.c
* @brief Implements performance monitoring hardware support
*/
/** Initialize performance sampling
* Call this during probe initialization to set up performance event sampling
* for all online cpus. Returns non-zero on error.
*
* @param stp Handle for the event to be registered.
*/
static long _stp_perf_init (struct stap_perf_probe *stp)
{
int cpu;
/* allocate space for the event descriptor for each cpu */
stp->events = _stp_alloc_percpu (sizeof(struct perf_event*));
if (stp->events == NULL) {
return -ENOMEM;
}
/* initialize event on each processor */
stp_for_each_cpu(cpu) {
struct perf_event **event = per_cpu_ptr (stp->events, cpu);
if (cpu_is_offline(cpu)) {
*event = NULL;
continue;
}
*event = perf_event_create_kernel_counter(&stp->attr,
cpu,
#if defined(STAPCONF_PERF_STRUCTPID) || defined (STAPCONF_PERF_COUNTER_CONTEXT)
NULL,
#else
-1,
#endif
stp->callback
#ifdef STAPCONF_PERF_COUNTER_CONTEXT
, NULL
#endif
);
if (IS_ERR(*event)) {
long rc = PTR_ERR(*event);
*event = NULL;
_stp_perf_del(stp);
return rc;
}
}
return 0;
}
/** Delete performance event.
* Call this to shutdown performance event sampling
*
* @param stp Handle for the event to be unregistered.
*/
static void _stp_perf_del (struct stap_perf_probe *stp)
{
if (stp && stp->events) {
int cpu;
/* shut down performance event sampling */
stp_for_each_cpu(cpu) {
struct perf_event **event = per_cpu_ptr (stp->events, cpu);
if (*event) {
perf_event_release_kernel(*event);
}
}
_stp_free_percpu (stp->events);
stp->events = NULL;
}
}
#endif /* _PERF_C_ */
|