arm64: errata: refer to config ARM64_ERRATUM_2645198 to make workaround work

Message ID 20221215094811.23188-1-lukas.bulwahn@gmail.com
State New
Headers
Series arm64: errata: refer to config ARM64_ERRATUM_2645198 to make workaround work |

Commit Message

Lukas Bulwahn Dec. 15, 2022, 9:48 a.m. UTC
  Commit 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715
[ESR|FAR]_ELx corruption") implements a workaround for arm64 erratum
2645198. The arm64 cpucaps is called WORKAROUND_2645198; the kernel build
configuration is called ARM64_ERRATUM_2645198.

In the functions huge_ptep_modify_prot_start() and
ptep_modify_prot_start(), the code accidently refers to the non-existing
config CONFIG_ARM64_WORKAROUND_2645198. Note that the config name uses
ERRATUM, not WORKAROUND. By this accidental misreference, this condition is
always false, the branch of the workaround is not reachable and the
workaround is effectively not implemented at all.

Refer to the intended config ARM64_ERRATUM_2645198 and make the intended
workaround effectively work.

Fixes: 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715 [ESR|FAR]_ELx corruption")
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
---
 arch/arm64/mm/hugetlbpage.c | 2 +-
 arch/arm64/mm/mmu.c         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
  

Comments

Will Deacon Dec. 15, 2022, 10:57 a.m. UTC | #1
On Thu, Dec 15, 2022 at 10:48:11AM +0100, Lukas Bulwahn wrote:
> Commit 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715
> [ESR|FAR]_ELx corruption") implements a workaround for arm64 erratum
> 2645198. The arm64 cpucaps is called WORKAROUND_2645198; the kernel build
> configuration is called ARM64_ERRATUM_2645198.
> 
> In the functions huge_ptep_modify_prot_start() and
> ptep_modify_prot_start(), the code accidently refers to the non-existing
> config CONFIG_ARM64_WORKAROUND_2645198. Note that the config name uses
> ERRATUM, not WORKAROUND. By this accidental misreference, this condition is
> always false, the branch of the workaround is not reachable and the
> workaround is effectively not implemented at all.
> 
> Refer to the intended config ARM64_ERRATUM_2645198 and make the intended
> workaround effectively work.
> 
> Fixes: 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715 [ESR|FAR]_ELx corruption")
> Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
> ---
>  arch/arm64/mm/hugetlbpage.c | 2 +-
>  arch/arm64/mm/mmu.c         | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)

Thanks for the report!

> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> index cd8d96e1fa1a..95364e8bdc19 100644
> --- a/arch/arm64/mm/hugetlbpage.c
> +++ b/arch/arm64/mm/hugetlbpage.c
> @@ -562,7 +562,7 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
>  
>  pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>  {
> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>  		/*
>  		 * Break-before-make (BBM) is required for all user space mappings
> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
> index 12915f379c22..d77c9f56b7b4 100644
> --- a/arch/arm64/mm/mmu.c
> +++ b/arch/arm64/mm/mmu.c
> @@ -1633,7 +1633,7 @@ early_initcall(prevent_bootmem_remove_init);
>  
>  pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>  {
> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>  		/*
>  		 * Break-before-make (BBM) is required for all user space mappings

Grr, this bug seems to exist in all three versions of the patch reviewed on
the list, so I can only draw the conclusion that this code has never been
tested. Consequently, I'm more inclined to _revert_ the change for now and
we can bring it back as a fix once somebody has checked that it actually
works properly.

Will
  
Anshuman Khandual Dec. 15, 2022, 11:29 a.m. UTC | #2
On 12/15/22 16:27, Will Deacon wrote:
> On Thu, Dec 15, 2022 at 10:48:11AM +0100, Lukas Bulwahn wrote:
>> Commit 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715
>> [ESR|FAR]_ELx corruption") implements a workaround for arm64 erratum
>> 2645198. The arm64 cpucaps is called WORKAROUND_2645198; the kernel build
>> configuration is called ARM64_ERRATUM_2645198.
>>
>> In the functions huge_ptep_modify_prot_start() and
>> ptep_modify_prot_start(), the code accidently refers to the non-existing
>> config CONFIG_ARM64_WORKAROUND_2645198. Note that the config name uses
>> ERRATUM, not WORKAROUND. By this accidental misreference, this condition is
>> always false, the branch of the workaround is not reachable and the
>> workaround is effectively not implemented at all.
>>
>> Refer to the intended config ARM64_ERRATUM_2645198 and make the intended
>> workaround effectively work.
>>
>> Fixes: 44ecda71fd8a ("arm64: errata: Workaround possible Cortex-A715 [ESR|FAR]_ELx corruption")
>> Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
>> ---
>>  arch/arm64/mm/hugetlbpage.c | 2 +-
>>  arch/arm64/mm/mmu.c         | 2 +-
>>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> Thanks for the report!
> 
>> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
>> index cd8d96e1fa1a..95364e8bdc19 100644
>> --- a/arch/arm64/mm/hugetlbpage.c
>> +++ b/arch/arm64/mm/hugetlbpage.c
>> @@ -562,7 +562,7 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
>>  
>>  pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>>  {
>> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
>> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>>  		/*
>>  		 * Break-before-make (BBM) is required for all user space mappings
>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
>> index 12915f379c22..d77c9f56b7b4 100644
>> --- a/arch/arm64/mm/mmu.c
>> +++ b/arch/arm64/mm/mmu.c
>> @@ -1633,7 +1633,7 @@ early_initcall(prevent_bootmem_remove_init);
>>  
>>  pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>>  {
>> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
>> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>>  		/*
>>  		 * Break-before-make (BBM) is required for all user space mappings
> 
> Grr, this bug seems to exist in all three versions of the patch reviewed on
> the list, so I can only draw the conclusion that this code has never been

Ohh, my bad, apologies. I did not have a real system with this erratum, although
had emulated and tested this workaround path via some other debug changes (which
might have just forced the first condition to always evaluate true).

> tested. Consequently, I'm more inclined to _revert_ the change for now and
> we can bring it back as a fix once somebody has checked that it actually
> works properly.
Please do not revert this change if possible.
  
Will Deacon Dec. 15, 2022, 7:44 p.m. UTC | #3
On Thu, Dec 15, 2022 at 04:59:20PM +0530, Anshuman Khandual wrote:
> On 12/15/22 16:27, Will Deacon wrote:
> > On Thu, Dec 15, 2022 at 10:48:11AM +0100, Lukas Bulwahn wrote:
> >> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> >> index cd8d96e1fa1a..95364e8bdc19 100644
> >> --- a/arch/arm64/mm/hugetlbpage.c
> >> +++ b/arch/arm64/mm/hugetlbpage.c
> >> @@ -562,7 +562,7 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
> >>  
> >>  pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
> >>  {
> >> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
> >> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
> >>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
> >>  		/*
> >>  		 * Break-before-make (BBM) is required for all user space mappings
> >> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
> >> index 12915f379c22..d77c9f56b7b4 100644
> >> --- a/arch/arm64/mm/mmu.c
> >> +++ b/arch/arm64/mm/mmu.c
> >> @@ -1633,7 +1633,7 @@ early_initcall(prevent_bootmem_remove_init);
> >>  
> >>  pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
> >>  {
> >> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
> >> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
> >>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
> >>  		/*
> >>  		 * Break-before-make (BBM) is required for all user space mappings
> > 
> > Grr, this bug seems to exist in all three versions of the patch reviewed on
> > the list, so I can only draw the conclusion that this code has never been
> 
> Ohh, my bad, apologies. I did not have a real system with this erratum, although
> had emulated and tested this workaround path via some other debug changes (which
> might have just forced the first condition to always evaluate true).

"might have"?

> > tested. Consequently, I'm more inclined to _revert_ the change for now and
> > we can bring it back as a fix once somebody has checked that it actually
> > works properly.
> Please do not revert this change if possible.

I've gone ahead with the revert anyway, just because it's the easy thing to
do and we can bring back a fixed version of the patch as a fix in the new
year. So please send a new version with this fix folded in after you've
tested that it doesn't cause regressions for systems without the erratum.

Cheers,

Will
  
Anshuman Khandual Dec. 15, 2022, 11:31 p.m. UTC | #4
On 12/16/22 01:14, Will Deacon wrote:
> On Thu, Dec 15, 2022 at 04:59:20PM +0530, Anshuman Khandual wrote:
>> On 12/15/22 16:27, Will Deacon wrote:
>>> On Thu, Dec 15, 2022 at 10:48:11AM +0100, Lukas Bulwahn wrote:
>>>> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
>>>> index cd8d96e1fa1a..95364e8bdc19 100644
>>>> --- a/arch/arm64/mm/hugetlbpage.c
>>>> +++ b/arch/arm64/mm/hugetlbpage.c
>>>> @@ -562,7 +562,7 @@ bool __init arch_hugetlb_valid_size(unsigned long size)
>>>>  
>>>>  pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>>>>  {
>>>> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
>>>> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>>>>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>>>>  		/*
>>>>  		 * Break-before-make (BBM) is required for all user space mappings
>>>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
>>>> index 12915f379c22..d77c9f56b7b4 100644
>>>> --- a/arch/arm64/mm/mmu.c
>>>> +++ b/arch/arm64/mm/mmu.c
>>>> @@ -1633,7 +1633,7 @@ early_initcall(prevent_bootmem_remove_init);
>>>>  
>>>>  pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
>>>>  {
>>>> -	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
>>>> +	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
>>>>  	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
>>>>  		/*
>>>>  		 * Break-before-make (BBM) is required for all user space mappings
>>>
>>> Grr, this bug seems to exist in all three versions of the patch reviewed on
>>> the list, so I can only draw the conclusion that this code has never been
>>
>> Ohh, my bad, apologies. I did not have a real system with this erratum, although
>> had emulated and tested this workaround path via some other debug changes (which
>> might have just forced the first condition to always evaluate true).
> 
> "might have"?
> 
>>> tested. Consequently, I'm more inclined to _revert_ the change for now and
>>> we can bring it back as a fix once somebody has checked that it actually
>>> works properly.
>> Please do not revert this change if possible.
> 
> I've gone ahead with the revert anyway, just because it's the easy thing to
> do and we can bring back a fixed version of the patch as a fix in the new
> year. So please send a new version with this fix folded in after you've
> tested that it doesn't cause regressions for systems without the erratum.

Sure, will resend. Again, apologies for this last minute merge window trouble.
  

Patch

diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
index cd8d96e1fa1a..95364e8bdc19 100644
--- a/arch/arm64/mm/hugetlbpage.c
+++ b/arch/arm64/mm/hugetlbpage.c
@@ -562,7 +562,7 @@  bool __init arch_hugetlb_valid_size(unsigned long size)
 
 pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
 {
-	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
+	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
 	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
 		/*
 		 * Break-before-make (BBM) is required for all user space mappings
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 12915f379c22..d77c9f56b7b4 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -1633,7 +1633,7 @@  early_initcall(prevent_bootmem_remove_init);
 
 pte_t ptep_modify_prot_start(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
 {
-	if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_2645198) &&
+	if (IS_ENABLED(CONFIG_ARM64_ERRATUM_2645198) &&
 	    cpus_have_const_cap(ARM64_WORKAROUND_2645198)) {
 		/*
 		 * Break-before-make (BBM) is required for all user space mappings