diff options
Diffstat (limited to 'arch/s390/oprofile/hwsampler.c')
| -rw-r--r-- | arch/s390/oprofile/hwsampler.c | 52 | 
1 files changed, 23 insertions, 29 deletions
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c index 12bea05a0fc..c6646de07bf 100644 --- a/arch/s390/oprofile/hwsampler.c +++ b/arch/s390/oprofile/hwsampler.c @@ -18,7 +18,8 @@  #include <linux/oom.h>  #include <linux/oprofile.h> -#include <asm/lowcore.h> +#include <asm/facility.h> +#include <asm/cpu_mf.h>  #include <asm/irq.h>  #include "hwsampler.h" @@ -30,12 +31,6 @@  #define ALERT_REQ_MASK   0x4000000000000000ul  #define BUFFER_FULL_MASK 0x8000000000000000ul -#define EI_IEA      (1 << 31)	/* invalid entry address              */ -#define EI_ISE      (1 << 30)	/* incorrect SDBT entry               */ -#define EI_PRA      (1 << 29)	/* program request alert              */ -#define EI_SACA     (1 << 23)	/* sampler authorization change alert */ -#define EI_LSDA     (1 << 22)	/* loss of sample data alert          */ -  DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);  struct hws_execute_parms { @@ -232,9 +227,20 @@ static inline unsigned long *trailer_entry_ptr(unsigned long v)  	return (unsigned long *) ret;  } -/* prototypes for external interrupt handler and worker */  static void hws_ext_handler(struct ext_code ext_code, -			    unsigned int param32, unsigned long param64); +			    unsigned int param32, unsigned long param64) +{ +	struct hws_cpu_buffer *cb = &__get_cpu_var(sampler_cpu_buffer); + +	if (!(param32 & CPU_MF_INT_SF_MASK)) +		return; + +	kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++; +	atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); + +	if (hws_wq) +		queue_work(hws_wq, &cb->worker); +}  static void worker(struct work_struct *work); @@ -673,18 +679,6 @@ int hwsampler_activate(unsigned int cpu)  	return rc;  } -static void hws_ext_handler(struct ext_code ext_code, -			    unsigned int param32, unsigned long param64) -{ -	struct hws_cpu_buffer *cb; - -	kstat_cpu(smp_processor_id()).irqs[EXTINT_CPM]++; -	cb = &__get_cpu_var(sampler_cpu_buffer); -	atomic_xchg(&cb->ext_params, atomic_read(&cb->ext_params) | param32); -	if (hws_wq) -		queue_work(hws_wq, &cb->worker); -} -  static int check_qsi_on_setup(void)  {  	int rc; @@ -760,23 +754,23 @@ static int worker_check_error(unsigned int cpu, int ext_params)  	if (!sdbt || !*sdbt)  		return -EINVAL; -	if (ext_params & EI_PRA) +	if (ext_params & CPU_MF_INT_SF_PRA)  		cb->req_alert++; -	if (ext_params & EI_LSDA) +	if (ext_params & CPU_MF_INT_SF_LSDA)  		cb->loss_of_sample_data++; -	if (ext_params & EI_IEA) { +	if (ext_params & CPU_MF_INT_SF_IAE) {  		cb->invalid_entry_address++;  		rc = -EINVAL;  	} -	if (ext_params & EI_ISE) { +	if (ext_params & CPU_MF_INT_SF_ISE) {  		cb->incorrect_sdbt_entry++;  		rc = -EINVAL;  	} -	if (ext_params & EI_SACA) { +	if (ext_params & CPU_MF_INT_SF_SACA) {  		cb->sample_auth_change_alert++;  		rc = -EINVAL;  	} @@ -1009,7 +1003,7 @@ int hwsampler_deallocate(void)  	if (hws_state != HWS_STOPPED)  		goto deallocate_exit; -	ctl_clear_bit(0, 5); /* set bit 58 CR0 off */ +	measurement_alert_subclass_unregister();  	deallocate_sdbt();  	hws_state = HWS_DEALLOCATED; @@ -1123,7 +1117,7 @@ int hwsampler_shutdown(void)  		mutex_lock(&hws_sem);  		if (hws_state == HWS_STOPPED) { -			ctl_clear_bit(0, 5); /* set bit 58 CR0 off */ +			measurement_alert_subclass_unregister();  			deallocate_sdbt();  		}  		if (hws_wq) { @@ -1198,7 +1192,7 @@ start_all_exit:  	hws_oom = 1;  	hws_flush_all = 0;  	/* now let them in, 1407 CPUMF external interrupts */ -	ctl_set_bit(0, 5); /* set CR0 bit 58 */ +	measurement_alert_subclass_register();  	return 0;  }  |