• Paul Mackerras's avatar
    powerpc: Fix bug where perf_counters breaks oprofile · a6dbf93a
    Paul Mackerras authored
    Currently there is a bug where if you use oprofile on a pSeries
    machine, then use perf_counters, then use oprofile again, oprofile
    will not work correctly; it will lose the PMU configuration the next
    time the hypervisor does a partition context switch, and thereafter
    won't count anything.
    
    Maynard Johnson identified the sequence causing the problem:
    - oprofile setup calls ppc_enable_pmcs(), which calls
      pseries_lpar_enable_pmcs, which tells the hypervisor that we want
      to use the PMU, and sets the "PMU in use" flag in the lppaca.
      This flag tells the hypervisor whether it needs to save and restore
      the PMU config.
    - The perf_counter code sets and clears the "PMU in use" flag directly
      as it context-switches the PMU between tasks, and leaves it clear
      when it finishes.
    - oprofile setup, called for a new oprofile run, calls ppc_enable_pmcs,
      which does nothing because it has already been called.  In particular
      it doesn't set the "PMU in use" flag.
    
    This fixes the problem by arranging for ppc_enable_pmcs to always set
    the "PMU in use" flag.  It makes the perf_counter code call
    ppc_enable_pmcs also rather than calling the lower-level function
    directly, and removes the setting of the "PMU in use" flag from
    pseries_lpar_enable_pmcs, since that is now done in its caller.
    
    This also removes the declaration of pasemi_enable_pmcs because it
    isn't defined anywhere.
    Reported-by: default avatarMaynard Johnson <mpjohn@us.ibm.com>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Cc: <stable@kernel.org)
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    a6dbf93a
setup.c 16 KB