aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/osl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/osl.c')
-rw-r--r--drivers/acpi/osl.c42
1 files changed, 8 insertions, 34 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index e3a673a00845..21d34595dbae 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -618,25 +618,6 @@ static void acpi_os_execute_deferred(struct work_struct *work)
618 dpc->function(dpc->context); 618 dpc->function(dpc->context);
619 kfree(dpc); 619 kfree(dpc);
620 620
621 /* Yield cpu to notify thread */
622 cond_resched();
623
624 return;
625}
626
627static void acpi_os_execute_notify(struct work_struct *work)
628{
629 struct acpi_os_dpc *dpc = container_of(work, struct acpi_os_dpc, work);
630
631 if (!dpc) {
632 printk(KERN_ERR PREFIX "Invalid (NULL) context\n");
633 return;
634 }
635
636 dpc->function(dpc->context);
637
638 kfree(dpc);
639
640 return; 621 return;
641} 622}
642 623
@@ -660,7 +641,7 @@ acpi_status acpi_os_execute(acpi_execute_type type,
660{ 641{
661 acpi_status status = AE_OK; 642 acpi_status status = AE_OK;
662 struct acpi_os_dpc *dpc; 643 struct acpi_os_dpc *dpc;
663 644 struct workqueue_struct *queue;
664 ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 645 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
665 "Scheduling function [%p(%p)] for deferred execution.\n", 646 "Scheduling function [%p(%p)] for deferred execution.\n",
666 function, context)); 647 function, context));
@@ -684,20 +665,13 @@ acpi_status acpi_os_execute(acpi_execute_type type,
684 dpc->function = function; 665 dpc->function = function;
685 dpc->context = context; 666 dpc->context = context;
686 667
687 if (type == OSL_NOTIFY_HANDLER) { 668 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
688 INIT_WORK(&dpc->work, acpi_os_execute_notify); 669 queue = (type == OSL_NOTIFY_HANDLER) ? kacpi_notify_wq : kacpid_wq;
689 if (!queue_work(kacpi_notify_wq, &dpc->work)) { 670 if (!queue_work(queue, &dpc->work)) {
690 status = AE_ERROR; 671 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
691 kfree(dpc); 672 "Call to queue_work() failed.\n"));
692 } 673 status = AE_ERROR;
693 } else { 674 kfree(dpc);
694 INIT_WORK(&dpc->work, acpi_os_execute_deferred);
695 if (!queue_work(kacpid_wq, &dpc->work)) {
696 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
697 "Call to queue_work() failed.\n"));
698 status = AE_ERROR;
699 kfree(dpc);
700 }
701 } 675 }
702 return_ACPI_STATUS(status); 676 return_ACPI_STATUS(status);
703} 677}