lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Thu, 13 Aug 2020 15:21:23 +0800
From:   Like Xu <like.xu@...ux.intel.com>
To:     "Jin, Yao" <yao.jin@...ux.intel.com>,
        Arnaldo Carvalho de Melo <acme@...nel.org>
Cc:     jolsa@...nel.org, peterz@...radead.org, mingo@...hat.com,
        alexander.shishkin@...ux.intel.com, Linux-kernel@...r.kernel.org,
        ak@...ux.intel.com, kan.liang@...el.com, yao.jin@...el.com
Subject: Re: [PATCH] perf parse-events: Set exclude_guest for user-space
 counting

On 2020/8/13 15:08, Jin, Yao wrote:
> 
> 
> On 8/13/2020 2:57 PM, Like Xu wrote:
>> Hi Yao,
>>
>> On 2020/8/13 11:11, Jin, Yao wrote:
>>> Hi Like,
>>>
>>> On 8/12/2020 9:02 PM, Like Xu wrote:
>>>> On 2020/8/12 20:15, Arnaldo Carvalho de Melo wrote:
>>>>> Em Wed, Aug 12, 2020 at 02:59:53PM +0800, Jin Yao escreveu:
>>>>>> Currently if we run 'perf record -e cycles:u', exclude_guest is 0.
>>>>>>
>>>>>> But it doesn't make sense that we request for user-space counting
>>>>>> but we also get the guest report.
>>>>>>
>>>>
>>>> Please hold the horse and allow this possibility.
>>>>
>>>> Some authorized perf users on the host may
>>>> only want to count (KVM) guest user space events.
>>>>
>>>> Thanks,
>>>> Like Xu
>>>>
>>>
>>> Without this patch, if we don't set the ":u" modifier, exclude_guest = 1.
>>
>> It's true for the non ":u" case.
>>
>>>
>>> perf record -e cycles ./div
>>> perf evlist -v
>>> cycles: size: 120, { sample_period, sample_freq }: 4000, sample_type: 
>>> IP|TID|TIME|PERIOD, read_format: ID, disabled: 1, inherit: 1, mmap: 1, 
>>> comm: 1, freq: 1, enable_on_exec: 1, task: 1, sample_id_all: 1, 
>>> exclude_guest: 1, mmap2: 1, comm_exec: 1, ksymbol: 1, bpf_event: 1
>>>
>>> So this patch doesn't change perf's original behavior.
>>
>> The patch changes the "perf kvm" original behavior.
>>
>> Testcase: perf kvm --host --guest --guestkallsyms=guest-kallsyms \
>> --guestmodules=guest-modules record -e cycles:u ...
>>
>> From:
>>
>> cycles:u: size: 120, { sample_period, sample_freq }: 4000, sample_type: 
>> IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, inherit: 1, 
>> exclude_kernel: 1, exclude_hv: 1, freq: 1, sample_id_all: 1
>> dummy:HG: type: 1, size: 120, config: 0x9, { sample_period, sample_freq 
>> }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, 
>> inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, mmap2: 
>> 1, comm_exec: 1, ksymbol: 1, bpf_event: 1
>>
>> To:
>>
>> cycles:u: size: 120, { sample_period, sample_freq }: 4000, sample_type: 
>> IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, inherit: 1, 
>> exclude_kernel: 1, exclude_hv: 1, freq: 1, sample_id_all: 1,
>>
>> exclude_guest: 1
>>
>> dummy:HG: type: 1, size: 120, config: 0x9, { sample_period, sample_freq 
>> }: 4000, sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, 
>> inherit: 1, mmap: 1, comm: 1, freq: 1, task: 1, sample_id_all: 1, mmap2: 
>> 1, comm_exec: 1, ksymbol: 1, bpf_event: 1
>>
>> Thanks,
>> Like Xu
> 
> The behavior is similar as native kernel. The change of exclude_guest (0 -> 
> 1) is expected.

When we have 'exclude_guest: 1' for perf kvm usage,
we may get nothing from guest events.

The perf kvm user couldn't count (KVM) guest
user space events only with your patch.

It's unexpected from the pure ':u' semantics.

> 
> On native kernel,
> 
> Before:
> 
>    perf record -e cycles:u ./div
>    perf evlist -v
>    cycles:u: ..., exclude_kernel: 1, exclude_hv: 1, ...
> 
> After:
> 
>    perf record -e cycles:u ./div
>    perf evlist -v
>    cycles:u: ..., exclude_kernel: 1, exclude_hv: 1,  exclude_guest: 1, ...
> 
> Thanks
> Jin Yao
> 
>>>
>>> Thanks
>>> Jin Yao
>>>
>>>>>> To keep perf semantics consistent and clear, this patch sets
>>>>>> exclude_guest for user-space counting.
>>>>>
>>>>> Applied, and also added this, that you should consider doing in the
>>>>> future (modulo the "Committer testing:" header :) ):
>>>>>
>>>>> Committer testing:
>>>>>
>>>>> Before:
>>>>>
>>>>>    # perf record -e cycles:u
>>>>>    ^C[ perf record: Woken up 1 times to write data ]
>>>>>    [ perf record: Captured and wrote 1.231 MB perf.data (91 samples) ]
>>>>>    #
>>>>>    # perf evlist -v
>>>>>    cycles:u: size: 120, { sample_period, sample_freq }: 4000, 
>>>>> sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, 
>>>>> inherit: 1, exclude_kernel: 1, exclude_hv: 1, freq: 1, sample_id_all: 1
>>>>>    <SNIP>
>>>>>    #
>>>>>
>>>>> After:
>>>>>
>>>>>    # perf record -e cycles:u
>>>>>    ^C[ perf record: Woken up 1 times to write data ]
>>>>>    [ perf record: Captured and wrote 1.263 MB perf.data (403 samples) ]
>>>>>    #
>>>>>    # perf evlist -v
>>>>>    cycles:u: size: 120, { sample_period, sample_freq }: 4000, 
>>>>> sample_type: IP|TID|TIME|ID|CPU|PERIOD, read_format: ID, disabled: 1, 
>>>>> inherit: 1, exclude_kernel: 1, exclude_hv: 1, freq: 1, sample_id_all: 
>>>>> 1, exclude_guest: 1
>>>>>    #
>>>>>
>>>>> ----
>>>>>
>>>>> I.e. show actual command output before and after that demonstrates the
>>>>> problem and then the solution.
>>>>>
>>>>>> Signed-off-by: Jin Yao <yao.jin@...ux.intel.com>
>>>>>> ---
>>>>>>   tools/perf/util/parse-events.c | 2 ++
>>>>>>   1 file changed, 2 insertions(+)
>>>>>>
>>>>>> diff --git a/tools/perf/util/parse-events.c 
>>>>>> b/tools/perf/util/parse-events.c
>>>>>> index 9f7260e69113..4d809f1fe269 100644
>>>>>> --- a/tools/perf/util/parse-events.c
>>>>>> +++ b/tools/perf/util/parse-events.c
>>>>>> @@ -1794,6 +1794,8 @@ static int get_event_modifier(struct 
>>>>>> event_modifier *mod, char *str,
>>>>>>           if (*str == 'u') {
>>>>>>               if (!exclude)
>>>>>>                   exclude = eu = ek = eh = 1;
>>>>>> +            if (!exclude_GH)
>>>>>> +                eG = 1;
>>>>>>               eu = 0;
>>>>>>           } else if (*str == 'k') {
>>>>>>               if (!exclude)
>>>>>> -- 
>>>>>> 2.17.1
>>>>>>
>>>>>
>>>>
>>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ