Function report |
Source Code:kernel\events\core.c |
Create Date:2022-07-28 13:40:44 |
Last Modify:2022-05-20 07:50:19 | Copyright©Brick |
home page | Tree |
Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:Allocate and initialize an event structure
Proto:static struct perf_event *perf_event_alloc(struct perf_event_attr *attr, int cpu, struct task_struct *task, struct perf_event *group_leader, struct perf_event *parent_event, perf_overflow_handler_t overflow_handler, void *context, int cgroup_fd)
Type:struct perf_event
Parameter:
Type | Parameter | Name |
---|---|---|
struct perf_event_attr * | attr | |
int | cpu | |
struct task_struct * | task | |
struct perf_event * | group_leader | |
struct perf_event * | parent_event | |
perf_overflow_handler_t | overflow_handler | |
void * | context | |
int | cgroup_fd |
10685 | If cpu >= Setup number of possible processor ids Then |
10690 | event = kzalloc - allocate memory. The memory is set to zero.*@size: how many bytes of memory are required.*@flags: the type of memory to allocate (see kmalloc). |
10698 | If Not group_leader Then group_leader = event |
10701 | mutex_init - initialize the mutex*@mutex: the mutex to be initialized* Initialize the mutex to unlocked state.* It is not allowed to initialize an already locked mutex.( & child_mutex) |
10702 | Initialization list head |
10704 | Initialization list head |
10705 | Initialization list head |
10706 | Initialization list head |
10708 | Initialization list head |
10709 | Initialization list head |
10710 | Initialization list head |
10711 | INIT_HLIST_NODE( & hlist_entry) |
10714 | init_waitqueue_head( & waitq) |
10715 | pending_disable = -1 |
10716 | init_irq_work( & pending, perf_pending_event) |
10718 | mutex_init - initialize the mutex*@mutex: the mutex to be initialized* Initialize the mutex to unlocked state.* It is not allowed to initialize an already locked mutex.( & mmap_mutex) |
10719 | raw_spin_lock_init( & lock) |
10721 | atomic_long_set( & refcount, 1) |
10724 | group_leader = group_leader |
10725 | pmu = NULL |
10726 | oncpu = -1 |
10728 | parent = parent_event |
10730 | ns = get_pid_ns(task_active_pid_ns(current process)) |
10731 | id = atomic64_inc_return( & perf_event_id) |
10733 | state = PERF_EVENT_STATE_INACTIVE |
10735 | If task Then |
10736 | attach_state = PERF_ATTACH_TASK |
10742 | target = get_task_struct(task) |
10745 | clock = local_clock |
10746 | If parent_event Then clock = clock |
10749 | If Not overflow_handler && parent_event Then |
10750 | overflow_handler = overflow_handler |
10751 | context = overflow_handler_context |
10764 | If overflow_handler Then |
10765 | overflow_handler = overflow_handler |
10766 | overflow_handler_context = context |
10767 | Else if is_write_backward(event) Then |
10769 | overflow_handler_context = NULL |
10770 | Else |
10772 | overflow_handler_context = NULL |
10777 | pmu = NULL |
10780 | sample_period = sample_period |
10781 | If use freq, not period && sample_freq Then sample_period = 1 |
10783 | last_period = sample_period |
10785 | local64_set( & period_left, sample_period) |
10791 | If children inherit it && sample_type & PERF_SAMPLE_READ Then Go to err_ns |
10794 | If Not has_branch_stack(event) Then branch_sample_type = 0 |
10797 | If cgroup_fd != -1 Then |
10798 | err = perf_cgroup_connect(cgroup_fd, event, attr, group_leader) |
10803 | pmu = perf_init_event(event) |
10813 | If task_ctx_nr == perf_invalid_context && cgroup_fd != -1 Then |
10818 | If aux_output && Not (various common per-pmu feature flags & PERF_PMU_CAP_AUX_OUTPUT) Then |
10820 | err = -EOPNOTSUPP |
10821 | Go to err_pmu |
10824 | err = The following implement mutual exclusion of events on "exclusive" pmus* (PERF_PMU_CAP_EXCLUSIVE) |
10828 | If has_addr_filter(event) Then |
10829 | addr_filter_ranges = kcalloc - allocate memory for an array. The memory is set to zero.*@n: number of elements.*@size: element size.*@flags: the type of memory to allocate (see kmalloc). |
10832 | If Not addr_filter_ranges Then |
10834 | Go to err_per_task |
10841 | If parent Then |
10842 | ifh = perf_event_addr_filters(event) |
10844 | raw_spin_lock_irq( & lock) |
10845 | No 3D Now!(addr_filter_ranges, addr_filter_ranges, umber of address filters this PMU can do * sizeof(structperf_addr_filter_range)) |
10848 | raw_spin_unlock_irq( & lock) |
10852 | addr_filters_gen = 1 |
10855 | If Not parent Then |
10856 | If sample_type & PERF_SAMPLE_CALLCHAIN Then |
10857 | err = get_callchain_buffers(sample_max_stack) |
10858 | If err Then Go to err_addr_filters |
10863 | err = security_perf_event_alloc(event) |
10864 | If err Then Go to err_callchain_buffer |
10868 | account_event(event) |
10870 | Return event |
10872 | err_callchain_buffer : |
10873 | If Not parent Then |
10874 | If sample_type & PERF_SAMPLE_CALLCHAIN Then put_callchain_buffers() |
10877 | err_addr_filters : |
10878 | kfree(addr_filter_ranges) |
10880 | err_per_task : |
10881 | exclusive_event_destroy(event) |
10883 | err_pmu : |
10886 | module_put(module) |
10887 | err_ns : |
10888 | If is_cgroup_event(event) Then perf_detach_cgroup(event) |
10890 | If ns Then put_pid_ns(ns) |
10892 | If target Then put_task_struct(target) |
Name | Describe |
---|---|
perf_event_create_kernel_counter | perf_event_create_kernel_counter*@attr: attributes of the counter to create*@cpu: cpu in which the counter is bound*@task: task to profile (NULL for percpu) |
inherit_event | Inherit an event from parent task to child task.* Returns:* - valid pointer on success* - NULL for orphaned events* - IS_ERR() on error |
Source code conversion tool public plug-in interface | X |
---|---|
Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |