changeset 9022:4eecb577dc66

6816281 unplugging USB keyboard produces panic in progressbar_key_abort_thread
author Jan Setje-Eilers <Jan.Setje-Eilers@Sun.COM>
date Thu, 12 Mar 2009 16:22:07 -0700
parents 3b15214a2c50
children 75687de6acb4
files usr/src/uts/common/io/kbtrans/kbtrans_streams.c usr/src/uts/common/io/kbtrans/kbtrans_streams.h
diffstat 2 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/kbtrans/kbtrans_streams.c	Thu Mar 12 15:41:34 2009 -0700
+++ b/usr/src/uts/common/io/kbtrans/kbtrans_streams.c	Thu Mar 12 16:22:07 2009 -0700
@@ -199,7 +199,6 @@
 	ldi_ident_t li;
 	extern void progressbar_key_abort(ldi_ident_t);
 
-
 	if (ldi_ident_from_stream(upper->kbtrans_streams_readq, &li) != 0) {
 		cmn_err(CE_NOTE, "!ldi_ident_from_stream failed");
 	} else {
@@ -213,7 +212,6 @@
 		ldi_ident_release(li);
 	}
 
-
 	thread_exit();
 }
 
@@ -235,6 +233,7 @@
 	struct kbtrans *upper;
 	struct kbtrans_lower *lower;
 	int err;
+	kthread_t *tid;
 
 	/*
 	 * Default to relatively generic tables.
@@ -347,8 +346,9 @@
 	/* this counts on no keyboards being above ipl 12 */
 	mutex_init(&upper->progressbar_key_abort_lock, NULL, MUTEX_SPIN,
 	    (void *)ipltospl(12));
-	(void) thread_create(NULL, 0, progressbar_key_abort_thread,
-	    upper, 0, &p0, TS_RUN, minclsyspri);
+	tid = thread_create(NULL, 0, progressbar_key_abort_thread, upper,
+	    0, &p0, TS_RUN, minclsyspri);
+	upper->progressbar_key_abort_t_did = tid->t_did;
 
 	DPRINTF(PRINT_L1, PRINT_MASK_OPEN, (upper, "kbtrans_streams_init "
 	    "exiting"));
@@ -386,8 +386,11 @@
 	if (upper->progressbar_key_abort_flag == 0) {
 		upper->progressbar_key_abort_flag = 2;
 		cv_signal(&upper->progressbar_key_abort_cv);
+		mutex_exit(&upper->progressbar_key_abort_lock);
+		thread_join(upper->progressbar_key_abort_t_did);
+	} else {
+		mutex_exit(&upper->progressbar_key_abort_lock);
 	}
-	mutex_exit(&upper->progressbar_key_abort_lock);
 	cv_destroy(&upper->progressbar_key_abort_cv);
 	mutex_destroy(&upper->progressbar_key_abort_lock);
 
--- a/usr/src/uts/common/io/kbtrans/kbtrans_streams.h	Thu Mar 12 15:41:34 2009 -0700
+++ b/usr/src/uts/common/io/kbtrans/kbtrans_streams.h	Thu Mar 12 16:22:07 2009 -0700
@@ -142,6 +142,7 @@
 	kcondvar_t progressbar_key_abort_cv;
 	kmutex_t progressbar_key_abort_lock;
 	int progressbar_key_abort_flag;
+	kt_did_t progressbar_key_abort_t_did;
 };
 
 #ifdef __cplusplus