Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jun 2005 17:31:46 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 78769 for review
Message-ID:  <200506211731.j5LHVkIH058682@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=78769

Change 78769 by jhb@jhb_slimer on 2005/06/21 17:31:03

	Revert some changes that aren't really needed and are just cluttering
	up this branch.

Affected files ...

.. //depot/projects/smpng/sys/i386/i386/machdep.c#95 edit
.. //depot/projects/smpng/sys/i386/i386/sys_machdep.c#42 edit
.. //depot/projects/smpng/sys/i386/i386/vm_machdep.c#67 edit
.. //depot/projects/smpng/sys/notes#46 edit

Differences ...

==== //depot/projects/smpng/sys/i386/i386/machdep.c#95 (text+ko) ====

@@ -1156,11 +1156,8 @@
 	pcb->pcb_gs = _udatasel;
 	load_gs(_udatasel);
 
-	mtx_lock_spin(&sched_lock);
 	if (td->td_proc->p_md.md_ldt)
 		user_ldt_free(td);
-	else
-		mtx_unlock_spin(&sched_lock);
   
 	bzero((char *)regs, sizeof(struct trapframe));
 	regs->tf_eip = entry;

==== //depot/projects/smpng/sys/i386/i386/sys_machdep.c#42 (text+ko) ====

@@ -384,7 +384,7 @@
 #endif
 
 /*
- * Must be called with sched_lock held but not recursed.
+ * Must be called with either sched_lock free or held but not recursed.
  * If it does not return NULL, it will return with it owned.
  */
 struct proc_ldt *
@@ -392,8 +392,9 @@
 {
 	struct proc_ldt *pldt, *new_ldt;
 
-	mtx_assert(&sched_lock, MA_OWNED | MA_NOTRECURSED);
-	mtx_unlock_spin(&sched_lock);
+	if (mtx_owned(&sched_lock))
+		mtx_unlock_spin(&sched_lock);
+	mtx_assert(&sched_lock, MA_NOTOWNED);
 	MALLOC(new_ldt, struct proc_ldt *, sizeof(struct proc_ldt),
 		M_SUBPROC, M_WAITOK);
 
@@ -424,7 +425,7 @@
 }
 
 /*
- * Must be called with sched_lock held but not recursed.
+ * Must be called either with sched_lock free or held but not recursed.
  * If md_ldt is not NULL, it will return with sched_lock released.
  */
 void
@@ -436,6 +437,8 @@
 	if (pldt == NULL)
 		return;
 
+	if (!mtx_owned(&sched_lock))
+		mtx_lock_spin(&sched_lock);
 	mtx_assert(&sched_lock, MA_OWNED | MA_NOTRECURSED);
 	if (td == PCPU_GET(curthread)) {
 		lldt(_default_ldt);
@@ -695,8 +698,7 @@
 	if (len < NLDT + 1)
 		len = NLDT + 1;
 
-	/* allocate user ldt */
-	mtx_lock_spin(&sched_lock);
+	/* Allocate a user ldt. */
 	pldt = mdp->md_ldt;
 	if (!pldt || len > pldt->ldt_len) {
 		struct proc_ldt *new_ldt;
@@ -705,6 +707,8 @@
 		if (new_ldt == NULL)
 			return (ENOMEM);
 		pldt = mdp->md_ldt;
+
+		/* sched_lock was acquired by user_ldt_alloc. */
 		if (pldt) {
 			if (new_ldt->ldt_len > pldt->ldt_len) {
 				old_ldt_base = pldt->ldt_base;
@@ -720,7 +724,7 @@
 			} else {
 				/*
 				 * If other threads already did the work,
-				 * do nothing
+				 * do nothing.
 				 */
 				mtx_unlock_spin(&sched_lock);
 				kmem_free(kernel_map,
@@ -741,7 +745,6 @@
 		set_user_ldt(mdp);
 		mtx_unlock_spin(&sched_lock);
 #endif
-	} else
-		mtx_unlock_spin(&sched_lock);
+	}
 	return (0);
 }

==== //depot/projects/smpng/sys/i386/i386/vm_machdep.c#67 (text+ko) ====

@@ -155,7 +155,6 @@
 			struct mdproc *mdp1 = &p1->p_md;
 			struct proc_ldt *pldt;
 
-			mtx_lock_spin(&sched_lock);
 			pldt = mdp1->md_ldt;
 			if (pldt && pldt->ldt_refcnt > 1) {
 				pldt = user_ldt_alloc(mdp1, pldt->ldt_len);
@@ -164,8 +163,7 @@
 				mdp1->md_ldt = pldt;
 				set_user_ldt(mdp1);
 				user_ldt_free(td1);
-			} else
-				mtx_unlock_spin(&sched_lock);
+			}
 		}
 		return;
 	}
@@ -300,7 +298,6 @@
 cpu_exit(struct thread *td)
 {
 
-	mtx_lock_spin(&sched_lock);
 	if (td->td_proc->p_md.md_ldt) {
 
 		/* Reset pc->pcb_gs and %gs before invalidating it. */
@@ -308,15 +305,13 @@
 		load_gs(_udatasel);
 
 		user_ldt_free(td);
-	} else
-		mtx_unlock_spin(&sched_lock);
+	}
 }
 
 void
 cpu_thread_exit(struct thread *td)
 {
 
-
 #ifdef DEV_NPX
 	npxexit(td);
 #endif

==== //depot/projects/smpng/sys/notes#46 (text+ko) ====

@@ -3,10 +3,6 @@
 
 - Consolidate linux module version and dependencies into MI location.
   - Untested
-- Redo sched_lock locking for i386 ldt to not use mtx_owned().  This is
-  the only user of mtx_owned() on spin locks and keeps us from optimizing
-  spin locks on UP kernels to only do critical sections.
-  - Untested
 - Fixup asm constraints to use '+' rather than declaring a variable in both
   the input and output sections with '0', etc. in both the at386 and pc98
   bus headers.  Also removes bogus 'cc' clobbers.  gcc already clobbers 'cc'



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506211731.j5LHVkIH058682>