|
Packit |
577717 |
/* $Id: perfctr.h,v 1.69.2.6 2009/01/23 17:31:57 mikpe Exp $
|
|
Packit |
577717 |
* Performance-Monitoring Counters driver
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Copyright (C) 1999-2009 Mikael Pettersson
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#ifndef _LINUX_PERFCTR_H
|
|
Packit |
577717 |
#define _LINUX_PERFCTR_H
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef CONFIG_KPERFCTR /* don't break archs without <asm/perfctr.h> */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <asm/perfctr.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct perfctr_info {
|
|
Packit |
577717 |
unsigned int abi_version;
|
|
Packit |
577717 |
char driver_version[32];
|
|
Packit |
577717 |
unsigned int cpu_type;
|
|
Packit |
577717 |
unsigned int cpu_features;
|
|
Packit |
577717 |
unsigned int cpu_khz;
|
|
Packit |
577717 |
unsigned int tsc_to_cpu_mult;
|
|
Packit |
577717 |
unsigned int _reserved2;
|
|
Packit |
577717 |
unsigned int _reserved3;
|
|
Packit |
577717 |
unsigned int _reserved4;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
struct perfctr_cpu_mask {
|
|
Packit |
577717 |
unsigned int nrwords;
|
|
Packit |
577717 |
unsigned int mask[1]; /* actually 'nrwords' */
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* abi_version values: Lower 16 bits contain the CPU data version, upper
|
|
Packit |
577717 |
16 bits contain the API version. Each half has a major version in its
|
|
Packit |
577717 |
upper 8 bits, and a minor version in its lower 8 bits. */
|
|
Packit |
577717 |
#define PERFCTR_API_VERSION 0x0502 /* 5.2 */
|
|
Packit |
577717 |
#define PERFCTR_ABI_VERSION ((PERFCTR_API_VERSION<<16)|PERFCTR_CPU_VERSION)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* cpu_features flag bits */
|
|
Packit |
577717 |
#define PERFCTR_FEATURE_RDPMC 0x01
|
|
Packit |
577717 |
#define PERFCTR_FEATURE_RDTSC 0x02
|
|
Packit |
577717 |
#define PERFCTR_FEATURE_PCINT 0x04
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* user's view of mmap:ed virtual perfctr */
|
|
Packit |
577717 |
struct vperfctr_state {
|
|
Packit |
577717 |
struct perfctr_cpu_state cpu_state;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* parameter in VPERFCTR_CONTROL command */
|
|
Packit |
577717 |
struct vperfctr_control {
|
|
Packit |
577717 |
int si_signo;
|
|
Packit |
577717 |
struct perfctr_cpu_control cpu_control;
|
|
Packit |
577717 |
unsigned int preserve;
|
|
Packit |
577717 |
unsigned int flags;
|
|
Packit |
577717 |
unsigned int _reserved2;
|
|
Packit |
577717 |
unsigned int _reserved3;
|
|
Packit |
577717 |
unsigned int _reserved4;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* vperfctr_control flags bits */
|
|
Packit |
577717 |
#define VPERFCTR_CONTROL_CLOEXEC 0x01 /* close (unlink) state before exec */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* parameter in GPERFCTR_CONTROL command */
|
|
Packit |
577717 |
struct gperfctr_cpu_control {
|
|
Packit |
577717 |
unsigned int cpu;
|
|
Packit |
577717 |
struct perfctr_cpu_control cpu_control;
|
|
Packit |
577717 |
unsigned int _reserved1;
|
|
Packit |
577717 |
unsigned int _reserved2;
|
|
Packit |
577717 |
unsigned int _reserved3;
|
|
Packit |
577717 |
unsigned int _reserved4;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* returned by GPERFCTR_READ command */
|
|
Packit |
577717 |
struct gperfctr_cpu_state {
|
|
Packit |
577717 |
unsigned int cpu;
|
|
Packit |
577717 |
struct perfctr_cpu_control cpu_control;
|
|
Packit |
577717 |
struct perfctr_sum_ctrs sum;
|
|
Packit |
577717 |
unsigned int _reserved1;
|
|
Packit |
577717 |
unsigned int _reserved2;
|
|
Packit |
577717 |
unsigned int _reserved3;
|
|
Packit |
577717 |
unsigned int _reserved4;
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* buffer for encodings of most of the above structs */
|
|
Packit |
577717 |
struct perfctr_struct_buf {
|
|
Packit |
577717 |
unsigned int rdsize;
|
|
Packit |
577717 |
unsigned int wrsize;
|
|
Packit |
577717 |
unsigned int buffer[1]; /* actually 'max(rdsize,wrsize)' */
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <linux/ioctl.h>
|
|
Packit |
577717 |
#define _PERFCTR_IOCTL 0xD0 /* 'P'+128, currently unassigned */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PERFCTR_ABI _IOR(_PERFCTR_IOCTL,0,unsigned int)
|
|
Packit |
577717 |
#define PERFCTR_INFO _IOR(_PERFCTR_IOCTL,1,struct perfctr_struct_buf)
|
|
Packit |
577717 |
#define PERFCTR_CPUS _IOWR(_PERFCTR_IOCTL,2,struct perfctr_cpu_mask)
|
|
Packit |
577717 |
#define PERFCTR_CPUS_FORBIDDEN _IOWR(_PERFCTR_IOCTL,3,struct perfctr_cpu_mask)
|
|
Packit |
577717 |
#define VPERFCTR_CREAT _IO(_PERFCTR_IOCTL,6)/*int tid*/
|
|
Packit |
577717 |
#define VPERFCTR_OPEN _IO(_PERFCTR_IOCTL,7)/*int tid*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define VPERFCTR_READ_SUM _IOR(_PERFCTR_IOCTL,8,struct perfctr_struct_buf)
|
|
Packit |
577717 |
#define VPERFCTR_UNLINK _IO(_PERFCTR_IOCTL,9)
|
|
Packit |
577717 |
#define VPERFCTR_CONTROL _IOW(_PERFCTR_IOCTL,10,struct perfctr_struct_buf)
|
|
Packit |
577717 |
#define VPERFCTR_IRESUME _IO(_PERFCTR_IOCTL,11)
|
|
Packit |
577717 |
#define VPERFCTR_READ_CONTROL _IOR(_PERFCTR_IOCTL,12,struct perfctr_struct_buf)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define GPERFCTR_CONTROL _IOWR(_PERFCTR_IOCTL,16,struct perfctr_struct_buf)
|
|
Packit |
577717 |
#define GPERFCTR_READ _IOWR(_PERFCTR_IOCTL,17,struct perfctr_struct_buf)
|
|
Packit |
577717 |
#define GPERFCTR_STOP _IO(_PERFCTR_IOCTL,18)
|
|
Packit |
577717 |
#define GPERFCTR_START _IO(_PERFCTR_IOCTL,19)/*unsigned int*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __KERNEL__
|
|
Packit |
577717 |
extern struct perfctr_info perfctr_info;
|
|
Packit |
577717 |
extern int sys_perfctr_abi(unsigned int*);
|
|
Packit |
577717 |
extern int sys_perfctr_info(struct perfctr_struct_buf*);
|
|
Packit |
577717 |
extern int sys_perfctr_cpus(struct perfctr_cpu_mask*);
|
|
Packit |
577717 |
extern int sys_perfctr_cpus_forbidden(struct perfctr_cpu_mask*);
|
|
Packit |
577717 |
#endif /* __KERNEL__ */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* CONFIG_KPERFCTR */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef __KERNEL__
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef CONFIG_PERFCTR_VIRTUAL
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Virtual per-process performance-monitoring counters.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
struct vperfctr; /* opaque */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* process management operations */
|
|
Packit |
577717 |
extern void __vperfctr_exit(struct vperfctr*);
|
|
Packit |
577717 |
extern void __vperfctr_flush(struct vperfctr*);
|
|
Packit |
577717 |
extern void __vperfctr_suspend(struct vperfctr*);
|
|
Packit |
577717 |
extern void __vperfctr_resume(struct vperfctr*);
|
|
Packit |
577717 |
extern void __vperfctr_sample(struct vperfctr*);
|
|
Packit |
577717 |
extern void __vperfctr_set_cpus_allowed(struct task_struct*, struct vperfctr*, cpumask_t);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifdef CONFIG_PERFCTR_MODULE
|
|
Packit |
577717 |
extern struct vperfctr_stub {
|
|
Packit |
577717 |
struct module *owner;
|
|
Packit |
577717 |
void (*exit)(struct vperfctr*);
|
|
Packit |
577717 |
void (*flush)(struct vperfctr*);
|
|
Packit |
577717 |
void (*suspend)(struct vperfctr*);
|
|
Packit |
577717 |
void (*resume)(struct vperfctr*);
|
|
Packit |
577717 |
void (*sample)(struct vperfctr*);
|
|
Packit |
577717 |
#ifdef CONFIG_PERFCTR_CPUS_FORBIDDEN_MASK
|
|
Packit |
577717 |
void (*set_cpus_allowed)(struct task_struct*, struct vperfctr*, cpumask_t);
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
} vperfctr_stub;
|
|
Packit |
577717 |
extern void _vperfctr_exit(struct vperfctr*);
|
|
Packit |
577717 |
extern void _vperfctr_flush(struct vperfctr*);
|
|
Packit |
577717 |
#define _vperfctr_suspend(x) vperfctr_stub.suspend((x))
|
|
Packit |
577717 |
#define _vperfctr_resume(x) vperfctr_stub.resume((x))
|
|
Packit |
577717 |
#define _vperfctr_sample(x) vperfctr_stub.sample((x))
|
|
Packit |
577717 |
#define _vperfctr_set_cpus_allowed(x,y,z) (*vperfctr_stub.set_cpus_allowed)((x),(y),(z))
|
|
Packit |
577717 |
#else /* !CONFIG_PERFCTR_MODULE */
|
|
Packit |
577717 |
#define _vperfctr_exit(x) __vperfctr_exit((x))
|
|
Packit |
577717 |
#define _vperfctr_flush(x) __vperfctr_flush((x))
|
|
Packit |
577717 |
#define _vperfctr_suspend(x) __vperfctr_suspend((x))
|
|
Packit |
577717 |
#define _vperfctr_resume(x) __vperfctr_resume((x))
|
|
Packit |
577717 |
#define _vperfctr_sample(x) __vperfctr_sample((x))
|
|
Packit |
577717 |
#define _vperfctr_set_cpus_allowed(x,y,z) __vperfctr_set_cpus_allowed((x),(y),(z))
|
|
Packit |
577717 |
#endif /* CONFIG_PERFCTR_MODULE */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_copy_task(struct task_struct *tsk, struct pt_regs *regs)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
tsk->thread.perfctr = NULL; /* inheritance is not yet implemented */
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_release_task(struct task_struct *tsk)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
/* nothing to do until inheritance is implemented */
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_exit_thread(struct thread_struct *thread)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
perfctr = thread->perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_exit(perfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_flush_thread(struct thread_struct *thread)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
perfctr = thread->perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_flush(perfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_suspend_thread(struct thread_struct *prev)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
perfctr = prev->perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_suspend(perfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_resume_thread(struct thread_struct *next)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
perfctr = next->perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_resume(perfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_sample_thread(struct thread_struct *thread)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
perfctr = thread->perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_sample(perfctr);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_set_cpus_allowed(struct task_struct *p, cpumask_t new_mask)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
#ifdef CONFIG_PERFCTR_CPUS_FORBIDDEN_MASK
|
|
Packit |
577717 |
struct vperfctr *perfctr;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
task_lock(p);
|
|
Packit |
577717 |
perfctr = p->thread.perfctr;
|
|
Packit |
577717 |
if (perfctr)
|
|
Packit |
577717 |
_vperfctr_set_cpus_allowed(p, perfctr, new_mask);
|
|
Packit |
577717 |
task_unlock(p);
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#else /* !CONFIG_PERFCTR_VIRTUAL */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static inline void perfctr_copy_task(struct task_struct *p, struct pt_regs *r) { }
|
|
Packit |
577717 |
static inline void perfctr_release_task(struct task_struct *p) { }
|
|
Packit |
577717 |
static inline void perfctr_exit_thread(struct thread_struct *t) { }
|
|
Packit |
577717 |
static inline void perfctr_flush_thread(struct thread_struct *t) { }
|
|
Packit |
577717 |
static inline void perfctr_suspend_thread(struct thread_struct *t) { }
|
|
Packit |
577717 |
static inline void perfctr_resume_thread(struct thread_struct *t) { }
|
|
Packit |
577717 |
static inline void perfctr_sample_thread(struct thread_struct *t) { }
|
|
Packit |
577717 |
static inline void perfctr_set_cpus_allowed(struct task_struct *p, cpumask_t m) { }
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* CONFIG_PERFCTR_VIRTUAL */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* __KERNEL__ */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* _LINUX_PERFCTR_H */
|