tlb.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * arch/arm/include/asm/tlb.h
  4. *
  5. * Copyright (C) 2002 Russell King
  6. *
  7. * Experimentation shows that on a StrongARM, it appears to be faster
  8. * to use the "invalidate whole tlb" rather than "invalidate single
  9. * tlb" for this.
  10. *
  11. * This appears true for both the process fork+exit case, as well as
  12. * the munmap-large-area case.
  13. */
  14. #ifndef __ASMARM_TLB_H
  15. #define __ASMARM_TLB_H
  16. #include <asm/cacheflush.h>
  17. #ifndef CONFIG_MMU
  18. #include <linux/pagemap.h>
  19. #define tlb_flush(tlb) ((void) tlb)
  20. #include <asm-generic/tlb.h>
  21. #else /* !CONFIG_MMU */
  22. #include <linux/swap.h>
  23. #include <asm/tlbflush.h>
  24. static inline void __tlb_remove_table(void *_table)
  25. {
  26. free_page_and_swap_cache((struct page *)_table);
  27. }
  28. #include <asm-generic/tlb.h>
  29. static inline void
  30. __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, unsigned long addr)
  31. {
  32. pgtable_pte_page_dtor(pte);
  33. #ifndef CONFIG_ARM_LPAE
  34. /*
  35. * With the classic ARM MMU, a pte page has two corresponding pmd
  36. * entries, each covering 1MB.
  37. */
  38. addr = (addr & PMD_MASK) + SZ_1M;
  39. __tlb_adjust_range(tlb, addr - PAGE_SIZE, 2 * PAGE_SIZE);
  40. #endif
  41. tlb_remove_table(tlb, pte);
  42. }
  43. static inline void
  44. __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, unsigned long addr)
  45. {
  46. #ifdef CONFIG_ARM_LPAE
  47. struct page *page = virt_to_page(pmdp);
  48. pgtable_pmd_page_dtor(page);
  49. tlb_remove_table(tlb, page);
  50. #endif
  51. }
  52. #endif /* CONFIG_MMU */
  53. #endif