From: Len Brown <lenb@kernel.org>
To: Alexey Starikovskiy <astarikovskiy@suse.de>,
Zhang Rui <rui.zhang@intel.com>
Cc: Linux-acpi@vger.kernel.org
Subject: Re: [PATCH] ACPI: Defer enabling of level GPE until all pending notifies done
Date: Sat, 2 Feb 2008 04:45:38 -0500 [thread overview]
Message-ID: <200802020445.38220.lenb@kernel.org> (raw)
In-Reply-To: <20071113100545.13159.20465.stgit@localhost.localdomain>
Alexey, Rui,
this now conflicts with theacpi_os_execute() changes
proposed in the battery hotplug series.
recommendations?
thanks,
-Len
On Tuesday 13 November 2007 05:05, Alexey Starikovskiy wrote:
> Level GPE should not be enabled until all work caused by it is done,
> e.g. all Notify() methods are completed.
> This could be accomplished by appending enable_gpe function to the end
> of notify queue.
>
> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
> ---
>
> drivers/acpi/events/evgpe.c | 17 +++++++++++++----
> drivers/acpi/osl.c | 42 ++++++++----------------------------------
> 2 files changed, 21 insertions(+), 38 deletions(-)
>
> diff --git a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c
> index e22f4a9..b4509f9 100644
> --- a/drivers/acpi/events/evgpe.c
> +++ b/drivers/acpi/events/evgpe.c
> @@ -501,6 +501,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info * gpe_xrupt_list)
> * an interrupt handler.
> *
> ******************************************************************************/
> +static void acpi_ev_asynch_enable_gpe(void *context);
>
> static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
> {
> @@ -576,22 +577,30 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
> method_node)));
> }
> }
> + /* Defer enabling of GPE until all notify handlers are done */
> + acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_asynch_enable_gpe,
> + gpe_event_info);
> + return_VOID;
> +}
>
> - if ((local_gpe_event_info.flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
> +static void acpi_ev_asynch_enable_gpe(void *context)
> +{
> + struct acpi_gpe_event_info *gpe_event_info = context;
> + acpi_status status;
> + if ((gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
> ACPI_GPE_LEVEL_TRIGGERED) {
> /*
> * GPE is level-triggered, we clear the GPE status bit after
> * handling the event.
> */
> - status = acpi_hw_clear_gpe(&local_gpe_event_info);
> + status = acpi_hw_clear_gpe(gpe_event_info);
> if (ACPI_FAILURE(status)) {
> return_VOID;
> }
> }
>
> /* Enable this GPE */
> -
> - (void)acpi_hw_write_gpe_enable_reg(&local_gpe_event_info);
> + (void)acpi_hw_write_gpe_enable_reg(gpe_event_info);
> return_VOID;
> }
>
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index aabc6ca..6816ac6 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -625,25 +625,6 @@ static void acpi_os_execute_deferred(struct work_struct *work)
> dpc->function(dpc->context);
> kfree(dpc);
>
> - /* Yield cpu to notify thread */
> - cond_resched();
> -
> - return;
> -}
> -
> -static void acpi_os_execute_notify(struct work_struct *work)
> -{
> - struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
> -
> - if (!dpc) {
> - printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
> - return;
> - }
> -
> - dpc->function(dpc->context);
> -
> - kfree(dpc);
> -
> return;
> }
>
> @@ -667,7 +648,7 @@ acpi_status acpi_os_execute(acpi_execute_type type,
> {
> acpi_status status = AE_OK;
> struct acpi_os_dpc *dpc;
> -
> + struct workqueue_struct *queue;
> ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
> "Scheduling function [%p(%p)] for deferred execution.\n",
> function, context));
> @@ -691,20 +672,13 @@ acpi_status acpi_os_execute(acpi_execute_type type,
> dpc->function = function;
> dpc->context = context;
>
> - if (type == OSL_NOTIFY_HANDLER) {
> - INIT_WORK(&dpc->work, acpi_os_execute_notify);
> - if (!queue_work(kacpi_notify_wq, &dpc->work)) {
> - status = AE_ERROR;
> - kfree(dpc);
> - }
> - } else {
> - INIT_WORK(&dpc->work, acpi_os_execute_deferred);
> - if (!queue_work(kacpid_wq, &dpc->work)) {
> - ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
> - "Call to queue_work() failed.\n"));
> - status = AE_ERROR;
> - kfree(dpc);
> - }
> + INIT_WORK(&dpc->work, acpi_os_execute_deferred);
> + queue = (type == OSL_NOTIFY_HANDLER) ? kacpi_notify_wq : kacpid_wq;
> + if (!queue_work(queue, &dpc->work)) {
> + ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
> + "Call to queue_work() failed.\n"));
> + status = AE_ERROR;
> + kfree(dpc);
> }
> return_ACPI_STATUS(status);
> }
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
next prev parent reply other threads:[~2008-02-02 9:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-09 7:50 GPE handling Li, Shaohua
2007-11-09 9:45 ` Alexey Starikovskiy
2007-11-12 0:42 ` Shaohua Li
2007-11-13 10:05 ` [PATCH] ACPI: Defer enabling of level GPE until all pending notifies done Alexey Starikovskiy
2007-11-15 5:44 ` [PATCH] ACPI: Defer enabling of level GPE until all pending notifiesdone Shaohua Li
2007-12-07 2:55 ` [PATCH] ACPI: Defer enabling of level GPE until all pending notifies done Len Brown
2008-02-02 9:45 ` Len Brown [this message]
2008-02-02 11:03 ` Alexey Starikovskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200802020445.38220.lenb@kernel.org \
--to=lenb@kernel.org \
--cc=Linux-acpi@vger.kernel.org \
--cc=astarikovskiy@suse.de \
--cc=rui.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.