lkml.org 
[lkml]   [2022]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/3] acpi/processor: fix evaluating _PDC method when running as Xen dom0
    Ping?

    So far I've got some feedback from Jan which I've replied to, but I
    haven't got any more feedback.

    Both patches 1 and 2 are required in order for Xen dom0s to properly
    handle ACPI Processor related data to the hypervisor. Patch 3 can be
    deal with later.

    Thanks, Roger.

    On Mon, Nov 21, 2022 at 11:21:10AM +0100, Roger Pau Monne wrote:
    > When running as a Xen dom0 the number of CPUs available to Linux can
    > be different from the number of CPUs present on the system, but in
    > order to properly fetch processor performance related data _PDC must
    > be executed on all the physical CPUs online on the system.
    >
    > The current checks in processor_physically_present() result in some
    > processor objects not getting their _PDC methods evaluated when Linux
    > is running as Xen dom0. Fix this by introducing a custom function to
    > use when running as Xen dom0 in order to check whether a processor
    > object matches a CPU that's online.
    >
    > Fixes: 5d554a7bb064 ('ACPI: processor: add internal processor_physically_present()')
    > Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
    > ---
    > arch/x86/include/asm/xen/hypervisor.h | 10 ++++++++++
    > arch/x86/xen/enlighten.c | 27 +++++++++++++++++++++++++++
    > drivers/acpi/processor_pdc.c | 11 +++++++++++
    > 3 files changed, 48 insertions(+)
    >
    > diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
    > index 16f548a661cf..b9f512138043 100644
    > --- a/arch/x86/include/asm/xen/hypervisor.h
    > +++ b/arch/x86/include/asm/xen/hypervisor.h
    > @@ -61,4 +61,14 @@ void __init xen_pvh_init(struct boot_params *boot_params);
    > void __init mem_map_via_hcall(struct boot_params *boot_params_p);
    > #endif
    >
    > +#ifdef CONFIG_XEN_DOM0
    > +bool __init xen_processor_present(uint32_t acpi_id);
    > +#else
    > +static inline bool xen_processor_present(uint32_t acpi_id)
    > +{
    > + BUG();
    > + return false;
    > +}
    > +#endif
    > +
    > #endif /* _ASM_X86_XEN_HYPERVISOR_H */
    > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    > index b8db2148c07d..d4c44361a26c 100644
    > --- a/arch/x86/xen/enlighten.c
    > +++ b/arch/x86/xen/enlighten.c
    > @@ -346,3 +346,30 @@ void xen_arch_unregister_cpu(int num)
    > }
    > EXPORT_SYMBOL(xen_arch_unregister_cpu);
    > #endif
    > +
    > +#ifdef CONFIG_XEN_DOM0
    > +bool __init xen_processor_present(uint32_t acpi_id)
    > +{
    > + unsigned int i, maxid;
    > + struct xen_platform_op op = {
    > + .cmd = XENPF_get_cpuinfo,
    > + .interface_version = XENPF_INTERFACE_VERSION,
    > + };
    > + int ret = HYPERVISOR_platform_op(&op);
    > +
    > + if (ret)
    > + return false;
    > +
    > + maxid = op.u.pcpu_info.max_present;
    > + for (i = 0; i <= maxid; i++) {
    > + op.u.pcpu_info.xen_cpuid = i;
    > + ret = HYPERVISOR_platform_op(&op);
    > + if (ret)
    > + continue;
    > + if (op.u.pcpu_info.acpi_id == acpi_id)
    > + return op.u.pcpu_info.flags & XEN_PCPU_FLAGS_ONLINE;
    > + }
    > +
    > + return false;
    > +}
    > +#endif
    > diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c
    > index 8c3f82c9fff3..18fb04523f93 100644
    > --- a/drivers/acpi/processor_pdc.c
    > +++ b/drivers/acpi/processor_pdc.c
    > @@ -14,6 +14,8 @@
    > #include <linux/acpi.h>
    > #include <acpi/processor.h>
    >
    > +#include <xen/xen.h>
    > +
    > #include "internal.h"
    >
    > static bool __init processor_physically_present(acpi_handle handle)
    > @@ -47,6 +49,15 @@ static bool __init processor_physically_present(acpi_handle handle)
    > return false;
    > }
    >
    > + if (xen_initial_domain())
    > + /*
    > + * When running as a Xen dom0 the number of processors Linux
    > + * sees can be different from the real number of processors on
    > + * the system, and we still need to execute _PDC for all of
    > + * them.
    > + */
    > + return xen_processor_present(acpi_id);
    > +
    > type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0;
    > cpuid = acpi_get_cpuid(handle, type, acpi_id);
    >
    > --
    > 2.37.3
    >

    \
     
     \ /
      Last update: 2022-11-29 17:04    [W:3.805 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site