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>