[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <937625af-92a9-a954-dfd6-2c5ab6bbfab3@csgroup.eu>
Date: Fri, 1 Jul 2022 11:40:35 +0000
From: Christophe Leroy <christophe.leroy@...roup.eu>
To: Sathvika Vasireddy <sv@...ux.vnet.ibm.com>,
Chen Zhongjin <chenzhongjin@...wei.com>,
"Naveen N. Rao" <naveen.n.rao@...ux.vnet.ibm.com>,
"linuxppc-dev@...ts.ozlabs.org" <linuxppc-dev@...ts.ozlabs.org>,
Sathvika Vasireddy <sv@...ux.ibm.com>,
Segher Boessenkool <segher@...nel.crashing.org>
CC: "aik@...abs.ru" <aik@...abs.ru>,
"benh@...nel.crashing.org" <benh@...nel.crashing.org>,
"jpoimboe@...hat.com" <jpoimboe@...hat.com>,
Linux ARM <linux-arm-kernel@...ts.infradead.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
Marc Zyngier <maz@...nel.org>,
"mbenes@...e.cz" <mbenes@...e.cz>,
"mingo@...hat.com" <mingo@...hat.com>,
"mpe@...erman.id.au" <mpe@...erman.id.au>,
"paulus@...ba.org" <paulus@...ba.org>,
"peterz@...radead.org" <peterz@...radead.org>,
"rostedt@...dmis.org" <rostedt@...dmis.org>
Subject: Re: [RFC PATCH v3 11/12] powerpc: Remove unreachable() from WARN_ON()
(gcc issue ?)
Hi Segher, your help might be welcome,
Le 01/07/2022 à 08:56, Sathvika Vasireddy a écrit :
> Hi Chen,
>
> Thanks for pitching in and providing your inputs :-)
>
> On 01/07/22 07:43, Chen Zhongjin wrote:
>> Hi everyone,
>>
>> Hope I'm not too late for this discussion.
>>
>> I'm not familiar with ppc so it spent me some time to reproduce this.
>> But at last I didn't make it.
>>
>> What I did:
>>
>> 1 checkout to tip/objtool/core
>>
>> 2 apply this patch
>>
>> 3 recover the unreachable() after WARN_ENTRY(..
>>
>> 4 compile on defconfig/allyesconfig
>>
>> If anyone can point out which file will generate this problem it will
>> be perfect.
>
> To reproduce this problem, you may want to apply this patch series on
> top of objtool/core branch of the tip tree, and compile on
> ppc64le_defconfig.
>
> There are a couple of C files that are generating these warnings. One
> such file is: arch/powerpc/kvm/../../../virt/kvm/kvm_main.o which gives
> *arch/powerpc/kvm/../../../virt/kvm/kvm_main.o: warning: objtool:
> kvm_mmu_notifier_release+0x6c: unannotated intra-function call* warning.
>
> With unreachable() in __WARN_FLAGS(), we get unannotated intra-function
> call warnings, but without unreachable() like in patch 11/12 or with
> just the builtin variant of unreachable (__builtin_unreachable())
> instead of unreachable(), we do not get those warnings.
>
I made a simple test aside our issue to see if I get something similar
to ARM. I don't if it is the same at the end, but it looks odd anyway:
int test(int x)
{
switch(x) {
case 0 : return 3;
case 1 : return 5;
default : unreachable();
}
}
0000000000001c80 <test>:
1c80: a6 02 08 7c mflr r0
1c84: 01 00 00 48 bl 1c84 <test+0x4>
1c84: R_PPC64_REL24 _mcount
1c88: 00 00 23 2c cmpdi r3,0
1c8c: 14 00 82 41 beq 1ca0 <test+0x20>
1c90: 01 00 03 2c cmpwi r3,1
1c94: 05 00 60 38 li r3,5
1c98: 20 00 82 4d beqlr
1c9c: 00 00 42 60 ori r2,r2,0
1ca0: 03 00 60 38 li r3,3
1ca4: 20 00 80 4e blr
So it looks like it takes no real benefit from the unreachable marking.
Now with __builtin_unreachable() instead of unreachable() :
int test(int x)
{
switch(x) {
case 0 : return 3;
case 1 : return 5;
default : __builtin_unreachable();
}
}
0000000000001c80 <test>:
1c80: a6 02 08 7c mflr r0
1c84: 01 00 00 48 bl 1c84 <test+0x4>
1c84: R_PPC64_REL24 _mcount
1c88: 00 00 63 20 subfic r3,r3,0
1c8c: 10 19 63 7c subfe r3,r3,r3
1c90: bc 07 63 54 rlwinm r3,r3,0,30,30
1c94: 03 00 63 38 addi r3,r3,3
1c98: 20 00 80 4e blr
Here the generated code takes advantage of the unreachable marking and
results in a branchless code.
Christophe
Powered by blists - more mailing lists