From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753563AbcFUBc1 (ORCPT ); Mon, 20 Jun 2016 21:32:27 -0400 Received: from szxga01-in.huawei.com ([58.251.152.64]:15748 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751707AbcFUBcR (ORCPT ); Mon, 20 Jun 2016 21:32:17 -0400 Subject: Re: [PATCH v8 2/8] perf evlist: Introduce aux evlist To: Arnaldo Carvalho de Melo References: <1466419645-75551-1-git-send-email-wangnan0@huawei.com> <1466419645-75551-3-git-send-email-wangnan0@huawei.com> <20160620203622.GB8411@kernel.org> CC: , , He Kuang , Jiri Olsa , Masami Hiramatsu , Namhyung Kim , Zefan Li From: "Wangnan (F)" Message-ID: <576898E0.2060101@huawei.com> Date: Tue, 21 Jun 2016 09:31:12 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <20160620203622.GB8411@kernel.org> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090201.576898F3.002C,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 0c68944855224c9ce069ff41dbb0d328 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/6/21 4:36, Arnaldo Carvalho de Melo wrote: > Em Mon, Jun 20, 2016 at 10:47:19AM +0000, Wang Nan escreveu: >> An auxiliary evlist is created by perf_evlist__new_aux() using an >> existing evlist as its parent. An auxiliary evlist can have its own >> 'struct perf_mmap', but can't have any other data. User should use its >> parent instead when accessing other data. >> >> Auxiliary evlists are containers of 'struct perf_mmap'. It is introduced >> to allow its parent evlist to map different events into separated mmaps. >> >> Following commits create an auxiliary evlist for overwritable >> events, because overwritable events need a read only and backwards ring >> buffer, which is different from normal events. >> >> To achieve this goal, this patch carefully changes 'evlist' to >> 'evlist->parent' in all functions in the path of 'perf_evlist__mmap_ex', >> except 'evlist->mmap' related operations, to make sure all evlist >> modifications (like pollfd and event id hash tables) goes to original >> evlist. >> >> A 'evlist->parent' pointer is added to 'struct perf_evlist' and points to >> the evlist itself for normal evlists. >> >> Children of one evlist are linked into it so one can find all children >> from its parent. >> To avoid potential complexity, forbid creating aux evlist from another >> aux evlist. >> >> Improve perf_evlist__munmap_filtered(), so when recording, if an event >> is terminated, unmap mmaps, from parent and children. > >> Signed-off-by: Wang Nan >> Cc: He Kuang >> Cc: Jiri Olsa >> Cc: Masami Hiramatsu >> Cc: Namhyung Kim >> Cc: Zefan Li >> Cc: pi3orama@163.com >> --- >> tools/perf/util/evlist.c | 49 +++++++++++++++++++++++++++++++++++++----------- >> tools/perf/util/evlist.h | 12 ++++++++++++ >> 2 files changed, 50 insertions(+), 11 deletions(-) [SNIP] >> diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h >> index 68cb136..5b50692 100644 >> --- a/tools/perf/util/evlist.h >> +++ b/tools/perf/util/evlist.h >> @@ -37,6 +37,10 @@ struct perf_mmap { >> >> struct perf_evlist { >> struct list_head entries; >> + union { >> + struct list_head children; >> + struct list_head list; > This is something new, right, i.e. having a list of evlists from a > parent evlist, one where there can be at most one level, i.e. no > grandchildrens... > > Is this strictly needed? I.e. the existing code calling > perf_evlist__munmap_filtered() has just the parent pointer and thus, to > not change it we need to have a way to go the children? > > Also, can you se a parent with more than one child? If we further restrict aux evlist and parent list, allow only one aux evlist for a parent, we can avoid the linked list. Simply linking parent and child using pointers would be enough. However, I plan to introduce multiple children for a parent. There are two possible aux evlists: 1. Trigger aux evlist: we can use BPF script to measure events, and do something (dumpping, printing, computing, reporting...) when it detect something (for example, FPS drop to 10 frames/sec). We can create a bpf-output event and put it in a separated aux evlist with buffering turned off, so once BPF script generate a event perf receives it immediately. 2. Non-sampling aux evlist: we can use a dummy event to collect fork, comm and mmap{,2} events in a separated aux evlist. We can use this evlist to maintain system state during recording, so we can totally solve the problem describe in patch 8/8. Thank you.