Date: Mon, 3 Apr 2006 09:10:12 GMT From: Kip Macy <kmacy@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 94531 for review Message-ID: <200604030910.k339ACRj074009@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=94531 Change 94531 by kmacy@kmacy_storage:sun4v_work on 2006/04/03 09:10:02 keep track of what cpus this pmap is running on and which cpus may have entries in the TLB, we really only need to send shootdowns to one of the threads on a core so this can definitely be optimized further Affected files ... .. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#16 edit Differences ... ==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/swtch.S#16 (text+ko) ==== @@ -54,9 +54,13 @@ */ ENTRY(cpu_switch) save %sp, -CCFSZ, %sp - GET_PCB(PCB_REG) + ldx [PCPU(CURPCB)], PCB_REG + + MAGIC_TRAP_ON + MAGIC_TRAP_OFF + mov %i1, %i0 - + /* * If the current thread was using floating point in the kernel, save * its context. The userland floating point context has already been @@ -113,19 +117,15 @@ stx %g3, [%g1 + KTR_PARM3] 9: #endif + wrpr %g0, PSTATE_NORMAL, %pstate ldx [%i0 + TD_PCB], %i1 - + stx %i0, [PCPU(CURTHREAD)] stx %i1, [PCPU(CURPCB)] - wrpr %g0, PSTATE_NORMAL, %pstate mov %i1, PCB_REG ! load in new PCB wrpr %g0, PSTATE_KERNEL, %pstate - /* - * End of saving old context - * Start of loading new context - */ ldx [PCB_REG + PCB_SP], %fp ldx [PCB_REG + PCB_PC], %i7 sub %fp, CCFSZ, %sp @@ -155,11 +155,38 @@ be,a,pn %xcc, 5f nop - ldx [%i2 + PM_CONTEXT], %l5 ! new context == kernel? + ldx [%i2 + PM_CONTEXT], %l5 ! new context + ldx [%l2 + PM_CONTEXT], %l3 ! old context cmp %g0, %l5 - be,a,pn %xcc, 5f - nop + be,a,pn %xcc, 5f ! new context == kernel? + lduw [PCPU(CPUMASK)], %l4 + + brz %l3, 10f ! old context == kernel? + nop + /* + * Mark the old pmap as no longer active on this CPU + */ + lduw [%l2 + PM_ACTIVE], %l3 + andn %l3, %l4, %l3 + stw %l3, [%l2 + PM_ACTIVE] + + /* + * Mark the new pmap as active on this CPU + * XXX need to CAS + */ +10: lduw [%i2 + PM_ACTIVE], %l3 + or %l3, %l4, %l3 + stw %l3, [%i2 + PM_ACTIVE] + + /* + * Mark the new pmap as possibly having TLB entries on this CPU + * XXX need to CAS + */ + lduw [%i2 + PM_TLBACTIVE], %l3 + or %l3, %l4, %l3 + stw %l3, [%i2 + PM_TLBACTIVE] + mov SCRATCH_REG_HASH_USER, %l6 mov SCRATCH_REG_TSB_USER, %l7 ldx [%i2 + PM_HASHSCRATCH], %l3 @@ -189,6 +216,8 @@ */ SET_MMU_CONTEXT(%l6, %l5) + + /* * Done. Return and load the new process's window from the stack. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200604030910.k339ACRj074009>