lkml.org 
[lkml]   [2013]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH 4/5] ACPI / scan: Add second pass of companion offlining to hot-remove code
    Date
    On Tuesday, May 21, 2013 03:34:37 PM Xishi Qiu wrote:
    > On 2013/5/19 7:34, Rafael J. Wysocki wrote:
    >
    > > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    > >
    > > As indicated by comments in mm/memory_hotplug.c:remove_memory(),
    > > if CONFIG_MEMCG is set, it may not be possible to offline all of the
    > > memory blocks held by one module (FRU) in one pass (because one of
    > > them may be used by the others to store page cgroup in that case
    > > and that block has to be offlined before the other ones).
    > >
    > > To handle that arguably corner case, add a second pass of companion
    > > device offlining to acpi_scan_hot_remove() and make it ignore errors
    > > returned in the first pass (and make it skip the second pass if the
    > > first one is successful).
    > >
    > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    > > ---
    > > drivers/acpi/scan.c | 67 ++++++++++++++++++++++++++++++++++++++--------------
    > > 1 file changed, 50 insertions(+), 17 deletions(-)
    > >
    > > Index: linux-pm/drivers/acpi/scan.c
    > > ===================================================================
    > > --- linux-pm.orig/drivers/acpi/scan.c
    > > +++ linux-pm/drivers/acpi/scan.c
    > > @@ -131,6 +131,7 @@ static acpi_status acpi_bus_offline_comp
    > > {
    > > struct acpi_device *device = NULL;
    > > struct acpi_device_physical_node *pn;
    > > + bool second_pass = (bool)data;
    > > acpi_status status = AE_OK;
    > >
    > > if (acpi_bus_get_device(handle, &device))
    > > @@ -141,15 +142,26 @@ static acpi_status acpi_bus_offline_comp
    > > list_for_each_entry(pn, &device->physical_node_list, node) {
    > > int ret;
    > >
    > > + if (second_pass) {
    > > + /* Skip devices offlined by the first pass. */
    > > + if (pn->put_online)
    >
    > should it be "if (!pn->put_online)" ?

    No, I don't think so.

    pn->put_online set means that the device has been offlined by the first pass,
    so we don't need to try it in the second one.

    Thanks,
    Rafael


    > > + continue;
    > > + } else {
    > > + pn->put_online = false;
    > > + }
    > > ret = device_offline(pn->dev);
    > > if (acpi_force_hot_remove)
    > > continue;
    > >
    > > - if (ret < 0) {
    > > - status = AE_ERROR;
    > > - break;
    > > + if (ret >= 0) {
    > > + pn->put_online = !ret;
    > > + } else {
    > > + *ret_p = pn->dev;
    > > + if (second_pass) {
    > > + status = AE_ERROR;
    > > + break;
    > > + }
    > > }
    > > - pn->put_online = !ret;
    > > }
    > >
    > > mutex_unlock(&device->physical_node_lock);
    >
    >
    >
    --
    I speak only for myself.
    Rafael J. Wysocki, Intel Open Source Technology Center.


    \
     
     \ /
      Last update: 2013-05-21 13:21    [W:4.173 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site