diff --git a/linux-ramdump-parser-v2/parsers/vmalloc.py b/linux-ramdump-parser-v2/parsers/vmalloc.py
index 832c6e6f114bfd9337ea8debb0fee621b6d531f8..a56ceb4b22562c13101591e1b796bf61ebcc4258 100644
--- a/linux-ramdump-parser-v2/parsers/vmalloc.py
+++ b/linux-ramdump-parser-v2/parsers/vmalloc.py
@@ -9,8 +9,10 @@
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 
+import re
 from print_out import print_out_str
 from parser_util import register_parser, RamParser
+import linux_list as llist
 
 VM_IOREMAP = 0x00000001
 VM_ALLOC = 0x00000002
@@ -23,64 +25,98 @@ VM_UNLIST = 0x00000020
 @register_parser('--print-vmalloc', 'print vmalloc information')
 class Vmalloc(RamParser):
 
-    def print_vmalloc_info(self, ram_dump, out_path):
-        vmlist_addr = ram_dump.addr_lookup('vmlist')
-        vmlist = ram_dump.read_word(vmlist_addr)
+    def print_vm(self, vm):
+        if vm == 0 or vm is None:
+           return
+
+        next_offset = self.ramdump.field_offset('struct vm_struct', 'next')
+        addr_offset = self.ramdump.field_offset('struct vm_struct', 'addr')
+        size_offset = self.ramdump.field_offset('struct vm_struct', 'size')
+        flags_offset = self.ramdump.field_offset('struct vm_struct', 'flags')
+        pages_offset = self.ramdump.field_offset('struct vm_struct', 'pages')
+        nr_pages_offset = self.ramdump.field_offset('struct vm_struct', 'nr_pages')
+        phys_addr_offset = self.ramdump.field_offset(
+            'struct vm_struct', 'phys_addr')
+        caller_offset = self.ramdump.field_offset('struct vm_struct', 'caller')
 
-        vmalloc_out = ram_dump.open_file('vmalloc.txt')
+        addr = self.ramdump.read_word(vm + addr_offset)
+        caller = self.ramdump.read_word(vm + caller_offset)
+        nr_pages = self.ramdump.read_word(vm + nr_pages_offset)
+        phys_addr = self.ramdump.read_word(vm + phys_addr_offset)
+        flags = self.ramdump.read_word(vm + flags_offset)
+        size = self.ramdump.read_word(vm + size_offset)
 
-        next_offset = ram_dump.field_offset('struct vm_struct', 'next')
-        addr_offset = ram_dump.field_offset('struct vm_struct', 'addr')
-        size_offset = ram_dump.field_offset('struct vm_struct', 'size')
-        flags_offset = ram_dump.field_offset('struct vm_struct', 'flags')
-        pages_offset = ram_dump.field_offset('struct vm_struct', 'pages')
-        nr_pages_offset = ram_dump.field_offset('struct vm_struct', 'nr_pages')
-        phys_addr_offset = ram_dump.field_offset(
-            'struct vm_struct', 'phys_addr')
-        caller_offset = ram_dump.field_offset('struct vm_struct', 'caller')
+        if addr is None:
+           return
 
-        while (vmlist is not None) and (vmlist != 0):
-            addr = ram_dump.read_word(vmlist + addr_offset)
-            caller = ram_dump.read_word(vmlist + caller_offset)
-            nr_pages = ram_dump.read_word(vmlist + nr_pages_offset)
-            phys_addr = ram_dump.read_word(vmlist + phys_addr_offset)
-            flags = ram_dump.read_word(vmlist + flags_offset)
-            size = ram_dump.read_word(vmlist + size_offset)
+        vmalloc_str = '{0:x}-{1:x} {2:x}'.format(addr, addr + size, size)
+
+        if (caller != 0):
+            a = self.ramdump.unwind_lookup(caller)
+            if a is not None:
+                symname, offset = a
+                vmalloc_str = vmalloc_str + \
+                    ' {0}+0x{1:x}'.format(symname, offset)
+
+        if (nr_pages != 0):
+            vmalloc_str = vmalloc_str + ' pages={0}'.format(nr_pages)
+
+        if (phys_addr != 0):
+            vmalloc_str = vmalloc_str + ' phys={0:x}'.format(phys_addr)
+
+        if (flags & VM_IOREMAP) != 0:
+            vmalloc_str = vmalloc_str + ' ioremap'
+
+        if (flags & VM_ALLOC) != 0:
+            vmalloc_str = vmalloc_str + ' vmalloc'
 
-            vmalloc_str = '{0:x}-{1:x} {2:x}'.format(addr, addr + size, size)
+        if (flags & VM_MAP) != 0:
+            vmalloc_str = vmalloc_str + ' vmap'
 
-            if (caller != 0):
-                a = ram_dump.unwind_lookup(caller)
-                if a is not None:
-                    symname, offset = a
-                    vmalloc_str = vmalloc_str + \
-                        ' {0}+0x{1:x}'.format(symname, offset)
+        if (flags & VM_USERMAP) != 0:
+            vmalloc_str = vmalloc_str + ' user'
 
-            if (nr_pages != 0):
-                vmalloc_str = vmalloc_str + ' pages={0}'.format(nr_pages)
+        if (flags & VM_VPAGES) != 0:
+            vmalloc_str = vmalloc_str + ' vpages'
 
-            if (phys_addr != 0):
-                vmalloc_str = vmalloc_str + ' phys={0:x}'.format(phys_addr)
+        vmalloc_str = vmalloc_str + '\n'
+        self.vmalloc_out.write(vmalloc_str)
 
-            if (flags & VM_IOREMAP) != 0:
-                vmalloc_str = vmalloc_str + ' ioremap'
+    def list_func(self, vmlist):
+        vm_offset = self.ramdump.field_offset('struct vmap_area', 'vm')
 
-            if (flags & VM_ALLOC) != 0:
-                vmalloc_str = vmalloc_str + ' vmalloc'
+        vm = self.ramdump.read_word(vmlist + vm_offset)
+        self.print_vm(vm)
 
-            if (flags & VM_MAP) != 0:
-                vmalloc_str = vmalloc_str + ' vmap'
 
-            if (flags & VM_USERMAP) != 0:
-                vmalloc_str = vmalloc_str + ' user'
+    def print_vmalloc_info_3_10(self, out_path):
+        vmalloc_out = self.ramdump.open_file('vmalloc.txt')
 
-            if (flags & VM_VPAGES) != 0:
-                vmalloc_str = vmalloc_str + ' vpages'
+        next_offset = self.ramdump.field_offset('struct vmap_area', 'list')
+        vmlist = self.ramdump.read_word('vmap_area_list')
+        orig_vmlist = vmlist
 
-            vmalloc_str = vmalloc_str + '\n'
-            vmalloc_out.write(vmalloc_str)
+        list_next_offset, list_prev_offset = llist.get_list_offsets(
+            self.ramdump)
+
+        list_walker = llist.ListWalker(self.ramdump, vmlist, next_offset, list_next_offset, list_prev_offset)
+        self.vmalloc_out = vmalloc_out
+        list_walker.walk(vmlist, self.list_func)
+        print_out_str('---wrote vmalloc to vmalloc.txt')
+        vmalloc_out.close()
+
+
+    def print_vmalloc_info(self, out_path):
+        vmlist = self.ramdump.read_word('vmlist')
+        next_offset = self.ramdump.field_offset('struct vm_struct', 'next')
+
+        vmalloc_out = self.ramdump.open_file('vmalloc.txt')
+        self.vmalloc_out = vmalloc_out
+
+        while (vmlist is not None) and (vmlist != 0):
+            self.print_vm(vmlist)
 
-            vmlist = ram_dump.read_word(vmlist + next_offset)
+            vmlist = self.ramdump.read_word(vmlist + next_offset)
 
         print_out_str('---wrote vmalloc to vmalloc.txt')
         vmalloc_out.close()
@@ -88,4 +124,7 @@ class Vmalloc(RamParser):
     def parse(self):
         out_path = self.ramdump.outdir
         ver = self.ramdump.version
-        self.print_vmalloc_info(self.ramdump, out_path)
+        if re.search('3\.10\.\d', ver) is not None:
+            self.print_vmalloc_info_3_10(out_path)
+        else:
+            self.print_vmalloc_info(out_path)