Skip to content

Commit

Permalink
ACPI: EC: Avoid queuing unnecessary work in acpi_ec_submit_event()
Browse files Browse the repository at this point in the history
Notice that it is not necessary to queue up the event work again
if the while () loop in acpi_ec_event_handler() is still running
which is the case if nr_pending_queries is greater than 0 at the
beginning of acpi_ec_submit_event() and modify the code to avoid
doing that.

While at it, rename nr_pending_queries in struct acpi_ec to
events_to_process which actually matches the role of that field
and change its data type to unsigned int which is sufficient.

No expected functional impact.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Rafael J. Wysocki committed Dec 1, 2021
1 parent eafe750 commit c793570
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
17 changes: 13 additions & 4 deletions drivers/acpi/ec.c
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,16 @@ static bool acpi_ec_submit_event(struct acpi_ec *ec)
if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) {
ec_dbg_evt("Command(%s) submitted/blocked",
acpi_ec_cmd_string(ACPI_EC_COMMAND_QUERY));
ec->nr_pending_queries++;
/*
* If events_to_process is greqter than 0 at this point, the
* while () loop in acpi_ec_event_handler() is still running
* and incrementing events_to_process will cause it to invoke
* acpi_ec_submit_query() once more, so it is not necessary to
* queue up the event work to start the same loop again.
*/
if (ec->events_to_process++ > 0)
return true;

ec->events_in_progress++;
return queue_work(ec_wq, &ec->work);
}
Expand Down Expand Up @@ -665,7 +674,7 @@ static bool advance_transaction(struct acpi_ec *ec, bool interrupt)
*/
if (!t || !(t->flags & ACPI_EC_COMMAND_POLL)) {
if (ec_event_clearing == ACPI_EC_EVT_TIMING_EVENT &&
(!ec->nr_pending_queries ||
(!ec->events_to_process ||
test_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags))) {
clear_bit(EC_FLAGS_QUERY_GUARDING, &ec->flags);
acpi_ec_close_event(ec);
Expand Down Expand Up @@ -1223,13 +1232,13 @@ static void acpi_ec_event_handler(struct work_struct *work)

spin_lock_irq(&ec->lock);

while (ec->nr_pending_queries) {
while (ec->events_to_process) {
spin_unlock_irq(&ec->lock);

acpi_ec_submit_query(ec);

spin_lock_irq(&ec->lock);
ec->nr_pending_queries--;
ec->events_to_process--;
}

/*
Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ struct acpi_ec {
spinlock_t lock;
struct work_struct work;
unsigned long timestamp;
unsigned long nr_pending_queries;
unsigned int events_to_process;
unsigned int events_in_progress;
unsigned int queries_in_progress;
bool busy_polling;
Expand Down

0 comments on commit c793570

Please sign in to comment.