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

perf hists browser: Allow passing an initial hotkey

Sometimes we're in an outer code, like the main hists browser popup menu
and the user follows a suggestion about using some hotkey, and that
hotkey is really handled by hists_browser__run(), so allow for calling
it with that hotkey, making it handle it instead of waiting for the user
to press one.

Reviewed-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lkml.kernel.org/n/tip-xv2l7i6o4urn37nv1h40ryfs@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

+83 -78
+2 -2
tools/perf/builtin-c2c.c
··· 2384 2384 c2c_browser__update_nr_entries(browser); 2385 2385 2386 2386 while (1) { 2387 - key = hist_browser__run(browser, "? - help", true); 2387 + key = hist_browser__run(browser, "? - help", true, 0); 2388 2388 2389 2389 switch (key) { 2390 2390 case 's': ··· 2453 2453 c2c_browser__update_nr_entries(browser); 2454 2454 2455 2455 while (1) { 2456 - key = hist_browser__run(browser, "? - help", true); 2456 + key = hist_browser__run(browser, "? - help", true, 0); 2457 2457 2458 2458 switch (key) { 2459 2459 case 'q':
+80 -75
tools/perf/ui/browsers/hists.c
··· 672 672 return browser->title ? browser->title(browser, bf, size) : 0; 673 673 } 674 674 675 - int hist_browser__run(struct hist_browser *browser, const char *help, 676 - bool warn_lost_event) 675 + static int hist_browser__handle_hotkey(struct hist_browser *browser, bool warn_lost_event, char *title, int key) 677 676 { 678 - int key; 677 + switch (key) { 678 + case K_TIMER: { 679 + struct hist_browser_timer *hbt = browser->hbt; 680 + u64 nr_entries; 681 + 682 + WARN_ON_ONCE(!hbt); 683 + 684 + if (hbt) 685 + hbt->timer(hbt->arg); 686 + 687 + if (hist_browser__has_filter(browser) || symbol_conf.report_hierarchy) 688 + hist_browser__update_nr_entries(browser); 689 + 690 + nr_entries = hist_browser__nr_entries(browser); 691 + ui_browser__update_nr_entries(&browser->b, nr_entries); 692 + 693 + if (warn_lost_event && 694 + (browser->hists->stats.nr_lost_warned != 695 + browser->hists->stats.nr_events[PERF_RECORD_LOST])) { 696 + browser->hists->stats.nr_lost_warned = 697 + browser->hists->stats.nr_events[PERF_RECORD_LOST]; 698 + ui_browser__warn_lost_events(&browser->b); 699 + } 700 + 701 + hist_browser__title(browser, title, sizeof(title)); 702 + ui_browser__show_title(&browser->b, title); 703 + break; 704 + } 705 + case 'D': { /* Debug */ 706 + struct hist_entry *h = rb_entry(browser->b.top, struct hist_entry, rb_node); 707 + static int seq; 708 + 709 + ui_helpline__pop(); 710 + ui_helpline__fpush("%d: nr_ent=(%d,%d), etl: %d, rows=%d, idx=%d, fve: idx=%d, row_off=%d, nrows=%d", 711 + seq++, browser->b.nr_entries, browser->hists->nr_entries, 712 + browser->b.extra_title_lines, browser->b.rows, 713 + browser->b.index, browser->b.top_idx, h->row_offset, h->nr_rows); 714 + } 715 + break; 716 + case 'C': 717 + /* Collapse the whole world. */ 718 + hist_browser__set_folding(browser, false); 719 + break; 720 + case 'c': 721 + /* Collapse the selected entry. */ 722 + hist_browser__set_folding_selected(browser, false); 723 + break; 724 + case 'E': 725 + /* Expand the whole world. */ 726 + hist_browser__set_folding(browser, true); 727 + break; 728 + case 'e': 729 + /* Expand the selected entry. */ 730 + hist_browser__set_folding_selected(browser, true); 731 + break; 732 + case 'H': 733 + browser->show_headers = !browser->show_headers; 734 + hist_browser__update_rows(browser); 735 + break; 736 + case '+': 737 + if (hist_browser__toggle_fold(browser)) 738 + break; 739 + /* fall thru */ 740 + default: 741 + return -1; 742 + } 743 + 744 + return 0; 745 + } 746 + 747 + int hist_browser__run(struct hist_browser *browser, const char *help, 748 + bool warn_lost_event, int key) 749 + { 679 750 char title[160]; 680 751 struct hist_browser_timer *hbt = browser->hbt; 681 752 int delay_secs = hbt ? hbt->refresh : 0; ··· 759 688 if (ui_browser__show(&browser->b, title, "%s", help) < 0) 760 689 return -1; 761 690 691 + if (key && hist_browser__handle_hotkey(browser, warn_lost_event, title, key)) 692 + goto out; 693 + 762 694 while (1) { 763 695 key = ui_browser__run(&browser->b, delay_secs); 764 696 765 - switch (key) { 766 - case K_TIMER: { 767 - u64 nr_entries; 768 - 769 - WARN_ON_ONCE(!hbt); 770 - 771 - if (hbt) 772 - hbt->timer(hbt->arg); 773 - 774 - if (hist_browser__has_filter(browser) || 775 - symbol_conf.report_hierarchy) 776 - hist_browser__update_nr_entries(browser); 777 - 778 - nr_entries = hist_browser__nr_entries(browser); 779 - ui_browser__update_nr_entries(&browser->b, nr_entries); 780 - 781 - if (warn_lost_event && 782 - (browser->hists->stats.nr_lost_warned != 783 - browser->hists->stats.nr_events[PERF_RECORD_LOST])) { 784 - browser->hists->stats.nr_lost_warned = 785 - browser->hists->stats.nr_events[PERF_RECORD_LOST]; 786 - ui_browser__warn_lost_events(&browser->b); 787 - } 788 - 789 - hist_browser__title(browser, title, sizeof(title)); 790 - ui_browser__show_title(&browser->b, title); 791 - continue; 792 - } 793 - case 'D': { /* Debug */ 794 - static int seq; 795 - struct hist_entry *h = rb_entry(browser->b.top, 796 - struct hist_entry, rb_node); 797 - ui_helpline__pop(); 798 - ui_helpline__fpush("%d: nr_ent=(%d,%d), etl: %d, rows=%d, idx=%d, fve: idx=%d, row_off=%d, nrows=%d", 799 - seq++, browser->b.nr_entries, 800 - browser->hists->nr_entries, 801 - browser->b.extra_title_lines, 802 - browser->b.rows, 803 - browser->b.index, 804 - browser->b.top_idx, 805 - h->row_offset, h->nr_rows); 806 - } 697 + if (hist_browser__handle_hotkey(browser, warn_lost_event, title, key)) 807 698 break; 808 - case 'C': 809 - /* Collapse the whole world. */ 810 - hist_browser__set_folding(browser, false); 811 - break; 812 - case 'c': 813 - /* Collapse the selected entry. */ 814 - hist_browser__set_folding_selected(browser, false); 815 - break; 816 - case 'E': 817 - /* Expand the whole world. */ 818 - hist_browser__set_folding(browser, true); 819 - break; 820 - case 'e': 821 - /* Expand the selected entry. */ 822 - hist_browser__set_folding_selected(browser, true); 823 - break; 824 - case 'H': 825 - browser->show_headers = !browser->show_headers; 826 - hist_browser__update_rows(browser); 827 - break; 828 - case '+': 829 - if (hist_browser__toggle_fold(browser)) 830 - break; 831 - /* fall thru */ 832 - default: 833 - goto out; 834 - } 835 699 } 836 700 out: 837 701 ui_browser__hide(&browser->b); ··· 3000 2994 3001 2995 nr_options = 0; 3002 2996 3003 - key = hist_browser__run(browser, helpline, 3004 - warn_lost_event); 2997 + key = hist_browser__run(browser, helpline, warn_lost_event, 0); 3005 2998 3006 2999 if (browser->he_selection != NULL) { 3007 3000 thread = hist_browser__selected_thread(browser); ··· 3578 3573 memset(&action, 0, sizeof(action)); 3579 3574 3580 3575 while (1) { 3581 - key = hist_browser__run(browser, "? - help", true); 3576 + key = hist_browser__run(browser, "? - help", true, 0); 3582 3577 3583 3578 switch (key) { 3584 3579 case 'q':
+1 -1
tools/perf/ui/browsers/hists.h
··· 34 34 struct hist_browser *hist_browser__new(struct hists *hists); 35 35 void hist_browser__delete(struct hist_browser *browser); 36 36 int hist_browser__run(struct hist_browser *browser, const char *help, 37 - bool warn_lost_event); 37 + bool warn_lost_event, int key); 38 38 void hist_browser__init(struct hist_browser *browser, 39 39 struct hists *hists); 40 40 #endif /* _PERF_UI_BROWSER_HISTS_H_ */