mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2).
@ 2025-01-18 13:50 Ethan Zhao
  2025-01-18 18:34 ` Xin Li
  2025-01-19  9:43 ` Ethan Zhao
  0 siblings, 2 replies; 4+ messages in thread
From: Ethan Zhao @ 2025-01-18 13:50 UTC (permalink / raw)
  To: Xin Li, H. Peter Anvin
  Cc: x86, linux-kernel, dave.hansen, tglx, stable, Ethan Zhao

Hi, Xin, Peter

   While checking the asm code of arch/x86/entry/entry_fred.o about function fred_hwexc(),
found the code was generated as following :

0000000000000200 <fred_hwexc.constprop.0>:
  200:   0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
  207:   3c 0e                   cmp    $0xe,%al /* match X86_TRAP_PF */
  209:   75 05                   jne    210 <fred_hwexc.constprop.0+0x10>
  20b:   e9 00 00 00 00          jmp    210 <fred_hwexc.constprop.0+0x10>
  210:   3c 0b                   cmp    $0xb,%al
  212:   74 6a                   je     27e <fred_hwexc.constprop.0+0x7e>
  214:   77 17                   ja     22d <fred_hwexc.constprop.0+0x2d>
  216:   3c 06                   cmp    $0x6,%al
  218:   0f 84 83 00 00 00       je     2a1 <fred_hwexc.constprop.0+0xa1>
  21e:   76 29                   jbe    249 <fred_hwexc.constprop.0+0x49>
  220:   3c 08                   cmp    $0x8,%al
  222:   74 78                   je     29c <fred_hwexc.constprop.0+0x9c>
  224:   3c 0a                   cmp    $0xa,%al
  226:   75 18                   jne    240 <fred_hwexc.constprop.0+0x40>
  228:   e9 00 00 00 00          jmp    22d <fred_hwexc.constprop.0+0x2d>
  22d:   3c 11                   cmp    $0x11,%al
  22f:   74 66                   je     297 <fred_hwexc.constprop.0+0x97>
  231:   76 2c                   jbe    25f <fred_hwexc.constprop.0+0x5f>
  233:   3c 13                   cmp    $0x13,%al
  235:   74 5b                   je     292 <fred_hwexc.constprop.0+0x92>
  237:   3c 15                   cmp    $0x15,%al
  239:   75 1b                   jne    256 <fred_hwexc.constprop.0+0x56>
  23b:   e9 00 00 00 00          jmp    240 <fred_hwexc.constprop.0+0x40>
  240:   3c 07                   cmp    $0x7,%al
  242:   75 49                   jne    28d <fred_hwexc.constprop.0+0x8d>
  244:   e9 00 00 00 00          jmp    249 <fred_hwexc.constprop.0+0x49>
  249:   3c 01                   cmp    $0x1,%al
  24b:   74 3b                   je     288 <fred_hwexc.constprop.0+0x88>
  24d:   3c 05                   cmp    $0x5,%al
  24f:   75 1b                   jne    26c <fred_hwexc.constprop.0+0x6c>
  251:   e9 00 00 00 00          jmp    256 <fred_hwexc.constprop.0+0x56>
  256:   3c 12                   cmp    $0x12,%al
  258:   75 33                   jne    28d <fred_hwexc.constprop.0+0x8d>
  25a:   e9 00 00 00 00          jmp    25f <fred_hwexc.constprop.0+0x5f>

seems the following calling to exc_page_fault() was optimized out from fred_hwexc() by gcc,

if(likely(regs->fred_ss.vector==X86_TRAP_PF))
returnexc_page_fault(regs,error_code);

gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)

GNU objdump (GNU Binutils) 2.43


default kernel config.
.config:CONFIG_X86_FRED=y

my understanding, -O2 is the default kernel KBUILD_CFLAGS
So, Are there any workaround needed to make the kernel works with default build ?
or just as Peter said in another loop, manually loading some event bits to make the
over-smart gcc behave normally ?or fall back to -O(ption)0 ?

Any idea, much appreciated !


Thanks,
Ethan




^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2).
  2025-01-18 13:50 BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2) Ethan Zhao
@ 2025-01-18 18:34 ` Xin Li
  2025-01-19  0:42   ` Ethan Zhao
  2025-01-19  9:43 ` Ethan Zhao
  1 sibling, 1 reply; 4+ messages in thread
From: Xin Li @ 2025-01-18 18:34 UTC (permalink / raw)
  To: Ethan Zhao, H. Peter Anvin
  Cc: x86, linux-kernel, dave.hansen, tglx, stable, Ethan Zhao

On 1/18/2025 5:50 AM, Ethan Zhao wrote:
> Hi, Xin, Peter
> 
>    While checking the asm code of arch/x86/entry/entry_fred.o about 
> function fred_hwexc(),
> found the code was generated as following :
> 
> 0000000000000200 <fred_hwexc.constprop.0>:
>   200:   0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
>   207:   3c 0e                   cmp    $0xe,%al /* match X86_TRAP_PF */
>   209:   75 05                   jne    210 <fred_hwexc.constprop.0+0x10>
>   20b:   e9 00 00 00 00          jmp    210 <fred_hwexc.constprop.0+0x10>
>   210:   3c 0b                   cmp    $0xb,%al
>   212:   74 6a                   je     27e <fred_hwexc.constprop.0+0x7e>
>   214:   77 17                   ja     22d <fred_hwexc.constprop.0+0x2d>
>   216:   3c 06                   cmp    $0x6,%al
>   218:   0f 84 83 00 00 00       je     2a1 <fred_hwexc.constprop.0+0xa1>
>   21e:   76 29                   jbe    249 <fred_hwexc.constprop.0+0x49>
>   220:   3c 08                   cmp    $0x8,%al
>   222:   74 78                   je     29c <fred_hwexc.constprop.0+0x9c>
>   224:   3c 0a                   cmp    $0xa,%al
>   226:   75 18                   jne    240 <fred_hwexc.constprop.0+0x40>
>   228:   e9 00 00 00 00          jmp    22d <fred_hwexc.constprop.0+0x2d>
>   22d:   3c 11                   cmp    $0x11,%al
>   22f:   74 66                   je     297 <fred_hwexc.constprop.0+0x97>
>   231:   76 2c                   jbe    25f <fred_hwexc.constprop.0+0x5f>
>   233:   3c 13                   cmp    $0x13,%al
>   235:   74 5b                   je     292 <fred_hwexc.constprop.0+0x92>
>   237:   3c 15                   cmp    $0x15,%al
>   239:   75 1b                   jne    256 <fred_hwexc.constprop.0+0x56>
>   23b:   e9 00 00 00 00          jmp    240 <fred_hwexc.constprop.0+0x40>
>   240:   3c 07                   cmp    $0x7,%al
>   242:   75 49                   jne    28d <fred_hwexc.constprop.0+0x8d>
>   244:   e9 00 00 00 00          jmp    249 <fred_hwexc.constprop.0+0x49>
>   249:   3c 01                   cmp    $0x1,%al
>   24b:   74 3b                   je     288 <fred_hwexc.constprop.0+0x88>
>   24d:   3c 05                   cmp    $0x5,%al
>   24f:   75 1b                   jne    26c <fred_hwexc.constprop.0+0x6c>
>   251:   e9 00 00 00 00          jmp    256 <fred_hwexc.constprop.0+0x56>
>   256:   3c 12                   cmp    $0x12,%al
>   258:   75 33                   jne    28d <fred_hwexc.constprop.0+0x8d>
>   25a:   e9 00 00 00 00          jmp    25f <fred_hwexc.constprop.0+0x5f>
> 
> seems the following calling to exc_page_fault() was optimized out from 
> fred_hwexc() by gcc,
> 
> if(likely(regs->fred_ss.vector==X86_TRAP_PF))
> returnexc_page_fault(regs,error_code);
> 
> gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
> 
> GNU objdump (GNU Binutils) 2.43
> 
> 
> default kernel config.
> .config:CONFIG_X86_FRED=y
> 
> my understanding, -O2 is the default kernel KBUILD_CFLAGS
> So, Are there any workaround needed to make the kernel works with 
> default build ?
> or just as Peter said in another loop, manually loading some event bits 
> to make the
> over-smart gcc behave normally ?or fall back to -O(ption)0 ?
> 
> Any idea, much appreciated !

This is an optimization done in the original code:

static noinstr void fred_hwexc(struct pt_regs *regs, unsigned long 
error_code)
{
         /* Optimize for #PF. That's the only exception which matters 
performance wise */
         if (likely(regs->fred_ss.vector == X86_TRAP_PF))
                 return exc_page_fault(regs, error_code);

         switch (regs->fred_ss.vector) {


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2).
  2025-01-18 18:34 ` Xin Li
@ 2025-01-19  0:42   ` Ethan Zhao
  0 siblings, 0 replies; 4+ messages in thread
From: Ethan Zhao @ 2025-01-19  0:42 UTC (permalink / raw)
  To: Xin Li, H. Peter Anvin
  Cc: x86, linux-kernel, dave.hansen, tglx, stable, Ethan Zhao

On 1/19/2025 2:34 AM, Xin Li wrote:
> On 1/18/2025 5:50 AM, Ethan Zhao wrote:
>> Hi, Xin, Peter
>>
>>    While checking the asm code of arch/x86/entry/entry_fred.o about 
>> function fred_hwexc(),
>> found the code was generated as following :
>>
>> 0000000000000200 <fred_hwexc.constprop.0>:
>>   200:   0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
>>   207:   3c 0e                   cmp    $0xe,%al /* match X86_TRAP_PF */
>>   209:   75 05                   jne    210 
>> <fred_hwexc.constprop.0+0x10>
>>   20b:   e9 00 00 00 00          jmp    210 
>> <fred_hwexc.constprop.0+0x10>
>>   210:   3c 0b                   cmp    $0xb,%al
>>   212:   74 6a                   je     27e 
>> <fred_hwexc.constprop.0+0x7e>
>>   214:   77 17                   ja     22d 
>> <fred_hwexc.constprop.0+0x2d>
>>   216:   3c 06                   cmp    $0x6,%al
>>   218:   0f 84 83 00 00 00       je     2a1 
>> <fred_hwexc.constprop.0+0xa1>
>>   21e:   76 29                   jbe    249 
>> <fred_hwexc.constprop.0+0x49>
>>   220:   3c 08                   cmp    $0x8,%al
>>   222:   74 78                   je     29c 
>> <fred_hwexc.constprop.0+0x9c>
>>   224:   3c 0a                   cmp    $0xa,%al
>>   226:   75 18                   jne    240 
>> <fred_hwexc.constprop.0+0x40>
>>   228:   e9 00 00 00 00          jmp    22d 
>> <fred_hwexc.constprop.0+0x2d>
>>   22d:   3c 11                   cmp    $0x11,%al
>>   22f:   74 66                   je     297 
>> <fred_hwexc.constprop.0+0x97>
>>   231:   76 2c                   jbe    25f 
>> <fred_hwexc.constprop.0+0x5f>
>>   233:   3c 13                   cmp    $0x13,%al
>>   235:   74 5b                   je     292 
>> <fred_hwexc.constprop.0+0x92>
>>   237:   3c 15                   cmp    $0x15,%al
>>   239:   75 1b                   jne    256 
>> <fred_hwexc.constprop.0+0x56>
>>   23b:   e9 00 00 00 00          jmp    240 
>> <fred_hwexc.constprop.0+0x40>
>>   240:   3c 07                   cmp    $0x7,%al
>>   242:   75 49                   jne    28d 
>> <fred_hwexc.constprop.0+0x8d>
>>   244:   e9 00 00 00 00          jmp    249 
>> <fred_hwexc.constprop.0+0x49>
>>   249:   3c 01                   cmp    $0x1,%al
>>   24b:   74 3b                   je     288 
>> <fred_hwexc.constprop.0+0x88>
>>   24d:   3c 05                   cmp    $0x5,%al
>>   24f:   75 1b                   jne    26c 
>> <fred_hwexc.constprop.0+0x6c>
>>   251:   e9 00 00 00 00          jmp    256 
>> <fred_hwexc.constprop.0+0x56>
>>   256:   3c 12                   cmp    $0x12,%al
>>   258:   75 33                   jne    28d 
>> <fred_hwexc.constprop.0+0x8d>
>>   25a:   e9 00 00 00 00          jmp    25f 
>> <fred_hwexc.constprop.0+0x5f>
>>
>> seems the following calling to exc_page_fault() was optimized out 
>> from fred_hwexc() by gcc,
>>
>> if(likely(regs->fred_ss.vector==X86_TRAP_PF))
>> returnexc_page_fault(regs,error_code);
>>
>> gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
>>
>> GNU objdump (GNU Binutils) 2.43
>>
>>
>> default kernel config.
>> .config:CONFIG_X86_FRED=y
>>
>> my understanding, -O2 is the default kernel KBUILD_CFLAGS
>> So, Are there any workaround needed to make the kernel works with 
>> default build ?
>> or just as Peter said in another loop, manually loading some event 
>> bits to make the
>> over-smart gcc behave normally ?or fall back to -O(ption)0 ?
>>
>> Any idea, much appreciated !
>
> This is an optimization done in the original code:
>
> static noinstr void fred_hwexc(struct pt_regs *regs, unsigned long 
> error_code)
> {
>         /* Optimize for #PF. That's the only exception which matters 
> performance wise */
>         if (likely(regs->fred_ss.vector == X86_TRAP_PF))

The following line code was lost in the asm code after compiling !

Thanks,

Ethan

> return exc_page_fault(regs, error_code);
>
>         switch (regs->fred_ss.vector) {
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2).
  2025-01-18 13:50 BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2) Ethan Zhao
  2025-01-18 18:34 ` Xin Li
@ 2025-01-19  9:43 ` Ethan Zhao
  1 sibling, 0 replies; 4+ messages in thread
From: Ethan Zhao @ 2025-01-19  9:43 UTC (permalink / raw)
  To: Ethan Zhao, Xin Li, H. Peter Anvin
  Cc: x86, linux-kernel, dave.hansen, tglx, stable

在 2025/1/18 21:50, Ethan Zhao 写道:
> Hi, Xin, Peter
>
>   While checking the asm code of arch/x86/entry/entry_fred.o about 
> function fred_hwexc(),
> found the code was generated as following :
>
> 0000000000000200 <fred_hwexc.constprop.0>:
>  200:   0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
>  207:   3c 0e                   cmp    $0xe,%al /* match X86_TRAP_PF */
>  209:   75 05                   jne    210 <fred_hwexc.constprop.0+0x10>
>  20b:   e9 00 00 00 00          jmp    210 <fred_hwexc.constprop.0+0x10>
>  210:   3c 0b                   cmp    $0xb,%al
>  212:   74 6a                   je     27e <fred_hwexc.constprop.0+0x7e>
>  214:   77 17                   ja     22d <fred_hwexc.constprop.0+0x2d>
>  216:   3c 06                   cmp    $0x6,%al
>  218:   0f 84 83 00 00 00       je     2a1 <fred_hwexc.constprop.0+0xa1>
>  21e:   76 29                   jbe    249 <fred_hwexc.constprop.0+0x49>
>  220:   3c 08                   cmp    $0x8,%al
>  222:   74 78                   je     29c <fred_hwexc.constprop.0+0x9c>
>  224:   3c 0a                   cmp    $0xa,%al
>  226:   75 18                   jne    240 <fred_hwexc.constprop.0+0x40>
>  228:   e9 00 00 00 00          jmp    22d <fred_hwexc.constprop.0+0x2d>
>  22d:   3c 11                   cmp    $0x11,%al
>  22f:   74 66                   je     297 <fred_hwexc.constprop.0+0x97>
>  231:   76 2c                   jbe    25f <fred_hwexc.constprop.0+0x5f>
>  233:   3c 13                   cmp    $0x13,%al
>  235:   74 5b                   je     292 <fred_hwexc.constprop.0+0x92>
>  237:   3c 15                   cmp    $0x15,%al
>  239:   75 1b                   jne    256 <fred_hwexc.constprop.0+0x56>
>  23b:   e9 00 00 00 00          jmp    240 <fred_hwexc.constprop.0+0x40>
>  240:   3c 07                   cmp    $0x7,%al
>  242:   75 49                   jne    28d <fred_hwexc.constprop.0+0x8d>
>  244:   e9 00 00 00 00          jmp    249 <fred_hwexc.constprop.0+0x49>
>  249:   3c 01                   cmp    $0x1,%al
>  24b:   74 3b                   je     288 <fred_hwexc.constprop.0+0x88>
>  24d:   3c 05                   cmp    $0x5,%al
>  24f:   75 1b                   jne    26c <fred_hwexc.constprop.0+0x6c>
>  251:   e9 00 00 00 00          jmp    256 <fred_hwexc.constprop.0+0x56>
>  256:   3c 12                   cmp    $0x12,%al
>  258:   75 33                   jne    28d <fred_hwexc.constprop.0+0x8d>
>  25a:   e9 00 00 00 00          jmp    25f <fred_hwexc.constprop.0+0x5f>
>
> seems the following calling to exc_page_fault() was optimized out from 
> fred_hwexc() by gcc,
>
> if(likely(regs->fred_ss.vector==X86_TRAP_PF))
> returnexc_page_fault(regs,error_code);
>
> gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
>
> GNU objdump (GNU Binutils) 2.43
>
>
> default kernel config.
> .config:CONFIG_X86_FRED=y
>
> my understanding, -O2 is the default kernel KBUILD_CFLAGS
> So, Are there any workaround needed to make the kernel works with 
> default build ?
> or just as Peter said in another loop, manually loading some event 
> bits to make the
> over-smart gcc behave normally ?or fall back to -O(ption)0 ?
>
> Any idea, much appreciated !
>
>
> Thanks,
> Ethan
>
>

Rebuild the same lastest stable kernel with FRED enabled, default -O2 on RHEL 8.6, got
correct result:

ffffffff820a7430 <fred_hwexc>:
ffffffff820a7430:       55                      push   %rbp
ffffffff820a7431:       0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
ffffffff820a7438:       48 89 e5                mov    %rsp,%rbp
ffffffff820a743b:       3c 0e                   cmp    $0xe,%al
ffffffff820a743d:       75 0b                   jne    ffffffff820a744a <fred_hwexc+0x1a>
ffffffff820a743f:       e8 4c 50 00 00          callq  ffffffff820ac490 <exc_page_fault>
ffffffff820a7444:       5d                      pop    %rbp

gcc version 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)

whatever CONFIG_JUMP_LABEL=y or CONFIG_JUMP_LABEL is not set.

so the issue seems only about WSL ubuntu toolchain.

Thanks,
Ethan



>
>
-- 
"firm, enduring, strong, and long-lived"


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2025-01-19  9:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-01-18 13:50 BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc with default kernel build option (-O2) Ethan Zhao
2025-01-18 18:34 ` Xin Li
2025-01-19  0:42   ` Ethan Zhao
2025-01-19  9:43 ` Ethan Zhao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome