forked from Minki/linux
oprofile, s390: Add support for hardware based sampling on System z processors
This adds support for hardware based sampling on System z processors (models z10 and up). System z's hardware sampling is described in detail in: SA23-2260-01 "The Load-Program-Parameter and CPU-Measurement Facilities" The patch introduces - support for System z's hardware sampler in OProfile's kernel module - it adds functions that control all hardware sampling related operations as: - checking if hardware sampling feature is available, i.e.: on System z models z10 and up, in LPAR mode only, and authorised during LPAR activation - allocating memory for the hardware sampling feature - starting/stopping hardware sampling All functions required to start and stop hardware sampling have to be invoked by the oprofile kernel module as provided by the other patches of this patch set. In case hardware based sampling cannot be setup standard timer based sampling is used by OProfile. Applied with following changes: * enable compilation in Makefile Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Signed-off-by: Maran Pakkirisamy <maranp@linux.vnet.ibm.com> Signed-off-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Robert Richter <robert.richter@amd.com>
This commit is contained in:
parent
54ebbe7ba5
commit
ec6a3df1c0
@ -30,6 +30,9 @@ config OPROFILE_EVENT_MULTIPLEX
|
||||
config HAVE_OPROFILE
|
||||
bool
|
||||
|
||||
config HAVE_HWSAMPLER
|
||||
bool
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes"
|
||||
depends on MODULES
|
||||
|
@ -115,6 +115,7 @@ config S390
|
||||
select ARCH_INLINE_WRITE_UNLOCK_BH
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||
select HAVE_HWSAMPLER
|
||||
|
||||
config SCHED_OMIT_FRAME_POINTER
|
||||
def_bool y
|
||||
|
@ -6,4 +6,4 @@ DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \
|
||||
oprofilefs.o oprofile_stats.o \
|
||||
timer_int.o )
|
||||
|
||||
oprofile-y := $(DRIVER_OBJS) init.o backtrace.o
|
||||
oprofile-y := $(DRIVER_OBJS) init.o backtrace.o hwsampler.o
|
||||
|
1256
arch/s390/oprofile/hwsampler.c
Normal file
1256
arch/s390/oprofile/hwsampler.c
Normal file
File diff suppressed because it is too large
Load Diff
113
arch/s390/oprofile/hwsampler.h
Normal file
113
arch/s390/oprofile/hwsampler.h
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* CPUMF HW sampler functions and internal structures
|
||||
*
|
||||
* Copyright IBM Corp. 2010
|
||||
* Author(s): Heinz Graalfs <graalfs@de.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef HWSAMPLER_H_
|
||||
#define HWSAMPLER_H_
|
||||
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct hws_qsi_info_block /* QUERY SAMPLING information block */
|
||||
{ /* Bit(s) */
|
||||
unsigned int b0_13:14; /* 0-13: zeros */
|
||||
unsigned int as:1; /* 14: sampling authorisation control*/
|
||||
unsigned int b15_21:7; /* 15-21: zeros */
|
||||
unsigned int es:1; /* 22: sampling enable control */
|
||||
unsigned int b23_29:7; /* 23-29: zeros */
|
||||
unsigned int cs:1; /* 30: sampling activation control */
|
||||
unsigned int:1; /* 31: reserved */
|
||||
unsigned int bsdes:16; /* 4-5: size of sampling entry */
|
||||
unsigned int:16; /* 6-7: reserved */
|
||||
unsigned long min_sampl_rate; /* 8-15: minimum sampling interval */
|
||||
unsigned long max_sampl_rate; /* 16-23: maximum sampling interval*/
|
||||
unsigned long tear; /* 24-31: TEAR contents */
|
||||
unsigned long dear; /* 32-39: DEAR contents */
|
||||
unsigned int rsvrd0; /* 40-43: reserved */
|
||||
unsigned int cpu_speed; /* 44-47: CPU speed */
|
||||
unsigned long long rsvrd1; /* 48-55: reserved */
|
||||
unsigned long long rsvrd2; /* 56-63: reserved */
|
||||
};
|
||||
|
||||
struct hws_ssctl_request_block /* SET SAMPLING CONTROLS req block */
|
||||
{ /* bytes 0 - 7 Bit(s) */
|
||||
unsigned int s:1; /* 0: maximum buffer indicator */
|
||||
unsigned int h:1; /* 1: part. level reserved for VM use*/
|
||||
unsigned long b2_53:52; /* 2-53: zeros */
|
||||
unsigned int es:1; /* 54: sampling enable control */
|
||||
unsigned int b55_61:7; /* 55-61: - zeros */
|
||||
unsigned int cs:1; /* 62: sampling activation control */
|
||||
unsigned int b63:1; /* 63: zero */
|
||||
unsigned long interval; /* 8-15: sampling interval */
|
||||
unsigned long tear; /* 16-23: TEAR contents */
|
||||
unsigned long dear; /* 24-31: DEAR contents */
|
||||
/* 32-63: */
|
||||
unsigned long rsvrd1; /* reserved */
|
||||
unsigned long rsvrd2; /* reserved */
|
||||
unsigned long rsvrd3; /* reserved */
|
||||
unsigned long rsvrd4; /* reserved */
|
||||
};
|
||||
|
||||
struct hws_cpu_buffer {
|
||||
unsigned long first_sdbt; /* @ of 1st SDB-Table for this CP*/
|
||||
unsigned long worker_entry;
|
||||
unsigned long sample_overflow; /* taken from SDB ... */
|
||||
struct hws_qsi_info_block qsi;
|
||||
struct hws_ssctl_request_block ssctl;
|
||||
struct work_struct worker;
|
||||
atomic_t ext_params;
|
||||
unsigned long req_alert;
|
||||
unsigned long loss_of_sample_data;
|
||||
unsigned long invalid_entry_address;
|
||||
unsigned long incorrect_sdbt_entry;
|
||||
unsigned long sample_auth_change_alert;
|
||||
unsigned int finish:1;
|
||||
unsigned int oom:1;
|
||||
unsigned int stop_mode:1;
|
||||
};
|
||||
|
||||
struct hws_data_entry {
|
||||
unsigned int def:16; /* 0-15 Data Entry Format */
|
||||
unsigned int R:4; /* 16-19 reserved */
|
||||
unsigned int U:4; /* 20-23 Number of unique instruct. */
|
||||
unsigned int z:2; /* zeros */
|
||||
unsigned int T:1; /* 26 PSW DAT mode */
|
||||
unsigned int W:1; /* 27 PSW wait state */
|
||||
unsigned int P:1; /* 28 PSW Problem state */
|
||||
unsigned int AS:2; /* 29-30 PSW address-space control */
|
||||
unsigned int I:1; /* 31 entry valid or invalid */
|
||||
unsigned int:16;
|
||||
unsigned int prim_asn:16; /* primary ASN */
|
||||
unsigned long long ia; /* Instruction Address */
|
||||
unsigned long long lpp; /* Logical-Partition Program Param. */
|
||||
unsigned long long vpp; /* Virtual-Machine Program Param. */
|
||||
};
|
||||
|
||||
struct hws_trailer_entry {
|
||||
unsigned int f:1; /* 0 - Block Full Indicator */
|
||||
unsigned int a:1; /* 1 - Alert request control */
|
||||
unsigned long:62; /* 2 - 63: Reserved */
|
||||
unsigned long overflow; /* 64 - sample Overflow count */
|
||||
unsigned long timestamp; /* 16 - time-stamp */
|
||||
unsigned long timestamp1; /* */
|
||||
unsigned long reserved1; /* 32 -Reserved */
|
||||
unsigned long reserved2; /* */
|
||||
unsigned long progusage1; /* 48 - reserved for programming use */
|
||||
unsigned long progusage2; /* */
|
||||
};
|
||||
|
||||
int hwsampler_setup(void);
|
||||
int hwsampler_shutdown(void);
|
||||
int hwsampler_allocate(unsigned long sdbt, unsigned long sdb);
|
||||
int hwsampler_deallocate(void);
|
||||
long hwsampler_query_min_interval(void);
|
||||
long hwsampler_query_max_interval(void);
|
||||
int hwsampler_start_all(unsigned long interval);
|
||||
int hwsampler_stop_all(void);
|
||||
int hwsampler_deactivate(unsigned int cpu);
|
||||
int hwsampler_activate(unsigned int cpu);
|
||||
unsigned long hwsampler_get_sample_overflow_count(unsigned int cpu);
|
||||
|
||||
#endif /*HWSAMPLER_H_*/
|
Loading…
Reference in New Issue
Block a user