• Like Xu's avatar
    KVM: x86/svm/pmu: Rewrite get_gp_pmc_amd() for more counters scalability · ea5cbc9f
    Like Xu authored
    If the number of AMD gp counters continues to grow, the code will
    be very clumsy and the switch-case design of inline get_gp_pmc_amd()
    will also bloat the kernel text size.
    
    The target code is taught to manage two groups of MSRs, each
    representing a different version of the AMD PMU counter MSRs.
    The MSR addresses of each group are contiguous, with no holes,
    and there is no intersection between two sets of addresses,
    but they are discrete in functionality by design like this:
    
    [Group A : All counter MSRs are tightly bound to all event select MSRs ]
    
      MSR_K7_EVNTSEL0			0xc0010000
      MSR_K7_EVNTSELi			0xc0010000 + i
      ...
      MSR_K7_EVNTSEL3			0xc0010003
      MSR_K7_PERFCTR0			0xc0010004
      MSR_K7_PERFCTRi			0xc0010004 + i
      ...
      MSR_K7_PERFCTR3			0xc0010007
    
    [Group B : The counter MSRs are interleaved with the event select MSRs ]
    
      MSR_F15H_PERF_CTL0		0xc0010200
      MSR_F15H_PERF_CTR0		(0xc0010200 + 1)
      ...
      MSR_F15H_PERF_CTLi		(0xc0010200 + 2 * i)
      MSR_F15H_PERF_CTRi		(0xc0010200 + 2 * i + 1)
      ...
      MSR_F15H_PERF_CTL5		(0xc0010200 + 2 * 5)
      MSR_F15H_PERF_CTR5		(0xc0010200 + 2 * 5 + 1)
    
    Rewrite get_gp_pmc_amd() in this way: first determine which group of
    registers is accessed, then determine if it matches its requested type,
    applying different scaling ratios respectively, and finally get pmc_idx
    to pass into amd_pmc_idx_to_pmc().
    Signed-off-by: default avatarLike Xu <likexu@tencent.com>
    Link: https://lore.kernel.org/r/20220831085328.45489-8-likexu@tencent.comSigned-off-by: default avatarSean Christopherson <seanjc@google.com>
    ea5cbc9f
pmu.c 5.52 KB