Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf updates from Thomas Gleixner:
"Perf tool updates and kprobe fixes:

- perf_mmap overwrite mode fixes/overhaul, prep work to get 'perf
top' using it, making it bearable to use it in large core count
systems such as Knights Landing/Mill Intel systems (Kan Liang)

- s/390 now uses syscall.tbl, just like x86-64 to generate the
syscall table id -> string tables used by 'perf trace' (Hendrik
Brueckner)

- Use strtoull() instead of home grown function (Andy Shevchenko)

- Synchronize kernel ABI headers, v4.16-rc1 (Ingo Molnar)

- Document missing 'perf data --force' option (Sangwon Hong)

- Add perf vendor JSON metrics for ARM Cortex-A53 Processor (William
Cohen)

- Improve error handling and error propagation of ftrace based
kprobes so failures when installing kprobes are not silently
ignored and create disfunctional tracepoints"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (27 commits)
kprobes: Propagate error from disarm_kprobe_ftrace()
kprobes: Propagate error from arm_kprobe_ftrace()
Revert "tools include s390: Grab a copy of arch/s390/include/uapi/asm/unistd.h"
perf s390: Rework system call table creation by using syscall.tbl
perf s390: Grab a copy of arch/s390/kernel/syscall/syscall.tbl
tools/headers: Synchronize kernel ABI headers, v4.16-rc1
perf test: Fix test trace+probe_libc_inet_pton.sh for s390x
perf data: Document missing --force option
perf tools: Substitute yet another strtoull()
perf top: Check the latency of perf_top__mmap_read()
perf top: Switch default mode to overwrite mode
perf top: Remove lost events checking
perf hists browser: Add parameter to disable lost event warning
perf top: Add overwrite fall back
perf evsel: Expose the perf_missing_features struct
perf top: Check per-event overwrite term
perf mmap: Discard legacy interface for mmap read
perf test: Update mmap read functions for backward-ring-buffer test
perf mmap: Introduce perf_mmap__read_event()
perf mmap: Introduce perf_mmap__read_done()
...

+1196 -629
+130 -52
kernel/kprobes.c
··· 978 978 } 979 979 980 980 /* Caller must lock kprobe_mutex */ 981 - static void arm_kprobe_ftrace(struct kprobe *p) 981 + static int arm_kprobe_ftrace(struct kprobe *p) 982 982 { 983 - int ret; 983 + int ret = 0; 984 984 985 985 ret = ftrace_set_filter_ip(&kprobe_ftrace_ops, 986 986 (unsigned long)p->addr, 0, 0); 987 - WARN(ret < 0, "Failed to arm kprobe-ftrace at %p (%d)\n", p->addr, ret); 988 - kprobe_ftrace_enabled++; 989 - if (kprobe_ftrace_enabled == 1) { 990 - ret = register_ftrace_function(&kprobe_ftrace_ops); 991 - WARN(ret < 0, "Failed to init kprobe-ftrace (%d)\n", ret); 987 + if (ret) { 988 + pr_debug("Failed to arm kprobe-ftrace at %p (%d)\n", p->addr, ret); 989 + return ret; 992 990 } 991 + 992 + if (kprobe_ftrace_enabled == 0) { 993 + ret = register_ftrace_function(&kprobe_ftrace_ops); 994 + if (ret) { 995 + pr_debug("Failed to init kprobe-ftrace (%d)\n", ret); 996 + goto err_ftrace; 997 + } 998 + } 999 + 1000 + kprobe_ftrace_enabled++; 1001 + return ret; 1002 + 1003 + err_ftrace: 1004 + /* 1005 + * Note: Since kprobe_ftrace_ops has IPMODIFY set, and ftrace requires a 1006 + * non-empty filter_hash for IPMODIFY ops, we're safe from an accidental 1007 + * empty filter_hash which would undesirably trace all functions. 1008 + */ 1009 + ftrace_set_filter_ip(&kprobe_ftrace_ops, (unsigned long)p->addr, 1, 0); 1010 + return ret; 993 1011 } 994 1012 995 1013 /* Caller must lock kprobe_mutex */ 996 - static void disarm_kprobe_ftrace(struct kprobe *p) 1014 + static int disarm_kprobe_ftrace(struct kprobe *p) 997 1015 { 998 - int ret; 1016 + int ret = 0; 1017 + 1018 + if (kprobe_ftrace_enabled == 1) { 1019 + ret = unregister_ftrace_function(&kprobe_ftrace_ops); 1020 + if (WARN(ret < 0, "Failed to unregister kprobe-ftrace (%d)\n", ret)) 1021 + return ret; 1022 + } 999 1023 1000 1024 kprobe_ftrace_enabled--; 1001 - if (kprobe_ftrace_enabled == 0) { 1002 - ret = unregister_ftrace_function(&kprobe_ftrace_ops); 1003 - WARN(ret < 0, "Failed to init kprobe-ftrace (%d)\n", ret); 1004 - } 1025 + 1005 1026 ret = ftrace_set_filter_ip(&kprobe_ftrace_ops, 1006 1027 (unsigned long)p->addr, 1, 0); 1007 1028 WARN(ret < 0, "Failed to disarm kprobe-ftrace at %p (%d)\n", p->addr, ret); 1029 + return ret; 1008 1030 } 1009 1031 #else /* !CONFIG_KPROBES_ON_FTRACE */ 1010 1032 #define prepare_kprobe(p) arch_prepare_kprobe(p) 1011 - #define arm_kprobe_ftrace(p) do {} while (0) 1012 - #define disarm_kprobe_ftrace(p) do {} while (0) 1033 + #define arm_kprobe_ftrace(p) (-ENODEV) 1034 + #define disarm_kprobe_ftrace(p) (-ENODEV) 1013 1035 #endif 1014 1036 1015 1037 /* Arm a kprobe with text_mutex */ 1016 - static void arm_kprobe(struct kprobe *kp) 1038 + static int arm_kprobe(struct kprobe *kp) 1017 1039 { 1018 - if (unlikely(kprobe_ftrace(kp))) { 1019 - arm_kprobe_ftrace(kp); 1020 - return; 1021 - } 1040 + if (unlikely(kprobe_ftrace(kp))) 1041 + return arm_kprobe_ftrace(kp); 1042 + 1022 1043 cpus_read_lock(); 1023 1044 mutex_lock(&text_mutex); 1024 1045 __arm_kprobe(kp); 1025 1046 mutex_unlock(&text_mutex); 1026 1047 cpus_read_unlock(); 1048 + 1049 + return 0; 1027 1050 } 1028 1051 1029 1052 /* Disarm a kprobe with text_mutex */ 1030 - static void disarm_kprobe(struct kprobe *kp, bool reopt) 1053 + static int disarm_kprobe(struct kprobe *kp, bool reopt) 1031 1054 { 1032 - if (unlikely(kprobe_ftrace(kp))) { 1033 - disarm_kprobe_ftrace(kp); 1034 - return; 1035 - } 1055 + if (unlikely(kprobe_ftrace(kp))) 1056 + return disarm_kprobe_ftrace(kp); 1036 1057 1037 1058 cpus_read_lock(); 1038 1059 mutex_lock(&text_mutex); 1039 1060 __disarm_kprobe(kp, reopt); 1040 1061 mutex_unlock(&text_mutex); 1041 1062 cpus_read_unlock(); 1063 + 1064 + return 0; 1042 1065 } 1043 1066 1044 1067 /* ··· 1385 1362 1386 1363 if (ret == 0 && kprobe_disabled(ap) && !kprobe_disabled(p)) { 1387 1364 ap->flags &= ~KPROBE_FLAG_DISABLED; 1388 - if (!kprobes_all_disarmed) 1365 + if (!kprobes_all_disarmed) { 1389 1366 /* Arm the breakpoint again. */ 1390 - arm_kprobe(ap); 1367 + ret = arm_kprobe(ap); 1368 + if (ret) { 1369 + ap->flags |= KPROBE_FLAG_DISABLED; 1370 + list_del_rcu(&p->list); 1371 + synchronize_sched(); 1372 + } 1373 + } 1391 1374 } 1392 1375 return ret; 1393 1376 } ··· 1602 1573 hlist_add_head_rcu(&p->hlist, 1603 1574 &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); 1604 1575 1605 - if (!kprobes_all_disarmed && !kprobe_disabled(p)) 1606 - arm_kprobe(p); 1576 + if (!kprobes_all_disarmed && !kprobe_disabled(p)) { 1577 + ret = arm_kprobe(p); 1578 + if (ret) { 1579 + hlist_del_rcu(&p->hlist); 1580 + synchronize_sched(); 1581 + goto out; 1582 + } 1583 + } 1607 1584 1608 1585 /* Try to optimize kprobe */ 1609 1586 try_to_optimize_kprobe(p); ··· 1643 1608 static struct kprobe *__disable_kprobe(struct kprobe *p) 1644 1609 { 1645 1610 struct kprobe *orig_p; 1611 + int ret; 1646 1612 1647 1613 /* Get an original kprobe for return */ 1648 1614 orig_p = __get_valid_kprobe(p); 1649 1615 if (unlikely(orig_p == NULL)) 1650 - return NULL; 1616 + return ERR_PTR(-EINVAL); 1651 1617 1652 1618 if (!kprobe_disabled(p)) { 1653 1619 /* Disable probe if it is a child probe */ ··· 1662 1626 * should have already been disarmed, so 1663 1627 * skip unneed disarming process. 1664 1628 */ 1665 - if (!kprobes_all_disarmed) 1666 - disarm_kprobe(orig_p, true); 1629 + if (!kprobes_all_disarmed) { 1630 + ret = disarm_kprobe(orig_p, true); 1631 + if (ret) { 1632 + p->flags &= ~KPROBE_FLAG_DISABLED; 1633 + return ERR_PTR(ret); 1634 + } 1635 + } 1667 1636 orig_p->flags |= KPROBE_FLAG_DISABLED; 1668 1637 } 1669 1638 } ··· 1685 1644 1686 1645 /* Disable kprobe. This will disarm it if needed. */ 1687 1646 ap = __disable_kprobe(p); 1688 - if (ap == NULL) 1689 - return -EINVAL; 1647 + if (IS_ERR(ap)) 1648 + return PTR_ERR(ap); 1690 1649 1691 1650 if (ap == p) 1692 1651 /* ··· 2119 2078 int disable_kprobe(struct kprobe *kp) 2120 2079 { 2121 2080 int ret = 0; 2081 + struct kprobe *p; 2122 2082 2123 2083 mutex_lock(&kprobe_mutex); 2124 2084 2125 2085 /* Disable this kprobe */ 2126 - if (__disable_kprobe(kp) == NULL) 2127 - ret = -EINVAL; 2086 + p = __disable_kprobe(kp); 2087 + if (IS_ERR(p)) 2088 + ret = PTR_ERR(p); 2128 2089 2129 2090 mutex_unlock(&kprobe_mutex); 2130 2091 return ret; ··· 2159 2116 2160 2117 if (!kprobes_all_disarmed && kprobe_disabled(p)) { 2161 2118 p->flags &= ~KPROBE_FLAG_DISABLED; 2162 - arm_kprobe(p); 2119 + ret = arm_kprobe(p); 2120 + if (ret) 2121 + p->flags |= KPROBE_FLAG_DISABLED; 2163 2122 } 2164 2123 out: 2165 2124 mutex_unlock(&kprobe_mutex); ··· 2452 2407 .release = seq_release, 2453 2408 }; 2454 2409 2455 - static void arm_all_kprobes(void) 2410 + static int arm_all_kprobes(void) 2456 2411 { 2457 2412 struct hlist_head *head; 2458 2413 struct kprobe *p; 2459 - unsigned int i; 2414 + unsigned int i, total = 0, errors = 0; 2415 + int err, ret = 0; 2460 2416 2461 2417 mutex_lock(&kprobe_mutex); 2462 2418 ··· 2474 2428 /* Arming kprobes doesn't optimize kprobe itself */ 2475 2429 for (i = 0; i < KPROBE_TABLE_SIZE; i++) { 2476 2430 head = &kprobe_table[i]; 2477 - hlist_for_each_entry_rcu(p, head, hlist) 2478 - if (!kprobe_disabled(p)) 2479 - arm_kprobe(p); 2431 + /* Arm all kprobes on a best-effort basis */ 2432 + hlist_for_each_entry_rcu(p, head, hlist) { 2433 + if (!kprobe_disabled(p)) { 2434 + err = arm_kprobe(p); 2435 + if (err) { 2436 + errors++; 2437 + ret = err; 2438 + } 2439 + total++; 2440 + } 2441 + } 2480 2442 } 2481 2443 2482 - printk(KERN_INFO "Kprobes globally enabled\n"); 2444 + if (errors) 2445 + pr_warn("Kprobes globally enabled, but failed to arm %d out of %d probes\n", 2446 + errors, total); 2447 + else 2448 + pr_info("Kprobes globally enabled\n"); 2483 2449 2484 2450 already_enabled: 2485 2451 mutex_unlock(&kprobe_mutex); 2486 - return; 2452 + return ret; 2487 2453 } 2488 2454 2489 - static void disarm_all_kprobes(void) 2455 + static int disarm_all_kprobes(void) 2490 2456 { 2491 2457 struct hlist_head *head; 2492 2458 struct kprobe *p; 2493 - unsigned int i; 2459 + unsigned int i, total = 0, errors = 0; 2460 + int err, ret = 0; 2494 2461 2495 2462 mutex_lock(&kprobe_mutex); 2496 2463 2497 2464 /* If kprobes are already disarmed, just return */ 2498 2465 if (kprobes_all_disarmed) { 2499 2466 mutex_unlock(&kprobe_mutex); 2500 - return; 2467 + return 0; 2501 2468 } 2502 2469 2503 2470 kprobes_all_disarmed = true; 2504 - printk(KERN_INFO "Kprobes globally disabled\n"); 2505 2471 2506 2472 for (i = 0; i < KPROBE_TABLE_SIZE; i++) { 2507 2473 head = &kprobe_table[i]; 2474 + /* Disarm all kprobes on a best-effort basis */ 2508 2475 hlist_for_each_entry_rcu(p, head, hlist) { 2509 - if (!arch_trampoline_kprobe(p) && !kprobe_disabled(p)) 2510 - disarm_kprobe(p, false); 2476 + if (!arch_trampoline_kprobe(p) && !kprobe_disabled(p)) { 2477 + err = disarm_kprobe(p, false); 2478 + if (err) { 2479 + errors++; 2480 + ret = err; 2481 + } 2482 + total++; 2483 + } 2511 2484 } 2512 2485 } 2486 + 2487 + if (errors) 2488 + pr_warn("Kprobes globally disabled, but failed to disarm %d out of %d probes\n", 2489 + errors, total); 2490 + else 2491 + pr_info("Kprobes globally disabled\n"); 2492 + 2513 2493 mutex_unlock(&kprobe_mutex); 2514 2494 2515 2495 /* Wait for disarming all kprobes by optimizer */ 2516 2496 wait_for_kprobe_optimizer(); 2497 + 2498 + return ret; 2517 2499 } 2518 2500 2519 2501 /* ··· 2568 2494 { 2569 2495 char buf[32]; 2570 2496 size_t buf_size; 2497 + int ret = 0; 2571 2498 2572 2499 buf_size = min(count, (sizeof(buf)-1)); 2573 2500 if (copy_from_user(buf, user_buf, buf_size)) ··· 2579 2504 case 'y': 2580 2505 case 'Y': 2581 2506 case '1': 2582 - arm_all_kprobes(); 2507 + ret = arm_all_kprobes(); 2583 2508 break; 2584 2509 case 'n': 2585 2510 case 'N': 2586 2511 case '0': 2587 - disarm_all_kprobes(); 2512 + ret = disarm_all_kprobes(); 2588 2513 break; 2589 2514 default: 2590 2515 return -EINVAL; 2591 2516 } 2517 + 2518 + if (ret) 2519 + return ret; 2592 2520 2593 2521 return count; 2594 2522 }
+2
tools/arch/powerpc/include/uapi/asm/kvm.h
··· 632 632 #define KVM_REG_PPC_TIDR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbc) 633 633 #define KVM_REG_PPC_PSSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbd) 634 634 635 + #define KVM_REG_PPC_DEC_EXPIRY (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbe) 636 + 635 637 /* Transactional Memory checkpointed state: 636 638 * This is all GPRs, all VSX regs and a subset of SPRs 637 639 */
-412
tools/arch/s390/include/uapi/asm/unistd.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 - /* 3 - * S390 version 4 - * 5 - * Derived from "include/asm-i386/unistd.h" 6 - */ 7 - 8 - #ifndef _UAPI_ASM_S390_UNISTD_H_ 9 - #define _UAPI_ASM_S390_UNISTD_H_ 10 - 11 - /* 12 - * This file contains the system call numbers. 13 - */ 14 - 15 - #define __NR_exit 1 16 - #define __NR_fork 2 17 - #define __NR_read 3 18 - #define __NR_write 4 19 - #define __NR_open 5 20 - #define __NR_close 6 21 - #define __NR_restart_syscall 7 22 - #define __NR_creat 8 23 - #define __NR_link 9 24 - #define __NR_unlink 10 25 - #define __NR_execve 11 26 - #define __NR_chdir 12 27 - #define __NR_mknod 14 28 - #define __NR_chmod 15 29 - #define __NR_lseek 19 30 - #define __NR_getpid 20 31 - #define __NR_mount 21 32 - #define __NR_umount 22 33 - #define __NR_ptrace 26 34 - #define __NR_alarm 27 35 - #define __NR_pause 29 36 - #define __NR_utime 30 37 - #define __NR_access 33 38 - #define __NR_nice 34 39 - #define __NR_sync 36 40 - #define __NR_kill 37 41 - #define __NR_rename 38 42 - #define __NR_mkdir 39 43 - #define __NR_rmdir 40 44 - #define __NR_dup 41 45 - #define __NR_pipe 42 46 - #define __NR_times 43 47 - #define __NR_brk 45 48 - #define __NR_signal 48 49 - #define __NR_acct 51 50 - #define __NR_umount2 52 51 - #define __NR_ioctl 54 52 - #define __NR_fcntl 55 53 - #define __NR_setpgid 57 54 - #define __NR_umask 60 55 - #define __NR_chroot 61 56 - #define __NR_ustat 62 57 - #define __NR_dup2 63 58 - #define __NR_getppid 64 59 - #define __NR_getpgrp 65 60 - #define __NR_setsid 66 61 - #define __NR_sigaction 67 62 - #define __NR_sigsuspend 72 63 - #define __NR_sigpending 73 64 - #define __NR_sethostname 74 65 - #define __NR_setrlimit 75 66 - #define __NR_getrusage 77 67 - #define __NR_gettimeofday 78 68 - #define __NR_settimeofday 79 69 - #define __NR_symlink 83 70 - #define __NR_readlink 85 71 - #define __NR_uselib 86 72 - #define __NR_swapon 87 73 - #define __NR_reboot 88 74 - #define __NR_readdir 89 75 - #define __NR_mmap 90 76 - #define __NR_munmap 91 77 - #define __NR_truncate 92 78 - #define __NR_ftruncate 93 79 - #define __NR_fchmod 94 80 - #define __NR_getpriority 96 81 - #define __NR_setpriority 97 82 - #define __NR_statfs 99 83 - #define __NR_fstatfs 100 84 - #define __NR_socketcall 102 85 - #define __NR_syslog 103 86 - #define __NR_setitimer 104 87 - #define __NR_getitimer 105 88 - #define __NR_stat 106 89 - #define __NR_lstat 107 90 - #define __NR_fstat 108 91 - #define __NR_lookup_dcookie 110 92 - #define __NR_vhangup 111 93 - #define __NR_idle 112 94 - #define __NR_wait4 114 95 - #define __NR_swapoff 115 96 - #define __NR_sysinfo 116 97 - #define __NR_ipc 117 98 - #define __NR_fsync 118 99 - #define __NR_sigreturn 119 100 - #define __NR_clone 120 101 - #define __NR_setdomainname 121 102 - #define __NR_uname 122 103 - #define __NR_adjtimex 124 104 - #define __NR_mprotect 125 105 - #define __NR_sigprocmask 126 106 - #define __NR_create_module 127 107 - #define __NR_init_module 128 108 - #define __NR_delete_module 129 109 - #define __NR_get_kernel_syms 130 110 - #define __NR_quotactl 131 111 - #define __NR_getpgid 132 112 - #define __NR_fchdir 133 113 - #define __NR_bdflush 134 114 - #define __NR_sysfs 135 115 - #define __NR_personality 136 116 - #define __NR_afs_syscall 137 /* Syscall for Andrew File System */ 117 - #define __NR_getdents 141 118 - #define __NR_flock 143 119 - #define __NR_msync 144 120 - #define __NR_readv 145 121 - #define __NR_writev 146 122 - #define __NR_getsid 147 123 - #define __NR_fdatasync 148 124 - #define __NR__sysctl 149 125 - #define __NR_mlock 150 126 - #define __NR_munlock 151 127 - #define __NR_mlockall 152 128 - #define __NR_munlockall 153 129 - #define __NR_sched_setparam 154 130 - #define __NR_sched_getparam 155 131 - #define __NR_sched_setscheduler 156 132 - #define __NR_sched_getscheduler 157 133 - #define __NR_sched_yield 158 134 - #define __NR_sched_get_priority_max 159 135 - #define __NR_sched_get_priority_min 160 136 - #define __NR_sched_rr_get_interval 161 137 - #define __NR_nanosleep 162 138 - #define __NR_mremap 163 139 - #define __NR_query_module 167 140 - #define __NR_poll 168 141 - #define __NR_nfsservctl 169 142 - #define __NR_prctl 172 143 - #define __NR_rt_sigreturn 173 144 - #define __NR_rt_sigaction 174 145 - #define __NR_rt_sigprocmask 175 146 - #define __NR_rt_sigpending 176 147 - #define __NR_rt_sigtimedwait 177 148 - #define __NR_rt_sigqueueinfo 178 149 - #define __NR_rt_sigsuspend 179 150 - #define __NR_pread64 180 151 - #define __NR_pwrite64 181 152 - #define __NR_getcwd 183 153 - #define __NR_capget 184 154 - #define __NR_capset 185 155 - #define __NR_sigaltstack 186 156 - #define __NR_sendfile 187 157 - #define __NR_getpmsg 188 158 - #define __NR_putpmsg 189 159 - #define __NR_vfork 190 160 - #define __NR_pivot_root 217 161 - #define __NR_mincore 218 162 - #define __NR_madvise 219 163 - #define __NR_getdents64 220 164 - #define __NR_readahead 222 165 - #define __NR_setxattr 224 166 - #define __NR_lsetxattr 225 167 - #define __NR_fsetxattr 226 168 - #define __NR_getxattr 227 169 - #define __NR_lgetxattr 228 170 - #define __NR_fgetxattr 229 171 - #define __NR_listxattr 230 172 - #define __NR_llistxattr 231 173 - #define __NR_flistxattr 232 174 - #define __NR_removexattr 233 175 - #define __NR_lremovexattr 234 176 - #define __NR_fremovexattr 235 177 - #define __NR_gettid 236 178 - #define __NR_tkill 237 179 - #define __NR_futex 238 180 - #define __NR_sched_setaffinity 239 181 - #define __NR_sched_getaffinity 240 182 - #define __NR_tgkill 241 183 - /* Number 242 is reserved for tux */ 184 - #define __NR_io_setup 243 185 - #define __NR_io_destroy 244 186 - #define __NR_io_getevents 245 187 - #define __NR_io_submit 246 188 - #define __NR_io_cancel 247 189 - #define __NR_exit_group 248 190 - #define __NR_epoll_create 249 191 - #define __NR_epoll_ctl 250 192 - #define __NR_epoll_wait 251 193 - #define __NR_set_tid_address 252 194 - #define __NR_fadvise64 253 195 - #define __NR_timer_create 254 196 - #define __NR_timer_settime 255 197 - #define __NR_timer_gettime 256 198 - #define __NR_timer_getoverrun 257 199 - #define __NR_timer_delete 258 200 - #define __NR_clock_settime 259 201 - #define __NR_clock_gettime 260 202 - #define __NR_clock_getres 261 203 - #define __NR_clock_nanosleep 262 204 - /* Number 263 is reserved for vserver */ 205 - #define __NR_statfs64 265 206 - #define __NR_fstatfs64 266 207 - #define __NR_remap_file_pages 267 208 - #define __NR_mbind 268 209 - #define __NR_get_mempolicy 269 210 - #define __NR_set_mempolicy 270 211 - #define __NR_mq_open 271 212 - #define __NR_mq_unlink 272 213 - #define __NR_mq_timedsend 273 214 - #define __NR_mq_timedreceive 274 215 - #define __NR_mq_notify 275 216 - #define __NR_mq_getsetattr 276 217 - #define __NR_kexec_load 277 218 - #define __NR_add_key 278 219 - #define __NR_request_key 279 220 - #define __NR_keyctl 280 221 - #define __NR_waitid 281 222 - #define __NR_ioprio_set 282 223 - #define __NR_ioprio_get 283 224 - #define __NR_inotify_init 284 225 - #define __NR_inotify_add_watch 285 226 - #define __NR_inotify_rm_watch 286 227 - #define __NR_migrate_pages 287 228 - #define __NR_openat 288 229 - #define __NR_mkdirat 289 230 - #define __NR_mknodat 290 231 - #define __NR_fchownat 291 232 - #define __NR_futimesat 292 233 - #define __NR_unlinkat 294 234 - #define __NR_renameat 295 235 - #define __NR_linkat 296 236 - #define __NR_symlinkat 297 237 - #define __NR_readlinkat 298 238 - #define __NR_fchmodat 299 239 - #define __NR_faccessat 300 240 - #define __NR_pselect6 301 241 - #define __NR_ppoll 302 242 - #define __NR_unshare 303 243 - #define __NR_set_robust_list 304 244 - #define __NR_get_robust_list 305 245 - #define __NR_splice 306 246 - #define __NR_sync_file_range 307 247 - #define __NR_tee 308 248 - #define __NR_vmsplice 309 249 - #define __NR_move_pages 310 250 - #define __NR_getcpu 311 251 - #define __NR_epoll_pwait 312 252 - #define __NR_utimes 313 253 - #define __NR_fallocate 314 254 - #define __NR_utimensat 315 255 - #define __NR_signalfd 316 256 - #define __NR_timerfd 317 257 - #define __NR_eventfd 318 258 - #define __NR_timerfd_create 319 259 - #define __NR_timerfd_settime 320 260 - #define __NR_timerfd_gettime 321 261 - #define __NR_signalfd4 322 262 - #define __NR_eventfd2 323 263 - #define __NR_inotify_init1 324 264 - #define __NR_pipe2 325 265 - #define __NR_dup3 326 266 - #define __NR_epoll_create1 327 267 - #define __NR_preadv 328 268 - #define __NR_pwritev 329 269 - #define __NR_rt_tgsigqueueinfo 330 270 - #define __NR_perf_event_open 331 271 - #define __NR_fanotify_init 332 272 - #define __NR_fanotify_mark 333 273 - #define __NR_prlimit64 334 274 - #define __NR_name_to_handle_at 335 275 - #define __NR_open_by_handle_at 336 276 - #define __NR_clock_adjtime 337 277 - #define __NR_syncfs 338 278 - #define __NR_setns 339 279 - #define __NR_process_vm_readv 340 280 - #define __NR_process_vm_writev 341 281 - #define __NR_s390_runtime_instr 342 282 - #define __NR_kcmp 343 283 - #define __NR_finit_module 344 284 - #define __NR_sched_setattr 345 285 - #define __NR_sched_getattr 346 286 - #define __NR_renameat2 347 287 - #define __NR_seccomp 348 288 - #define __NR_getrandom 349 289 - #define __NR_memfd_create 350 290 - #define __NR_bpf 351 291 - #define __NR_s390_pci_mmio_write 352 292 - #define __NR_s390_pci_mmio_read 353 293 - #define __NR_execveat 354 294 - #define __NR_userfaultfd 355 295 - #define __NR_membarrier 356 296 - #define __NR_recvmmsg 357 297 - #define __NR_sendmmsg 358 298 - #define __NR_socket 359 299 - #define __NR_socketpair 360 300 - #define __NR_bind 361 301 - #define __NR_connect 362 302 - #define __NR_listen 363 303 - #define __NR_accept4 364 304 - #define __NR_getsockopt 365 305 - #define __NR_setsockopt 366 306 - #define __NR_getsockname 367 307 - #define __NR_getpeername 368 308 - #define __NR_sendto 369 309 - #define __NR_sendmsg 370 310 - #define __NR_recvfrom 371 311 - #define __NR_recvmsg 372 312 - #define __NR_shutdown 373 313 - #define __NR_mlock2 374 314 - #define __NR_copy_file_range 375 315 - #define __NR_preadv2 376 316 - #define __NR_pwritev2 377 317 - #define __NR_s390_guarded_storage 378 318 - #define __NR_statx 379 319 - #define __NR_s390_sthyi 380 320 - #define NR_syscalls 381 321 - 322 - /* 323 - * There are some system calls that are not present on 64 bit, some 324 - * have a different name although they do the same (e.g. __NR_chown32 325 - * is __NR_chown on 64 bit). 326 - */ 327 - #ifndef __s390x__ 328 - 329 - #define __NR_time 13 330 - #define __NR_lchown 16 331 - #define __NR_setuid 23 332 - #define __NR_getuid 24 333 - #define __NR_stime 25 334 - #define __NR_setgid 46 335 - #define __NR_getgid 47 336 - #define __NR_geteuid 49 337 - #define __NR_getegid 50 338 - #define __NR_setreuid 70 339 - #define __NR_setregid 71 340 - #define __NR_getrlimit 76 341 - #define __NR_getgroups 80 342 - #define __NR_setgroups 81 343 - #define __NR_fchown 95 344 - #define __NR_ioperm 101 345 - #define __NR_setfsuid 138 346 - #define __NR_setfsgid 139 347 - #define __NR__llseek 140 348 - #define __NR__newselect 142 349 - #define __NR_setresuid 164 350 - #define __NR_getresuid 165 351 - #define __NR_setresgid 170 352 - #define __NR_getresgid 171 353 - #define __NR_chown 182 354 - #define __NR_ugetrlimit 191 /* SuS compliant getrlimit */ 355 - #define __NR_mmap2 192 356 - #define __NR_truncate64 193 357 - #define __NR_ftruncate64 194 358 - #define __NR_stat64 195 359 - #define __NR_lstat64 196 360 - #define __NR_fstat64 197 361 - #define __NR_lchown32 198 362 - #define __NR_getuid32 199 363 - #define __NR_getgid32 200 364 - #define __NR_geteuid32 201 365 - #define __NR_getegid32 202 366 - #define __NR_setreuid32 203 367 - #define __NR_setregid32 204 368 - #define __NR_getgroups32 205 369 - #define __NR_setgroups32 206 370 - #define __NR_fchown32 207 371 - #define __NR_setresuid32 208 372 - #define __NR_getresuid32 209 373 - #define __NR_setresgid32 210 374 - #define __NR_getresgid32 211 375 - #define __NR_chown32 212 376 - #define __NR_setuid32 213 377 - #define __NR_setgid32 214 378 - #define __NR_setfsuid32 215 379 - #define __NR_setfsgid32 216 380 - #define __NR_fcntl64 221 381 - #define __NR_sendfile64 223 382 - #define __NR_fadvise64_64 264 383 - #define __NR_fstatat64 293 384 - 385 - #else 386 - 387 - #define __NR_select 142 388 - #define __NR_getrlimit 191 /* SuS compliant getrlimit */ 389 - #define __NR_lchown 198 390 - #define __NR_getuid 199 391 - #define __NR_getgid 200 392 - #define __NR_geteuid 201 393 - #define __NR_getegid 202 394 - #define __NR_setreuid 203 395 - #define __NR_setregid 204 396 - #define __NR_getgroups 205 397 - #define __NR_setgroups 206 398 - #define __NR_fchown 207 399 - #define __NR_setresuid 208 400 - #define __NR_getresuid 209 401 - #define __NR_setresgid 210 402 - #define __NR_getresgid 211 403 - #define __NR_chown 212 404 - #define __NR_setuid 213 405 - #define __NR_setgid 214 406 - #define __NR_setfsuid 215 407 - #define __NR_setfsgid 216 408 - #define __NR_newfstatat 293 409 - 410 - #endif 411 - 412 - #endif /* _UAPI_ASM_S390_UNISTD_H_ */
+1
tools/arch/x86/include/asm/cpufeatures.h
··· 210 210 211 211 #define X86_FEATURE_MBA ( 7*32+18) /* Memory Bandwidth Allocation */ 212 212 #define X86_FEATURE_RSB_CTXSW ( 7*32+19) /* "" Fill RSB on context switches */ 213 + #define X86_FEATURE_SEV ( 7*32+20) /* AMD Secure Encrypted Virtualization */ 213 214 214 215 #define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */ 215 216
+77
tools/include/uapi/drm/i915_drm.h
··· 86 86 I915_MOCS_CACHED, 87 87 }; 88 88 89 + /* 90 + * Different engines serve different roles, and there may be more than one 91 + * engine serving each role. enum drm_i915_gem_engine_class provides a 92 + * classification of the role of the engine, which may be used when requesting 93 + * operations to be performed on a certain subset of engines, or for providing 94 + * information about that group. 95 + */ 96 + enum drm_i915_gem_engine_class { 97 + I915_ENGINE_CLASS_RENDER = 0, 98 + I915_ENGINE_CLASS_COPY = 1, 99 + I915_ENGINE_CLASS_VIDEO = 2, 100 + I915_ENGINE_CLASS_VIDEO_ENHANCE = 3, 101 + 102 + I915_ENGINE_CLASS_INVALID = -1 103 + }; 104 + 105 + /** 106 + * DOC: perf_events exposed by i915 through /sys/bus/event_sources/drivers/i915 107 + * 108 + */ 109 + 110 + enum drm_i915_pmu_engine_sample { 111 + I915_SAMPLE_BUSY = 0, 112 + I915_SAMPLE_WAIT = 1, 113 + I915_SAMPLE_SEMA = 2 114 + }; 115 + 116 + #define I915_PMU_SAMPLE_BITS (4) 117 + #define I915_PMU_SAMPLE_MASK (0xf) 118 + #define I915_PMU_SAMPLE_INSTANCE_BITS (8) 119 + #define I915_PMU_CLASS_SHIFT \ 120 + (I915_PMU_SAMPLE_BITS + I915_PMU_SAMPLE_INSTANCE_BITS) 121 + 122 + #define __I915_PMU_ENGINE(class, instance, sample) \ 123 + ((class) << I915_PMU_CLASS_SHIFT | \ 124 + (instance) << I915_PMU_SAMPLE_BITS | \ 125 + (sample)) 126 + 127 + #define I915_PMU_ENGINE_BUSY(class, instance) \ 128 + __I915_PMU_ENGINE(class, instance, I915_SAMPLE_BUSY) 129 + 130 + #define I915_PMU_ENGINE_WAIT(class, instance) \ 131 + __I915_PMU_ENGINE(class, instance, I915_SAMPLE_WAIT) 132 + 133 + #define I915_PMU_ENGINE_SEMA(class, instance) \ 134 + __I915_PMU_ENGINE(class, instance, I915_SAMPLE_SEMA) 135 + 136 + #define __I915_PMU_OTHER(x) (__I915_PMU_ENGINE(0xff, 0xff, 0xf) + 1 + (x)) 137 + 138 + #define I915_PMU_ACTUAL_FREQUENCY __I915_PMU_OTHER(0) 139 + #define I915_PMU_REQUESTED_FREQUENCY __I915_PMU_OTHER(1) 140 + #define I915_PMU_INTERRUPTS __I915_PMU_OTHER(2) 141 + #define I915_PMU_RC6_RESIDENCY __I915_PMU_OTHER(3) 142 + 143 + #define I915_PMU_LAST I915_PMU_RC6_RESIDENCY 144 + 89 145 /* Each region is a minimum of 16k, and there are at most 255 of them. 90 146 */ 91 147 #define I915_NR_TEX_REGIONS 255 /* table size 2k - maximum due to use ··· 505 449 * drm_i915_gem_exec_fence structures. See I915_EXEC_FENCE_ARRAY. 506 450 */ 507 451 #define I915_PARAM_HAS_EXEC_FENCE_ARRAY 49 452 + 453 + /* 454 + * Query whether every context (both per-file default and user created) is 455 + * isolated (insofar as HW supports). If this parameter is not true, then 456 + * freshly created contexts may inherit values from an existing context, 457 + * rather than default HW values. If true, it also ensures (insofar as HW 458 + * supports) that all state set by this context will not leak to any other 459 + * context. 460 + * 461 + * As not every engine across every gen support contexts, the returned 462 + * value reports the support of context isolation for individual engines by 463 + * returning a bitmask of each engine class set to true if that class supports 464 + * isolation. 465 + */ 466 + #define I915_PARAM_HAS_CONTEXT_ISOLATION 50 467 + 468 + /* Frequency of the command streamer timestamps given by the *_TIMESTAMP 469 + * registers. This used to be fixed per platform but from CNL onwards, this 470 + * might vary depending on the parts. 471 + */ 472 + #define I915_PARAM_CS_TIMESTAMP_FREQUENCY 51 508 473 509 474 typedef struct drm_i915_getparam { 510 475 __s32 param;
+1
tools/include/uapi/linux/if_link.h
··· 163 163 IFLA_IF_NETNSID, 164 164 IFLA_CARRIER_UP_COUNT, 165 165 IFLA_CARRIER_DOWN_COUNT, 166 + IFLA_NEW_IFINDEX, 166 167 __IFLA_MAX 167 168 }; 168 169
+90
tools/include/uapi/linux/kvm.h
··· 1362 1362 /* Available with KVM_CAP_S390_CMMA_MIGRATION */ 1363 1363 #define KVM_S390_GET_CMMA_BITS _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log) 1364 1364 #define KVM_S390_SET_CMMA_BITS _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log) 1365 + /* Memory Encryption Commands */ 1366 + #define KVM_MEMORY_ENCRYPT_OP _IOWR(KVMIO, 0xba, unsigned long) 1367 + 1368 + struct kvm_enc_region { 1369 + __u64 addr; 1370 + __u64 size; 1371 + }; 1372 + 1373 + #define KVM_MEMORY_ENCRYPT_REG_REGION _IOR(KVMIO, 0xbb, struct kvm_enc_region) 1374 + #define KVM_MEMORY_ENCRYPT_UNREG_REGION _IOR(KVMIO, 0xbc, struct kvm_enc_region) 1375 + 1376 + /* Secure Encrypted Virtualization command */ 1377 + enum sev_cmd_id { 1378 + /* Guest initialization commands */ 1379 + KVM_SEV_INIT = 0, 1380 + KVM_SEV_ES_INIT, 1381 + /* Guest launch commands */ 1382 + KVM_SEV_LAUNCH_START, 1383 + KVM_SEV_LAUNCH_UPDATE_DATA, 1384 + KVM_SEV_LAUNCH_UPDATE_VMSA, 1385 + KVM_SEV_LAUNCH_SECRET, 1386 + KVM_SEV_LAUNCH_MEASURE, 1387 + KVM_SEV_LAUNCH_FINISH, 1388 + /* Guest migration commands (outgoing) */ 1389 + KVM_SEV_SEND_START, 1390 + KVM_SEV_SEND_UPDATE_DATA, 1391 + KVM_SEV_SEND_UPDATE_VMSA, 1392 + KVM_SEV_SEND_FINISH, 1393 + /* Guest migration commands (incoming) */ 1394 + KVM_SEV_RECEIVE_START, 1395 + KVM_SEV_RECEIVE_UPDATE_DATA, 1396 + KVM_SEV_RECEIVE_UPDATE_VMSA, 1397 + KVM_SEV_RECEIVE_FINISH, 1398 + /* Guest status and debug commands */ 1399 + KVM_SEV_GUEST_STATUS, 1400 + KVM_SEV_DBG_DECRYPT, 1401 + KVM_SEV_DBG_ENCRYPT, 1402 + /* Guest certificates commands */ 1403 + KVM_SEV_CERT_EXPORT, 1404 + 1405 + KVM_SEV_NR_MAX, 1406 + }; 1407 + 1408 + struct kvm_sev_cmd { 1409 + __u32 id; 1410 + __u64 data; 1411 + __u32 error; 1412 + __u32 sev_fd; 1413 + }; 1414 + 1415 + struct kvm_sev_launch_start { 1416 + __u32 handle; 1417 + __u32 policy; 1418 + __u64 dh_uaddr; 1419 + __u32 dh_len; 1420 + __u64 session_uaddr; 1421 + __u32 session_len; 1422 + }; 1423 + 1424 + struct kvm_sev_launch_update_data { 1425 + __u64 uaddr; 1426 + __u32 len; 1427 + }; 1428 + 1429 + 1430 + struct kvm_sev_launch_secret { 1431 + __u64 hdr_uaddr; 1432 + __u32 hdr_len; 1433 + __u64 guest_uaddr; 1434 + __u32 guest_len; 1435 + __u64 trans_uaddr; 1436 + __u32 trans_len; 1437 + }; 1438 + 1439 + struct kvm_sev_launch_measure { 1440 + __u64 uaddr; 1441 + __u32 len; 1442 + }; 1443 + 1444 + struct kvm_sev_guest_status { 1445 + __u32 handle; 1446 + __u32 policy; 1447 + __u32 state; 1448 + }; 1449 + 1450 + struct kvm_sev_dbg { 1451 + __u64 src_uaddr; 1452 + __u64 dst_uaddr; 1453 + __u32 len; 1454 + }; 1365 1455 1366 1456 #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) 1367 1457 #define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)
+4
tools/perf/Documentation/perf-data.txt
··· 30 30 -i:: 31 31 Specify input perf data file path. 32 32 33 + -f:: 34 + --force:: 35 + Don't complain, do it. 36 + 33 37 -v:: 34 38 --verbose:: 35 39 Be more verbose (show counter open errors, etc).
+7 -3
tools/perf/arch/s390/Makefile
··· 10 10 11 11 out := $(OUTPUT)arch/s390/include/generated/asm 12 12 header := $(out)/syscalls_64.c 13 - sysdef := $(srctree)/tools/arch/s390/include/uapi/asm/unistd.h 14 - sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls/ 13 + syskrn := $(srctree)/arch/s390/kernel/syscalls/syscall.tbl 14 + sysprf := $(srctree)/tools/perf/arch/s390/entry/syscalls 15 + sysdef := $(sysprf)/syscall.tbl 15 16 systbl := $(sysprf)/mksyscalltbl 16 17 17 18 # Create output directory if not already present 18 19 _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') 19 20 20 21 $(header): $(sysdef) $(systbl) 21 - $(Q)$(SHELL) '$(systbl)' '$(CC)' $(sysdef) > $@ 22 + @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \ 23 + (diff -B $(sysdef) $(syskrn) >/dev/null) \ 24 + || echo "Warning: Kernel ABI header at '$(sysdef)' differs from latest version at '$(syskrn)'" >&2 )) || true 25 + $(Q)$(SHELL) '$(systbl)' $(sysdef) > $@ 22 26 23 27 clean:: 24 28 $(call QUIET_CLEAN, s390) $(RM) $(header)
+7 -11
tools/perf/arch/s390/entry/syscalls/mksyscalltbl
··· 3 3 # 4 4 # Generate system call table for perf 5 5 # 6 - # 7 - # Copyright IBM Corp. 2017 6 + # Copyright IBM Corp. 2017, 2018 8 7 # Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> 9 8 # 10 9 11 - gcc=$1 12 - input=$2 10 + SYSCALL_TBL=$1 13 11 14 - if ! test -r $input; then 12 + if ! test -r $SYSCALL_TBL; then 15 13 echo "Could not read input file" >&2 16 14 exit 1 17 15 fi 18 16 19 17 create_table() 20 18 { 21 - local max_nr 19 + local max_nr nr abi sc discard 22 20 23 21 echo 'static const char *syscalltbl_s390_64[] = {' 24 - while read sc nr; do 22 + while read nr abi sc discard; do 25 23 printf '\t[%d] = "%s",\n' $nr $sc 26 24 max_nr=$nr 27 25 done ··· 27 29 echo "#define SYSCALLTBL_S390_64_MAX_ID $max_nr" 28 30 } 29 31 30 - 31 - $gcc -m64 -E -dM -x c $input \ 32 - |sed -ne 's/^#define __NR_//p' \ 33 - |sort -t' ' -k2 -nu \ 32 + grep -E "^[[:digit:]]+[[:space:]]+(common|64)" $SYSCALL_TBL \ 33 + |sort -k1 -n \ 34 34 |create_table
+390
tools/perf/arch/s390/entry/syscalls/syscall.tbl
··· 1 + # SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note 2 + # 3 + # System call table for s390 4 + # 5 + # Format: 6 + # 7 + # <nr> <abi> <syscall> <entry-64bit> <compat-entry> 8 + # 9 + # where <abi> can be common, 64, or 32 10 + 11 + 1 common exit sys_exit sys_exit 12 + 2 common fork sys_fork sys_fork 13 + 3 common read sys_read compat_sys_s390_read 14 + 4 common write sys_write compat_sys_s390_write 15 + 5 common open sys_open compat_sys_open 16 + 6 common close sys_close sys_close 17 + 7 common restart_syscall sys_restart_syscall sys_restart_syscall 18 + 8 common creat sys_creat compat_sys_creat 19 + 9 common link sys_link compat_sys_link 20 + 10 common unlink sys_unlink compat_sys_unlink 21 + 11 common execve sys_execve compat_sys_execve 22 + 12 common chdir sys_chdir compat_sys_chdir 23 + 13 32 time - compat_sys_time 24 + 14 common mknod sys_mknod compat_sys_mknod 25 + 15 common chmod sys_chmod compat_sys_chmod 26 + 16 32 lchown - compat_sys_s390_lchown16 27 + 19 common lseek sys_lseek compat_sys_lseek 28 + 20 common getpid sys_getpid sys_getpid 29 + 21 common mount sys_mount compat_sys_mount 30 + 22 common umount sys_oldumount compat_sys_oldumount 31 + 23 32 setuid - compat_sys_s390_setuid16 32 + 24 32 getuid - compat_sys_s390_getuid16 33 + 25 32 stime - compat_sys_stime 34 + 26 common ptrace sys_ptrace compat_sys_ptrace 35 + 27 common alarm sys_alarm sys_alarm 36 + 29 common pause sys_pause sys_pause 37 + 30 common utime sys_utime compat_sys_utime 38 + 33 common access sys_access compat_sys_access 39 + 34 common nice sys_nice sys_nice 40 + 36 common sync sys_sync sys_sync 41 + 37 common kill sys_kill sys_kill 42 + 38 common rename sys_rename compat_sys_rename 43 + 39 common mkdir sys_mkdir compat_sys_mkdir 44 + 40 common rmdir sys_rmdir compat_sys_rmdir 45 + 41 common dup sys_dup sys_dup 46 + 42 common pipe sys_pipe compat_sys_pipe 47 + 43 common times sys_times compat_sys_times 48 + 45 common brk sys_brk compat_sys_brk 49 + 46 32 setgid - compat_sys_s390_setgid16 50 + 47 32 getgid - compat_sys_s390_getgid16 51 + 48 common signal sys_signal compat_sys_signal 52 + 49 32 geteuid - compat_sys_s390_geteuid16 53 + 50 32 getegid - compat_sys_s390_getegid16 54 + 51 common acct sys_acct compat_sys_acct 55 + 52 common umount2 sys_umount compat_sys_umount 56 + 54 common ioctl sys_ioctl compat_sys_ioctl 57 + 55 common fcntl sys_fcntl compat_sys_fcntl 58 + 57 common setpgid sys_setpgid sys_setpgid 59 + 60 common umask sys_umask sys_umask 60 + 61 common chroot sys_chroot compat_sys_chroot 61 + 62 common ustat sys_ustat compat_sys_ustat 62 + 63 common dup2 sys_dup2 sys_dup2 63 + 64 common getppid sys_getppid sys_getppid 64 + 65 common getpgrp sys_getpgrp sys_getpgrp 65 + 66 common setsid sys_setsid sys_setsid 66 + 67 common sigaction sys_sigaction compat_sys_sigaction 67 + 70 32 setreuid - compat_sys_s390_setreuid16 68 + 71 32 setregid - compat_sys_s390_setregid16 69 + 72 common sigsuspend sys_sigsuspend compat_sys_sigsuspend 70 + 73 common sigpending sys_sigpending compat_sys_sigpending 71 + 74 common sethostname sys_sethostname compat_sys_sethostname 72 + 75 common setrlimit sys_setrlimit compat_sys_setrlimit 73 + 76 32 getrlimit - compat_sys_old_getrlimit 74 + 77 common getrusage sys_getrusage compat_sys_getrusage 75 + 78 common gettimeofday sys_gettimeofday compat_sys_gettimeofday 76 + 79 common settimeofday sys_settimeofday compat_sys_settimeofday 77 + 80 32 getgroups - compat_sys_s390_getgroups16 78 + 81 32 setgroups - compat_sys_s390_setgroups16 79 + 83 common symlink sys_symlink compat_sys_symlink 80 + 85 common readlink sys_readlink compat_sys_readlink 81 + 86 common uselib sys_uselib compat_sys_uselib 82 + 87 common swapon sys_swapon compat_sys_swapon 83 + 88 common reboot sys_reboot compat_sys_reboot 84 + 89 common readdir - compat_sys_old_readdir 85 + 90 common mmap sys_old_mmap compat_sys_s390_old_mmap 86 + 91 common munmap sys_munmap compat_sys_munmap 87 + 92 common truncate sys_truncate compat_sys_truncate 88 + 93 common ftruncate sys_ftruncate compat_sys_ftruncate 89 + 94 common fchmod sys_fchmod sys_fchmod 90 + 95 32 fchown - compat_sys_s390_fchown16 91 + 96 common getpriority sys_getpriority sys_getpriority 92 + 97 common setpriority sys_setpriority sys_setpriority 93 + 99 common statfs sys_statfs compat_sys_statfs 94 + 100 common fstatfs sys_fstatfs compat_sys_fstatfs 95 + 101 32 ioperm - - 96 + 102 common socketcall sys_socketcall compat_sys_socketcall 97 + 103 common syslog sys_syslog compat_sys_syslog 98 + 104 common setitimer sys_setitimer compat_sys_setitimer 99 + 105 common getitimer sys_getitimer compat_sys_getitimer 100 + 106 common stat sys_newstat compat_sys_newstat 101 + 107 common lstat sys_newlstat compat_sys_newlstat 102 + 108 common fstat sys_newfstat compat_sys_newfstat 103 + 110 common lookup_dcookie sys_lookup_dcookie compat_sys_lookup_dcookie 104 + 111 common vhangup sys_vhangup sys_vhangup 105 + 112 common idle - - 106 + 114 common wait4 sys_wait4 compat_sys_wait4 107 + 115 common swapoff sys_swapoff compat_sys_swapoff 108 + 116 common sysinfo sys_sysinfo compat_sys_sysinfo 109 + 117 common ipc sys_s390_ipc compat_sys_s390_ipc 110 + 118 common fsync sys_fsync sys_fsync 111 + 119 common sigreturn sys_sigreturn compat_sys_sigreturn 112 + 120 common clone sys_clone compat_sys_clone 113 + 121 common setdomainname sys_setdomainname compat_sys_setdomainname 114 + 122 common uname sys_newuname compat_sys_newuname 115 + 124 common adjtimex sys_adjtimex compat_sys_adjtimex 116 + 125 common mprotect sys_mprotect compat_sys_mprotect 117 + 126 common sigprocmask sys_sigprocmask compat_sys_sigprocmask 118 + 127 common create_module - - 119 + 128 common init_module sys_init_module compat_sys_init_module 120 + 129 common delete_module sys_delete_module compat_sys_delete_module 121 + 130 common get_kernel_syms - - 122 + 131 common quotactl sys_quotactl compat_sys_quotactl 123 + 132 common getpgid sys_getpgid sys_getpgid 124 + 133 common fchdir sys_fchdir sys_fchdir 125 + 134 common bdflush sys_bdflush compat_sys_bdflush 126 + 135 common sysfs sys_sysfs compat_sys_sysfs 127 + 136 common personality sys_s390_personality sys_s390_personality 128 + 137 common afs_syscall - - 129 + 138 32 setfsuid - compat_sys_s390_setfsuid16 130 + 139 32 setfsgid - compat_sys_s390_setfsgid16 131 + 140 32 _llseek - compat_sys_llseek 132 + 141 common getdents sys_getdents compat_sys_getdents 133 + 142 32 _newselect - compat_sys_select 134 + 142 64 select sys_select - 135 + 143 common flock sys_flock sys_flock 136 + 144 common msync sys_msync compat_sys_msync 137 + 145 common readv sys_readv compat_sys_readv 138 + 146 common writev sys_writev compat_sys_writev 139 + 147 common getsid sys_getsid sys_getsid 140 + 148 common fdatasync sys_fdatasync sys_fdatasync 141 + 149 common _sysctl sys_sysctl compat_sys_sysctl 142 + 150 common mlock sys_mlock compat_sys_mlock 143 + 151 common munlock sys_munlock compat_sys_munlock 144 + 152 common mlockall sys_mlockall sys_mlockall 145 + 153 common munlockall sys_munlockall sys_munlockall 146 + 154 common sched_setparam sys_sched_setparam compat_sys_sched_setparam 147 + 155 common sched_getparam sys_sched_getparam compat_sys_sched_getparam 148 + 156 common sched_setscheduler sys_sched_setscheduler compat_sys_sched_setscheduler 149 + 157 common sched_getscheduler sys_sched_getscheduler sys_sched_getscheduler 150 + 158 common sched_yield sys_sched_yield sys_sched_yield 151 + 159 common sched_get_priority_max sys_sched_get_priority_max sys_sched_get_priority_max 152 + 160 common sched_get_priority_min sys_sched_get_priority_min sys_sched_get_priority_min 153 + 161 common sched_rr_get_interval sys_sched_rr_get_interval compat_sys_sched_rr_get_interval 154 + 162 common nanosleep sys_nanosleep compat_sys_nanosleep 155 + 163 common mremap sys_mremap compat_sys_mremap 156 + 164 32 setresuid - compat_sys_s390_setresuid16 157 + 165 32 getresuid - compat_sys_s390_getresuid16 158 + 167 common query_module - - 159 + 168 common poll sys_poll compat_sys_poll 160 + 169 common nfsservctl - - 161 + 170 32 setresgid - compat_sys_s390_setresgid16 162 + 171 32 getresgid - compat_sys_s390_getresgid16 163 + 172 common prctl sys_prctl compat_sys_prctl 164 + 173 common rt_sigreturn sys_rt_sigreturn compat_sys_rt_sigreturn 165 + 174 common rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction 166 + 175 common rt_sigprocmask sys_rt_sigprocmask compat_sys_rt_sigprocmask 167 + 176 common rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending 168 + 177 common rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait 169 + 178 common rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo 170 + 179 common rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend 171 + 180 common pread64 sys_pread64 compat_sys_s390_pread64 172 + 181 common pwrite64 sys_pwrite64 compat_sys_s390_pwrite64 173 + 182 32 chown - compat_sys_s390_chown16 174 + 183 common getcwd sys_getcwd compat_sys_getcwd 175 + 184 common capget sys_capget compat_sys_capget 176 + 185 common capset sys_capset compat_sys_capset 177 + 186 common sigaltstack sys_sigaltstack compat_sys_sigaltstack 178 + 187 common sendfile sys_sendfile64 compat_sys_sendfile 179 + 188 common getpmsg - - 180 + 189 common putpmsg - - 181 + 190 common vfork sys_vfork sys_vfork 182 + 191 32 ugetrlimit - compat_sys_getrlimit 183 + 191 64 getrlimit sys_getrlimit - 184 + 192 32 mmap2 - compat_sys_s390_mmap2 185 + 193 32 truncate64 - compat_sys_s390_truncate64 186 + 194 32 ftruncate64 - compat_sys_s390_ftruncate64 187 + 195 32 stat64 - compat_sys_s390_stat64 188 + 196 32 lstat64 - compat_sys_s390_lstat64 189 + 197 32 fstat64 - compat_sys_s390_fstat64 190 + 198 32 lchown32 - compat_sys_lchown 191 + 198 64 lchown sys_lchown - 192 + 199 32 getuid32 - sys_getuid 193 + 199 64 getuid sys_getuid - 194 + 200 32 getgid32 - sys_getgid 195 + 200 64 getgid sys_getgid - 196 + 201 32 geteuid32 - sys_geteuid 197 + 201 64 geteuid sys_geteuid - 198 + 202 32 getegid32 - sys_getegid 199 + 202 64 getegid sys_getegid - 200 + 203 32 setreuid32 - sys_setreuid 201 + 203 64 setreuid sys_setreuid - 202 + 204 32 setregid32 - sys_setregid 203 + 204 64 setregid sys_setregid - 204 + 205 32 getgroups32 - compat_sys_getgroups 205 + 205 64 getgroups sys_getgroups - 206 + 206 32 setgroups32 - compat_sys_setgroups 207 + 206 64 setgroups sys_setgroups - 208 + 207 32 fchown32 - sys_fchown 209 + 207 64 fchown sys_fchown - 210 + 208 32 setresuid32 - sys_setresuid 211 + 208 64 setresuid sys_setresuid - 212 + 209 32 getresuid32 - compat_sys_getresuid 213 + 209 64 getresuid sys_getresuid - 214 + 210 32 setresgid32 - sys_setresgid 215 + 210 64 setresgid sys_setresgid - 216 + 211 32 getresgid32 - compat_sys_getresgid 217 + 211 64 getresgid sys_getresgid - 218 + 212 32 chown32 - compat_sys_chown 219 + 212 64 chown sys_chown - 220 + 213 32 setuid32 - sys_setuid 221 + 213 64 setuid sys_setuid - 222 + 214 32 setgid32 - sys_setgid 223 + 214 64 setgid sys_setgid - 224 + 215 32 setfsuid32 - sys_setfsuid 225 + 215 64 setfsuid sys_setfsuid - 226 + 216 32 setfsgid32 - sys_setfsgid 227 + 216 64 setfsgid sys_setfsgid - 228 + 217 common pivot_root sys_pivot_root compat_sys_pivot_root 229 + 218 common mincore sys_mincore compat_sys_mincore 230 + 219 common madvise sys_madvise compat_sys_madvise 231 + 220 common getdents64 sys_getdents64 compat_sys_getdents64 232 + 221 32 fcntl64 - compat_sys_fcntl64 233 + 222 common readahead sys_readahead compat_sys_s390_readahead 234 + 223 32 sendfile64 - compat_sys_sendfile64 235 + 224 common setxattr sys_setxattr compat_sys_setxattr 236 + 225 common lsetxattr sys_lsetxattr compat_sys_lsetxattr 237 + 226 common fsetxattr sys_fsetxattr compat_sys_fsetxattr 238 + 227 common getxattr sys_getxattr compat_sys_getxattr 239 + 228 common lgetxattr sys_lgetxattr compat_sys_lgetxattr 240 + 229 common fgetxattr sys_fgetxattr compat_sys_fgetxattr 241 + 230 common listxattr sys_listxattr compat_sys_listxattr 242 + 231 common llistxattr sys_llistxattr compat_sys_llistxattr 243 + 232 common flistxattr sys_flistxattr compat_sys_flistxattr 244 + 233 common removexattr sys_removexattr compat_sys_removexattr 245 + 234 common lremovexattr sys_lremovexattr compat_sys_lremovexattr 246 + 235 common fremovexattr sys_fremovexattr compat_sys_fremovexattr 247 + 236 common gettid sys_gettid sys_gettid 248 + 237 common tkill sys_tkill sys_tkill 249 + 238 common futex sys_futex compat_sys_futex 250 + 239 common sched_setaffinity sys_sched_setaffinity compat_sys_sched_setaffinity 251 + 240 common sched_getaffinity sys_sched_getaffinity compat_sys_sched_getaffinity 252 + 241 common tgkill sys_tgkill sys_tgkill 253 + 243 common io_setup sys_io_setup compat_sys_io_setup 254 + 244 common io_destroy sys_io_destroy compat_sys_io_destroy 255 + 245 common io_getevents sys_io_getevents compat_sys_io_getevents 256 + 246 common io_submit sys_io_submit compat_sys_io_submit 257 + 247 common io_cancel sys_io_cancel compat_sys_io_cancel 258 + 248 common exit_group sys_exit_group sys_exit_group 259 + 249 common epoll_create sys_epoll_create sys_epoll_create 260 + 250 common epoll_ctl sys_epoll_ctl compat_sys_epoll_ctl 261 + 251 common epoll_wait sys_epoll_wait compat_sys_epoll_wait 262 + 252 common set_tid_address sys_set_tid_address compat_sys_set_tid_address 263 + 253 common fadvise64 sys_fadvise64_64 compat_sys_s390_fadvise64 264 + 254 common timer_create sys_timer_create compat_sys_timer_create 265 + 255 common timer_settime sys_timer_settime compat_sys_timer_settime 266 + 256 common timer_gettime sys_timer_gettime compat_sys_timer_gettime 267 + 257 common timer_getoverrun sys_timer_getoverrun sys_timer_getoverrun 268 + 258 common timer_delete sys_timer_delete sys_timer_delete 269 + 259 common clock_settime sys_clock_settime compat_sys_clock_settime 270 + 260 common clock_gettime sys_clock_gettime compat_sys_clock_gettime 271 + 261 common clock_getres sys_clock_getres compat_sys_clock_getres 272 + 262 common clock_nanosleep sys_clock_nanosleep compat_sys_clock_nanosleep 273 + 264 32 fadvise64_64 - compat_sys_s390_fadvise64_64 274 + 265 common statfs64 sys_statfs64 compat_sys_statfs64 275 + 266 common fstatfs64 sys_fstatfs64 compat_sys_fstatfs64 276 + 267 common remap_file_pages sys_remap_file_pages compat_sys_remap_file_pages 277 + 268 common mbind sys_mbind compat_sys_mbind 278 + 269 common get_mempolicy sys_get_mempolicy compat_sys_get_mempolicy 279 + 270 common set_mempolicy sys_set_mempolicy compat_sys_set_mempolicy 280 + 271 common mq_open sys_mq_open compat_sys_mq_open 281 + 272 common mq_unlink sys_mq_unlink compat_sys_mq_unlink 282 + 273 common mq_timedsend sys_mq_timedsend compat_sys_mq_timedsend 283 + 274 common mq_timedreceive sys_mq_timedreceive compat_sys_mq_timedreceive 284 + 275 common mq_notify sys_mq_notify compat_sys_mq_notify 285 + 276 common mq_getsetattr sys_mq_getsetattr compat_sys_mq_getsetattr 286 + 277 common kexec_load sys_kexec_load compat_sys_kexec_load 287 + 278 common add_key sys_add_key compat_sys_add_key 288 + 279 common request_key sys_request_key compat_sys_request_key 289 + 280 common keyctl sys_keyctl compat_sys_keyctl 290 + 281 common waitid sys_waitid compat_sys_waitid 291 + 282 common ioprio_set sys_ioprio_set sys_ioprio_set 292 + 283 common ioprio_get sys_ioprio_get sys_ioprio_get 293 + 284 common inotify_init sys_inotify_init sys_inotify_init 294 + 285 common inotify_add_watch sys_inotify_add_watch compat_sys_inotify_add_watch 295 + 286 common inotify_rm_watch sys_inotify_rm_watch sys_inotify_rm_watch 296 + 287 common migrate_pages sys_migrate_pages compat_sys_migrate_pages 297 + 288 common openat sys_openat compat_sys_openat 298 + 289 common mkdirat sys_mkdirat compat_sys_mkdirat 299 + 290 common mknodat sys_mknodat compat_sys_mknodat 300 + 291 common fchownat sys_fchownat compat_sys_fchownat 301 + 292 common futimesat sys_futimesat compat_sys_futimesat 302 + 293 32 fstatat64 - compat_sys_s390_fstatat64 303 + 293 64 newfstatat sys_newfstatat - 304 + 294 common unlinkat sys_unlinkat compat_sys_unlinkat 305 + 295 common renameat sys_renameat compat_sys_renameat 306 + 296 common linkat sys_linkat compat_sys_linkat 307 + 297 common symlinkat sys_symlinkat compat_sys_symlinkat 308 + 298 common readlinkat sys_readlinkat compat_sys_readlinkat 309 + 299 common fchmodat sys_fchmodat compat_sys_fchmodat 310 + 300 common faccessat sys_faccessat compat_sys_faccessat 311 + 301 common pselect6 sys_pselect6 compat_sys_pselect6 312 + 302 common ppoll sys_ppoll compat_sys_ppoll 313 + 303 common unshare sys_unshare compat_sys_unshare 314 + 304 common set_robust_list sys_set_robust_list compat_sys_set_robust_list 315 + 305 common get_robust_list sys_get_robust_list compat_sys_get_robust_list 316 + 306 common splice sys_splice compat_sys_splice 317 + 307 common sync_file_range sys_sync_file_range compat_sys_s390_sync_file_range 318 + 308 common tee sys_tee compat_sys_tee 319 + 309 common vmsplice sys_vmsplice compat_sys_vmsplice 320 + 310 common move_pages sys_move_pages compat_sys_move_pages 321 + 311 common getcpu sys_getcpu compat_sys_getcpu 322 + 312 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait 323 + 313 common utimes sys_utimes compat_sys_utimes 324 + 314 common fallocate sys_fallocate compat_sys_s390_fallocate 325 + 315 common utimensat sys_utimensat compat_sys_utimensat 326 + 316 common signalfd sys_signalfd compat_sys_signalfd 327 + 317 common timerfd - - 328 + 318 common eventfd sys_eventfd sys_eventfd 329 + 319 common timerfd_create sys_timerfd_create sys_timerfd_create 330 + 320 common timerfd_settime sys_timerfd_settime compat_sys_timerfd_settime 331 + 321 common timerfd_gettime sys_timerfd_gettime compat_sys_timerfd_gettime 332 + 322 common signalfd4 sys_signalfd4 compat_sys_signalfd4 333 + 323 common eventfd2 sys_eventfd2 sys_eventfd2 334 + 324 common inotify_init1 sys_inotify_init1 sys_inotify_init1 335 + 325 common pipe2 sys_pipe2 compat_sys_pipe2 336 + 326 common dup3 sys_dup3 sys_dup3 337 + 327 common epoll_create1 sys_epoll_create1 sys_epoll_create1 338 + 328 common preadv sys_preadv compat_sys_preadv 339 + 329 common pwritev sys_pwritev compat_sys_pwritev 340 + 330 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo 341 + 331 common perf_event_open sys_perf_event_open compat_sys_perf_event_open 342 + 332 common fanotify_init sys_fanotify_init sys_fanotify_init 343 + 333 common fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark 344 + 334 common prlimit64 sys_prlimit64 compat_sys_prlimit64 345 + 335 common name_to_handle_at sys_name_to_handle_at compat_sys_name_to_handle_at 346 + 336 common open_by_handle_at sys_open_by_handle_at compat_sys_open_by_handle_at 347 + 337 common clock_adjtime sys_clock_adjtime compat_sys_clock_adjtime 348 + 338 common syncfs sys_syncfs sys_syncfs 349 + 339 common setns sys_setns sys_setns 350 + 340 common process_vm_readv sys_process_vm_readv compat_sys_process_vm_readv 351 + 341 common process_vm_writev sys_process_vm_writev compat_sys_process_vm_writev 352 + 342 common s390_runtime_instr sys_s390_runtime_instr sys_s390_runtime_instr 353 + 343 common kcmp sys_kcmp compat_sys_kcmp 354 + 344 common finit_module sys_finit_module compat_sys_finit_module 355 + 345 common sched_setattr sys_sched_setattr compat_sys_sched_setattr 356 + 346 common sched_getattr sys_sched_getattr compat_sys_sched_getattr 357 + 347 common renameat2 sys_renameat2 compat_sys_renameat2 358 + 348 common seccomp sys_seccomp compat_sys_seccomp 359 + 349 common getrandom sys_getrandom compat_sys_getrandom 360 + 350 common memfd_create sys_memfd_create compat_sys_memfd_create 361 + 351 common bpf sys_bpf compat_sys_bpf 362 + 352 common s390_pci_mmio_write sys_s390_pci_mmio_write compat_sys_s390_pci_mmio_write 363 + 353 common s390_pci_mmio_read sys_s390_pci_mmio_read compat_sys_s390_pci_mmio_read 364 + 354 common execveat sys_execveat compat_sys_execveat 365 + 355 common userfaultfd sys_userfaultfd sys_userfaultfd 366 + 356 common membarrier sys_membarrier sys_membarrier 367 + 357 common recvmmsg sys_recvmmsg compat_sys_recvmmsg 368 + 358 common sendmmsg sys_sendmmsg compat_sys_sendmmsg 369 + 359 common socket sys_socket sys_socket 370 + 360 common socketpair sys_socketpair compat_sys_socketpair 371 + 361 common bind sys_bind compat_sys_bind 372 + 362 common connect sys_connect compat_sys_connect 373 + 363 common listen sys_listen sys_listen 374 + 364 common accept4 sys_accept4 compat_sys_accept4 375 + 365 common getsockopt sys_getsockopt compat_sys_getsockopt 376 + 366 common setsockopt sys_setsockopt compat_sys_setsockopt 377 + 367 common getsockname sys_getsockname compat_sys_getsockname 378 + 368 common getpeername sys_getpeername compat_sys_getpeername 379 + 369 common sendto sys_sendto compat_sys_sendto 380 + 370 common sendmsg sys_sendmsg compat_sys_sendmsg 381 + 371 common recvfrom sys_recvfrom compat_sys_recvfrom 382 + 372 common recvmsg sys_recvmsg compat_sys_recvmsg 383 + 373 common shutdown sys_shutdown sys_shutdown 384 + 374 common mlock2 sys_mlock2 compat_sys_mlock2 385 + 375 common copy_file_range sys_copy_file_range compat_sys_copy_file_range 386 + 376 common preadv2 sys_preadv2 compat_sys_preadv2 387 + 377 common pwritev2 sys_pwritev2 compat_sys_pwritev2 388 + 378 common s390_guarded_storage sys_s390_guarded_storage compat_sys_s390_guarded_storage 389 + 379 common statx sys_statx compat_sys_statx 390 + 380 common s390_sthyi sys_s390_sthyi compat_sys_s390_sthyi
+2 -2
tools/perf/builtin-c2c.c
··· 2245 2245 c2c_browser__update_nr_entries(browser); 2246 2246 2247 2247 while (1) { 2248 - key = hist_browser__run(browser, "? - help"); 2248 + key = hist_browser__run(browser, "? - help", true); 2249 2249 2250 2250 switch (key) { 2251 2251 case 's': ··· 2314 2314 c2c_browser__update_nr_entries(browser); 2315 2315 2316 2316 while (1) { 2317 - key = hist_browser__run(browser, "? - help"); 2317 + key = hist_browser__run(browser, "? - help", true); 2318 2318 2319 2319 switch (key) { 2320 2320 case 'q':
+2 -1
tools/perf/builtin-report.c
··· 530 530 case 1: 531 531 ret = perf_evlist__tui_browse_hists(evlist, help, NULL, 532 532 rep->min_percent, 533 - &session->header.env); 533 + &session->header.env, 534 + true); 534 535 /* 535 536 * Usually "ret" is the last pressed key, and we only 536 537 * care if the key notifies us to switch data file.
+143 -7
tools/perf/builtin-top.c
··· 283 283 284 284 printf("%-*.*s\n", win_width, win_width, graph_dotted_line); 285 285 286 - if (hists->stats.nr_lost_warned != 287 - hists->stats.nr_events[PERF_RECORD_LOST]) { 286 + if (!top->record_opts.overwrite && 287 + (hists->stats.nr_lost_warned != 288 + hists->stats.nr_events[PERF_RECORD_LOST])) { 288 289 hists->stats.nr_lost_warned = 289 290 hists->stats.nr_events[PERF_RECORD_LOST]; 290 291 color_fprintf(stdout, PERF_COLOR_RED, ··· 612 611 613 612 perf_evlist__tui_browse_hists(top->evlist, help, &hbt, 614 613 top->min_percent, 615 - &top->session->header.env); 614 + &top->session->header.env, 615 + !top->record_opts.overwrite); 616 616 617 617 done = 1; 618 618 return NULL; ··· 809 807 810 808 static void perf_top__mmap_read_idx(struct perf_top *top, int idx) 811 809 { 810 + struct record_opts *opts = &top->record_opts; 811 + struct perf_evlist *evlist = top->evlist; 812 812 struct perf_sample sample; 813 813 struct perf_evsel *evsel; 814 + struct perf_mmap *md; 814 815 struct perf_session *session = top->session; 815 816 union perf_event *event; 816 817 struct machine *machine; 818 + u64 end, start; 817 819 int ret; 818 820 819 - while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) { 820 - ret = perf_evlist__parse_sample(top->evlist, event, &sample); 821 + md = opts->overwrite ? &evlist->overwrite_mmap[idx] : &evlist->mmap[idx]; 822 + if (perf_mmap__read_init(md, opts->overwrite, &start, &end) < 0) 823 + return; 824 + 825 + while ((event = perf_mmap__read_event(md, opts->overwrite, &start, end)) != NULL) { 826 + ret = perf_evlist__parse_sample(evlist, event, &sample); 821 827 if (ret) { 822 828 pr_err("Can't parse sample, err = %d\n", ret); 823 829 goto next_event; ··· 879 869 } else 880 870 ++session->evlist->stats.nr_unknown_events; 881 871 next_event: 882 - perf_evlist__mmap_consume(top->evlist, idx); 872 + perf_mmap__consume(md, opts->overwrite); 883 873 } 874 + 875 + perf_mmap__read_done(md); 884 876 } 885 877 886 878 static void perf_top__mmap_read(struct perf_top *top) 887 879 { 880 + bool overwrite = top->record_opts.overwrite; 881 + struct perf_evlist *evlist = top->evlist; 882 + unsigned long long start, end; 888 883 int i; 884 + 885 + start = rdclock(); 886 + if (overwrite) 887 + perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_DATA_PENDING); 889 888 890 889 for (i = 0; i < top->evlist->nr_mmaps; i++) 891 890 perf_top__mmap_read_idx(top, i); 891 + 892 + if (overwrite) { 893 + perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY); 894 + perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_RUNNING); 895 + } 896 + end = rdclock(); 897 + 898 + if ((end - start) > (unsigned long long)top->delay_secs * NSEC_PER_SEC) 899 + ui__warning("Too slow to read ring buffer.\n" 900 + "Please try increasing the period (-c) or\n" 901 + "decreasing the freq (-F) or\n" 902 + "limiting the number of CPUs (-C)\n"); 903 + } 904 + 905 + /* 906 + * Check per-event overwrite term. 907 + * perf top should support consistent term for all events. 908 + * - All events don't have per-event term 909 + * E.g. "cpu/cpu-cycles/,cpu/instructions/" 910 + * Nothing change, return 0. 911 + * - All events have same per-event term 912 + * E.g. "cpu/cpu-cycles,no-overwrite/,cpu/instructions,no-overwrite/ 913 + * Using the per-event setting to replace the opts->overwrite if 914 + * they are different, then return 0. 915 + * - Events have different per-event term 916 + * E.g. "cpu/cpu-cycles,overwrite/,cpu/instructions,no-overwrite/" 917 + * Return -1 918 + * - Some of the event set per-event term, but some not. 919 + * E.g. "cpu/cpu-cycles/,cpu/instructions,no-overwrite/" 920 + * Return -1 921 + */ 922 + static int perf_top__overwrite_check(struct perf_top *top) 923 + { 924 + struct record_opts *opts = &top->record_opts; 925 + struct perf_evlist *evlist = top->evlist; 926 + struct perf_evsel_config_term *term; 927 + struct list_head *config_terms; 928 + struct perf_evsel *evsel; 929 + int set, overwrite = -1; 930 + 931 + evlist__for_each_entry(evlist, evsel) { 932 + set = -1; 933 + config_terms = &evsel->config_terms; 934 + list_for_each_entry(term, config_terms, list) { 935 + if (term->type == PERF_EVSEL__CONFIG_TERM_OVERWRITE) 936 + set = term->val.overwrite ? 1 : 0; 937 + } 938 + 939 + /* no term for current and previous event (likely) */ 940 + if ((overwrite < 0) && (set < 0)) 941 + continue; 942 + 943 + /* has term for both current and previous event, compare */ 944 + if ((overwrite >= 0) && (set >= 0) && (overwrite != set)) 945 + return -1; 946 + 947 + /* no term for current event but has term for previous one */ 948 + if ((overwrite >= 0) && (set < 0)) 949 + return -1; 950 + 951 + /* has term for current event */ 952 + if ((overwrite < 0) && (set >= 0)) { 953 + /* if it's first event, set overwrite */ 954 + if (evsel == perf_evlist__first(evlist)) 955 + overwrite = set; 956 + else 957 + return -1; 958 + } 959 + } 960 + 961 + if ((overwrite >= 0) && (opts->overwrite != overwrite)) 962 + opts->overwrite = overwrite; 963 + 964 + return 0; 965 + } 966 + 967 + static int perf_top_overwrite_fallback(struct perf_top *top, 968 + struct perf_evsel *evsel) 969 + { 970 + struct record_opts *opts = &top->record_opts; 971 + struct perf_evlist *evlist = top->evlist; 972 + struct perf_evsel *counter; 973 + 974 + if (!opts->overwrite) 975 + return 0; 976 + 977 + /* only fall back when first event fails */ 978 + if (evsel != perf_evlist__first(evlist)) 979 + return 0; 980 + 981 + evlist__for_each_entry(evlist, counter) 982 + counter->attr.write_backward = false; 983 + opts->overwrite = false; 984 + ui__warning("fall back to non-overwrite mode\n"); 985 + return 1; 892 986 } 893 987 894 988 static int perf_top__start_counters(struct perf_top *top) ··· 1002 888 struct perf_evlist *evlist = top->evlist; 1003 889 struct record_opts *opts = &top->record_opts; 1004 890 891 + if (perf_top__overwrite_check(top)) { 892 + ui__error("perf top only support consistent per-event " 893 + "overwrite setting for all events\n"); 894 + goto out_err; 895 + } 896 + 1005 897 perf_evlist__config(evlist, opts, &callchain_param); 1006 898 1007 899 evlist__for_each_entry(evlist, counter) { 1008 900 try_again: 1009 901 if (perf_evsel__open(counter, top->evlist->cpus, 1010 902 top->evlist->threads) < 0) { 903 + 904 + /* 905 + * Specially handle overwrite fall back. 906 + * Because perf top is the only tool which has 907 + * overwrite mode by default, support 908 + * both overwrite and non-overwrite mode, and 909 + * require consistent mode for all events. 910 + * 911 + * May move it to generic code with more tools 912 + * have similar attribute. 913 + */ 914 + if (perf_missing_features.write_backward && 915 + perf_top_overwrite_fallback(top, counter)) 916 + goto try_again; 917 + 1011 918 if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) { 1012 919 if (verbose > 0) 1013 920 ui__warning("%s\n", msg); ··· 1168 1033 1169 1034 perf_top__mmap_read(top); 1170 1035 1171 - if (hits == top->samples) 1036 + if (opts->overwrite || (hits == top->samples)) 1172 1037 ret = perf_evlist__poll(top->evlist, 100); 1173 1038 1174 1039 if (resize) { ··· 1262 1127 .uses_mmap = true, 1263 1128 }, 1264 1129 .proc_map_timeout = 500, 1130 + .overwrite = 1, 1265 1131 }, 1266 1132 .max_stack = sysctl_perf_event_max_stack, 1267 1133 .sym_pcnt_filter = 5,
-1
tools/perf/check-headers.sh
··· 33 33 arch/s390/include/uapi/asm/kvm_perf.h 34 34 arch/s390/include/uapi/asm/ptrace.h 35 35 arch/s390/include/uapi/asm/sie.h 36 - arch/s390/include/uapi/asm/unistd.h 37 36 arch/arm/include/uapi/asm/kvm.h 38 37 arch/arm64/include/uapi/asm/kvm.h 39 38 arch/alpha/include/uapi/asm/errno.h
+27
tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json
··· 1 + [ 2 + {, 3 + "EventCode": "0x7A", 4 + "EventName": "BR_INDIRECT_SPEC", 5 + "BriefDescription": "Branch speculatively executed - Indirect branch" 6 + }, 7 + {, 8 + "EventCode": "0xC9", 9 + "EventName": "BR_COND", 10 + "BriefDescription": "Conditional branch executed" 11 + }, 12 + {, 13 + "EventCode": "0xCA", 14 + "EventName": "BR_INDIRECT_MISPRED", 15 + "BriefDescription": "Indirect branch mispredicted" 16 + }, 17 + {, 18 + "EventCode": "0xCB", 19 + "EventName": "BR_INDIRECT_MISPRED_ADDR", 20 + "BriefDescription": "Indirect branch mispredicted because of address miscompare" 21 + }, 22 + {, 23 + "EventCode": "0xCC", 24 + "EventName": "BR_COND_MISPRED", 25 + "BriefDescription": "Conditional branch mispredicted" 26 + } 27 + ]
+22
tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json
··· 1 + [ 2 + {, 3 + "EventCode": "0x60", 4 + "EventName": "BUS_ACCESS_LD", 5 + "BriefDescription": "Bus access - Read" 6 + }, 7 + {, 8 + "EventCode": "0x61", 9 + "EventName": "BUS_ACCESS_ST", 10 + "BriefDescription": "Bus access - Write" 11 + }, 12 + {, 13 + "EventCode": "0xC0", 14 + "EventName": "EXT_MEM_REQ", 15 + "BriefDescription": "External memory request" 16 + }, 17 + {, 18 + "EventCode": "0xC1", 19 + "EventName": "EXT_MEM_REQ_NC", 20 + "BriefDescription": "Non-cacheable external memory request" 21 + } 22 + ]
+27
tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json
··· 1 + [ 2 + {, 3 + "EventCode": "0xC2", 4 + "EventName": "PREFETCH_LINEFILL", 5 + "BriefDescription": "Linefill because of prefetch" 6 + }, 7 + {, 8 + "EventCode": "0xC3", 9 + "EventName": "PREFETCH_LINEFILL_DROP", 10 + "BriefDescription": "Instruction Cache Throttle occurred" 11 + }, 12 + {, 13 + "EventCode": "0xC4", 14 + "EventName": "READ_ALLOC_ENTER", 15 + "BriefDescription": "Entering read allocate mode" 16 + }, 17 + {, 18 + "EventCode": "0xC5", 19 + "EventName": "READ_ALLOC", 20 + "BriefDescription": "Read allocate mode" 21 + }, 22 + {, 23 + "EventCode": "0xC8", 24 + "EventName": "EXT_SNOOP", 25 + "BriefDescription": "SCU Snooped data from another CPU for this CPU" 26 + } 27 + ]
+22
tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json
··· 1 + [ 2 + {, 3 + "EventCode": "0x60", 4 + "EventName": "BUS_ACCESS_LD", 5 + "BriefDescription": "Bus access - Read" 6 + }, 7 + {, 8 + "EventCode": "0x61", 9 + "EventName": "BUS_ACCESS_ST", 10 + "BriefDescription": "Bus access - Write" 11 + }, 12 + {, 13 + "EventCode": "0xC0", 14 + "EventName": "EXT_MEM_REQ", 15 + "BriefDescription": "External memory request" 16 + }, 17 + {, 18 + "EventCode": "0xC1", 19 + "EventName": "EXT_MEM_REQ_NC", 20 + "BriefDescription": "Non-cacheable external memory request" 21 + } 22 + ]
+32
tools/perf/pmu-events/arch/arm64/cortex-a53/other.json
··· 1 + [ 2 + {, 3 + "EventCode": "0x86", 4 + "EventName": "EXC_IRQ", 5 + "BriefDescription": "Exception taken, IRQ" 6 + }, 7 + {, 8 + "EventCode": "0x87", 9 + "EventName": "EXC_FIQ", 10 + "BriefDescription": "Exception taken, FIQ" 11 + }, 12 + {, 13 + "EventCode": "0xC6", 14 + "EventName": "PRE_DECODE_ERR", 15 + "BriefDescription": "Pre-decode error" 16 + }, 17 + {, 18 + "EventCode": "0xD0", 19 + "EventName": "L1I_CACHE_ERR", 20 + "BriefDescription": "L1 Instruction Cache (data or tag) memory error" 21 + }, 22 + {, 23 + "EventCode": "0xD1", 24 + "EventName": "L1D_CACHE_ERR", 25 + "BriefDescription": "L1 Data Cache (data, tag or dirty) memory error, correctable or non-correctable" 26 + }, 27 + {, 28 + "EventCode": "0xD2", 29 + "EventName": "TLB_ERR", 30 + "BriefDescription": "TLB memory error" 31 + } 32 + ]
+52
tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json
··· 1 + [ 2 + {, 3 + "EventCode": "0xC7", 4 + "EventName": "STALL_SB_FULL", 5 + "BriefDescription": "Data Write operation that stalls the pipeline because the store buffer is full" 6 + }, 7 + {, 8 + "EventCode": "0xE0", 9 + "EventName": "OTHER_IQ_DEP_STALL", 10 + "BriefDescription": "Cycles that the DPU IQ is empty and that is not because of a recent micro-TLB miss, instruction cache miss or pre-decode error" 11 + }, 12 + {, 13 + "EventCode": "0xE1", 14 + "EventName": "IC_DEP_STALL", 15 + "BriefDescription": "Cycles the DPU IQ is empty and there is an instruction cache miss being processed" 16 + }, 17 + {, 18 + "EventCode": "0xE2", 19 + "EventName": "IUTLB_DEP_STALL", 20 + "BriefDescription": "Cycles the DPU IQ is empty and there is an instruction micro-TLB miss being processed" 21 + }, 22 + {, 23 + "EventCode": "0xE3", 24 + "EventName": "DECODE_DEP_STALL", 25 + "BriefDescription": "Cycles the DPU IQ is empty and there is a pre-decode error being processed" 26 + }, 27 + {, 28 + "EventCode": "0xE4", 29 + "EventName": "OTHER_INTERLOCK_STALL", 30 + "BriefDescription": "Cycles there is an interlock other than Advanced SIMD/Floating-point instructions or load/store instruction" 31 + }, 32 + {, 33 + "EventCode": "0xE5", 34 + "EventName": "AGU_DEP_STALL", 35 + "BriefDescription": "Cycles there is an interlock for a load/store instruction waiting for data to calculate the address in the AGU" 36 + }, 37 + {, 38 + "EventCode": "0xE6", 39 + "EventName": "SIMD_DEP_STALL", 40 + "BriefDescription": "Cycles there is an interlock for an Advanced SIMD/Floating-point operation." 41 + }, 42 + {, 43 + "EventCode": "0xE7", 44 + "EventName": "LD_DEP_STALL", 45 + "BriefDescription": "Cycles there is a stall in the Wr stage because of a load miss" 46 + }, 47 + {, 48 + "EventCode": "0xE8", 49 + "EventName": "ST_DEP_STALL", 50 + "BriefDescription": "Cycles there is a stall in the Wr stage because of a store" 51 + } 52 + ]
+1
tools/perf/pmu-events/arch/arm64/mapfile.csv
··· 13 13 # 14 14 #Family-model,Version,Filename,EventType 15 15 0x00000000420f5160,v1,cavium,core 16 + 0x00000000410fd03[[:xdigit:]],v1,cortex-a53,core
+5 -2
tools/perf/tests/backward-ring-buffer.c
··· 31 31 int i; 32 32 33 33 for (i = 0; i < evlist->nr_mmaps; i++) { 34 + struct perf_mmap *map = &evlist->overwrite_mmap[i]; 34 35 union perf_event *event; 36 + u64 start, end; 35 37 36 - perf_mmap__read_catchup(&evlist->overwrite_mmap[i]); 37 - while ((event = perf_mmap__read_backward(&evlist->overwrite_mmap[i])) != NULL) { 38 + perf_mmap__read_init(map, true, &start, &end); 39 + while ((event = perf_mmap__read_event(map, true, &start, end)) != NULL) { 38 40 const u32 type = event->header.type; 39 41 40 42 switch (type) { ··· 51 49 return TEST_FAIL; 52 50 } 53 51 } 52 + perf_mmap__read_done(map); 54 53 } 55 54 return TEST_OK; 56 55 }
+17 -4
tools/perf/tests/shell/trace+probe_libc_inet_pton.sh
··· 22 22 expected[4]="rtt min.*" 23 23 expected[5]="[0-9]+\.[0-9]+[[:space:]]+probe_libc:inet_pton:\([[:xdigit:]]+\)" 24 24 expected[6]=".*inet_pton[[:space:]]\($libc\)$" 25 - expected[7]="getaddrinfo[[:space:]]\($libc\)$" 26 - expected[8]=".*\(.*/bin/ping.*\)$" 25 + case "$(uname -m)" in 26 + s390x) 27 + eventattr='call-graph=dwarf' 28 + expected[7]="gaih_inet[[:space:]]\(inlined\)$" 29 + expected[8]="__GI_getaddrinfo[[:space:]]\(inlined\)$" 30 + expected[9]="main[[:space:]]\(.*/bin/ping.*\)$" 31 + expected[10]="__libc_start_main[[:space:]]\($libc\)$" 32 + expected[11]="_start[[:space:]]\(.*/bin/ping.*\)$" 33 + ;; 34 + *) 35 + eventattr='max-stack=3' 36 + expected[7]="getaddrinfo[[:space:]]\($libc\)$" 37 + expected[8]=".*\(.*/bin/ping.*\)$" 38 + ;; 39 + esac 27 40 28 - perf trace --no-syscalls -e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do 41 + perf trace --no-syscalls -e probe_libc:inet_pton/$eventattr/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do 29 42 echo $line 30 43 echo "$line" | egrep -q "${expected[$idx]}" 31 44 if [ $? -ne 0 ] ; then ··· 46 33 exit 1 47 34 fi 48 35 let idx+=1 49 - [ $idx -eq 9 ] && break 36 + [ -z "${expected[$idx]}" ] && break 50 37 done 51 38 } 52 39
+25 -13
tools/perf/ui/browsers/hists.c
··· 608 608 return browser->title ? browser->title(browser, bf, size) : 0; 609 609 } 610 610 611 - int hist_browser__run(struct hist_browser *browser, const char *help) 611 + int hist_browser__run(struct hist_browser *browser, const char *help, 612 + bool warn_lost_event) 612 613 { 613 614 int key; 614 615 char title[160]; ··· 639 638 nr_entries = hist_browser__nr_entries(browser); 640 639 ui_browser__update_nr_entries(&browser->b, nr_entries); 641 640 642 - if (browser->hists->stats.nr_lost_warned != 643 - browser->hists->stats.nr_events[PERF_RECORD_LOST]) { 641 + if (warn_lost_event && 642 + (browser->hists->stats.nr_lost_warned != 643 + browser->hists->stats.nr_events[PERF_RECORD_LOST])) { 644 644 browser->hists->stats.nr_lost_warned = 645 645 browser->hists->stats.nr_events[PERF_RECORD_LOST]; 646 646 ui_browser__warn_lost_events(&browser->b); ··· 2765 2763 bool left_exits, 2766 2764 struct hist_browser_timer *hbt, 2767 2765 float min_pcnt, 2768 - struct perf_env *env) 2766 + struct perf_env *env, 2767 + bool warn_lost_event) 2769 2768 { 2770 2769 struct hists *hists = evsel__hists(evsel); 2771 2770 struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env); ··· 2847 2844 2848 2845 nr_options = 0; 2849 2846 2850 - key = hist_browser__run(browser, helpline); 2847 + key = hist_browser__run(browser, helpline, 2848 + warn_lost_event); 2851 2849 2852 2850 if (browser->he_selection != NULL) { 2853 2851 thread = hist_browser__selected_thread(browser); ··· 3188 3184 3189 3185 static int perf_evsel_menu__run(struct perf_evsel_menu *menu, 3190 3186 int nr_events, const char *help, 3191 - struct hist_browser_timer *hbt) 3187 + struct hist_browser_timer *hbt, 3188 + bool warn_lost_event) 3192 3189 { 3193 3190 struct perf_evlist *evlist = menu->b.priv; 3194 3191 struct perf_evsel *pos; ··· 3208 3203 case K_TIMER: 3209 3204 hbt->timer(hbt->arg); 3210 3205 3211 - if (!menu->lost_events_warned && menu->lost_events) { 3206 + if (!menu->lost_events_warned && 3207 + menu->lost_events && 3208 + warn_lost_event) { 3212 3209 ui_browser__warn_lost_events(&menu->b); 3213 3210 menu->lost_events_warned = true; 3214 3211 } ··· 3231 3224 key = perf_evsel__hists_browse(pos, nr_events, help, 3232 3225 true, hbt, 3233 3226 menu->min_pcnt, 3234 - menu->env); 3227 + menu->env, 3228 + warn_lost_event); 3235 3229 ui_browser__show_title(&menu->b, title); 3236 3230 switch (key) { 3237 3231 case K_TAB: ··· 3290 3282 int nr_entries, const char *help, 3291 3283 struct hist_browser_timer *hbt, 3292 3284 float min_pcnt, 3293 - struct perf_env *env) 3285 + struct perf_env *env, 3286 + bool warn_lost_event) 3294 3287 { 3295 3288 struct perf_evsel *pos; 3296 3289 struct perf_evsel_menu menu = { ··· 3318 3309 menu.b.width = line_len; 3319 3310 } 3320 3311 3321 - return perf_evsel_menu__run(&menu, nr_entries, help, hbt); 3312 + return perf_evsel_menu__run(&menu, nr_entries, help, 3313 + hbt, warn_lost_event); 3322 3314 } 3323 3315 3324 3316 int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, 3325 3317 struct hist_browser_timer *hbt, 3326 3318 float min_pcnt, 3327 - struct perf_env *env) 3319 + struct perf_env *env, 3320 + bool warn_lost_event) 3328 3321 { 3329 3322 int nr_entries = evlist->nr_entries; 3330 3323 ··· 3336 3325 3337 3326 return perf_evsel__hists_browse(first, nr_entries, help, 3338 3327 false, hbt, min_pcnt, 3339 - env); 3328 + env, warn_lost_event); 3340 3329 } 3341 3330 3342 3331 if (symbol_conf.event_group) { ··· 3353 3342 } 3354 3343 3355 3344 return __perf_evlist__tui_browse_hists(evlist, nr_entries, help, 3356 - hbt, min_pcnt, env); 3345 + hbt, min_pcnt, env, 3346 + warn_lost_event); 3357 3347 }
+2 -1
tools/perf/ui/browsers/hists.h
··· 28 28 29 29 struct hist_browser *hist_browser__new(struct hists *hists); 30 30 void hist_browser__delete(struct hist_browser *browser); 31 - int hist_browser__run(struct hist_browser *browser, const char *help); 31 + int hist_browser__run(struct hist_browser *browser, const char *help, 32 + bool warn_lost_event); 32 33 void hist_browser__init(struct hist_browser *browser, 33 34 struct hists *hists); 34 35 #endif /* _PERF_UI_BROWSER_HISTS_H_ */
-17
tools/perf/util/evlist.c
··· 715 715 return perf_mmap__read_forward(md); 716 716 } 717 717 718 - union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist, int idx) 719 - { 720 - struct perf_mmap *md = &evlist->mmap[idx]; 721 - 722 - /* 723 - * No need to check messup for backward ring buffer: 724 - * We can always read arbitrary long data from a backward 725 - * ring buffer unless we forget to pause it before reading. 726 - */ 727 - return perf_mmap__read_backward(md); 728 - } 729 - 730 718 union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx) 731 719 { 732 720 return perf_evlist__mmap_read_forward(evlist, idx); 733 - } 734 - 735 - void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx) 736 - { 737 - perf_mmap__read_catchup(&evlist->mmap[idx]); 738 721 } 739 722 740 723 void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx)
-4
tools/perf/util/evlist.h
··· 133 133 134 134 union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, 135 135 int idx); 136 - union perf_event *perf_evlist__mmap_read_backward(struct perf_evlist *evlist, 137 - int idx); 138 - void perf_evlist__mmap_read_catchup(struct perf_evlist *evlist, int idx); 139 - 140 136 void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx); 141 137 142 138 int perf_evlist__open(struct perf_evlist *evlist);
+1 -11
tools/perf/util/evsel.c
··· 41 41 42 42 #include "sane_ctype.h" 43 43 44 - static struct { 45 - bool sample_id_all; 46 - bool exclude_guest; 47 - bool mmap2; 48 - bool cloexec; 49 - bool clockid; 50 - bool clockid_wrong; 51 - bool lbr_flags; 52 - bool write_backward; 53 - bool group_read; 54 - } perf_missing_features; 44 + struct perf_missing_features perf_missing_features; 55 45 56 46 static clockid_t clockid; 57 47
+14
tools/perf/util/evsel.h
··· 149 149 u32 val32[2]; 150 150 }; 151 151 152 + struct perf_missing_features { 153 + bool sample_id_all; 154 + bool exclude_guest; 155 + bool mmap2; 156 + bool cloexec; 157 + bool clockid; 158 + bool clockid_wrong; 159 + bool lbr_flags; 160 + bool write_backward; 161 + bool group_read; 162 + }; 163 + 164 + extern struct perf_missing_features perf_missing_features; 165 + 152 166 struct cpu_map; 153 167 struct target; 154 168 struct thread_map;
+4 -2
tools/perf/util/hist.h
··· 430 430 int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, 431 431 struct hist_browser_timer *hbt, 432 432 float min_pcnt, 433 - struct perf_env *env); 433 + struct perf_env *env, 434 + bool warn_lost_event); 434 435 int script_browse(const char *script_opt); 435 436 #else 436 437 static inline ··· 439 438 const char *help __maybe_unused, 440 439 struct hist_browser_timer *hbt __maybe_unused, 441 440 float min_pcnt __maybe_unused, 442 - struct perf_env *env __maybe_unused) 441 + struct perf_env *env __maybe_unused, 442 + bool warn_lost_event __maybe_unused) 443 443 { 444 444 return 0; 445 445 }
+80 -61
tools/perf/util/mmap.c
··· 22 22 23 23 /* When check_messup is true, 'end' must points to a good entry */ 24 24 static union perf_event *perf_mmap__read(struct perf_mmap *map, 25 - u64 start, u64 end, u64 *prev) 25 + u64 *startp, u64 end) 26 26 { 27 27 unsigned char *data = map->base + page_size; 28 28 union perf_event *event = NULL; 29 - int diff = end - start; 29 + int diff = end - *startp; 30 30 31 31 if (diff >= (int)sizeof(event->header)) { 32 32 size_t size; 33 33 34 - event = (union perf_event *)&data[start & map->mask]; 34 + event = (union perf_event *)&data[*startp & map->mask]; 35 35 size = event->header.size; 36 36 37 - if (size < sizeof(event->header) || diff < (int)size) { 38 - event = NULL; 39 - goto broken_event; 40 - } 37 + if (size < sizeof(event->header) || diff < (int)size) 38 + return NULL; 41 39 42 40 /* 43 41 * Event straddles the mmap boundary -- header should always 44 42 * be inside due to u64 alignment of output. 45 43 */ 46 - if ((start & map->mask) + size != ((start + size) & map->mask)) { 47 - unsigned int offset = start; 44 + if ((*startp & map->mask) + size != ((*startp + size) & map->mask)) { 45 + unsigned int offset = *startp; 48 46 unsigned int len = min(sizeof(*event), size), cpy; 49 47 void *dst = map->event_copy; 50 48 ··· 57 59 event = (union perf_event *)map->event_copy; 58 60 } 59 61 60 - start += size; 62 + *startp += size; 61 63 } 62 - 63 - broken_event: 64 - if (prev) 65 - *prev = start; 66 64 67 65 return event; 68 66 } 69 67 68 + /* 69 + * legacy interface for mmap read. 70 + * Don't use it. Use perf_mmap__read_event(). 71 + */ 70 72 union perf_event *perf_mmap__read_forward(struct perf_mmap *map) 71 73 { 72 74 u64 head; 73 - u64 old = map->prev; 74 75 75 76 /* 76 77 * Check if event was unmapped due to a POLLHUP/POLLERR. ··· 79 82 80 83 head = perf_mmap__read_head(map); 81 84 82 - return perf_mmap__read(map, old, head, &map->prev); 85 + return perf_mmap__read(map, &map->prev, head); 83 86 } 84 87 85 - union perf_event *perf_mmap__read_backward(struct perf_mmap *map) 88 + /* 89 + * Read event from ring buffer one by one. 90 + * Return one event for each call. 91 + * 92 + * Usage: 93 + * perf_mmap__read_init() 94 + * while(event = perf_mmap__read_event()) { 95 + * //process the event 96 + * perf_mmap__consume() 97 + * } 98 + * perf_mmap__read_done() 99 + */ 100 + union perf_event *perf_mmap__read_event(struct perf_mmap *map, 101 + bool overwrite, 102 + u64 *startp, u64 end) 86 103 { 87 - u64 head, end; 88 - u64 start = map->prev; 104 + union perf_event *event; 89 105 90 106 /* 91 107 * Check if event was unmapped due to a POLLHUP/POLLERR. ··· 106 96 if (!refcount_read(&map->refcnt)) 107 97 return NULL; 108 98 109 - head = perf_mmap__read_head(map); 110 - if (!head) 99 + if (startp == NULL) 111 100 return NULL; 112 101 113 - /* 114 - * 'head' pointer starts from 0. Kernel minus sizeof(record) form 115 - * it each time when kernel writes to it, so in fact 'head' is 116 - * negative. 'end' pointer is made manually by adding the size of 117 - * the ring buffer to 'head' pointer, means the validate data can 118 - * read is the whole ring buffer. If 'end' is positive, the ring 119 - * buffer has not fully filled, so we must adjust 'end' to 0. 120 - * 121 - * However, since both 'head' and 'end' is unsigned, we can't 122 - * simply compare 'end' against 0. Here we compare '-head' and 123 - * the size of the ring buffer, where -head is the number of bytes 124 - * kernel write to the ring buffer. 125 - */ 126 - if (-head < (u64)(map->mask + 1)) 127 - end = 0; 128 - else 129 - end = head + map->mask + 1; 102 + /* non-overwirte doesn't pause the ringbuffer */ 103 + if (!overwrite) 104 + end = perf_mmap__read_head(map); 130 105 131 - return perf_mmap__read(map, start, end, &map->prev); 132 - } 106 + event = perf_mmap__read(map, startp, end); 133 107 134 - void perf_mmap__read_catchup(struct perf_mmap *map) 135 - { 136 - u64 head; 108 + if (!overwrite) 109 + map->prev = *startp; 137 110 138 - if (!refcount_read(&map->refcnt)) 139 - return; 140 - 141 - head = perf_mmap__read_head(map); 142 - map->prev = head; 111 + return event; 143 112 } 144 113 145 114 static bool perf_mmap__empty(struct perf_mmap *map) ··· 256 267 return -1; 257 268 } 258 269 259 - int perf_mmap__push(struct perf_mmap *md, bool overwrite, 260 - void *to, int push(void *to, void *buf, size_t size)) 270 + /* 271 + * Report the start and end of the available data in ringbuffer 272 + */ 273 + int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, 274 + u64 *startp, u64 *endp) 261 275 { 262 276 u64 head = perf_mmap__read_head(md); 263 277 u64 old = md->prev; 264 - u64 end = head, start = old; 265 278 unsigned char *data = md->base + page_size; 266 279 unsigned long size; 267 - void *buf; 268 - int rc = 0; 269 280 270 - start = overwrite ? head : old; 271 - end = overwrite ? old : head; 281 + *startp = overwrite ? head : old; 282 + *endp = overwrite ? old : head; 272 283 273 - if (start == end) 274 - return 0; 284 + if (*startp == *endp) 285 + return -EAGAIN; 275 286 276 - size = end - start; 287 + size = *endp - *startp; 277 288 if (size > (unsigned long)(md->mask) + 1) { 278 289 if (!overwrite) { 279 290 WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); 280 291 281 292 md->prev = head; 282 293 perf_mmap__consume(md, overwrite); 283 - return 0; 294 + return -EAGAIN; 284 295 } 285 296 286 297 /* 287 298 * Backward ring buffer is full. We still have a chance to read 288 299 * most of data from it. 289 300 */ 290 - if (overwrite_rb_find_range(data, md->mask, head, &start, &end)) 291 - return -1; 301 + if (overwrite_rb_find_range(data, md->mask, head, startp, endp)) 302 + return -EINVAL; 292 303 } 304 + 305 + return 0; 306 + } 307 + 308 + int perf_mmap__push(struct perf_mmap *md, bool overwrite, 309 + void *to, int push(void *to, void *buf, size_t size)) 310 + { 311 + u64 head = perf_mmap__read_head(md); 312 + u64 end, start; 313 + unsigned char *data = md->base + page_size; 314 + unsigned long size; 315 + void *buf; 316 + int rc = 0; 317 + 318 + rc = perf_mmap__read_init(md, overwrite, &start, &end); 319 + if (rc < 0) 320 + return (rc == -EAGAIN) ? 0 : -1; 321 + 322 + size = end - start; 293 323 294 324 if ((start & md->mask) + size != (end & md->mask)) { 295 325 buf = &data[start & md->mask]; ··· 334 326 perf_mmap__consume(md, overwrite); 335 327 out: 336 328 return rc; 329 + } 330 + 331 + /* 332 + * Mandatory for overwrite mode 333 + * The direction of overwrite mode is backward. 334 + * The last perf_mmap__read() will set tail to map->prev. 335 + * Need to correct the map->prev to head which is the end of next read. 336 + */ 337 + void perf_mmap__read_done(struct perf_mmap *map) 338 + { 339 + map->prev = perf_mmap__read_head(map); 337 340 }
+7 -3
tools/perf/util/mmap.h
··· 65 65 66 66 void perf_mmap__consume(struct perf_mmap *map, bool overwrite); 67 67 68 - void perf_mmap__read_catchup(struct perf_mmap *md); 69 - 70 68 static inline u64 perf_mmap__read_head(struct perf_mmap *mm) 71 69 { 72 70 struct perf_event_mmap_page *pc = mm->base; ··· 85 87 } 86 88 87 89 union perf_event *perf_mmap__read_forward(struct perf_mmap *map); 88 - union perf_event *perf_mmap__read_backward(struct perf_mmap *map); 90 + 91 + union perf_event *perf_mmap__read_event(struct perf_mmap *map, 92 + bool overwrite, 93 + u64 *startp, u64 end); 89 94 90 95 int perf_mmap__push(struct perf_mmap *md, bool backward, 91 96 void *to, int push(void *to, void *buf, size_t size)); 92 97 93 98 size_t perf_mmap__mmap_len(struct perf_mmap *map); 94 99 100 + int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, 101 + u64 *startp, u64 *endp); 102 + void perf_mmap__read_done(struct perf_mmap *map); 95 103 #endif /*__PERF_MMAP_H */
+2 -22
tools/perf/util/util.c
··· 340 340 return n; 341 341 } 342 342 343 - static int hex(char ch) 344 - { 345 - if ((ch >= '0') && (ch <= '9')) 346 - return ch - '0'; 347 - if ((ch >= 'a') && (ch <= 'f')) 348 - return ch - 'a' + 10; 349 - if ((ch >= 'A') && (ch <= 'F')) 350 - return ch - 'A' + 10; 351 - return -1; 352 - } 353 - 354 343 /* 355 344 * While we find nice hex chars, build a long_val. 356 345 * Return number of chars processed. 357 346 */ 358 347 int hex2u64(const char *ptr, u64 *long_val) 359 348 { 360 - const char *p = ptr; 361 - *long_val = 0; 349 + char *p; 362 350 363 - while (*p) { 364 - const int hex_val = hex(*p); 365 - 366 - if (hex_val < 0) 367 - break; 368 - 369 - *long_val = (*long_val << 4) | hex_val; 370 - p++; 371 - } 351 + *long_val = strtoull(ptr, &p, 16); 372 352 373 353 return p - ptr; 374 354 }