From: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
To: Alexey Starikovskiy <astarikovskiy@suse.de>
Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>,
linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 3/3] acpi: remove GPE polling
Date: Sat, 19 Jul 2008 12:39:31 +0100 [thread overview]
Message-ID: <4881D273.9010004@tuffmail.co.uk> (raw)
In-Reply-To: <4881CE72.1090401@tuffmail.co.uk>
From: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
This should fix "[regression] display dimming is slow and laggy",
<http://bugzilla.kernel.org/show_bug.cgi?id=10919>. It has a similar effect
on my Asus EeePC.
Much of this is stolen from Alexey Starikovskiy's fix (see Bugzilla). But
the previous two GPE fixes should have avoided the need to disable GPE
interrupts.
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Tested-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index e764011..1088903 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -79,7 +79,6 @@ enum {
EC_FLAGS_WAIT_GPE = 0, /* Don't check status until GPE arrives */
EC_FLAGS_GPE_MODE, /* Expect GPE to be sent for status change */
EC_FLAGS_NO_GPE, /* Don't use GPE mode */
- EC_FLAGS_RESCHEDULE_POLL /* Re-schedule poll */
};
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
@@ -105,7 +104,6 @@ static struct acpi_ec {
wait_queue_head_t wait;
struct list_head list;
struct delayed_work work;
- atomic_t irq_count;
u8 handlers_installed;
} *boot_ec, *first_ec;
@@ -154,24 +152,14 @@ static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event)
return 0;
}
-static void ec_schedule_ec_poll(struct acpi_ec *ec)
-{
- if (test_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags))
- schedule_delayed_work(&ec->work,
- msecs_to_jiffies(ACPI_EC_DELAY));
-}
-
static void ec_switch_to_poll_mode(struct acpi_ec *ec)
{
set_bit(EC_FLAGS_NO_GPE, &ec->flags);
clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
- acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
- set_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
}
static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
{
- atomic_set(&ec->irq_count, 0);
if (likely(test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) &&
likely(!force_poll)) {
if (wait_event_timeout(ec->wait, acpi_ec_check_status(ec, event),
@@ -184,7 +172,6 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
pr_info(PREFIX "missing confirmations, "
"switch off interrupt mode.\n");
ec_switch_to_poll_mode(ec);
- ec_schedule_ec_poll(ec);
return 0;
}
} else {
@@ -497,12 +484,6 @@ static u32 acpi_ec_gpe_handler(void *data)
u8 state = acpi_ec_read_status(ec);
pr_debug(PREFIX "~~~> interrupt\n");
- atomic_inc(&ec->irq_count);
- if (atomic_read(&ec->irq_count) > 5) {
- pr_err(PREFIX "GPE storm detected, disabling EC GPE\n");
- ec_switch_to_poll_mode(ec);
- goto end;
- }
clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
wake_up(&ec->wait);
@@ -519,10 +500,8 @@ static u32 acpi_ec_gpe_handler(void *data)
pr_info(PREFIX "non-query interrupt received,"
" switching to interrupt mode\n");
set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
- clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
}
-end:
- ec_schedule_ec_poll(ec);
+
return ACPI_SUCCESS(status) ?
ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
}
@@ -530,7 +509,6 @@ end:
static void do_ec_poll(struct work_struct *work)
{
struct acpi_ec *ec = container_of(work, struct acpi_ec, work.work);
- atomic_set(&ec->irq_count, 0);
(void)acpi_ec_gpe_handler(ec);
}
@@ -675,7 +653,6 @@ static struct acpi_ec *make_acpi_ec(void)
init_waitqueue_head(&ec->wait);
INIT_LIST_HEAD(&ec->list);
INIT_DELAYED_WORK_DEFERRABLE(&ec->work, do_ec_poll);
- atomic_set(&ec->irq_count, 0);
return ec;
}
@@ -714,15 +691,8 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
return AE_CTRL_TERMINATE;
}
-static void ec_poll_stop(struct acpi_ec *ec)
-{
- clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
- cancel_delayed_work(&ec->work);
-}
-
static void ec_remove_handlers(struct acpi_ec *ec)
{
- ec_poll_stop(ec);
if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
pr_err(PREFIX "failed to remove space handler\n");
@@ -863,7 +833,6 @@ static int acpi_ec_start(struct acpi_device *device)
ret = ec_install_handlers(ec);
- ec_schedule_ec_poll(ec);
return ret;
}
next prev parent reply other threads:[~2008-07-19 11:39 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-15 22:25 [PATCH] acpi: Avoid dropping rapid hotkey events (or other GPEs) on Asus EeePC Alan Jenkins
2008-07-17 11:49 ` Alexey Starikovskiy
2008-07-17 12:13 ` Henrique de Moraes Holschuh
2008-07-17 12:30 ` Alexey Starikovskiy
2008-07-17 16:26 ` Henrique de Moraes Holschuh
2008-07-17 16:45 ` Alan Jenkins
2008-07-17 18:50 ` Henrique de Moraes Holschuh
2008-07-17 19:07 ` Alan Jenkins
2008-07-19 11:37 ` [PATCH 0/3] acpi: GPE fixes Alan Jenkins
2008-07-19 14:07 ` Vegard Nossum
[not found] ` <4881CE72.1090401@tuffmail.co.uk>
2008-07-19 11:38 ` [PATCH 1/3] acpi: Rip out EC_FLAGS_QUERY_PENDING (prevent race condition) Alan Jenkins
2008-07-19 16:59 ` Alexey Starikovskiy
2008-07-19 20:41 ` Alan Jenkins
2008-07-19 21:12 ` Alexey Starikovskiy
2008-07-20 14:55 ` Alan Jenkins
2008-07-19 11:39 ` [PATCH 2/3] acpi: Avoid dropping rapid GPEs on Asus EeePC and others Alan Jenkins
2008-07-19 11:39 ` Alan Jenkins [this message]
2008-07-17 14:35 ` [PATCH] acpi: Avoid dropping rapid hotkey events (or other GPEs) on Asus EeePC Alexey Starikovskiy
2008-07-17 16:02 ` Alan Jenkins
2008-07-17 16:45 ` Alexey Starikovskiy
2008-07-17 18:55 ` Alan Jenkins
2008-07-17 18:59 ` Alexey Starikovskiy
2008-08-12 23:28 ` Andrew Morton
2008-08-13 10:21 ` Alan Jenkins
2008-08-13 10:46 ` Andrew Morton
2008-08-13 11:45 ` Alan Jenkins
2008-08-13 11:51 ` Alan Jenkins
2008-08-13 13:36 ` Maximilian Engelhardt
2008-08-13 14:39 ` Alan Jenkins
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=4881D273.9010004@tuffmail.co.uk \
--to=alan-jenkins@tuffmail.co.uk \
--cc=astarikovskiy@suse.de \
--cc=hmh@hmh.eng.br \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).