highmem.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * High memory handling common code and variables.
  3.  *
  4.  * (C) 1999 Andrea Arcangeli, SuSE GmbH, andrea@suse.de
  5.  *          Gerhard Wichert, Siemens AG, Gerhard.Wichert@pdb.siemens.de
  6.  *
  7.  *
  8.  * Redesigned the x86 32-bit VM architecture to deal with
  9.  * 64-bit physical space. With current x86 CPUs this
  10.  * means up to 64 Gigabytes physical RAM.
  11.  *
  12.  * Rewrote high memory support to move the page cache into
  13.  * high memory. Implemented permanent (schedulable) kmaps
  14.  * based on Linus' idea.
  15.  *
  16.  * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
  17.  */
  18. #include <linux/mm.h>
  19. #include <linux/pagemap.h>
  20. #include <linux/highmem.h>
  21. #include <linux/swap.h>
  22. #include <linux/slab.h>
  23. /*
  24.  * Virtual_count is not a pure "count".
  25.  *  0 means that it is not mapped, and has not been mapped
  26.  *    since a TLB flush - it is usable.
  27.  *  1 means that there are no users, but it has been mapped
  28.  *    since the last TLB flush - so we can't use it.
  29.  *  n means that there are (n-1) current users of it.
  30.  */
  31. static int pkmap_count[LAST_PKMAP];
  32. static unsigned int last_pkmap_nr;
  33. static spinlock_t kmap_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;
  34. pte_t * pkmap_page_table;
  35. static DECLARE_WAIT_QUEUE_HEAD(pkmap_map_wait);
  36. static void flush_all_zero_pkmaps(void)
  37. {
  38. int i;
  39. flush_cache_all();
  40. for (i = 0; i < LAST_PKMAP; i++) {
  41. struct page *page;
  42. /*
  43.  * zero means we don't have anything to do,
  44.  * >1 means that it is still in use. Only
  45.  * a count of 1 means that it is free but
  46.  * needs to be unmapped
  47.  */
  48. if (pkmap_count[i] != 1)
  49. continue;
  50. pkmap_count[i] = 0;
  51. /* sanity check */
  52. if (pte_none(pkmap_page_table[i]))
  53. BUG();
  54. /*
  55.  * Don't need an atomic fetch-and-clear op here;
  56.  * no-one has the page mapped, and cannot get at
  57.  * its virtual address (and hence PTE) without first
  58.  * getting the kmap_lock (which is held here).
  59.  * So no dangers, even with speculative execution.
  60.  */
  61. page = pte_page(pkmap_page_table[i]);
  62. pte_clear(&pkmap_page_table[i]);
  63. page->virtual = NULL;
  64. }
  65. flush_tlb_all();
  66. }
  67. static inline unsigned long map_new_virtual(struct page *page)
  68. {
  69. unsigned long vaddr;
  70. int count;
  71. start:
  72. count = LAST_PKMAP;
  73. /* Find an empty entry */
  74. for (;;) {
  75. last_pkmap_nr = (last_pkmap_nr + 1) & LAST_PKMAP_MASK;
  76. if (!last_pkmap_nr) {
  77. flush_all_zero_pkmaps();
  78. count = LAST_PKMAP;
  79. }
  80. if (!pkmap_count[last_pkmap_nr])
  81. break; /* Found a usable entry */
  82. if (--count)
  83. continue;
  84. /*
  85.  * Sleep for somebody else to unmap their entries
  86.  */
  87. {
  88. DECLARE_WAITQUEUE(wait, current);
  89. current->state = TASK_UNINTERRUPTIBLE;
  90. add_wait_queue(&pkmap_map_wait, &wait);
  91. spin_unlock(&kmap_lock);
  92. schedule();
  93. remove_wait_queue(&pkmap_map_wait, &wait);
  94. spin_lock(&kmap_lock);
  95. /* Somebody else might have mapped it while we slept */
  96. if (page->virtual)
  97. return (unsigned long) page->virtual;
  98. /* Re-start */
  99. goto start;
  100. }
  101. }
  102. vaddr = PKMAP_ADDR(last_pkmap_nr);
  103. set_pte(&(pkmap_page_table[last_pkmap_nr]), mk_pte(page, kmap_prot));
  104. pkmap_count[last_pkmap_nr] = 1;
  105. page->virtual = (void *) vaddr;
  106. return vaddr;
  107. }
  108. void *kmap_high(struct page *page)
  109. {
  110. unsigned long vaddr;
  111. /*
  112.  * For highmem pages, we can't trust "virtual" until
  113.  * after we have the lock.
  114.  *
  115.  * We cannot call this from interrupts, as it may block
  116.  */
  117. spin_lock(&kmap_lock);
  118. vaddr = (unsigned long) page->virtual;
  119. if (!vaddr)
  120. vaddr = map_new_virtual(page);
  121. pkmap_count[PKMAP_NR(vaddr)]++;
  122. if (pkmap_count[PKMAP_NR(vaddr)] < 2)
  123. BUG();
  124. spin_unlock(&kmap_lock);
  125. return (void*) vaddr;
  126. }
  127. void kunmap_high(struct page *page)
  128. {
  129. unsigned long vaddr;
  130. unsigned long nr;
  131. int need_wakeup;
  132. spin_lock(&kmap_lock);
  133. vaddr = (unsigned long) page->virtual;
  134. if (!vaddr)
  135. BUG();
  136. nr = PKMAP_NR(vaddr);
  137. /*
  138.  * A count must never go down to zero
  139.  * without a TLB flush!
  140.  */
  141. need_wakeup = 0;
  142. switch (--pkmap_count[nr]) {
  143. case 0:
  144. BUG();
  145. case 1:
  146. /*
  147.  * Avoid an unnecessary wake_up() function call.
  148.  * The common case is pkmap_count[] == 1, but
  149.  * no waiters.
  150.  * The tasks queued in the wait-queue are guarded
  151.  * by both the lock in the wait-queue-head and by
  152.  * the kmap_lock.  As the kmap_lock is held here,
  153.  * no need for the wait-queue-head's lock.  Simply
  154.  * test if the queue is empty.
  155.  */
  156. need_wakeup = waitqueue_active(&pkmap_map_wait);
  157. }
  158. spin_unlock(&kmap_lock);
  159. /* do wake-up, if needed, race-free outside of the spin lock */
  160. if (need_wakeup)
  161. wake_up(&pkmap_map_wait);
  162. }
  163. #define POOL_SIZE 32
  164. /*
  165.  * This lock gets no contention at all, normally.
  166.  */
  167. static spinlock_t emergency_lock = SPIN_LOCK_UNLOCKED;
  168. int nr_emergency_pages;
  169. static LIST_HEAD(emergency_pages);
  170. int nr_emergency_bhs;
  171. static LIST_HEAD(emergency_bhs);
  172. /*
  173.  * Simple bounce buffer support for highmem pages.
  174.  * This will be moved to the block layer in 2.5.
  175.  */
  176. static inline void copy_from_high_bh (struct buffer_head *to,
  177.  struct buffer_head *from)
  178. {
  179. struct page *p_from;
  180. char *vfrom;
  181. p_from = from->b_page;
  182. vfrom = kmap_atomic(p_from, KM_USER0);
  183. memcpy(to->b_data, vfrom + bh_offset(from), to->b_size);
  184. kunmap_atomic(vfrom, KM_USER0);
  185. }
  186. static inline void copy_to_high_bh_irq (struct buffer_head *to,
  187.  struct buffer_head *from)
  188. {
  189. struct page *p_to;
  190. char *vto;
  191. unsigned long flags;
  192. p_to = to->b_page;
  193. __save_flags(flags);
  194. __cli();
  195. vto = kmap_atomic(p_to, KM_BOUNCE_READ);
  196. memcpy(vto + bh_offset(to), from->b_data, to->b_size);
  197. kunmap_atomic(vto, KM_BOUNCE_READ);
  198. __restore_flags(flags);
  199. }
  200. static inline void bounce_end_io (struct buffer_head *bh, int uptodate)
  201. {
  202. struct page *page;
  203. struct buffer_head *bh_orig = (struct buffer_head *)(bh->b_private);
  204. unsigned long flags;
  205. bh_orig->b_end_io(bh_orig, uptodate);
  206. page = bh->b_page;
  207. spin_lock_irqsave(&emergency_lock, flags);
  208. if (nr_emergency_pages >= POOL_SIZE)
  209. __free_page(page);
  210. else {
  211. /*
  212.  * We are abusing page->list to manage
  213.  * the highmem emergency pool:
  214.  */
  215. list_add(&page->list, &emergency_pages);
  216. nr_emergency_pages++;
  217. }
  218. if (nr_emergency_bhs >= POOL_SIZE) {
  219. #ifdef HIGHMEM_DEBUG
  220. /* Don't clobber the constructed slab cache */
  221. init_waitqueue_head(&bh->b_wait);
  222. #endif
  223. kmem_cache_free(bh_cachep, bh);
  224. } else {
  225. /*
  226.  * Ditto in the bh case, here we abuse b_inode_buffers:
  227.  */
  228. list_add(&bh->b_inode_buffers, &emergency_bhs);
  229. nr_emergency_bhs++;
  230. }
  231. spin_unlock_irqrestore(&emergency_lock, flags);
  232. }
  233. static __init int init_emergency_pool(void)
  234. {
  235. struct sysinfo i;
  236.         si_meminfo(&i);
  237.         si_swapinfo(&i);
  238.         
  239.         if (!i.totalhigh)
  240.          return 0;
  241. spin_lock_irq(&emergency_lock);
  242. while (nr_emergency_pages < POOL_SIZE) {
  243. struct page * page = alloc_page(GFP_ATOMIC);
  244. if (!page) {
  245. printk("couldn't refill highmem emergency pages");
  246. break;
  247. }
  248. list_add(&page->list, &emergency_pages);
  249. nr_emergency_pages++;
  250. }
  251. while (nr_emergency_bhs < POOL_SIZE) {
  252. struct buffer_head * bh = kmem_cache_alloc(bh_cachep, SLAB_ATOMIC);
  253. if (!bh) {
  254. printk("couldn't refill highmem emergency bhs");
  255. break;
  256. }
  257. list_add(&bh->b_inode_buffers, &emergency_bhs);
  258. nr_emergency_bhs++;
  259. }
  260. spin_unlock_irq(&emergency_lock);
  261. printk("allocated %d pages and %d bhs reserved for the highmem bouncesn",
  262.        nr_emergency_pages, nr_emergency_bhs);
  263. return 0;
  264. }
  265. __initcall(init_emergency_pool);
  266. static void bounce_end_io_write (struct buffer_head *bh, int uptodate)
  267. {
  268. bounce_end_io(bh, uptodate);
  269. }
  270. static void bounce_end_io_read (struct buffer_head *bh, int uptodate)
  271. {
  272. struct buffer_head *bh_orig = (struct buffer_head *)(bh->b_private);
  273. if (uptodate)
  274. copy_to_high_bh_irq(bh_orig, bh);
  275. bounce_end_io(bh, uptodate);
  276. }
  277. struct page *alloc_bounce_page (void)
  278. {
  279. struct list_head *tmp;
  280. struct page *page;
  281. page = alloc_page(GFP_NOHIGHIO);
  282. if (page)
  283. return page;
  284. /*
  285.  * No luck. First, kick the VM so it doesnt idle around while
  286.  * we are using up our emergency rations.
  287.  */
  288. wakeup_bdflush();
  289. repeat_alloc:
  290. /*
  291.  * Try to allocate from the emergency pool.
  292.  */
  293. tmp = &emergency_pages;
  294. spin_lock_irq(&emergency_lock);
  295. if (!list_empty(tmp)) {
  296. page = list_entry(tmp->next, struct page, list);
  297. list_del(tmp->next);
  298. nr_emergency_pages--;
  299. }
  300. spin_unlock_irq(&emergency_lock);
  301. if (page)
  302. return page;
  303. /* we need to wait I/O completion */
  304. run_task_queue(&tq_disk);
  305. current->policy |= SCHED_YIELD;
  306. __set_current_state(TASK_RUNNING);
  307. schedule();
  308. goto repeat_alloc;
  309. }
  310. struct buffer_head *alloc_bounce_bh (void)
  311. {
  312. struct list_head *tmp;
  313. struct buffer_head *bh;
  314. bh = kmem_cache_alloc(bh_cachep, SLAB_NOHIGHIO);
  315. if (bh)
  316. return bh;
  317. /*
  318.  * No luck. First, kick the VM so it doesnt idle around while
  319.  * we are using up our emergency rations.
  320.  */
  321. wakeup_bdflush();
  322. repeat_alloc:
  323. /*
  324.  * Try to allocate from the emergency pool.
  325.  */
  326. tmp = &emergency_bhs;
  327. spin_lock_irq(&emergency_lock);
  328. if (!list_empty(tmp)) {
  329. bh = list_entry(tmp->next, struct buffer_head, b_inode_buffers);
  330. list_del(tmp->next);
  331. nr_emergency_bhs--;
  332. }
  333. spin_unlock_irq(&emergency_lock);
  334. if (bh)
  335. return bh;
  336. /* we need to wait I/O completion */
  337. run_task_queue(&tq_disk);
  338. current->policy |= SCHED_YIELD;
  339. __set_current_state(TASK_RUNNING);
  340. schedule();
  341. goto repeat_alloc;
  342. }
  343. struct buffer_head * create_bounce(int rw, struct buffer_head * bh_orig)
  344. {
  345. struct page *page;
  346. struct buffer_head *bh;
  347. if (!PageHighMem(bh_orig->b_page))
  348. return bh_orig;
  349. bh = alloc_bounce_bh();
  350. /*
  351.  * This is wasteful for 1k buffers, but this is a stopgap measure
  352.  * and we are being ineffective anyway. This approach simplifies
  353.  * things immensly. On boxes with more than 4GB RAM this should
  354.  * not be an issue anyway.
  355.  */
  356. page = alloc_bounce_page();
  357. set_bh_page(bh, page, 0);
  358. bh->b_next = NULL;
  359. bh->b_blocknr = bh_orig->b_blocknr;
  360. bh->b_size = bh_orig->b_size;
  361. bh->b_list = -1;
  362. bh->b_dev = bh_orig->b_dev;
  363. bh->b_count = bh_orig->b_count;
  364. bh->b_rdev = bh_orig->b_rdev;
  365. bh->b_state = bh_orig->b_state;
  366. #ifdef HIGHMEM_DEBUG
  367. bh->b_flushtime = jiffies;
  368. bh->b_next_free = NULL;
  369. bh->b_prev_free = NULL;
  370. /* bh->b_this_page */
  371. bh->b_reqnext = NULL;
  372. bh->b_pprev = NULL;
  373. #endif
  374. /* bh->b_page */
  375. if (rw == WRITE) {
  376. bh->b_end_io = bounce_end_io_write;
  377. copy_from_high_bh(bh, bh_orig);
  378. } else
  379. bh->b_end_io = bounce_end_io_read;
  380. bh->b_private = (void *)bh_orig;
  381. bh->b_rsector = bh_orig->b_rsector;
  382. #ifdef HIGHMEM_DEBUG
  383. memset(&bh->b_wait, -1, sizeof(bh->b_wait));
  384. #endif
  385. return bh;
  386. }