| 810 | } |
| 811 | |
| 812 | Error PerfEvents::start(Arguments& args) { |
| 813 | _event_type = PerfEventType::forName(args._event); |
| 814 | if (_event_type == NULL) { |
| 815 | return Error("Unsupported event type"); |
| 816 | } else if (_event_type->counter_arg > 4) { |
| 817 | return Error("Only arguments 1-4 can be counted"); |
| 818 | } |
| 819 | |
| 820 | if (!setupThreadHook()) { |
| 821 | return Error("Could not set pthread hook"); |
| 822 | } |
| 823 | |
| 824 | _target_cpu = args._target_cpu; |
| 825 | _record_cpu = args._record_cpu; |
| 826 | |
| 827 | if (args._interval < 0) { |
| 828 | return Error("interval must be positive"); |
| 829 | } |
| 830 | _interval = args._interval ? args._interval : _event_type->default_interval; |
| 831 | _cstack = args._cstack; |
| 832 | _signal = args._signal == 0 ? OS::getProfilingSignal(0) : args._signal & 0xff; |
| 833 | _count_overrun = false; |
| 834 | |
| 835 | _alluser = args._alluser; |
| 836 | _kernel_stack = !_alluser && _cstack != CSTACK_NO; |
| 837 | if (_kernel_stack && !Symbols::haveKernelSymbols()) { |
| 838 | Log::warn("Kernel symbols are unavailable due to restrictions. Try\n" |
| 839 | " sysctl kernel.perf_event_paranoid=1\n" |
| 840 | " sysctl kernel.kptr_restrict=0"); |
| 841 | _kernel_stack = false; |
| 842 | // Automatically switch on alluser for non-CPU events, if kernel profiling is unavailable |
| 843 | _alluser = strcmp(args._event, EVENT_CPU) != 0 && !supported(); |
| 844 | } |
| 845 | _use_perf_mmap = _kernel_stack || _cstack == CSTACK_DEFAULT || _record_cpu; |
| 846 | |
| 847 | if (strcmp(_event_type->name, "cpu-clock") == 0 && hasPerfEventRefreshBug()) { |
| 848 | Log::debug("Enable workaround for PERF_EVENT_IOC_REFRESH bug"); |
| 849 | _ioc_enable = PERF_EVENT_IOC_ENABLE; // opt-in for manual enable/disable |
| 850 | } else { |
| 851 | _ioc_enable = PERF_EVENT_IOC_REFRESH; // autodisable perf_event on counter overflow |
| 852 | } |
| 853 | |
| 854 | adjustFDLimit(); |
| 855 | |
| 856 | int max_events = OS::getMaxThreadId(); |
| 857 | if (max_events != _max_events) { |
| 858 | free(_events); |
| 859 | _events = (PerfEvent*)calloc(max_events, sizeof(PerfEvent)); |
| 860 | _max_events = max_events; |
| 861 | } |
| 862 | |
| 863 | if (VM::isOpenJ9()) { |
| 864 | OS::installSignalHandler(_signal, signalHandlerJ9); |
| 865 | Error error = J9StackTraces::start(args); |
| 866 | if (error) { |
| 867 | return error; |
| 868 | } |
| 869 | } else { |
nothing calls this directly
no test coverage detected