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] [thread-next>] [day] [month] [year] [list]
Message-ID: <3f9a5475-930d-4f45-8fc8-8d2e8a6a08cc@bytedance.com>
Date: Thu, 19 Dec 2024 10:16:22 +0800
From: Qi Zheng <zhengqi.arch@...edance.com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: tglx@...utronix.de, david@...hat.com, jannh@...gle.com, hughd@...gle.com,
 yuzhao@...gle.com, willy@...radead.org, muchun.song@...ux.dev,
 vbabka@...nel.org, lorenzo.stoakes@...cle.com, akpm@...ux-foundation.org,
 rientjes@...gle.com, vishal.moola@...il.com, linux-mm@...ck.org,
 linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 14/15] mm: pgtable: remove tlb_remove_ptdesc()



On 2024/12/19 00:45, Peter Zijlstra wrote:
> On Wed, Dec 18, 2024 at 09:04:50PM +0800, Qi Zheng wrote:
>> diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h
>> index 7052780740349..fba11949dd2ea 100644
>> --- a/arch/s390/include/asm/tlb.h
>> +++ b/arch/s390/include/asm/tlb.h
>> @@ -86,7 +86,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
>>   	tlb->cleared_pmds = 1;
>>   	if (mm_alloc_pgste(tlb->mm))
>>   		gmap_unlink(tlb->mm, (unsigned long *)pte, address);
>> -	tlb_remove_ptdesc(tlb, pte);
>> +	tlb_remove_table(tlb, pte);
>>   }
>>   
>>   /*
>> @@ -105,7 +105,7 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
>>   	tlb->mm->context.flush_mm = 1;
>>   	tlb->freed_tables = 1;
>>   	tlb->cleared_puds = 1;
>> -	tlb_remove_ptdesc(tlb, pmd);
>> +	tlb_remove_table(tlb, pmd);
>>   }
>>   
>>   /*
>> @@ -123,7 +123,7 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
>>   	tlb->mm->context.flush_mm = 1;
>>   	tlb->freed_tables = 1;
>>   	tlb->cleared_p4ds = 1;
>> -	tlb_remove_ptdesc(tlb, pud);
>> +	tlb_remove_table(tlb, pud);
>>   }
>>   
>>   /*
>> @@ -141,7 +141,7 @@ static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
>>   	__tlb_adjust_range(tlb, address, PAGE_SIZE);
>>   	tlb->mm->context.flush_mm = 1;
>>   	tlb->freed_tables = 1;
>> -	tlb_remove_ptdesc(tlb, p4d);
>> +	tlb_remove_table(tlb, p4d);
>>   }
>>   
>>   #endif /* _S390_TLB_H */
> 
> AFAICT these are all virtual addresses (still)

Oops, I forgot to fix [PATCH v2 11/15]. It should be fixed like below:

diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h
index 7052780740349..da4a7d175f69c 100644
--- a/arch/s390/include/asm/tlb.h
+++ b/arch/s390/include/asm/tlb.h
@@ -86,7 +86,7 @@ static inline void pte_free_tlb(struct mmu_gather 
*tlb, pgtable_t pte,
         tlb->cleared_pmds = 1;
         if (mm_alloc_pgste(tlb->mm))
                 gmap_unlink(tlb->mm, (unsigned long *)pte, address);
-       tlb_remove_ptdesc(tlb, pte);
+       tlb_remove_ptdesc(tlb, virt_to_ptdesc(pte));
  }

  /*
@@ -105,7 +105,7 @@ static inline void pmd_free_tlb(struct mmu_gather 
*tlb, pmd_t *pmd,
         tlb->mm->context.flush_mm = 1;
         tlb->freed_tables = 1;
         tlb->cleared_puds = 1;
-       tlb_remove_ptdesc(tlb, pmd);
+       tlb_remove_ptdesc(tlb, virt_to_ptdesc(pmd));
  }

  /*
@@ -123,7 +123,7 @@ static inline void pud_free_tlb(struct mmu_gather 
*tlb, pud_t *pud,
         tlb->mm->context.flush_mm = 1;
         tlb->freed_tables = 1;
         tlb->cleared_p4ds = 1;
-       tlb_remove_ptdesc(tlb, pud);
+       tlb_remove_ptdesc(tlb, virt_to_ptdesc(pud));
  }

  /*
@@ -141,7 +141,7 @@ static inline void p4d_free_tlb(struct mmu_gather 
*tlb, p4d_t *p4d,
         __tlb_adjust_range(tlb, address, PAGE_SIZE);
         tlb->mm->context.flush_mm = 1;
         tlb->freed_tables = 1;
-       tlb_remove_ptdesc(tlb, p4d);
+       tlb_remove_ptdesc(tlb, virt_to_ptdesc(p4d));
  }

  #endif /* _S390_TLB_H */

Then in [PATCH v2 14/15], just convert virt_to_ptdesc() to virt_to_page().

Will fix it in v3.

Thanks!

> 
> 
>> diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
>> index 8d6cfe5058543..583e95568f52b 100644
>> --- a/include/asm-generic/tlb.h
>> +++ b/include/asm-generic/tlb.h
>> @@ -211,7 +211,7 @@ struct mmu_table_batch {
>>   #ifndef __HAVE_ARCH_TLB_REMOVE_TABLE
>>   static inline void __tlb_remove_table(void *table)
>>   {
>> -	struct ptdesc *ptdesc = (struct ptdesc *)table;
>> +	struct ptdesc *ptdesc = page_ptdesc((struct page *)table);
> 
> And here you're assuming they're page pointers.
> 
>>   	pagetable_dtor(ptdesc);
>>   	pagetable_free(ptdesc);

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ