----- Original Message ----- > > Commit dd12805ed1db7 ("XArray: Remove radix tree compatibility") on > linux-next changes the definition of 'radix_tree_root' back to be a struct. > The content however differs from the original 'struct radix_tree_root'. > Thus attempts to debug current linux-next kernels fail with 'radix trees do > not exist or have changed their format'. Because the new 'struct > radix_tree_root' and 'struct xarray' have nearly the same layout the > functionality for XArrays can be reused. Hi Philipp, The patch looks good, and doesn't break backwards-compatibility. If by chance Matthew changes the linux-next kernel patch, this one can always be revisited. Queued for crash-7.2.6: https://github.com/crash-utility/crash/commit/4d551127014e3ad4014e6e8811bcf86d4a53d723 Thanks, Dave > > Signed-off-by: Philipp Rudo <prudo linux ibm com> > --- > bpf.c | 7 ++++++- > filesys.c | 4 +++- > ipcs.c | 5 ++++- > kernel.c | 11 ++++++++--- > task.c | 15 +++++++++++---- > tools.c | 5 ++++- > 6 files changed, 36 insertions(+), 11 deletions(-) > > diff --git a/bpf.c b/bpf.c > index 6eacb9a..056e286 100644 > --- a/bpf.c > +++ b/bpf.c > @@ -221,7 +221,12 @@ bpf_init(struct bpf_info *bpf) > bpf->idr_type = IDR_ORIG; > do_old_idr(IDR_ORIG_INIT, 0, NULL); > } else if (STREQ(MEMBER_TYPE_NAME("idr", "idr_rt"), "radix_tree_root")) > - bpf->idr_type = IDR_RADIX; > + if (MEMBER_EXISTS("radix_tree_root", "rnode")) > + bpf->idr_type = IDR_RADIX; > + else if (MEMBER_EXISTS("radix_tree_root", "xa_head")) > + bpf->idr_type = IDR_XARRAY; > + else > + error(FATAL, "cannot determine IDR list type\n"); > else if (STREQ(MEMBER_TYPE_NAME("idr", "idr_rt"), "xarray")) > bpf->idr_type = IDR_XARRAY; > else > diff --git a/filesys.c b/filesys.c > index 9305627..6abba0b 100644 > --- a/filesys.c > +++ b/filesys.c > @@ -2217,7 +2217,9 @@ dump_inode_page_cache_info(ulong inode) > > xarray = root_rnode = count = 0; > if (MEMBER_EXISTS("address_space", "i_pages") && > - STREQ(MEMBER_TYPE_NAME("address_space", "i_pages"), "xarray")) > + (STREQ(MEMBER_TYPE_NAME("address_space", "i_pages"), "xarray") || > + (STREQ(MEMBER_TYPE_NAME("address_space", "i_pages"), "radix_tree_root") && > + MEMBER_EXISTS("radix_tree_root", "xa_head")))) > xarray = i_mapping + OFFSET(address_space_page_tree); > else > root_rnode = i_mapping + OFFSET(address_space_page_tree); > diff --git a/ipcs.c b/ipcs.c > index 2553bac..3c26620 100644 > --- a/ipcs.c > +++ b/ipcs.c > @@ -206,7 +206,10 @@ ipcs_init(void) > if (STREQ(MEMBER_TYPE_NAME("idr", "idr_rt"), "xarray")) > ipcs_table.init_flags |= IDR_XARRAY; > else > - ipcs_table.init_flags |= IDR_RADIX; > + if (MEMBER_EXISTS("radix_tree_root", "rnode")) > + ipcs_table.init_flags |= IDR_RADIX; > + else if (MEMBER_EXISTS("radix_tree_root", "xa_head")) > + ipcs_table.init_flags |= IDR_XARRAY; > } else > ipcs_table.init_flags |= IDR_ORIG; > > diff --git a/kernel.c b/kernel.c > index 9f5ba89..8080097 100644 > --- a/kernel.c > +++ b/kernel.c > @@ -534,9 +534,14 @@ kernel_init() > > if (kernel_symbol_exists("irq_desc_tree")) { > get_symbol_type("irq_desc_tree", NULL, &req); > - kt->flags2 |= STREQ(req.type_tag_name, "xarray") ? > - IRQ_DESC_TREE_XARRAY : IRQ_DESC_TREE_RADIX; > - > + if (STREQ(req.type_tag_name, "xarray")) { > + kt->flags2 |= IRQ_DESC_TREE_XARRAY; > + } else { > + if (MEMBER_EXISTS("radix_tree_root", "xa_head")) > + kt->flags2 |= IRQ_DESC_TREE_XARRAY; > + else > + kt->flags2 |= IRQ_DESC_TREE_RADIX; > + } > } > STRUCT_SIZE_INIT(irq_data, "irq_data"); > if (VALID_STRUCT(irq_data)) { > diff --git a/task.c b/task.c > index cd118e5..36a90d6 100644 > --- a/task.c > +++ b/task.c > @@ -507,10 +507,17 @@ task_init(void) > OFFSET(pid_namespace_idr) + OFFSET(idr_idr_rt); > tt->flags |= PID_XARRAY; > } else if STREQ(MEMBER_TYPE_NAME("idr", "idr_rt"), "radix_tree_root") { > - tt->refresh_task_table = refresh_radix_tree_task_table; > - tt->pid_radix_tree = symbol_value("init_pid_ns") + > - OFFSET(pid_namespace_idr) + OFFSET(idr_idr_rt); > - tt->flags |= PID_RADIX_TREE; > + if (MEMBER_EXISTS("radix_tree_root", "rnode")) { > + tt->refresh_task_table = refresh_radix_tree_task_table; > + tt->pid_radix_tree = symbol_value("init_pid_ns") + > + OFFSET(pid_namespace_idr) + OFFSET(idr_idr_rt); > + tt->flags |= PID_RADIX_TREE; > + } else if (MEMBER_EXISTS("radix_tree_root", "xa_head")) { > + tt->refresh_task_table = refresh_xarray_task_table; > + tt->pid_xarray = symbol_value("init_pid_ns") + > + OFFSET(pid_namespace_idr) + OFFSET(idr_idr_rt); > + tt->flags |= PID_XARRAY; > + } > } else > error(FATAL, "unknown pid_namespace.idr type: %s\n", > MEMBER_TYPE_NAME("idr", "idr_rt")); > diff --git a/tools.c b/tools.c > index 72ec76a..43b838a 100644 > --- a/tools.c > +++ b/tools.c > @@ -4241,7 +4241,10 @@ cmd_tree() > } > > if (STRNEQ(optarg, "ra")) > - type_flag = RADIXTREE_REQUEST; > + if (MEMBER_EXISTS("radix_tree_root", "xa_head")) > + type_flag = XARRAY_REQUEST; > + else > + type_flag = RADIXTREE_REQUEST; > else if (STRNEQ(optarg, "rb")) > type_flag = RBTREE_REQUEST; > else if (STRNEQ(optarg, "x")) > -- > 2.16.4 > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility