s390/cpum_sf: load program parameter at sampler enablement
authorHendrik Brueckner <brueckner@linux.vnet.ibm.com>
Fri, 27 Oct 2017 13:45:19 +0000 (15:45 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 16 Nov 2017 14:06:16 +0000 (15:06 +0100)
The lpp instruction is used to place the PID of the current
task in the program-parameter (PP) register.  The register
contents is then included in the sampling data entries.

The lpp instruction loads the PP register only when at least
one sampling function is enabled.  Otherwise it is executed
as a no-op.

Linux calls lpp at context switch.  If the context switch
happens before the sampler is enabled, the PP register is
empty.  That means, the PID of the task that is sampled is
not stored in sampling data until the next context switch.

Hence, always call lpp when enabling the sampler.

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/kernel/perf_cpum_sf.c

index 7364130a29c885d6b8bacc4097e4a4a0c5d19491..792cda339af1ae3ad25ce8fc0457f4db961a4b8a 100644 (file)
@@ -144,6 +144,12 @@ struct hws_trailer_entry {
        unsigned long long progusage2;   /*                                   */
 } __packed;
 
+/* Load program parameter */
+static inline void lpp(void *pp)
+{
+       asm volatile(".insn s,0xb2800000,0(%0)\n":: "a" (pp) : "memory");
+}
+
 /* Query counter information */
 static inline int qctri(struct cpumf_ctr_info *info)
 {
index 7e9b9e6ee821728f74d54a7cec6cfa528946b5a6..dbb62c05805d65a43cd6bc1ff17d2ece07d25fe4 100644 (file)
@@ -848,6 +848,9 @@ static void cpumsf_pmu_enable(struct pmu *pmu)
                return;
        }
 
+       /* Load current program parameter */
+       lpp(&S390_lowcore.lpp);
+
        debug_sprintf_event(sfdbg, 6, "pmu_enable: es=%i cs=%i ed=%i cd=%i "
                            "tear=%p dear=%p\n", cpuhw->lsctl.es, cpuhw->lsctl.cs,
                            cpuhw->lsctl.ed, cpuhw->lsctl.cd,