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

TOMOYO Linux Cross Reference
Linux/mm/memory.c

Version: ~ [ linux-5.16 ] ~ [ linux-5.15.13 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.90 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.170 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.224 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.261 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.296 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.298 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ 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.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  linux/mm/memory.c
  3  *
  4  *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
  5  */
  6 
  7 /*
  8  * demand-loading started 01.12.91 - seems it is high on the list of
  9  * things wanted, and it should be easy to implement. - Linus
 10  */
 11 
 12 /*
 13  * Ok, demand-loading was easy, shared pages a little bit tricker. Shared
 14  * pages started 02.12.91, seems to work. - Linus.
 15  *
 16  * Tested sharing by executing about 30 /bin/sh: under the old kernel it
 17  * would have taken more than the 6M I have free, but it worked well as
 18  * far as I could see.
 19  *
 20  * Also corrected some "invalidate()"s - I wasn't doing enough of them.
 21  */
 22 
 23 /*
 24  * Real VM (paging to/from disk) started 18.12.91. Much more work and
 25  * thought has to go into this. Oh, well..
 26  * 19.12.91  -  works, somewhat. Sometimes I get faults, don't know why.
 27  *              Found it. Everything seems to work now.
 28  * 20.12.91  -  Ok, making the swap-device changeable like the root.
 29  */
 30 
 31 /*
 32  * 05.04.94  -  Multi-page memory management added for v1.1.
 33  *              Idea by Alex Bligh (alex@cconcepts.co.uk)
 34  *
 35  * 16.07.99  -  Support of BIGMEM added by Gerhard Wichert, Siemens AG
 36  *              (Gerhard.Wichert@pdb.siemens.de)
 37  */
 38 
 39 #include <linux/mm.h>
 40 #include <linux/mman.h>
 41 #include <linux/swap.h>
 42 #include <linux/smp_lock.h>
 43 #include <linux/swapctl.h>
 44 #include <linux/iobuf.h>
 45 #include <linux/highmem.h>
 46 #include <linux/pagemap.h>
 47 #include <linux/module.h>
 48 
 49 #include <asm/pgalloc.h>
 50 #include <asm/uaccess.h>
 51 #include <asm/tlb.h>
 52 
 53 unsigned long max_mapnr;
 54 unsigned long num_physpages;
 55 unsigned long num_mappedpages;
 56 void * high_memory;
 57 struct page *highmem_start_page;
 58 
 59 /*
 60  * We special-case the C-O-W ZERO_PAGE, because it's such
 61  * a common occurrence (no need to read the page to know
 62  * that it's zero - better for the cache and memory subsystem).
 63  */
 64 static inline void copy_cow_page(struct page * from, struct page * to, unsigned long address)
 65 {
 66         if (from == ZERO_PAGE(address)) {
 67                 clear_user_highpage(to, address);
 68                 return;
 69         }
 70         copy_user_highpage(to, from, address);
 71 }
 72 
 73 mem_map_t * mem_map;
 74 
 75 /*
 76  * Called by TLB shootdown 
 77  */
 78 void __free_pte(pte_t pte)
 79 {
 80         struct page *page = pte_page(pte);
 81         if ((!VALID_PAGE(page)) || PageReserved(page))
 82                 return;
 83         if (pte_dirty(pte))
 84                 set_page_dirty(page);           
 85         free_page_and_swap_cache(page);
 86 }
 87 
 88 
 89 /*
 90  * Note: this doesn't free the actual pages themselves. That
 91  * has been handled earlier when unmapping all the memory regions.
 92  */
 93 static inline void free_one_pmd(pmd_t * dir)
 94 {
 95         pte_t * pte;
 96 
 97         if (pmd_none(*dir))
 98                 return;
 99         if (pmd_bad(*dir)) {
100                 pmd_ERROR(*dir);
101                 pmd_clear(dir);
102                 return;
103         }
104         pte = pte_offset(dir, 0);
105         pmd_clear(dir);
106         pte_free(pte);
107 }
108 
109 static inline void free_one_pgd(pgd_t * dir)
110 {
111         int j;
112         pmd_t * pmd;
113 
114         if (pgd_none(*dir))
115                 return;
116         if (pgd_bad(*dir)) {
117                 pgd_ERROR(*dir);
118                 pgd_clear(dir);
119                 return;
120         }
121         pmd = pmd_offset(dir, 0);
122         pgd_clear(dir);
123         for (j = 0; j < PTRS_PER_PMD ; j++) {
124                 prefetchw(pmd+j+(PREFETCH_STRIDE/16));
125                 free_one_pmd(pmd+j);
126         }
127         pmd_free(pmd);
128 }
129 
130 /* Low and high watermarks for page table cache.
131    The system should try to have pgt_water[0] <= cache elements <= pgt_water[1]
132  */
133 int pgt_cache_water[2] = { 25, 50 };
134 
135 /* Returns the number of pages freed */
136 int check_pgt_cache(void)
137 {
138         return do_check_pgt_cache(pgt_cache_water[0], pgt_cache_water[1]);
139 }
140 
141 
142 /*
143  * This function clears all user-level page tables of a process - this
144  * is needed by execve(), so that old pages aren't in the way.
145  */
146 void clear_page_tables(struct mm_struct *mm, unsigned long first, int nr)
147 {
148         pgd_t * page_dir = mm->pgd;
149 
150         spin_lock(&mm->page_table_lock);
151         page_dir += first;
152         do {
153                 free_one_pgd(page_dir);
154                 page_dir++;
155         } while (--nr);
156         spin_unlock(&mm->page_table_lock);
157 
158         /* keep the page table cache within bounds */
159         check_pgt_cache();
160 }
161 
162 #define PTE_TABLE_MASK  ((PTRS_PER_PTE-1) * sizeof(pte_t))
163 #define PMD_TABLE_MASK  ((PTRS_PER_PMD-1) * sizeof(pmd_t))
164 
165 /*
166  * copy one vm_area from one task to the other. Assumes the page tables
167  * already present in the new task to be cleared in the whole range
168  * covered by this vma.
169  *
170  * 08Jan98 Merged into one routine from several inline routines to reduce
171  *         variable count and make things faster. -jj
172  *
173  * dst->page_table_lock is held on entry and exit,
174  * but may be dropped within pmd_alloc() and pte_alloc().
175  */
176 int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
177                         struct vm_area_struct *vma)
178 {
179         pgd_t * src_pgd, * dst_pgd;
180         unsigned long address = vma->vm_start;
181         unsigned long end = vma->vm_end;
182         unsigned long cow = (vma->vm_flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
183 
184         src_pgd = pgd_offset(src, address)-1;
185         dst_pgd = pgd_offset(dst, address)-1;
186 
187         for (;;) {
188                 pmd_t * src_pmd, * dst_pmd;
189 
190                 src_pgd++; dst_pgd++;
191                 
192                 /* copy_pmd_range */
193                 
194                 if (pgd_none(*src_pgd))
195                         goto skip_copy_pmd_range;
196                 if (pgd_bad(*src_pgd)) {
197                         pgd_ERROR(*src_pgd);
198                         pgd_clear(src_pgd);
199 skip_copy_pmd_range:    address = (address + PGDIR_SIZE) & PGDIR_MASK;
200                         if (!address || (address >= end))
201                                 goto out;
202                         continue;
203                 }
204 
205                 src_pmd = pmd_offset(src_pgd, address);
206                 dst_pmd = pmd_alloc(dst, dst_pgd, address);
207                 if (!dst_pmd)
208                         goto nomem;
209 
210                 do {
211                         pte_t * src_pte, * dst_pte;
212                 
213                         /* copy_pte_range */
214                 
215                         if (pmd_none(*src_pmd))
216                                 goto skip_copy_pte_range;
217                         if (pmd_bad(*src_pmd)) {
218                                 pmd_ERROR(*src_pmd);
219                                 pmd_clear(src_pmd);
220 skip_copy_pte_range:            address = (address + PMD_SIZE) & PMD_MASK;
221                                 if (address >= end)
222                                         goto out;
223                                 goto cont_copy_pmd_range;
224                         }
225 
226                         src_pte = pte_offset(src_pmd, address);
227                         dst_pte = pte_alloc(dst, dst_pmd, address);
228                         if (!dst_pte)
229                                 goto nomem;
230 
231                         spin_lock(&src->page_table_lock);                       
232                         do {
233                                 pte_t pte = *src_pte;
234                                 struct page *ptepage;
235                                 
236                                 /* copy_one_pte */
237 
238                                 if (pte_none(pte))
239                                         goto cont_copy_pte_range_noset;
240                                 if (!pte_present(pte)) {
241                                         swap_duplicate(pte_to_swp_entry(pte));
242                                         goto cont_copy_pte_range;
243                                 }
244                                 ptepage = pte_page(pte);
245                                 if ((!VALID_PAGE(ptepage)) || 
246                                     PageReserved(ptepage))
247                                         goto cont_copy_pte_range;
248 
249                                 /* If it's a COW mapping, write protect it both in the parent and the child */
250                                 if (cow && pte_write(pte)) {
251                                         ptep_set_wrprotect(src_pte);
252                                         pte = *src_pte;
253                                 }
254 
255                                 /* If it's a shared mapping, mark it clean in the child */
256                                 if (vma->vm_flags & VM_SHARED)
257                                         pte = pte_mkclean(pte);
258                                 pte = pte_mkold(pte);
259                                 get_page(ptepage);
260                                 dst->rss++;
261 
262 cont_copy_pte_range:            set_pte(dst_pte, pte);
263 cont_copy_pte_range_noset:      address += PAGE_SIZE;
264                                 if (address >= end)
265                                         goto out_unlock;
266                                 src_pte++;
267                                 dst_pte++;
268                         } while ((unsigned long)src_pte & PTE_TABLE_MASK);
269                         spin_unlock(&src->page_table_lock);
270                 
271 cont_copy_pmd_range:    src_pmd++;
272                         dst_pmd++;
273                 } while ((unsigned long)src_pmd & PMD_TABLE_MASK);
274         }
275 out_unlock:
276         spin_unlock(&src->page_table_lock);
277 out:
278         return 0;
279 nomem:
280         return -ENOMEM;
281 }
282 
283 /*
284  * Return indicates whether a page was freed so caller can adjust rss
285  */
286 static inline void forget_pte(pte_t page)
287 {
288         if (!pte_none(page)) {
289                 printk("forget_pte: old mapping existed!\n");
290                 BUG();
291         }
292 }
293 
294 static inline int zap_pte_range(mmu_gather_t *tlb, pmd_t * pmd, unsigned long address, unsigned long size)
295 {
296         unsigned long offset;
297         pte_t * ptep;
298         int freed = 0;
299 
300         if (pmd_none(*pmd))
301                 return 0;
302         if (pmd_bad(*pmd)) {
303                 pmd_ERROR(*pmd);
304                 pmd_clear(pmd);
305                 return 0;
306         }
307         ptep = pte_offset(pmd, address);
308         offset = address & ~PMD_MASK;
309         if (offset + size > PMD_SIZE)
310                 size = PMD_SIZE - offset;
311         size &= PAGE_MASK;
312         for (offset=0; offset < size; ptep++, offset += PAGE_SIZE) {
313                 pte_t pte = *ptep;
314                 if (pte_none(pte))
315                         continue;
316                 if (pte_present(pte)) {
317                         struct page *page = pte_page(pte);
318                         if (VALID_PAGE(page) && !PageReserved(page))
319                                 freed ++;
320                         /* This will eventually call __free_pte on the pte. */
321                         tlb_remove_page(tlb, ptep, address + offset);
322                 } else {
323                         free_swap_and_cache(pte_to_swp_entry(pte));
324                         pte_clear(ptep);
325                 }
326         }
327 
328         return freed;
329 }
330 
331 static inline int zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, unsigned long address, unsigned long size)
332 {
333         pmd_t * pmd;
334         unsigned long end;
335         int freed;
336 
337         if (pgd_none(*dir))
338                 return 0;
339         if (pgd_bad(*dir)) {
340                 pgd_ERROR(*dir);
341                 pgd_clear(dir);
342                 return 0;
343         }
344         pmd = pmd_offset(dir, address);
345         end = address + size;
346         if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
347                 end = ((address + PGDIR_SIZE) & PGDIR_MASK);
348         freed = 0;
349         do {
350                 freed += zap_pte_range(tlb, pmd, address, end - address);
351                 address = (address + PMD_SIZE) & PMD_MASK; 
352                 pmd++;
353         } while (address < end);
354         return freed;
355 }
356 
357 /*
358  * remove user pages in a given range.
359  */
360 void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size)
361 {
362         mmu_gather_t *tlb;
363         pgd_t * dir;
364         unsigned long start = address, end = address + size;
365         int freed = 0;
366 
367         dir = pgd_offset(mm, address);
368 
369         /*
370          * This is a long-lived spinlock. That's fine.
371          * There's no contention, because the page table
372          * lock only protects against kswapd anyway, and
373          * even if kswapd happened to be looking at this
374          * process we _want_ it to get stuck.
375          */
376         if (address >= end)
377                 BUG();
378         spin_lock(&mm->page_table_lock);
379         flush_cache_range(mm, address, end);
380         tlb = tlb_gather_mmu(mm);
381 
382         do {
383                 freed += zap_pmd_range(tlb, dir, address, end - address);
384                 address = (address + PGDIR_SIZE) & PGDIR_MASK;
385                 dir++;
386         } while (address && (address < end));
387 
388         /* this will flush any remaining tlb entries */
389         tlb_finish_mmu(tlb, start, end);
390 
391         /*
392          * Update rss for the mm_struct (not necessarily current->mm)
393          * Notice that rss is an unsigned long.
394          */
395         if (mm->rss > freed)
396                 mm->rss -= freed;
397         else
398                 mm->rss = 0;
399         spin_unlock(&mm->page_table_lock);
400 }
401 
402 /*
403  * Do a quick page-table lookup for a single page. 
404  */
405 static struct page * follow_page(struct mm_struct *mm, unsigned long address, int write) 
406 {
407         pgd_t *pgd;
408         pmd_t *pmd;
409         pte_t *ptep, pte;
410 
411         pgd = pgd_offset(mm, address);
412         if (pgd_none(*pgd) || pgd_bad(*pgd))
413                 goto out;
414 
415         pmd = pmd_offset(pgd, address);
416         if (pmd_none(*pmd) || pmd_bad(*pmd))
417                 goto out;
418 
419         ptep = pte_offset(pmd, address);
420         if (!ptep)
421                 goto out;
422 
423         pte = *ptep;
424         if (pte_present(pte)) {
425                 if (!write ||
426                     (pte_write(pte) && pte_dirty(pte)))
427                         return pte_page(pte);
428         }
429 
430 out:
431         return 0;
432 }
433 
434 /* 
435  * Given a physical address, is there a useful struct page pointing to
436  * it?  This may become more complex in the future if we start dealing
437  * with IO-aperture pages in kiobufs.
438  */
439 
440 static inline struct page * get_page_map(struct page *page)
441 {
442         if (!VALID_PAGE(page))
443                 return 0;
444         return page;
445 }
446 
447 /*
448  * Please read Documentation/cachetlb.txt before using this function,
449  * accessing foreign memory spaces can cause cache coherency problems.
450  *
451  * Accessing a VM_IO area is even more dangerous, therefore the function
452  * fails if pages is != NULL and a VM_IO area is found.
453  */
454 int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
455                 int len, int write, int force, struct page **pages, struct vm_area_struct **vmas)
456 {
457         int i;
458         unsigned int flags;
459 
460         /*
461          * Require read or write permissions.
462          * If 'force' is set, we only require the "MAY" flags.
463          */
464         flags = write ? (VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
465         flags &= force ? (VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
466         i = 0;
467 
468         do {
469                 struct vm_area_struct * vma;
470 
471                 vma = find_extend_vma(mm, start);
472 
473                 if ( !vma || (pages && vma->vm_flags & VM_IO) || !(flags & vma->vm_flags) )
474                         return i ? : -EFAULT;
475 
476                 spin_lock(&mm->page_table_lock);
477                 do {
478                         struct page *map;
479                         while (!(map = follow_page(mm, start, write))) {
480                                 spin_unlock(&mm->page_table_lock);
481                                 switch (handle_mm_fault(mm, vma, start, write)) {
482                                 case 1:
483                                         tsk->min_flt++;
484                                         break;
485                                 case 2:
486                                         tsk->maj_flt++;
487                                         break;
488                                 case 0:
489                                         if (i) return i;
490                                         return -EFAULT;
491                                 default:
492                                         if (i) return i;
493                                         return -ENOMEM;
494                                 }
495                                 spin_lock(&mm->page_table_lock);
496                         }
497                         if (pages) {
498                                 pages[i] = get_page_map(map);
499                                 /* FIXME: call the correct function,
500                                  * depending on the type of the found page
501                                  */
502                                 if (!pages[i] || PageReserved(pages[i])) {
503                                         if (pages[i] != ZERO_PAGE(start))
504                                                 goto bad_page;
505                                 } else
506                                         page_cache_get(pages[i]);
507                         }
508                         if (vmas)
509                                 vmas[i] = vma;
510                         i++;
511                         start += PAGE_SIZE;
512                         len--;
513                 } while(len && start < vma->vm_end);
514                 spin_unlock(&mm->page_table_lock);
515         } while(len);
516 out:
517         return i;
518 
519         /*
520          * We found an invalid page in the VMA.  Release all we have
521          * so far and fail.
522          */
523 bad_page:
524         spin_unlock(&mm->page_table_lock);
525         while (i--)
526                 page_cache_release(pages[i]);
527         i = -EFAULT;
528         goto out;
529 }
530 
531 EXPORT_SYMBOL(get_user_pages);
532 
533 /*
534  * Force in an entire range of pages from the current process's user VA,
535  * and pin them in physical memory.  
536  */
537 #define dprintk(x...)
538 
539 int map_user_kiobuf(int rw, struct kiobuf *iobuf, unsigned long va, size_t len)
540 {
541         int pgcount, err;
542         struct mm_struct *      mm;
543         
544         /* Make sure the iobuf is not already mapped somewhere. */
545         if (iobuf->nr_pages)
546                 return -EINVAL;
547 
548         mm = current->mm;
549         dprintk ("map_user_kiobuf: begin\n");
550         
551         pgcount = (va + len + PAGE_SIZE - 1)/PAGE_SIZE - va/PAGE_SIZE;
552         /* mapping 0 bytes is not permitted */
553         if (!pgcount) BUG();
554         err = expand_kiobuf(iobuf, pgcount);
555         if (err)
556                 return err;
557 
558         iobuf->locked = 0;
559         iobuf->offset = va & (PAGE_SIZE-1);
560         iobuf->length = len;
561         
562         /* Try to fault in all of the necessary pages */
563         down_read(&mm->mmap_sem);
564         /* rw==READ means read from disk, write into memory area */
565         err = get_user_pages(current, mm, va, pgcount,
566                         (rw==READ), 0, iobuf->maplist, NULL);
567         up_read(&mm->mmap_sem);
568         if (err < 0) {
569                 unmap_kiobuf(iobuf);
570                 dprintk ("map_user_kiobuf: end %d\n", err);
571                 return err;
572         }
573         iobuf->nr_pages = err;
574         while (pgcount--) {
575                 /* FIXME: flush superflous for rw==READ,
576                  * probably wrong function for rw==WRITE
577                  */
578                 flush_dcache_page(iobuf->maplist[pgcount]);
579         }
580         dprintk ("map_user_kiobuf: end OK\n");
581         return 0;
582 }
583 
584 /*
585  * Mark all of the pages in a kiobuf as dirty 
586  *
587  * We need to be able to deal with short reads from disk: if an IO error
588  * occurs, the number of bytes read into memory may be less than the
589  * size of the kiobuf, so we have to stop marking pages dirty once the
590  * requested byte count has been reached.
591  *
592  * Must be called from process context - set_page_dirty() takes VFS locks.
593  */
594 
595 void mark_dirty_kiobuf(struct kiobuf *iobuf, int bytes)
596 {
597         int index, offset, remaining;
598         struct page *page;
599         
600         index = iobuf->offset >> PAGE_SHIFT;
601         offset = iobuf->offset & ~PAGE_MASK;
602         remaining = bytes;
603         if (remaining > iobuf->length)
604                 remaining = iobuf->length;
605         
606         while (remaining > 0 && index < iobuf->nr_pages) {
607                 page = iobuf->maplist[index];
608                 
609                 if (!PageReserved(page))
610                         set_page_dirty(page);
611 
612                 remaining -= (PAGE_SIZE - offset);
613                 offset = 0;
614                 index++;
615         }
616 }
617 
618 /*
619  * Unmap all of the pages referenced by a kiobuf.  We release the pages,
620  * and unlock them if they were locked. 
621  */
622 
623 void unmap_kiobuf (struct kiobuf *iobuf) 
624 {
625         int i;
626         struct page *map;
627         
628         for (i = 0; i < iobuf->nr_pages; i++) {
629                 map = iobuf->maplist[i];
630                 if (map) {
631                         if (iobuf->locked)
632                                 UnlockPage(map);
633                         /* FIXME: cache flush missing for rw==READ
634                          * FIXME: call the correct reference counting function
635                          */
636                         page_cache_release(map);
637                 }
638         }
639         
640         iobuf->nr_pages = 0;
641         iobuf->locked = 0;
642 }
643 
644 
645 /*
646  * Lock down all of the pages of a kiovec for IO.
647  *
648  * If any page is mapped twice in the kiovec, we return the error -EINVAL.
649  *
650  * The optional wait parameter causes the lock call to block until all
651  * pages can be locked if set.  If wait==0, the lock operation is
652  * aborted if any locked pages are found and -EAGAIN is returned.
653  */
654 
655 int lock_kiovec(int nr, struct kiobuf *iovec[], int wait)
656 {
657         struct kiobuf *iobuf;
658         int i, j;
659         struct page *page, **ppage;
660         int doublepage = 0;
661         int repeat = 0;
662         
663  repeat:
664         
665         for (i = 0; i < nr; i++) {
666                 iobuf = iovec[i];
667 
668                 if (iobuf->locked)
669                         continue;
670 
671                 ppage = iobuf->maplist;
672                 for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
673                         page = *ppage;
674                         if (!page)
675                                 continue;
676                         
677                         if (TryLockPage(page)) {
678                                 while (j--) {
679                                         struct page *tmp = *--ppage;
680                                         if (tmp)
681                                                 UnlockPage(tmp);
682                                 }
683                                 goto retry;
684                         }
685                 }
686                 iobuf->locked = 1;
687         }
688 
689         return 0;
690         
691  retry:
692         
693         /* 
694          * We couldn't lock one of the pages.  Undo the locking so far,
695          * wait on the page we got to, and try again.  
696          */
697         
698         unlock_kiovec(nr, iovec);
699         if (!wait)
700                 return -EAGAIN;
701         
702         /* 
703          * Did the release also unlock the page we got stuck on?
704          */
705         if (!PageLocked(page)) {
706                 /* 
707                  * If so, we may well have the page mapped twice
708                  * in the IO address range.  Bad news.  Of
709                  * course, it _might_ just be a coincidence,
710                  * but if it happens more than once, chances
711                  * are we have a double-mapped page. 
712                  */
713                 if (++doublepage >= 3) 
714                         return -EINVAL;
715                 
716                 /* Try again...  */
717                 wait_on_page(page);
718         }
719         
720         if (++repeat < 16)
721                 goto repeat;
722         return -EAGAIN;
723 }
724 
725 /*
726  * Unlock all of the pages of a kiovec after IO.
727  */
728 
729 int unlock_kiovec(int nr, struct kiobuf *iovec[])
730 {
731         struct kiobuf *iobuf;
732         int i, j;
733         struct page *page, **ppage;
734         
735         for (i = 0; i < nr; i++) {
736                 iobuf = iovec[i];
737 
738                 if (!iobuf->locked)
739                         continue;
740                 iobuf->locked = 0;
741                 
742                 ppage = iobuf->maplist;
743                 for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
744                         page = *ppage;
745                         if (!page)
746                                 continue;
747                         UnlockPage(page);
748                 }
749         }
750         return 0;
751 }
752 
753 static inline int zeromap_pte_range(pte_t * pte, unsigned long address,
754                                      unsigned long size, pgprot_t prot)
755 {
756         unsigned long end;
757 
758         address &= ~PMD_MASK;
759         end = address + size;
760         if (end > PMD_SIZE)
761                 end = PMD_SIZE;
762         do {
763                 pte_t zero_pte = pte_wrprotect(mk_pte(ZERO_PAGE(address), prot));
764                 if (!pte_none(*pte))
765                         return -EEXIST;
766                 set_pte(pte, zero_pte);
767                 address += PAGE_SIZE;
768                 pte++;
769         } while (address && (address < end));
770         return 0;
771 }
772 
773 static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address,
774                                     unsigned long size, pgprot_t prot)
775 {
776         unsigned long end;
777 
778         address &= ~PGDIR_MASK;
779         end = address + size;
780         if (end > PGDIR_SIZE)
781                 end = PGDIR_SIZE;
782         do {
783                 pte_t * pte = pte_alloc(mm, pmd, address);
784                 if (!pte)
785                         return -ENOMEM;
786                 if (zeromap_pte_range(pte, address, end - address, prot))
787                         return -EEXIST;
788                 address = (address + PMD_SIZE) & PMD_MASK;
789                 pmd++;
790         } while (address && (address < end));
791         return 0;
792 }
793 
794 int zeromap_page_range(unsigned long address, unsigned long size, pgprot_t prot)
795 {
796         int error = 0;
797         pgd_t * dir;
798         unsigned long beg = address;
799         unsigned long end = address + size;
800         struct mm_struct *mm = current->mm;
801 
802         dir = pgd_offset(mm, address);
803         flush_cache_range(mm, beg, end);
804         if (address >= end)
805                 BUG();
806 
807         spin_lock(&mm->page_table_lock);
808         do {
809                 pmd_t *pmd = pmd_alloc(mm, dir, address);
810                 error = -ENOMEM;
811                 if (!pmd)
812                         break;
813                 error = zeromap_pmd_range(mm, pmd, address, end - address, prot);
814                 if (error)
815                         break;
816                 address = (address + PGDIR_SIZE) & PGDIR_MASK;
817                 dir++;
818         } while (address && (address < end));
819         spin_unlock(&mm->page_table_lock);
820         flush_tlb_range(mm, beg, end);
821         return error;
822 }
823 
824 /*
825  * maps a range of physical memory into the requested pages. the old
826  * mappings are removed. any references to nonexistent pages results
827  * in null mappings (currently treated as "copy-on-access")
828  */
829 static inline void remap_pte_range(pte_t * pte, unsigned long address, unsigned long size,
830         unsigned long phys_addr, pgprot_t prot)
831 {
832         unsigned long end;
833 
834         address &= ~PMD_MASK;
835         end = address + size;
836         if (end > PMD_SIZE)
837                 end = PMD_SIZE;
838         do {
839                 struct page *page;
840                 pte_t oldpage;
841                 oldpage = ptep_get_and_clear(pte);
842 
843                 page = virt_to_page(__va(phys_addr));
844                 if ((!VALID_PAGE(page)) || PageReserved(page))
845                         set_pte(pte, mk_pte_phys(phys_addr, prot));
846                 forget_pte(oldpage);
847                 address += PAGE_SIZE;
848                 phys_addr += PAGE_SIZE;
849                 pte++;
850         } while (address && (address < end));
851 }
852 
853 static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
854         unsigned long phys_addr, pgprot_t prot)
855 {
856         unsigned long end;
857 
858         address &= ~PGDIR_MASK;
859         end = address + size;
860         if (end > PGDIR_SIZE)
861                 end = PGDIR_SIZE;
862         phys_addr -= address;
863         do {
864                 pte_t * pte = pte_alloc(mm, pmd, address);
865                 if (!pte)
866                         return -ENOMEM;
867                 remap_pte_range(pte, address, end - address, address + phys_addr, prot);
868                 address = (address + PMD_SIZE) & PMD_MASK;
869                 pmd++;
870         } while (address && (address < end));
871         return 0;
872 }
873 
874 /*  Note: this is only safe if the mm semaphore is held when called. */
875 int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot)
876 {
877         int error = 0;
878         pgd_t * dir;
879         unsigned long beg = from;
880         unsigned long end = from + size;
881         struct mm_struct *mm = current->mm;
882 
883         phys_addr -= from;
884         dir = pgd_offset(mm, from);
885         flush_cache_range(mm, beg, end);
886         if (from >= end)
887                 BUG();
888 
889         spin_lock(&mm->page_table_lock);
890         do {
891                 pmd_t *pmd = pmd_alloc(mm, dir, from);
892                 error = -ENOMEM;
893                 if (!pmd)
894                         break;
895                 error = remap_pmd_range(mm, pmd, from, end - from, phys_addr + from, prot);
896                 if (error)
897                         break;
898                 from = (from + PGDIR_SIZE) & PGDIR_MASK;
899                 dir++;
900         } while (from && (from < end));
901         spin_unlock(&mm->page_table_lock);
902         flush_tlb_range(mm, beg, end);
903         return error;
904 }
905 
906 /*
907  * Establish a new mapping:
908  *  - flush the old one
909  *  - update the page tables
910  *  - inform the TLB about the new one
911  *
912  * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
913  */
914 static inline void establish_pte(struct vm_area_struct * vma, unsigned long address, pte_t *page_table, pte_t entry)
915 {
916         set_pte(page_table, entry);
917         flush_tlb_page(vma, address);
918         update_mmu_cache(vma, address, entry);
919 }
920 
921 /*
922  * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
923  */
924 static inline void break_cow(struct vm_area_struct * vma, struct page * new_page, unsigned long address, 
925                 pte_t *page_table)
926 {
927         flush_page_to_ram(new_page);
928         flush_cache_page(vma, address);
929         establish_pte(vma, address, page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot))));
930 }
931 
932 /*
933  * This routine handles present pages, when users try to write
934  * to a shared page. It is done by copying the page to a new address
935  * and decrementing the shared-page counter for the old page.
936  *
937  * Goto-purists beware: the only reason for goto's here is that it results
938  * in better assembly code.. The "default" path will see no jumps at all.
939  *
940  * Note that this routine assumes that the protection checks have been
941  * done by the caller (the low-level page fault routine in most cases).
942  * Thus we can safely just mark it writable once we've done any necessary
943  * COW.
944  *
945  * We also mark the page dirty at this point even though the page will
946  * change only once the write actually happens. This avoids a few races,
947  * and potentially makes it more efficient.
948  *
949  * We hold the mm semaphore and the page_table_lock on entry and exit
950  * with the page_table_lock released.
951  */
952 static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
953         unsigned long address, pte_t *page_table, pte_t pte)
954 {
955         struct page *old_page, *new_page;
956 
957         old_page = pte_page(pte);
958         if (!VALID_PAGE(old_page))
959                 goto bad_wp_page;
960 
961         if (!TryLockPage(old_page)) {
962                 int reuse = can_share_swap_page(old_page);
963                 unlock_page(old_page);
964                 if (reuse) {
965                         flush_cache_page(vma, address);
966                         establish_pte(vma, address, page_table, pte_mkyoung(pte_mkdirty(pte_mkwrite(pte))));
967                         spin_unlock(&mm->page_table_lock);
968                         return 1;       /* Minor fault */
969                 }
970         }
971 
972         /*
973          * Ok, we need to copy. Oh, well..
974          */
975         page_cache_get(old_page);
976         spin_unlock(&mm->page_table_lock);
977 
978         new_page = alloc_page(GFP_HIGHUSER);
979         if (!new_page)
980                 goto no_mem;
981         copy_cow_page(old_page,new_page,address);
982 
983         /*
984          * Re-check the pte - we dropped the lock
985          */
986         spin_lock(&mm->page_table_lock);
987         if (pte_same(*page_table, pte)) {
988                 if (PageReserved(old_page))
989                         ++mm->rss;
990                 break_cow(vma, new_page, address, page_table);
991                 if (vm_anon_lru)
992                         lru_cache_add(new_page);
993 
994                 /* Free the old page.. */
995                 new_page = old_page;
996         }
997         spin_unlock(&mm->page_table_lock);
998         page_cache_release(new_page);
999         page_cache_release(old_page);
1000         return 1;       /* Minor fault */
1001 
1002 bad_wp_page:
1003         spin_unlock(&mm->page_table_lock);
1004         printk("do_wp_page: bogus page at address %08lx (page 0x%lx)\n",address,(unsigned long)old_page);
1005         return -1;
1006 no_mem:
1007         page_cache_release(old_page);
1008         return -1;
1009 }
1010 
1011 static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
1012 {
1013         do {
1014                 struct mm_struct *mm = mpnt->vm_mm;
1015                 unsigned long start = mpnt->vm_start;
1016                 unsigned long end = mpnt->vm_end;
1017                 unsigned long len = end - start;
1018                 unsigned long diff;
1019 
1020                 /* mapping wholly truncated? */
1021                 if (mpnt->vm_pgoff >= pgoff) {
1022                         zap_page_range(mm, start, len);
1023                         continue;
1024                 }
1025 
1026                 /* mapping wholly unaffected? */
1027                 len = len >> PAGE_SHIFT;
1028                 diff = pgoff - mpnt->vm_pgoff;
1029                 if (diff >= len)
1030                         continue;
1031 
1032                 /* Ok, partially affected.. */
1033                 start += diff << PAGE_SHIFT;
1034                 len = (len - diff) << PAGE_SHIFT;
1035                 zap_page_range(mm, start, len);
1036         } while ((mpnt = mpnt->vm_next_share) != NULL);
1037 }
1038 
1039 /*
1040  * Handle all mappings that got truncated by a "truncate()"
1041  * system call.
1042  *
1043  * NOTE! We have to be ready to update the memory sharing
1044  * between the file and the memory map for a potential last
1045  * incomplete page.  Ugly, but necessary.
1046  */
1047 int vmtruncate(struct inode * inode, loff_t offset)
1048 {
1049         unsigned long pgoff;
1050         struct address_space *mapping = inode->i_mapping;
1051         unsigned long limit;
1052 
1053         if (inode->i_size < offset)
1054                 goto do_expand;
1055         inode->i_size = offset;
1056         spin_lock(&mapping->i_shared_lock);
1057         if (!mapping->i_mmap && !mapping->i_mmap_shared)
1058                 goto out_unlock;
1059 
1060         pgoff = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
1061         if (mapping->i_mmap != NULL)
1062                 vmtruncate_list(mapping->i_mmap, pgoff);
1063         if (mapping->i_mmap_shared != NULL)
1064                 vmtruncate_list(mapping->i_mmap_shared, pgoff);
1065 
1066 out_unlock:
1067         spin_unlock(&mapping->i_shared_lock);
1068         truncate_inode_pages(mapping, offset);
1069         goto out_truncate;
1070 
1071 do_expand:
1072         limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
1073         if (limit != RLIM_INFINITY && offset > limit)
1074                 goto out_sig;
1075         if (offset > inode->i_sb->s_maxbytes)
1076                 goto out;
1077         inode->i_size = offset;
1078 
1079 out_truncate:
1080         if (inode->i_op && inode->i_op->truncate) {
1081                 lock_kernel();
1082                 inode->i_op->truncate(inode);
1083                 unlock_kernel();
1084         }
1085         return 0;
1086 out_sig:
1087         send_sig(SIGXFSZ, current, 0);
1088 out:
1089         return -EFBIG;
1090 }
1091 
1092 /* 
1093  * Primitive swap readahead code. We simply read an aligned block of
1094  * (1 << page_cluster) entries in the swap area. This method is chosen
1095  * because it doesn't cost us any seek time.  We also make sure to queue
1096  * the 'original' request together with the readahead ones...  
1097  */
1098 void swapin_readahead(swp_entry_t entry)
1099 {
1100         int i, num;
1101         struct page *new_page;
1102         unsigned long offset;
1103 
1104         /*
1105          * Get the number of handles we should do readahead io to.
1106          */
1107         num = valid_swaphandles(entry, &offset);
1108         for (i = 0; i < num; offset++, i++) {
1109                 /* Ok, do the async read-ahead now */
1110                 new_page = read_swap_cache_async(SWP_ENTRY(SWP_TYPE(entry), offset));
1111                 if (!new_page)
1112                         break;
1113                 page_cache_release(new_page);
1114         }
1115         return;
1116 }
1117 
1118 /*
1119  * We hold the mm semaphore and the page_table_lock on entry and
1120  * should release the pagetable lock on exit..
1121  */
1122 static int do_swap_page(struct mm_struct * mm,
1123         struct vm_area_struct * vma, unsigned long address,
1124         pte_t * page_table, pte_t orig_pte, int write_access)
1125 {
1126         struct page *page;
1127         swp_entry_t entry = pte_to_swp_entry(orig_pte);
1128         pte_t pte;
1129         int ret = 1;
1130 
1131         spin_unlock(&mm->page_table_lock);
1132         page = lookup_swap_cache(entry);
1133         if (!page) {
1134                 swapin_readahead(entry);
1135                 page = read_swap_cache_async(entry);
1136                 if (!page) {
1137                         /*
1138                          * Back out if somebody else faulted in this pte while
1139                          * we released the page table lock.
1140                          */
1141                         int retval;
1142                         spin_lock(&mm->page_table_lock);
1143                         retval = pte_same(*page_table, orig_pte) ? -1 : 1;
1144                         spin_unlock(&mm->page_table_lock);
1145                         return retval;
1146                 }
1147 
1148                 /* Had to read the page from swap area: Major fault */
1149                 ret = 2;
1150         }
1151 
1152         mark_page_accessed(page);
1153 
1154         lock_page(page);
1155 
1156         /*
1157          * Back out if somebody else faulted in this pte while we
1158          * released the page table lock.
1159          */
1160         spin_lock(&mm->page_table_lock);
1161         if (!pte_same(*page_table, orig_pte)) {
1162                 spin_unlock(&mm->page_table_lock);
1163                 unlock_page(page);
1164                 page_cache_release(page);
1165                 return 1;
1166         }
1167 
1168         /* The page isn't present yet, go ahead with the fault. */
1169                 
1170         swap_free(entry);
1171         if (vm_swap_full())
1172                 remove_exclusive_swap_page(page);
1173 
1174         mm->rss++;
1175         pte = mk_pte(page, vma->vm_page_prot);
1176         if (write_access && can_share_swap_page(page))
1177                 pte = pte_mkdirty(pte_mkwrite(pte));
1178         unlock_page(page);
1179 
1180         flush_page_to_ram(page);
1181         flush_icache_page(vma, page);
1182         set_pte(page_table, pte);
1183 
1184         /* No need to invalidate - it was non-present before */
1185         update_mmu_cache(vma, address, pte);
1186         spin_unlock(&mm->page_table_lock);
1187         return ret;
1188 }
1189 
1190 /*
1191  * We are called with the MM semaphore and page_table_lock
1192  * spinlock held to protect against concurrent faults in
1193  * multithreaded programs. 
1194  */
1195 static int do_anonymous_page(struct mm_struct * mm, struct vm_area_struct * vma, pte_t *page_table, int write_access, unsigned long addr)
1196 {
1197         pte_t entry;
1198 
1199         /* Read-only mapping of ZERO_PAGE. */
1200         entry = pte_wrprotect(mk_pte(ZERO_PAGE(addr), vma->vm_page_prot));
1201 
1202         /* ..except if it's a write access */
1203         if (write_access) {
1204                 struct page *page;
1205 
1206                 /* Allocate our own private page. */
1207                 spin_unlock(&mm->page_table_lock);
1208 
1209                 page = alloc_page(GFP_HIGHUSER);
1210                 if (!page)
1211                         goto no_mem;
1212                 clear_user_highpage(page, addr);
1213 
1214                 spin_lock(&mm->page_table_lock);
1215                 if (!pte_none(*page_table)) {
1216                         page_cache_release(page);
1217                         spin_unlock(&mm->page_table_lock);
1218                         return 1;
1219                 }
1220                 mm->rss++;
1221                 flush_page_to_ram(page);
1222                 entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
1223                 if (vm_anon_lru)
1224                         lru_cache_add(page);
1225                 mark_page_accessed(page);
1226         }
1227 
1228         set_pte(page_table, entry);
1229 
1230         /* No need to invalidate - it was non-present before */
1231         update_mmu_cache(vma, addr, entry);
1232         spin_unlock(&mm->page_table_lock);
1233         return 1;       /* Minor fault */
1234 
1235 no_mem:
1236         return -1;
1237 }
1238 
1239 /*
1240  * do_no_page() tries to create a new page mapping. It aggressively
1241  * tries to share with existing pages, but makes a separate copy if
1242  * the "write_access" parameter is true in order to avoid the next
1243  * page fault.
1244  *
1245  * As this is called only for pages that do not currently exist, we
1246  * do not need to flush old virtual caches or the TLB.
1247  *
1248  * This is called with the MM semaphore held and the page table
1249  * spinlock held. Exit with the spinlock released.
1250  */
1251 static int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma,
1252         unsigned long address, int write_access, pte_t *page_table)
1253 {
1254         struct page * new_page;
1255         pte_t entry;
1256 
1257         if (!vma->vm_ops || !vma->vm_ops->nopage)
1258                 return do_anonymous_page(mm, vma, page_table, write_access, address);
1259         spin_unlock(&mm->page_table_lock);
1260 
1261         new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
1262 
1263         if (new_page == NULL)   /* no page was available -- SIGBUS */
1264                 return 0;
1265         if (new_page == NOPAGE_OOM)
1266                 return -1;
1267 
1268         /*
1269          * Should we do an early C-O-W break?
1270          */
1271         if (write_access && !(vma->vm_flags & VM_SHARED)) {
1272                 struct page * page = alloc_page(GFP_HIGHUSER);
1273                 if (!page) {
1274                         page_cache_release(new_page);
1275                         return -1;
1276                 }
1277                 copy_user_highpage(page, new_page, address);
1278                 page_cache_release(new_page);
1279                 if (vm_anon_lru)
1280                         lru_cache_add(page);
1281                 new_page = page;
1282         }
1283 
1284         spin_lock(&mm->page_table_lock);
1285         /*
1286          * This silly early PAGE_DIRTY setting removes a race
1287          * due to the bad i386 page protection. But it's valid
1288          * for other architectures too.
1289          *
1290          * Note that if write_access is true, we either now have
1291          * an exclusive copy of the page, or this is a shared mapping,
1292          * so we can make it writable and dirty to avoid having to
1293          * handle that later.
1294          */
1295         /* Only go through if we didn't race with anybody else... */
1296         if (pte_none(*page_table)) {
1297                 if (!PageReserved(new_page))
1298                         ++mm->rss;
1299                 flush_page_to_ram(new_page);
1300                 flush_icache_page(vma, new_page);
1301                 entry = mk_pte(new_page, vma->vm_page_prot);
1302                 if (write_access)
1303                         entry = pte_mkwrite(pte_mkdirty(entry));
1304                 set_pte(page_table, entry);
1305         } else {
1306                 /* One of our sibling threads was faster, back out. */
1307                 page_cache_release(new_page);
1308                 spin_unlock(&mm->page_table_lock);
1309                 return 1;
1310         }
1311 
1312         /* no need to invalidate: a not-present page shouldn't be cached */
1313         update_mmu_cache(vma, address, entry);
1314         spin_unlock(&mm->page_table_lock);
1315         return 2;       /* Major fault */
1316 }
1317 
1318 /*
1319  * These routines also need to handle stuff like marking pages dirty
1320  * and/or accessed for architectures that don't do it in hardware (most
1321  * RISC architectures).  The early dirtying is also good on the i386.
1322  *
1323  * There is also a hook called "update_mmu_cache()" that architectures
1324  * with external mmu caches can use to update those (ie the Sparc or
1325  * PowerPC hashed page tables that act as extended TLBs).
1326  *
1327  * Note the "page_table_lock". It is to protect against kswapd removing
1328  * pages from under us. Note that kswapd only ever _removes_ pages, never
1329  * adds them. As such, once we have noticed that the page is not present,
1330  * we can drop the lock early.
1331  *
1332  * The adding of pages is protected by the MM semaphore (which we hold),
1333  * so we don't need to worry about a page being suddenly been added into
1334  * our VM.
1335  *
1336  * We enter with the pagetable spinlock held, we are supposed to
1337  * release it when done.
1338  */
1339 static inline int handle_pte_fault(struct mm_struct *mm,
1340         struct vm_area_struct * vma, unsigned long address,
1341         int write_access, pte_t * pte)
1342 {
1343         pte_t entry;
1344 
1345         entry = *pte;
1346         if (!pte_present(entry)) {
1347                 /*
1348                  * If it truly wasn't present, we know that kswapd
1349                  * and the PTE updates will not touch it later. So
1350                  * drop the lock.
1351                  */
1352                 if (pte_none(entry))
1353                         return do_no_page(mm, vma, address, write_access, pte);
1354                 return do_swap_page(mm, vma, address, pte, entry, write_access);
1355         }
1356 
1357         if (write_access) {
1358                 if (!pte_write(entry))
1359                         return do_wp_page(mm, vma, address, pte, entry);
1360 
1361                 entry = pte_mkdirty(entry);
1362         }
1363         entry = pte_mkyoung(entry);
1364         establish_pte(vma, address, pte, entry);
1365         spin_unlock(&mm->page_table_lock);
1366         return 1;
1367 }
1368 
1369 /*
1370  * By the time we get here, we already hold the mm semaphore
1371  */
1372 int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct * vma,
1373         unsigned long address, int write_access)
1374 {
1375         pgd_t *pgd;
1376         pmd_t *pmd;
1377 
1378         current->state = TASK_RUNNING;
1379         pgd = pgd_offset(mm, address);
1380 
1381         /*
1382          * We need the page table lock to synchronize with kswapd
1383          * and the SMP-safe atomic PTE updates.
1384          */
1385         spin_lock(&mm->page_table_lock);
1386         pmd = pmd_alloc(mm, pgd, address);
1387 
1388         if (pmd) {
1389                 pte_t * pte = pte_alloc(mm, pmd, address);
1390                 if (pte)
1391                         return handle_pte_fault(mm, vma, address, write_access, pte);
1392         }
1393         spin_unlock(&mm->page_table_lock);
1394         return -1;
1395 }
1396 
1397 /*
1398  * Allocate page middle directory.
1399  *
1400  * We've already handled the fast-path in-line, and we own the
1401  * page table lock.
1402  *
1403  * On a two-level page table, this ends up actually being entirely
1404  * optimized away.
1405  */
1406 pmd_t fastcall *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
1407 {
1408         pmd_t *new;
1409 
1410         /* "fast" allocation can happen without dropping the lock.. */
1411         new = pmd_alloc_one_fast(mm, address);
1412         if (!new) {
1413                 spin_unlock(&mm->page_table_lock);
1414                 new = pmd_alloc_one(mm, address);
1415                 spin_lock(&mm->page_table_lock);
1416                 if (!new)
1417                         return NULL;
1418 
1419                 /*
1420                  * Because we dropped the lock, we should re-check the
1421                  * entry, as somebody else could have populated it..
1422                  */
1423                 if (!pgd_none(*pgd)) {
1424                         pmd_free(new);
1425                         check_pgt_cache();
1426                         goto out;
1427                 }
1428         }
1429         pgd_populate(mm, pgd, new);
1430 out:
1431         return pmd_offset(pgd, address);
1432 }
1433 
1434 /*
1435  * Allocate the page table directory.
1436  *
1437  * We've already handled the fast-path in-line, and we own the
1438  * page table lock.
1439  */
1440 pte_t fastcall *pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
1441 {
1442         if (pmd_none(*pmd)) {
1443                 pte_t *new;
1444 
1445                 /* "fast" allocation can happen without dropping the lock.. */
1446                 new = pte_alloc_one_fast(mm, address);
1447                 if (!new) {
1448                         spin_unlock(&mm->page_table_lock);
1449                         new = pte_alloc_one(mm, address);
1450                         spin_lock(&mm->page_table_lock);
1451                         if (!new)
1452                                 return NULL;
1453 
1454                         /*
1455                          * Because we dropped the lock, we should re-check the
1456                          * entry, as somebody else could have populated it..
1457                          */
1458                         if (!pmd_none(*pmd)) {
1459                                 pte_free(new);
1460                                 check_pgt_cache();
1461                                 goto out;
1462                         }
1463                 }
1464                 pmd_populate(mm, pmd, new);
1465         }
1466 out:
1467         return pte_offset(pmd, address);
1468 }
1469 
1470 int make_pages_present(unsigned long addr, unsigned long end)
1471 {
1472         int ret, len, write;
1473         struct vm_area_struct * vma;
1474 
1475         vma = find_vma(current->mm, addr);
1476         write = (vma->vm_flags & VM_WRITE) != 0;
1477         if (addr >= end)
1478                 BUG();
1479         if (end > vma->vm_end)
1480                 BUG();
1481         len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
1482         ret = get_user_pages(current, current->mm, addr,
1483                         len, write, 0, NULL, NULL);
1484         return ret == len ? 0 : -1;
1485 }
1486 
1487 struct page * vmalloc_to_page(void * vmalloc_addr)
1488 {
1489         unsigned long addr = (unsigned long) vmalloc_addr;
1490         struct page *page = NULL;
1491         pmd_t *pmd;
1492         pte_t *pte;
1493         pgd_t *pgd;
1494         
1495         pgd = pgd_offset_k(addr);
1496         if (!pgd_none(*pgd)) {
1497                 pmd = pmd_offset(pgd, addr);
1498                 if (!pmd_none(*pmd)) {
1499                         pte = pte_offset(pmd, addr);
1500                         if (pte_present(*pte)) {
1501                                 page = pte_page(*pte);
1502                         }
1503                 }
1504         }
1505         return page;
1506 }
1507 

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

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | 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.

osdn.jp