diff --git a/linux-ramdump-parser-v2/parsers/slabinfo.py b/linux-ramdump-parser-v2/parsers/slabinfo.py index 40d7f2249fb5cbb61d1d35969e866e26b5d1eff6..5d739afd98a988142e3a48889bdabdf2e17ab501 100644 --- a/linux-ramdump-parser-v2/parsers/slabinfo.py +++ b/linux-ramdump-parser-v2/parsers/slabinfo.py @@ -1,4 +1,4 @@ -# Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. +# Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 and @@ -11,7 +11,7 @@ import re -from mm import page_address +from mm import page_address, pfn_to_page from print_out import print_out_str from parser_util import register_parser, RamParser @@ -39,13 +39,15 @@ class Slabinfo(RamParser): freelist = self.ramdump.read_word(page + freelist_offset) p = freelist addr = page_address(self.ramdump, page) + seen = [] if addr is None: return - while p != 0 and p is not None: + while p != 0 and p is not None and p not in seen: idx = self.slab_index(self.ramdump, p, addr, slab) if idx >= len(bitarray) or idx < 0: return bitarray[idx] = 1 + seen.append(p) p = self.get_free_pointer(self.ramdump, slab, p) def get_track(self, ramdump, slab, obj, track_type): @@ -136,15 +138,24 @@ class Slabinfo(RamParser): def print_slab_page_info(self, ramdump, slab, slab_node, start, out_file): page = self.ramdump.read_word(start) + seen = [] if page == 0: return slab_lru_offset = self.ramdump.field_offset('struct page', 'lru') page_flags_offset = self.ramdump.field_offset('struct page', 'flags') slab_node_offset = self.ramdump.field_offset( 'struct kmem_cache', 'size') + max_pfn_addr = self.ramdump.addr_lookup('max_pfn') + max_pfn = self.ramdump.read_word(max_pfn_addr) + max_page = pfn_to_page(ramdump, max_pfn) while page != start: if page is None: return + if page in seen: + return + if page > max_page: + return + seen.append(page) page = page - slab_lru_offset page_flags = self.ramdump.read_word(page + page_flags_offset) page_addr = page_address(self.ramdump, page)