[Crash-utility] Fix pvops Xen detection for kernels >= v4.20
lijiang
lijiang at redhat.com
Fri Jul 2 01:49:12 UTC 2021
On Tue, Jun 29, 2021 at 10:13 AM HAGIO KAZUHITO(萩尾 一仁)
<k-hagio-ab at nec.com> wrote:
>
> -----Original Message-----
> > Kernel commit 5c83511bdb9832c86be20fb86b783356e2f58062 removed
> > pv_init_ops, and later commit 054ac8ad5ebe4a69e1f0e842483821ddbe560121
> > removed the Xen-specific paravirt patch function. As a result, pvops Xen
> > dumps are no longer recognized as Xen dumps, and virtual-to-physical
> > translation fails.
> >
> > Use the value of xen_start_info to determine whether the kernel is
> > running in Xen PV mode. This pointer is set during the initialization of
> > a PV domain. Kudos to Juergen Gross, who suggested this check.
> >
> > Signed-off-by: Petr Tesarik <ptesarik at suse.com>
>
> Thank you, the patch looks good to me.
>
> Acked-by: Kazuhito Hagio <k-hagio-ab at nec.com>
>
> Lianbo, the patch needs some space adjustment to apply, here is a
> modified patch:
> https://github.com/k-hagio/crash/commit/a7d5cd4169a994b1faa1f646c149d1f54e9dfefd.patch
>
Looks good. Thanks.
Acked-by: Lianbo Jiang <lijiang at redhat.com>
> Kazu
>
> > ---
> > kernel.c | 34 ++++++++++++++++++++++++++++------
> > 1 file changed, 28 insertions(+), 6 deletions(-)
> >
> > diff --git a/kernel.c b/kernel.c
> > index e123f76..36fdea2 100644
> > --- a/kernel.c
> > +++ b/kernel.c
> > @@ -95,6 +95,7 @@ static ulong __dump_audit(char *);
> > static void dump_audit(void);
> > static char *vmcoreinfo_read_string(const char *);
> > static void check_vmcoreinfo(void);
> > +static int is_pvops_xen(void);
> >
> >
> > /*
> > @@ -109,7 +110,6 @@ kernel_init()
> > char *rqstruct;
> > char *rq_timestamp_name = NULL;
> > char *irq_desc_type_name;
> > - ulong pv_init_ops;
> > struct gnu_request req;
> >
> > if (pc->flags & KERNEL_DEBUG_QUERY)
> > @@ -169,11 +169,7 @@ kernel_init()
> > error(FATAL, "cannot malloc m2p page.");
> > }
> >
> > - if (PVOPS() && symbol_exists("pv_init_ops") &&
> > - readmem(symbol_value("pv_init_ops"), KVADDR, &pv_init_ops,
> > - sizeof(void *), "pv_init_ops", RETURN_ON_ERROR) &&
> > - ((p1 = value_symbol(pv_init_ops)) &&
> > - (STREQ(p1, "xen_patch") || STREQ(p1, "paravirt_patch_default")))) {
> > + if (is_pvops_xen()) {
> > kt->flags |= ARCH_XEN | ARCH_PVOPS_XEN;
> > kt->xen_flags |= WRITABLE_PAGE_TABLES;
> > if (machine_type("X86"))
> > @@ -10709,6 +10705,32 @@ paravirt_init(void)
> > }
> > }
> >
> > +static int
> > +is_pvops_xen(void)
> > +{
> > + ulong addr;
> > + char *sym;
> > +
> > + if (!PVOPS())
> > + return FALSE;
> > +
> > + if (symbol_exists("pv_init_ops") &&
> > + readmem(symbol_value("pv_init_ops"), KVADDR, &addr,
> > + sizeof(void *), "pv_init_ops", RETURN_ON_ERROR) &&
> > + (sym = value_symbol(addr)) &&
> > + (STREQ(sym, "xen_patch") ||
> > + STREQ(sym, "paravirt_patch_default")))
> > + return TRUE;
> > +
> > + if (symbol_exists("xen_start_info") &&
> > + readmem(symbol_value("xen_start_info"), KVADDR, &addr,
> > + sizeof(void *), "xen_start_info", RETURN_ON_ERROR) &&
> > + addr != 0)
> > + return TRUE;
> > +
> > + return FALSE;
> > +}
> > +
> > /*
> > * Get the kernel's xtime timespec from its relevant location.
> > */
> >
> >
> > --
> > Crash-utility mailing list
> > Crash-utility at redhat.com
> > https://listman.redhat.com/mailman/listinfo/crash-utility
>
More information about the Crash-utility
mailing list