[PATCH] tools/perf/tests: Skip perf BPF test if clang is not present

Athira Rajeev atrajeev at linux.vnet.ibm.com
Tue May 10 23:39:18 AEST 2022



> On 06-May-2022, at 3:07 PM, Athira Rajeev <atrajeev at linux.vnet.ibm.com> wrote:
> 
> 
> 
>> On 05-May-2022, at 10:51 PM, Arnaldo Carvalho de Melo <acme at kernel.org> wrote:
>> 
>> Em Thu, May 05, 2022 at 03:30:39PM +0530, Athira Rajeev escreveu:
>>> Perf BPF filter test fails in environment where "clang"
>>> is not installed.
>>> 
>>> Test failure logs:
>>> 
>>> <<>>
>>> 42: BPF filter                    :
>>> 42.1: Basic BPF filtering         : Skip
>>> 42.2: BPF pinning                 : FAILED!
>>> 42.3: BPF prologue generation     : FAILED!
>>> <<>>
>>> 
>>> Enabling verbose option provided debug logs which says
>>> clang/llvm needs to be installed. Snippet of verbose logs:
>>> 
>>> <<>>
>>> 42.2: BPF pinning                  :
>>> --- start ---
>>> test child forked, pid 61423
>>> ERROR:	unable to find clang.
>>> Hint:	Try to install latest clang/llvm to support BPF.
>>>       Check your $PATH
>>> 
>>> <<logs_here>>
>>> 
>>> Failed to compile test case: 'Basic BPF llvm compile'
>>> Unable to get BPF object, fix kbuild first
>>> test child finished with -1
>>> ---- end ----
>>> BPF filter subtest 2: FAILED!
>>> <<>>
>>> 
>>> Here subtests, "BPF pinning" and "BPF prologue generation"
>>> failed and logs shows clang/llvm is needed. After installing
>>> clang, testcase passes.
>>> 
>>> Reason on why subtest failure happens though logs has proper
>>> debug information:
>>> Main function __test__bpf calls test_llvm__fetch_bpf_obj by
>>> passing 4th argument as true ( 4th arguments maps to parameter
>>> "force" in test_llvm__fetch_bpf_obj ). But this will cause
>>> test_llvm__fetch_bpf_obj to skip the check for clang/llvm.
>>> 
>>> Snippet of code part which checks for clang based on
>>> parameter "force" in test_llvm__fetch_bpf_obj:
>>> 
>>> <<>>
>>> if (!force && (!llvm_param.user_set_param &&
>>> <<>>
>>> 
>>> Since force is set to "false", test won't get skipped and
>>> fails to compile test case. The BPF code compilation needs
>>> clang, So pass the fourth argument as "false" and also skip
>>> the test if reason for return is "TEST_SKIP"
>>> 
>>> After the patch:
>>> 
>>> <<>>
>>> 42: BPF filter                    :
>>> 42.1: Basic BPF filtering         : Skip
>>> 42.2: BPF pinning                 : Skip
>>> 42.3: BPF prologue generation     : Skip
>>> <<>>
>> 
>> Wouldn't it be better to add the reason for the skip, like other tests
>> do?
>> 
>> E.g.:
>> 
>> 23: Watchpoint                                                      :
>> 23.1: Read Only Watchpoint                                          : Skip (missing hardware support)
>> 23.2: Write Only Watchpoint                                         : Ok
>> 23.3: Read / Write Watchpoint                                       : Ok
>> 23.4: Modify Watchpoint
>> 
>> Something like:
>> 
>> After the patch:
>> 
>> <<>>
>> 42: BPF filter                    :
>> 42.1: Basic BPF filtering         : Skip (clang not installed)
>> 42.2: BPF pinning                 : Skip (clang not installed)
>> 42.3: BPF prologue generation     : Skip (clang not installed)
> 
> 
> Hi Arnaldo,
> 
> I tried to use TEST_CASE_REASON("BPF pinning", bpf_pinning, "clang not installed")
> 
> The clang check is done in test_llvm__fetch_bpf_obj under some condition checks:
> 
> <<>>
>         /*
>         * Skip this test if user's .perfconfig doesn't set [llvm] section
>         * and clang is not found in $PATH
>         */
>        if (!force && (!llvm_param.user_set_param &&
>                       llvm__search_clang())) {
>                pr_debug("No clang, skip this test\n");
>                return TEST_SKIP;
>        }
> <<>>
> 
> But the reason for BPF skip could happen at other places also ie non-root user, bpf support checks from check_env.
> So can't exactly print the skip reason to be clang since It could get skipped from other environment checks too. Any suggestions Arnaldo ?
> 
> Thanks
> Athira

Hi Arnaldo,

Looking for suggestions on this change.

Thanks
Athira
> 
>> <<>>
>> 
>>> Signed-off-by: Athira Rajeev <atrajeev at linux.vnet.ibm.com>
>>> ---
>>> tools/perf/tests/bpf.c | 4 ++--
>>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>> 
>>> diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
>>> index 57b9591f7cbb..ae62f01239e3 100644
>>> --- a/tools/perf/tests/bpf.c
>>> +++ b/tools/perf/tests/bpf.c
>>> @@ -222,11 +222,11 @@ static int __test__bpf(int idx)
>>> 
>>> 	ret = test_llvm__fetch_bpf_obj(&obj_buf, &obj_buf_sz,
>>> 				       bpf_testcase_table[idx].prog_id,
>>> -				       true, NULL);
>>> +				       false, NULL);
>>> 	if (ret != TEST_OK || !obj_buf || !obj_buf_sz) {
>>> 		pr_debug("Unable to get BPF object, %s\n",
>>> 			 bpf_testcase_table[idx].msg_compile_fail);
>>> -		if (idx == 0)
>>> +		if ((idx == 0) || (ret == TEST_SKIP))
>>> 			return TEST_SKIP;
>>> 		else
>>> 			return TEST_FAIL;
>>> -- 
>>> 2.35.1
>> 
>> -- 
>> 
>> - Arnaldo



More information about the Linuxppc-dev mailing list