]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/vmalloc.c
mm/page-writeback.c: fix divide by zero in bdi_dirty_limits()
[karo-tx-linux.git] / mm / vmalloc.c
index 0fdf96803c5b59623792a24e57015fb0e25098bb..f64632b671964a0788b43e8d30ae0edb7b292292 100644 (file)
@@ -27,7 +27,9 @@
 #include <linux/pfn.h>
 #include <linux/kmemleak.h>
 #include <linux/atomic.h>
+#include <linux/compiler.h>
 #include <linux/llist.h>
+
 #include <asm/uaccess.h>
 #include <asm/tlbflush.h>
 #include <asm/shmparam.h>
@@ -1083,6 +1085,12 @@ EXPORT_SYMBOL(vm_unmap_ram);
  * @node: prefer to allocate data structures on this node
  * @prot: memory protection to use. PAGE_KERNEL for regular RAM
  *
+ * If you use this function for less than VMAP_MAX_ALLOC pages, it could be
+ * faster than vmap so it's good.  But if you mix long-life and short-life
+ * objects with vm_map_ram(), it could consume lots of address space through
+ * fragmentation (especially on a 32bit machine).  You could see failures in
+ * the end.  Please use this function for short-lived objects.
+ *
  * Returns: a pointer to the address that has been mapped, or %NULL on failure
  */
 void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot)
@@ -1260,6 +1268,7 @@ void unmap_kernel_range(unsigned long addr, unsigned long size)
        vunmap_page_range(addr, end);
        flush_tlb_kernel_range(addr, end);
 }
+EXPORT_SYMBOL_GPL(unmap_kernel_range);
 
 int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
 {
@@ -1488,7 +1497,7 @@ void vfree(const void *addr)
        if (!addr)
                return;
        if (unlikely(in_interrupt())) {
-               struct vfree_deferred *p = &__get_cpu_var(vfree_deferred);
+               struct vfree_deferred *p = this_cpu_ptr(&vfree_deferred);
                if (llist_add((struct llist_node *)addr, &p->list))
                        schedule_work(&p->wq);
        } else
@@ -2181,7 +2190,7 @@ EXPORT_SYMBOL(remap_vmalloc_range);
  * Implement a stub for vmalloc_sync_all() if the architecture chose not to
  * have one.
  */
-void  __attribute__((weak)) vmalloc_sync_all(void)
+void __weak vmalloc_sync_all(void)
 {
 }
 
@@ -2611,19 +2620,19 @@ static int s_show(struct seq_file *m, void *p)
                seq_printf(m, " phys=%llx", (unsigned long long)v->phys_addr);
 
        if (v->flags & VM_IOREMAP)
-               seq_printf(m, " ioremap");
+               seq_puts(m, " ioremap");
 
        if (v->flags & VM_ALLOC)
-               seq_printf(m, " vmalloc");
+               seq_puts(m, " vmalloc");
 
        if (v->flags & VM_MAP)
-               seq_printf(m, " vmap");
+               seq_puts(m, " vmap");
 
        if (v->flags & VM_USERMAP)
-               seq_printf(m, " user");
+               seq_puts(m, " user");
 
        if (v->flags & VM_VPAGES)
-               seq_printf(m, " vpages");
+               seq_puts(m, " vpages");
 
        show_numa_info(m, v);
        seq_putc(m, '\n');