linux/include/linux/highmem.h
<<
>>
Prefs
   1#ifndef _LINUX_HIGHMEM_H
   2#define _LINUX_HIGHMEM_H
   3
   4#include <linux/config.h>
   5#include <linux/fs.h>
   6#include <linux/mm.h>
   7
   8#include <asm/cacheflush.h>
   9
  10#ifdef CONFIG_HIGHMEM
  11
  12#include <asm/highmem.h>
  13
  14/* declarations for linux/mm/highmem.c */
  15unsigned int nr_free_highpages(void);
  16
  17#else /* CONFIG_HIGHMEM */
  18
  19static inline unsigned int nr_free_highpages(void) { return 0; }
  20
  21static inline void *kmap(struct page *page)
  22{
  23        might_sleep();
  24        return page_address(page);
  25}
  26
  27#define kunmap(page) do { (void) (page); } while (0)
  28
  29#define kmap_atomic(page, idx)          page_address(page)
  30#define kunmap_atomic(addr, idx)        do { } while (0)
  31#define kmap_atomic_to_page(ptr)        virt_to_page(ptr)
  32
  33#endif /* CONFIG_HIGHMEM */
  34
  35/* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
  36static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
  37{
  38        void *addr = kmap_atomic(page, KM_USER0);
  39        clear_user_page(addr, vaddr, page);
  40        kunmap_atomic(addr, KM_USER0);
  41        /* Make sure this page is cleared on other CPU's too before using it */
  42        smp_wmb();
  43}
  44
  45#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
  46static inline struct page *
  47alloc_zeroed_user_highpage(struct vm_area_struct *vma, unsigned long vaddr)
  48{
  49        struct page *page = alloc_page_vma(GFP_HIGHUSER, vma, vaddr);
  50
  51        if (page)
  52                clear_user_highpage(page, vaddr);
  53
  54        return page;
  55}
  56#endif
  57
  58static inline void clear_highpage(struct page *page)
  59{
  60        void *kaddr = kmap_atomic(page, KM_USER0);
  61        clear_page(kaddr);
  62        kunmap_atomic(kaddr, KM_USER0);
  63}
  64
  65/*
  66 * Same but also flushes aliased cache contents to RAM.
  67 */
  68static inline void memclear_highpage_flush(struct page *page, unsigned int offset, unsigned int size)
  69{
  70        void *kaddr;
  71
  72        BUG_ON(offset + size > PAGE_SIZE);
  73
  74        kaddr = kmap_atomic(page, KM_USER0);
  75        memset((char *)kaddr + offset, 0, size);
  76        flush_dcache_page(page);
  77        kunmap_atomic(kaddr, KM_USER0);
  78}
  79
  80static inline void copy_user_highpage(struct page *to, struct page *from, unsigned long vaddr)
  81{
  82        char *vfrom, *vto;
  83
  84        vfrom = kmap_atomic(from, KM_USER0);
  85        vto = kmap_atomic(to, KM_USER1);
  86        copy_user_page(vto, vfrom, vaddr, to);
  87        kunmap_atomic(vfrom, KM_USER0);
  88        kunmap_atomic(vto, KM_USER1);
  89        /* Make sure this page is cleared on other CPU's too before using it */
  90        smp_wmb();
  91}
  92
  93static inline void copy_highpage(struct page *to, struct page *from)
  94{
  95        char *vfrom, *vto;
  96
  97        vfrom = kmap_atomic(from, KM_USER0);
  98        vto = kmap_atomic(to, KM_USER1);
  99        copy_page(vto, vfrom);
 100        kunmap_atomic(vfrom, KM_USER0);
 101        kunmap_atomic(vto, KM_USER1);
 102}
 103
 104#endif /* _LINUX_HIGHMEM_H */
 105
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.