Skip to content
Snippets Groups Projects
Commit 79d39b0a authored by Patrick Daly's avatar Patrick Daly
Browse files

lrdpv2: pagetracking: Add support for order > 0 pages


The stack trace saved by PAGE_OWNER is only set for the first pfn in a page
even if it has order > 0. Previously, invalid stack traces were printed out
for "tail pages".

Change-Id: I65162c7d4220348759525871f0c1d708098ffc2d
Signed-off-by: default avatarPatrick Daly <pdaly@codeaurora.org>
parent 1247c267
No related branches found
No related tags found
No related merge requests found
...@@ -19,6 +19,21 @@ def page_buddy(ramdump, page): ...@@ -19,6 +19,21 @@ def page_buddy(ramdump, page):
return val == 0xffffff80 return val == 0xffffff80
def page_count(ramdump, page):
"""Commit: 0139aa7b7fa12ceef095d99dc36606a5b10ab83a
mm: rename _count, field of the struct page, to _refcount"""
if (ramdump.version < (4, 6, 0)):
count = ramdump.read_structure_field(page, 'struct page',
'_count.counter')
else:
count = ramdump.read_structure_field(page, 'struct page',
'_refcount.counter')
return count
def page_ref_count(ramdump, page):
return page_count(ramdump, page)
def get_debug_flags(ramdump, page): def get_debug_flags(ramdump, page):
debug_flag_offset = ramdump.field_offset('struct page', 'debug_flags') debug_flag_offset = ramdump.field_offset('struct page', 'debug_flags')
flagval = ramdump.read_word(page + debug_flag_offset) flagval = ramdump.read_word(page + debug_flag_offset)
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
from print_out import print_out_str from print_out import print_out_str
from parser_util import register_parser, RamParser from parser_util import register_parser, RamParser
from mm import pfn_to_page, page_buddy from mm import pfn_to_page, page_buddy, page_count
@register_parser('--print-pagetracking', 'print page tracking information (if available)') @register_parser('--print-pagetracking', 'print page tracking information (if available)')
...@@ -63,14 +63,18 @@ class PageTracking(RamParser): ...@@ -63,14 +63,18 @@ class PageTracking(RamParser):
for pfn in range(min_pfn, max_pfn): for pfn in range(min_pfn, max_pfn):
page = pfn_to_page(self.ramdump, pfn) page = pfn_to_page(self.ramdump, pfn)
order = 0
# validate this page is free """must be allocated, and the first pfn of an order > 0 page"""
if page_buddy(self.ramdump, page): if (page_buddy(self.ramdump, page) or
page_count(self.ramdump, page) == 0):
continue continue
if (self.ramdump.kernel_version <= (3, 19, 0)): if (self.ramdump.kernel_version <= (3, 19, 0)):
nr_trace_entries = self.ramdump.read_int( nr_trace_entries = self.ramdump.read_int(
page + trace_offset + nr_entries_offset) page + trace_offset + nr_entries_offset)
struct_holding_trace_entries = page struct_holding_trace_entries = page
order = self.ramdump.read_structure_field(
page, 'struct page', 'order')
else: else:
phys = pfn << 12 phys = pfn << 12
if phys is None or phys is 0: if phys is None or phys is 0:
...@@ -85,11 +89,14 @@ class PageTracking(RamParser): ...@@ -85,11 +89,14 @@ class PageTracking(RamParser):
nr_trace_entries = self.ramdump.read_int( nr_trace_entries = self.ramdump.read_int(
temp_page_ext + nr_entries_offset) temp_page_ext + nr_entries_offset)
struct_holding_trace_entries = temp_page_ext struct_holding_trace_entries = temp_page_ext
order = self.ramdump.read_structure_field(
temp_page_ext, 'struct page_ext', 'order')
if nr_trace_entries <= 0 or nr_trace_entries > 16: if nr_trace_entries <= 0 or nr_trace_entries > 16:
continue continue
out_tracking.write('PFN 0x{0:x} page 0x{1:x} \n'.format(pfn, page)) out_tracking.write('PFN 0x{:x}-0x{:x} page 0x{:x}\n'.format(
pfn, pfn + (1 << order) - 1, page))
alloc_str = '' alloc_str = ''
for i in range(0, nr_trace_entries): for i in range(0, nr_trace_entries):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment