Merge tag 'perf-tools-2020-12-24' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Dec 2020 19:07:34 +0000 (11:07 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 Dec 2020 19:07:34 +0000 (11:07 -0800)
Pull more perf tools updates from Arnaldo Carvalho de Melo:

 - Refactor 'perf stat' per CPU/socket/die/thread aggregation fixing use
   cases in ARM machines.

 - Fix memory leak when synthesizing SDT probes in 'perf probe'.

 - Update kernel header copies related to KVM, epol_pwait. msr-index and
   powerpc and s390 syscall tables.

* tag 'perf-tools-2020-12-24' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux: (24 commits)
  perf probe: Fix memory leak when synthesizing SDT probes
  perf stat aggregation: Add separate thread member
  perf stat aggregation: Add separate core member
  perf stat aggregation: Add separate die member
  perf stat aggregation: Add separate socket member
  perf stat aggregation: Add separate node member
  perf stat aggregation: Start using cpu_aggr_id in map
  perf cpumap: Drop in cpu_aggr_map struct
  perf cpumap: Add new map type for aggregation
  perf stat: Replace aggregation ID with a struct
  perf cpumap: Add new struct for cpu aggregation
  perf cpumap: Use existing allocator to avoid using malloc
  perf tests: Improve topology test to check all aggregation types
  perf tools: Update s390's syscall.tbl copy from the kernel sources
  perf tools: Update powerpc's syscall.tbl copy from the kernel sources
  perf s390: Move syscall.tbl check into check-headers.sh
  perf powerpc: Move syscall.tbl check to check-headers.sh
  tools headers UAPI: Synch KVM's svm.h header with the kernel
  tools kvm headers: Update KVM headers from the kernel sources
  tools headers UAPI: Sync KVM's vmx.h header with the kernel sources
  ...

23 files changed:
tools/arch/arm64/include/uapi/asm/kvm.h
tools/arch/x86/include/asm/cpufeatures.h
tools/arch/x86/include/asm/msr-index.h
tools/arch/x86/include/uapi/asm/kvm.h
tools/arch/x86/include/uapi/asm/svm.h
tools/arch/x86/include/uapi/asm/vmx.h
tools/include/uapi/asm-generic/unistd.h
tools/include/uapi/linux/kvm.h
tools/perf/arch/powerpc/Makefile
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
tools/perf/arch/s390/Makefile
tools/perf/arch/s390/entry/syscalls/syscall.tbl
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl
tools/perf/builtin-stat.c
tools/perf/check-headers.sh
tools/perf/tests/topology.c
tools/perf/trace/beauty/tracepoints/x86_msr.sh
tools/perf/util/cpumap.c
tools/perf/util/cpumap.h
tools/perf/util/probe-file.c
tools/perf/util/stat-display.c
tools/perf/util/stat.c
tools/perf/util/stat.h

index 1c17c3a..24223ad 100644 (file)
@@ -156,9 +156,6 @@ struct kvm_sync_regs {
        __u64 device_irq_level;
 };
 
-struct kvm_arch_memory_slot {
-};
-
 /*
  * PMU filter structure. Describe a range of events with a particular
  * action. To be used with KVM_ARM_VCPU_PMU_V3_FILTER.
index f5ef2d5..84b8878 100644 (file)
 #define X86_FEATURE_VMCALL             ( 8*32+18) /* "" Hypervisor supports the VMCALL instruction */
 #define X86_FEATURE_VMW_VMMCALL                ( 8*32+19) /* "" VMware prefers VMMCALL hypercall instruction */
 #define X86_FEATURE_SEV_ES             ( 8*32+20) /* AMD Secure Encrypted Virtualization - Encrypted State */
+#define X86_FEATURE_VM_PAGE_FLUSH      ( 8*32+21) /* "" VM Page Flush MSR is supported */
 
 /* Intel-defined CPU features, CPUID level 0x00000007:0 (EBX), word 9 */
 #define X86_FEATURE_FSGSBASE           ( 9*32+ 0) /* RDFSBASE, WRFSBASE, RDGSBASE, WRGSBASE instructions*/
 #define X86_FEATURE_TSXLDTRK           (18*32+16) /* TSX Suspend Load Address Tracking */
 #define X86_FEATURE_PCONFIG            (18*32+18) /* Intel PCONFIG */
 #define X86_FEATURE_ARCH_LBR           (18*32+19) /* Intel ARCH LBR */
+#define X86_FEATURE_AVX512_FP16                (18*32+23) /* AVX512 FP16 */
 #define X86_FEATURE_SPEC_CTRL          (18*32+26) /* "" Speculation Control (IBRS + IBPB) */
 #define X86_FEATURE_INTEL_STIBP                (18*32+27) /* "" Single Thread Indirect Branch Predictors */
 #define X86_FEATURE_FLUSH_L1D          (18*32+28) /* Flush L1D cache */
index 2b5fc9a..546d6ec 100644 (file)
 #define MSR_AMD64_ICIBSEXTDCTL         0xc001103c
 #define MSR_AMD64_IBSOPDATA4           0xc001103d
 #define MSR_AMD64_IBS_REG_COUNT_MAX    8 /* includes MSR_AMD64_IBSBRTARGET */
+#define MSR_AMD64_VM_PAGE_FLUSH                0xc001011e
 #define MSR_AMD64_SEV_ES_GHCB          0xc0010130
 #define MSR_AMD64_SEV                  0xc0010131
 #define MSR_AMD64_SEV_ENABLED_BIT      0
index 89e5f3d..8e76d37 100644 (file)
@@ -12,6 +12,7 @@
 
 #define KVM_PIO_PAGE_OFFSET 1
 #define KVM_COALESCED_MMIO_PAGE_OFFSET 2
+#define KVM_DIRTY_LOG_PAGE_OFFSET 64
 
 #define DE_VECTOR 0
 #define DB_VECTOR 1
index f1d8307..554f75f 100644 (file)
 #define SVM_EXIT_MWAIT_COND    0x08c
 #define SVM_EXIT_XSETBV        0x08d
 #define SVM_EXIT_RDPRU         0x08e
+#define SVM_EXIT_EFER_WRITE_TRAP               0x08f
+#define SVM_EXIT_CR0_WRITE_TRAP                        0x090
+#define SVM_EXIT_CR1_WRITE_TRAP                        0x091
+#define SVM_EXIT_CR2_WRITE_TRAP                        0x092
+#define SVM_EXIT_CR3_WRITE_TRAP                        0x093
+#define SVM_EXIT_CR4_WRITE_TRAP                        0x094
+#define SVM_EXIT_CR5_WRITE_TRAP                        0x095
+#define SVM_EXIT_CR6_WRITE_TRAP                        0x096
+#define SVM_EXIT_CR7_WRITE_TRAP                        0x097
+#define SVM_EXIT_CR8_WRITE_TRAP                        0x098
+#define SVM_EXIT_CR9_WRITE_TRAP                        0x099
+#define SVM_EXIT_CR10_WRITE_TRAP               0x09a
+#define SVM_EXIT_CR11_WRITE_TRAP               0x09b
+#define SVM_EXIT_CR12_WRITE_TRAP               0x09c
+#define SVM_EXIT_CR13_WRITE_TRAP               0x09d
+#define SVM_EXIT_CR14_WRITE_TRAP               0x09e
+#define SVM_EXIT_CR15_WRITE_TRAP               0x09f
 #define SVM_EXIT_INVPCID       0x0a2
 #define SVM_EXIT_NPF           0x400
 #define SVM_EXIT_AVIC_INCOMPLETE_IPI           0x401
 #define SVM_EXIT_AVIC_UNACCELERATED_ACCESS     0x402
+#define SVM_EXIT_VMGEXIT       0x403
 
 /* SEV-ES software-defined VMGEXIT events */
 #define SVM_VMGEXIT_MMIO_READ                  0x80000001
        { SVM_EXIT_MONITOR,     "monitor" }, \
        { SVM_EXIT_MWAIT,       "mwait" }, \
        { SVM_EXIT_XSETBV,      "xsetbv" }, \
+       { SVM_EXIT_EFER_WRITE_TRAP,     "write_efer_trap" }, \
+       { SVM_EXIT_CR0_WRITE_TRAP,      "write_cr0_trap" }, \
+       { SVM_EXIT_CR4_WRITE_TRAP,      "write_cr4_trap" }, \
+       { SVM_EXIT_CR8_WRITE_TRAP,      "write_cr8_trap" }, \
        { SVM_EXIT_INVPCID,     "invpcid" }, \
        { SVM_EXIT_NPF,         "npf" }, \
        { SVM_EXIT_AVIC_INCOMPLETE_IPI,         "avic_incomplete_ipi" }, \
        { SVM_EXIT_AVIC_UNACCELERATED_ACCESS,   "avic_unaccelerated_access" }, \
+       { SVM_EXIT_VMGEXIT,             "vmgexit" }, \
+       { SVM_VMGEXIT_MMIO_READ,        "vmgexit_mmio_read" }, \
+       { SVM_VMGEXIT_MMIO_WRITE,       "vmgexit_mmio_write" }, \
+       { SVM_VMGEXIT_NMI_COMPLETE,     "vmgexit_nmi_complete" }, \
+       { SVM_VMGEXIT_AP_HLT_LOOP,      "vmgexit_ap_hlt_loop" }, \
+       { SVM_VMGEXIT_AP_JUMP_TABLE,    "vmgexit_ap_jump_table" }, \
        { SVM_EXIT_ERR,         "invalid_guest_state" }
 
 
index b8ff9e8..ada955c 100644 (file)
@@ -32,6 +32,7 @@
 #define EXIT_REASON_EXTERNAL_INTERRUPT  1
 #define EXIT_REASON_TRIPLE_FAULT        2
 #define EXIT_REASON_INIT_SIGNAL                        3
+#define EXIT_REASON_SIPI_SIGNAL         4
 
 #define EXIT_REASON_INTERRUPT_WINDOW    7
 #define EXIT_REASON_NMI_WINDOW          8
@@ -94,6 +95,7 @@
        { EXIT_REASON_EXTERNAL_INTERRUPT,    "EXTERNAL_INTERRUPT" }, \
        { EXIT_REASON_TRIPLE_FAULT,          "TRIPLE_FAULT" }, \
        { EXIT_REASON_INIT_SIGNAL,           "INIT_SIGNAL" }, \
+       { EXIT_REASON_SIPI_SIGNAL,           "SIPI_SIGNAL" }, \
        { EXIT_REASON_INTERRUPT_WINDOW,      "INTERRUPT_WINDOW" }, \
        { EXIT_REASON_NMI_WINDOW,            "NMI_WINDOW" }, \
        { EXIT_REASON_TASK_SWITCH,           "TASK_SWITCH" }, \
index fc48c64..7287529 100644 (file)
@@ -859,9 +859,11 @@ __SYSCALL(__NR_pidfd_getfd, sys_pidfd_getfd)
 __SYSCALL(__NR_faccessat2, sys_faccessat2)
 #define __NR_process_madvise 440
 __SYSCALL(__NR_process_madvise, sys_process_madvise)
+#define __NR_epoll_pwait2 441
+__SC_COMP(__NR_epoll_pwait2, sys_epoll_pwait2, compat_sys_epoll_pwait2)
 
 #undef __NR_syscalls
-#define __NR_syscalls 441
+#define __NR_syscalls 442
 
 /*
  * 32 bit systems traditionally used different
index ca41220..886802b 100644 (file)
@@ -250,6 +250,7 @@ struct kvm_hyperv_exit {
 #define KVM_EXIT_ARM_NISV         28
 #define KVM_EXIT_X86_RDMSR        29
 #define KVM_EXIT_X86_WRMSR        30
+#define KVM_EXIT_DIRTY_RING_FULL  31
 
 /* For KVM_EXIT_INTERNAL_ERROR */
 /* Emulate instruction failed. */
@@ -1053,6 +1054,8 @@ struct kvm_ppc_resize_hpt {
 #define KVM_CAP_X86_USER_SPACE_MSR 188
 #define KVM_CAP_X86_MSR_FILTER 189
 #define KVM_CAP_ENFORCE_PV_FEATURE_CPUID 190
+#define KVM_CAP_SYS_HYPERV_CPUID 191
+#define KVM_CAP_DIRTY_LOG_RING 192
 
 #ifdef KVM_CAP_IRQ_ROUTING
 
@@ -1511,7 +1514,7 @@ struct kvm_enc_region {
 /* Available with KVM_CAP_MANUAL_DIRTY_LOG_PROTECT_2 */
 #define KVM_CLEAR_DIRTY_LOG          _IOWR(KVMIO, 0xc0, struct kvm_clear_dirty_log)
 
-/* Available with KVM_CAP_HYPERV_CPUID */
+/* Available with KVM_CAP_HYPERV_CPUID (vcpu) / KVM_CAP_SYS_HYPERV_CPUID (system) */
 #define KVM_GET_SUPPORTED_HV_CPUID _IOWR(KVMIO, 0xc1, struct kvm_cpuid2)
 
 /* Available with KVM_CAP_ARM_SVE */
@@ -1557,6 +1560,9 @@ struct kvm_pv_cmd {
 /* Available with KVM_CAP_X86_MSR_FILTER */
 #define KVM_X86_SET_MSR_FILTER _IOW(KVMIO,  0xc6, struct kvm_msr_filter)
 
+/* Available with KVM_CAP_DIRTY_LOG_RING */
+#define KVM_RESET_DIRTY_RINGS          _IO(KVMIO, 0xc7)
+
 /* Secure Encrypted Virtualization command */
 enum sev_cmd_id {
        /* Guest initialization commands */
@@ -1710,4 +1716,52 @@ struct kvm_hyperv_eventfd {
 #define KVM_DIRTY_LOG_MANUAL_PROTECT_ENABLE    (1 << 0)
 #define KVM_DIRTY_LOG_INITIALLY_SET            (1 << 1)
 
+/*
+ * Arch needs to define the macro after implementing the dirty ring
+ * feature.  KVM_DIRTY_LOG_PAGE_OFFSET should be defined as the
+ * starting page offset of the dirty ring structures.
+ */
+#ifndef KVM_DIRTY_LOG_PAGE_OFFSET
+#define KVM_DIRTY_LOG_PAGE_OFFSET 0
+#endif
+
+/*
+ * KVM dirty GFN flags, defined as:
+ *
+ * |---------------+---------------+--------------|
+ * | bit 1 (reset) | bit 0 (dirty) | Status       |
+ * |---------------+---------------+--------------|
+ * |             0 |             0 | Invalid GFN  |
+ * |             0 |             1 | Dirty GFN    |
+ * |             1 |             X | GFN to reset |
+ * |---------------+---------------+--------------|
+ *
+ * Lifecycle of a dirty GFN goes like:
+ *
+ *      dirtied         harvested        reset
+ * 00 -----------> 01 -------------> 1X -------+
+ *  ^                                          |
+ *  |                                          |
+ *  +------------------------------------------+
+ *
+ * The userspace program is only responsible for the 01->1X state
+ * conversion after harvesting an entry.  Also, it must not skip any
+ * dirty bits, so that dirty bits are always harvested in sequence.
+ */
+#define KVM_DIRTY_GFN_F_DIRTY           BIT(0)
+#define KVM_DIRTY_GFN_F_RESET           BIT(1)
+#define KVM_DIRTY_GFN_F_MASK            0x3
+
+/*
+ * KVM dirty rings should be mapped at KVM_DIRTY_LOG_PAGE_OFFSET of
+ * per-vcpu mmaped regions as an array of struct kvm_dirty_gfn.  The
+ * size of the gfn buffer is decided by the first argument when
+ * enabling KVM_CAP_DIRTY_LOG_RING.
+ */
+struct kvm_dirty_gfn {
+       __u32 flags;
+       __u32 slot;
+       __u64 offset;
+};
+
 #endif /* __LINUX_KVM_H */
index e58d00d..840ea0e 100644 (file)
@@ -14,7 +14,6 @@ PERF_HAVE_JITDUMP := 1
 out    := $(OUTPUT)arch/powerpc/include/generated/asm
 header32 := $(out)/syscalls_32.c
 header64 := $(out)/syscalls_64.c
-syskrn := $(srctree)/arch/powerpc/kernel/syscalls/syscall.tbl
 sysprf := $(srctree)/tools/perf/arch/powerpc/entry/syscalls
 sysdef := $(sysprf)/syscall.tbl
 systbl := $(sysprf)/mksyscalltbl
@@ -23,15 +22,9 @@ systbl := $(sysprf)/mksyscalltbl
 _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)')
 
 $(header64): $(sysdef) $(systbl)
-       @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \
-       (diff -B $(sysdef) $(syskrn) >/dev/null) \
-       || echo "Warning: Kernel ABI header at '$(sysdef)' differs from latest version at '$(syskrn)'" >&2 )) || true
        $(Q)$(SHELL) '$(systbl)' '64' $(sysdef) > $@
 
 $(header32): $(sysdef) $(systbl)
-       @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \
-       (diff -B $(sysdef) $(syskrn) >/dev/null) \
-       || echo "Warning: Kernel ABI header at '$(sysdef)' differs from latest version at '$(syskrn)'" >&2 )) || true
        $(Q)$(SHELL) '$(systbl)' '32' $(sysdef) > $@
 
 clean::
index b168364..f744eb5 100644 (file)
@@ -9,7 +9,9 @@
 #
 0      nospu   restart_syscall                 sys_restart_syscall
 1      nospu   exit                            sys_exit
-2      nospu   fork                            ppc_fork
+2      32      fork                            ppc_fork                        sys_fork
+2      64      fork                            sys_fork
+2      spu     fork                            sys_ni_syscall
 3      common  read                            sys_read
 4      common  write                           sys_write
 5      common  open                            sys_open                        compat_sys_open
 119    32      sigreturn                       sys_sigreturn                   compat_sys_sigreturn
 119    64      sigreturn                       sys_ni_syscall
 119    spu     sigreturn                       sys_ni_syscall
-120    nospu   clone                           ppc_clone
+120    32      clone                           ppc_clone                       sys_clone
+120    64      clone                           sys_clone
+120    spu     clone                           sys_ni_syscall
 121    common  setdomainname                   sys_setdomainname
 122    common  uname                           sys_newuname
 123    common  modify_ldt                      sys_ni_syscall
 186    spu     sendfile                        sys_sendfile64
 187    common  getpmsg                         sys_ni_syscall
 188    common  putpmsg                         sys_ni_syscall
-189    nospu   vfork                           ppc_vfork
+189    32      vfork                           ppc_vfork                       sys_vfork
+189    64      vfork                           sys_vfork
+189    spu     vfork                           sys_ni_syscall
 190    common  ugetrlimit                      sys_getrlimit                   compat_sys_getrlimit
 191    common  readahead                       sys_readahead                   compat_sys_readahead
 192    32      mmap2                           sys_mmap2                       compat_sys_mmap2
 248    32      clock_nanosleep                 sys_clock_nanosleep_time32
 248    64      clock_nanosleep                 sys_clock_nanosleep
 248    spu     clock_nanosleep                 sys_clock_nanosleep
-249    32      swapcontext                     ppc_swapcontext                 ppc32_swapcontext
-249    64      swapcontext                     ppc64_swapcontext
+249    32      swapcontext                     ppc_swapcontext                 compat_sys_swapcontext
+249    64      swapcontext                     sys_swapcontext
 249    spu     swapcontext                     sys_ni_syscall
 250    common  tgkill                          sys_tgkill
 251    32      utimes                          sys_utimes_time32
 361    common  bpf                             sys_bpf
 362    nospu   execveat                        sys_execveat                    compat_sys_execveat
 363    32      switch_endian                   sys_ni_syscall
-363    64      switch_endian                   ppc_switch_endian
+363    64      switch_endian                   sys_switch_endian
 363    spu     switch_endian                   sys_ni_syscall
 364    common  userfaultfd                     sys_userfaultfd
 365    common  membarrier                      sys_membarrier
 432    common  fsmount                         sys_fsmount
 433    common  fspick                          sys_fspick
 434    common  pidfd_open                      sys_pidfd_open
-435    nospu   clone3                          ppc_clone3
+435    32      clone3                          ppc_clone3                      sys_clone3
+435    64      clone3                          sys_clone3
+435    spu     clone3                          sys_ni_syscall
+436    common  close_range                     sys_close_range
 437    common  openat2                         sys_openat2
 438    common  pidfd_getfd                     sys_pidfd_getfd
+439    common  faccessat2                      sys_faccessat2
+440    common  process_madvise                 sys_process_madvise
+441    common  epoll_pwait2                    sys_epoll_pwait2                compat_sys_epoll_pwait2
index 6ac8887..74bffbe 100644 (file)
@@ -12,7 +12,6 @@ PERF_HAVE_JITDUMP := 1
 
 out    := $(OUTPUT)arch/s390/include/generated/asm
 header := $(out)/syscalls_64.c
-syskrn := $(srctree)/arch/s390/kernel/syscalls/syscall.tbl
 sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls
 sysdef := $(sysprf)/syscall.tbl
 systbl := $(sysprf)/mksyscalltbl
@@ -21,9 +20,6 @@ systbl := $(sysprf)/mksyscalltbl
 _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)')
 
 $(header): $(sysdef) $(systbl)
-       @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \
-        (diff -B $(sysdef) $(syskrn) >/dev/null) \
-        || echo "Warning: Kernel ABI header at '$(sysdef)' differs from latest version at '$(syskrn)'" >&2 )) || true
        $(Q)$(SHELL) '$(systbl)' $(sysdef) > $@
 
 clean::
index d2fa964..d443423 100644 (file)
 5    common    open                    sys_open                        compat_sys_open
 6    common    close                   sys_close                       sys_close
 7    common    restart_syscall         sys_restart_syscall             sys_restart_syscall
-8    common    creat                   sys_creat                       compat_sys_creat
-9    common    link                    sys_link                        compat_sys_link
-10   common    unlink                  sys_unlink                      compat_sys_unlink
+8    common    creat                   sys_creat                       sys_creat
+9    common    link                    sys_link                        sys_link
+10   common    unlink                  sys_unlink                      sys_unlink
 11   common    execve                  sys_execve                      compat_sys_execve
-12   common    chdir                   sys_chdir                       compat_sys_chdir
-13   32                time                    -                               compat_sys_time
-14   common    mknod                   sys_mknod                       compat_sys_mknod
-15   common    chmod                   sys_chmod                       compat_sys_chmod
-16   32                lchown                  -                               compat_sys_s390_lchown16
+12   common    chdir                   sys_chdir                       sys_chdir
+13   32                time                    -                               sys_time32
+14   common    mknod                   sys_mknod                       sys_mknod
+15   common    chmod                   sys_chmod                       sys_chmod
+16   32                lchown                  -                               sys_lchown16
 19   common    lseek                   sys_lseek                       compat_sys_lseek
 20   common    getpid                  sys_getpid                      sys_getpid
-21   common    mount                   sys_mount
-22   common    umount                  sys_oldumount                   compat_sys_oldumount
-23   32                setuid                  -                               compat_sys_s390_setuid16
-24   32                getuid                  -                               compat_sys_s390_getuid16
-25   32                stime                   -                               compat_sys_stime
+21   common    mount                   sys_mount                       sys_mount
+22   common    umount                  sys_oldumount                   sys_oldumount
+23   32                setuid                  -                               sys_setuid16
+24   32                getuid                  -                               sys_getuid16
+25   32                stime                   -                               sys_stime32
 26   common    ptrace                  sys_ptrace                      compat_sys_ptrace
 27   common    alarm                   sys_alarm                       sys_alarm
 29   common    pause                   sys_pause                       sys_pause
-30   common    utime                   sys_utime                       compat_sys_utime
-33   common    access                  sys_access                      compat_sys_access
+30   common    utime                   sys_utime                       sys_utime32
+33   common    access                  sys_access                      sys_access
 34   common    nice                    sys_nice                        sys_nice
 36   common    sync                    sys_sync                        sys_sync
 37   common    kill                    sys_kill                        sys_kill
-38   common    rename                  sys_rename                      compat_sys_rename
-39   common    mkdir                   sys_mkdir                       compat_sys_mkdir
-40   common    rmdir                   sys_rmdir                       compat_sys_rmdir
+38   common    rename                  sys_rename                      sys_rename
+39   common    mkdir                   sys_mkdir                       sys_mkdir
+40   common    rmdir                   sys_rmdir                       sys_rmdir
 41   common    dup                     sys_dup                         sys_dup
-42   common    pipe                    sys_pipe                        compat_sys_pipe
+42   common    pipe                    sys_pipe                        sys_pipe
 43   common    times                   sys_times                       compat_sys_times
-45   common    brk                     sys_brk                         compat_sys_brk
-46   32                setgid                  -                               compat_sys_s390_setgid16
-47   32                getgid                  -                               compat_sys_s390_getgid16
-48   common    signal                  sys_signal                      compat_sys_signal
-49   32                geteuid                 -                               compat_sys_s390_geteuid16
-50   32                getegid                 -                               compat_sys_s390_getegid16
-51   common    acct                    sys_acct                        compat_sys_acct
-52   common    umount2                 sys_umount                      compat_sys_umount
+45   common    brk                     sys_brk                         sys_brk
+46   32                setgid                  -                               sys_setgid16
+47   32                getgid                  -                               sys_getgid16
+48   common    signal                  sys_signal                      sys_signal
+49   32                geteuid                 -                               sys_geteuid16
+50   32                getegid                 -                               sys_getegid16
+51   common    acct                    sys_acct                        sys_acct
+52   common    umount2                 sys_umount                      sys_umount
 54   common    ioctl                   sys_ioctl                       compat_sys_ioctl
 55   common    fcntl                   sys_fcntl                       compat_sys_fcntl
 57   common    setpgid                 sys_setpgid                     sys_setpgid
 60   common    umask                   sys_umask                       sys_umask
-61   common    chroot                  sys_chroot                      compat_sys_chroot
+61   common    chroot                  sys_chroot                      sys_chroot
 62   common    ustat                   sys_ustat                       compat_sys_ustat
 63   common    dup2                    sys_dup2                        sys_dup2
 64   common    getppid                 sys_getppid                     sys_getppid
 65   common    getpgrp                 sys_getpgrp                     sys_getpgrp
 66   common    setsid                  sys_setsid                      sys_setsid
 67   common    sigaction               sys_sigaction                   compat_sys_sigaction
-70   32                setreuid                -                               compat_sys_s390_setreuid16
-71   32                setregid                -                               compat_sys_s390_setregid16
-72   common    sigsuspend              sys_sigsuspend                  compat_sys_sigsuspend
+70   32                setreuid                -                               sys_setreuid16
+71   32                setregid                -                               sys_setregid16
+72   common    sigsuspend              sys_sigsuspend                  sys_sigsuspend
 73   common    sigpending              sys_sigpending                  compat_sys_sigpending
-74   common    sethostname             sys_sethostname                 compat_sys_sethostname
+74   common    sethostname             sys_sethostname                 sys_sethostname
 75   common    setrlimit               sys_setrlimit                   compat_sys_setrlimit
 76   32                getrlimit               -                               compat_sys_old_getrlimit
 77   common    getrusage               sys_getrusage                   compat_sys_getrusage
 78   common    gettimeofday            sys_gettimeofday                compat_sys_gettimeofday
 79   common    settimeofday            sys_settimeofday                compat_sys_settimeofday
-80   32                getgroups               -                               compat_sys_s390_getgroups16
-81   32                setgroups               -                               compat_sys_s390_setgroups16
-83   common    symlink                 sys_symlink                     compat_sys_symlink
-85   common    readlink                sys_readlink                    compat_sys_readlink
-86   common    uselib                  sys_uselib                      compat_sys_uselib
-87   common    swapon                  sys_swapon                      compat_sys_swapon
-88   common    reboot                  sys_reboot                      compat_sys_reboot
+80   32                getgroups               -                               sys_getgroups16
+81   32                setgroups               -                               sys_setgroups16
+83   common    symlink                 sys_symlink                     sys_symlink
+85   common    readlink                sys_readlink                    sys_readlink
+86   common    uselib                  sys_uselib                      sys_uselib
+87   common    swapon                  sys_swapon                      sys_swapon
+88   common    reboot                  sys_reboot                      sys_reboot
 89   common    readdir                 -                               compat_sys_old_readdir
 90   common    mmap                    sys_old_mmap                    compat_sys_s390_old_mmap
-91   common    munmap                  sys_munmap                      compat_sys_munmap
+91   common    munmap                  sys_munmap                      sys_munmap
 92   common    truncate                sys_truncate                    compat_sys_truncate
 93   common    ftruncate               sys_ftruncate                   compat_sys_ftruncate
 94   common    fchmod                  sys_fchmod                      sys_fchmod
-95   32                fchown                  -                               compat_sys_s390_fchown16
+95   32                fchown                  -                               sys_fchown16
 96   common    getpriority             sys_getpriority                 sys_getpriority
 97   common    setpriority             sys_setpriority                 sys_setpriority
 99   common    statfs                  sys_statfs                      compat_sys_statfs
 100  common    fstatfs                 sys_fstatfs                     compat_sys_fstatfs
 101  32                ioperm                  -                               -
 102  common    socketcall              sys_socketcall                  compat_sys_socketcall
-103  common    syslog                  sys_syslog                      compat_sys_syslog
+103  common    syslog                  sys_syslog                      sys_syslog
 104  common    setitimer               sys_setitimer                   compat_sys_setitimer
 105  common    getitimer               sys_getitimer                   compat_sys_getitimer
 106  common    stat                    sys_newstat                     compat_sys_newstat
 111  common    vhangup                 sys_vhangup                     sys_vhangup
 112  common    idle                    -                               -
 114  common    wait4                   sys_wait4                       compat_sys_wait4
-115  common    swapoff                 sys_swapoff                     compat_sys_swapoff
+115  common    swapoff                 sys_swapoff                     sys_swapoff
 116  common    sysinfo                 sys_sysinfo                     compat_sys_sysinfo
 117  common    ipc                     sys_s390_ipc                    compat_sys_s390_ipc
 118  common    fsync                   sys_fsync                       sys_fsync
 119  common    sigreturn               sys_sigreturn                   compat_sys_sigreturn
-120  common    clone                   sys_clone                       compat_sys_clone
-121  common    setdomainname           sys_setdomainname               compat_sys_setdomainname
-122  common    uname                   sys_newuname                    compat_sys_newuname
-124  common    adjtimex                sys_adjtimex                    compat_sys_adjtimex
-125  common    mprotect                sys_mprotect                    compat_sys_mprotect
+120  common    clone                   sys_clone                       sys_clone
+121  common    setdomainname           sys_setdomainname               sys_setdomainname
+122  common    uname                   sys_newuname                    sys_newuname
+124  common    adjtimex                sys_adjtimex                    sys_adjtimex_time32
+125  common    mprotect                sys_mprotect                    sys_mprotect
 126  common    sigprocmask             sys_sigprocmask                 compat_sys_sigprocmask
 127  common    create_module           -                               -
-128  common    init_module             sys_init_module                 compat_sys_init_module
-129  common    delete_module           sys_delete_module               compat_sys_delete_module
+128  common    init_module             sys_init_module                 sys_init_module
+129  common    delete_module           sys_delete_module               sys_delete_module
 130  common    get_kernel_syms         -                               -
-131  common    quotactl                sys_quotactl                    compat_sys_quotactl
+131  common    quotactl                sys_quotactl                    sys_quotactl
 132  common    getpgid                 sys_getpgid                     sys_getpgid
 133  common    fchdir                  sys_fchdir                      sys_fchdir
-134  common    bdflush                 sys_bdflush                     compat_sys_bdflush
-135  common    sysfs                   sys_sysfs                       compat_sys_sysfs
+134  common    bdflush                 sys_bdflush                     sys_bdflush
+135  common    sysfs                   sys_sysfs                       sys_sysfs
 136  common    personality             sys_s390_personality            sys_s390_personality
 137  common    afs_syscall             -                               -
-138  32                setfsuid                -                               compat_sys_s390_setfsuid16
-139  32                setfsgid                -                               compat_sys_s390_setfsgid16
-140  32                _llseek                 -                               compat_sys_llseek
+138  32                setfsuid                -                               sys_setfsuid16
+139  32                setfsgid                -                               sys_setfsgid16
+140  32                _llseek                 -                               sys_llseek
 141  common    getdents                sys_getdents                    compat_sys_getdents
 142  32                _newselect              -                               compat_sys_select
 142  64                select                  sys_select                      -
 143  common    flock                   sys_flock                       sys_flock
-144  common    msync                   sys_msync                       compat_sys_msync
-145  common    readv                   sys_readv
-146  common    writev                  sys_writev
+144  common    msync                   sys_msync                       sys_msync
+145  common    readv                   sys_readv                       sys_readv
+146  common    writev                  sys_writev                      sys_writev
 147  common    getsid                  sys_getsid                      sys_getsid
 148  common    fdatasync               sys_fdatasync                   sys_fdatasync
 149  common    _sysctl                 -                               -
-150  common    mlock                   sys_mlock                       compat_sys_mlock
-151  common    munlock                 sys_munlock                     compat_sys_munlock
+150  common    mlock                   sys_mlock                       sys_mlock
+151  common    munlock                 sys_munlock                     sys_munlock
 152  common    mlockall                sys_mlockall                    sys_mlockall
 153  common    munlockall              sys_munlockall                  sys_munlockall
-154  common    sched_setparam          sys_sched_setparam              compat_sys_sched_setparam
-155  common    sched_getparam          sys_sched_getparam              compat_sys_sched_getparam
-156  common    sched_setscheduler      sys_sched_setscheduler          compat_sys_sched_setscheduler
+154  common    sched_setparam          sys_sched_setparam              sys_sched_setparam
+155  common    sched_getparam          sys_sched_getparam              sys_sched_getparam
+156  common    sched_setscheduler      sys_sched_setscheduler          sys_sched_setscheduler
 157  common    sched_getscheduler      sys_sched_getscheduler          sys_sched_getscheduler
 158  common    sched_yield             sys_sched_yield                 sys_sched_yield
 159  common    sched_get_priority_max  sys_sched_get_priority_max      sys_sched_get_priority_max
 160  common    sched_get_priority_min  sys_sched_get_priority_min      sys_sched_get_priority_min
-161  common    sched_rr_get_interval   sys_sched_rr_get_interval       compat_sys_sched_rr_get_interval
-162  common    nanosleep               sys_nanosleep                   compat_sys_nanosleep
-163  common    mremap                  sys_mremap                      compat_sys_mremap
-164  32                setresuid               -                               compat_sys_s390_setresuid16
-165  32                getresuid               -                               compat_sys_s390_getresuid16
+161  common    sched_rr_get_interval   sys_sched_rr_get_interval       sys_sched_rr_get_interval_time32
+162  common    nanosleep               sys_nanosleep                   sys_nanosleep_time32
+163  common    mremap                  sys_mremap                      sys_mremap
+164  32                setresuid               -                               sys_setresuid16
+165  32                getresuid               -                               sys_getresuid16
 167  common    query_module            -                               -
-168  common    poll                    sys_poll                        compat_sys_poll
+168  common    poll                    sys_poll                        sys_poll
 169  common    nfsservctl              -                               -
-170  32                setresgid               -                               compat_sys_s390_setresgid16
-171  32                getresgid               -                               compat_sys_s390_getresgid16
-172  common    prctl                   sys_prctl                       compat_sys_prctl
+170  32                setresgid               -                               sys_setresgid16
+171  32                getresgid               -                               sys_getresgid16
+172  common    prctl                   sys_prctl                       sys_prctl
 173  common    rt_sigreturn            sys_rt_sigreturn                compat_sys_rt_sigreturn
 174  common    rt_sigaction            sys_rt_sigaction                compat_sys_rt_sigaction
 175  common    rt_sigprocmask          sys_rt_sigprocmask              compat_sys_rt_sigprocmask
 176  common    rt_sigpending           sys_rt_sigpending               compat_sys_rt_sigpending
-177  common    rt_sigtimedwait         sys_rt_sigtimedwait             compat_sys_rt_sigtimedwait
+177  common    rt_sigtimedwait         sys_rt_sigtimedwait             compat_sys_rt_sigtimedwait_time32
 178  common    rt_sigqueueinfo         sys_rt_sigqueueinfo             compat_sys_rt_sigqueueinfo
 179  common    rt_sigsuspend           sys_rt_sigsuspend               compat_sys_rt_sigsuspend
 180  common    pread64                 sys_pread64                     compat_sys_s390_pread64
 181  common    pwrite64                sys_pwrite64                    compat_sys_s390_pwrite64
-182  32                chown                   -                               compat_sys_s390_chown16
-183  common    getcwd                  sys_getcwd                      compat_sys_getcwd
-184  common    capget                  sys_capget                      compat_sys_capget
-185  common    capset                  sys_capset                      compat_sys_capset
+182  32                chown                   -                               sys_chown16
+183  common    getcwd                  sys_getcwd                      sys_getcwd
+184  common    capget                  sys_capget                      sys_capget
+185  common    capset                  sys_capset                      sys_capset
 186  common    sigaltstack             sys_sigaltstack                 compat_sys_sigaltstack
 187  common    sendfile                sys_sendfile64                  compat_sys_sendfile
 188  common    getpmsg                 -                               -
 195  32                stat64                  -                               compat_sys_s390_stat64
 196  32                lstat64                 -                               compat_sys_s390_lstat64
 197  32                fstat64                 -                               compat_sys_s390_fstat64
-198  32                lchown32                -                               compat_sys_lchown
+198  32                lchown32                -                               sys_lchown
 198  64                lchown                  sys_lchown                      -
 199  32                getuid32                -                               sys_getuid
 199  64                getuid                  sys_getuid                      -
 203  64                setreuid                sys_setreuid                    -
 204  32                setregid32              -                               sys_setregid
 204  64                setregid                sys_setregid                    -
-205  32                getgroups32             -                               compat_sys_getgroups
+205  32                getgroups32             -                               sys_getgroups
 205  64                getgroups               sys_getgroups                   -
-206  32                setgroups32             -                               compat_sys_setgroups
+206  32                setgroups32             -                               sys_setgroups
 206  64                setgroups               sys_setgroups                   -
 207  32                fchown32                -                               sys_fchown
 207  64                fchown                  sys_fchown                      -
 208  32                setresuid32             -                               sys_setresuid
 208  64                setresuid               sys_setresuid                   -
-209  32                getresuid32             -                               compat_sys_getresuid
+209  32                getresuid32             -                               sys_getresuid
 209  64                getresuid               sys_getresuid                   -
 210  32                setresgid32             -                               sys_setresgid
 210  64                setresgid               sys_setresgid                   -
-211  32                getresgid32             -                               compat_sys_getresgid
+211  32                getresgid32             -                               sys_getresgid
 211  64                getresgid               sys_getresgid                   -
-212  32                chown32                 -                               compat_sys_chown
+212  32                chown32                 -                               sys_chown
 212  64                chown                   sys_chown                       -
 213  32                setuid32                -                               sys_setuid
 213  64                setuid                  sys_setuid                      -
 215  64                setfsuid                sys_setfsuid                    -
 216  32                setfsgid32              -                               sys_setfsgid
 216  64                setfsgid                sys_setfsgid                    -
-217  common    pivot_root              sys_pivot_root                  compat_sys_pivot_root
-218  common    mincore                 sys_mincore                     compat_sys_mincore
-219  common    madvise                 sys_madvise                     compat_sys_madvise
-220  common    getdents64              sys_getdents64                  compat_sys_getdents64
+217  common    pivot_root              sys_pivot_root                  sys_pivot_root
+218  common    mincore                 sys_mincore                     sys_mincore
+219  common    madvise                 sys_madvise                     sys_madvise
+220  common    getdents64              sys_getdents64                  sys_getdents64
 221  32                fcntl64                 -                               compat_sys_fcntl64
 222  common    readahead               sys_readahead                   compat_sys_s390_readahead
 223  32                sendfile64              -                               compat_sys_sendfile64
-224  common    setxattr                sys_setxattr                    compat_sys_setxattr
-225  common    lsetxattr               sys_lsetxattr                   compat_sys_lsetxattr
-226  common    fsetxattr               sys_fsetxattr                   compat_sys_fsetxattr
-227  common    getxattr                sys_getxattr                    compat_sys_getxattr
-228  common    lgetxattr               sys_lgetxattr                   compat_sys_lgetxattr
-229  common    fgetxattr               sys_fgetxattr                   compat_sys_fgetxattr
-230  common    listxattr               sys_listxattr                   compat_sys_listxattr
-231  common    llistxattr              sys_llistxattr                  compat_sys_llistxattr
-232  common    flistxattr              sys_flistxattr                  compat_sys_flistxattr
-233  common    removexattr             sys_removexattr                 compat_sys_removexattr
-234  common    lremovexattr            sys_lremovexattr                compat_sys_lremovexattr
-235  common    fremovexattr            sys_fremovexattr                compat_sys_fremovexattr
+224  common    setxattr                sys_setxattr                    sys_setxattr
+225  common    lsetxattr               sys_lsetxattr                   sys_lsetxattr
+226  common    fsetxattr               sys_fsetxattr                   sys_fsetxattr
+227  common    getxattr                sys_getxattr                    sys_getxattr
+228  common    lgetxattr               sys_lgetxattr                   sys_lgetxattr
+229  common    fgetxattr               sys_fgetxattr                   sys_fgetxattr
+230  common    listxattr               sys_listxattr                   sys_listxattr
+231  common    llistxattr              sys_llistxattr                  sys_llistxattr
+232  common    flistxattr              sys_flistxattr                  sys_flistxattr
+233  common    removexattr             sys_removexattr                 sys_removexattr
+234  common    lremovexattr            sys_lremovexattr                sys_lremovexattr
+235  common    fremovexattr            sys_fremovexattr                sys_fremovexattr
 236  common    gettid                  sys_gettid                      sys_gettid
 237  common    tkill                   sys_tkill                       sys_tkill
-238  common    futex                   sys_futex                       compat_sys_futex
+238  common    futex                   sys_futex                       sys_futex_time32
 239  common    sched_setaffinity       sys_sched_setaffinity           compat_sys_sched_setaffinity
 240  common    sched_getaffinity       sys_sched_getaffinity           compat_sys_sched_getaffinity
 241  common    tgkill                  sys_tgkill                      sys_tgkill
 243  common    io_setup                sys_io_setup                    compat_sys_io_setup
-244  common    io_destroy              sys_io_destroy                  compat_sys_io_destroy
-245  common    io_getevents            sys_io_getevents                compat_sys_io_getevents
+244  common    io_destroy              sys_io_destroy                  sys_io_destroy
+245  common    io_getevents            sys_io_getevents                sys_io_getevents_time32
 246  common    io_submit               sys_io_submit                   compat_sys_io_submit
-247  common    io_cancel               sys_io_cancel                   compat_sys_io_cancel
+247  common    io_cancel               sys_io_cancel                   sys_io_cancel
 248  common    exit_group              sys_exit_group                  sys_exit_group
 249  common    epoll_create            sys_epoll_create                sys_epoll_create
-250  common    epoll_ctl               sys_epoll_ctl                   compat_sys_epoll_ctl
-251  common    epoll_wait              sys_epoll_wait                  compat_sys_epoll_wait
-252  common    set_tid_address         sys_set_tid_address             compat_sys_set_tid_address
+250  common    epoll_ctl               sys_epoll_ctl                   sys_epoll_ctl
+251  common    epoll_wait              sys_epoll_wait                  sys_epoll_wait
+252  common    set_tid_address         sys_set_tid_address             sys_set_tid_address
 253  common    fadvise64               sys_fadvise64_64                compat_sys_s390_fadvise64
 254  common    timer_create            sys_timer_create                compat_sys_timer_create
-255  common    timer_settime           sys_timer_settime               compat_sys_timer_settime
-256  common    timer_gettime           sys_timer_gettime               compat_sys_timer_gettime
+255  common    timer_settime           sys_timer_settime               sys_timer_settime32
+256  common    timer_gettime           sys_timer_gettime               sys_timer_gettime32
 257  common    timer_getoverrun        sys_timer_getoverrun            sys_timer_getoverrun
 258  common    timer_delete            sys_timer_delete                sys_timer_delete
-259  common    clock_settime           sys_clock_settime               compat_sys_clock_settime
-260  common    clock_gettime           sys_clock_gettime               compat_sys_clock_gettime
-261  common    clock_getres            sys_clock_getres                compat_sys_clock_getres
-262  common    clock_nanosleep         sys_clock_nanosleep             compat_sys_clock_nanosleep
+259  common    clock_settime           sys_clock_settime               sys_clock_settime32
+260  common    clock_gettime           sys_clock_gettime               sys_clock_gettime32
+261  common    clock_getres            sys_clock_getres                sys_clock_getres_time32
+262  common    clock_nanosleep         sys_clock_nanosleep             sys_clock_nanosleep_time32
 264  32                fadvise64_64            -                               compat_sys_s390_fadvise64_64
 265  common    statfs64                sys_statfs64                    compat_sys_statfs64
 266  common    fstatfs64               sys_fstatfs64                   compat_sys_fstatfs64
-267  common    remap_file_pages        sys_remap_file_pages            compat_sys_remap_file_pages
+267  common    remap_file_pages        sys_remap_file_pages            sys_remap_file_pages
 268  common    mbind                   sys_mbind                       compat_sys_mbind
 269  common    get_mempolicy           sys_get_mempolicy               compat_sys_get_mempolicy
 270  common    set_mempolicy           sys_set_mempolicy               compat_sys_set_mempolicy
 271  common    mq_open                 sys_mq_open                     compat_sys_mq_open
-272  common    mq_unlink               sys_mq_unlink                   compat_sys_mq_unlink
-273  common    mq_timedsend            sys_mq_timedsend                compat_sys_mq_timedsend
-274  common    mq_timedreceive         sys_mq_timedreceive             compat_sys_mq_timedreceive
+272  common    mq_unlink               sys_mq_unlink                   sys_mq_unlink
+273  common    mq_timedsend            sys_mq_timedsend                sys_mq_timedsend_time32
+274  common    mq_timedreceive         sys_mq_timedreceive             sys_mq_timedreceive_time32
 275  common    mq_notify               sys_mq_notify                   compat_sys_mq_notify
 276  common    mq_getsetattr           sys_mq_getsetattr               compat_sys_mq_getsetattr
 277  common    kexec_load              sys_kexec_load                  compat_sys_kexec_load
-278  common    add_key                 sys_add_key                     compat_sys_add_key
-279  common    request_key             sys_request_key                 compat_sys_request_key
+278  common    add_key                 sys_add_key                     sys_add_key
+279  common    request_key             sys_request_key                 sys_request_key
 280  common    keyctl                  sys_keyctl                      compat_sys_keyctl
 281  common    waitid                  sys_waitid                      compat_sys_waitid
 282  common    ioprio_set              sys_ioprio_set                  sys_ioprio_set
 283  common    ioprio_get              sys_ioprio_get                  sys_ioprio_get
 284  common    inotify_init            sys_inotify_init                sys_inotify_init
-285  common    inotify_add_watch       sys_inotify_add_watch           compat_sys_inotify_add_watch
+285  common    inotify_add_watch       sys_inotify_add_watch           sys_inotify_add_watch
 286  common    inotify_rm_watch        sys_inotify_rm_watch            sys_inotify_rm_watch
 287  common    migrate_pages           sys_migrate_pages               compat_sys_migrate_pages
 288  common    openat                  sys_openat                      compat_sys_openat
-289  common    mkdirat                 sys_mkdirat                     compat_sys_mkdirat
-290  common    mknodat                 sys_mknodat                     compat_sys_mknodat
-291  common    fchownat                sys_fchownat                    compat_sys_fchownat
-292  common    futimesat               sys_futimesat                   compat_sys_futimesat
+289  common    mkdirat                 sys_mkdirat                     sys_mkdirat
+290  common    mknodat                 sys_mknodat                     sys_mknodat
+291  common    fchownat                sys_fchownat                    sys_fchownat
+292  common    futimesat               sys_futimesat                   sys_futimesat_time32
 293  32                fstatat64               -                               compat_sys_s390_fstatat64
 293  64                newfstatat              sys_newfstatat                  -
-294  common    unlinkat                sys_unlinkat                    compat_sys_unlinkat
-295  common    renameat                sys_renameat                    compat_sys_renameat
-296  common    linkat                  sys_linkat                      compat_sys_linkat
-297  common    symlinkat               sys_symlinkat                   compat_sys_symlinkat
-298  common    readlinkat              sys_readlinkat                  compat_sys_readlinkat
-299  common    fchmodat                sys_fchmodat                    compat_sys_fchmodat
-300  common    faccessat               sys_faccessat                   compat_sys_faccessat
-301  common    pselect6                sys_pselect6                    compat_sys_pselect6
-302  common    ppoll                   sys_ppoll                       compat_sys_ppoll
-303  common    unshare                 sys_unshare                     compat_sys_unshare
+294  common    unlinkat                sys_unlinkat                    sys_unlinkat
+295  common    renameat                sys_renameat                    sys_renameat
+296  common    linkat                  sys_linkat                      sys_linkat
+297  common    symlinkat               sys_symlinkat                   sys_symlinkat
+298  common    readlinkat              sys_readlinkat                  sys_readlinkat
+299  common    fchmodat                sys_fchmodat                    sys_fchmodat
+300  common    faccessat               sys_faccessat                   sys_faccessat
+301  common    pselect6                sys_pselect6                    compat_sys_pselect6_time32
+302  common    ppoll                   sys_ppoll                       compat_sys_ppoll_time32
+303  common    unshare                 sys_unshare                     sys_unshare
 304  common    set_robust_list         sys_set_robust_list             compat_sys_set_robust_list
 305  common    get_robust_list         sys_get_robust_list             compat_sys_get_robust_list
-306  common    splice                  sys_splice                      compat_sys_splice
+306  common    splice                  sys_splice                      sys_splice
 307  common    sync_file_range         sys_sync_file_range             compat_sys_s390_sync_file_range
-308  common    tee                     sys_tee                         compat_sys_tee
+308  common    tee                     sys_tee                         sys_tee
 309  common    vmsplice                sys_vmsplice                    sys_vmsplice
 310  common    move_pages              sys_move_pages                  compat_sys_move_pages
-311  common    getcpu                  sys_getcpu                      compat_sys_getcpu
+311  common    getcpu                  sys_getcpu                      sys_getcpu
 312  common    epoll_pwait             sys_epoll_pwait                 compat_sys_epoll_pwait
-313  common    utimes                  sys_utimes                      compat_sys_utimes
+313  common    utimes                  sys_utimes                      sys_utimes_time32
 314  common    fallocate               sys_fallocate                   compat_sys_s390_fallocate
-315  common    utimensat               sys_utimensat                   compat_sys_utimensat
+315  common    utimensat               sys_utimensat                   sys_utimensat_time32
 316  common    signalfd                sys_signalfd                    compat_sys_signalfd
 317  common    timerfd                 -                               -
 318  common    eventfd                 sys_eventfd                     sys_eventfd
 319  common    timerfd_create          sys_timerfd_create              sys_timerfd_create
-320  common    timerfd_settime         sys_timerfd_settime             compat_sys_timerfd_settime
-321  common    timerfd_gettime         sys_timerfd_gettime             compat_sys_timerfd_gettime
+320  common    timerfd_settime         sys_timerfd_settime             sys_timerfd_settime32
+321  common    timerfd_gettime         sys_timerfd_gettime             sys_timerfd_gettime32
 322  common    signalfd4               sys_signalfd4                   compat_sys_signalfd4
 323  common    eventfd2                sys_eventfd2                    sys_eventfd2
 324  common    inotify_init1           sys_inotify_init1               sys_inotify_init1
-325  common    pipe2                   sys_pipe2                       compat_sys_pipe2
+325  common    pipe2                   sys_pipe2                       sys_pipe2
 326  common    dup3                    sys_dup3                        sys_dup3
 327  common    epoll_create1           sys_epoll_create1               sys_epoll_create1
 328  common    preadv                  sys_preadv                      compat_sys_preadv
 329  common    pwritev                 sys_pwritev                     compat_sys_pwritev
 330  common    rt_tgsigqueueinfo       sys_rt_tgsigqueueinfo           compat_sys_rt_tgsigqueueinfo
-331  common    perf_event_open         sys_perf_event_open             compat_sys_perf_event_open
+331  common    perf_event_open         sys_perf_event_open             sys_perf_event_open
 332  common    fanotify_init           sys_fanotify_init               sys_fanotify_init
 333  common    fanotify_mark           sys_fanotify_mark               compat_sys_fanotify_mark
-334  common    prlimit64               sys_prlimit64                   compat_sys_prlimit64
-335  common    name_to_handle_at       sys_name_to_handle_at           compat_sys_name_to_handle_at
+334  common    prlimit64               sys_prlimit64                   sys_prlimit64
+335  common    name_to_handle_at       sys_name_to_handle_at           sys_name_to_handle_at
 336  common    open_by_handle_at       sys_open_by_handle_at           compat_sys_open_by_handle_at
-337  common    clock_adjtime           sys_clock_adjtime               compat_sys_clock_adjtime
+337  common    clock_adjtime           sys_clock_adjtime               sys_clock_adjtime32
 338  common    syncfs                  sys_syncfs                      sys_syncfs
 339  common    setns                   sys_setns                       sys_setns
 340  common    process_vm_readv        sys_process_vm_readv            sys_process_vm_readv
 341  common    process_vm_writev       sys_process_vm_writev           sys_process_vm_writev
 342  common    s390_runtime_instr      sys_s390_runtime_instr          sys_s390_runtime_instr
-343  common    kcmp                    sys_kcmp                        compat_sys_kcmp
-344  common    finit_module            sys_finit_module                compat_sys_finit_module
-345  common    sched_setattr           sys_sched_setattr               compat_sys_sched_setattr
-346  common    sched_getattr           sys_sched_getattr               compat_sys_sched_getattr
-347  common    renameat2               sys_renameat2                   compat_sys_renameat2
-348  common    seccomp                 sys_seccomp                     compat_sys_seccomp
-349  common    getrandom               sys_getrandom                   compat_sys_getrandom
-350  common    memfd_create            sys_memfd_create                compat_sys_memfd_create
-351  common    bpf                     sys_bpf                         compat_sys_bpf
-352  common    s390_pci_mmio_write     sys_s390_pci_mmio_write         compat_sys_s390_pci_mmio_write
-353  common    s390_pci_mmio_read      sys_s390_pci_mmio_read          compat_sys_s390_pci_mmio_read
+343  common    kcmp                    sys_kcmp                        sys_kcmp
+344  common    finit_module            sys_finit_module                sys_finit_module
+345  common    sched_setattr           sys_sched_setattr               sys_sched_setattr
+346  common    sched_getattr           sys_sched_getattr               sys_sched_getattr
+347  common    renameat2               sys_renameat2                   sys_renameat2
+348  common    seccomp                 sys_seccomp                     sys_seccomp
+349  common    getrandom               sys_getrandom                   sys_getrandom
+350  common    memfd_create            sys_memfd_create                sys_memfd_create
+351  common    bpf                     sys_bpf                         sys_bpf
+352  common    s390_pci_mmio_write     sys_s390_pci_mmio_write         sys_s390_pci_mmio_write
+353  common    s390_pci_mmio_read      sys_s390_pci_mmio_read          sys_s390_pci_mmio_read
 354  common    execveat                sys_execveat                    compat_sys_execveat
 355  common    userfaultfd             sys_userfaultfd                 sys_userfaultfd
 356  common    membarrier              sys_membarrier                  sys_membarrier
-357  common    recvmmsg                sys_recvmmsg                    compat_sys_recvmmsg
+357  common    recvmmsg                sys_recvmmsg                    compat_sys_recvmmsg_time32
 358  common    sendmmsg                sys_sendmmsg                    compat_sys_sendmmsg
 359  common    socket                  sys_socket                      sys_socket
-360  common    socketpair              sys_socketpair                  compat_sys_socketpair
-361  common    bind                    sys_bind                        compat_sys_bind
-362  common    connect                 sys_connect                     compat_sys_connect
+360  common    socketpair              sys_socketpair                  sys_socketpair
+361  common    bind                    sys_bind                        sys_bind
+362  common    connect                 sys_connect                     sys_connect
 363  common    listen                  sys_listen                      sys_listen
-364  common    accept4                 sys_accept4                     compat_sys_accept4
+364  common    accept4                 sys_accept4                     sys_accept4
 365  common    getsockopt              sys_getsockopt                  sys_getsockopt
 366  common    setsockopt              sys_setsockopt                  sys_setsockopt
-367  common    getsockname             sys_getsockname                 compat_sys_getsockname
-368  common    getpeername             sys_getpeername                 compat_sys_getpeername
-369  common    sendto                  sys_sendto                      compat_sys_sendto
+367  common    getsockname             sys_getsockname                 sys_getsockname
+368  common    getpeername             sys_getpeername                 sys_getpeername
+369  common    sendto                  sys_sendto                      sys_sendto
 370  common    sendmsg                 sys_sendmsg                     compat_sys_sendmsg
 371  common    recvfrom                sys_recvfrom                    compat_sys_recvfrom
 372  common    recvmsg                 sys_recvmsg                     compat_sys_recvmsg
 373  common    shutdown                sys_shutdown                    sys_shutdown
-374  common    mlock2                  sys_mlock2                      compat_sys_mlock2
-375  common    copy_file_range         sys_copy_file_range             compat_sys_copy_file_range
+374  common    mlock2                  sys_mlock2                      sys_mlock2
+375  common    copy_file_range         sys_copy_file_range             sys_copy_file_range
 376  common    preadv2                 sys_preadv2                     compat_sys_preadv2
 377  common    pwritev2                sys_pwritev2                    compat_sys_pwritev2
-378  common    s390_guarded_storage    sys_s390_guarded_storage        compat_sys_s390_guarded_storage
-379  common    statx                   sys_statx                       compat_sys_statx
-380  common    s390_sthyi              sys_s390_sthyi                  compat_sys_s390_sthyi
+378  common    s390_guarded_storage    sys_s390_guarded_storage        sys_s390_guarded_storage
+379  common    statx                   sys_statx                       sys_statx
+380  common    s390_sthyi              sys_s390_sthyi                  sys_s390_sthyi
+381  common    kexec_file_load         sys_kexec_file_load             sys_kexec_file_load
+382  common    io_pgetevents           sys_io_pgetevents               compat_sys_io_pgetevents
+383  common    rseq                    sys_rseq                        sys_rseq
+384  common    pkey_mprotect           sys_pkey_mprotect               sys_pkey_mprotect
+385  common    pkey_alloc              sys_pkey_alloc                  sys_pkey_alloc
+386  common    pkey_free               sys_pkey_free                   sys_pkey_free
+# room for arch specific syscalls
+392    64      semtimedop              sys_semtimedop                  -
+393  common    semget                  sys_semget                      sys_semget
+394  common    semctl                  sys_semctl                      compat_sys_semctl
+395  common    shmget                  sys_shmget                      sys_shmget
+396  common    shmctl                  sys_shmctl                      compat_sys_shmctl
+397  common    shmat                   sys_shmat                       compat_sys_shmat
+398  common    shmdt                   sys_shmdt                       sys_shmdt
+399  common    msgget                  sys_msgget                      sys_msgget
+400  common    msgsnd                  sys_msgsnd                      compat_sys_msgsnd
+401  common    msgrcv                  sys_msgrcv                      compat_sys_msgrcv
+402  common    msgctl                  sys_msgctl                      compat_sys_msgctl
+403    32      clock_gettime64         -                               sys_clock_gettime
+404    32      clock_settime64         -                               sys_clock_settime
+405    32      clock_adjtime64         -                               sys_clock_adjtime
+406    32      clock_getres_time64     -                               sys_clock_getres
+407    32      clock_nanosleep_time64  -                               sys_clock_nanosleep
+408    32      timer_gettime64         -                               sys_timer_gettime
+409    32      timer_settime64         -                               sys_timer_settime
+410    32      timerfd_gettime64       -                               sys_timerfd_gettime
+411    32      timerfd_settime64       -                               sys_timerfd_settime
+412    32      utimensat_time64        -                               sys_utimensat
+413    32      pselect6_time64         -                               compat_sys_pselect6_time64
+414    32      ppoll_time64            -                               compat_sys_ppoll_time64
+416    32      io_pgetevents_time64    -                               sys_io_pgetevents
+417    32      recvmmsg_time64         -                               compat_sys_recvmmsg_time64
+418    32      mq_timedsend_time64     -                               sys_mq_timedsend
+419    32      mq_timedreceive_time64  -                               sys_mq_timedreceive
+420    32      semtimedop_time64       -                               sys_semtimedop
+421    32      rt_sigtimedwait_time64  -                               compat_sys_rt_sigtimedwait_time64
+422    32      futex_time64            -                               sys_futex
+423    32      sched_rr_get_interval_time64    -                       sys_sched_rr_get_interval
+424  common    pidfd_send_signal       sys_pidfd_send_signal           sys_pidfd_send_signal
+425  common    io_uring_setup          sys_io_uring_setup              sys_io_uring_setup
+426  common    io_uring_enter          sys_io_uring_enter              sys_io_uring_enter
+427  common    io_uring_register       sys_io_uring_register           sys_io_uring_register
+428  common    open_tree               sys_open_tree                   sys_open_tree
+429  common    move_mount              sys_move_mount                  sys_move_mount
+430  common    fsopen                  sys_fsopen                      sys_fsopen
+431  common    fsconfig                sys_fsconfig                    sys_fsconfig
+432  common    fsmount                 sys_fsmount                     sys_fsmount
+433  common    fspick                  sys_fspick                      sys_fspick
+434  common    pidfd_open              sys_pidfd_open                  sys_pidfd_open
+435  common    clone3                  sys_clone3                      sys_clone3
+436  common    close_range             sys_close_range                 sys_close_range
+437  common    openat2                 sys_openat2                     sys_openat2
+438  common    pidfd_getfd             sys_pidfd_getfd                 sys_pidfd_getfd
+439  common    faccessat2              sys_faccessat2                  sys_faccessat2
+440  common    process_madvise         sys_process_madvise             sys_process_madvise
+441  common    epoll_pwait2            sys_epoll_pwait2                compat_sys_epoll_pwait2
index 3798192..7867212 100644 (file)
 438    common  pidfd_getfd             sys_pidfd_getfd
 439    common  faccessat2              sys_faccessat2
 440    common  process_madvise         sys_process_madvise
+441    common  epoll_pwait2            sys_epoll_pwait2
 
 #
 # Due to a historical design error, certain syscalls are numbered differently
index 89c3269..8cc2496 100644 (file)
@@ -1186,65 +1186,67 @@ static struct option stat_options[] = {
        OPT_END()
 };
 
-static int perf_stat__get_socket(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_socket(struct perf_stat_config *config __maybe_unused,
                                 struct perf_cpu_map *map, int cpu)
 {
        return cpu_map__get_socket(map, cpu, NULL);
 }
 
-static int perf_stat__get_die(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_die(struct perf_stat_config *config __maybe_unused,
                              struct perf_cpu_map *map, int cpu)
 {
        return cpu_map__get_die(map, cpu, NULL);
 }
 
-static int perf_stat__get_core(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_core(struct perf_stat_config *config __maybe_unused,
                               struct perf_cpu_map *map, int cpu)
 {
        return cpu_map__get_core(map, cpu, NULL);
 }
 
-static int perf_stat__get_node(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_node(struct perf_stat_config *config __maybe_unused,
                               struct perf_cpu_map *map, int cpu)
 {
        return cpu_map__get_node(map, cpu, NULL);
 }
 
-static int perf_stat__get_aggr(struct perf_stat_config *config,
+static struct aggr_cpu_id perf_stat__get_aggr(struct perf_stat_config *config,
                               aggr_get_id_t get_id, struct perf_cpu_map *map, int idx)
 {
        int cpu;
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
 
        if (idx >= map->nr)
-               return -1;
+               return id;
 
        cpu = map->map[idx];
 
-       if (config->cpus_aggr_map->map[cpu] == -1)
+       if (cpu_map__aggr_cpu_id_is_empty(config->cpus_aggr_map->map[cpu]))
                config->cpus_aggr_map->map[cpu] = get_id(config, map, idx);
 
-       return config->cpus_aggr_map->map[cpu];
+       id = config->cpus_aggr_map->map[cpu];
+       return id;
 }
 
-static int perf_stat__get_socket_cached(struct perf_stat_config *config,
+static struct aggr_cpu_id perf_stat__get_socket_cached(struct perf_stat_config *config,
                                        struct perf_cpu_map *map, int idx)
 {
        return perf_stat__get_aggr(config, perf_stat__get_socket, map, idx);
 }
 
-static int perf_stat__get_die_cached(struct perf_stat_config *config,
+static struct aggr_cpu_id perf_stat__get_die_cached(struct perf_stat_config *config,
                                        struct perf_cpu_map *map, int idx)
 {
        return perf_stat__get_aggr(config, perf_stat__get_die, map, idx);
 }
 
-static int perf_stat__get_core_cached(struct perf_stat_config *config,
+static struct aggr_cpu_id perf_stat__get_core_cached(struct perf_stat_config *config,
                                      struct perf_cpu_map *map, int idx)
 {
        return perf_stat__get_aggr(config, perf_stat__get_core, map, idx);
 }
 
-static int perf_stat__get_node_cached(struct perf_stat_config *config,
+static struct aggr_cpu_id perf_stat__get_node_cached(struct perf_stat_config *config,
                                      struct perf_cpu_map *map, int idx)
 {
        return perf_stat__get_aggr(config, perf_stat__get_node, map, idx);
@@ -1318,14 +1320,29 @@ static int perf_stat_init_aggr_mode(void)
         * the aggregation translate cpumap.
         */
        nr = perf_cpu_map__max(evsel_list->core.cpus);
-       stat_config.cpus_aggr_map = perf_cpu_map__empty_new(nr + 1);
+       stat_config.cpus_aggr_map = cpu_aggr_map__empty_new(nr + 1);
        return stat_config.cpus_aggr_map ? 0 : -ENOMEM;
 }
 
+static void cpu_aggr_map__delete(struct cpu_aggr_map *map)
+{
+       if (map) {
+               WARN_ONCE(refcount_read(&map->refcnt) != 0,
+                         "cpu_aggr_map refcnt unbalanced\n");
+               free(map);
+       }
+}
+
+static void cpu_aggr_map__put(struct cpu_aggr_map *map)
+{
+       if (map && refcount_dec_and_test(&map->refcnt))
+               cpu_aggr_map__delete(map);
+}
+
 static void perf_stat__exit_aggr_mode(void)
 {
-       perf_cpu_map__put(stat_config.aggr_map);
-       perf_cpu_map__put(stat_config.cpus_aggr_map);
+       cpu_aggr_map__put(stat_config.aggr_map);
+       cpu_aggr_map__put(stat_config.cpus_aggr_map);
        stat_config.aggr_map = NULL;
        stat_config.cpus_aggr_map = NULL;
 }
@@ -1345,117 +1362,108 @@ static inline int perf_env__get_cpu(struct perf_env *env, struct perf_cpu_map *m
        return cpu;
 }
 
-static int perf_env__get_socket(struct perf_cpu_map *map, int idx, void *data)
+static struct aggr_cpu_id perf_env__get_socket(struct perf_cpu_map *map, int idx, void *data)
 {
        struct perf_env *env = data;
        int cpu = perf_env__get_cpu(env, map, idx);
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
+
+       if (cpu != -1)
+               id.socket = env->cpu[cpu].socket_id;
 
-       return cpu == -1 ? -1 : env->cpu[cpu].socket_id;
+       return id;
 }
 
-static int perf_env__get_die(struct perf_cpu_map *map, int idx, void *data)
+static struct aggr_cpu_id perf_env__get_die(struct perf_cpu_map *map, int idx, void *data)
 {
        struct perf_env *env = data;
-       int die_id = -1, cpu = perf_env__get_cpu(env, map, idx);
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
+       int cpu = perf_env__get_cpu(env, map, idx);
 
        if (cpu != -1) {
                /*
-                * Encode socket in bit range 15:8
-                * die_id is relative to socket,
-                * we need a global id. So we combine
-                * socket + die id
+                * die_id is relative to socket, so start
+                * with the socket ID and then add die to
+                * make a unique ID.
                 */
-               if (WARN_ONCE(env->cpu[cpu].socket_id >> 8, "The socket id number is too big.\n"))
-                       return -1;
-
-               if (WARN_ONCE(env->cpu[cpu].die_id >> 8, "The die id number is too big.\n"))
-                       return -1;
-
-               die_id = (env->cpu[cpu].socket_id << 8) | (env->cpu[cpu].die_id & 0xff);
+               id.socket = env->cpu[cpu].socket_id;
+               id.die = env->cpu[cpu].die_id;
        }
 
-       return die_id;
+       return id;
 }
 
-static int perf_env__get_core(struct perf_cpu_map *map, int idx, void *data)
+static struct aggr_cpu_id perf_env__get_core(struct perf_cpu_map *map, int idx, void *data)
 {
        struct perf_env *env = data;
-       int core = -1, cpu = perf_env__get_cpu(env, map, idx);
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
+       int cpu = perf_env__get_cpu(env, map, idx);
 
        if (cpu != -1) {
                /*
-                * Encode socket in bit range 31:24
-                * encode die id in bit range 23:16
                 * core_id is relative to socket and die,
-                * we need a global id. So we combine
-                * socket + die id + core id
+                * we need a global id. So we set
+                * socket, die id and core id
                 */
-               if (WARN_ONCE(env->cpu[cpu].socket_id >> 8, "The socket id number is too big.\n"))
-                       return -1;
-
-               if (WARN_ONCE(env->cpu[cpu].die_id >> 8, "The die id number is too big.\n"))
-                       return -1;
-
-               if (WARN_ONCE(env->cpu[cpu].core_id >> 16, "The core id number is too big.\n"))
-                       return -1;
-
-               core = (env->cpu[cpu].socket_id << 24) |
-                      (env->cpu[cpu].die_id << 16) |
-                      (env->cpu[cpu].core_id & 0xffff);
+               id.socket = env->cpu[cpu].socket_id;
+               id.die = env->cpu[cpu].die_id;
+               id.core = env->cpu[cpu].core_id;
        }
 
-       return core;
+       return id;
 }
 
-static int perf_env__get_node(struct perf_cpu_map *map, int idx, void *data)
+static struct aggr_cpu_id perf_env__get_node(struct perf_cpu_map *map, int idx, void *data)
 {
        int cpu = perf_env__get_cpu(data, map, idx);
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
 
-       return perf_env__numa_node(data, cpu);
+       id.node = perf_env__numa_node(data, cpu);
+       return id;
 }
 
 static int perf_env__build_socket_map(struct perf_env *env, struct perf_cpu_map *cpus,
-                                     struct perf_cpu_map **sockp)
+                                     struct cpu_aggr_map **sockp)
 {
        return cpu_map__build_map(cpus, sockp, perf_env__get_socket, env);
 }
 
 static int perf_env__build_die_map(struct perf_env *env, struct perf_cpu_map *cpus,
-                                  struct perf_cpu_map **diep)
+                                  struct cpu_aggr_map **diep)
 {
        return cpu_map__build_map(cpus, diep, perf_env__get_die, env);
 }
 
 static int perf_env__build_core_map(struct perf_env *env, struct perf_cpu_map *cpus,
-                                   struct perf_cpu_map **corep)
+                                   struct cpu_aggr_map **corep)
 {
        return cpu_map__build_map(cpus, corep, perf_env__get_core, env);
 }
 
 static int perf_env__build_node_map(struct perf_env *env, struct perf_cpu_map *cpus,
-                                   struct perf_cpu_map **nodep)
+                                   struct cpu_aggr_map **nodep)
 {
        return cpu_map__build_map(cpus, nodep, perf_env__get_node, env);
 }
 
-static int perf_stat__get_socket_file(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_config *config __maybe_unused,
                                      struct perf_cpu_map *map, int idx)
 {
        return perf_env__get_socket(map, idx, &perf_stat.session->header.env);
 }
-static int perf_stat__get_die_file(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_die_file(struct perf_stat_config *config __maybe_unused,
                                   struct perf_cpu_map *map, int idx)
 {
        return perf_env__get_die(map, idx, &perf_stat.session->header.env);
 }
 
-static int perf_stat__get_core_file(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_core_file(struct perf_stat_config *config __maybe_unused,
                                    struct perf_cpu_map *map, int idx)
 {
        return perf_env__get_core(map, idx, &perf_stat.session->header.env);
 }
 
-static int perf_stat__get_node_file(struct perf_stat_config *config __maybe_unused,
+static struct aggr_cpu_id perf_stat__get_node_file(struct perf_stat_config *config __maybe_unused,
                                    struct perf_cpu_map *map, int idx)
 {
        return perf_env__get_node(map, idx, &perf_stat.session->header.env);
index 15ecb18..dded93a 100755 (executable)
@@ -144,6 +144,8 @@ check arch/x86/lib/insn.c             '-I "^#include [\"<]\(../include/\)*asm/in
 
 # diff non-symmetric files
 check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl
+check_2 tools/perf/arch/powerpc/entry/syscalls/syscall.tbl arch/powerpc/kernel/syscalls/syscall.tbl
+check_2 tools/perf/arch/s390/entry/syscalls/syscall.tbl arch/s390/kernel/syscalls/syscall.tbl
 
 for i in $BEAUTY_FILES; do
   beauty_check $i -B
index 165feed..74748ed 100644 (file)
@@ -65,9 +65,11 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
                .mode = PERF_DATA_MODE_READ,
        };
        int i;
+       struct aggr_cpu_id id;
 
        session = perf_session__new(&data, false, NULL);
        TEST_ASSERT_VAL("can't get session", !IS_ERR(session));
+       cpu__setup_cpunode_map();
 
        /* On platforms with large numbers of CPUs process_cpu_topology()
         * might issue an error while reading the perf.data file section
@@ -85,11 +87,18 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
         *  "socket_id number is too big. You may need to upgrade the
         *  perf tool."
         *
-        *  This is the reason why this test might be skipped.
+        *  This is the reason why this test might be skipped. aarch64 and
+        *  s390 always write this part of the header, even when the above
+        *  condition is true (see do_core_id_test in header.c). So always
+        *  run this test on those platforms.
         */
-       if (!session->header.env.cpu)
+       if (!session->header.env.cpu
+                       && strncmp(session->header.env.arch, "s390", 4)
+                       && strncmp(session->header.env.arch, "aarch64", 7))
                return TEST_SKIP;
 
+       TEST_ASSERT_VAL("Session header CPU map not set", session->header.env.cpu);
+
        for (i = 0; i < session->header.env.nr_cpus_avail; i++) {
                if (!cpu_map__has(map, i))
                        continue;
@@ -98,14 +107,57 @@ static int check_cpu_topology(char *path, struct perf_cpu_map *map)
                         session->header.env.cpu[i].socket_id);
        }
 
+       // Test that core ID contains socket, die and core
+       for (i = 0; i < map->nr; i++) {
+               id = cpu_map__get_core(map, i, NULL);
+               TEST_ASSERT_VAL("Core map - Core ID doesn't match",
+                       session->header.env.cpu[map->map[i]].core_id == id.core);
+
+               TEST_ASSERT_VAL("Core map - Socket ID doesn't match",
+                       session->header.env.cpu[map->map[i]].socket_id == id.socket);
+
+               TEST_ASSERT_VAL("Core map - Die ID doesn't match",
+                       session->header.env.cpu[map->map[i]].die_id == id.die);
+               TEST_ASSERT_VAL("Core map - Node ID is set", id.node == -1);
+               TEST_ASSERT_VAL("Core map - Thread is set", id.thread == -1);
+       }
+
+       // Test that die ID contains socket and die
        for (i = 0; i < map->nr; i++) {
-               TEST_ASSERT_VAL("Core ID doesn't match",
-                       (session->header.env.cpu[map->map[i]].core_id == (cpu_map__get_core(map, i, NULL) & 0xffff)));
+               id = cpu_map__get_die(map, i, NULL);
+               TEST_ASSERT_VAL("Die map - Socket ID doesn't match",
+                       session->header.env.cpu[map->map[i]].socket_id == id.socket);
 
-               TEST_ASSERT_VAL("Socket ID doesn't match",
-                       (session->header.env.cpu[map->map[i]].socket_id == cpu_map__get_socket(map, i, NULL)));
+               TEST_ASSERT_VAL("Die map - Die ID doesn't match",
+                       session->header.env.cpu[map->map[i]].die_id == id.die);
+
+               TEST_ASSERT_VAL("Die map - Node ID is set", id.node == -1);
+               TEST_ASSERT_VAL("Die map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Die map - Thread is set", id.thread == -1);
+       }
+
+       // Test that socket ID contains only socket
+       for (i = 0; i < map->nr; i++) {
+               id = cpu_map__get_socket(map, i, NULL);
+               TEST_ASSERT_VAL("Socket map - Socket ID doesn't match",
+                       session->header.env.cpu[map->map[i]].socket_id == id.socket);
+
+               TEST_ASSERT_VAL("Socket map - Node ID is set", id.node == -1);
+               TEST_ASSERT_VAL("Socket map - Die ID is set", id.die == -1);
+               TEST_ASSERT_VAL("Socket map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Socket map - Thread is set", id.thread == -1);
        }
 
+       // Test that node ID contains only node
+       for (i = 0; i < map->nr; i++) {
+               id = cpu_map__get_node(map, i, NULL);
+               TEST_ASSERT_VAL("Node map - Node ID doesn't match",
+                       cpu__get_node(map->map[i]) == id.node);
+               TEST_ASSERT_VAL("Node map - Socket is set", id.socket == -1);
+               TEST_ASSERT_VAL("Node map - Die ID is set", id.die == -1);
+               TEST_ASSERT_VAL("Node map - Core is set", id.core == -1);
+               TEST_ASSERT_VAL("Node map - Thread is set", id.thread == -1);
+       }
        perf_session__delete(session);
 
        return 0;
index 831c02c..27ee1ea 100755 (executable)
@@ -15,7 +15,7 @@ x86_msr_index=${arch_x86_header_dir}/msr-index.h
 
 printf "static const char *x86_MSRs[] = {\n"
 regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+MSR_([[:alnum:]][[:alnum:]_]+)[[:space:]]+(0x00000[[:xdigit:]]+)[[:space:]]*.*'
-egrep $regex ${x86_msr_index} | egrep -v 'MSR_(ATOM|P[46]|AMD64|IA32_TSCDEADLINE|IDT_FCR4)' | \
+egrep $regex ${x86_msr_index} | egrep -v 'MSR_(ATOM|P[46]|IA32_(TSCDEADLINE|UCODE_REV)|IDT_FCR4)' | \
        sed -r "s/$regex/\2 \1/g" | sort -n | \
        xargs printf "\t[%s] = \"%s\",\n"
 printf "};\n\n"
index dc5c5e6..87d3eca 100644 (file)
@@ -95,6 +95,23 @@ struct perf_cpu_map *perf_cpu_map__empty_new(int nr)
        return cpus;
 }
 
+struct cpu_aggr_map *cpu_aggr_map__empty_new(int nr)
+{
+       struct cpu_aggr_map *cpus = malloc(sizeof(*cpus) + sizeof(struct aggr_cpu_id) * nr);
+
+       if (cpus != NULL) {
+               int i;
+
+               cpus->nr = nr;
+               for (i = 0; i < nr; i++)
+                       cpus->map[i] = cpu_map__empty_aggr_cpu_id();
+
+               refcount_set(&cpus->refcnt, 1);
+       }
+
+       return cpus;
+}
+
 static int cpu__get_topology_int(int cpu, const char *name, int *value)
 {
        char path[PATH_MAX];
@@ -111,40 +128,57 @@ int cpu_map__get_socket_id(int cpu)
        return ret ?: value;
 }
 
-int cpu_map__get_socket(struct perf_cpu_map *map, int idx, void *data __maybe_unused)
+struct aggr_cpu_id cpu_map__get_socket(struct perf_cpu_map *map, int idx,
+                                       void *data __maybe_unused)
 {
        int cpu;
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
 
        if (idx > map->nr)
-               return -1;
+               return id;
 
        cpu = map->map[idx];
 
-       return cpu_map__get_socket_id(cpu);
+       id.socket = cpu_map__get_socket_id(cpu);
+       return id;
 }
 
-static int cmp_ids(const void *a, const void *b)
+static int cmp_aggr_cpu_id(const void *a_pointer, const void *b_pointer)
 {
-       return *(int *)a - *(int *)b;
+       struct aggr_cpu_id *a = (struct aggr_cpu_id *)a_pointer;
+       struct aggr_cpu_id *b = (struct aggr_cpu_id *)b_pointer;
+
+       if (a->node != b->node)
+               return a->node - b->node;
+       else if (a->socket != b->socket)
+               return a->socket - b->socket;
+       else if (a->die != b->die)
+               return a->die - b->die;
+       else if (a->core != b->core)
+               return a->core - b->core;
+       else
+               return a->thread - b->thread;
 }
 
-int cpu_map__build_map(struct perf_cpu_map *cpus, struct perf_cpu_map **res,
-                      int (*f)(struct perf_cpu_map *map, int cpu, void *data),
+int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res,
+                      struct aggr_cpu_id (*f)(struct perf_cpu_map *map, int cpu, void *data),
                       void *data)
 {
-       struct perf_cpu_map *c;
        int nr = cpus->nr;
-       int cpu, s1, s2;
+       struct cpu_aggr_map *c = cpu_aggr_map__empty_new(nr);
+       int cpu, s2;
+       struct aggr_cpu_id s1;
 
-       /* allocate as much as possible */
-       c = calloc(1, sizeof(*c) + nr * sizeof(int));
        if (!c)
                return -1;
 
+       /* Reset size as it may only be partially filled */
+       c->nr = 0;
+
        for (cpu = 0; cpu < nr; cpu++) {
                s1 = f(cpus, cpu, data);
                for (s2 = 0; s2 < c->nr; s2++) {
-                       if (s1 == c->map[s2])
+                       if (cpu_map__compare_aggr_cpu_id(s1, c->map[s2]))
                                break;
                }
                if (s2 == c->nr) {
@@ -153,9 +187,8 @@ int cpu_map__build_map(struct perf_cpu_map *cpus, struct perf_cpu_map **res,
                }
        }
        /* ensure we process id in increasing order */
-       qsort(c->map, c->nr, sizeof(int), cmp_ids);
+       qsort(c->map, c->nr, sizeof(struct aggr_cpu_id), cmp_aggr_cpu_id);
 
-       refcount_set(&c->refcnt, 1);
        *res = c;
        return 0;
 }
@@ -167,37 +200,32 @@ int cpu_map__get_die_id(int cpu)
        return ret ?: value;
 }
 
-int cpu_map__get_die(struct perf_cpu_map *map, int idx, void *data)
+struct aggr_cpu_id cpu_map__get_die(struct perf_cpu_map *map, int idx, void *data)
 {
-       int cpu, die_id, s;
+       int cpu, die;
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
 
        if (idx > map->nr)
-               return -1;
+               return id;
 
        cpu = map->map[idx];
 
-       die_id = cpu_map__get_die_id(cpu);
+       die = cpu_map__get_die_id(cpu);
        /* There is no die_id on legacy system. */
-       if (die_id == -1)
-               die_id = 0;
-
-       s = cpu_map__get_socket(map, idx, data);
-       if (s == -1)
-               return -1;
+       if (die == -1)
+               die = 0;
 
        /*
-        * Encode socket in bit range 15:8
-        * die_id is relative to socket, and
-        * we need a global id. So we combine
-        * socket + die id
+        * die_id is relative to socket, so start
+        * with the socket ID and then add die to
+        * make a unique ID.
         */
-       if (WARN_ONCE(die_id >> 8, "The die id number is too big.\n"))
-               return -1;
-
-       if (WARN_ONCE(s >> 8, "The socket id number is too big.\n"))
-               return -1;
+       id = cpu_map__get_socket(map, idx, data);
+       if (cpu_map__aggr_cpu_id_is_empty(id))
+               return id;
 
-       return (s << 8) | (die_id & 0xff);
+       id.die = die;
+       return id;
 }
 
 int cpu_map__get_core_id(int cpu)
@@ -211,59 +239,58 @@ int cpu_map__get_node_id(int cpu)
        return cpu__get_node(cpu);
 }
 
-int cpu_map__get_core(struct perf_cpu_map *map, int idx, void *data)
+struct aggr_cpu_id cpu_map__get_core(struct perf_cpu_map *map, int idx, void *data)
 {
-       int cpu, s_die;
+       int cpu;
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
 
        if (idx > map->nr)
-               return -1;
+               return id;
 
        cpu = map->map[idx];
 
        cpu = cpu_map__get_core_id(cpu);
 
-       /* s_die is the combination of socket + die id */
-       s_die = cpu_map__get_die(map, idx, data);
-       if (s_die == -1)
-               return -1;
+       /* cpu_map__get_die returns a struct with socket and die set*/
+       id = cpu_map__get_die(map, idx, data);
+       if (cpu_map__aggr_cpu_id_is_empty(id))
+               return id;
 
        /*
-        * encode socket in bit range 31:24
-        * encode die id in bit range 23:16
-        * core_id is relative to socket and die,
-        * we need a global id. So we combine
-        * socket + die id + core id
+        * core_id is relative to socket and die, we need a global id.
+        * So we combine the result from cpu_map__get_die with the core id
         */
-       if (WARN_ONCE(cpu >> 16, "The core id number is too big.\n"))
-               return -1;
-
-       return (s_die << 16) | (cpu & 0xffff);
+       id.core = cpu;
+       return id;
 }
 
-int cpu_map__get_node(struct perf_cpu_map *map, int idx, void *data __maybe_unused)
+struct aggr_cpu_id cpu_map__get_node(struct perf_cpu_map *map, int idx, void *data __maybe_unused)
 {
+       struct aggr_cpu_id id = cpu_map__empty_aggr_cpu_id();
+
        if (idx < 0 || idx >= map->nr)
-               return -1;
+               return id;
 
-       return cpu_map__get_node_id(map->map[idx]);
+       id.node = cpu_map__get_node_id(map->map[idx]);
+       return id;
 }
 
-int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct perf_cpu_map **sockp)
+int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **sockp)
 {
        return cpu_map__build_map(cpus, sockp, cpu_map__get_socket, NULL);
 }
 
-int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct perf_cpu_map **diep)
+int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **diep)
 {
        return cpu_map__build_map(cpus, diep, cpu_map__get_die, NULL);
 }
 
-int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct perf_cpu_map **corep)
+int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **corep)
 {
        return cpu_map__build_map(cpus, corep, cpu_map__get_core, NULL);
 }
 
-int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct perf_cpu_map **numap)
+int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **numap)
 {
        return cpu_map__build_map(cpus, numap, cpu_map__get_node, NULL);
 }
@@ -586,3 +613,33 @@ const struct perf_cpu_map *cpu_map__online(void) /* thread unsafe */
 
        return online;
 }
+
+bool cpu_map__compare_aggr_cpu_id(struct aggr_cpu_id a, struct aggr_cpu_id b)
+{
+       return a.thread == b.thread &&
+               a.node == b.node &&
+               a.socket == b.socket &&
+               a.die == b.die &&
+               a.core == b.core;
+}
+
+bool cpu_map__aggr_cpu_id_is_empty(struct aggr_cpu_id a)
+{
+       return a.thread == -1 &&
+               a.node == -1 &&
+               a.socket == -1 &&
+               a.die == -1 &&
+               a.core == -1;
+}
+
+struct aggr_cpu_id cpu_map__empty_aggr_cpu_id(void)
+{
+       struct aggr_cpu_id ret = {
+               .thread = -1,
+               .node = -1,
+               .socket = -1,
+               .die = -1,
+               .core = -1
+       };
+       return ret;
+}
index 3a442f0..a27eeaf 100644 (file)
@@ -7,25 +7,41 @@
 #include <internal/cpumap.h>
 #include <perf/cpumap.h>
 
+struct aggr_cpu_id {
+       int thread;
+       int node;
+       int socket;
+       int die;
+       int core;
+};
+
+struct cpu_aggr_map {
+       refcount_t refcnt;
+       int nr;
+       struct aggr_cpu_id map[];
+};
+
 struct perf_record_cpu_map_data;
 
 struct perf_cpu_map *perf_cpu_map__empty_new(int nr);
+struct cpu_aggr_map *cpu_aggr_map__empty_new(int nr);
+
 struct perf_cpu_map *cpu_map__new_data(struct perf_record_cpu_map_data *data);
 size_t cpu_map__snprint(struct perf_cpu_map *map, char *buf, size_t size);
 size_t cpu_map__snprint_mask(struct perf_cpu_map *map, char *buf, size_t size);
 size_t cpu_map__fprintf(struct perf_cpu_map *map, FILE *fp);
 int cpu_map__get_socket_id(int cpu);
-int cpu_map__get_socket(struct perf_cpu_map *map, int idx, void *data);
+struct aggr_cpu_id cpu_map__get_socket(struct perf_cpu_map *map, int idx, void *data);
 int cpu_map__get_die_id(int cpu);
-int cpu_map__get_die(struct perf_cpu_map *map, int idx, void *data);
+struct aggr_cpu_id cpu_map__get_die(struct perf_cpu_map *map, int idx, void *data);
 int cpu_map__get_core_id(int cpu);
-int cpu_map__get_core(struct perf_cpu_map *map, int idx, void *data);
+struct aggr_cpu_id cpu_map__get_core(struct perf_cpu_map *map, int idx, void *data);
 int cpu_map__get_node_id(int cpu);
-int cpu_map__get_node(struct perf_cpu_map *map, int idx, void *data);
-int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct perf_cpu_map **sockp);
-int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct perf_cpu_map **diep);
-int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct perf_cpu_map **corep);
-int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct perf_cpu_map **nodep);
+struct aggr_cpu_id  cpu_map__get_node(struct perf_cpu_map *map, int idx, void *data);
+int cpu_map__build_socket_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **sockp);
+int cpu_map__build_die_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **diep);
+int cpu_map__build_core_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **corep);
+int cpu_map__build_node_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **nodep);
 const struct perf_cpu_map *cpu_map__online(void); /* thread unsafe */
 
 static inline int cpu_map__socket(struct perf_cpu_map *sock, int s)
@@ -35,21 +51,6 @@ static inline int cpu_map__socket(struct perf_cpu_map *sock, int s)
        return sock->map[s];
 }
 
-static inline int cpu_map__id_to_socket(int id)
-{
-       return id >> 24;
-}
-
-static inline int cpu_map__id_to_die(int id)
-{
-       return (id >> 16) & 0xff;
-}
-
-static inline int cpu_map__id_to_cpu(int id)
-{
-       return id & 0xffff;
-}
-
 int cpu__setup_cpunode_map(void);
 
 int cpu__max_node(void);
@@ -57,11 +58,15 @@ int cpu__max_cpu(void);
 int cpu__max_present_cpu(void);
 int cpu__get_node(int cpu);
 
-int cpu_map__build_map(struct perf_cpu_map *cpus, struct perf_cpu_map **res,
-                      int (*f)(struct perf_cpu_map *map, int cpu, void *data),
+int cpu_map__build_map(struct perf_cpu_map *cpus, struct cpu_aggr_map **res,
+                      struct aggr_cpu_id (*f)(struct perf_cpu_map *map, int cpu, void *data),
                       void *data);
 
 int cpu_map__cpu(struct perf_cpu_map *cpus, int idx);
 bool cpu_map__has(struct perf_cpu_map *cpus, int cpu);
 
+bool cpu_map__compare_aggr_cpu_id(struct aggr_cpu_id a, struct aggr_cpu_id b);
+bool cpu_map__aggr_cpu_id_is_empty(struct aggr_cpu_id a);
+struct aggr_cpu_id cpu_map__empty_aggr_cpu_id(void);
+
 #endif /* __PERF_CPUMAP_H */
index 064b63a..bbecb44 100644 (file)
@@ -791,7 +791,7 @@ static char *synthesize_sdt_probe_command(struct sdt_note *note,
                                        const char *sdtgrp)
 {
        struct strbuf buf;
-       char *ret = NULL, **args;
+       char *ret = NULL;
        int i, args_count, err;
        unsigned long long ref_ctr_offset;
 
@@ -813,12 +813,19 @@ static char *synthesize_sdt_probe_command(struct sdt_note *note,
                goto out;
 
        if (note->args) {
-               args = argv_split(note->args, &args_count);
+               char **args = argv_split(note->args, &args_count);
+
+               if (args == NULL)
+                       goto error;
 
                for (i = 0; i < args_count; ++i) {
-                       if (synthesize_sdt_probe_arg(&buf, i, args[i]) < 0)
+                       if (synthesize_sdt_probe_arg(&buf, i, args[i]) < 0) {
+                               argv_free(args);
                                goto error;
+                       }
                }
+
+               argv_free(args);
        }
 
 out:
index fee7543..583ae4f 100644 (file)
@@ -68,15 +68,15 @@ static void print_cgroup(struct perf_stat_config *config, struct evsel *evsel)
 
 
 static void aggr_printout(struct perf_stat_config *config,
-                         struct evsel *evsel, int id, int nr)
+                         struct evsel *evsel, struct aggr_cpu_id id, int nr)
 {
        switch (config->aggr_mode) {
        case AGGR_CORE:
                fprintf(config->output, "S%d-D%d-C%*d%s%*d%s",
-                       cpu_map__id_to_socket(id),
-                       cpu_map__id_to_die(id),
+                       id.socket,
+                       id.die,
                        config->csv_output ? 0 : -8,
-                       cpu_map__id_to_cpu(id),
+                       id.core,
                        config->csv_sep,
                        config->csv_output ? 0 : 4,
                        nr,
@@ -84,9 +84,9 @@ static void aggr_printout(struct perf_stat_config *config,
                break;
        case AGGR_DIE:
                fprintf(config->output, "S%d-D%*d%s%*d%s",
-                       cpu_map__id_to_socket(id << 16),
+                       id.socket,
                        config->csv_output ? 0 : -8,
-                       cpu_map__id_to_die(id << 16),
+                       id.die,
                        config->csv_sep,
                        config->csv_output ? 0 : 4,
                        nr,
@@ -95,7 +95,7 @@ static void aggr_printout(struct perf_stat_config *config,
        case AGGR_SOCKET:
                fprintf(config->output, "S%*d%s%*d%s",
                        config->csv_output ? 0 : -5,
-                       id,
+                       id.socket,
                        config->csv_sep,
                        config->csv_output ? 0 : 4,
                        nr,
@@ -104,7 +104,7 @@ static void aggr_printout(struct perf_stat_config *config,
        case AGGR_NODE:
                fprintf(config->output, "N%*d%s%*d%s",
                        config->csv_output ? 0 : -5,
-                       id,
+                       id.node,
                        config->csv_sep,
                        config->csv_output ? 0 : 4,
                        nr,
@@ -113,23 +113,23 @@ static void aggr_printout(struct perf_stat_config *config,
        case AGGR_NONE:
                if (evsel->percore && !config->percore_show_thread) {
                        fprintf(config->output, "S%d-D%d-C%*d%s",
-                               cpu_map__id_to_socket(id),
-                               cpu_map__id_to_die(id),
+                               id.socket,
+                               id.die,
                                config->csv_output ? 0 : -3,
-                               cpu_map__id_to_cpu(id), config->csv_sep);
-               } else if (id > -1) {
+                               id.core, config->csv_sep);
+               } else if (id.core > -1) {
                        fprintf(config->output, "CPU%*d%s",
                                config->csv_output ? 0 : -7,
-                               evsel__cpus(evsel)->map[id],
+                               evsel__cpus(evsel)->map[id.core],
                                config->csv_sep);
                }
                break;
        case AGGR_THREAD:
                fprintf(config->output, "%*s-%*d%s",
                        config->csv_output ? 0 : 16,
-                       perf_thread_map__comm(evsel->core.threads, id),
+                       perf_thread_map__comm(evsel->core.threads, id.thread),
                        config->csv_output ? 0 : -8,
-                       perf_thread_map__pid(evsel->core.threads, id),
+                       perf_thread_map__pid(evsel->core.threads, id.thread),
                        config->csv_sep);
                break;
        case AGGR_GLOBAL:
@@ -144,7 +144,8 @@ struct outstate {
        bool newline;
        const char *prefix;
        int  nfields;
-       int  id, nr;
+       int  nr;
+       struct aggr_cpu_id id;
        struct evsel *evsel;
 };
 
@@ -319,13 +320,13 @@ static void print_metric_header(struct perf_stat_config *config,
 }
 
 static int first_shadow_cpu(struct perf_stat_config *config,
-                           struct evsel *evsel, int id)
+                           struct evsel *evsel, struct aggr_cpu_id id)
 {
        struct evlist *evlist = evsel->evlist;
        int i;
 
        if (config->aggr_mode == AGGR_NONE)
-               return id;
+               return id.core;
 
        if (!config->aggr_get_id)
                return 0;
@@ -333,14 +334,17 @@ static int first_shadow_cpu(struct perf_stat_config *config,
        for (i = 0; i < evsel__nr_cpus(evsel); i++) {
                int cpu2 = evsel__cpus(evsel)->map[i];
 
-               if (config->aggr_get_id(config, evlist->core.cpus, cpu2) == id)
+               if (cpu_map__compare_aggr_cpu_id(
+                                       config->aggr_get_id(config, evlist->core.cpus, cpu2),
+                                       id)) {
                        return cpu2;
+               }
        }
        return 0;
 }
 
 static void abs_printout(struct perf_stat_config *config,
-                        int id, int nr, struct evsel *evsel, double avg)
+                        struct aggr_cpu_id id, int nr, struct evsel *evsel, double avg)
 {
        FILE *output = config->output;
        double sc =  evsel->scale;
@@ -393,7 +397,7 @@ static bool is_mixed_hw_group(struct evsel *counter)
        return false;
 }
 
-static void printout(struct perf_stat_config *config, int id, int nr,
+static void printout(struct perf_stat_config *config, struct aggr_cpu_id id, int nr,
                     struct evsel *counter, double uval,
                     char *prefix, u64 run, u64 ena, double noise,
                     struct runtime_stat *st)
@@ -496,7 +500,8 @@ static void printout(struct perf_stat_config *config, int id, int nr,
 static void aggr_update_shadow(struct perf_stat_config *config,
                               struct evlist *evlist)
 {
-       int cpu, s2, id, s;
+       int cpu, s;
+       struct aggr_cpu_id s2, id;
        u64 val;
        struct evsel *counter;
 
@@ -506,7 +511,7 @@ static void aggr_update_shadow(struct perf_stat_config *config,
                        val = 0;
                        for (cpu = 0; cpu < evsel__nr_cpus(counter); cpu++) {
                                s2 = config->aggr_get_id(config, evlist->core.cpus, cpu);
-                               if (s2 != id)
+                               if (!cpu_map__compare_aggr_cpu_id(s2, id))
                                        continue;
                                val += perf_counts(counter->counts, cpu, 0)->val;
                        }
@@ -584,7 +589,7 @@ static bool collect_data(struct perf_stat_config *config, struct evsel *counter,
 
 struct aggr_data {
        u64 ena, run, val;
-       int id;
+       struct aggr_cpu_id id;
        int nr;
        int cpu;
 };
@@ -593,13 +598,14 @@ static void aggr_cb(struct perf_stat_config *config,
                    struct evsel *counter, void *data, bool first)
 {
        struct aggr_data *ad = data;
-       int cpu, s2;
+       int cpu;
+       struct aggr_cpu_id s2;
 
        for (cpu = 0; cpu < evsel__nr_cpus(counter); cpu++) {
                struct perf_counts_values *counts;
 
                s2 = config->aggr_get_id(config, evsel__cpus(counter), cpu);
-               if (s2 != ad->id)
+               if (!cpu_map__compare_aggr_cpu_id(s2, ad->id))
                        continue;
                if (first)
                        ad->nr++;
@@ -628,7 +634,8 @@ static void print_counter_aggrdata(struct perf_stat_config *config,
        struct aggr_data ad;
        FILE *output = config->output;
        u64 ena, run, val;
-       int id, nr;
+       int nr;
+       struct aggr_cpu_id id;
        double uval;
 
        ad.id = id = config->aggr_map->map[s];
@@ -649,8 +656,12 @@ static void print_counter_aggrdata(struct perf_stat_config *config,
                fprintf(output, "%s", prefix);
 
        uval = val * counter->scale;
-       printout(config, cpu != -1 ? cpu : id, nr, counter, uval, prefix,
-                run, ena, 1.0, &rt_stat);
+       if (cpu != -1) {
+               id = cpu_map__empty_aggr_cpu_id();
+               id.core = cpu;
+       }
+       printout(config, id, nr, counter, uval,
+                prefix, run, ena, 1.0, &rt_stat);
        if (!metric_only)
                fputc('\n', output);
 }
@@ -728,7 +739,8 @@ static struct perf_aggr_thread_value *sort_aggr_thread(
                        continue;
 
                buf[i].counter = counter;
-               buf[i].id = thread;
+               buf[i].id = cpu_map__empty_aggr_cpu_id();
+               buf[i].id.thread = thread;
                buf[i].uval = uval;
                buf[i].val = val;
                buf[i].run = run;
@@ -751,7 +763,8 @@ static void print_aggr_thread(struct perf_stat_config *config,
        FILE *output = config->output;
        int nthreads = perf_thread_map__nr(counter->core.threads);
        int ncpus = perf_cpu_map__nr(counter->core.cpus);
-       int thread, sorted_threads, id;
+       int thread, sorted_threads;
+       struct aggr_cpu_id id;
        struct perf_aggr_thread_value *buf;
 
        buf = sort_aggr_thread(counter, nthreads, ncpus, &sorted_threads, _target);
@@ -768,7 +781,7 @@ static void print_aggr_thread(struct perf_stat_config *config,
                if (config->stats)
                        printout(config, id, 0, buf[thread].counter, buf[thread].uval,
                                 prefix, buf[thread].run, buf[thread].ena, 1.0,
-                                &config->stats[id]);
+                                &config->stats[id.thread]);
                else
                        printout(config, id, 0, buf[thread].counter, buf[thread].uval,
                                 prefix, buf[thread].run, buf[thread].ena, 1.0,
@@ -814,8 +827,8 @@ static void print_counter_aggr(struct perf_stat_config *config,
                fprintf(output, "%s", prefix);
 
        uval = cd.avg * counter->scale;
-       printout(config, -1, 0, counter, uval, prefix, cd.avg_running, cd.avg_enabled,
-                cd.avg, &rt_stat);
+       printout(config, cpu_map__empty_aggr_cpu_id(), 0, counter, uval, prefix, cd.avg_running,
+                cd.avg_enabled, cd.avg, &rt_stat);
        if (!metric_only)
                fprintf(output, "\n");
 }
@@ -842,6 +855,7 @@ static void print_counter(struct perf_stat_config *config,
        u64 ena, run, val;
        double uval;
        int cpu;
+       struct aggr_cpu_id id;
 
        for (cpu = 0; cpu < evsel__nr_cpus(counter); cpu++) {
                struct aggr_data ad = { .cpu = cpu };
@@ -856,8 +870,10 @@ static void print_counter(struct perf_stat_config *config,
                        fprintf(output, "%s", prefix);
 
                uval = val * counter->scale;
-               printout(config, cpu, 0, counter, uval, prefix, run, ena, 1.0,
-                        &rt_stat);
+               id = cpu_map__empty_aggr_cpu_id();
+               id.core = cpu;
+               printout(config, id, 0, counter, uval, prefix,
+                        run, ena, 1.0, &rt_stat);
 
                fputc('\n', output);
        }
@@ -872,6 +888,7 @@ static void print_no_aggr_metric(struct perf_stat_config *config,
        struct evsel *counter;
        u64 ena, run, val;
        double uval;
+       struct aggr_cpu_id id;
 
        nrcpus = evlist->core.cpus->nr;
        for (cpu = 0; cpu < nrcpus; cpu++) {
@@ -880,8 +897,10 @@ static void print_no_aggr_metric(struct perf_stat_config *config,
                if (prefix)
                        fputs(prefix, config->output);
                evlist__for_each_entry(evlist, counter) {
+                       id = cpu_map__empty_aggr_cpu_id();
+                       id.core = cpu;
                        if (first) {
-                               aggr_printout(config, counter, cpu, 0);
+                               aggr_printout(config, counter, id, 0);
                                first = false;
                        }
                        val = perf_counts(counter->counts, cpu, 0)->val;
@@ -889,8 +908,8 @@ static void print_no_aggr_metric(struct perf_stat_config *config,
                        run = perf_counts(counter->counts, cpu, 0)->run;
 
                        uval = val * counter->scale;
-                       printout(config, cpu, 0, counter, uval, prefix, run, ena, 1.0,
-                                &rt_stat);
+                       printout(config, id, 0, counter, uval, prefix,
+                                run, ena, 1.0, &rt_stat);
                }
                fputc('\n', config->output);
        }
@@ -1140,14 +1159,15 @@ static void print_footer(struct perf_stat_config *config)
 static void print_percore_thread(struct perf_stat_config *config,
                                 struct evsel *counter, char *prefix)
 {
-       int s, s2, id;
+       int s;
+       struct aggr_cpu_id s2, id;
        bool first = true;
 
        for (int i = 0; i < evsel__nr_cpus(counter); i++) {
                s2 = config->aggr_get_id(config, evsel__cpus(counter), i);
                for (s = 0; s < config->aggr_map->nr; s++) {
                        id = config->aggr_map->map[s];
-                       if (s2 == id)
+                       if (cpu_map__compare_aggr_cpu_id(s2, id))
                                break;
                }
 
index 1e125e3..8ce1479 100644 (file)
@@ -313,7 +313,7 @@ static int check_per_pkg(struct evsel *counter,
        if (!(vals->run && vals->ena))
                return 0;
 
-       s = cpu_map__get_socket(cpus, cpu, NULL);
+       s = cpu_map__get_socket(cpus, cpu, NULL).socket;
        if (s < 0)
                return -1;
 
index 9979b4b..b536973 100644 (file)
@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/resource.h>
+#include "cpumap.h"
 #include "rblist.h"
 
 struct perf_cpu_map;
@@ -99,7 +100,7 @@ struct runtime_stat {
        struct rblist value_list;
 };
 
-typedef int (*aggr_get_id_t)(struct perf_stat_config *config,
+typedef struct aggr_cpu_id (*aggr_get_id_t)(struct perf_stat_config *config,
                             struct perf_cpu_map *m, int cpu);
 
 struct perf_stat_config {
@@ -138,9 +139,9 @@ struct perf_stat_config {
        const char              *csv_sep;
        struct stats            *walltime_nsecs_stats;
        struct rusage            ru_data;
-       struct perf_cpu_map             *aggr_map;
+       struct cpu_aggr_map     *aggr_map;
        aggr_get_id_t            aggr_get_id;
-       struct perf_cpu_map             *cpus_aggr_map;
+       struct cpu_aggr_map     *cpus_aggr_map;
        u64                     *walltime_run;
        struct rblist            metric_events;
        int                      ctl_fd;
@@ -170,7 +171,7 @@ struct evlist;
 
 struct perf_aggr_thread_value {
        struct evsel *counter;
-       int id;
+       struct aggr_cpu_id id;
        double uval;
        u64 val;
        u64 run;