s390/oprofile: move hwsampler interfaces to cpu_mf.h
authorHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Wed, 11 Dec 2013 11:15:52 +0000 (12:15 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Dec 2013 13:37:50 +0000 (14:37 +0100)
Extract and move the oprofile hwsampler data structures and interfaces to
the cpu_mf.h header file which contains common interface definitions
for the various CPU-measurement facilities.   This change is necessary for
a new perf PMU.

Few interface names have been revised to fit to the latest CPU-measurement
facilities documentation.  Also declare the data structures as __packed and
correct checkpatch findings.

Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/cpu_mf.h
arch/s390/oprofile/hwsampler.c
arch/s390/oprofile/hwsampler.h

index c879fad..f6dddea 100644 (file)
@@ -56,6 +56,78 @@ struct cpumf_ctr_info {
        u32   reserved2[12];
 } __packed;
 
+/* QUERY SAMPLING INFORMATION block */
+struct hws_qsi_info_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 basic sampling entry      */
+       unsigned int dsdes:16;      /* 6-7: size of diagnostic sampling entry */
+       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                   */
+} __packed;
+
+/* SET SAMPLING CONTROLS request block */
+struct hws_lsctl_request_block {
+       unsigned int s:1;           /* 0: maximum buffer indicator       */
+       unsigned int h:1;           /* 1: part. level reserved for VM use*/
+       unsigned long 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                          */
+} __packed;
+
+
+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 gpp;     /* Guest Program Parameter           */
+       unsigned long long hpp;     /* Host Program Parameter            */
+} __packed;
+
+struct hws_trailer_entry {
+       unsigned int f:1;           /* 0 - Block Full Indicator          */
+       unsigned int a:1;           /* 1 - Alert request control         */
+       unsigned int t:1;           /* 2 - Timestamp format              */
+       unsigned long long:61;      /* 3 - 63: Reserved                  */
+       unsigned long long overflow;     /* 64 - sample Overflow count        */
+       unsigned long long timestamp;    /* 16 - time-stamp                   */
+       unsigned long long timestamp1;   /*                                   */
+       unsigned long long reserved1;    /* 32 -Reserved                      */
+       unsigned long long reserved2;    /*                                   */
+       unsigned long long progusage1;   /* 48 - reserved for programming use */
+       unsigned long long progusage2;   /*                                   */
+} __packed;
+
 /* Query counter information */
 static inline int qctri(struct cpumf_ctr_info *info)
 {
@@ -99,4 +171,70 @@ static inline int ecctr(u64 ctr, u64 *val)
        return cc;
 }
 
+/* Query sampling information */
+static inline int qsi(struct hws_qsi_info_block *info)
+{
+       int cc;
+       cc = 1;
+
+       asm volatile(
+               "0:     .insn   s,0xb2860000,0(%1)\n"
+               "1:     lhi     %0,0\n"
+               "2:\n"
+               EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
+               : "=d" (cc), "+a" (info)
+               : "m" (*info)
+               : "cc", "memory");
+
+       return cc ? -EINVAL : 0;
+}
+
+/* Load sampling controls */
+static inline int lsctl(struct hws_lsctl_request_block *req)
+{
+       int cc;
+
+       cc = 1;
+       asm volatile(
+               "0:     .insn   s,0xb2870000,0(%1)\n"
+               "1:     ipm     %0\n"
+               "       srl     %0,28\n"
+               "2:\n"
+               EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
+               : "+d" (cc), "+a" (req)
+               : "m" (*req)
+               : "cc", "memory");
+
+       return cc ? -EINVAL : 0;
+}
+
+/* Sampling control helper functions */
+
+#define SDB_TE_ALERT_REQ_MASK  0x4000000000000000UL
+#define SDB_TE_BUFFER_FULL_MASK 0x8000000000000000UL
+
+/* Return pointer to trailer entry of an sample data block */
+static inline unsigned long *trailer_entry_ptr(unsigned long v)
+{
+       void *ret;
+
+       ret = (void *) v;
+       ret += PAGE_SIZE;
+       ret -= sizeof(struct hws_trailer_entry);
+
+       return (unsigned long *) ret;
+}
+
+/* Return if the entry in the sample data block table (sdbt)
+ * is a link to the next sdbt */
+static inline int is_link_entry(unsigned long *s)
+{
+       return *s & 0x1ul ? 1 : 0;
+}
+
+/* Return pointer to the linked sdbt */
+static inline unsigned long *get_next_sdbt(unsigned long *s)
+{
+       return (unsigned long *) (*s & ~0x1ul);
+}
 #endif /* _ASM_S390_CPU_MF_H */
index 231ceca..bbca76a 100644 (file)
@@ -26,9 +26,6 @@
 #define MAX_NUM_SDB 511
 #define MIN_NUM_SDB 1
 
-#define ALERT_REQ_MASK   0x4000000000000000ul
-#define BUFFER_FULL_MASK 0x8000000000000000ul
-
 DECLARE_PER_CPU(struct hws_cpu_buffer, sampler_cpu_buffer);
 
 struct hws_execute_parms {
@@ -65,43 +62,6 @@ static unsigned long interval;
 static unsigned long min_sampler_rate;
 static unsigned long max_sampler_rate;
 
-static int ssctl(void *buffer)
-{
-       int cc;
-
-       /* set in order to detect a program check */
-       cc = 1;
-
-       asm volatile(
-               "0: .insn s,0xB2870000,0(%1)\n"
-               "1: ipm %0\n"
-               "   srl %0,28\n"
-               "2:\n"
-               EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
-               : "+d" (cc), "+a" (buffer)
-               : "m" (*((struct hws_ssctl_request_block *)buffer))
-               : "cc", "memory");
-
-       return cc ? -EINVAL : 0 ;
-}
-
-static int qsi(void *buffer)
-{
-       int cc;
-       cc = 1;
-
-       asm volatile(
-               "0: .insn s,0xB2860000,0(%1)\n"
-               "1: lhi %0,0\n"
-               "2:\n"
-               EX_TABLE(0b, 2b) EX_TABLE(1b, 2b)
-               : "=d" (cc), "+a" (buffer)
-               : "m" (*((struct hws_qsi_info_block *)buffer))
-               : "cc", "memory");
-
-       return cc ? -EINVAL : 0;
-}
-
 static void execute_qsi(void *parms)
 {
        struct hws_execute_parms *ep = parms;
@@ -113,7 +73,7 @@ static void execute_ssctl(void *parms)
 {
        struct hws_execute_parms *ep = parms;
 
-       ep->rc = ssctl(ep->buffer);
+       ep->rc = lsctl(ep->buffer);
 }
 
 static int smp_ctl_ssctl_stop(int cpu)
@@ -214,17 +174,6 @@ static int smp_ctl_qsi(int cpu)
        return ep.rc;
 }
 
-static inline unsigned long *trailer_entry_ptr(unsigned long v)
-{
-       void *ret;
-
-       ret = (void *)v;
-       ret += PAGE_SIZE;
-       ret -= sizeof(struct hws_trailer_entry);
-
-       return (unsigned long *) ret;
-}
-
 static void hws_ext_handler(struct ext_code ext_code,
                            unsigned int param32, unsigned long param64)
 {
@@ -256,16 +205,6 @@ static void init_all_cpu_buffers(void)
        }
 }
 
-static int is_link_entry(unsigned long *s)
-{
-       return *s & 0x1ul ? 1 : 0;
-}
-
-static unsigned long *get_next_sdbt(unsigned long *s)
-{
-       return (unsigned long *) (*s & ~0x1ul);
-}
-
 static int prepare_cpu_buffers(void)
 {
        int cpu;
@@ -353,7 +292,7 @@ static int allocate_sdbt(int cpu)
                        }
                        *sdbt = sdb;
                        trailer = trailer_entry_ptr(*sdbt);
-                       *trailer = ALERT_REQ_MASK;
+                       *trailer = SDB_TE_ALERT_REQ_MASK;
                        sdbt++;
                        mutex_unlock(&hws_sem_oom);
                }
@@ -829,7 +768,7 @@ static void worker_on_interrupt(unsigned int cpu)
 
                trailer = trailer_entry_ptr(*sdbt);
                /* leave loop if no more work to do */
-               if (!(*trailer & BUFFER_FULL_MASK)) {
+               if (!(*trailer & SDB_TE_BUFFER_FULL_MASK)) {
                        done = 1;
                        if (!hws_flush_all)
                                continue;
index 0022e1e..a483d06 100644 (file)
@@ -9,27 +9,7 @@
 #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                   */
-};
+#include <asm/cpu_mf.h>
 
 struct hws_ssctl_request_block     /* SET SAMPLING CONTROLS req block   */
 { /* bytes 0 - 7  Bit(s) */
@@ -68,36 +48,6 @@ struct hws_cpu_buffer {
        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 gpp;     /* Guest Program Parameter           */
-       unsigned long long hpp;     /* Host Program Parameter            */
-};
-
-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);