Thread (28 messages) 28 messages, 2 authors, 2012-11-28

Re: [PATCH v3 1/4] ACPI: Support system notify handler via .sys_notify

From: Toshi Kani <hidden>
Date: 2012-11-28 22:56:30
Also in: lkml

On Wed, 2012-11-28 at 23:49 +0100, Rafael J. Wysocki wrote:
On Wednesday, November 28, 2012 03:33:27 PM Toshi Kani wrote:
quoted
quoted
quoted
quoted
quoted
quoted
quoted
I think it has some challenge as well.  We bind an ACPI driver with
device_register(), which calls device_add()-> kobject_add().  So, all
non-present ACPI device objects will show up in sysfs, unless we can
change the core.  This will change user interface.  There can be quite
many non-present devices in ACPI namespace depending on FW
implementation.
If additional devices appear in sysfs, that's not a problem.  If there
were fewer of them, that would be a real one. :-)
I see.  I guess this means that once we expose all non-present devices
in sysfs, we cannot go back to the current way.  So, we need to be very
careful.  Anyway, this model requires separate handling for static ACPI
[1] and dynamic ACPI [2], which may make the state model complicated.

1. Static ACPI - No creation / deletion of acpi_device at hot-plug.
2. Dynamic ACPI - Create acpi_device at hot-add, delete at hot-remove.
Sure.  The complication here is that we'll need to handle the removal of
a bunch of struct acpi_device objects when a whole table goes away.

However, first, we don't seem to handle table unloading now.  At least
acpi_unload_parent_table() is not called from anywhere as far as I can
say.  Second, we'll need to handle the removal of struct acpi_device objects
_anyway_ on table unload, this way or another.
AML is the one that requests loading/unloading of SSDT for dynamic ACPI.
In hot-add, _Lxx method executes AML_LOAD_OP or AML_LOAD_TABLE_OP to
load SSDT and then sends a notification to the OS.  In hot-remove, _EJ0
method executes AML_UNLOAD_OP to unload SSDT.  Of course, ACPICA does
the actual work on behalf of AML.  But this is not visible to ACPI core
or drivers, unless it checks ACPI namespace to see if any device objects
disappeared after _EJ0.
Oh, we have a handler for that event, but we don't really use it. :-)

And I wonder what happens to the struct acpi_device objects associated with
the ACPI handles in the table being unloaded?
If we use an ACPI handle that does not associate with a device object,
ACPICA returns AE_NOT_FOUND or AE_NOT_EXIST.  But, we should remove
acpi_device that does not have its associated ACPI object.  Currently,
we create acpi_device on hot-add and remove it on hot-remove, so it is
OK.  But if we start creating acpi_device objects for non-present
devices, we need to worry about if acpi_device objects indeed have their
associated ACPI objects.  That's the complication I mentioned above.
My question was about something different.  Is it actually guaranteed
that all struct device objects associated with the given ACPI table will
be removed before that table is unloaded?
Yes, it is guaranteed currently.  acpi_bus_hot_remove_device() calls
acpi_bus_trim(), which deletes all acpi_device objects under of the
notified object.  It then calls _EJ0 of the notified object, which
unloads all ACPI objects under the notified object. 

Thanks,
-Toshi


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help