[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] Xen acpi pad implement
On Mon, Oct 29, 2012 at 03:38:14AM +0000, Liu, Jinsong wrote: > It's doable to register a stub for xen. However, it's not preferred, say, to > make xen pad as module, considering the case 'rmmod xen_acpi_pad' then > 'insmod acpi_pad'? Under such case there is risk of mwait #UD, if we want to > remove mwait check as 'patch 2/2: > Revert-pad-config-check-in-xen_check_mwait.patch' did, advantages of which is > to enjoy deep Cx. You are missing my point. This is what I was thinking off: >From 5f30320b8a1c21d60a2c22e98bcf013b7773938b Mon Sep 17 00:00:00 2001 From: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Date: Mon, 29 Oct 2012 08:38:22 -0400 Subject: [PATCH] xen/acpi: Provide a stub function to register for ACPI PAD module. TODO: Give more details. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- drivers/xen/Kconfig | 5 ++ drivers/xen/Makefile | 3 +- drivers/xen/xen-acpi-pad-stub.c | 128 +++++++++++++++++++++++++++++++++++++++ drivers/xen/xen-acpi.h | 2 + 4 files changed, 137 insertions(+), 1 deletions(-) create mode 100644 drivers/xen/xen-acpi-pad-stub.c create mode 100644 drivers/xen/xen-acpi.h diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index d4dffcd..9156a08 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -204,4 +204,9 @@ config XEN_MCE_LOG Allow kernel fetching MCE error from Xen platform and converting it into Linux mcelog format for mcelog tools +config XEN_ACPI_PAD_STUB + bool + depends on XEN_DOM0 && X86_64 && ACPI + default n + endmenu diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index 0e863703..d1895d9 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile @@ -9,9 +9,10 @@ nostackp := $(call cc-option, -fno-stack-protector) CFLAGS_features.o := $(nostackp) dom0-$(CONFIG_PCI) += pci.o -dom0-$(CONFIG_USB_SUPPORT) += dbgp.o +dom0-$(CONFIG_USB_EHCI_HCD) += dbgp.o dom0-$(CONFIG_ACPI) += acpi.o dom0-$(CONFIG_X86) += pcpu.o +dom0-$(CONFIG_XEN_ACPI_PAD_STUB) += xen-acpi-pad-stub.o obj-$(CONFIG_XEN_DOM0) += $(dom0-y) obj-$(CONFIG_BLOCK) += biomerge.o obj-$(CONFIG_XEN_XENCOMM) += xencomm.o diff --git a/drivers/xen/xen-acpi-pad-stub.c b/drivers/xen/xen-acpi-pad-stub.c new file mode 100644 index 0000000..cac9a39 --- /dev/null +++ b/drivers/xen/xen-acpi-pad-stub.c @@ -0,0 +1,128 @@ +/* + * Copyright 2012 by Oracle Inc + * Author: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> + * + * This code borrows ideas from https://lkml.org/lkml/2011/11/30/249 + * so many thanks go to Kevin Tian <kevin.tian@xxxxxxxxx> + * and Yu Ke <ke.yu@xxxxxxxxx>. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +#include <linux/cpumask.h> +#include <linux/freezer.h> +#include <linux/kernel.h> +#include <linux/kthread.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/types.h> +#include <acpi/acpi_bus.h> +#include <acpi/acpi_drivers.h> +#include <acpi/processor.h> + +#include <xen/xen.h> +#include <xen/interface/platform.h> +#include <xen/interface/version.h> +#include <asm/xen/hypercall.h> + +/* TODO: Needs comments. */ +static struct acpi_device_ops *xen_acpi_pad_ops; +static bool __read_mostly xen_acpi_pad_registered; +static DEFINE_SPINLOCK(xen_acpi_pad_spinlock); + +int xen_register_acpi_pad_owner(struct acpi_device_ops *ops) +{ + if (xen_acpi_pad_ops) + return -EEXIST; + + spin_lock(&xen_acpi_pad_spinlock); + xen_acpi_pad_ops = ops; + spin_unlock(&xen_acpi_pad_spinlock); + return 0; +} +int xen_unregister_acpi_pad_owner(struct acpi_device_ops *ops) +{ + spin_lock(&xen_acpi_pad_spinlock); + if (xen_acpi_pad_ops != ops) { + spin_unlock(&xen_acpi_pad_spinlock); + return -ENODEV; + } + xen_acpi_pad_ops = NULL; + spin_unlock(&xen_acpi_pad_spinlock); + return 0; +} + +static int xen_acpi_pad_remove(struct acpi_device *device, int type) +{ + int ret = -ENOSYS; + + spin_lock(&xen_acpi_pad_spinlock); + if (xen_acpi_pad_ops && xen_acpi_pad_ops->remove) + ret = xen_acpi_pad_ops->remove(device, type); + spin_unlock(&xen_acpi_pad_spinlock); + return ret; +} +static int xen_acpi_pad_add(struct acpi_device *device) +{ + int ret = -ENOSYS; + spin_lock(&xen_acpi_pad_spinlock); + if (xen_acpi_pad_ops && xen_acpi_pad_ops->add) + ret = xen_acpi_pad_ops->add(device); + spin_unlock(&xen_acpi_pad_spinlock); + return ret; +} + +static const struct acpi_device_id pad_device_ids[] = { + {"ACPI000C", 0}, + {"", 0}, +}; +MODULE_DEVICE_TABLE(acpi, pad_device_ids); +#define ACPI_PROCESSOR_AGGREGATOR_CLASS "acpi_pad" + +static struct acpi_driver xen_acpi_pad_driver = { + .name = "processor_aggregator", + .class = ACPI_PROCESSOR_AGGREGATOR_CLASS, + .ids = pad_device_ids, + .ops = { + .add = xen_acpi_pad_add, + .remove = xen_acpi_pad_remove, + }, +}; + +static int __init xen_acpi_pad_stub_init(void) +{ + int ret = -ENOSYS; + unsigned version; + + if (!xen_initial_domain()) + return -ENODEV; + + version = HYPERVISOR_xen_version(XENVER_version, NULL); + + if ((version >> 16 >= 4) && ((version & 0xffff) >= 2)) { + ret = acpi_bus_register_driver(&xen_acpi_pad_driver); + if (!ret) + xen_acpi_pad_registered = true; + } + return ret; +} +#if 0 +/* For testing purposes. */ +static void __exit xen_acpi_pad_stub_exit(void) +{ + if (xen_acpi_pad_registered) + acpi_bus_unregister_driver(&xen_acpi_pad_driver); + /* The driver should have unregistered first ! */ + if (WARN_ON(xen_acpi_pad_ops)) + xen_acpi_pad_ops = NULL; +} +#endif +subsys_initcall(xen_acpi_pad_stub_init); diff --git a/drivers/xen/xen-acpi.h b/drivers/xen/xen-acpi.h new file mode 100644 index 0000000..a0867b2 --- /dev/null +++ b/drivers/xen/xen-acpi.h @@ -0,0 +1,2 @@ +int xen_register_acpi_pad_owner(struct acpi_device_ops *ops); +int xen_unregister_acpi_pad_owner(struct acpi_device_ops *ops); -- 1.7.7.6 > > IMHO to prevent mwait #UD, native pad should never have chance to register > successfully when running under Xen. So it's better never unregister/disable > xen pad. With the registration stub I mentioned that won't be a problem. > > Konrad Rzeszutek Wilk wrote: > >> --- a/drivers/xen/Makefile > >> +++ b/drivers/xen/Makefile > >> @@ -29,6 +29,7 @@ obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o > >> obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ > >> obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o > >> obj-$(CONFIG_XEN_ACPI_PROCESSOR) += xen-acpi-processor.o > >> +obj-$(CONFIG_XEN_DOM0) += xen_acpi_pad.o > > > > We should have a Kconfig option. In it, please mention what > > version of hypervisor supports this functionality. > > > > Kconfig option for xen pad is not preferred, considering if we disable xen > pad and then register native pad driver? (of course the precondition is that > we do not register stub for xen). That should be OK with the stub. > > >> +#include <linux/kernel.h> > >> +#include <linux/types.h> > >> +#include <acpi/acpi_bus.h> > >> +#include <acpi/acpi_drivers.h> > >> +#include <asm/xen/hypercall.h> > >> + > >> +#if defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR) || \ > >> + defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR_MODULE) > > > > I don't think you need that. > > > > OK. > > >> + > >> +static int __init xen_acpi_pad_init(void) > >> +{ > >> + /* Only DOM0 is responsible for Xen acpi pad */ > >> + if (xen_initial_domain()) > >> + return acpi_bus_register_driver(&xen_acpi_pad_driver); + > >> + return -ENODEV; > >> +} > >> +subsys_initcall(xen_acpi_pad_init); > > > > > > No way of making this a module? It would be nice - perhaps have a stub > > function that registers the bus but does not do anything until this > > proper module is loaded? > > > > It's doable but not preferred, reason as above. > > >> + > >> +#endif > >> diff --git a/include/xen/interface/platform.h > >> b/include/xen/interface/platform.h index 4755b5f..0f44376 100644 --- > >> a/include/xen/interface/platform.h +++ > >> b/include/xen/interface/platform.h @@ -324,6 +324,22 @@ struct > >> xenpf_cpu_ol { }; > >> DEFINE_GUEST_HANDLE_STRUCT(xenpf_cpu_ol); > >> > >> +/* > >> + * CMD 58 and 59 are reserved for cpu hotadd and memory hotadd, > >> + * which already occupied at Xen hypervisor side. > > ^- are > > > > Sure. > > Thanks, > Jinsong _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |