~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/pagewalk.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/pagewalk.h (Version linux-6.12-rc7) and /include/linux/pagewalk.h (Version linux-5.9.16)


  1 /* SPDX-License-Identifier: GPL-2.0 */              1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef _LINUX_PAGEWALK_H                           2 #ifndef _LINUX_PAGEWALK_H
  3 #define _LINUX_PAGEWALK_H                           3 #define _LINUX_PAGEWALK_H
  4                                                     4 
  5 #include <linux/mm.h>                               5 #include <linux/mm.h>
  6                                                     6 
  7 struct mm_walk;                                     7 struct mm_walk;
  8                                                     8 
  9 /* Locking requirement during a page walk. */  << 
 10 enum page_walk_lock {                          << 
 11         /* mmap_lock should be locked for read << 
 12         PGWALK_RDLOCK = 0,                     << 
 13         /* vma will be write-locked during the << 
 14         PGWALK_WRLOCK = 1,                     << 
 15         /* vma is expected to be already write << 
 16         PGWALK_WRLOCK_VERIFY = 2,              << 
 17 };                                             << 
 18                                                << 
 19 /**                                                 9 /**
 20  * struct mm_walk_ops - callbacks for walk_pag !!  10  * mm_walk_ops - callbacks for walk_page_range
 21  * @pgd_entry:          if set, called for eac     11  * @pgd_entry:          if set, called for each non-empty PGD (top-level) entry
 22  * @p4d_entry:          if set, called for eac     12  * @p4d_entry:          if set, called for each non-empty P4D entry
 23  * @pud_entry:          if set, called for eac     13  * @pud_entry:          if set, called for each non-empty PUD entry
 24  * @pmd_entry:          if set, called for eac     14  * @pmd_entry:          if set, called for each non-empty PMD entry
 25  *                      this handler is requir     15  *                      this handler is required to be able to handle
 26  *                      pmd_trans_huge() pmds.     16  *                      pmd_trans_huge() pmds.  They may simply choose to
 27  *                      split_huge_page() inst     17  *                      split_huge_page() instead of handling it explicitly.
 28  * @pte_entry:          if set, called for eac !!  18  * @pte_entry:          if set, called for each non-empty PTE (lowest-level)
 29  *                      including empty ones   !!  19  *                      entry
 30  * @pte_hole:           if set, called for eac     20  * @pte_hole:           if set, called for each hole at all levels,
 31  *                      depth is -1 if not kno !!  21  *                      depth is -1 if not known, 0:PGD, 1:P4D, 2:PUD, 3:PMD
 32  *                      Any folded depths (whe !!  22  *                      4:PTE. Any folded depths (where PTRS_PER_P?D is equal
 33  *                      are skipped.           !!  23  *                      to 1) are skipped.
 34  * @hugetlb_entry:      if set, called for eac !!  24  * @hugetlb_entry:      if set, called for each hugetlb entry
 35  *                      function is called wit << 
 36  *                      protect against a conc << 
 37  *                      the ptl. In some cases << 
 38  *                      and retake the vma loc << 
 39  *                      while calling other fu << 
 40  *                      function must either r << 
 41  *                      ptl after dropping the << 
 42  *                      those items after re-a << 
 43  *                      accessing them.        << 
 44  * @test_walk:          caller specific callba     25  * @test_walk:          caller specific callback function to determine whether
 45  *                      we walk over the curre     26  *                      we walk over the current vma or not. Returning 0 means
 46  *                      "do page table walk ov     27  *                      "do page table walk over the current vma", returning
 47  *                      a negative value means     28  *                      a negative value means "abort current page table walk
 48  *                      right now" and returni     29  *                      right now" and returning 1 means "skip the current vma"
 49  *                      Note that this callbac << 
 50  *                      passes in a single VMA << 
 51  * @pre_vma:            if set, called before      30  * @pre_vma:            if set, called before starting walk on a non-null vma.
 52  * @post_vma:           if set, called after a     31  * @post_vma:           if set, called after a walk on a non-null vma, provided
 53  *                      that @pre_vma and the      32  *                      that @pre_vma and the vma walk succeeded.
 54  *                                                 33  *
 55  * p?d_entry callbacks are called even if thos     34  * p?d_entry callbacks are called even if those levels are folded on a
 56  * particular architecture/configuration.          35  * particular architecture/configuration.
 57  */                                                36  */
 58 struct mm_walk_ops {                               37 struct mm_walk_ops {
 59         int (*pgd_entry)(pgd_t *pgd, unsigned      38         int (*pgd_entry)(pgd_t *pgd, unsigned long addr,
 60                          unsigned long next, s     39                          unsigned long next, struct mm_walk *walk);
 61         int (*p4d_entry)(p4d_t *p4d, unsigned      40         int (*p4d_entry)(p4d_t *p4d, unsigned long addr,
 62                          unsigned long next, s     41                          unsigned long next, struct mm_walk *walk);
 63         int (*pud_entry)(pud_t *pud, unsigned      42         int (*pud_entry)(pud_t *pud, unsigned long addr,
 64                          unsigned long next, s     43                          unsigned long next, struct mm_walk *walk);
 65         int (*pmd_entry)(pmd_t *pmd, unsigned      44         int (*pmd_entry)(pmd_t *pmd, unsigned long addr,
 66                          unsigned long next, s     45                          unsigned long next, struct mm_walk *walk);
 67         int (*pte_entry)(pte_t *pte, unsigned      46         int (*pte_entry)(pte_t *pte, unsigned long addr,
 68                          unsigned long next, s     47                          unsigned long next, struct mm_walk *walk);
 69         int (*pte_hole)(unsigned long addr, un     48         int (*pte_hole)(unsigned long addr, unsigned long next,
 70                         int depth, struct mm_w     49                         int depth, struct mm_walk *walk);
 71         int (*hugetlb_entry)(pte_t *pte, unsig     50         int (*hugetlb_entry)(pte_t *pte, unsigned long hmask,
 72                              unsigned long add     51                              unsigned long addr, unsigned long next,
 73                              struct mm_walk *w     52                              struct mm_walk *walk);
 74         int (*test_walk)(unsigned long addr, u     53         int (*test_walk)(unsigned long addr, unsigned long next,
 75                         struct mm_walk *walk);     54                         struct mm_walk *walk);
 76         int (*pre_vma)(unsigned long start, un     55         int (*pre_vma)(unsigned long start, unsigned long end,
 77                        struct mm_walk *walk);      56                        struct mm_walk *walk);
 78         void (*post_vma)(struct mm_walk *walk)     57         void (*post_vma)(struct mm_walk *walk);
 79         enum page_walk_lock walk_lock;         << 
 80 };                                                 58 };
 81                                                    59 
 82 /*                                                 60 /*
 83  * Action for pud_entry / pmd_entry callbacks.     61  * Action for pud_entry / pmd_entry callbacks.
 84  * ACTION_SUBTREE is the default                   62  * ACTION_SUBTREE is the default
 85  */                                                63  */
 86 enum page_walk_action {                            64 enum page_walk_action {
 87         /* Descend to next level, splitting hu     65         /* Descend to next level, splitting huge pages if needed and possible */
 88         ACTION_SUBTREE = 0,                        66         ACTION_SUBTREE = 0,
 89         /* Continue to next entry at this leve     67         /* Continue to next entry at this level (ignoring any subtree) */
 90         ACTION_CONTINUE = 1,                       68         ACTION_CONTINUE = 1,
 91         /* Call again for this entry */            69         /* Call again for this entry */
 92         ACTION_AGAIN = 2                           70         ACTION_AGAIN = 2
 93 };                                                 71 };
 94                                                    72 
 95 /**                                                73 /**
 96  * struct mm_walk - walk_page_range data       !!  74  * mm_walk - walk_page_range data
 97  * @ops:        operation to call during the w     75  * @ops:        operation to call during the walk
 98  * @mm:         mm_struct representing the tar     76  * @mm:         mm_struct representing the target process of page table walk
 99  * @pgd:        pointer to PGD; only valid wit     77  * @pgd:        pointer to PGD; only valid with no_vma (otherwise set to NULL)
100  * @vma:        vma currently walked (NULL if      78  * @vma:        vma currently walked (NULL if walking outside vmas)
101  * @action:     next action to perform (see en     79  * @action:     next action to perform (see enum page_walk_action)
102  * @no_vma:     walk ignoring vmas (vma will a     80  * @no_vma:     walk ignoring vmas (vma will always be NULL)
103  * @private:    private data for callbacks' us     81  * @private:    private data for callbacks' usage
104  *                                                 82  *
105  * (see the comment on walk_page_range() for m     83  * (see the comment on walk_page_range() for more details)
106  */                                                84  */
107 struct mm_walk {                                   85 struct mm_walk {
108         const struct mm_walk_ops *ops;             86         const struct mm_walk_ops *ops;
109         struct mm_struct *mm;                      87         struct mm_struct *mm;
110         pgd_t *pgd;                                88         pgd_t *pgd;
111         struct vm_area_struct *vma;                89         struct vm_area_struct *vma;
112         enum page_walk_action action;              90         enum page_walk_action action;
113         bool no_vma;                               91         bool no_vma;
114         void *private;                             92         void *private;
115 };                                                 93 };
116                                                    94 
117 int walk_page_range(struct mm_struct *mm, unsi     95 int walk_page_range(struct mm_struct *mm, unsigned long start,
118                 unsigned long end, const struc     96                 unsigned long end, const struct mm_walk_ops *ops,
119                 void *private);                    97                 void *private);
120 int walk_page_range_novma(struct mm_struct *mm     98 int walk_page_range_novma(struct mm_struct *mm, unsigned long start,
121                           unsigned long end, c     99                           unsigned long end, const struct mm_walk_ops *ops,
122                           pgd_t *pgd,             100                           pgd_t *pgd,
123                           void *private);         101                           void *private);
124 int walk_page_range_vma(struct vm_area_struct  << 
125                         unsigned long end, con << 
126                         void *private);        << 
127 int walk_page_vma(struct vm_area_struct *vma,     102 int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,
128                 void *private);                   103                 void *private);
129 int walk_page_mapping(struct address_space *ma    104 int walk_page_mapping(struct address_space *mapping, pgoff_t first_index,
130                       pgoff_t nr, const struct    105                       pgoff_t nr, const struct mm_walk_ops *ops,
131                       void *private);             106                       void *private);
132                                                << 
133 typedef int __bitwise folio_walk_flags_t;      << 
134                                                << 
135 /*                                             << 
136  * Walk migration entries as well. Careful: a  << 
137  * concurrently.                               << 
138  */                                            << 
139 #define FW_MIGRATION                    ((__fo << 
140                                                << 
141 /* Walk shared zeropages (small + huge) as wel << 
142 #define FW_ZEROPAGE                     ((__fo << 
143                                                << 
144 enum folio_walk_level {                        << 
145         FW_LEVEL_PTE,                          << 
146         FW_LEVEL_PMD,                          << 
147         FW_LEVEL_PUD,                          << 
148 };                                             << 
149                                                << 
150 /**                                            << 
151  * struct folio_walk - folio_walk_start() / fo << 
152  * @page:       exact folio page referenced (i << 
153  * @level:      page table level identifying t << 
154  * @pte:        pointer to the page table entr << 
155  * @pmd:        pointer to the page table entr << 
156  * @pud:        pointer to the page table entr << 
157  * @ptl:        pointer to the page table lock << 
158  *                                             << 
159  * (see folio_walk_start() documentation for m << 
160  */                                            << 
161 struct folio_walk {                            << 
162         /* public */                           << 
163         struct page *page;                     << 
164         enum folio_walk_level level;           << 
165         union {                                << 
166                 pte_t *ptep;                   << 
167                 pud_t *pudp;                   << 
168                 pmd_t *pmdp;                   << 
169         };                                     << 
170         union {                                << 
171                 pte_t pte;                     << 
172                 pud_t pud;                     << 
173                 pmd_t pmd;                     << 
174         };                                     << 
175         /* private */                          << 
176         struct vm_area_struct *vma;            << 
177         spinlock_t *ptl;                       << 
178 };                                             << 
179                                                << 
180 struct folio *folio_walk_start(struct folio_wa << 
181                 struct vm_area_struct *vma, un << 
182                 folio_walk_flags_t flags);     << 
183                                                << 
184 #define folio_walk_end(__fw, __vma) do { \     << 
185         spin_unlock((__fw)->ptl); \            << 
186         if (likely((__fw)->level == FW_LEVEL_P << 
187                 pte_unmap((__fw)->ptep); \     << 
188         vma_pgtable_walk_end(__vma); \         << 
189 } while (0)                                    << 
190                                                   107 
191 #endif /* _LINUX_PAGEWALK_H */                    108 #endif /* _LINUX_PAGEWALK_H */
192                                                   109 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php