if (!pages) {
                free_vm_area(area);
+               warn_alloc(gfp_mask, NULL,
+                          "vmalloc size %lu allocation failure: "
+                          "page array size %lu allocation failed",
+                          nr_small_pages * PAGE_SIZE, array_size);
                return NULL;
        }
 
                        /* Successfully allocated i pages, free them in __vfree() */
                        area->nr_pages = i;
                        atomic_long_add(area->nr_pages, &nr_vmalloc_pages);
+                       warn_alloc(gfp_mask, NULL,
+                                  "vmalloc size %lu allocation failure: "
+                                  "page order %u allocation failed",
+                                  area->nr_pages * PAGE_SIZE, page_order);
                        goto fail;
                }
 
        }
        atomic_long_add(area->nr_pages, &nr_vmalloc_pages);
 
-       if (vmap_pages_range(addr, addr + size, prot, pages, page_shift) < 0)
+       if (vmap_pages_range(addr, addr + size, prot, pages, page_shift) < 0) {
+               warn_alloc(gfp_mask, NULL,
+                          "vmalloc size %lu allocation failure: "
+                          "failed to map pages",
+                          area->nr_pages * PAGE_SIZE);
                goto fail;
+       }
 
        return area->addr;
 
 fail:
-       warn_alloc(gfp_mask, NULL,
-                         "vmalloc: allocation failure, allocated %ld of %ld bytes",
-                         (area->nr_pages*PAGE_SIZE), size);
        __vfree(area->addr);
        return NULL;
 }
        unsigned long real_align = align;
        unsigned int shift = PAGE_SHIFT;
 
-       if (!size || (size >> PAGE_SHIFT) > totalram_pages()) {
-               area = NULL;
-               goto fail;
+       if (WARN_ON_ONCE(!size))
+               return NULL;
+
+       if ((size >> PAGE_SHIFT) > totalram_pages()) {
+               warn_alloc(gfp_mask, NULL,
+                          "vmalloc size %lu allocation failure: "
+                          "exceeds total pages", real_size);
+               return NULL;
        }
 
        if (vmap_allow_huge && !(vm_flags & VM_NO_HUGE_VMAP) &&
        size = PAGE_ALIGN(size);
        area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED |
                                vm_flags, start, end, node, gfp_mask, caller);
-       if (!area)
+       if (!area) {
+               warn_alloc(gfp_mask, NULL,
+                          "vmalloc size %lu allocation failure: "
+                          "vm_struct allocation failed", real_size);
                goto fail;
+       }
 
        addr = __vmalloc_area_node(area, gfp_mask, prot, shift, node);
        if (!addr)
                goto again;
        }
 
-       if (!area) {
-               /* Warn for area allocation, page allocations already warn */
-               warn_alloc(gfp_mask, NULL,
-                         "vmalloc: allocation failure: %lu bytes", real_size);
-       }
        return NULL;
 }