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>

index | next in thread | raw e-mail

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'


home | help

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