Hi Peter, > On Sep 18, 2019, at 10:23 PM, Song Liu <songliubrav...@fb.com> wrote: > > This patch tries to enable PMU sharing. To make perf event scheduling > fast, we use special data structures. > > An array of "struct perf_event_dup" is added to the perf_event_context, > to remember all the duplicated events under this ctx. All the events > under this ctx has a "dup_id" pointing to its perf_event_dup. Compatible > events under the same ctx share the same perf_event_dup. The following > figure shows a simplified version of the data structure. > > ctx -> perf_event_dup -> master > ^ > | > perf_event /| > | > perf_event / > > Connection among perf_event and perf_event_dup are built when events are > added or removed from the ctx. So these are not on the critical path of > schedule or perf_rotate_context(). > > On the critical paths (add, del read), sharing PMU counters doesn't > increase the complexity. Helper functions event_pmu_[add|del|read]() are > introduced to cover these cases. All these functions have O(1) time > complexity. > > We allocate a separate perf_event for perf_event_dup->master. This needs > extra attention, because perf_event_alloc() may sleep. To allocate the > master event properly, a new pointer, tmp_master, is added to perf_event. > tmp_master carries a separate perf_event into list_[add|del]_event(). > The master event has valid ->ctx and holds ctx->refcount. > > Details about the handling of the master event is added to > include/linux/perf_event.h, before struct perf_event_dup.
Could you please share your comments/suggestions on this work? Thanks, Song