Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 943021 Details for
Bug 1145751
kvm_clock lacks protection against tsc going backwards
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
RHEL PATCH 2/2
0002-ACPI-hotplug-driver-core-Handle-containers-in-a-spec.patch (text/plain), 10.81 KB, created by
Prarit Bhargava
on 2014-10-01 11:48:43 UTC
(
hide
)
Description:
RHEL PATCH 2/2
Filename:
MIME Type:
Creator:
Prarit Bhargava
Created:
2014-10-01 11:48:43 UTC
Size:
10.81 KB
patch
obsolete
>From 810a56adfc8e90aaef40d4b9253e2db1623fd2a9 Mon Sep 17 00:00:00 2001 >From: Prarit Bhargava <prarit@redhat.com> >Date: Mon, 15 Sep 2014 10:45:12 -0400 >Subject: [2/6] ACPI / hotplug / driver core: Handle containers in a special > way > >Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1128634 > >commit caa73ea158de9419f08e456f2716c71d1f06012a >Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> >Date: Sun Dec 29 15:25:48 2013 +0100 > > ACPI / hotplug / driver core: Handle containers in a special way > > ACPI container devices require special hotplug handling, at least > on some systems, since generally user space needs to carry out > system-specific cleanup before it makes sense to offline devices in > the container. However, the current ACPI hotplug code for containers > first attempts to offline devices in the container and only then it > notifies user space of the container offline. > > Moreover, after commit 202317a573b2 (ACPI / scan: Add acpi_device > objects for all device nodes in the namespace), ACPI device objects > representing containers are present as long as the ACPI namespace > nodes corresponding to them are present, which may be forever, even > if the container devices are physically detached from the system (the > return values of the corresponding _STA methods change in those > cases, but generally the namespace nodes themselves are still there). > Thus it is useful to introduce entities representing containers that > will go away during container hot-unplug. > > The goal of this change is to address both the above issues. > > The idea is to create a "companion" container system device for each > of the ACPI container device objects during the initial namespace > scan or on a hotplug event making the container present. That system > device will be unregistered on container removal. A new bus type > for container devices is added for this purpose, because device > offline and online operations need to be defined for them. The > online operation is a trivial function that is always successful > and the offline uses a callback pointed to by the container device's > offline member. > > For ACPI containers that callback simply walks the list of ACPI > device objects right below the container object (its children) and > checks if all of their physical companion devices are offline. If > that's not the case, it returns -EBUSY and the container system > devivce cannot be put offline. Consequently, to put the container > system device offline, it is necessary to put all of the physical > devices depending on its ACPI companion object offline beforehand. > > Container system devices created for ACPI container objects are > initially online. They are created by the container ACPI scan > handler whose hotplug.demand_offline flag is set. That causes > acpi_scan_hot_remove() to check if the companion container system > device is offline before attempting to remove an ACPI container or > any devices below it. If the check fails, a KOBJ_CHANGE uevent is > emitted for the container system device in question and user space > is expected to offline all devices below the container and the > container itself in response to it. Then, user space can finalize > the removal of the container with the help of its ACPI device > object's eject attribute in sysfs. > > Tested-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >--- > drivers/acpi/container.c | 48 +++++++++++++++++++++++++++++++++++++++++---- > drivers/acpi/internal.h | 1 + > drivers/acpi/scan.c | 8 +++++--- > drivers/base/Makefile | 2 +- > drivers/base/base.h | 1 + > drivers/base/container.c | 44 +++++++++++++++++++++++++++++++++++++++++ > drivers/base/init.c | 1 + > include/linux/container.h | 25 +++++++++++++++++++++++ > 8 files changed, 122 insertions(+), 8 deletions(-) > create mode 100644 drivers/base/container.c > create mode 100644 include/linux/container.h > >diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c >index 83d232c..0b6ae6e 100644 >--- a/drivers/acpi/container.c >+++ b/drivers/acpi/container.c >@@ -27,8 +27,7 @@ > * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > */ > #include <linux/acpi.h> >- >-#include "internal.h" >+#include <linux/container.h> > > #include "internal.h" > >@@ -44,16 +43,56 @@ static const struct acpi_device_id container_device_ids[] = { > {"", 0}, > }; > >+static int acpi_container_offline(struct container_dev *cdev) >+{ >+ struct acpi_device *adev = ACPI_COMPANION(&cdev->dev); >+ struct acpi_device *child; >+ >+ /* Check all of the dependent devices' physical companions. */ >+ list_for_each_entry(child, &adev->children, node) >+ if (!acpi_scan_is_offline(child, false)) >+ return -EBUSY; >+ >+ return 0; >+} >+ >+static void acpi_container_release(struct device *dev) >+{ >+ kfree(to_container_dev(dev)); >+} >+ > static int container_device_attach(struct acpi_device *adev, > const struct acpi_device_id *not_used) > { >- kobject_uevent(&adev->dev.kobj, KOBJ_ONLINE); >+ struct container_dev *cdev; >+ struct device *dev; >+ int ret; >+ >+ cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); >+ if (!cdev) >+ return -ENOMEM; >+ >+ cdev->offline = acpi_container_offline; >+ dev = &cdev->dev; >+ dev->bus = &container_subsys; >+ dev_set_name(dev, "%s", dev_name(&adev->dev)); >+ ACPI_COMPANION_SET(dev, adev); >+ dev->release = acpi_container_release; >+ ret = device_register(dev); >+ if (ret) >+ return ret; >+ >+ adev->driver_data = dev; > return 1; > } > > static void container_device_detach(struct acpi_device *adev) > { >- kobject_uevent(&adev->dev.kobj, KOBJ_OFFLINE); >+ struct device *dev = acpi_driver_data(adev); >+ >+ adev->driver_data = NULL; >+ if (dev) >+ device_unregister(dev); > } > > static struct acpi_scan_handler container_handler = { >@@ -62,6 +101,7 @@ static struct acpi_scan_handler container_handler = { > .detach = container_device_detach, > .hotplug = { > .enabled = true, >+ .demand_offline = true, > }, > }; > >diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h >index a21c08e..4eb389f 100644 >--- a/drivers/acpi/internal.h >+++ b/drivers/acpi/internal.h >@@ -72,6 +72,7 @@ static inline void acpi_lpss_init(void) {} > #endif > > bool acpi_queue_hotplug_work(struct work_struct *work); >+bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent); > > /* -------------------------------------------------------------------------- > Device Node Initialization / Removal >diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c >index 4c8b2ee..a3ca7d0 100644 >--- a/drivers/acpi/scan.c >+++ b/drivers/acpi/scan.c >@@ -128,7 +128,7 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha > } > static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL); > >-static bool acpi_scan_is_offline(struct acpi_device *adev) >+bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent) > { > struct acpi_device_physical_node *pn; > bool offline = true; >@@ -137,7 +137,9 @@ static bool acpi_scan_is_offline(struct acpi_device *adev) > > list_for_each_entry(pn, &adev->physical_node_list, node) > if (device_supports_offline(pn->dev) && !pn->dev->offline) { >- kobject_uevent(&pn->dev->kobj, KOBJ_CHANGE); >+ if (uevent) >+ kobject_uevent(&pn->dev->kobj, KOBJ_CHANGE); >+ > offline = false; > break; > } >@@ -269,7 +271,7 @@ static int acpi_scan_hot_remove(struct acpi_device *device) > acpi_status status; > > if (device->handler->hotplug.demand_offline && !acpi_force_hot_remove) { >- if (!acpi_scan_is_offline(device)) >+ if (!acpi_scan_is_offline(device, true)) > return -EBUSY; > } else { > int error = acpi_scan_try_to_offline(device); >diff --git a/drivers/base/Makefile b/drivers/base/Makefile >index 94e8a80..d08c9d3 100644 >--- a/drivers/base/Makefile >+++ b/drivers/base/Makefile >@@ -4,7 +4,7 @@ obj-y := core.o bus.o dd.o syscore.o \ > driver.o class.o platform.o \ > cpu.o firmware.o init.o map.o devres.o \ > attribute_container.o transport_class.o \ >- topology.o >+ topology.o container.o > obj-$(CONFIG_DEVTMPFS) += devtmpfs.o > obj-$(CONFIG_DMA_CMA) += dma-contiguous.o > obj-y += power/ >diff --git a/drivers/base/base.h b/drivers/base/base.h >index 2cbc677..24f4242 100644 >--- a/drivers/base/base.h >+++ b/drivers/base/base.h >@@ -100,6 +100,7 @@ static inline int hypervisor_init(void) { return 0; } > #endif > extern int platform_bus_init(void); > extern void cpu_dev_init(void); >+extern void container_dev_init(void); > > struct kobject *virtual_device_parent(struct device *dev); > >diff --git a/drivers/base/container.c b/drivers/base/container.c >new file mode 100644 >index 0000000..ecbfbe2 >--- /dev/null >+++ b/drivers/base/container.c >@@ -0,0 +1,44 @@ >+/* >+ * System bus type for containers. >+ * >+ * Copyright (C) 2013, Intel Corporation >+ * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> >+ * >+ * This program is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License version 2 as >+ * published by the Free Software Foundation. >+ */ >+ >+#include <linux/container.h> >+ >+#include "base.h" >+ >+#define CONTAINER_BUS_NAME "container" >+ >+static int trivial_online(struct device *dev) >+{ >+ return 0; >+} >+ >+static int container_offline(struct device *dev) >+{ >+ struct container_dev *cdev = to_container_dev(dev); >+ >+ return cdev->offline ? cdev->offline(cdev) : 0; >+} >+ >+struct bus_type container_subsys = { >+ .name = CONTAINER_BUS_NAME, >+ .dev_name = CONTAINER_BUS_NAME, >+ .online = trivial_online, >+ .offline = container_offline, >+}; >+ >+void __init container_dev_init(void) >+{ >+ int ret; >+ >+ ret = subsys_system_register(&container_subsys, NULL); >+ if (ret) >+ pr_err("%s() failed: %d\n", __func__, ret); >+} >diff --git a/drivers/base/init.c b/drivers/base/init.c >index c16f0b8..da033d3 100644 >--- a/drivers/base/init.c >+++ b/drivers/base/init.c >@@ -33,4 +33,5 @@ void __init driver_init(void) > platform_bus_init(); > cpu_dev_init(); > memory_dev_init(); >+ container_dev_init(); > } >diff --git a/include/linux/container.h b/include/linux/container.h >new file mode 100644 >index 0000000..3c03e6f >--- /dev/null >+++ b/include/linux/container.h >@@ -0,0 +1,25 @@ >+/* >+ * Definitions for container bus type. >+ * >+ * Copyright (C) 2013, Intel Corporation >+ * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> >+ * >+ * This program is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License version 2 as >+ * published by the Free Software Foundation. >+ */ >+ >+#include <linux/device.h> >+ >+/* drivers/base/power/container.c */ >+extern struct bus_type container_subsys; >+ >+struct container_dev { >+ struct device dev; >+ int (*offline)(struct container_dev *cdev); >+}; >+ >+static inline struct container_dev *to_container_dev(struct device *dev) >+{ >+ return container_of(dev, struct container_dev, dev); >+} >-- >1.7.9.3 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1145751
:
941540
|
941541
|
941542
|
941543
|
941544
|
941545
|
943020
| 943021 |
943022
|
943023
|
943024
|
943025
|
975178
|
975179