• Sandipan Das's avatar
    perf/x86/amd/uncore: Move discovery and registration · 07888daa
    Sandipan Das authored
    Uncore PMUs have traditionally been registered in the module init path.
    This is fine for the existing DF and L3 PMUs since the CPUID information
    does not vary across CPUs but not for the memory controller (UMC) PMUs
    since information like active memory channels can vary for each socket
    depending on how the DIMMs have been physically populated.
    
    To overcome this, the discovery of PMU information using CPUID is moved
    to the startup of UNCORE_STARTING. This cannot be done in the startup of
    UNCORE_PREP since the hotplug callback does not run on the CPU that is
    being brought online.
    
    Previously, the startup of UNCORE_PREP was used for allocating uncore
    contexts following which, the startup of UNCORE_STARTING was used to
    find and reuse an existing sibling context, if possible. Any unused
    contexts were added to a list for reclaimation later during the startup
    of UNCORE_ONLINE.
    
    Since all required CPUID info is now available only after the startup of
    UNCORE_STARTING has completed, context allocation has been moved to the
    startup of UNCORE_ONLINE. Before allocating contexts, the first CPU that
    comes online has to take up the additional responsibility of registering
    the PMUs. This is a one-time process though. Since sibling discovery now
    happens prior to deciding whether a new context is required, there is no
    longer a need to track and free up unused contexts.
    
    The teardown of UNCORE_ONLINE and UNCORE_PREP functionally remain the
    same.
    
    Overall, the flow of control described above is achieved using the
    following handlers for managing uncore PMUs. It is mandatory to define
    them for each type of uncore PMU.
    
      * scan() runs during startup of UNCORE_STARTING and collects PMU info
        using CPUID.
    
      * init() runs during startup of UNCORE_ONLINE, registers PMUs and sets
        up uncore contexts.
    
      * move() runs during teardown of UNCORE_ONLINE and migrates uncore
        contexts to a shared sibling, if possible.
    
      * free() runs during teardown of UNCORE_PREP and frees up uncore
        contexts.
    Signed-off-by: default avatarSandipan Das <sandipan.das@amd.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/r/e6c447e48872fcab8452e0dd81b1c9cb09f39eb4.1696425185.git.sandipan.das@amd.com
    07888daa
uncore.c 22.3 KB