]> Pileus Git - ~andy/linux/blobdiff - arch/s390/oprofile/hwsampler.c
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[~andy/linux] / arch / s390 / oprofile / hwsampler.c
index 12bea05a0fc18b6e70124510bc2d772fd87cbc71..f097d516d8c5ab0555d5d393c9d34eb6b688fa1e 100644 (file)
@@ -17,8 +17,7 @@
 #include <linux/semaphore.h>
 #include <linux/oom.h>
 #include <linux/oprofile.h>
-
-#include <asm/lowcore.h>
+#include <asm/cpu_mf.h>
 #include <asm/irq.h>
 
 #include "hwsampler.h"
 #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 +225,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 +677,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 +752,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 +1001,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 +1115,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 +1190,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;
 }