Date: Thu, 13 Mar 2003 11:02:25 -0800 (PST) From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 26849 for review Message-ID: <200303131902.h2DJ2PfP078112@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=26849 Change 26849 by jhb@jhb_laptop on 2003/03/13 11:01:52 IFC @26848. Loop jhb_ktrace changes back in. Affected files ... .. //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#10 integrate .. //depot/projects/smpng/sys/dev/ata/atapi-all.c#18 integrate .. //depot/projects/smpng/sys/dev/ata/atapi-cd.c#32 integrate .. //depot/projects/smpng/sys/dev/puc/pucdata.c#9 integrate .. //depot/projects/smpng/sys/dev/sio/sio.c#25 integrate .. //depot/projects/smpng/sys/fs/specfs/spec_vnops.c#23 integrate .. //depot/projects/smpng/sys/gnu/ext2fs/fs.h#5 integrate .. //depot/projects/smpng/sys/i386/i386/busdma_machdep.c#10 integrate .. //depot/projects/smpng/sys/ia64/ia64/busdma_machdep.c#10 integrate .. //depot/projects/smpng/sys/kern/kern_exec.c#53 integrate .. //depot/projects/smpng/sys/kern/kern_exit.c#56 integrate .. //depot/projects/smpng/sys/kern/kern_fork.c#52 integrate .. //depot/projects/smpng/sys/kern/kern_ktrace.c#29 integrate .. //depot/projects/smpng/sys/kern/kern_physio.c#7 integrate .. //depot/projects/smpng/sys/kern/kern_proc.c#46 integrate .. //depot/projects/smpng/sys/kern/kern_resource.c#32 integrate .. //depot/projects/smpng/sys/kern/subr_bus.c#20 integrate .. //depot/projects/smpng/sys/kern/uipc_mbuf.c#14 integrate .. //depot/projects/smpng/sys/kern/vfs_bio.c#37 integrate .. //depot/projects/smpng/sys/kern/vfs_cluster.c#19 integrate .. //depot/projects/smpng/sys/kern/vfs_default.c#17 integrate .. //depot/projects/smpng/sys/kern/vfs_subr.c#44 integrate .. //depot/projects/smpng/sys/net/if_atm.h#3 integrate .. //depot/projects/smpng/sys/net/if_atmsubr.c#7 integrate .. //depot/projects/smpng/sys/net/if_vlan_var.h#7 integrate .. //depot/projects/smpng/sys/netinet/tcp_input.c#30 integrate .. //depot/projects/smpng/sys/nfsclient/nfs_vnops.c#23 integrate .. //depot/projects/smpng/sys/nfsserver/nfs_serv.c#26 integrate .. //depot/projects/smpng/sys/pci/agp_sis.c#4 integrate .. //depot/projects/smpng/sys/powerpc/powerpc/busdma_machdep.c#5 integrate .. //depot/projects/smpng/sys/sparc64/sparc64/bus_machdep.c#11 integrate .. //depot/projects/smpng/sys/sys/buf.h#18 integrate .. //depot/projects/smpng/sys/sys/ktrace.h#7 integrate .. //depot/projects/smpng/sys/sys/proc.h#73 integrate .. //depot/projects/smpng/sys/ufs/ffs/ffs_vnops.c#14 integrate .. //depot/projects/smpng/sys/vm/vm_map.c#30 integrate .. //depot/projects/smpng/sys/vm/vm_map.h#17 integrate .. //depot/projects/smpng/sys/vm/vm_pageout.c#24 integrate Differences ... ==== //depot/projects/smpng/sys/alpha/alpha/busdma_machdep.c#10 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.30 2003/02/26 02:16:05 mux Exp $ + * $FreeBSD: src/sys/alpha/alpha/busdma_machdep.c,v 1.31 2003/03/13 17:17:30 mux Exp $ */ #include <sys/param.h> @@ -367,10 +367,12 @@ * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. */ + mtx_lock(&Giant); *vaddr = contigmalloc(size, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); + mtx_unlock(&Giant); } if (*vaddr == NULL) return (ENOMEM); @@ -400,8 +402,11 @@ panic("bus_dmamem_free: Invalid map freed\n"); if ((size <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) free(vaddr, M_DEVBUF); - else + else { + mtx_lock(&Giant); contigfree(vaddr, size, M_DEVBUF); + mtx_unlock(&Giant); + } } void @@ -842,11 +847,13 @@ if (bpage == NULL) break; + mtx_lock(&Giant); bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0ul, dmat->lowaddr, PAGE_SIZE, dmat->boundary); + mtx_unlock(&Giant); if (bpage->vaddr == NULL) { free(bpage, M_DEVBUF); break; ==== //depot/projects/smpng/sys/dev/ata/atapi-all.c#18 (text+ko) ==== @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/ata/atapi-all.c,v 1.98 2003/03/03 11:15:32 sos Exp $ + * $FreeBSD: src/sys/dev/ata/atapi-all.c,v 1.99 2003/03/13 09:04:55 sos Exp $ */ #include "opt_ata.h" @@ -148,7 +148,8 @@ } free(request, M_ATAPI); } - atadev->channel->dma->free(atadev); + if (atadev->channel->dma) + atadev->channel->dma->free(atadev); free(atadev->result, M_ATAPI); atadev->driver = NULL; atadev->flags = 0; ==== //depot/projects/smpng/sys/dev/ata/atapi-cd.c#32 (text+ko) ==== @@ -25,7 +25,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.133 2003/03/08 21:32:28 phk Exp $ + * $FreeBSD: src/sys/dev/ata/atapi-cd.c,v 1.135 2003/03/13 09:12:17 sos Exp $ */ #include "opt_ata.h" @@ -211,7 +211,6 @@ free(entry, M_ACD); } devstat_remove_entry(cdp->driver[subdev]->stats); - free(cdp->driver[subdev]->stats, M_ACD); ata_free_lun(&acd_lun_map, cdp->driver[subdev]->lun); free(cdp->driver[subdev], M_ACD); } @@ -228,7 +227,6 @@ destroy_dev(cdp->dev); EVENTHANDLER_DEREGISTER(dev_clone, cdp->clone_evh); devstat_remove_entry(cdp->stats); - free(cdp->stats, M_ACD); ata_free_name(atadev); ata_free_lun(&acd_lun_map, cdp->lun); free(cdp, M_ACD); @@ -506,11 +504,6 @@ if (!cdp) return ENXIO; - if (flags & FWRITE) { - if (count_dev(dev) > 1) - return EBUSY; - } - /* wait if drive is not finished loading the medium */ while (timeout--) { struct atapi_reqsense *sense = cdp->device->result; ==== //depot/projects/smpng/sys/dev/puc/pucdata.c#9 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/puc/pucdata.c,v 1.14 2002/12/30 19:45:30 sam Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/puc/pucdata.c,v 1.16 2003/03/12 17:56:03 sobomax Exp $"); /* * PCI "universal" communications card driver configuration data (used to @@ -1000,22 +1000,46 @@ { 0xb00c, 0x091c, 0, 0 }, { 0xffff, 0xffff, 0, 0 }, { - { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x60, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x68, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x70, COM_FREQ }, - { PUC_PORT_TYPE_COM, 0x10, 0x78, COM_FREQ }, + { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x60, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x68, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x70, COM_FREQ * 4 }, + { PUC_PORT_TYPE_COM, 0x10, 0x78, COM_FREQ * 4 }, + }, + }, + + { "IC Book Labs Dreadnought x16 Pro", + NULL, + { 0xb00c, 0x081c, 0, 0 }, + { 0xffff, 0xffff, 0, 0 }, + { + { PUC_PORT_TYPE_COM, 0x10, 0x00, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x08, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x10, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x18, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x20, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x28, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x30, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x38, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x40, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x48, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x50, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x58, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x60, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x68, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x70, COM_FREQ * 8 }, + { PUC_PORT_TYPE_COM, 0x10, 0x78, COM_FREQ * 8 }, }, }, ==== //depot/projects/smpng/sys/dev/sio/sio.c#25 (text+ko) ==== @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/sio/sio.c,v 1.390 2003/03/03 16:24:44 phk Exp $ + * $FreeBSD: src/sys/dev/sio/sio.c,v 1.391 2003/03/12 17:20:24 sobomax Exp $ * from: @(#)com.c 7.5 (Berkeley) 5/16/91 * from: i386/isa sio.c,v 1.234 */ @@ -730,7 +730,7 @@ /* EXTRA DELAY? */ failures[0] = sio_getreg(com, com_cfcr) - CFCR_8BITS; failures[1] = sio_getreg(com, com_ier) - IER_ETXRDY; - failures[2] = sio_getreg(com, com_mcr) - mcr_image; + failures[2] = (sio_getreg(com, com_mcr) & 0x7f) - mcr_image; DELAY(10000); /* Some internal modems need this time */ irqmap[1] = isa_irq_pending(); failures[4] = (sio_getreg(com, com_iir) & IIR_IMASK) - IIR_TXRDY; ==== //depot/projects/smpng/sys/fs/specfs/spec_vnops.c#23 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95 - * $FreeBSD: src/sys/fs/specfs/spec_vnops.c,v 1.198 2003/03/03 19:15:39 njl Exp $ + * $FreeBSD: src/sys/fs/specfs/spec_vnops.c,v 1.199 2003/03/13 07:31:45 jeff Exp $ */ #include <sys/param.h> @@ -123,8 +123,6 @@ return (VOCALL(spec_vnodeop_p, ap->a_desc->vdesc_offset, ap)); } -static void spec_getpages_iodone(struct buf *bp); - /* * Open a special file. */ @@ -689,15 +687,6 @@ return (ap->a_flags & F_FLOCK ? EOPNOTSUPP : EINVAL); } -static void -spec_getpages_iodone(bp) - struct buf *bp; -{ - - bp->b_flags |= B_DONE; - wakeup(bp); -} - static int spec_getpages(ap) struct vop_getpages_args *ap; @@ -755,7 +744,7 @@ /* Build a minimal buffer header. */ bp->b_iocmd = BIO_READ; - bp->b_iodone = spec_getpages_iodone; + bp->b_iodone = bdone; /* B_PHYS is not set, but it is nice to fill this in. */ KASSERT(bp->b_rcred == NOCRED, ("leaking read ucred")); @@ -778,11 +767,7 @@ spec_xstrategy(bp->b_vp, bp); s = splbio(); - - /* We definitely need to be at splbio here. */ - while ((bp->b_flags & B_DONE) == 0) - tsleep(bp, PVM, "spread", 0); - + bwait(bp, PVM, "spread"); splx(s); if ((bp->b_ioflags & BIO_ERROR) != 0) { ==== //depot/projects/smpng/sys/gnu/ext2fs/fs.h#5 (text+ko) ==== @@ -37,7 +37,7 @@ * SUCH DAMAGE. * * @(#)fs.h 8.7 (Berkeley) 4/19/94 - * $FreeBSD: src/sys/gnu/ext2fs/fs.h,v 1.12 2003/02/25 03:37:46 jeff Exp $ + * $FreeBSD: src/sys/gnu/ext2fs/fs.h,v 1.13 2003/03/13 07:07:16 jeff Exp $ */ /* @@ -168,9 +168,9 @@ long flags; \ int s; \ s = splbio(); \ + BUF_LOCK(bp, LK_EXCLUSIVE, NULL); \ flags = (bp)->b_flags; \ (bp)->b_flags &= ~(B_DIRTY | B_LOCKED); \ - BUF_LOCK(bp, LK_EXCLUSIVE, NULL); \ bremfree(bp); \ splx(s); \ if (flags & B_DIRTY) \ ==== //depot/projects/smpng/sys/i386/i386/busdma_machdep.c#10 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.34 2003/02/26 02:16:05 mux Exp $ + * $FreeBSD: src/sys/i386/i386/busdma_machdep.c,v 1.35 2003/03/13 17:17:05 mux Exp $ */ #include <sys/param.h> @@ -348,10 +348,12 @@ * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. */ + mtx_lock(&Giant); *vaddr = contigmalloc(size, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); + mtx_unlock(&Giant); } if (*vaddr == NULL) return (ENOMEM); @@ -381,8 +383,11 @@ panic("bus_dmamem_free: Invalid map freed\n"); if ((size <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) free(vaddr, M_DEVBUF); - else + else { + mtx_lock(&Giant); contigfree(vaddr, size, M_DEVBUF); + mtx_unlock(&Giant); + } } void @@ -793,11 +798,13 @@ if (bpage == NULL) break; + mtx_lock(&Giant); bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0ul, dmat->lowaddr, PAGE_SIZE, 0); + mtx_unlock(&Giant); if (bpage->vaddr == 0) { free(bpage, M_DEVBUF); break; ==== //depot/projects/smpng/sys/ia64/ia64/busdma_machdep.c#10 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/ia64/ia64/busdma_machdep.c,v 1.16 2003/02/26 02:16:06 mux Exp $ + * $FreeBSD: src/sys/ia64/ia64/busdma_machdep.c,v 1.18 2003/03/13 17:18:22 mux Exp $ */ #include <sys/param.h> @@ -354,10 +354,12 @@ * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. */ + mtx_lock(&Giant); *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); + mtx_unlock(&Giant); } if (*vaddr == NULL) return (ENOMEM); @@ -377,7 +379,13 @@ */ if (map != &nobounce_dmamap) panic("bus_dmamem_free: Invalid map freed\n"); - free(vaddr, M_DEVBUF); + if ((dmat->maxsize <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) + free(vaddr, M_DEVBUF); + else { + mtx_lock(&Giant); + contigfree(vaddr, dmat->maxsize, M_DEVBUF); + mtx_unlock(&Giant); + } } #define BUS_DMAMAP_NSEGS ((64 * 1024 / PAGE_SIZE) + 1) @@ -814,11 +822,13 @@ if (bpage == NULL) break; + mtx_lock(&Giant); bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0ul, dmat->lowaddr, PAGE_SIZE, 0); + mtx_unlock(&Giant); if (bpage->vaddr == NULL) { free(bpage, M_DEVBUF); break; ==== //depot/projects/smpng/sys/kern/kern_exec.c#53 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/kern/kern_exec.c,v 1.215 2003/02/27 02:05:17 julian Exp $ + * $FreeBSD: src/sys/kern/kern_exec.c,v 1.216 2003/03/13 18:24:22 jhb Exp $ */ #include "opt_ktrace.h" @@ -178,6 +178,7 @@ struct procsig *oldprocsig, *newprocsig; #ifdef KTRACE struct vnode *tracevp = NULL; + struct ucred *tracecred = NULL; #endif struct vnode *textvp = NULL; int credential_changing; @@ -489,11 +490,13 @@ */ setsugid(p); #ifdef KTRACE - if (p->p_tracep && suser_cred(oldcred, PRISON_ROOT)) { + if (p->p_tracevp != NULL && suser_cred(oldcred, PRISON_ROOT)) { mtx_lock(&ktrace_mtx); p->p_traceflag = 0; - tracevp = p->p_tracep; - p->p_tracep = NULL; + tracevp = p->p_tracevp; + p->p_tracevp = NULL; + tracecred = p->p_tracecred; + p->p_tracecred = NULL; mtx_unlock(&ktrace_mtx); } #endif @@ -626,6 +629,8 @@ #ifdef KTRACE if (tracevp != NULL) vrele(tracevp); + if (tracecred != NULL) + crfree(tracecred); #endif if (oldargs != NULL) pargs_drop(oldargs); ==== //depot/projects/smpng/sys/kern/kern_exit.c#56 (text+ko) ==== @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_exit.c 8.7 (Berkeley) 2/12/94 - * $FreeBSD: src/sys/kern/kern_exit.c,v 1.201 2003/03/12 11:10:04 tjr Exp $ + * $FreeBSD: src/sys/kern/kern_exit.c,v 1.203 2003/03/13 18:24:22 jhb Exp $ */ #include "opt_compat.h" @@ -135,6 +135,7 @@ struct vnode *vtmp; #ifdef KTRACE struct vnode *tracevp; + struct ucred *tracecred; #endif GIANT_REQUIRED; @@ -359,12 +360,16 @@ PROC_LOCK(p); mtx_lock(&ktrace_mtx); p->p_traceflag = 0; /* don't trace the vrele() */ - tracevp = p->p_tracep; - p->p_tracep = NULL; + tracevp = p->p_tracevp; + p->p_tracevp = NULL; + tracecred = p->p_tracecred; + p->p_tracecred = NULL; mtx_unlock(&ktrace_mtx); PROC_UNLOCK(p); if (tracevp != NULL) vrele(tracevp); + if (tracecred != NULL) + crfree(tracecred); #endif /* * Release reference to text vnode @@ -658,15 +663,14 @@ return (0); } + /* + * Remove other references to this process to ensure + * we have an exclusive reference. + */ sx_xlock(&allproc_lock); LIST_REMOVE(p, p_list); /* off zombproc */ sx_xunlock(&allproc_lock); - LIST_REMOVE(p, p_sibling); - /* - * Remove other references to this process to ensure - * we have an exclusive reference. - */ leavepgrp(p); sx_xunlock(&proctree_lock); ==== //depot/projects/smpng/sys/kern/kern_fork.c#52 (text+ko) ==== @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 - * $FreeBSD: src/sys/kern/kern_fork.c,v 1.186 2003/02/27 02:05:17 julian Exp $ + * $FreeBSD: src/sys/kern/kern_fork.c,v 1.187 2003/03/13 18:24:22 jhb Exp $ */ #include "opt_ktrace.h" @@ -626,11 +626,15 @@ * Copy traceflag and tracefile if enabled. */ mtx_lock(&ktrace_mtx); - KASSERT(p2->p_tracep == NULL, ("new process has a ktrace vnode")); + KASSERT(p2->p_tracevp == NULL, ("new process has a ktrace vnode")); if (p1->p_traceflag & KTRFAC_INHERIT) { p2->p_traceflag = p1->p_traceflag; - if ((p2->p_tracep = p1->p_tracep) != NULL) - VREF(p2->p_tracep); + if ((p2->p_tracevp = p1->p_tracevp) != NULL) { + VREF(p2->p_tracevp); + KASSERT(p1->p_tracecred != NULL, + ("ktrace vnode with no cred")); + p2->p_tracecred = crhold(p1->p_tracecred); + } } mtx_unlock(&ktrace_mtx); #endif ==== //depot/projects/smpng/sys/kern/kern_ktrace.c#29 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)kern_ktrace.c 8.2 (Berkeley) 9/23/93 - * $FreeBSD: src/sys/kern/kern_ktrace.c,v 1.81 2003/02/19 05:47:25 imp Exp $ + * $FreeBSD: src/sys/kern/kern_ktrace.c,v 1.83 2003/03/13 18:31:15 jhb Exp $ */ #include "opt_ktrace.h" @@ -226,17 +226,23 @@ if (req != NULL) { STAILQ_REMOVE_HEAD(&ktr_free, ktr_list); req->ktr_header.ktr_type = type; - KASSERT(p->p_tracep != NULL, ("ktrace: no trace vnode")); - req->ktr_vp = p->p_tracep; - VREF(p->p_tracep); + if (p->p_traceflag & KTRFAC_DROP) { + req->ktr_header.ktr_type |= KTR_DROP; + p->p_traceflag &= ~KTRFAC_DROP; + } + KASSERT(p->p_tracevp != NULL, ("ktrace: no trace vnode")); + KASSERT(p->p_tracecred != NULL, ("ktrace: no trace cred")); + req->ktr_vp = p->p_tracevp; + VREF(p->p_tracevp); + req->ktr_cred = crhold(p->p_tracecred); mtx_unlock(&ktrace_mtx); microtime(&req->ktr_header.ktr_time); req->ktr_header.ktr_pid = p->p_pid; bcopy(p->p_comm, req->ktr_header.ktr_comm, MAXCOMLEN + 1); - req->ktr_cred = crhold(td->td_ucred); req->ktr_header.ktr_buffer = NULL; req->ktr_header.ktr_len = 0; } else { + p->p_traceflag |= KTRFAC_DROP; pm = print_message; print_message = 0; mtx_unlock(&ktrace_mtx); @@ -498,6 +504,7 @@ int ret = 0; int flags, error = 0; struct nameidata nd; + struct ucred *cred; td->td_inktrace = 1; if (ops != KTROP_CLEAR) { @@ -527,15 +534,18 @@ sx_slock(&allproc_lock); LIST_FOREACH(p, &allproc, p_list) { PROC_LOCK(p); - if (p->p_tracep == vp) { + if (p->p_tracevp == vp) { if (ktrcanset(td, p)) { mtx_lock(&ktrace_mtx); - p->p_tracep = NULL; + cred = p->p_tracecred; + p->p_tracecred = NULL; + p->p_tracevp = NULL; p->p_traceflag = 0; mtx_unlock(&ktrace_mtx); PROC_UNLOCK(p); (void) vn_close(vp, FREAD|FWRITE, - td->td_ucred, td); + cred, td); + crfree(cred); } else { PROC_UNLOCK(p); error = EPERM; @@ -654,6 +664,7 @@ struct vnode *vp; { struct vnode *tracevp = NULL; + struct ucred *tracecred = NULL; PROC_LOCK(p); if (!ktrcanset(td, p)) { @@ -662,13 +673,17 @@ } mtx_lock(&ktrace_mtx); if (ops == KTROP_SET) { - if (p->p_tracep != vp) { + if (p->p_tracevp != vp) { /* * if trace file already in use, relinquish below */ - tracevp = p->p_tracep; + tracevp = p->p_tracevp; VREF(vp); - p->p_tracep = vp; + p->p_tracevp = vp; + } + if (p->p_tracecred != td->td_ucred) { + tracecred = p->p_tracecred; + p->p_tracecred = crhold(td->td_ucred); } p->p_traceflag |= facs; if (td->td_ucred->cr_uid == 0) @@ -678,14 +693,18 @@ if (((p->p_traceflag &= ~facs) & KTRFAC_MASK) == 0) { /* no more tracing */ p->p_traceflag = 0; - tracevp = p->p_tracep; - p->p_tracep = NULL; + tracevp = p->p_tracevp; + p->p_tracevp = NULL; + tracecred = p->p_tracecred; + p->p_tracecred = NULL; } } mtx_unlock(&ktrace_mtx); PROC_UNLOCK(p); if (tracevp != NULL) vrele(tracevp); + if (tracecred != NULL) + crfree(tracecred); return (1); } @@ -748,7 +767,7 @@ if (vp == NULL) return; kth = &req->ktr_header; - datalen = data_lengths[kth->ktr_type]; + datalen = data_lengths[(ushort)kth->ktr_type & ~KTR_DROP]; buflen = kth->ktr_len; cred = req->ktr_cred; td = curthread; @@ -804,17 +823,24 @@ * we really do this? Other processes might have suitable * credentials for the operation. */ + cred = NULL; sx_slock(&allproc_lock); LIST_FOREACH(p, &allproc, p_list) { PROC_LOCK(p); - if (p->p_tracep == vp) { + if (p->p_tracevp == vp) { mtx_lock(&ktrace_mtx); - p->p_tracep = NULL; + p->p_tracevp = NULL; p->p_traceflag = 0; + cred = p->p_tracecred; + p->p_tracecred = NULL; mtx_unlock(&ktrace_mtx); vrele_count++; } PROC_UNLOCK(p); + if (cred != NULL) { + crfree(cred); + cred = NULL; + } } sx_sunlock(&allproc_lock); /* ==== //depot/projects/smpng/sys/kern/kern_physio.c#7 (text+ko) ==== @@ -16,7 +16,7 @@ * 4. Modifications may be freely made to this file if the above conditions * are met. * - * $FreeBSD: src/sys/kern/kern_physio.c,v 1.55 2003/01/20 17:46:48 dillon Exp $ + * $FreeBSD: src/sys/kern/kern_physio.c,v 1.56 2003/03/13 07:31:45 jeff Exp $ */ #include <sys/param.h> @@ -30,12 +30,6 @@ #include <vm/vm.h> #include <vm/vm_extern.h> -static void -physwakeup(struct buf *bp) -{ - wakeup(bp); -} - int physio(dev_t dev, struct uio *uio, int ioflag) { @@ -68,7 +62,7 @@ else bp->b_iocmd = BIO_WRITE; bp->b_dev = dev; - bp->b_iodone = physwakeup; + bp->b_iodone = bdone; bp->b_data = uio->uio_iov[i].iov_base; bp->b_bcount = uio->uio_iov[i].iov_len; bp->b_offset = uio->uio_offset; @@ -116,8 +110,10 @@ DEV_STRATEGY(bp); spl = splbio(); - while ((bp->b_flags & B_DONE) == 0) - tsleep(bp, PRIBIO, "physstr", 0); + if (uio->uio_rw == UIO_READ) + bwait(bp, PRIBIO, "physrd"); + else + bwait(bp, PRIBIO, "physwr"); splx(spl); if (uio->uio_segflg == UIO_USERSPACE) ==== //depot/projects/smpng/sys/kern/kern_proc.c#46 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)kern_proc.c 8.7 (Berkeley) 2/14/95 - * $FreeBSD: src/sys/kern/kern_proc.c,v 1.174 2003/03/12 16:14:55 jhb Exp $ + * $FreeBSD: src/sys/kern/kern_proc.c,v 1.176 2003/03/13 18:24:22 jhb Exp $ */ #include "opt_ktrace.h" @@ -625,7 +625,7 @@ kp->ki_args = p->p_args; kp->ki_textvp = p->p_textvp; #ifdef KTRACE - kp->ki_tracep = p->p_tracep; + kp->ki_tracep = p->p_tracevp; mtx_lock(&ktrace_mtx); kp->ki_traceflag = p->p_traceflag; mtx_unlock(&ktrace_mtx); @@ -1024,8 +1024,8 @@ { int *name = (int*) arg1; u_int namelen = arg2; + struct pargs *newpa, *pa; struct proc *p; - struct pargs *pa, *newpa; int error = 0; if (namelen != 1) @@ -1048,23 +1048,20 @@ pa = p->p_args; pargs_hold(pa); PROC_UNLOCK(p); - if (req->oldptr && pa != NULL) { + if (req->oldptr != NULL && pa != NULL) error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length); - } pargs_drop(pa); - if (req->newptr == NULL) + if (error != 0 || req->newptr == NULL) return (error); if (req->newlen + sizeof(struct pargs) > ps_arg_cache_limit) - return (error); - + return (ENOMEM); newpa = pargs_alloc(req->newlen); error = SYSCTL_IN(req, newpa->ar_args, req->newlen); - if (error) { + if (error != 0) { pargs_free(newpa); return (error); } - PROC_LOCK(p); pa = p->p_args; p->p_args = newpa; ==== //depot/projects/smpng/sys/kern/kern_resource.c#32 (text+ko) ==== @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_resource.c 8.5 (Berkeley) 1/21/94 - * $FreeBSD: src/sys/kern/kern_resource.c,v 1.120 2003/03/12 11:24:41 tjr Exp $ + * $FreeBSD: src/sys/kern/kern_resource.c,v 1.121 2003/03/13 00:54:53 tjr Exp $ */ #include "opt_compat.h" @@ -98,21 +98,17 @@ switch (uap->which) { case PRIO_PROCESS: - if (uap->who == 0) { - mtx_lock_spin(&sched_lock); + if (uap->who == 0) low = td->td_ksegrp->kg_nice; - mtx_unlock_spin(&sched_lock); - } else { + else { p = pfind(uap->who); if (p == NULL) break; if (p_cansee(td, p) == 0) { - mtx_lock_spin(&sched_lock); FOREACH_KSEGRP_IN_PROC(p, kg) { if (kg->kg_nice < low) low = kg->kg_nice; } - mtx_unlock_spin(&sched_lock); } PROC_UNLOCK(p); } @@ -136,12 +132,10 @@ LIST_FOREACH(p, &pg->pg_members, p_pglist) { PROC_LOCK(p); if (!p_cansee(td, p)) { - mtx_lock_spin(&sched_lock); FOREACH_KSEGRP_IN_PROC(p, kg) { if (kg->kg_nice < low) low = kg->kg_nice; } - mtx_unlock_spin(&sched_lock); } PROC_UNLOCK(p); } @@ -157,12 +151,10 @@ PROC_LOCK(p); if (!p_cansee(td, p) && p->p_ucred->cr_uid == uap->who) { - mtx_lock_spin(&sched_lock); FOREACH_KSEGRP_IN_PROC(p, kg) { if (kg->kg_nice < low) low = kg->kg_nice; } - mtx_unlock_spin(&sched_lock); } PROC_UNLOCK(p); } @@ -297,19 +289,15 @@ * Only allow nicing if to more than the lowest nice. * e.g. nices of 4,3,2 allow nice to 3 but not 1 */ - mtx_lock_spin(&sched_lock); FOREACH_KSEGRP_IN_PROC(p, kg) { if (kg->kg_nice < low) low = kg->kg_nice; } - if (n < low && suser(td)) { - mtx_unlock_spin(&sched_lock); + if (n < low && suser(td)) return (EACCES); - } FOREACH_KSEGRP_IN_PROC(p, kg) { sched_nice(kg, n); } - mtx_unlock_spin(&sched_lock); return (0); } ==== //depot/projects/smpng/sys/kern/subr_bus.c#20 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/kern/subr_bus.c,v 1.123 2003/03/03 12:15:51 phk Exp $ + * $FreeBSD: src/sys/kern/subr_bus.c,v 1.124 2003/03/13 06:29:44 alfred Exp $ */ #include "opt_bus.h" @@ -1154,7 +1154,7 @@ const char * device_get_name(device_t dev) { - if (dev->devclass) + if (dev != NULL && dev->devclass) return (devclass_get_name(dev->devclass)); return (NULL); } ==== //depot/projects/smpng/sys/kern/uipc_mbuf.c#14 (text+ko) ==== @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 - * $FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.109 2003/02/19 05:47:26 imp Exp $ + * $FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.110 2003/03/13 09:02:19 iedowse Exp $ */ #include "opt_mac.h" @@ -129,7 +129,8 @@ mac_create_mbuf_from_mbuf(from, to); #endif SLIST_INIT(&to->m_pkthdr.tags); - return (m_tag_copy_chain(to, from, how)); + return (m_tag_copy_chain(to, from, (how & M_TRYWAIT) ? M_WAITOK : + M_NOWAIT)); } /* ==== //depot/projects/smpng/sys/kern/vfs_bio.c#37 (text+ko) ==== @@ -11,7 +11,7 @@ * 2. Absolutely no warranty of function or purpose is made by the author * John S. Dyson. * - * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.376 2003/03/04 00:04:42 jeff Exp $ + * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.378 2003/03/13 07:31:45 jeff Exp $ */ /* @@ -81,7 +81,7 @@ static void vfs_backgroundwritedone(struct buf *bp); static int vfs_bio_clcheck(struct vnode *vp, int size, daddr_t lblkno, daddr_t blkno); -static int flushbufqueues(void); +static int flushbufqueues(int flushdeps); static void buf_daemon(void); void bremfreel(struct buf * bp); @@ -213,6 +213,12 @@ static struct mtx nblock; /* + * Lock that protects against bwait()/bdone()/B_DONE races. + */ + +static struct mtx bdonelock; + +/* * Definitions for the buffer free lists. >>> TRUNCATED FOR MAIL (1000 lines) <<< To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200303131902.h2DJ2PfP078112>