gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Private Member Functions | Private Attributes | List of all members
PerfKvmCounter Class Reference

An instance of a performance counter. More...

#include <perfevent.hh>

Public Member Functions

 PerfKvmCounter (PerfKvmCounterConfig &config, pid_t tid)
 Create and attach a new counter group. More...
 
 PerfKvmCounter (PerfKvmCounterConfig &config, pid_t tid, const PerfKvmCounter &parent)
 Create and attach a new counter and make it a member of an exist counter group. More...
 
 PerfKvmCounter ()
 Create a new counter, but don't attach it. More...
 
 ~PerfKvmCounter ()
 
void attach (PerfKvmCounterConfig &config, pid_t tid)
 Attach a counter. More...
 
void attach (PerfKvmCounterConfig &config, pid_t tid, const PerfKvmCounter &parent)
 Attach a counter and make it a member of an existing counter group. More...
 
void detach ()
 Detach a counter from PerfEvent. More...
 
bool attached () const
 Check if a counter is attached. More...
 
void start ()
 Start counting. More...
 
void stop ()
 Stop counting. More...
 
void period (uint64_t period)
 Update the period of an overflow counter. More...
 
void refresh (int refresh)
 Enable a counter for a fixed number of events. More...
 
uint64_t read () const
 Read the current value of a counter. More...
 
void enableSignals (pid_t tid, int signal)
 Enable signal delivery to a thread on counter overflow. More...
 
void enableSignals (int signal)
 Enable signal delivery on counter overflow. More...
 

Private Member Functions

 PerfKvmCounter (const PerfKvmCounter &that)
 
PerfKvmCounteroperator= (const PerfKvmCounter &that)
 
void attach (PerfKvmCounterConfig &config, pid_t tid, int group_fd)
 
pid_t gettid ()
 Get the TID of the current thread. More...
 
void mmapPerf (int pages)
 MMAP the PerfEvent file descriptor. More...
 
void read (void *buf, size_t size) const
 Perform a read from the counter file descriptor. More...
 
int fcntl (int cmd, long p1)
 PerfEvent fnctl interface. More...
 
int fcntl (int cmd, void *p1)
 
int ioctl (int request, long p1)
 PerfEvent ioctl interface. More...
 
int ioctl (int request, void *p1)
 
int ioctl (int request)
 

Private Attributes

int fd
 PerfEvent file descriptor associated with counter. More...
 
struct perf_event_mmap_page * ringBuffer
 Memory mapped PerfEvent sample ring buffer. More...
 
int ringNumPages
 Total number of pages in ring buffer. More...
 
long pageSize
 Cached host page size. More...
 

Detailed Description

An instance of a performance counter.

Definition at line 170 of file perfevent.hh.

Constructor & Destructor Documentation

PerfKvmCounter::PerfKvmCounter ( PerfKvmCounterConfig config,
pid_t  tid 
)

Create and attach a new counter group.

Parameters
configCounter configuration
tidThread to sample (0 indicates current thread)

Definition at line 70 of file perfevent.cc.

References attach().

PerfKvmCounter::PerfKvmCounter ( PerfKvmCounterConfig config,
pid_t  tid,
const PerfKvmCounter parent 
)

Create and attach a new counter and make it a member of an exist counter group.

Parameters
configCounter configuration
tidThread to sample (0 indicates current thread)
parentGroup leader

Definition at line 76 of file perfevent.cc.

References attach().

PerfKvmCounter::PerfKvmCounter ( )

Create a new counter, but don't attach it.

Definition at line 83 of file perfevent.cc.

PerfKvmCounter::~PerfKvmCounter ( )

Definition at line 88 of file perfevent.cc.

References attached(), and detach().

PerfKvmCounter::PerfKvmCounter ( const PerfKvmCounter that)
private

Member Function Documentation

void PerfKvmCounter::attach ( PerfKvmCounterConfig config,
pid_t  tid 
)
inline

Attach a counter.

Note
This operation is only supported if the counter isn't already attached.
Parameters
configCounter configuration
tidThread to sample (0 indicates current thread)

Definition at line 206 of file perfevent.hh.

Referenced by attach(), PerfKvmCounter(), BaseKvmCPU::setupCounters(), and BaseKvmCPU::setupInstCounter().

void PerfKvmCounter::attach ( PerfKvmCounterConfig config,
pid_t  tid,
const PerfKvmCounter parent 
)
inline

Attach a counter and make it a member of an existing counter group.

Note
This operation is only supported if the counter isn't already attached.
Parameters
configCounter configuration
tidThread to sample (0 indicates current thread)
parentGroup leader

Definition at line 221 of file perfevent.hh.

References attach(), and fd.

void PerfKvmCounter::attach ( PerfKvmCounterConfig config,
pid_t  tid,
int  group_fd 
)
private

Definition at line 161 of file perfevent.cc.

References attached(), PerfKvmCounterConfig::attr, fd, mmapPerf(), and panic.

bool PerfKvmCounter::attached ( ) const
inline

Check if a counter is attached.

Definition at line 230 of file perfevent.hh.

References fd.

Referenced by attach(), detach(), fcntl(), ioctl(), mmapPerf(), read(), BaseKvmCPU::setupInstCounter(), and ~PerfKvmCounter().

void PerfKvmCounter::detach ( )

Detach a counter from PerfEvent.

Definition at line 95 of file perfevent.cc.

References attached(), fd, pageSize, ringBuffer, ringNumPages, and warn.

Referenced by BaseKvmCPU::notifyFork(), BaseKvmCPU::setupInstCounter(), and ~PerfKvmCounter().

void PerfKvmCounter::enableSignals ( pid_t  tid,
int  signal 
)

Enable signal delivery to a thread on counter overflow.

Parameters
tidThread to deliver signal to
signalSignal to send upon overflow

Definition at line 146 of file perfevent.cc.

References fcntl(), and panic.

Referenced by PerfKvmTimer::PerfKvmTimer(), and BaseKvmCPU::setupInstCounter().

void PerfKvmCounter::enableSignals ( int  signal)
inline

Enable signal delivery on counter overflow.

Identical to enableSignals(pid_t) when called with the current TID as its parameter.

Parameters
signalSignal to send upon overflow

Definition at line 300 of file perfevent.hh.

References enableSignals(), and gettid().

Referenced by enableSignals().

int PerfKvmCounter::fcntl ( int  cmd,
long  p1 
)
private

PerfEvent fnctl interface.

Parameters
cmdfcntl command
p1Request parameter
Returns
-1 on error (error number in errno), ioctl dependent value otherwise.

Definition at line 207 of file perfevent.cc.

References attached(), and fd.

Referenced by enableSignals().

int PerfKvmCounter::fcntl ( int  cmd,
void *  p1 
)
inlineprivate

Definition at line 342 of file perfevent.hh.

References fcntl().

Referenced by fcntl().

pid_t PerfKvmCounter::gettid ( )
private

Get the TID of the current thread.

Returns
Current thread's TID

Definition at line 178 of file perfevent.cc.

Referenced by enableSignals().

int PerfKvmCounter::ioctl ( int  request,
long  p1 
)
private

PerfEvent ioctl interface.

Parameters
requestPerfEvent request
p1Optional request parameter
Returns
-1 on error (error number in errno), ioctl dependent value otherwise.

Definition at line 214 of file perfevent.cc.

References attached(), and fd.

Referenced by period(), refresh(), start(), and stop().

int PerfKvmCounter::ioctl ( int  request,
void *  p1 
)
inlineprivate

Definition at line 356 of file perfevent.hh.

References ioctl().

Referenced by ioctl().

int PerfKvmCounter::ioctl ( int  request)
inlineprivate

Definition at line 357 of file perfevent.hh.

References ioctl(), and X86ISA::L.

Referenced by ioctl().

void PerfKvmCounter::mmapPerf ( int  pages)
private

MMAP the PerfEvent file descriptor.

Note
We currently don't use the ring buffer, but PerfEvent requires this to be mapped for overflow handling to work.
Overflow handling requires at least one buf_page to be mapped.
Parameters
pagesnumber of pages in circular sample buffer. Must be an even power of 2.

Definition at line 184 of file perfevent.cc.

References attached(), fd, pageSize, panic, ringBuffer, and ringNumPages.

Referenced by attach().

PerfKvmCounter& PerfKvmCounter::operator= ( const PerfKvmCounter that)
private
void PerfKvmCounter::period ( uint64_t  period)

Update the period of an overflow counter.

Warning
This ioctl has some pretty bizarre semantics. It seems like the new period isn't effective until after the next counter overflow. If you use this method to change the sample period, you will see one sample with the old period and then start sampling with the new period. This problem was fixed for ARM in version 3.7 of the kernel.
This method doesn't work at all on some 2.6.3x kernels since it has inverted check for the return value when copying parameters from userspace.
Parameters
periodOverflow period in events

Definition at line 123 of file perfevent.cc.

References ioctl(), and panic.

Referenced by PerfKvmTimer::arm().

uint64_t PerfKvmCounter::read ( ) const

Read the current value of a counter.

Definition at line 137 of file perfevent.cc.

Referenced by BaseKvmCPU::getHostCycles(), BaseKvmCPU::kvmRun(), and read().

void PerfKvmCounter::read ( void *  buf,
size_t  size 
) const
private

Perform a read from the counter file descriptor.

Parameters
bufDestination buffer
sizeAmount of data to read

Definition at line 221 of file perfevent.cc.

References attached(), fd, panic, read(), and X86ISA::size().

void PerfKvmCounter::refresh ( int  refresh)

Enable a counter for a fixed number of events.

When this method is called, perf event enables the counter if it was disabled. It then leaves the counter enabled until it has overflowed a refresh times.

Note
This does not update the period of the counter.
Parameters
refreshNumber of overflows before disabling the counter.

Definition at line 130 of file perfevent.cc.

References ioctl(), and panic.

Referenced by PerfKvmTimer::arm().

void PerfKvmCounter::start ( )

Start counting.

Note
If this counter is a group leader, it will start the entire group.

Definition at line 109 of file perfevent.cc.

References ioctl(), and panic.

Referenced by BaseKvmCPU::kvmRun().

void PerfKvmCounter::stop ( )

Stop counting.

Note
If this counter is a group leader, it will stop the entire group.

Definition at line 116 of file perfevent.cc.

References ioctl(), and panic.

Referenced by PerfKvmTimer::disarm(), and BaseKvmCPU::kvmRun().

Member Data Documentation

int PerfKvmCounter::fd
private

PerfEvent file descriptor associated with counter.

-1 if not attached to PerfEvent.

Definition at line 372 of file perfevent.hh.

Referenced by attach(), attached(), detach(), fcntl(), ioctl(), mmapPerf(), and read().

long PerfKvmCounter::pageSize
private

Cached host page size.

Definition at line 380 of file perfevent.hh.

Referenced by detach(), and mmapPerf().

struct perf_event_mmap_page* PerfKvmCounter::ringBuffer
private

Memory mapped PerfEvent sample ring buffer.

Definition at line 375 of file perfevent.hh.

Referenced by detach(), and mmapPerf().

int PerfKvmCounter::ringNumPages
private

Total number of pages in ring buffer.

Definition at line 377 of file perfevent.hh.

Referenced by detach(), and mmapPerf().


The documentation for this class was generated from the following files:

Generated on Fri Jun 9 2017 13:04:16 for gem5 by doxygen 1.8.6