Commit c9cfcddfd65735437a4cb8563d6b66a6da8a5ed6
1 parent
4168f7a318
Exists in
master
and in
39 other branches
VM: add common helper function to create the page tables
This logic was duplicated four times, for no good reason. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 4 changed files with 19 additions and 45 deletions Side-by-side Diff
fs/exec.c
... | ... | @@ -306,9 +306,6 @@ |
306 | 306 | struct page *page, unsigned long address) |
307 | 307 | { |
308 | 308 | struct mm_struct *mm = vma->vm_mm; |
309 | - pgd_t * pgd; | |
310 | - pud_t * pud; | |
311 | - pmd_t * pmd; | |
312 | 309 | pte_t * pte; |
313 | 310 | spinlock_t *ptl; |
314 | 311 | |
... | ... | @@ -316,14 +313,7 @@ |
316 | 313 | goto out; |
317 | 314 | |
318 | 315 | flush_dcache_page(page); |
319 | - pgd = pgd_offset(mm, address); | |
320 | - pud = pud_alloc(mm, pgd, address); | |
321 | - if (!pud) | |
322 | - goto out; | |
323 | - pmd = pmd_alloc(mm, pud, address); | |
324 | - if (!pmd) | |
325 | - goto out; | |
326 | - pte = pte_alloc_map_lock(mm, pmd, address, &ptl); | |
316 | + pte = get_locked_pte(mm, address, &ptl); | |
327 | 317 | if (!pte) |
328 | 318 | goto out; |
329 | 319 | if (!pte_none(*pte)) { |
include/linux/mm.h
... | ... | @@ -742,6 +742,8 @@ |
742 | 742 | extern struct shrinker *set_shrinker(int, shrinker_t); |
743 | 743 | extern void remove_shrinker(struct shrinker *shrinker); |
744 | 744 | |
745 | +extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)); | |
746 | + | |
745 | 747 | int __pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address); |
746 | 748 | int __pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address); |
747 | 749 | int __pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address); |
mm/fremap.c
... | ... | @@ -55,20 +55,10 @@ |
55 | 55 | pgoff_t size; |
56 | 56 | int err = -ENOMEM; |
57 | 57 | pte_t *pte; |
58 | - pmd_t *pmd; | |
59 | - pud_t *pud; | |
60 | - pgd_t *pgd; | |
61 | 58 | pte_t pte_val; |
62 | 59 | spinlock_t *ptl; |
63 | 60 | |
64 | - pgd = pgd_offset(mm, addr); | |
65 | - pud = pud_alloc(mm, pgd, addr); | |
66 | - if (!pud) | |
67 | - goto out; | |
68 | - pmd = pmd_alloc(mm, pud, addr); | |
69 | - if (!pmd) | |
70 | - goto out; | |
71 | - pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | |
61 | + pte = get_locked_pte(mm, addr, &ptl); | |
72 | 62 | if (!pte) |
73 | 63 | goto out; |
74 | 64 | |
75 | 65 | |
... | ... | @@ -110,20 +100,10 @@ |
110 | 100 | { |
111 | 101 | int err = -ENOMEM; |
112 | 102 | pte_t *pte; |
113 | - pmd_t *pmd; | |
114 | - pud_t *pud; | |
115 | - pgd_t *pgd; | |
116 | 103 | pte_t pte_val; |
117 | 104 | spinlock_t *ptl; |
118 | 105 | |
119 | - pgd = pgd_offset(mm, addr); | |
120 | - pud = pud_alloc(mm, pgd, addr); | |
121 | - if (!pud) | |
122 | - goto out; | |
123 | - pmd = pmd_alloc(mm, pud, addr); | |
124 | - if (!pmd) | |
125 | - goto out; | |
126 | - pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | |
106 | + pte = get_locked_pte(mm, addr, &ptl); | |
127 | 107 | if (!pte) |
128 | 108 | goto out; |
129 | 109 |
mm/memory.c
... | ... | @@ -1146,6 +1146,18 @@ |
1146 | 1146 | return err; |
1147 | 1147 | } |
1148 | 1148 | |
1149 | +pte_t *get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl) | |
1150 | +{ | |
1151 | + pgd_t * pgd = pgd_offset(mm, addr); | |
1152 | + pud_t * pud = pud_alloc(mm, pgd, addr); | |
1153 | + if (pud) { | |
1154 | + pmd_t * pmd = pmd_alloc(mm, pgd, addr); | |
1155 | + if (pmd) | |
1156 | + return pte_alloc_map_lock(mm, pmd, addr, ptl); | |
1157 | + } | |
1158 | + return NULL; | |
1159 | +} | |
1160 | + | |
1149 | 1161 | /* |
1150 | 1162 | * This is the old fallback for page remapping. |
1151 | 1163 | * |
... | ... | @@ -1156,10 +1168,7 @@ |
1156 | 1168 | static int insert_page(struct mm_struct *mm, unsigned long addr, struct page *page, pgprot_t prot) |
1157 | 1169 | { |
1158 | 1170 | int retval; |
1159 | - pgd_t * pgd; | |
1160 | - pud_t * pud; | |
1161 | - pmd_t * pmd; | |
1162 | - pte_t * pte; | |
1171 | + pte_t *pte; | |
1163 | 1172 | spinlock_t *ptl; |
1164 | 1173 | |
1165 | 1174 | retval = -EINVAL; |
... | ... | @@ -1167,14 +1176,7 @@ |
1167 | 1176 | goto out; |
1168 | 1177 | retval = -ENOMEM; |
1169 | 1178 | flush_dcache_page(page); |
1170 | - pgd = pgd_offset(mm, addr); | |
1171 | - pud = pud_alloc(mm, pgd, addr); | |
1172 | - if (!pud) | |
1173 | - goto out; | |
1174 | - pmd = pmd_alloc(mm, pud, addr); | |
1175 | - if (!pmd) | |
1176 | - goto out; | |
1177 | - pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | |
1179 | + pte = get_locked_pte(mm, addr, &ptl); | |
1178 | 1180 | if (!pte) |
1179 | 1181 | goto out; |
1180 | 1182 | retval = -EBUSY; |