summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2004-08-13 06:22:26 +0000
committernjl <njl@FreeBSD.org>2004-08-13 06:22:26 +0000
commite7ca6bbdad9a517758918085ca7d1b3dcac949fb (patch)
tree0eb0ae75c53db7d31a3ea28e988d5e31f1396997
parentd49f14c7b2ec3ef4af37a102761b2d8b61bd1f35 (diff)
downloadFreeBSD-src-e7ca6bbdad9a517758918085ca7d1b3dcac949fb.zip
FreeBSD-src-e7ca6bbdad9a517758918085ca7d1b3dcac949fb.tar.gz
MPSAFE locking
* Simplify taskqueue locking. * Don't acquire Giant around calls to the taskqueue function. * Remove 4.x compatibility routines.
-rw-r--r--sys/dev/acpica/Osd/OsdSchedule.c47
1 files changed, 9 insertions, 38 deletions
diff --git a/sys/dev/acpica/Osd/OsdSchedule.c b/sys/dev/acpica/Osd/OsdSchedule.c
index 5c034e8..2bb19b0 100644
--- a/sys/dev/acpica/Osd/OsdSchedule.c
+++ b/sys/dev/acpica/Osd/OsdSchedule.c
@@ -69,7 +69,6 @@ struct acpi_task_queue {
struct acpi_task *at;
};
-#if __FreeBSD_version >= 500000
/*
* Private task queue definition for ACPI
*/
@@ -92,9 +91,8 @@ TASKQUEUE_DEFINE(acpi, taskqueue_acpi_enqueue, 0,
swi_add(NULL, "acpitaskq", taskqueue_acpi_run, NULL,
SWI_TQ, 0, &taskqueue_acpi_ih));
-#ifdef ACPI_USE_THREADS
static STAILQ_HEAD(, acpi_task_queue) acpi_task_queue;
-static struct mtx acpi_task_mtx;
+ACPI_LOCK_DECL(taskq, "ACPI task queue");
static void
acpi_task_thread(void *arg)
@@ -103,26 +101,21 @@ acpi_task_thread(void *arg)
OSD_EXECUTION_CALLBACK Function;
void *Context;
+ ACPI_LOCK(taskq);
for (;;) {
- mtx_lock(&acpi_task_mtx);
- if ((atq = STAILQ_FIRST(&acpi_task_queue)) == NULL) {
- msleep(&acpi_task_queue, &acpi_task_mtx, PCATCH, "actask", 0);
- mtx_unlock(&acpi_task_mtx);
- continue;
- }
-
+ while ((atq = STAILQ_FIRST(&acpi_task_queue)) == NULL)
+ msleep(&acpi_task_queue, &taskq_mutex, PCATCH, "actask", 0);
STAILQ_REMOVE_HEAD(&acpi_task_queue, at_q);
- mtx_unlock(&acpi_task_mtx);
+ ACPI_UNLOCK(taskq);
Function = (OSD_EXECUTION_CALLBACK)atq->at->at_function;
Context = atq->at->at_context;
- mtx_lock(&Giant);
Function(Context);
free(atq->at, M_ACPITASK);
free(atq, M_ACPITASK);
- mtx_unlock(&Giant);
+ ACPI_LOCK(taskq);
}
kthread_exit(0);
@@ -136,7 +129,6 @@ acpi_task_thread_init(void)
err = 0;
STAILQ_INIT(&acpi_task_queue);
- mtx_init(&acpi_task_mtx, "ACPI task", NULL, MTX_DEF);
for (i = 0; i < ACPI_MAX_THREADS; i++) {
err = kthread_create(acpi_task_thread, NULL, &acpi_kthread_proc,
@@ -148,8 +140,6 @@ acpi_task_thread_init(void)
}
return (err);
}
-#endif /* ACPI_USE_THREADS */
-#endif /* __FreeBSD_version >= 500000 */
/* This function is called in interrupt context. */
ACPI_STATUS
@@ -189,11 +179,7 @@ AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function,
}
TASK_INIT(&at->at_task, pri, AcpiOsExecuteQueue, at);
-#if __FreeBSD_version >= 500000
taskqueue_enqueue(taskqueue_acpi, (struct task *)at);
-#else
- taskqueue_enqueue(taskqueue_swi, (struct task *)at);
-#endif
return_ACPI_STATUS (AE_OK);
}
@@ -201,38 +187,27 @@ AcpiOsQueueForExecution(UINT32 Priority, OSD_EXECUTION_CALLBACK Function,
static void
AcpiOsExecuteQueue(void *arg, int pending)
{
- struct acpi_task *at;
struct acpi_task_queue *atq;
OSD_EXECUTION_CALLBACK Function;
void *Context;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
- at = (struct acpi_task *)arg;
atq = NULL;
Function = NULL;
Context = NULL;
-#ifdef ACPI_USE_THREADS
atq = malloc(sizeof(*atq), M_ACPITASK, M_NOWAIT);
if (atq == NULL) {
printf("%s: no memory\n", __func__);
return;
}
+ atq->at = (struct acpi_task *)arg;
- atq->at = at;
-
- mtx_lock(&acpi_task_mtx);
+ ACPI_LOCK(taskq);
STAILQ_INSERT_TAIL(&acpi_task_queue, atq, at_q);
- mtx_unlock(&acpi_task_mtx);
wakeup_one(&acpi_task_queue);
-#else
- Function = (OSD_EXECUTION_CALLBACK)at->at_function;
- Context = at->at_context;
-
- Function(Context);
- free(at, M_ACPITASK);
-#endif
+ ACPI_UNLOCK(taskq);
return_VOID;
}
@@ -276,10 +251,6 @@ AcpiOsGetThreadId(void)
/* XXX do not add ACPI_FUNCTION_TRACE here, results in recursive call. */
p = curproc;
-#if __FreeBSD_version < 500000
- if (p == NULL)
- p = &proc0;
-#endif
KASSERT(p != NULL, ("%s: curproc is NULL!", __func__));
/* Returning 0 is not allowed. */
OpenPOWER on IntegriCloud