From owner-p4-projects@FreeBSD.ORG Fri Jul 2 04:20:20 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id CF75716A4D0; Fri, 2 Jul 2004 04:20:19 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 93FC616A4CE for ; Fri, 2 Jul 2004 04:20:19 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8B67C43D39 for ; Fri, 2 Jul 2004 04:20:19 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id i624E7Hv008247 for ; Fri, 2 Jul 2004 04:14:07 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id i624E7qW008244 for perforce@freebsd.org; Fri, 2 Jul 2004 04:14:07 GMT (envelope-from jhb@freebsd.org) Date: Fri, 2 Jul 2004 04:14:07 GMT Message-Id: <200407020414.i624E7qW008244@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Subject: PERFORCE change 56266 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Jul 2004 04:20:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=56266 Change 56266 by jhb@jhb_slimer on 2004/07/02 04:13:06 IFC @56264. Affected files ... .. //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#22 integrate .. //depot/projects/smpng/sys/kern/kern_clock.c#35 integrate .. //depot/projects/smpng/sys/kern/subr_prof.c#25 integrate .. //depot/projects/smpng/sys/kern/subr_trap.c#65 integrate .. //depot/projects/smpng/sys/pci/agp_via.c#11 integrate .. //depot/projects/smpng/sys/sys/resourcevar.h#19 integrate .. //depot/projects/smpng/sys/vm/vm_glue.c#45 integrate Differences ... ==== //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#22 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.44 2004/03/13 15:42:59 scottl Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.45 2004/07/02 03:47:28 scottl Exp $"); #include #include @@ -66,6 +66,7 @@ int map_count; bus_dma_lock_t *lockfunc; void *lockfuncarg; + bus_dma_segment_t *segments; }; struct bounce_page { @@ -221,7 +222,9 @@ newtag->lockfunc = dflt_lock; newtag->lockfuncarg = NULL; } - + + newtag->segments = NULL; + /* Take into account any restrictions imposed by our parent tag */ if (parent != NULL) { newtag->lowaddr = MIN(parent->lowaddr, newtag->lowaddr); @@ -290,6 +293,8 @@ parent = dmat->parent; atomic_subtract_int(&dmat->ref_count, 1); if (dmat->ref_count == 0) { + if (dmat->segments != NULL) + free(dmat->segments, M_DEVBUF); free(dmat, M_DEVBUF); /* * Last reference count, so @@ -332,6 +337,14 @@ return (0); } + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) + return (ENOMEM); + } + if (dmat->lowaddr < ptoa(Maxmem)) { /* Must bounce */ int maxpages; @@ -425,6 +438,14 @@ /* If we succeed, no mapping/bouncing will be required */ *mapp = &nobounce_dmamap; + if (dmat->segments == NULL) { + dmat->segments = (bus_dma_segment_t *)malloc( + sizeof(bus_dma_segment_t) * dmat->nsegments, M_DEVBUF, + M_NOWAIT); + if (dmat->segments == NULL) + return (ENOMEM); + } + if ((dmat->maxsize <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) { *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); } else { @@ -477,11 +498,6 @@ { vm_offset_t vaddr; vm_offset_t paddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif bus_dma_segment_t *sg; int seg; int error; @@ -496,16 +512,16 @@ * of the bus address space. */ vaddr = trunc_page((vm_offset_t) buf); - dm_segments[0].ds_addr = + dmat->segments[0].ds_addr = map->busaddress + (vm_offset_t) buf - vaddr; - dm_segments[0].ds_len = buflen; + dmat->segments[0].ds_len = buflen; buflen = round_page((vm_offset_t) buf + buflen) - vaddr; sgmap_load_region(chipset.sgmap, map->busaddress, vaddr, buflen); map->buflen = buflen; - (*callback)(callback_arg, dm_segments, 1, error); + (*callback)(callback_arg, dmat->segments, 1, error); return (0); } @@ -560,7 +576,7 @@ } vaddr = (vm_offset_t)buf; - sg = &dm_segments[0]; + sg = &dmat->segments[0]; seg = 1; sg->ds_len = 0; @@ -604,7 +620,7 @@ error = EFBIG; } - (*callback)(callback_arg, dm_segments, seg, error); + (*callback)(callback_arg, dmat->segments, seg, error); return (0); } @@ -617,7 +633,6 @@ */ static int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, - bus_dma_segment_t segs[], void *buf, bus_size_t buflen, struct thread *td, int flags, @@ -625,12 +640,15 @@ int *segp, int first) { + bus_dma_segment_t *segs; bus_size_t sgsize; bus_addr_t curaddr, lastaddr, baddr, bmask; vm_offset_t vaddr = (vm_offset_t)buf; int seg; pmap_t pmap; + segs = dmat->segments; + if (td != NULL) pmap = vmspace_pmap(td->td_proc->p_vmspace); else @@ -709,11 +727,6 @@ bus_dmamap_callback2_t *callback, void *callback_arg, int flags) { -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif int nsegs, error; KASSERT(dmat->lowaddr >= ptoa(Maxmem) || map != NULL, @@ -730,7 +743,6 @@ for (m = m0; m != NULL && error == 0; m = m->m_next) { if (m->m_len > 0) { error = _bus_dmamap_load_buffer(dmat, - dm_segments, m->m_data, m->m_len, NULL, flags, &lastaddr, &nsegs, first); @@ -743,9 +755,9 @@ if (error) { /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dm_segments, 0, 0, error); + (*callback)(callback_arg, dmat->segments, 0, 0, error); } else { - (*callback)(callback_arg, dm_segments, + (*callback)(callback_arg, dmat->segments, nsegs+1, m0->m_pkthdr.len, error); } return (error); @@ -761,11 +773,6 @@ int flags) { bus_addr_t lastaddr; -#ifdef __GNUC__ - bus_dma_segment_t dm_segments[dmat->nsegments]; -#else - bus_dma_segment_t dm_segments[BUS_DMAMAP_NSEGS]; -#endif int nsegs, error, first, i; bus_size_t resid; struct iovec *iov; @@ -796,9 +803,7 @@ caddr_t addr = (caddr_t) iov[i].iov_base; if (minlen > 0) { - error = _bus_dmamap_load_buffer(dmat, - dm_segments, - addr, minlen, + error = _bus_dmamap_load_buffer(dmat, addr, minlen, td, flags, &lastaddr, &nsegs, first); first = 0; @@ -808,9 +813,9 @@ if (error) { /* force "no valid mappings" in callback */ - (*callback)(callback_arg, dm_segments, 0, 0, error); + (*callback)(callback_arg, dmat->segments, 0, 0, error); } else { - (*callback)(callback_arg, dm_segments, + (*callback)(callback_arg, dmat->segments, nsegs+1, uio->uio_resid, error); } return (error); ==== //depot/projects/smpng/sys/kern/kern_clock.c#35 (text+ko) ==== @@ -35,7 +35,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/kern_clock.c,v 1.170 2004/06/16 00:26:29 julian Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_clock.c,v 1.171 2004/07/02 03:48:09 jhb Exp $"); #include "opt_ntp.h" #include "opt_ddb.h" @@ -374,7 +374,6 @@ statclock(frame) register struct clockframe *frame; { - struct pstats *pstats; struct rusage *ru; struct vmspace *vm; struct thread *td; @@ -427,16 +426,16 @@ sched_clock(td); /* Update resource usage integrals and maximums. */ - if ((pstats = p->p_stats) != NULL && - (ru = &pstats->p_ru) != NULL && - (vm = p->p_vmspace) != NULL) { - ru->ru_ixrss += pgtok(vm->vm_tsize); - ru->ru_idrss += pgtok(vm->vm_dsize); - ru->ru_isrss += pgtok(vm->vm_ssize); - rss = pgtok(vmspace_resident_count(vm)); - if (ru->ru_maxrss < rss) - ru->ru_maxrss = rss; - } + MPASS(p->p_stats != NULL); + MPASS(p->p_vmspace != NULL); + vm = p->p_vmspace; + ru = &p->p_stats->p_ru; + ru->ru_ixrss += pgtok(vm->vm_tsize); + ru->ru_idrss += pgtok(vm->vm_dsize); + ru->ru_isrss += pgtok(vm->vm_ssize); + rss = pgtok(vmspace_resident_count(vm)); + if (ru->ru_maxrss < rss) + ru->ru_maxrss = rss; mtx_unlock_spin_flags(&sched_lock, MTX_QUIET); } ==== //depot/projects/smpng/sys/kern/subr_prof.c#25 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/subr_prof.c,v 1.72 2004/05/29 01:18:14 tjr Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/subr_prof.c,v 1.73 2004/07/02 03:50:47 jhb Exp $"); #include #include @@ -419,17 +419,19 @@ p = td->td_proc; if (uap->scale == 0) { - PROC_LOCK(td->td_proc); - stopprofclock(td->td_proc); - PROC_UNLOCK(td->td_proc); + PROC_LOCK(p); + stopprofclock(p); + PROC_UNLOCK(p); return (0); } + PROC_LOCK(p); upp = &td->td_proc->p_stats->p_prof; + mtx_lock_spin(&sched_lock); upp->pr_off = uap->offset; upp->pr_scale = uap->scale; upp->pr_base = uap->samples; upp->pr_size = uap->size; - PROC_LOCK(p); + mtx_unlock_spin(&sched_lock); startprofclock(p); PROC_UNLOCK(p); @@ -469,16 +471,20 @@ if (ticks == 0) return; prof = &td->td_proc->p_stats->p_prof; + mtx_lock_spin(&sched_lock); if (pc < prof->pr_off || - (i = PC_TO_INDEX(pc, prof)) >= prof->pr_size) + (i = PC_TO_INDEX(pc, prof)) >= prof->pr_size) { + mtx_unlock_spin(&sched_lock); return; /* out of range; ignore */ + } addr = prof->pr_base + i; + mtx_unlock_spin(&sched_lock); if ((v = fuswintr(addr)) == -1 || suswintr(addr, v + ticks) == -1) { - mtx_lock_spin(&sched_lock); prof->pr_addr = pc; prof->pr_ticks = ticks; - td->td_flags |= TDF_OWEUPC | TDF_ASTPENDING ; + mtx_lock_spin(&sched_lock); + td->td_flags |= TDF_OWEUPC | TDF_ASTPENDING; mtx_unlock_spin(&sched_lock); } } @@ -506,7 +512,6 @@ return; } p->p_profthreads++; - PROC_UNLOCK(p); prof = &p->p_stats->p_prof; if (pc < prof->pr_off || (i = PC_TO_INDEX(pc, prof)) >= prof->pr_size) { @@ -514,15 +519,18 @@ } addr = prof->pr_base + i; + PROC_UNLOCK(p); if (copyin(addr, &v, sizeof(v)) == 0) { v += ticks; - if (copyout(&v, addr, sizeof(v)) == 0) + if (copyout(&v, addr, sizeof(v)) == 0) { + PROC_LOCK(p); goto out; + } } stop = 1; + PROC_LOCK(p); out: - PROC_LOCK(p); if (--p->p_profthreads == 0) { if (p->p_flag & P_STOPPROF) { wakeup(&p->p_profthreads); ==== //depot/projects/smpng/sys/kern/subr_trap.c#65 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/subr_trap.c,v 1.266 2004/03/31 08:20:44 julian Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/subr_trap.c,v 1.267 2004/07/02 03:50:47 jhb Exp $"); #include "opt_ktrace.h" #include "opt_mac.h" @@ -142,7 +142,7 @@ struct proc *p; struct ksegrp *kg; struct rlimit rlim; - u_int prticks, sticks; + u_int sticks; int sflag; int flags; int sig; @@ -180,11 +180,6 @@ td->td_flags &= ~(TDF_ASTPENDING | TDF_NEEDSIGCHK | TDF_NEEDRESCHED | TDF_OWEUPC | TDF_INTERRUPT); cnt.v_soft++; - prticks = 0; - if (flags & TDF_OWEUPC && p->p_flag & P_PROFIL) { - prticks = p->p_stats->p_prof.pr_ticks; - p->p_stats->p_prof.pr_ticks = 0; - } mtx_unlock_spin(&sched_lock); /* * XXXKSE While the fact that we owe a user profiling @@ -196,8 +191,11 @@ if (td->td_ucred != p->p_ucred) cred_update_thread(td); - if (flags & TDF_OWEUPC && p->p_flag & P_PROFIL) - addupc_task(td, p->p_stats->p_prof.pr_addr, prticks); + if (flags & TDF_OWEUPC && p->p_flag & P_PROFIL) { + addupc_task(td, p->p_stats->p_prof.pr_addr, + p->p_stats->p_prof.pr_ticks); + p->p_stats->p_prof.pr_ticks = 0; + } if (sflag & PS_ALRMPEND) { PROC_LOCK(p); psignal(p, SIGVTALRM); ==== //depot/projects/smpng/sys/pci/agp_via.c#11 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/pci/agp_via.c,v 1.15 2004/05/30 20:00:40 phk Exp $"); +__FBSDID("$FreeBSD: src/sys/pci/agp_via.c,v 1.16 2004/07/02 03:39:33 jhb Exp $"); #include "opt_bus.h" @@ -89,6 +89,8 @@ return ("VIA 82C691 (Apollo Pro) host to PCI bridge"); case 0x31881106: return ("VIA 8385 host to PCI bridge"); + case 0x31891106: + return ("VIA 8377 (Apollo KT400/KT400A/KT600) host to PCI bridge"); }; if (pci_get_vendor(dev) == 0x1106) @@ -123,6 +125,7 @@ switch (pci_get_devid(dev)) { case 0x31881106: + case 0x31891106: sc->regs = via_v3_regs; break; default: ==== //depot/projects/smpng/sys/sys/resourcevar.h#19 (text+ko) ==== @@ -27,7 +27,7 @@ * SUCH DAMAGE. * * @(#)resourcevar.h 8.4 (Berkeley) 1/9/95 - * $FreeBSD: src/sys/sys/resourcevar.h,v 1.41 2004/04/07 04:19:49 imp Exp $ + * $FreeBSD: src/sys/sys/resourcevar.h,v 1.42 2004/07/02 03:50:48 jhb Exp $ */ #ifndef _SYS_RESOURCEVAR_H_ @@ -43,25 +43,31 @@ /* * Kernel per-process accounting / statistics * (not necessarily resident except when running). + * + * Locking key: + * b - created at fork, never changes + * c - locked by proc mtx + * j - locked by sched_lock mtx + * k - only accessed by curthread */ struct pstats { #define pstat_startzero p_ru - struct rusage p_ru; /* stats for this proc */ - struct rusage p_cru; /* sum of stats for reaped children */ - struct itimerval p_timer[3]; /* virtual-time timers */ + struct rusage p_ru; /* Stats for this process. */ + struct rusage p_cru; /* Stats for reaped children. */ + struct itimerval p_timer[3]; /* (j) Virtual-time timers. */ #define pstat_endzero pstat_startcopy #define pstat_startcopy p_prof - struct uprof { /* profile arguments */ - caddr_t pr_base; /* buffer base */ - u_long pr_size; /* buffer size */ - u_long pr_off; /* pc offset */ - u_long pr_scale; /* pc scaling */ - u_long pr_addr; /* temp storage for addr until AST */ - u_int pr_ticks; /* temp storage for ticks until AST */ + struct uprof { /* Profile arguments. */ + caddr_t pr_base; /* (c + j) Buffer base. */ + u_long pr_size; /* (c + j) Buffer size. */ + u_long pr_off; /* (c + j) PC offset. */ + u_long pr_scale; /* (c + j) PC scaling. */ + u_long pr_addr; /* (k) Temporary addr until AST. */ + u_int pr_ticks; /* (k) Temporary ticks until AST. */ } p_prof; #define pstat_endcopy p_start - struct timeval p_start; /* starting time */ + struct timeval p_start; /* (b) Starting time. */ }; #ifdef _KERNEL ==== //depot/projects/smpng/sys/vm/vm_glue.c#45 (text+ko) ==== @@ -57,7 +57,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/vm/vm_glue.c,v 1.199 2004/06/27 01:58:12 das Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_glue.c,v 1.200 2004/07/02 03:45:07 jhb Exp $"); #include "opt_vm.h" #include "opt_kstack_pages.h" @@ -618,7 +618,6 @@ int flags; { struct proc *p1 = td->td_proc; - struct user *up; GIANT_REQUIRED; @@ -652,22 +651,18 @@ shmfork(p1, p2); } - /* XXXKSE this is unsatisfactory but should be adequate */ - up = p2->p_uarea; - MPASS(p2->p_sigacts != NULL); - /* - * p_stats currently points at fields in the user struct - * but not at &u, instead at p_addr. Copy parts of - * p_stats; zero the rest of p_stats (statistics). + * p_stats currently points at fields in the user struct. + * Copy parts of p_stats; zero the rest of p_stats (statistics). */ - p2->p_stats = &up->u_stats; - bzero(&up->u_stats.pstat_startzero, - (unsigned) ((caddr_t) &up->u_stats.pstat_endzero - - (caddr_t) &up->u_stats.pstat_startzero)); - bcopy(&p1->p_stats->pstat_startcopy, &up->u_stats.pstat_startcopy, - ((caddr_t) &up->u_stats.pstat_endcopy - - (caddr_t) &up->u_stats.pstat_startcopy)); +#define RANGEOF(type, start, end) (offsetof(type, end) - offsetof(type, start)) + + p2->p_stats = &p2->p_uarea->u_stats; + bzero(&p2->p_stats->pstat_startzero, + (unsigned) RANGEOF(struct pstats, pstat_startzero, pstat_endzero)); + bcopy(&p1->p_stats->pstat_startcopy, &p2->p_stats->pstat_startcopy, + (unsigned) RANGEOF(struct pstats, pstat_startcopy, pstat_endcopy)); +#undef RANGEOF /* * cpu_fork will copy and update the pcb, set up the kernel stack,