Module Name:    src
Committed By:   snj
Date:           Sat Apr  4 16:58:26 UTC 2009

Modified Files:
        src/sys/kern [netbsd-5]: subr_workqueue.c

Log Message:
Pull up following revision(s) (requested by ad in ticket #651):
        sys/kern/subr_workqueue.c: revision 1.27
workqueue_finiqueue: our stack could be swapped out while enqueued to
a worker thread.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.26.4.1 src/sys/kern/subr_workqueue.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/subr_workqueue.c
diff -u src/sys/kern/subr_workqueue.c:1.26 src/sys/kern/subr_workqueue.c:1.26.4.1
--- src/sys/kern/subr_workqueue.c:1.26	Mon Sep 15 10:43:29 2008
+++ src/sys/kern/subr_workqueue.c	Sat Apr  4 16:58:25 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_workqueue.c,v 1.26 2008/09/15 10:43:29 rmind Exp $	*/
+/*	$NetBSD: subr_workqueue.c,v 1.26.4.1 2009/04/04 16:58:25 snj Exp $	*/
 
 /*-
  * Copyright (c)2002, 2005, 2006, 2007 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.26 2008/09/15 10:43:29 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_workqueue.c,v 1.26.4.1 2009/04/04 16:58:25 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -40,6 +40,8 @@
 #include <sys/condvar.h>
 #include <sys/queue.h>
 
+#include <uvm/uvm_extern.h>
+
 typedef struct work_impl {
 	SIMPLEQ_ENTRY(work_impl) wk_entry;
 } work_impl_t;
@@ -203,12 +205,15 @@
 workqueue_finiqueue(struct workqueue *wq, struct workqueue_queue *q)
 {
 	struct workqueue_exitargs wqe;
+	lwp_t *l;
 
 	KASSERT(wq->wq_func == workqueue_exit);
 
 	wqe.wqe_q = q;
 	KASSERT(SIMPLEQ_EMPTY(&q->q_queue));
 	KASSERT(q->q_worker != NULL);
+	l = curlwp;
+	uvm_lwp_hold(l);	
 	mutex_enter(&q->q_mutex);
 	SIMPLEQ_INSERT_TAIL(&q->q_queue, &wqe.wqe_wk, wk_entry);
 	cv_signal(&q->q_cv);
@@ -216,6 +221,7 @@
 		cv_wait(&q->q_cv, &q->q_mutex);
 	}
 	mutex_exit(&q->q_mutex);
+	uvm_lwp_rele(l);	
 	mutex_destroy(&q->q_mutex);
 	cv_destroy(&q->q_cv);
 }

Reply via email to