Skip to content

Commit 93a132a

Browse files
committed
drgn.helpers.linux.mm: only return valid pages from for_each_page()
Now that we have for_each_valid_page_range(), we can make for_each_page() a simple wrapper around it and finally stop returning invalid pages that require catching FaultError. Closes #27, closes osandov#228. Signed-off-by: Omar Sandoval <[email protected]>
1 parent 22c80e2 commit 93a132a

File tree

1 file changed

+4
-22
lines changed

1 file changed

+4
-22
lines changed

drgn/helpers/linux/mm.py

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -888,31 +888,13 @@ def _page0(prog: Program) -> Object:
888888
@takes_program_or_default
889889
def for_each_page(prog: Program) -> Iterator[Object]:
890890
"""
891-
Iterate over every ``struct page *`` from the minimum to the maximum page.
892-
893-
.. note::
894-
895-
This may include offline pages which don't have a valid ``struct
896-
page``. Wrap accesses in a ``try`` ... ``except``
897-
:class:`drgn.FaultError`:
898-
899-
>>> for page in for_each_page():
900-
... try:
901-
... if PageLRU(page):
902-
... print(hex(page))
903-
... except drgn.FaultError:
904-
... continue
905-
0xfffffb4a000c0000
906-
0xfffffb4a000c0040
907-
...
908-
909-
This may be fixed in the future.
891+
Iterate over every valid ``struct page *``.
910892
911893
:return: Iterator of ``struct page *`` objects.
912894
"""
913-
page0 = _page0(prog)
914-
for i in range(prog["min_low_pfn"], prog["max_pfn"]):
915-
yield page0 + i
895+
for start_pfn, end_pfn, mem_map in for_each_valid_page_range(prog):
896+
for pfn in range(start_pfn, end_pfn):
897+
yield mem_map + pfn
916898

917899

918900
def _for_each_valid_page_range_flatmem(

0 commit comments

Comments
 (0)