On Mon, Feb 23, 2026 at 07:46:41PM +1300, Tao Liu wrote:
> index 60cf56a..fdea94f 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -1425,6 +1425,7 @@ struct offset_table { /* stash of
commonly-used offsets */
> long page_buffers;
> long page_lru;
> long page_pte;
> + long folio__flags_1;
New members of offset_table and size_table should always be appended
to the end of the struct, not inserted in the middle. See
https://github.com/crash-utility/crash/wiki "If you add struct members
to tables" section.
okay, no problem.
> long swap_info_struct_swap_file;
> long swap_info_struct_swap_vfsmnt;
> long swap_info_struct_flags;
> @@ -2398,6 +2399,7 @@ struct size_table { /* stash of commonly-used sizes
*/
> long probe;
> long kobj_map;
> long page_flags;
> + long folio__flags_1;
> long module_sect_attr;
> long task_struct_utime;
> long task_struct_stime;
> @@ -6007,6 +6009,8 @@ ulong do_xarray(ulong, int, struct list_pair *, int);
> #define XARRAY_TAG_MASK (3UL)
> #define XARRAY_TAG_INTERNAL (2UL)
>
> +int folio_order(ulong folio);
> +
> int file_dump(ulong, ulong, ulong, int, int);
> #define DUMP_FULL_NAME 0x1
> #define DUMP_INODE_ONLY 0x2
> diff --git a/memory.c b/memory.c
> index cbc8d2f..9080332 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -547,6 +547,9 @@ vm_init(void)
> MEMBER_OFFSET_INIT(page_freelist, "page", "freelist");
> MEMBER_OFFSET_INIT(page_page_type, "page",
"page_type");
>
> + MEMBER_OFFSET_INIT(folio__flags_1, "folio",
"_flags_1");
> + MEMBER_SIZE_INIT(folio__flags_1, "folio", "_flags_1");
> +
> MEMBER_OFFSET_INIT(mm_struct_pgd, "mm_struct", "pgd");
>
> MEMBER_OFFSET_INIT(swap_info_struct_swap_file,
> @@ -5690,6 +5693,7 @@ PG_slab_flag_init(void)
>
> #define v26_PG_private 12
>
> +#define PG_head 6
> #define PGMM_CACHED (512)
>
> static void
> @@ -20423,6 +20427,24 @@ static unsigned int oo_objects(ulong oo)
> return (oo & ((1 << 16) - 1));
> }
>
> +int
> +folio_order(ulong folio)
> +{
> + ulong v = 0;
> +
> + /* 1.) Check PG_head bit in the first page's flags. */
> + readmem(folio + OFFSET(page_flags), KVADDR, &v, sizeof(ulong),
> + "folio.page.flags", FAULT_ON_ERROR);
> + if (!(v & (1 << PG_head)))
> + return 0;
> +
> + /* 2.) Get folio->_flags_1 in the second page */
> + readmem(folio + OFFSET(folio__flags_1), KVADDR, &v, sizeof(ulong),
> + "folio->_flags_1", FAULT_ON_ERROR);
> +
> + return v & 0xff;
> +}
I encountered some regressions for this patch. See this backtrace logs:
1)
#0 folio_order (folio=18446617889843220480) at memory.c:20433
#1 0x0000000000a1243b in do_xarray_count (node=18446617889843768752,
slot=18446617889843220480, path=0x7fffffffbbd0 "root/0/0",
index=1, private=0x7fffffffceb0) at filesys.c:4275
#2 0x00000000009be0fd in do_xarray_iter (node=18446617889843768752,
height=1, path=0x7fffffffbbd0 "root/0/0", index=0,
ops=0x7fffffffce90) at tools.c:4767
#3 0x00000000009be19c in do_xarray_iter (node=18446617890154567376,
height=2, path=0x7fffffffc220 "root/0", index=0,
ops=0x7fffffffce90) at tools.c:4774
#4 0x00000000009be19c in do_xarray_iter (node=18446617886337392040,
height=3, path=0x7fffffffc860 "root", index=0,
ops=0x7fffffffce90) at tools.c:4774
#5 0x00000000009be5ca in do_xarray_traverse
(ptr=18446744071941975336, is_root=1, ops=0x7fffffffce90) at
tools.c:4849
#6 0x0000000000a127d3 in do_xarray (root=18446744071941975336,
flag=1, xp=0x0, type=0) at filesys.c:4409
#7 0x0000000000a1c7d9 in refresh_xarray_task_table () at task.c:2613
#8 0x0000000000a16c07 in task_init () at task.c:670
#9 0x00000000009aa445 in main_loop () at main.c:799
#10 0x0000000000807add in captured_main (data=<optimized out>) at main.c:1374
#11 gdb_main (args=<optimized out>) at main.c:1407
#12 0x0000000000807b45 in gdb_main_entry (argc=2, argv=0x7fffffffd908)
at main.c:1434
#13 0x0000000000a61d0b in gdb_main_loop (argc=2, argv=0x7fffffffd908)
at gdb_interface.c:81
#14 0x00000000009aa290 in main (argc=3, argv=0x7fffffffd908) at main.c:732
(gdb) p offset_table.page_flags
$1 = 0
(gdb) p offset_table.folio__flags_1
$2 = -1
20438 if (!(v & (1 << PG_head)))
(gdb) p v
$3 = 112
crash: invalid structure member offset: folio__flags_1
FILE: memory.c LINE: 20442 FUNCTION: folio_order()
Kernel version: 4.20.0-0.rc3, also I see plenty of similar regressions
for kernels 4.18, 5.2 ...
2)
Also emerge some warnings:
bpf: invalid kernel virtual address: 0 type: "folio.page.flags"
#0 readmem (addr=0, memtype=1, buffer=0x7fffffff9998, size=8,
type=0xda350f "folio.page.flags", error_handle=1) at memory.c:2411
#1 0x0000000000a0595a in folio_order (folio=0) at memory.c:20436
#2 0x0000000000a1243b in do_xarray_count (node=0, slot=0,
path=0x7fffffff9a20 "direct", index=0, private=0x7fffffffa070)
at filesys.c:4275
#3 0x00000000009be592 in do_xarray_traverse
(ptr=18446744072013761824, is_root=1, ops=0x7fffffffa050) at
tools.c:4846
#4 0x0000000000a127d3 in do_xarray (root=18446744072013761824,
flag=1, xp=0x0, type=0) at filesys.c:4409
#5 0x0000000000a7512b in bpf_init (bpf=0x12b3e80 <bpf_info>) at bpf.c:346
#6 0x0000000000a7568f in do_bpf (flags=0, prog_id=0, map_id=0,
radix=0) at bpf.c:438
#7 0x0000000000a747ea in cmd_bpf () at bpf.c:215
#8 0x00000000009aa7e1 in exec_command () at main.c:904
#9 0x00000000009aa5d3 in main_loop () at main.c:851
#10 0x0000000000807add in captured_main (data=<optimized out>) at main.c:1374
#11 gdb_main (args=<optimized out>) at main.c:1407
#12 0x0000000000807b45 in gdb_main_entry (argc=2, argv=0x7fffffffd918)
at main.c:1434
#13 0x0000000000a61d0b in gdb_main_loop (argc=2, argv=0x7fffffffd918)
at gdb_interface.c:81
#14 0x00000000009aa290 in main (argc=3, argv=0x7fffffffd918) at main.c:732
Could you please check for those?
I will check it.
Thanks
Huang Shijie