Blame src/perfctr-2.6.x/linux/include/linux/perfctr.h

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 */