hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *    TLB shootdown specifics for powerpc
 *
 * Copyright (C) 2002 Anton Blanchard, IBM Corp.
 * Copyright (C) 2002 Paul Mackerras, IBM Corp.
 */
#ifndef _ASM_POWERPC_TLB_H
#define _ASM_POWERPC_TLB_H
#ifdef __KERNEL__
 
#ifndef __powerpc64__
#include <linux/pgtable.h>
#endif
#ifndef __powerpc64__
#include <asm/page.h>
#include <asm/mmu.h>
#endif
 
#include <linux/pagemap.h>
 
#define tlb_start_vma(tlb, vma)    do { } while (0)
#define tlb_end_vma(tlb, vma)    do { } while (0)
#define __tlb_remove_tlb_entry    __tlb_remove_tlb_entry
 
#define tlb_flush tlb_flush
extern void tlb_flush(struct mmu_gather *tlb);
/*
 * book3s:
 * Hash does not use the linux page-tables, so we can avoid
 * the TLB invalidate for page-table freeing, Radix otoh does use the
 * page-tables and needs the TLBI.
 *
 * nohash:
 * We still do TLB invalidate in the __pte_free_tlb routine before we
 * add the page table pages to mmu gather table batch.
 */
#define tlb_needs_table_invalidate()    radix_enabled()
 
/* Get the generic bits... */
#include <asm-generic/tlb.h>
 
extern void flush_hash_entry(struct mm_struct *mm, pte_t *ptep,
                unsigned long address);
 
static inline void __tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep,
                     unsigned long address)
{
#ifdef CONFIG_PPC_BOOK3S_32
   if (pte_val(*ptep) & _PAGE_HASHPTE)
       flush_hash_entry(tlb->mm, ptep, address);
#endif
}
 
#ifdef CONFIG_SMP
static inline int mm_is_core_local(struct mm_struct *mm)
{
   return cpumask_subset(mm_cpumask(mm),
                 topology_sibling_cpumask(smp_processor_id()));
}
 
#ifdef CONFIG_PPC_BOOK3S_64
static inline int mm_is_thread_local(struct mm_struct *mm)
{
   if (atomic_read(&mm->context.active_cpus) > 1)
       return false;
   return cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm));
}
#else /* CONFIG_PPC_BOOK3S_64 */
static inline int mm_is_thread_local(struct mm_struct *mm)
{
   return cpumask_equal(mm_cpumask(mm),
                 cpumask_of(smp_processor_id()));
}
#endif /* !CONFIG_PPC_BOOK3S_64 */
 
#else /* CONFIG_SMP */
static inline int mm_is_core_local(struct mm_struct *mm)
{
   return 1;
}
 
static inline int mm_is_thread_local(struct mm_struct *mm)
{
   return 1;
}
#endif
 
#endif /* __KERNEL__ */
#endif /* __ASM_POWERPC_TLB_H */