| From: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Subject: powerpc/e500: don't pre-check write access on data TLB error |
| Date: Tue, 2 Jul 2024 15:51:30 +0200 |
| |
| Don't pre-check write access on read-only pages on data TLB error. |
| |
| Load the TLB anyway and take a DSI exception when it happens. This avoids |
| reading SPRN_ESR at every data TLB error exception. |
| |
| Link: https://lkml.kernel.org/r/8525518e1657d6032b7e980c1888102828d66950.1719928057.git.christophe.leroy@csgroup.eu |
| Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Cc: Jason Gunthorpe <jgg@nvidia.com> |
| Cc: Michael Ellerman <mpe@ellerman.id.au> |
| Cc: Nicholas Piggin <npiggin@gmail.com> |
| Cc: Oscar Salvador <osalvador@suse.de> |
| Cc: Peter Xu <peterx@redhat.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| arch/powerpc/kernel/head_85xx.S | 15 --------------- |
| 1 file changed, 15 deletions(-) |
| |
| --- a/arch/powerpc/kernel/head_85xx.S~powerpc-e500-dont-pre-check-write-access-on-data-tlb-error |
| +++ a/arch/powerpc/kernel/head_85xx.S |
| @@ -472,27 +472,12 @@ END_BTB_FLUSH_SECTION |
| #endif |
| |
| 4: |
| - /* Mask of required permission bits. Note that while we |
| - * do copy ESR:ST to _PAGE_WRITE position as trying to write |
| - * to an RO page is pretty common, we don't do it with |
| - * _PAGE_DIRTY. We could do it, but it's a fairly rare |
| - * event so I'd rather take the overhead when it happens |
| - * rather than adding an instruction here. We should measure |
| - * whether the whole thing is worth it in the first place |
| - * as we could avoid loading SPRN_ESR completely in the first |
| - * place... |
| - * |
| - * TODO: Is it worth doing that mfspr & rlwimi in the first |
| - * place or can we save a couple of instructions here ? |
| - */ |
| - mfspr r12,SPRN_ESR |
| #ifdef CONFIG_PTE_64BIT |
| li r13,_PAGE_PRESENT|_PAGE_BAP_SR |
| oris r13,r13,_PAGE_ACCESSED@h |
| #else |
| li r13,_PAGE_PRESENT|_PAGE_READ|_PAGE_ACCESSED |
| #endif |
| - rlwimi r13,r12,11,29,29 |
| |
| FIND_PTE |
| andc. r13,r13,r11 /* Check permission */ |
| _ |