[PATCH v2 2/6] perf kvm stat: Remove use of the arch directory

Ian Rogers irogers at google.com
Sun Feb 1 17:55:43 PST 2026


On Sun, Feb 1, 2026 at 9:05 AM Leo Yan <leo.yan at linux.dev> wrote:
>
> On Sat, Jan 31, 2026 at 12:02:20PM -0800, Ian Rogers wrote:
>
> [...]
>
> > @@ -1666,7 +1661,7 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
> >               return ret;
> >       }
> >
> > -     for (events_tp = kvm_events_tp; *events_tp; events_tp++)
> > +     for (events_tp = kvm_events_tp(); *events_tp; events_tp++)
> >               events_tp_size++;
> >
> >       rec_argc = ARRAY_SIZE(record_args) + argc + 2 +
> > @@ -1681,7 +1676,7 @@ kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
> >
> >       for (j = 0; j < events_tp_size; j++) {
> >               rec_argv[i++] = STRDUP_FAIL_EXIT("-e");
> > -             rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp[j]);
> > +             rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp()[j]);
> >       }
>
> Nitpick: we can assign reuse events_tp throughout the
> kvm_events_record().  Something like:
>
>   events_tp = kvm_events_tp();
>   for (j = 0; events_tp[j]; j++)
>        events_tp_size++;
>
>   ...
>
>   for (j = 0; j < events_tp_size; j++) {
>        rec_argv[i++] = STRDUP_FAIL_EXIT("-e");
>        rec_argv[i++] = STRDUP_FAIL_EXIT(events_tp[j]);
>   }
>
> [...]
>
> > +int setup_kvm_events_tp(struct perf_kvm_stat *kvm)
> > +{
> > +     switch (EM_HOST) {
> > +     case EM_PPC:
> > +     case EM_PPC64:
> > +             return __setup_kvm_events_tp_powerpc(kvm);
> > +     default:
> > +             return 0;
> > +     }
> > +}
> > +
> > +int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid)
> > +{
> > +     switch (EM_HOST) {
> > +     case EM_AARCH64:
> > +             return __cpu_isa_init_arm64(kvm);
> > +     case EM_LOONGARCH:
> > +             return __cpu_isa_init_loongarch(kvm);
> > +     case EM_PPC:
> > +     case EM_PPC64:
> > +             return __cpu_isa_init_powerpc(kvm);
> > +     case EM_RISCV:
> > +             return __cpu_isa_init_riscv(kvm);
> > +     case EM_S390:
> > +             return __cpu_isa_init_s390(kvm, cpuid);
> > +     case EM_X86_64:
> > +     case EM_386:
> > +             return __cpu_isa_init_x86(kvm, cpuid);
> > +     default:
> > +             pr_err("Unsupported kvm-stat host %d\n", EM_HOST);
> > +             return -1;
> > +     }
> > +}
>
> For a general solution, I'd prefer to use "install" + callback methods
> rather than the opened code.  E.g., each arch installs a structure
> with callbacks:
>
>   struct kvm_stat_arch kvm_stat_aarch64 {
>       .setup_events_tp = NULL;
>       .cpu_isa_init    = __cpu_isa_init_arm64;
>       ...
>   };
>
> Then at the init phase, we can install arch's structure:
>
>   switch (EM_HOST) {
>   case EM_AARCH64:
>       kvm_stat_arch_init(&kvm_stat_aarch64);
>       break;
>   ...
>   }
>
> Afterwards, it is no need to check EM_HOST anymore, it can simply
> invoke the arch's callback:
>
>   int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid)
>   {
>       if (!arch_kvm_stat || !arch_kvm_stat->cpu_isa_init)
>           return -1;
>
>       return arch_kvm_stat->cpu_isa_init(kvm, cpuid);
>   }
>
> As a result, we can avoid spreading "switch (EM_HOST)" everywhere.

So the use of switch(EM_HOST) is to just show the equivalence between
the before and after code. The EM_HOST has become an e_machine read
from the session/env by the end of the series. I agree there is naming
clean up, etc. that can be done to the kvm_stat code but I just wanted
to focus the series on the removal of the arch directory by way of
switching to using the e_machine value.

Thanks,
Ian

> Thanks,
> Leo
>



More information about the linux-arm-kernel mailing list