Thread (30 messages) 30 messages, 7 authors, 2012-11-27

Re: [PATCH v3 3/3] Improve container_notify_cb() to support container hot-remove.

From: Rafael J. Wysocki <hidden>
Date: 2012-11-01 21:27:05
Also in: linux-pci, lkml

On Thursday, November 01, 2012 01:16:22 PM Yinghai Lu wrote:
On Thu, Nov 1, 2012 at 1:17 PM, Rafael J. Wysocki [off-list ref] wrote:
quoted
On Thursday, November 01, 2012 01:17:58 PM Toshi Kani wrote:
quoted
On Thu, 2012-11-01 at 11:28 -0700, Yinghai Lu wrote:
quoted
On Thu, Nov 1, 2012 at 9:43 AM, Toshi Kani [off-list ref] wrote:
quoted
Rafael pointed out in my CPU hot-remove patch that
acpi_bus_hot_remove_device() was not exported for modules.  Looks like
you have the same problem here.  FYI, I just sent the following patch
that exports acpi_bus_hot_remove_device() and acpi_os_hotplug_execute().

https://lkml.org/lkml/2012/11/1/225
acpi_os_hotplug_execute() does not like having good quality yet.

c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  941)   /*
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  942)    * We
can't run hotplug code in keventd_wq/kacpid_wq/kacpid_notify_wq
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  943)    *
because the hotplug code may call driver .remove() functions,
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  944)    *
which invoke flush_scheduled_work/acpi_os_wait_events_complete
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  945)    * to
flush these workqueues.
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  946)    */
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  947)   queue
= hp ? kacpi_hotplug_wq :
c02256be (Zhang Rui           2009-06-23 10:20:29 +0800  948)
 (type == OSL_NOTIFY_HANDLER ? kacpi_notify_wq : kacpid_wq);
9ac61856 (Bjorn Helgaas       2009-08-31 22:32:10 +0000  949)
dpc->wait = hp ? 1 : 0;
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  950)
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  951)   if
(queue == kacpi_hotplug_wq)
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  952)
 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  953)   else
if (queue == kacpi_notify_wq)
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  954)
 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  955)   else
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  956)
 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
bc73675b (Zhang Rui           2010-03-22 15:48:54 +0800  957)

really don't know why checking queue and call same code in every branch.

from comm:

commit bc73675b99fd9850dd914be01d71af99c5d2a1ae
Author: Zhang Rui [off-list ref]
Date:   Mon Mar 22 15:48:54 2010 +0800

    ACPI: fixes a false alarm from lockdep

    fixes a false alarm from lockdep, as acpi hotplug workqueue waits other
    workqueues.
    http://bugzilla.kernel.org/show_bug.cgi?id=14553
    https://bugzilla.kernel.org/show_bug.cgi?id=15521

    Original-patch-from: Andrew Morton [off-list ref]
    Signed-off-by: Shaohua Li [off-list ref]
    Signed-off-by: Zhang Rui [off-list ref]
    Signed-off-by: Len Brown [off-list ref]
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 8e6d866..900da68 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -758,7 +758,14 @@ static acpi_status
__acpi_os_execute(acpi_execute_type type,
        queue = hp ? kacpi_hotplug_wq :
                (type == OSL_NOTIFY_HANDLER ? kacpi_notify_wq : kacpid_wq);
        dpc->wait = hp ? 1 : 0;
-       INIT_WORK(&dpc->work, acpi_os_execute_deferred);
+
+       if (queue == kacpi_hotplug_wq)
+               INIT_WORK(&dpc->work, acpi_os_execute_deferred);
+       else if (queue == kacpi_notify_wq)
+               INIT_WORK(&dpc->work, acpi_os_execute_deferred);
+       else
+               INIT_WORK(&dpc->work, acpi_os_execute_deferred);
+
        ret = queue_work(queue, &dpc->work);

        if (!ret) {


Len or Rafael,
can you just revert that silly patch?
Hi Yinghai,

Per the following thread, the code seems to be written in this way to
allocate a separate lock_class_key for each work queue.  It should have
had some comment to explain this, though.

https://lkml.org/lkml/2009/12/13/304
The code has evolved since then, however, so that it doesn't make sense
any more.
oh, no, that commit should not be reverted. instead we should add some
comment for it...

that mean : three path, will have three separated static lock dep key
from every INIT_WORK.
I see.

OK, I'll drop the patch removing it.

What about the following comment:

"To prevent lockdep from complaining unnecessarily, make sure that there
 is a different static lockdep key created for each workqueue by using
 INIT_WORK for each of them separately."

Thanks,
Rafael


-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help