Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
highmem.c
Go to the documentation of this file.
1 /* highmem.c: arch-specific highmem stuff
2  *
3  * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells ([email protected])
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11 #include <linux/highmem.h>
12 #include <linux/module.h>
13 
14 void *kmap(struct page *page)
15 {
16  might_sleep();
17  if (!PageHighMem(page))
18  return page_address(page);
19  return kmap_high(page);
20 }
21 
23 
24 void kunmap(struct page *page)
25 {
26  if (in_interrupt())
27  BUG();
28  if (!PageHighMem(page))
29  return;
30  kunmap_high(page);
31 }
32 
34 
36 {
37  return virt_to_page(ptr);
38 }
39 
40 void *kmap_atomic(struct page *page)
41 {
42  unsigned long paddr;
43  int type;
44 
45  pagefault_disable();
46  type = kmap_atomic_idx_push();
47  paddr = page_to_phys(page);
48 
49  switch (type) {
50  /*
51  * The first 4 primary maps are reserved for architecture code
52  */
53  case 0: return __kmap_atomic_primary(0, paddr, 6);
54  case 1: return __kmap_atomic_primary(0, paddr, 7);
55  case 2: return __kmap_atomic_primary(0, paddr, 8);
56  case 3: return __kmap_atomic_primary(0, paddr, 9);
57  case 4: return __kmap_atomic_primary(0, paddr, 10);
58 
59  case 5 ... 5 + NR_TLB_LINES - 1:
60  return __kmap_atomic_secondary(type - 5, paddr);
61 
62  default:
63  BUG();
64  return NULL;
65  }
66 }
68 
69 void __kunmap_atomic(void *kvaddr)
70 {
71  int type = kmap_atomic_idx();
72  switch (type) {
73  case 0: __kunmap_atomic_primary(0, 6); break;
74  case 1: __kunmap_atomic_primary(0, 7); break;
75  case 2: __kunmap_atomic_primary(0, 8); break;
76  case 3: __kunmap_atomic_primary(0, 9); break;
77  case 4: __kunmap_atomic_primary(0, 10); break;
78 
79  case 5 ... 5 + NR_TLB_LINES - 1:
80  __kunmap_atomic_secondary(type - 5, kvaddr);
81  break;
82 
83  default:
84  BUG();
85  }
86  kmap_atomic_idx_pop();
87  pagefault_enable();
88 }