From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:48:02 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DA44D1065670; Sun, 26 Jun 2011 09:48:01 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8F92E106564A for ; Sun, 26 Jun 2011 09:48:01 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 63F798FC12 for ; Sun, 26 Jun 2011 09:48:01 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9m1fK010823 for ; Sun, 26 Jun 2011 09:48:01 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9m1xc010820 for perforce@freebsd.org; Sun, 26 Jun 2011 09:48:01 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:48:01 GMT Message-Id: <201106260948.p5Q9m1xc010820@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195348 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:48:02 -0000 http://p4web.freebsd.org/@@195348?ac=10 Change 195348 by ilya@ilya_triton2011 on 2011/06/26 09:47:02 Resync size in vnop_getattr(). Invalidate attr cache after resize in vnop_setattr(). Remove unused node->newfilesize. Merge http://macfuse.googlecode.com/svn/trunk@89 Merge http://macfuse.googlecode.com/svn/trunk@149 Partially merge http://macfuse.googlecode.com/svn/trunk@147 Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#21 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#8 (text+ko) ==== @@ -42,7 +42,6 @@ struct sx truncatelock; off_t filesize; - off_t newfilesize; struct fuse_filehandle fufh[3]; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#21 (text+ko) ==== @@ -474,6 +474,20 @@ memcpy(vap, VTOVA(vp), sizeof(*vap)); } + if (vnode_isreg(vp)) { + /* + * This is for those cases when the file size changed without us + * knowing, and we want to catch up. + */ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + off_t new_filesize = ((struct fuse_attr_out *)fdi.answ)->attr.size; + + if (fvdat->filesize != new_filesize) { + fvdat->filesize = new_filesize; + vnode_pager_setsize(vp, new_filesize); + } + } + fuse_ticket_drop(fdi.tick); if (vnode_vtype(vp) != vap->va_type) { @@ -1681,13 +1695,15 @@ } } - cache_attrs(vp, (struct fuse_attr_out *)fdi.answ); + if (!err && !sizechanged) { + cache_attrs(vp, (struct fuse_attr_out *)fdi.answ); + } out: fuse_ticket_drop(fdi.tick); if (!err && sizechanged) { + fuse_invalidate_attr(vp); VTOFUD(vp)->filesize = newsize; - VTOFUD(vp)->newfilesize = newsize; vnode_pager_setsize(vp, newsize); } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:48:02 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8D3B8106574D; Sun, 26 Jun 2011 09:48:02 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A200F106566B for ; Sun, 26 Jun 2011 09:48:01 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 8FEF38FC13 for ; Sun, 26 Jun 2011 09:48:01 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9m1NK010829 for ; Sun, 26 Jun 2011 09:48:01 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9m1ik010826 for perforce@freebsd.org; Sun, 26 Jun 2011 09:48:01 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:48:01 GMT Message-Id: <201106260948.p5Q9m1ik010826@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195349 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:48:02 -0000 http://p4web.freebsd.org/@@195349?ac=10 Change 195349 by ilya@ilya_triton2011 on 2011/06/26 09:47:40 Allow vnop_access() calls for symbolic links Merge http://macfuse.googlecode.com/svn/trunk@632 Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#22 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#12 (text+ko) ==== @@ -56,6 +56,12 @@ return (vp->v_type == VDIR ? 1 : 0); } +static __inline int +vnode_islnk(struct vnode *vp) +{ + return (vp->v_type == VLNK ? 1 : 0); +} + static __inline ssize_t uio_resid(struct uio *uio) { ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#22 (text+ko) ==== @@ -146,6 +146,10 @@ return EBADF; } + if (vnode_islnk(vp)) { + return 0; + } + bzero(&facp, sizeof(facp)); if (fvdat->flags & FVP_ACCESS_NOOP) { From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:49:04 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 321031065670; Sun, 26 Jun 2011 09:49:04 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E73FB106564A for ; Sun, 26 Jun 2011 09:49:03 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id D55078FC15 for ; Sun, 26 Jun 2011 09:49:03 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9n3w8010865 for ; Sun, 26 Jun 2011 09:49:03 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9n3ss010862 for perforce@freebsd.org; Sun, 26 Jun 2011 09:49:03 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:49:03 GMT Message-Id: <201106260949.p5Q9n3ss010862@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195350 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:49:04 -0000 http://p4web.freebsd.org/@@195350?ac=10 Change 195350 by ilya@ilya_triton2011 on 2011/06/26 09:48:06 Fix for a rare (!) uninitialized field bug in vnop_setattr() http://macfuse.googlecode.com/svn/trunk@881 Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#23 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#23 (text+ko) ==== @@ -1584,6 +1584,7 @@ fdisp_init(&fdi, sizeof(*fsai)); fdisp_make_vp(&fdi, FUSE_SETATTR, vp, td, cred); fsai = fdi.indata; + fsai->valid = 0; bzero(&facp, sizeof(facp)); From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:51:17 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DED6710656D6; Sun, 26 Jun 2011 09:51:16 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 968F510656D0 for ; Sun, 26 Jun 2011 09:51:16 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 8346D8FC15 for ; Sun, 26 Jun 2011 09:51:16 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9pGgM012517 for ; Sun, 26 Jun 2011 09:51:16 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9pGXl012514 for perforce@freebsd.org; Sun, 26 Jun 2011 09:51:16 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:51:16 GMT Message-Id: <201106260951.p5Q9pGXl012514@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195351 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:51:17 -0000 http://p4web.freebsd.org/@@195351?ac=10 Change 195351 by ilya@ilya_triton2011 on 2011/06/26 09:50:11 Reduce diffs against macfuse 2.0 Rename: fusedev_get_data -> fuse_get_devdata fusefs_get_data -> fuse_get_mpdata fdata_kick_set -> fdata_set_dead fdata_kick_get -> fdata_get_dead (macfuse uses fdata_dead_get) Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#5 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#3 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#13 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#11 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.h#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#2 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vfsops.c#16 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#24 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#7 (text+ko) ==== @@ -123,7 +123,7 @@ fdata = fdata_alloc(dev, td->td_ucred); FUSE_LOCK(); - if (fusedev_get_data(dev)) { + if (fuse_get_devdata(dev)) { FUSE_UNLOCK(); fdata_destroy(fdata); goto busy; @@ -131,7 +131,7 @@ #if ! (DO_GIANT_MANUALLY && USE_FUSE_LOCK) fuse_useco++; #endif - fdata->dataflag |= FSESS_OPENED; + fdata->dataflags |= FSESS_OPENED; dev->si_drv1 = fdata; } FUSE_UNLOCK(); @@ -163,13 +163,13 @@ mtx_lock(&Giant); #endif FUSE_LOCK(); - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (! data) panic("no fuse data upon fuse device close"); - KASSERT(data->dataflag | FSESS_OPENED, + KASSERT(data->dataflags | FSESS_OPENED, ("fuse device is already closed upon close")); - fdata_kick_set(data); - data->dataflag &= ~FSESS_OPENED; + fdata_set_dead(data); + data->dataflags &= ~FSESS_OPENED; mtx_lock(&data->aw_mtx); /* wakup poll()ers */ @@ -213,11 +213,11 @@ struct fuse_data *data; int revents = 0; - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (events & (POLLIN | POLLRDNORM)) { mtx_lock(&data->ms_mtx); - if (fdata_kick_get(data) || STAILQ_FIRST(&data->ms_head)) + if (fdata_get_dead(data) || STAILQ_FIRST(&data->ms_head)) revents |= events & (POLLIN | POLLRDNORM); else selrecord(td, &data->ks_rsel); @@ -246,13 +246,13 @@ int buflen[3]; int i; - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); DEBUG("fuse device being read on thread %d\n", uio->uio_td->td_tid); mtx_lock(&data->ms_mtx); again: - if (fdata_kick_get(data)) { + if (fdata_get_dead(data)) { DEBUG2G("we know early on that reader should be kicked so we don't wait for news\n"); mtx_unlock(&data->ms_mtx); return (ENODEV); @@ -269,7 +269,7 @@ err = msleep(data, &data->ms_mtx, PCATCH, "fu_msg", 0); if (err != 0) { mtx_unlock(&data->ms_mtx); - return (fdata_kick_get(data) ? ENODEV : err); + return (fdata_get_dead(data) ? ENODEV : err); } tick = fuse_ms_pop(data); } @@ -286,7 +286,7 @@ } mtx_unlock(&data->ms_mtx); - if (fdata_kick_get(data)) { + if (fdata_get_dead(data)) { /* * somebody somewhere -- eg., umount routine -- * wants this liaison finished off @@ -331,7 +331,7 @@ * fallacy as loud as possible... */ if (uio->uio_resid < buflen[i]) { - fdata_kick_set(data); + fdata_set_dead(data); DEBUG2G("daemon is stupid, kick it off...\n"); err = ENODEV; break; @@ -392,11 +392,11 @@ DEBUG("Fuse write -- resid: %zd, iovcnt: %d, thread: %d\n", uio->uio_resid, uio->uio_iovcnt, uio->uio_td->td_tid); - data = fusedev_get_data(dev); + data = fuse_get_devdata(dev); if (uio->uio_resid < sizeof(struct fuse_out_header)) { DEBUG("got less than a header!\n"); - fdata_kick_set(data); + fdata_set_dead(data); return (EINVAL); } @@ -411,7 +411,7 @@ * header. */ if ((err = fuse_ohead_audit(&ohead, uio))) { - fdata_kick_set(data); + fdata_set_dead(data); return (err); } @@ -473,7 +473,7 @@ */ DEBUG("erhm, no handler for this response\n"); - fdata_kick_set(data); + fdata_set_dead(data); return (EINVAL); } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#5 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh */ @@ -37,33 +37,38 @@ &fuse_fh_upcall_count, 0, ""); int -fuse_filehandle_get(struct vnode *vp, struct thread *td, struct ucred *cred, fufh_type_t fufh_type) +fuse_filehandle_get(struct vnode *vp, + struct thread *td, + struct ucred *cred, + fufh_type_t fufh_type) { - struct fuse_vnode_data *fvdat = VTOFUD(vp); struct fuse_dispatcher fdi; struct fuse_open_in *foi; struct fuse_open_out *foo; struct fuse_filehandle *fufh; + struct fuse_vnode_data *fvdat = VTOFUD(vp); - int err = 0; - int isdir = 0; - int op = FUSE_OPEN; + int err = 0; + int isdir = 0; int oflags = fuse_filehandle_xlate_to_oflags(fufh_type); + int op = FUSE_OPEN; fuse_trace_printf("fuse_filehandle_get(vp=%p, fufh_type=%d)\n", vp, fufh_type); fufh = &(fvdat->fufh[fufh_type]); + if (fufh->fufh_flags & FUFH_VALID) { - printf("the given fufh type is already valid ... called in vain\n"); + printf("FUSE: filehandle_get called despite valid fufh (type=%d)", + fufh_type); return 0; } - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { isdir = 1; op = FUSE_OPENDIR; if (fufh_type != FUFH_RDONLY) { - printf("non-rdonly fh requested for a directory?\n"); + printf("FUSE: non-rdonly fh requested for a directory?\n"); fufh_type = FUFH_RDONLY; } } @@ -82,12 +87,12 @@ foo = fdi.answ; + fufh->fh_id = foo->fh; fufh->fufh_flags |= (0 | FUFH_VALID); fufh->open_count = 1; fufh->open_flags = oflags; fufh->fuse_open_flags = foo->open_flags; fufh->type = fufh_type; - fufh->fh_id = foo->fh; fuse_ticket_drop(fdi.tick); @@ -101,11 +106,11 @@ struct fuse_dispatcher fdi; struct fuse_release_in *fri; struct fuse_vnode_data *fvdat = VTOFUD(vp); - struct fuse_filehandle *fufh = NULL; + struct fuse_filehandle *fufh = NULL; - int op = FUSE_RELEASE; - int err = 0; + int err = 0; int isdir = 0; + int op = FUSE_RELEASE; fuse_trace_printf("fuse_filehandle_put(vp=%p, fufh_type=%d)\n", vp, fufh_type); @@ -117,14 +122,16 @@ } if (fufh->open_count != 0) { - panic("trying to put fufh with open count %d\n", fufh->open_count); + panic("FUSE: filehandle_put called on a valid fufh (type=%d)", + fufh_type); + /* NOTREACHED */ } if (fufh->fufh_flags & FUFH_MAPPED) { panic("trying to put mapped fufh\n"); } - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { op = FUSE_RELEASEDIR; isdir = 1; } @@ -149,5 +156,5 @@ out: fufh->fufh_flags &= ~FUFH_VALID; - return (err); + return err; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#3 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh */ @@ -25,16 +25,17 @@ #define FUFH_STRATEGY 0x00000004 struct fuse_filehandle { - uint64_t fh_id; + uint64_t fh_id; + int open_count; + int open_flags; + int fuse_open_flags; fufh_type_t type; - int fufh_flags; - int open_count; - int open_flags; - int fuse_open_flags; + int fufh_flags; }; typedef struct fuse_filehandle * fuse_filehandle_t; -static __inline__ fufh_type_t +static __inline__ +fufh_type_t fuse_filehandle_xlate_from_mmap(int fflags) { if (fflags & (PROT_READ | PROT_WRITE)) { @@ -48,7 +49,8 @@ } } -static __inline__ fufh_type_t +static __inline__ +fufh_type_t fuse_filehandle_xlate_from_fflags(int fflags) { if ((fflags & FREAD) && (fflags & FWRITE)) { @@ -58,25 +60,30 @@ } else if (fflags & (FREAD)) { return FUFH_RDONLY; } else { - panic("What kind of a flag is this?"); + panic("FUSE: What kind of a flag is this (%x)?", fflags); } } -static __inline__ int +static __inline__ +int fuse_filehandle_xlate_to_oflags(fufh_type_t type) { int oflags = -1; switch (type) { + case FUFH_RDONLY: oflags = O_RDONLY; break; + case FUFH_WRONLY: oflags = O_WRONLY; break; + case FUFH_RDWR: oflags = O_RDWR; break; + default: break; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#12 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh */ @@ -50,9 +50,6 @@ /* access */ -static __inline int fuse_match_cred(struct ucred *daemoncred, - struct ucred *usercred); - int fuse_internal_access(struct vnode *vp, mode_t mode, @@ -62,7 +59,7 @@ { int err = 0; uint32_t mask = 0; - int dataflag; + int dataflags; int vtype; struct mount *mp; struct fuse_dispatcher fdi; @@ -78,8 +75,8 @@ mp = vnode_mount(vp); vtype = vnode_vtype(vp); - data = fusefs_get_data(mp); - dataflag = data->dataflag; + data = fuse_get_mpdata(mp); + dataflags = data->dataflags; if ((mode & VWRITE) && vfs_isrdonly(mp)) { return EACCES; @@ -87,7 +84,7 @@ // Unless explicitly permitted, deny everyone except the fs owner. if (vnode_isvroot(vp) && !(facp->facc_flags & FACCESS_NOCHECKSPY)) { - if (!(dataflag & FSESS_DAEMON_CAN_SPY)) { + if (!(dataflags & FSESS_DAEMON_CAN_SPY)) { int denied = fuse_match_cred(data->daemoncred, cred); if (denied) { @@ -111,12 +108,12 @@ #endif } - if (fusefs_get_data(mp)->dataflag & FSESS_NOACCESS) { + if (fuse_get_mpdata(mp)->dataflags & FSESS_NOACCESS) { // Let the kernel handle this. return 0; } - if (dataflag & FSESS_DEFAULT_PERMISSIONS) { + if (dataflags & FSESS_DEFAULT_PERMISSIONS) { // Let the kernel handle this. return 0; } @@ -152,35 +149,13 @@ } if (err == ENOSYS) { - fusefs_get_data(mp)->dataflag |= FSESS_NOACCESS; + fuse_get_mpdata(mp)->dataflags |= FSESS_NOACCESS; err = 0; // ENOTSUP; } return err; } -/* - * An access check routine based on fuse_allow_task() of the Linux module. - * Now we use this one rather than the more permissive function we used to - * (and which seemed more logical to me), to ensure uniform behaviour on Linux - * and FreeBSD. - * - * Non-null return value indicates error (ie., "not allowed"). - */ -static __inline int -fuse_match_cred(struct ucred *basecred, struct ucred *usercred) -{ - if (basecred->cr_uid == usercred->cr_uid && - basecred->cr_uid == usercred->cr_ruid && - basecred->cr_uid == usercred->cr_svuid && - basecred->cr_groups[0] == usercred->cr_groups[0] && - basecred->cr_groups[0] == usercred->cr_rgid && - basecred->cr_groups[0] == usercred->cr_svgid) - return (0); - - return (EPERM); -} - /* fsync */ int @@ -189,7 +164,7 @@ fuse_trace_printf_func(); if (tick->tk_aw_ohead.error == ENOSYS) { - tick->tk_data->dataflag |= (fticket_opcode(tick) == FUSE_FSYNC) ? + tick->tk_data->dataflags |= (fticket_opcode(tick) == FUSE_FSYNC) ? FSESS_NOFSYNC : FSESS_NOFSYNCDIR; } @@ -213,7 +188,7 @@ fdip->iosize = sizeof(*ffsi); fdip->tick = NULL; - if (vnode_vtype(vp) == VDIR) { + if (vnode_isdir(vp)) { op = FUSE_FSYNCDIR; } @@ -221,7 +196,7 @@ ffsi = fdip->indata; ffsi->fh = fufh->fh_id; - ffsi->fsync_flags = 1; + ffsi->fsync_flags = 1; /* datasync */ fuse_insert_callback(fdip->tick, fuse_internal_fsync_callback); fuse_insert_message(fdip->tick); @@ -243,7 +218,7 @@ struct fuse_read_in *fri; if (uio_resid(uio) == 0) { - return (0); + return 0; } fdisp_init(&fdi, 0); @@ -293,7 +268,7 @@ struct fuse_iov *cookediov = param; if (bufsize < FUSE_NAME_OFFSET) { - return (-1); + return -1; } for (;;) { @@ -303,11 +278,11 @@ break; } - cou++; - fudge = (struct fuse_dirent *)buf; freclen = FUSE_DIRENT_SIZE(fudge); + cou++; + if (bufsize < freclen) { err = ((cou == 1) ? -1 : 0); break; @@ -336,9 +311,9 @@ fiov_adjust(cookediov, bytesavail); de = (struct dirent *)cookediov->base; - de->d_fileno = fudge->ino; /* XXX cast from 64 to 32 bits */ + de->d_fileno = fudge->ino; /* XXX: truncation */ de->d_reclen = bytesavail; - de->d_type = fudge->type; + de->d_type = fudge->type; de->d_namlen = fudge->namelen; memcpy((char *)cookediov->base + sizeof(struct dirent) - MAXNAMLEN - 1, (char *)buf + FUSE_NAME_OFFSET, fudge->namelen); @@ -354,14 +329,14 @@ uio_setoffset(uio, fudge->off); } - return (err); + return err; } /* remove */ #ifdef XXXIP static int -fuse_unlink_callback(struct vnode *vp, void *cargs) +fuse_internal_remove_callback(struct vnode *vp, void *cargs) { struct vattr *vap; uint64_t target_nlink; @@ -370,7 +345,8 @@ target_nlink = *(uint64_t *)cargs; - if ((vap->va_nlink == target_nlink) && (vnode_vtype(vp) == VREG)) { + /* somewhat lame "heuristics", but you got better ideas? */ + if ((vap->va_nlink == target_nlink) && vnode_isreg(vp)) { fuse_invalidate_attr(vp); } @@ -386,6 +362,7 @@ enum fuse_opcode op) { struct fuse_dispatcher fdi; + struct vattr *vap = VTOVA(vp); #if INVALIDATE_CACHED_VATTRS_UPON_UNLINK int need_invalidate = 0; @@ -415,16 +392,24 @@ fuse_invalidate_attr(dvp); fuse_invalidate_attr(vp); -#if INVALIDATE_CACHED_VATTRS_UPON_UNLINK #ifdef XXXIP + /* + * XXX: INVALIDATE_CACHED_VATTRS_UPON_UNLINK + * + * Consider the case where vap->va_nlink > 1 for the entity being + * removed. In our world, other in-memory vnodes that share a link + * count each with this one may not know right way that this one just + * got deleted. We should let them know, say, through a vnode_iterate() + * here and a callback that does fuse_invalidate_attr(vp) on each + * relevant vnode. + */ if (need_invalidate && !err) { - vnode_iterate(vnode_mount(vp), 0, fuse_unlink_callback, + vnode_iterate(vnode_mount(vp), 0, fuse_internal_remove_callback, (void *)&target_nlink); } #endif -#endif - return (err); + return err; } /* rename */ @@ -461,7 +446,7 @@ fuse_invalidate_attr(tdvp); } - return (err); + return err; } /* strategy */ @@ -500,10 +485,8 @@ struct fuse_entry_out *feo; struct mount *mp = vnode_mount(dvp); - debug_printf("fdip=%p\n", fdip); - if ((err = fdisp_wait_answ(fdip))) { - return (err); + return err; } feo = fdip->answ; @@ -512,8 +495,7 @@ goto out; } - err = fuse_vnode_get(mp, feo->nodeid, dvp, vpp, cnp, - vtyp, 0); + err = fuse_vnode_get(mp, feo->nodeid, dvp, vpp, cnp, vtyp, 0); if (err) { fuse_internal_forget_send(mp, cnp->cn_thread, cnp->cn_cred, feo->nodeid, 1, fdip); return err; @@ -534,33 +516,32 @@ enum fuse_opcode op, void *buf, size_t bufsize, - enum vtype vtyp) + enum vtype vtype) { int err; struct fuse_dispatcher fdi; + struct mount *mp = vnode_mount(dvp); fdisp_init(&fdi, 0); - fuse_internal_newentry_makerequest(vnode_mount(dvp), VTOI(dvp), cnp, - op, buf, bufsize, &fdi); - err = fuse_internal_newentry_core(dvp, vpp, cnp, vtyp, &fdi); + fuse_internal_newentry_makerequest(mp, VTOI(dvp), cnp, op, buf, + bufsize, &fdi); + err = fuse_internal_newentry_core(dvp, vpp, cnp, vtype, &fdi); fuse_invalidate_attr(dvp); - return (err); + return err; } /* entity destruction */ int -fuse_internal_forget_callback(struct fuse_ticket *tick, struct uio *uio) +fuse_internal_forget_callback(struct fuse_ticket *ftick, struct uio *uio) { struct fuse_dispatcher fdi; - debug_printf("tick=%p, uio=%p\n", tick, uio); + fdi.tick = ftick; - fdi.tick = tick; - fuse_internal_forget_send(tick->tk_data->mp, curthread, NULL, - ((struct fuse_in_header *)tick->tk_ms_fiov.base)->nodeid, - 1, &fdi); + fuse_internal_forget_send(ftick->tk_data->mp, curthread, NULL, + ((struct fuse_in_header *)ftick->tk_ms_fiov.base)->nodeid, 1, &fdi); return 0; } @@ -637,15 +618,15 @@ fuse_ticket_drop(tick); if (err) { - fdata_kick_set(data); + fdata_set_dead(data); } mtx_lock(&data->ticket_mtx); - data->dataflag |= FSESS_INITED; + data->dataflags |= FSESS_INITED; wakeup(&data->ticketer); mtx_unlock(&data->ticket_mtx); - return (0); + return 0; } void ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#13 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh */ @@ -86,6 +86,46 @@ uio->uio_resid = resid; } +/* time */ + +#define fuse_timespec_add(vvp, uvp) \ + do { \ + (vvp)->tv_sec += (uvp)->tv_sec; \ + (vvp)->tv_nsec += (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec >= 1000000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_nsec -= 1000000000; \ + } \ + } while (0) + +#define fuse_timespec_cmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +/* miscellaneous */ + +#define fuse_isdeadfs_nop(vp) 0 + +static __inline__ +int +fuse_isdeadfs(struct vnode *vp) +{ + struct mount *mp = vnode_mount(vp); + struct fuse_data *data = fuse_get_mpdata(mp); + + return (data->dataflags & FSESS_DEAD); +} + +static __inline__ +int +fuse_isdeadfs_mp(struct mount *mp) +{ + struct fuse_data *data = fuse_get_mpdata(mp); + + return (data->dataflags & FSESS_DEAD); +} + /* access */ #define FVP_ACCESS_NOOP 0x01 @@ -100,11 +140,25 @@ #define FACCESS_XQUERIES FACCESS_STICKY | FACCESS_CHOWN | FACCESS_SETGID struct fuse_access_param { - uid_t xuid; - gid_t xgid; - unsigned facc_flags; + uid_t xuid; + gid_t xgid; + uint32_t facc_flags; }; +static __inline int +fuse_match_cred(struct ucred *basecred, struct ucred *usercred) +{ + if (basecred->cr_uid == usercred->cr_uid && + basecred->cr_uid == usercred->cr_ruid && + basecred->cr_uid == usercred->cr_svuid && + basecred->cr_groups[0] == usercred->cr_groups[0] && + basecred->cr_groups[0] == usercred->cr_rgid && + basecred->cr_groups[0] == usercred->cr_svgid) + return 0; + + return EPERM; +} + int fuse_internal_access(struct vnode *vp, mode_t mode, @@ -152,15 +206,6 @@ vap->va_flags = 0; } -#define timespecadd(vvp, uvp) \ - do { \ - (vvp)->tv_sec += (uvp)->tv_sec; \ - (vvp)->tv_nsec += (uvp)->tv_nsec; \ - if ((vvp)->tv_nsec >= 1000000000) { \ - (vvp)->tv_sec++; \ - (vvp)->tv_nsec -= 1000000000; \ - } \ - } while (0) #define cache_attrs(vp, fuse_out) do { \ struct timespec uptsp_ ## __func__; \ @@ -169,7 +214,7 @@ VTOFUD(vp)->cached_attrs_valid.tv_nsec = (fuse_out)->attr_valid_nsec; \ nanouptime(&uptsp_ ## __func__); \ \ - timespecadd(&VTOFUD(vp)->cached_attrs_valid, &uptsp_ ## __func__); \ + fuse_timespec_add(&VTOFUD(vp)->cached_attrs_valid, &uptsp_ ## __func__); \ \ fuse_internal_attr_fat2vat(vnode_mount(vp), &(fuse_out)->attr, VTOVA(vp)); \ } while (0) @@ -235,22 +280,22 @@ if (vtyp != IFTOVT(feo->attr.mode)) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- %x != %x\n", vtyp, IFTOVT(feo->attr.mode)); - return (EINVAL); + return EINVAL; } if (feo->nodeid == FUSE_NULL_ID) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- feo->nodeid is NULL\n"); - return (EINVAL); + return EINVAL; } if (feo->nodeid == FUSE_ROOT_ID) { DEBUGX(FUSE_DEBUG_INTERNAL, "EINVAL -- feo->nodeid is FUSE_ROOT_ID\n"); - return (EINVAL); + return EINVAL; } - return (0); + return 0; } int @@ -296,27 +341,4 @@ int fuse_internal_init_callback(struct fuse_ticket *tick, struct uio *uio); void fuse_internal_send_init(struct fuse_data *data, struct thread *td); -/* miscellaneous */ - -#define fuse_isdeadfs_nop(vp) 0 - -static __inline__ -int -fuse_isdeadfs(struct vnode *vp) -{ - struct mount *mp = vnode_mount(vp); - struct fuse_data *data = fusefs_get_data(mp); - - return (data->dataflag & FSESS_KICK); -} - -static __inline__ -int -fuse_isdeadfs_mp(struct mount *mp) -{ - struct fuse_data *data = fusefs_get_data(mp); - - return (data->dataflag & FSESS_KICK); -} - #endif /* _FUSE_INTERNAL_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#11 (text+ko) ==== @@ -337,7 +337,7 @@ fri->fh = fufh->fh_id; fri->offset = uio->uio_offset; fri->size = MIN(uio->uio_resid, - fusefs_get_data(vp->v_mount)->max_read); + fuse_get_mpdata(vp->v_mount)->max_read); DEBUG2G("fri->fh %ju, fri->offset %ju, fri->size %ju\n", (uintmax_t)fri->fh, (uintmax_t)fri->offset, (uintmax_t)fri->size); @@ -373,8 +373,8 @@ int chunksize = 0; struct iovec *iov; int nmax = (uio->uio_rw == UIO_READ) ? - fusefs_get_data(vp->v_mount)->max_read : - fusefs_get_data(vp->v_mount)->max_write; + fuse_get_mpdata(vp->v_mount)->max_read : + fuse_get_mpdata(vp->v_mount)->max_write; op = fioda->opcode ?: ((uio->uio_rw == UIO_READ) ? FUSE_READ : FUSE_WRITE); @@ -487,7 +487,7 @@ while (uio->uio_resid > 0) { chunksize = MIN(uio->uio_resid, - fusefs_get_data(vp->v_mount)->max_write); + fuse_get_mpdata(vp->v_mount)->max_write); fdi.iosize = sizeof(*fwi) + chunksize; fdisp_make_vp(&fdi, FUSE_WRITE, vp, td, cred); @@ -808,7 +808,7 @@ while (bp->b_resid > 0) { DEBUG2G("starting bio with resid %ld\n", bp->b_resid); chunksize = MIN(bp->b_resid, - fusefs_get_data(vp->v_mount)->max_read); + fuse_get_mpdata(vp->v_mount)->max_read); fdi.iosize = sizeof(*fri); if (! op) op = vp->v_type == VDIR ? FUSE_READDIR : FUSE_READ; @@ -878,7 +878,7 @@ bufdat = bp->b_data + bp->b_dirtyoff; while (bp->b_dirtyend > bp->b_dirtyoff) { chunksize = MIN(bp->b_dirtyend - bp->b_dirtyoff, - fusefs_get_data(vp->v_mount)->max_write); + fuse_get_mpdata(vp->v_mount)->max_write); fdi.iosize = sizeof(*fwi); op = op ?: FUSE_WRITE; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#7 (text+ko) ==== @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Google. All Rights Reserved. + * Copyright (C) 2006-2008 Google. All Rights Reserved. * Amit Singh */ @@ -32,25 +32,30 @@ #include "fuse_debug.h" static struct fuse_ticket *fticket_alloc(struct fuse_data *data); -static void fticket_refresh(struct fuse_ticket *tick); -static void fticket_destroy(struct fuse_ticket *tick); -static int fticket_wait_answer(struct fuse_ticket *tick); -static __inline__ int fticket_aw_pull_uio(struct fuse_ticket *tick, struct uio *uio); -static __inline__ void fuse_push_freeticks(struct fuse_ticket *tick); +static void fticket_refresh(struct fuse_ticket *ftick); +static void fticket_destroy(struct fuse_ticket *ftick); +static int fticket_wait_answer(struct fuse_ticket *ftick); +static __inline__ int fticket_aw_pull_uio(struct fuse_ticket *ftick, + struct uio *uio); +static __inline__ void fuse_push_freeticks(struct fuse_ticket *ftick); static __inline__ struct fuse_ticket * fuse_pop_freeticks(struct fuse_data *data); -static __inline__ void fuse_push_allticks(struct fuse_ticket *tick); -static __inline__ void fuse_remove_allticks(struct fuse_ticket *tick); +static __inline__ void fuse_push_allticks(struct fuse_ticket *ftick); +static __inline__ void fuse_remove_allticks(struct fuse_ticket *ftick); static struct fuse_ticket *fuse_pop_allticks(struct fuse_data *data); -static int fuse_body_audit(struct fuse_ticket *tick, size_t blen); +static int fuse_body_audit(struct fuse_ticket *ftick, size_t blen); static __inline__ void fuse_setup_ihead(struct fuse_in_header *ihead, - struct fuse_ticket *tick, uint64_t nid, - enum fuse_opcode op, size_t blen, - pid_t pid, struct ucred *cred); -static fuse_handler_t fuse_standard_handler; + struct fuse_ticket *ftick, + uint64_t nid, + enum fuse_opcode op, + size_t blen, + pid_t pid, + struct ucred *cred); + +static fuse_handler_t fuse_standard_handler; SYSCTL_NODE(_vfs, OID_AUTO, fuse, CTLFLAG_RW, 0, "FUSE tunables"); SYSCTL_STRING(_vfs_fuse, OID_AUTO, fuse4bsd_version, CTLFLAG_RD, @@ -76,11 +81,15 @@ void fiov_init(struct fuse_iov *fiov, size_t size) { + uint32_t msize = FU_AT_LEAST(size); + debug_printf("fiov=%p, size=%zd\n", fiov, size); fiov->len = 0; - fiov->base = malloc(FU_AT_LEAST(size), M_FUSEMSG, M_WAITOK | M_ZERO); - fiov->allocated_size = FU_AT_LEAST(size); + + fiov->base = malloc(msize, M_FUSEMSG, M_WAITOK | M_ZERO); + + fiov->allocated_size = msize; fiov->credit = fuse_iov_credit; } @@ -124,172 +133,149 @@ fiov_adjust(fiov, 0); } -/* - * Tickets are carriers of communication with a fuse daemon. - * Tickets have a unique id, which should be kept unique - * among synchronously used tickets. The everyday routine: - * + Syscall handler gets one by fuse_ticket_fetch() - * (then, behind the scenes, either a fresh one is allocated - * or a cached old one is put into use again) - * + Sets up data to be passed to the daemon - * (there is a message node attached to the ticket) - * + If she knows that answer will come, sets up the callback node - * attached to the ticket, and enqueues it to the callback nodes' list - * + enqueues the message and kicks fusedev_read() - * + if daemon gives a proper answer, it will contain the unique id, by which - * fusedev_write() can pick the pre-prepared callback node and run it. - * There is the standard callback handler which just awakes the syscall - * handler who then waits for the response, deal with it by herself. - * Another option is to write a full-fledged callback handler which does all - * data processing within fusedev_write()'s thread (although we never do - * this). Or, if the answer is uninteresting, a NULL handler can be used. - * + After answer has been consumed, the handler or anyone to whom the control - * has been passed supposed to call ticket_drop() - * (then, behind the scenes, either the ticket is destroyed, or put into - * cache) - */ - static struct fuse_ticket * fticket_alloc(struct fuse_data *data) { - struct fuse_ticket *tick; + struct fuse_ticket *ftick; debug_printf("data=%p\n", data); - tick = malloc(sizeof(*tick), M_FUSEMSG, M_WAITOK | M_ZERO); + ftick = malloc(sizeof(*ftick), M_FUSEMSG, M_WAITOK | M_ZERO); >>> TRUNCATED FOR MAIL (1000 lines) <<< From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:51:17 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7DFD31065804; Sun, 26 Jun 2011 09:51:17 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A97FF10656D3 for ; Sun, 26 Jun 2011 09:51:16 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 96E148FC1C for ; Sun, 26 Jun 2011 09:51:16 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9pGmS012523 for ; Sun, 26 Jun 2011 09:51:16 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9pGTg012520 for perforce@freebsd.org; Sun, 26 Jun 2011 09:51:16 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:51:16 GMT Message-Id: <201106260951.p5Q9pGTg012520@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195352 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:51:17 -0000 http://p4web.freebsd.org/@@195352?ac=10 Change 195352 by ilya@ilya_triton2011 on 2011/06/26 09:50:46 Add fuse_lck_mtx_lock macros Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#13 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#25 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#9 (text+ko) ==== @@ -105,8 +105,8 @@ #if USE_FUSE_LOCK extern struct mtx fuse_mtx; -#define FUSE_LOCK() mtx_lock(&fuse_mtx) -#define FUSE_UNLOCK() mtx_unlock(&fuse_mtx) +#define FUSE_LOCK() fuse_lck_mtx_lock(fuse_mtx) +#define FUSE_UNLOCK() fuse_lck_mtx_unlock(fuse_mtx) #else #define FUSE_LOCK() #define FUSE_UNLOCK() @@ -142,6 +142,10 @@ #define FUSE_DEBUG_IPC 0 #endif +#ifndef FUSE_DEBUG_LOCK +#define FUSE_DEBUG_LOCK 0 +#endif + #ifndef FUSE_DEBUG_VFSOPS #define FUSE_DEBUG_VFSOPS 0 #endif @@ -158,3 +162,19 @@ if (((cond))) { \ printf("%s: " fmt, __func__, ## __VA_ARGS__); \ } } while (0) + +#define fuse_lck_mtx_lock(mtx) do { \ + DEBUGX(FUSE_DEBUG_LOCK, "0: lock(%s): %s@%d by %d\n", \ + __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ + mtx_lock(&(mtx)); \ + DEBUGX(FUSE_DEBUG_LOCK, "1: lock(%s): %s@%d by %d\n", \ + __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ + } while (0) + +#define fuse_lck_mtx_unlock(mtx) do { \ + DEBUGX(FUSE_DEBUG_LOCK, "0: unlock(%s): %s@%d by %d\n", \ + __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ + mtx_unlock(&(mtx)); \ + DEBUGX(FUSE_DEBUG_LOCK, "1: unlock(%s): %s@%d by %d\n", \ + __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ + } while (0) ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_device.c#8 (text+ko) ==== @@ -100,19 +100,19 @@ */ #if DO_GIANT_MANUALLY - mtx_lock(&Giant); + fuse_lck_mtx_lock(Giant); #endif if (fuse_useco < 0) { /* Module unload is going on */ #if DO_GIANT_MANUALLY - mtx_unlock(&Giant); + fuse_lck_mtx_unlock(Giant); #endif DEBUG("caught in the middle of unload\n"); return (ENOENT); } #if DO_GIANT_MANUALLY && USE_FUSE_LOCK fuse_useco++; - mtx_unlock(&Giant); + fuse_lck_mtx_unlock(Giant); #endif if (dev->si_usecount > 1) @@ -136,7 +136,7 @@ } FUSE_UNLOCK(); #if DO_GIANT_MANUALLY && ! USE_FUSE_LOCK - mtx_unlock(&Giant); + fuse_lck_mtx_unlock(Giant); #endif DEBUG("%s: device opened by thread %d.\n", dev->si_name, td->td_tid); @@ -148,7 +148,7 @@ #if USE_FUSE_LOCK fuse_useco--; #else - mtx_unlock(&Giant); + fuse_lck_mtx_unlock(Giant); #endif #endif return (EBUSY); @@ -160,7 +160,7 @@ struct fuse_data *data; #if DO_GIANT_MANUALLY && ! USE_FUSE_LOCK - mtx_lock(&Giant); + fuse_lck_mtx_lock(Giant); #endif FUSE_LOCK(); data = fuse_get_devdata(dev); @@ -170,7 +170,7 @@ ("fuse device is already closed upon close")); fdata_set_dead(data); data->dataflags &= ~FSESS_OPENED; - mtx_lock(&data->aw_mtx); + fuse_lck_mtx_lock(data->aw_mtx); /* wakup poll()ers */ selwakeuppri(&data->ks_rsel, PZERO + 1); @@ -181,13 +181,13 @@ /* Don't let syscall handlers wait in vain */ while ((tick = fuse_aw_pop(data))) { - mtx_lock(&tick->tk_aw_mtx); + fuse_lck_mtx_lock(tick->tk_aw_mtx); fticket_set_answered(tick); tick->tk_aw_errno = ENOTCONN; wakeup(tick); - mtx_unlock(&tick->tk_aw_mtx); + fuse_lck_mtx_unlock(tick->tk_aw_mtx); } - mtx_unlock(&data->aw_mtx); + fuse_lck_mtx_unlock(data->aw_mtx); FUSE_UNLOCK(); goto out; @@ -199,7 +199,7 @@ out: #if DO_GIANT_MANUALLY && ! USE_FUSE_LOCK - mtx_unlock(&Giant); + fuse_lck_mtx_unlock(Giant); #endif fuse_useco--; @@ -216,12 +216,12 @@ data = fuse_get_devdata(dev); if (events & (POLLIN | POLLRDNORM)) { - mtx_lock(&data->ms_mtx); + fuse_lck_mtx_lock(data->ms_mtx); if (fdata_get_dead(data) || STAILQ_FIRST(&data->ms_head)) revents |= events & (POLLIN | POLLRDNORM); else selrecord(td, &data->ks_rsel); - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); } if (events & (POLLOUT | POLLWRNORM)) { @@ -250,11 +250,11 @@ DEBUG("fuse device being read on thread %d\n", uio->uio_td->td_tid); - mtx_lock(&data->ms_mtx); + fuse_lck_mtx_lock(data->ms_mtx); again: if (fdata_get_dead(data)) { DEBUG2G("we know early on that reader should be kicked so we don't wait for news\n"); - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); return (ENODEV); } @@ -262,13 +262,13 @@ /* check if we may block */ if (ioflag & O_NONBLOCK) { /* get outa here soon */ - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); return (EAGAIN); } else { err = msleep(data, &data->ms_mtx, PCATCH, "fu_msg", 0); if (err != 0) { - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); return (fdata_get_dead(data) ? ENODEV : err); } tick = fuse_ms_pop(data); @@ -284,7 +284,7 @@ DEBUG("no message on thread #%d\n", uio->uio_td->td_tid); goto again; } - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); if (fdata_get_dead(data)) { /* @@ -418,7 +418,7 @@ /* Pass stuff over to callback if there is one installed */ /* Looking for ticket with the unique id of header */ - mtx_lock(&data->aw_mtx); + fuse_lck_mtx_lock(data->aw_mtx); TAILQ_FOREACH_SAFE(tick, &data->aw_head, tk_aw_link, x_tick) { DEBUG("bumped into callback #%llu\n", @@ -429,7 +429,7 @@ break; } } - mtx_unlock(&data->aw_mtx); + fuse_lck_mtx_unlock(data->aw_mtx); if (found) { if (tick->tk_aw_handler) { ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#13 (text+ko) ==== @@ -621,10 +621,10 @@ fdata_set_dead(data); } - mtx_lock(&data->ticket_mtx); + fuse_lck_mtx_lock(data->ticket_mtx); data->dataflags |= FSESS_INITED; wakeup(&data->ticketer); - mtx_unlock(&data->ticket_mtx); + fuse_lck_mtx_unlock(data->ticket_mtx); return 0; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_ipc.c#8 (text+ko) ==== @@ -197,7 +197,7 @@ int err = 0; debug_printf("ftick=%p\n", ftick); - mtx_lock(&ftick->tk_aw_mtx); + fuse_lck_mtx_lock(ftick->tk_aw_mtx); if (fticket_answered(ftick)) { goto out; @@ -212,7 +212,7 @@ err = msleep(ftick, &ftick->tk_aw_mtx, PCATCH, "fu_ans", 0); out: - mtx_unlock(&ftick->tk_aw_mtx); + fuse_lck_mtx_unlock(ftick->tk_aw_mtx); if (!(err || fticket_answered(ftick))) { debug_printf("FUSE: requester was woken up but still no answer"); @@ -346,20 +346,20 @@ { debug_printf("data=%p\n", data); - mtx_lock(&data->ms_mtx); + fuse_lck_mtx_lock(data->ms_mtx); if (fdata_get_dead(data)) { - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); return; } data->dataflags |= FSESS_DEAD; wakeup_one(data); selwakeuppri(&data->ks_rsel, PZERO + 1); - mtx_unlock(&data->ms_mtx); + fuse_lck_mtx_unlock(data->ms_mtx); - mtx_lock(&data->ticket_mtx); + fuse_lck_mtx_lock(data->ticket_mtx); wakeup(&data->ticketer); - mtx_unlock(&data->ticket_mtx); + fuse_lck_mtx_unlock(data->ticket_mtx); } static __inline__ @@ -435,15 +435,15 @@ debug_printf("data=%p\n", data); - mtx_lock(&data->ticket_mtx); + fuse_lck_mtx_lock(data->ticket_mtx); if (data->freeticket_counter == 0) { - mtx_unlock(&data->ticket_mtx); + fuse_lck_mtx_unlock(data->ticket_mtx); ftick = fticket_alloc(data); if (!ftick) { panic("ticket allocation failed"); } - mtx_lock(&data->ticket_mtx); + fuse_lck_mtx_lock(data->ticket_mtx); fuse_push_allticks(ftick); } else { /* locked here */ @@ -457,7 +457,7 @@ err = msleep(&data->ticketer, &data->ticket_mtx, PCATCH | PDROP, "fu_ini", 0); } else { - mtx_unlock(&data->ticket_mtx); + fuse_lck_mtx_unlock(data->ticket_mtx); } if (err) { @@ -474,26 +474,26 @@ debug_printf("ftick=%p\n", ftick); - mtx_lock(&ftick->tk_data->ticket_mtx); + fuse_lck_mtx_lock(ftick->tk_data->ticket_mtx); if (fuse_max_freetickets >= 0 && fuse_max_freetickets <= ftick->tk_data->freeticket_counter) { die = 1; } else { - mtx_unlock(&ftick->tk_data->ticket_mtx); + fuse_lck_mtx_unlock(ftick->tk_data->ticket_mtx); fticket_refresh(ftick); - mtx_lock(&ftick->tk_data->ticket_mtx); + fuse_lck_mtx_lock(ftick->tk_data->ticket_mtx); } /* locked here */ if (die) { fuse_remove_allticks(ftick); - mtx_unlock(&ftick->tk_data->ticket_mtx); + fuse_lck_mtx_unlock(ftick->tk_data->ticket_mtx); fticket_destroy(ftick); } else { fuse_push_freeticks(ftick); - mtx_unlock(&ftick->tk_data->ticket_mtx); + fuse_lck_mtx_unlock(ftick->tk_data->ticket_mtx); } } @@ -518,9 +518,9 @@ ftick->tk_aw_handler = handler; - mtx_lock(&ftick->tk_data->aw_mtx); + fuse_lck_mtx_lock(ftick->tk_data->aw_mtx); fuse_aw_push(ftick); - mtx_unlock(&ftick->tk_data->aw_mtx); + fuse_lck_mtx_unlock(ftick->tk_data->aw_mtx); } void @@ -538,11 +538,11 @@ return; } - mtx_lock(&ftick->tk_data->ms_mtx); + fuse_lck_mtx_lock(ftick->tk_data->ms_mtx); fuse_ms_push(ftick); wakeup_one(ftick->tk_data); selwakeuppri(&ftick->tk_data->ks_rsel, PZERO + 1); - mtx_unlock(&ftick->tk_data->ms_mtx); + fuse_lck_mtx_unlock(ftick->tk_data->ms_mtx); } static int @@ -752,7 +752,7 @@ err = fticket_pull(ftick, uio); - mtx_lock(&ftick->tk_aw_mtx); + fuse_lck_mtx_lock(ftick->tk_aw_mtx); if (fticket_answered(ftick)) { /* The requester was interrupted and she set the "answered" flag @@ -766,7 +766,7 @@ wakeup(ftick); } - mtx_unlock(&ftick->tk_aw_mtx); + fuse_lck_mtx_unlock(ftick->tk_aw_mtx); if (dropflag) { fuse_ticket_drop(ftick); @@ -848,7 +848,7 @@ debug_printf("IPC: interrupted, err = %d\n", err); - mtx_lock(&fdip->tick->tk_aw_mtx); + fuse_lck_mtx_lock(fdip->tick->tk_aw_mtx); if (fticket_answered(fdip->tick)) { /* @@ -857,7 +857,7 @@ * So we drop the ticket and exit as usual. */ debug_printf("IPC: already answered\n"); - mtx_unlock(&fdip->tick->tk_aw_mtx); + fuse_lck_mtx_unlock(fdip->tick->tk_aw_mtx); goto out; } else { /* @@ -868,7 +868,7 @@ debug_printf("IPC: setting to answered\n"); age = fdip->tick->tk_age; fticket_set_answered(fdip->tick); - mtx_unlock(&fdip->tick->tk_aw_mtx); + fuse_lck_mtx_unlock(fdip->tick->tk_aw_mtx); #ifndef DONT_TRY_HARD_PREVENT_IO_IN_VAIN /* * If we are willing to pay with one more locking, we @@ -878,7 +878,7 @@ * won't even be called. (No guarantee though for * being fast.) */ - mtx_lock(&fdip->tick->tk_data->aw_mtx); + fuse_lck_mtx_lock(fdip->tick->tk_data->aw_mtx); TAILQ_FOREACH(tick, &fdip->tick->tk_data->aw_head, tk_aw_link) { if (tick == fdip->tick) { if (fdip->tick->tk_age == age) { @@ -889,7 +889,7 @@ } } - mtx_unlock(&fdip->tick->tk_data->aw_mtx); + fuse_lck_mtx_unlock(fdip->tick->tk_data->aw_mtx); #endif return err; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#25 (text+ko) ==== @@ -1151,7 +1151,7 @@ if (!isdir && (fvdat->flag & FN_CREATING)) { - mtx_lock(&fvdat->createlock); + fuse_lck_mtx_lock(fvdat->createlock); if (fvdat->flag & FN_CREATING) { // check again if (fvdat->creator == curthread->td_tid) { @@ -1180,7 +1180,7 @@ fvdat->flag &= ~FN_CREATING; - mtx_unlock(&fvdat->createlock); + fuse_lck_mtx_unlock(fvdat->createlock); wakeup((caddr_t)&fvdat->creator); // wake up all goto ok; /* return 0 */ } else { @@ -1203,7 +1203,7 @@ } } } else { - mtx_unlock(&fvdat->createlock); + fuse_lck_mtx_unlock(fvdat->createlock); /* Can proceed from here. */ } } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:52:22 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E8FFE1065670; Sun, 26 Jun 2011 09:52:21 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AA4B9106567E for ; Sun, 26 Jun 2011 09:52:21 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 972128FC19 for ; Sun, 26 Jun 2011 09:52:21 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9qL2Y012560 for ; Sun, 26 Jun 2011 09:52:21 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9qLij012557 for perforce@freebsd.org; Sun, 26 Jun 2011 09:52:21 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:52:21 GMT Message-Id: <201106260952.p5Q9qLij012557@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195353 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:52:22 -0000 http://p4web.freebsd.org/@@195353?ac=10 Change 195353 by ilya@ilya_triton2011 on 2011/06/26 09:51:38 Filehandle rewrite. Don't try to count opened filehandles, perform close in vop_inactive. Remove unused flags and structure members. Use sx lock and condvar to serialize creation. Add fuse_vnode_open to initialize vnode after open Assert at least one handle is opened in vnop_close Add enum fuse_op_waitfor Partial merge http://macfuse.googlecode.com/svn/trunk@549 Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#10 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#6 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#4 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#12 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#10 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#26 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse.h#10 (text+ko) ==== @@ -178,3 +178,8 @@ DEBUGX(FUSE_DEBUG_LOCK, "1: unlock(%s): %s@%d by %d\n", \ __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ } while (0) + +typedef enum fuse_op_waitfor { + FUSE_OP_BACKGROUNDED = 0, + FUSE_OP_FOREGROUNDED = 1, +} fuse_op_waitfor_t; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#6 (text+ko) ==== @@ -37,33 +37,35 @@ &fuse_fh_upcall_count, 0, ""); int -fuse_filehandle_get(struct vnode *vp, - struct thread *td, - struct ucred *cred, - fufh_type_t fufh_type) +fuse_filehandle_open(struct vnode *vp, + fufh_type_t fufh_type, + struct fuse_filehandle **fufhp, + struct thread *td, + struct ucred *cred) { struct fuse_dispatcher fdi; struct fuse_open_in *foi; struct fuse_open_out *foo; - struct fuse_filehandle *fufh; - struct fuse_vnode_data *fvdat = VTOFUD(vp); int err = 0; int isdir = 0; - int oflags = fuse_filehandle_xlate_to_oflags(fufh_type); + int oflags = 0; int op = FUSE_OPEN; fuse_trace_printf("fuse_filehandle_get(vp=%p, fufh_type=%d)\n", vp, fufh_type); - fufh = &(fvdat->fufh[fufh_type]); - - if (fufh->fufh_flags & FUFH_VALID) { - printf("FUSE: filehandle_get called despite valid fufh (type=%d)", + if (fuse_filehandle_valid(vp, fufh_type)) { + panic("FUSE: filehandle_get called despite valid fufh (type=%d)", fufh_type); - return 0; + /* NOTREACHED */ } + /* + * Note that this means we are effectively FILTERING OUT open() flags. + */ + oflags = fuse_filehandle_xlate_to_oflags(fufh_type); + if (vnode_isdir(vp)) { isdir = 1; op = FUSE_OPENDIR; @@ -87,12 +89,8 @@ foo = fdi.answ; - fufh->fh_id = foo->fh; - fufh->fufh_flags |= (0 | FUFH_VALID); - fufh->open_count = 1; - fufh->open_flags = oflags; - fufh->fuse_open_flags = foo->open_flags; - fufh->type = fufh_type; + fuse_filehandle_init(vp, fufh_type, fufhp, foo->fh); + fuse_vnode_open(vp, foo->open_flags, td); fuse_ticket_drop(fdi.tick); @@ -100,8 +98,11 @@ } int -fuse_filehandle_put(struct vnode *vp, struct thread *td, struct ucred *cred, fufh_type_t fufh_type, - int foregrounded) +fuse_filehandle_close(struct vnode *vp, + fufh_type_t fufh_type, + struct thread *td, + struct ucred *cred, + fuse_op_waitfor_t waitfor) { struct fuse_dispatcher fdi; struct fuse_release_in *fri; @@ -116,21 +117,12 @@ vp, fufh_type); fufh = &(fvdat->fufh[fufh_type]); - if (!(fufh->fufh_flags & FUFH_VALID)) { - printf("trying to put invalid filehandle?\n"); - return 0; - } - - if (fufh->open_count != 0) { - panic("FUSE: filehandle_put called on a valid fufh (type=%d)", + if (!FUFH_IS_VALID(fufh)) { + panic("FUSE: filehandle_put called on invalid fufh (type=%d)", fufh_type); /* NOTREACHED */ } - if (fufh->fufh_flags & FUFH_MAPPED) { - panic("trying to put mapped fufh\n"); - } - if (vnode_isdir(vp)) { op = FUSE_RELEASEDIR; isdir = 1; @@ -140,9 +132,9 @@ fdisp_make_vp(&fdi, op, vp, td, cred); fri = fdi.indata; fri->fh = fufh->fh_id; - fri->flags = fufh->open_flags; + fri->flags = fuse_filehandle_xlate_to_oflags(fufh_type); - if (foregrounded) { + if (waitfor == FUSE_OP_FOREGROUNDED) { if ((err = fdisp_wait_answ(&fdi))) { goto out; } else { @@ -154,7 +146,71 @@ } out: - fufh->fufh_flags &= ~FUFH_VALID; + fufh->fh_id = (uint64_t)-1; + fufh->fh_type = FUFH_INVALID; return err; } + +int +fuse_filehandle_valid(struct vnode *vp, fufh_type_t fufh_type) +{ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_filehandle *fufh; + + fufh = &(fvdat->fufh[fufh_type]); + return FUFH_IS_VALID(fufh); +} + +int +fuse_filehandle_get(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp) +{ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_filehandle *fufh; + + fufh = &(fvdat->fufh[fufh_type]); + if (!FUFH_IS_VALID(fufh)) { + printf("FUSE: filehandle is not valid (type=%d)\n", fufh_type); + return EBADF; + } + if (fufhp != NULL) + *fufhp = fufh; + return 0; +} + +int +fuse_filehandle_getrw(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp) +{ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_filehandle *fufh; + + fufh = &(fvdat->fufh[fufh_type]); + if (!FUFH_IS_VALID(fufh)) { + fufh_type = FUFH_RDWR; + } + return fuse_filehandle_get(vp, fufh_type, fufhp); +} + +void +fuse_filehandle_init(struct vnode *vp, + fufh_type_t fufh_type, + struct fuse_filehandle **fufhp, + uint64_t fh_id) +{ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_filehandle *fufh; + + DEBUG("id=%jd type=%d\n", (intmax_t)fh_id, fufh_type); + fufh = &(fvdat->fufh[fufh_type]); + MPASS(!FUFH_IS_VALID(fufh)); + fufh->fh_id = fh_id; + fufh->fh_type = fufh_type; + if (!FUFH_IS_VALID(fufh)) { + panic("FUSE: init: invalid filehandle id (type=%d)", fufh_type); + } + + if (fufhp != NULL) + *fufhp = fufh; +} ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.h#4 (text+ko) ==== @@ -20,19 +20,12 @@ FUFH_MAXTYPE = 3, } fufh_type_t; -#define FUFH_VALID 0x00000001 -#define FUFH_MAPPED 0x00000002 -#define FUFH_STRATEGY 0x00000004 - struct fuse_filehandle { uint64_t fh_id; - int open_count; - int open_flags; - int fuse_open_flags; - fufh_type_t type; - int fufh_flags; + fufh_type_t fh_type; }; -typedef struct fuse_filehandle * fuse_filehandle_t; + +#define FUFH_IS_VALID(f) ((f)->fh_type != FUFH_INVALID) static __inline__ fufh_type_t @@ -91,9 +84,19 @@ return oflags; } -int fuse_filehandle_get(struct vnode *vp, struct thread *td, struct ucred *cred, - fufh_type_t fufh_type); -int fuse_filehandle_put(struct vnode *vp, struct thread *td, struct ucred *cred, - fufh_type_t fufh_type, int foregrounded); +int fuse_filehandle_valid(struct vnode *vp, fufh_type_t fufh_type); +int fuse_filehandle_get(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp); +int fuse_filehandle_getrw(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp); + +void fuse_filehandle_init(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp, uint64_t fh_id); +int fuse_filehandle_open(struct vnode *vp, fufh_type_t fufh_type, + struct fuse_filehandle **fufhp, struct thread *td, + struct ucred *cred); +int fuse_filehandle_close(struct vnode *vp, fufh_type_t fufh_type, + struct thread *td, struct ucred *cred, + fuse_op_waitfor_t waitfor); #endif /* _FUSE_FILE_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_io.c#12 (text+ko) ==== @@ -52,52 +52,6 @@ static fuse_buffeater_t fuse_std_buffeater; -static int -fuse_io_filehandle_get(struct vnode *vp, int rdonly, - struct ucred *cred, struct fuse_filehandle **fufhp) -{ - struct fuse_vnode_data *fvdat = VTOFUD(vp); - struct fuse_filehandle *fufh; - fufh_type_t fufh_type; - int err = 0; - - if (rdonly) { - fufh_type = FUFH_RDONLY; // FUFH_RDWR will also do - } else { - fufh_type = FUFH_WRONLY; // FUFH_RDWR will also do - } - - fufh = &(fvdat->fufh[fufh_type]); - if (!(fufh->fufh_flags & FUFH_VALID)) { - fufh_type = FUFH_RDWR; - fufh = &(fvdat->fufh[fufh_type]); - if (!(fufh->fufh_flags & FUFH_VALID)) { - fufh = NULL; - } else { - debug_printf("strategy falling back to FUFH_RDWR ... OK\n"); - } - } - - if (fufh == NULL) { - if (rdonly) { - fufh_type = FUFH_RDONLY; - } else { - fufh_type = FUFH_RDWR; - } - err = fuse_filehandle_get(vp, NULL, cred, fufh_type); - if (!err) { - fufh = &(fvdat->fufh[fufh_type]); - debug_printf("STRATEGY: created *new* fufh of type %d\n", - fufh_type); - } - } else { - debug_printf("STRATEGY: using existing fufh of type %d\n", fufh_type); - } - - *fufhp = fufh; - return (err); -} - /**************** * * >>> Low level I/O routines and interface to them @@ -113,10 +67,12 @@ struct fuse_io_data fioda; int err, directio; - err = fuse_io_filehandle_get(vp, (uio->uio_rw == UIO_READ), - cred, &fufh); - if (err) - return (err); + err = fuse_filehandle_getrw(vp, + (uio->uio_rw == UIO_READ) ? FUFH_RDONLY : FUFH_WRONLY, &fufh); + if (err) { + DEBUG("fetching filehandle failed\n"); + return err; + } bzero(&fioda, sizeof(fioda)); fioda.vp = vp; @@ -780,13 +736,12 @@ cred = bp->b_iocmd == BIO_READ ? bp->b_rcred : bp->b_wcred; - err = fuse_io_filehandle_get(vp, (bp->b_iocmd == BIO_READ), - cred, &fufh); + err = fuse_filehandle_getrw(vp, + (bp->b_iocmd == BIO_READ) ? FUFH_RDONLY : FUFH_WRONLY, &fufh); if (err) { - DEBUG2G("fetching filehandle failed\n"); + DEBUG("fetching filehandle failed\n"); goto out; } - fufh->fufh_flags |= FUFH_STRATEGY; DEBUG2G("vp #%ju, fufh #%ju\n", (uintmax_t)VTOILLU(vp), (uintmax_t)fufh->fh_id); ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#8 (text+ko) ==== @@ -43,16 +43,22 @@ fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat, uint64_t nodeid, enum vtype vtyp) { + int i; + fvdat->nid = nodeid; if (nodeid == FUSE_ROOT_ID) { vp->v_vflag |= VV_ROOT; } vp->v_type = vtyp; vp->v_data = fvdat; - fvdat->creator = curthread->td_tid; - mtx_init(&fvdat->createlock, "fuse node create mutex", NULL, MTX_DEF); + fvdat->create_owner = curthread->td_tid; + cv_init(&fvdat->create_cv, "fuse node create cv"); + sx_init(&fvdat->create_lock, "fuse node create lock"); sx_init(&fvdat->nodelock, "fuse node sx lock"); sx_init(&fvdat->truncatelock, "fuse node truncate sx lock"); + + for (i = 0; i < FUFH_MAXTYPE; i++) + fvdat->fufh[i].fh_type = FUFH_INVALID; } void @@ -61,7 +67,8 @@ struct fuse_vnode_data *fvdat = vp->v_data; vp->v_data = NULL; - mtx_destroy(&fvdat->createlock); + cv_destroy(&fvdat->create_cv); + sx_destroy(&fvdat->create_lock); sx_destroy(&fvdat->nodelock); sx_destroy(&fvdat->truncatelock); free(fvdat, M_FUSEVN); @@ -176,3 +183,19 @@ return 0; } + +void +fuse_vnode_open(struct vnode *vp, int32_t fuse_open_flags, struct thread *td) +{ + /* + * Funcation is called for every vnode open. + * Merge fuse_open_flags it may be 0 + * + * XXXIP: Handle FOPEN_DIRECT_IO and FOPEN_KEEP_CACHE + */ + + if (vnode_vtype(vp) == VREG) { + /* XXXIP prevent getattr, by using cached node size */ + vnode_create_vobject(vp, 0, td); + } +} ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#10 (text+ko) ==== @@ -40,8 +40,9 @@ /** locking **/ - struct mtx createlock; - lwpid_t creator; + struct sx create_lock; + struct cv create_cv; + lwpid_t create_owner; /* * The nodelock must be held when data in the FUSE node is accessed or @@ -116,4 +117,8 @@ enum vtype vtyp, uint64_t size); +void fuse_vnode_open(struct vnode *vp, + int32_t fuse_open_flags, + struct thread *td); + #endif /* _FUSE_NODE_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#26 (text+ko) ==== @@ -184,9 +184,6 @@ int isdir = (vnode_isdir(vp)) ? 1 : 0; fufh_type_t fufh_type; - struct fuse_vnode_data *fvdat = VTOFUD(vp); - struct fuse_filehandle *fufh = NULL; - fuse_trace_printf_vnop(); if (fuse_isdeadfs_nop(vp)) { @@ -199,16 +196,14 @@ fufh_type = fuse_filehandle_xlate_from_fflags(fflag); } - fufh = &(fvdat->fufh[fufh_type]); - - if (!(fufh->fufh_flags & FUFH_VALID)) { - panic("fufh type %d found to be invalid in close\n", fufh_type); - } - - fufh->open_count--; - - if ((fufh->open_count == 0) && !(fufh->fufh_flags & FUFH_MAPPED)) { - (void)fuse_filehandle_put(vp, NULL, NULL, fufh_type, 0); + if (!fuse_filehandle_valid(vp, fufh_type)) { + int i; + for (i = 0; i < FUFH_MAXTYPE; i++) + if (fuse_filehandle_valid(vp, i)) + break; + if (i == FUFH_MAXTYPE) + panic("FUSE: fufh type %d found to be invalid in close (fflag=0x%x)\n", + fufh_type, fflag); } return 0; @@ -334,29 +329,16 @@ return err; } + ASSERT_VOP_ELOCKED(*vpp, "fuse_vnop_create"); + fdip->answ = gone_good_old ? NULL : feo + 1; if (!gone_good_old) { - uint64_t x_fh_id = ((struct fuse_open_out *)(feo + 1))->fh; uint32_t x_open_flags = ((struct fuse_open_out *)(feo + 1))->open_flags; - struct fuse_vnode_data *fvdat = VTOFUD(*vpp); - struct fuse_filehandle *fufh = &(fvdat->fufh[FUFH_RDWR]); - fufh->fh_id = x_fh_id; - fufh->open_flags = x_open_flags; - -#if 0 - struct fuse_dispatcher x_fdi; - struct fuse_release_in *x_fri; - fdisp_init(&x_fdi, sizeof(*x_fri)); - fdisp_make_vp(&x_fdi, FUSE_RELEASE, *vpp, context); - x_fri = x_fdi.indata; - x_fri->fh = x_fh_id; - x_fri->flags = O_WRONLY; - fuse_insert_callback(x_fdi.tick, NULL); - fuse_insert_message(x_fdi.tick); -#endif + fuse_filehandle_init(*vpp, FUFH_RDWR, NULL, x_fh_id); + fuse_vnode_open(*vpp, x_open_flags, td); } return 0; @@ -415,7 +397,7 @@ fdisp_init(&fdi, 0); for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(fvdat->fufh[type]); - if (fufh->fufh_flags & FUFH_VALID) { + if (FUFH_IS_VALID(fufh)) { fuse_internal_fsync(vp, td, NULL, fufh, &fdi); } } @@ -549,10 +531,8 @@ for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(fvdat->fufh[type]); - if (fufh->fufh_flags & FUFH_VALID) { - fufh->fufh_flags &= ~FUFH_MAPPED; - fufh->open_count = 0; - (void)fuse_filehandle_put(vp, td, NULL, type, 0); + if (FUFH_IS_VALID(fufh)) { + fuse_filehandle_close(vp, type, td, NULL, FUSE_OP_BACKGROUNDED); } } @@ -1122,10 +1102,8 @@ fufh_type_t fufh_type; struct fuse_vnode_data *fvdat; - struct fuse_filehandle *fufh = NULL; - struct fuse_filehandle *fufh_rw = NULL; - int error, isdir = 0, oflags; + int error, isdir = 0; fuse_trace_printf_vnop(); @@ -1145,103 +1123,44 @@ fufh_type = fuse_filehandle_xlate_from_fflags(mode); } - oflags = fuse_filehandle_xlate_to_oflags(fufh_type); - - fufh = &(fvdat->fufh[fufh_type]); - if (!isdir && (fvdat->flag & FN_CREATING)) { - fuse_lck_mtx_lock(fvdat->createlock); + sx_xlock(&fvdat->create_lock); if (fvdat->flag & FN_CREATING) { // check again - if (fvdat->creator == curthread->td_tid) { - - /* - * For testing the race condition we want to prevent here, - * try something like the following: - * - * int dummyctr = 0; - * - * for (; dummyctr < 2048000000; dummyctr++); - */ - - fufh_rw = &(fvdat->fufh[FUFH_RDWR]); - - fufh->fufh_flags |= FUFH_VALID; - fufh->fufh_flags &= ~FUFH_MAPPED; - fufh->open_count = 1; - fufh->open_flags = oflags; - fufh->type = fufh_type; - - fufh->fh_id = fufh_rw->fh_id; - fufh->open_flags = fufh_rw->open_flags; - debug_printf("creator picked up stashed handle, moved to %d\n", - fufh_type); - + if (fvdat->create_owner == curthread->td_tid) { + fufh_type = FUFH_RDWR; + MPASS(fuse_filehandle_valid(vp, fufh_type)); fvdat->flag &= ~FN_CREATING; - - fuse_lck_mtx_unlock(fvdat->createlock); - wakeup((caddr_t)&fvdat->creator); // wake up all - goto ok; /* return 0 */ + sx_xunlock(&fvdat->create_lock); + cv_broadcast(&fvdat->create_cv); // wake up all + return 0; } else { debug_printf("contender going to sleep\n"); - error = msleep(&fvdat->creator, &fvdat->createlock, - PDROP | PINOD | PCATCH, "fuse_open", 0); - /* - * msleep will drop the mutex. since we have PDROP specified, - * it will NOT regrab the mutex when it returns. - */ + error = cv_wait_sig(&fvdat->create_cv, &fvdat->create_lock); debug_printf("contender awake (error = %d)\n", error); - if (error) { /* - * Since we specified PCATCH above, we'll be woken up in - * case a signal arrives. The value of error could be - * EINTR or ERESTART. + * We'll be woken up in case a signal arrives. + * The value of error could be EINTR or ERESTART. */ return error; } } } else { - fuse_lck_mtx_unlock(fvdat->createlock); + sx_xunlock(&fvdat->create_lock); /* Can proceed from here. */ } } - if (fufh->fufh_flags & FUFH_VALID) { - fufh->open_count++; - goto ok; /* return 0 */ + if (fuse_filehandle_valid(vp, fufh_type)) { + fuse_vnode_open(vp, 0, td); + return 0; } - error = fuse_filehandle_get(vp, td, cred, fufh_type); - if (error) { - return error; - } + error = fuse_filehandle_open(vp, fufh_type, NULL, td, cred); -ok: - if (vnode_vtype(vp) == VREG) { - /* XXXIP prevent getattr, by using cached node size */ - vnode_create_vobject(vp, 0, td); - } - - /* - * Doing this here because when a vnode goes inactive, things like - * no-cache and no-readahead are cleared by the kernel. - */ - - { -#ifdef XXXIP - int dataflags = fuse_get_mpdata(vnode_mount(vp))->dataflags; - if (dataflags & FSESS_NO_READAHEAD) { - vnode_setnoreadahead(vp); - } - if (dataflags & FSESS_NO_UBC) { - vnode_setnocache(vp); - } -#endif - } - - return 0; + return error; } /* @@ -1306,14 +1225,15 @@ fvdat = VTOFUD(vp); - fufh = &(fvdat->fufh[FUFH_RDONLY]); - - if (!(fufh->fufh_flags & FUFH_VALID)) { - err = fuse_filehandle_get(vp, NULL, cred, FUFH_RDONLY); - if (err) { - return err; - } - freefufh = 1; + if (!fuse_filehandle_valid(vp, FUFH_RDONLY)) { + DEBUG("calling readdir() before open()"); + err = fuse_filehandle_open(vp, FUFH_RDONLY, &fufh, NULL, cred); + freefufh = 1; + } else { + err = fuse_filehandle_get(vp, FUFH_RDONLY, &fufh); + } + if (err) { + return (err); } #define DIRCOOKEDSIZE FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + MAXNAMLEN + 1) @@ -1323,8 +1243,8 @@ fiov_teardown(&cookediov); if (freefufh) { - fufh->open_count--; - (void)fuse_filehandle_put(vp, NULL, NULL, FUFH_RDONLY, 0); + fuse_filehandle_close(vp, FUFH_RDONLY, NULL, cred, + FUSE_OP_FOREGROUNDED); } fuse_invalidate_attr(vp); @@ -1404,15 +1324,10 @@ for (type = 0; type < FUFH_MAXTYPE; type++) { fufh = &(fvdat->fufh[type]); - if (fufh->fufh_flags & FUFH_VALID) { - if (fufh->fufh_flags & FUFH_STRATEGY) { - fufh->fufh_flags &= ~FUFH_MAPPED; - fufh->open_count = 0; - (void)fuse_filehandle_put(vp, td, NULL, type, 0); - } else { - panic("vnode being reclaimed but fufh (type=%d) is valid", - type); - } + if (FUFH_IS_VALID(fufh)) { + printf("FUSE: vnode being reclaimed but fufh (type=%d) is valid", + type); + fuse_filehandle_close(vp, type, td, NULL, FUSE_OP_BACKGROUNDED); } } @@ -1636,8 +1551,6 @@ if (vap->va_size != VNOVAL) { struct fuse_filehandle *fufh = NULL; - fufh_type_t fufh_type = FUFH_WRONLY; - struct fuse_vnode_data *fvdat = VTOFUD(vp); // Truncate to a new value. fsai->FUSEATTR(size) = vap->va_size; @@ -1645,15 +1558,7 @@ newsize = vap->va_size; fsai->valid |= FATTR_SIZE; - fufh = &(fvdat->fufh[fufh_type]); - if (!(fufh->fufh_flags & FUFH_VALID)) { - fufh_type = FUFH_RDWR; - fufh = &(fvdat->fufh[fufh_type]); - if (!(fufh->fufh_flags & FUFH_VALID)) { - fufh = NULL; - } - } - + fuse_filehandle_getrw(vp, FUFH_WRONLY, &fufh); if (fufh) { fsai->fh = fufh->fh_id; fsai->valid |= FATTR_FH; From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:53:26 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4034C106566C; Sun, 26 Jun 2011 09:53:26 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DD67A106564A for ; Sun, 26 Jun 2011 09:53:25 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id CAEEB8FC08 for ; Sun, 26 Jun 2011 09:53:25 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9rPbp012595 for ; Sun, 26 Jun 2011 09:53:25 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9rPgZ012592 for perforce@freebsd.org; Sun, 26 Jun 2011 09:53:25 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:53:25 GMT Message-Id: <201106260953.p5Q9rPgZ012592@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195354 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:53:26 -0000 http://p4web.freebsd.org/@@195354?ac=10 Change 195354 by ilya@ilya_triton2011 on 2011/06/26 09:52:26 Invalidate attr and purge cache Merge http://macfuse.googlecode.com/svn/trunk@1469 Merge http://macfuse.googlecode.com/svn/trunk@1472 Partial merge http://macfuse.googlecode.com/svn/trunk@317 Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#7 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#14 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#27 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#7 (text+ko) ==== @@ -84,6 +84,12 @@ fuse_fh_upcall_count++; if ((err = fdisp_wait_answ(&fdi))) { debug_printf("OUCH ... daemon didn't give fh (err = %d)\n", err); + if (err == ENOENT) { + /* + * See comment in fuse_vnop_reclaim(). + */ + cache_purge(vp); + } return err; } @@ -148,6 +154,7 @@ out: fufh->fh_id = (uint64_t)-1; fufh->fh_type = FUFH_INVALID; + fuse_invalidate_attr(vp); return err; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#14 (text+ko) ==== @@ -88,7 +88,7 @@ int denied = fuse_match_cred(data->daemoncred, cred); if (denied) { - return EACCES; + return EPERM; } } facp->facc_flags |= FACCESS_NOCHECKSPY; @@ -150,7 +150,7 @@ if (err == ENOSYS) { fuse_get_mpdata(mp)->dataflags |= FSESS_NOACCESS; - err = 0; // ENOTSUP; + err = 0; } return err; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#27 (text+ko) ==== @@ -341,6 +341,10 @@ fuse_vnode_open(*vpp, x_open_flags, td); } + cache_purge_negative(dvp); + + fuse_ticket_drop(fdip->tick); + return 0; undo: @@ -1044,6 +1048,10 @@ err = fuse_internal_newentry(dvp, vpp, cnp, FUSE_MKDIR, &fmdi, sizeof(fmdi), VDIR); + if (err == 0) { + fuse_invalidate_attr(dvp); + } + return err; } @@ -1079,6 +1087,10 @@ err = fuse_internal_newentry(dvp, vpp, cnp, FUSE_MKNOD, &fmni, sizeof(fmni), vap->va_type); + if (err== 0) { + fuse_invalidate_attr(dvp); + } + return err; } @@ -1376,6 +1388,11 @@ err = fuse_internal_remove(dvp, vp, cnp, FUSE_UNLINK); + if (err == 0) { + cache_purge(vp); + fuse_invalidate_attr(dvp); + } + return err; } @@ -1424,10 +1441,24 @@ */ err = fuse_internal_rename(fdvp, fcnp, tdvp, tcnp); + if (err == 0) { + fuse_invalidate_attr(fdvp); + if (tdvp != fdvp) { + fuse_invalidate_attr(tdvp); + } + } + if (tvp != NULL && tvp != fvp) { cache_purge(tvp); } + if (vnode_isdir(fvp)) { + if ((tvp != NULL) && vnode_isdir(tvp)) { + cache_purge(tdvp); + } + cache_purge(fdvp); + } + out: if (tdvp == tvp) { vrele(tdvp); @@ -1472,6 +1503,10 @@ err = fuse_internal_remove(ap->a_dvp, ap->a_vp, ap->a_cnp, FUSE_RMDIR); + if (err == 0) { + fuse_invalidate_attr(dvp); + } + return err; } @@ -1722,7 +1757,10 @@ memcpy((char *)fdi.indata + cnp->cn_namelen + 1, target, len); err = fuse_internal_newentry_core(dvp, vpp, cnp, VLNK, &fdi); - fuse_invalidate_attr(dvp); + + if (err == 0) { + fuse_invalidate_attr(dvp); + } return err; } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:54:29 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D1300106566C; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 93599106564A for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 812158FC22 for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9sShU012632 for ; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9sS3M012629 for perforce@freebsd.org; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:54:28 GMT Message-Id: <201106260954.p5Q9sS3M012629@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195355 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:54:29 -0000 http://p4web.freebsd.org/@@195355?ac=10 Change 195355 by ilya@ilya_triton2011 on 2011/06/26 09:53:37 Add fuse_isdeadfs checks, check LINK_MAX in vnop_link, IO_NDELAY in vnop_close Handle not initialized session in vnop_access Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#8 (text+ko) ==== @@ -129,6 +129,10 @@ /* NOTREACHED */ } + if (fuse_isdeadfs(vp)) { + goto out; + } + if (vnode_isdir(vp)) { op = FUSE_RELEASEDIR; isdir = 1; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#14 (text+ko) ==== @@ -109,9 +109,8 @@ static __inline__ int -fuse_isdeadfs(struct vnode *vp) +fuse_isdeadfs_mp(struct mount *mp) { - struct mount *mp = vnode_mount(vp); struct fuse_data *data = fuse_get_mpdata(mp); return (data->dataflags & FSESS_DEAD); @@ -119,11 +118,16 @@ static __inline__ int -fuse_isdeadfs_mp(struct mount *mp) +fuse_isdeadfs(struct vnode *vp) { - struct fuse_data *data = fuse_get_mpdata(mp); + return fuse_isdeadfs_mp(vnode_mount(vp)); +} - return (data->dataflags & FSESS_DEAD); +static __inline__ +int +fuse_isdeadfs_fs(struct vnode *vp) +{ + return fuse_isdeadfs_mp(vnode_mount(vp)); } /* access */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_param.h#3 (text+ko) ==== @@ -47,4 +47,6 @@ #endif +#define FUSE_LINK_MAX LINK_MAX + #endif /* _FUSE_PARAM_H_ */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#28 (text+ko) ==== @@ -47,6 +47,7 @@ #include "fuse_internal.h" #include "fuse_ipc.h" #include "fuse_node.h" +#include "fuse_param.h" #include "fuse_io.h" #include @@ -140,9 +141,11 @@ { struct vnode *vp = ap->a_vp; int accmode = ap->a_accmode; + struct ucred *cred = ap->a_cred; struct fuse_access_param facp; struct fuse_vnode_data *fvdat = VTOFUD(vp); + struct fuse_data *data = fuse_get_mpdata(vnode_mount(vp)); fuse_trace_printf_vnop(); @@ -153,6 +156,16 @@ return EBADF; } + if (!(data->dataflags & FSESS_INITED)) { + if (vnode_isvroot(vp)) { + if (priv_check_cred(cred, PRIV_VFS_ADMIN, 0) || + (fuse_match_cred(data->daemoncred, cred) == 0)) { + return 0; + } + } + return EBADF; + } + if (vnode_islnk(vp)) { return 0; } @@ -186,7 +199,11 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { + return 0; + } + + if (fflag & IO_NDELAY) { return 0; } @@ -242,7 +259,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("FUSE: fuse_vnop_create(): called on a dead file system"); } @@ -386,7 +403,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return 0; } @@ -557,6 +574,8 @@ struct vnode *tdvp = ap->a_tdvp; struct componentname *cnp = ap->a_cnp; + struct vattr *vap = VTOVA(vp); + struct fuse_dispatcher fdi; struct fuse_entry_out *feo; struct fuse_link_in fli; @@ -565,14 +584,18 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { - panic("fuse_vnop_link(): called on a dead file system"); + if (fuse_isdeadfs_fs(vp)) { + panic("FUSE: fuse_vnop_link(): called on a dead file system"); } if (vnode_mount(tdvp) != vnode_mount(vp)) { return EXDEV; } + if (vap->va_nlink >= FUSE_LINK_MAX) { + return EMLINK; + } + fli.oldnodeid = VTOI(vp); fdisp_init(&fdi, 0); @@ -1039,7 +1062,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("FUSE: fuse_vnop_mkdir(): called on a dead file system"); } @@ -1077,7 +1100,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(dvp)) { + if (fuse_isdeadfs_fs(dvp)) { panic("fuse_vnop_mknod(): called on a dead file system"); } @@ -1193,7 +1216,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EIO; } @@ -1226,7 +1249,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1283,7 +1306,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1376,7 +1399,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs_fs(vp)) { panic("FUSE: fuse_vnop_remove(): called on a dead file system"); } @@ -1420,8 +1443,8 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(fdvp)) { - panic("fuse_vnop_rename(): called on a dead file system"); + if (fuse_isdeadfs_fs(fdvp)) { + panic("FUSE: fuse_vnop_rename(): called on a dead file system"); } if (fvp->v_mount != tdvp->v_mount || @@ -1491,8 +1514,8 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(ap->a_vp)) { - panic("fuse_vnop_rmdir(): called on a dead file system"); + if (fuse_isdeadfs_fs(vp)) { + panic("FUSE: fuse_vnop_rmdir(): called on a dead file system"); } if (VTOFUD(vp) == VTOFUD(dvp)) { @@ -1555,7 +1578,7 @@ * ... */ - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EBADF; } @@ -1740,6 +1763,10 @@ int err; size_t len; + if (fuse_isdeadfs_fs(dvp)) { + panic("FUSE: fuse_vnop_symlink(): called on a dead file system"); + } + /* * Unlike the other creator type calls, here we have to create a message * where the name of the new entry comes first, and the data describing @@ -1783,7 +1810,7 @@ fuse_trace_printf_vnop(); - if (fuse_isdeadfs_nop(vp)) { + if (fuse_isdeadfs(vp)) { return EIO; } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:54:29 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 478CA106579A; Sun, 26 Jun 2011 09:54:29 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B4E4F1065672 for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id A2AAA8FC23 for ; Sun, 26 Jun 2011 09:54:28 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9sSMR012638 for ; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9sSAl012635 for perforce@freebsd.org; Sun, 26 Jun 2011 09:54:28 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:54:28 GMT Message-Id: <201106260954.p5Q9sSAl012635@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195356 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:54:29 -0000 http://p4web.freebsd.org/@@195356?ac=10 Change 195356 by ilya@ilya_triton2011 on 2011/06/26 09:54:25 Add filehandle_count and node_count sysctls. Use atomic operations to increment sysctl values. Replace uint64_t with long Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#9 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#29 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#9 (text+ko) ==== @@ -32,9 +32,9 @@ #define FUSE_DEBUG_MODULE FILE #include "fuse_debug.h" -static uint64_t fuse_fh_upcall_count = 0; -SYSCTL_QUAD(_vfs_fuse, OID_AUTO, fh_upcall_count, CTLFLAG_RD, - &fuse_fh_upcall_count, 0, ""); +static int fuse_fh_count = 0; +SYSCTL_INT(_vfs_fuse, OID_AUTO, filehandle_count, CTLFLAG_RD, + &fuse_fh_count, 0, ""); int fuse_filehandle_open(struct vnode *vp, @@ -81,7 +81,6 @@ foi = fdi.indata; foi->flags = oflags; - fuse_fh_upcall_count++; if ((err = fdisp_wait_answ(&fdi))) { debug_printf("OUCH ... daemon didn't give fh (err = %d)\n", err); if (err == ENOENT) { @@ -156,6 +155,7 @@ } out: + atomic_add_acq_int(&fuse_fh_count, -1); fufh->fh_id = (uint64_t)-1; fufh->fh_type = FUFH_INVALID; fuse_invalidate_attr(vp); @@ -224,4 +224,6 @@ if (fufhp != NULL) *fufhp = fufh; + + atomic_add_acq_int(&fuse_fh_count, 1); } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#9 (text+ko) ==== @@ -39,6 +39,10 @@ MALLOC_DEFINE(M_FUSEVN, "fuse_vnode", "fuse vnode private data"); +static int fuse_node_count = 0; +SYSCTL_INT(_vfs_fuse, OID_AUTO, node_count, CTLFLAG_RD, + &fuse_node_count, 0, ""); + static void fuse_vnode_init(struct vnode *vp, struct fuse_vnode_data *fvdat, uint64_t nodeid, enum vtype vtyp) @@ -59,6 +63,8 @@ for (i = 0; i < FUFH_MAXTYPE; i++) fvdat->fufh[i].fh_type = FUFH_INVALID; + + atomic_add_acq_int(&fuse_node_count, 1); } void @@ -72,6 +78,8 @@ sx_destroy(&fvdat->nodelock); sx_destroy(&fvdat->truncatelock); free(fvdat, M_FUSEVN); + + atomic_add_acq_int(&fuse_node_count, -1); } static int ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#29 (text+ko) ==== @@ -114,13 +114,13 @@ .vop_unlock = fuse_vnop_unlock, }; -static uint64_t fuse_lookup_cache_hits = 0; -SYSCTL_QUAD(_vfs_fuse, OID_AUTO, lookup_cache_hits, CTLFLAG_RD, - &fuse_lookup_cache_hits, 0, ""); +static u_long fuse_lookup_cache_hits = 0; +SYSCTL_ULONG(_vfs_fuse, OID_AUTO, lookup_cache_hits, CTLFLAG_RD, + &fuse_lookup_cache_hits, 0, ""); -static uint64_t fuse_lookup_cache_misses = 0; -SYSCTL_QUAD(_vfs_fuse, OID_AUTO, lookup_cache_misses, CTLFLAG_RD, - &fuse_lookup_cache_misses, 0, ""); +static u_long fuse_lookup_cache_misses = 0; +SYSCTL_ULONG(_vfs_fuse, OID_AUTO, lookup_cache_misses, CTLFLAG_RD, + &fuse_lookup_cache_misses, 0, ""); int fuse_pbuf_freecnt = -1; @@ -700,11 +700,11 @@ switch (err) { case -1: /* positive match */ - fuse_lookup_cache_hits++; + atomic_add_acq_long(&fuse_lookup_cache_hits, 1); return 0; case 0: /* no match in cache */ - fuse_lookup_cache_misses++; + atomic_add_acq_long(&fuse_lookup_cache_misses, 1); break; case ENOENT: /* negative match */ From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:55:35 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 77F181065670; Sun, 26 Jun 2011 09:55:35 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3A48F106564A for ; Sun, 26 Jun 2011 09:55:35 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 281B88FC0A for ; Sun, 26 Jun 2011 09:55:35 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9tZUD012690 for ; Sun, 26 Jun 2011 09:55:35 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9tZ62012687 for perforce@freebsd.org; Sun, 26 Jun 2011 09:55:35 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:55:35 GMT Message-Id: <201106260955.p5Q9tZ62012687@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195357 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:55:35 -0000 http://p4web.freebsd.org/@@195357?ac=10 Change 195357 by ilya@ilya_triton2011 on 2011/06/26 09:55:25 Always allocate vnode with exclusive lock Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#10 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#10 (text+ko) ==== @@ -99,9 +99,9 @@ struct thread *td, uint64_t nodeid, enum vtype vtyp, - int lkflags, struct vnode **vpp) { + const int lkflags = LK_EXCLUSIVE | LK_RETRY; struct fuse_vnode_data *fvdat; struct vnode *vp2; int err = 0; @@ -124,8 +124,6 @@ return (0); } - lkflags = LK_EXCLUSIVE | LK_RETRY; /* XXXIP don't loose other flags */ - fvdat = malloc(sizeof(*fvdat), M_FUSEVN, M_WAITOK | M_ZERO); err = getnewvnode("fuse", mp, &fuse_vnops, vpp); if (err) { @@ -135,8 +133,11 @@ vn_lock(*vpp, lkflags); err = insmntque(*vpp, mp); + ASSERT_VOP_ELOCKED(*vpp, "fuse_vnode_alloc"); if (err) { + VOP_UNLOCK(*vpp, 0); free(fvdat, M_FUSEVN); + *vpp = NULL; return (err); } @@ -145,6 +146,7 @@ td, &vp2, fuse_vnode_cmp, &nodeid); if (err) { + VOP_UNLOCK(*vpp, 0); fuse_vnode_destroy(*vpp); *vpp = NULL; return (err); @@ -156,6 +158,7 @@ */ KASSERT(vp2 == NULL, ("vfs hash collision for node #%ju\n", (uintmax_t)nodeid)); + ASSERT_VOP_ELOCKED(*vpp, "fuse_vnode_alloc"); return (0); } @@ -174,7 +177,7 @@ debug_printf("dvp=%p\n", dvp); - err = fuse_vnode_alloc(mp, td, nodeid, vtyp, LK_EXCLUSIVE | LK_RETRY, vpp); + err = fuse_vnode_alloc(mp, td, nodeid, vtyp, vpp); if (err) { return err; } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:57:47 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DC5BE1065672; Sun, 26 Jun 2011 09:57:46 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 924C81065670 for ; Sun, 26 Jun 2011 09:57:46 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 802B18FC08 for ; Sun, 26 Jun 2011 09:57:46 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9vkLY012749 for ; Sun, 26 Jun 2011 09:57:46 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9vkbn012746 for perforce@freebsd.org; Sun, 26 Jun 2011 09:57:46 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:57:46 GMT Message-Id: <201106260957.p5Q9vkbn012746@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195358 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:57:47 -0000 http://p4web.freebsd.org/@@195358?ac=10 Change 195358 by ilya@ilya_triton2011 on 2011/06/26 09:56:46 Add lookup_cache_enable sysctl Check dvp != NULL before calling cache_enter Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#11 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#30 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.c#11 (text+ko) ==== @@ -187,7 +187,9 @@ MPASS(!(cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.')); VTOFUD(*vpp)->parent_nid = VTOI(dvp); } - if (cnp != NULL && (cnp->cn_flags & MAKEENTRY) != 0) { + if (dvp != NULL && cnp != NULL && (cnp->cn_flags & MAKEENTRY) != 0) { + ASSERT_VOP_LOCKED(*vpp, "fuse_vnode_get"); + ASSERT_VOP_LOCKED(dvp, "fuse_vnode_get"); cache_enter(dvp, *vpp, cnp); } VTOFUD(*vpp)->nlookup++; ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#30 (text+ko) ==== @@ -122,6 +122,10 @@ SYSCTL_ULONG(_vfs_fuse, OID_AUTO, lookup_cache_misses, CTLFLAG_RD, &fuse_lookup_cache_misses, 0, ""); +int fuse_lookup_cache_enable = 1; +SYSCTL_INT(_vfs_fuse, OID_AUTO, lookup_cache_enable, CTLFLAG_RW, + &fuse_lookup_cache_enable, 0, ""); + int fuse_pbuf_freecnt = -1; /* @@ -695,7 +699,7 @@ fdisp_init(&fdi, 0); op = FUSE_GETATTR; goto calldaemon; - } else { + } else if (fuse_lookup_cache_enable) { err = cache_lookup(dvp, vpp, cnp); switch (err) { From owner-p4-projects@FreeBSD.ORG Sun Jun 26 09:58:53 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E54AA1065673; Sun, 26 Jun 2011 09:58:52 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A790D1065672 for ; Sun, 26 Jun 2011 09:58:52 +0000 (UTC) (envelope-from ilya@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 950CA8FC14 for ; Sun, 26 Jun 2011 09:58:52 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5Q9wqVo012779 for ; Sun, 26 Jun 2011 09:58:52 GMT (envelope-from ilya@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5Q9wqx1012776 for perforce@freebsd.org; Sun, 26 Jun 2011 09:58:52 GMT (envelope-from ilya@FreeBSD.org) Date: Sun, 26 Jun 2011 09:58:52 GMT Message-Id: <201106260958.p5Q9wqx1012776@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to ilya@FreeBSD.org using -f From: Ilya Putsikau To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195359 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 09:58:53 -0000 http://p4web.freebsd.org/@@195359?ac=10 Change 195359 by ilya@ilya_triton2011 on 2011/06/26 09:58:02 Add fuse_internal_vnode_disappear, reclaim vnode in vnop_inactive Disappear vnode in vnop_remove and vnop_rmdir Add debug sysctl to reclaim vnodes in vop_inactive Affected files ... .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#10 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#15 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#15 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#11 edit .. //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#31 edit Differences ... ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_file.c#10 (text+ko) ==== @@ -84,10 +84,7 @@ if ((err = fdisp_wait_answ(&fdi))) { debug_printf("OUCH ... daemon didn't give fh (err = %d)\n", err); if (err == ENOENT) { - /* - * See comment in fuse_vnop_reclaim(). - */ - cache_purge(vp); + fuse_internal_vnode_disappear(vp); } return err; } ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.c#15 (text+ko) ==== @@ -574,6 +574,16 @@ fuse_insert_message(fdip->tick); } +void +fuse_internal_vnode_disappear(struct vnode *vp) +{ + struct fuse_vnode_data *fvdat = VTOFUD(vp); + + ASSERT_VOP_ELOCKED(vp, "fuse_internal_vnode_disappear"); + fvdat->flag |= FN_REVOKED; + cache_purge(vp); +} + /* fuse start/stop */ int ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_internal.h#15 (text+ko) ==== @@ -269,6 +269,10 @@ struct componentname *fcnp, struct vnode *tdvp, struct componentname *tcnp); +/* revoke */ + +void +fuse_internal_vnode_disappear(struct vnode *vp); /* strategy */ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_node.h#11 (text+ko) ==== @@ -11,7 +11,8 @@ #include "fuse_file.h" -#define FN_CREATING 0x00000001 +#define FN_CREATING 0x00000002 +#define FN_REVOKED 0x00000020 struct fuse_vnode_data { /** self **/ ==== //depot/projects/soc2011/ilya_fuse/fuse_module/fuse_vnops.c#31 (text+ko) ==== @@ -126,6 +126,10 @@ SYSCTL_INT(_vfs_fuse, OID_AUTO, lookup_cache_enable, CTLFLAG_RW, &fuse_lookup_cache_enable, 0, ""); +static int fuse_reclaim_inactive = 0; +SYSCTL_INT(_vfs_fuse, OID_AUTO, reclaim_inactive, CTLFLAG_RW, + &fuse_reclaim_inactive, 0, ""); + int fuse_pbuf_freecnt = -1; /* @@ -484,7 +488,9 @@ /* see comment at similar place in fuse_statfs() */ goto fake; } - debug_printf("fuse_getattr c: returning ENOTCONN\n"); + if (err == ENOENT) { + fuse_internal_vnode_disappear(vp); + } return err; } @@ -517,10 +523,15 @@ * vp->vtype = vap->v_type */ } else { - /* stale vnode */ - // XXX: vnode should be ditched. - debug_printf("fuse_getattr d: returning ENOTCONN\n"); - return ENOTCONN; + /* + * STALE vnode, ditch + * + * The vnode has changed its type "behind our back". There's + * nothing really we can do, so let us just force an internal + * revocation. + */ + fuse_internal_vnode_disappear(vp); + return EIO; } } @@ -561,6 +572,10 @@ } } + if ((fvdat->flag & FN_REVOKED) != 0 || fuse_reclaim_inactive) { + vrecycle(vp, td); + } + return 0; } @@ -1416,7 +1431,7 @@ err = fuse_internal_remove(dvp, vp, cnp, FUSE_UNLINK); if (err == 0) { - cache_purge(vp); + fuse_internal_vnode_disappear(vp); fuse_invalidate_attr(dvp); } @@ -1526,11 +1541,10 @@ return EINVAL; } - cache_purge(ap->a_vp); - - err = fuse_internal_remove(ap->a_dvp, ap->a_vp, ap->a_cnp, FUSE_RMDIR); + err = fuse_internal_remove(dvp, vp, ap->a_cnp, FUSE_RMDIR); if (err == 0) { + fuse_internal_vnode_disappear(vp); fuse_invalidate_attr(dvp); } @@ -1690,8 +1704,15 @@ if (vnode_vtype(vp) == VNON && vtyp != VNON) { debug_printf("FUSE: Dang! vnode_vtype is VNON and vtype isn't.\n"); } else { - // XXX: should ditch vnode. - err = ENOTCONN; + /* + * STALE vnode, ditch + * + * The vnode has changed its type "behind our back". There's + * nothing really we can do, so let us just force an internal + * revocation and tell the caller to try again, if interested. + */ + fuse_internal_vnode_disappear(vp); + err = EAGAIN; } } From owner-p4-projects@FreeBSD.ORG Sun Jun 26 15:59:48 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A33111065675; Sun, 26 Jun 2011 15:59:48 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 661B4106564A for ; Sun, 26 Jun 2011 15:59:48 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 54EA68FC17 for ; Sun, 26 Jun 2011 15:59:48 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5QFxmxS085785 for ; Sun, 26 Jun 2011 15:59:48 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5QFxmPM085782 for perforce@freebsd.org; Sun, 26 Jun 2011 15:59:48 GMT (envelope-from cnicutar@freebsd.org) Date: Sun, 26 Jun 2011 15:59:48 GMT Message-Id: <201106261559.p5QFxmPM085782@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195374 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 15:59:48 -0000 http://p4web.freebsd.org/@@195374?ac=10 Change 195374 by cnicutar@cnicutar_cronos on 2011/06/26 15:59:08 Limit the value of the received user timeout according to min_timeout and max_timeout. Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_input.c#3 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_input.c#3 (text+ko) ==== @@ -1091,9 +1091,13 @@ tcp_dooptions(&to, optp, optlen, TO_SYN); if (to.to_flags & TOF_UTO) { - if (tp->t_flags & TF_RCV_UTO) + if (tp->t_flags & TF_RCV_UTO) { tp->rcv_uto = (to.to_uto & 0x8000) ? (to.to_uto & 0x7FFF) * 60 : to.to_uto; + /* silently make it fit between min-max */ + tp->rcv_uto = min(V_uto_max_timeout, + max(V_uto_min_timeout, tp->rcv_uto)); + } /* * XXX-CN Using option both for send and receive. @@ -1285,9 +1289,13 @@ (thflags & TH_SYN) ? TO_SYN : 0); /* Processing received UTO. */ - if ((to.to_flags & TOF_UTO) && (tp->t_flags & TF_RCV_UTO)) + if ((to.to_flags & TOF_UTO) && (tp->t_flags & TF_RCV_UTO)) { + /* convert to seconds if granularity is set */ tp->rcv_uto = (to.to_uto & 0x8000) ? (to.to_uto & 0x7FFF) * 60 : to.to_uto; + tp->rcv_uto = min(V_uto_max_timeout, + max(V_uto_min_timeout, tp->rcv_uto)); + } /* * If echoed timestamp is later than the current time, From owner-p4-projects@FreeBSD.ORG Sun Jun 26 19:29:18 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 643111065675; Sun, 26 Jun 2011 19:29:18 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F1582106564A for ; Sun, 26 Jun 2011 19:29:17 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id DEC748FC12 for ; Sun, 26 Jun 2011 19:29:17 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5QJTHh8027318 for ; Sun, 26 Jun 2011 19:29:17 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5QJTH1R027315 for perforce@freebsd.org; Sun, 26 Jun 2011 19:29:17 GMT (envelope-from cnicutar@freebsd.org) Date: Sun, 26 Jun 2011 19:29:17 GMT Message-Id: <201106261929.p5QJTH1R027315@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195382 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 19:29:18 -0000 http://p4web.freebsd.org/@@195382?ac=10 Change 195382 by cnicutar@cnicutar_cronos on 2011/06/26 19:28:18 Change syncache so that rcv_uto and snd_uto options are inherited from a listening socket. Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_syncache.c#3 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_syncache.h#3 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_syncache.c#3 (text+ko) ==== @@ -810,6 +810,14 @@ #endif if (sc->sc_flags & SCF_SACK) tp->t_flags |= TF_SACK_PERMIT; + if (sc->sc_flags & SCF_SND_UTO) { + tp->t_flags |= TF_SND_UTO; + tp->snd_uto = sc->sc_snd_uto; + } + if (sc->sc_flags & SCF_RCV_UTO) { + tp->t_flags |= TF_RCV_UTO; + tp->rcv_uto = sc->sc_rcv_uto; + } } if (sc->sc_flags & SCF_ECN) @@ -1022,6 +1030,14 @@ struct syncache scs; struct ucred *cred; + /* + * The client may have sent us an UTO suggestion; even if it hasn't, + * we need to inherit the current disposition (i.e. will the resulting + * socket accept suggestions?). + */ + uint8_t rcv_uto_tf = 0; + uint64_t rcv_uto = 0; + INP_INFO_WLOCK_ASSERT(&V_tcbinfo); INP_WLOCK_ASSERT(inp); /* listen socket */ KASSERT((th->th_flags & (TH_RST|TH_ACK|TH_SYN)) == TH_SYN, @@ -1048,10 +1064,17 @@ /* Set User Timeout to send in SYN-ACK. */ if (tp->t_flags & TF_SND_UTO) { + /* Also inherited after connection is established. */ to->to_uto = tp->snd_uto; to->to_flags |= TOF_UTO; } + if (tp->t_flags & TF_RCV_UTO) { + /* Remember received timeout to pass on. */ + rcv_uto_tf = 1; + rcv_uto = tp->rcv_uto; + } + /* By the time we drop the lock these should no longer be used. */ so = NULL; tp = NULL; @@ -1112,6 +1135,7 @@ sc->sc_tsreflect = to->to_tsval; else sc->sc_flags &= ~SCF_TIMESTAMP; + #ifdef MAC /* * Since we have already unconditionally allocated label @@ -1257,8 +1281,14 @@ if ((th->th_flags & (TH_ECE|TH_CWR)) && V_tcp_do_ecn) sc->sc_flags |= SCF_ECN; if (to->to_flags & TOF_UTO) { - sc->sc_uto = to->to_uto; - sc->sc_flags |= SCF_UTO; + sc->sc_snd_uto = to->to_uto; + sc->sc_flags |= SCF_SND_UTO; + } + + /* Inherit received UTO. */ + if (rcv_uto_tf) { + sc->sc_rcv_uto = rcv_uto; + sc->sc_flags |= SCF_RCV_UTO; } if (V_tcp_syncookies) { @@ -1422,8 +1452,8 @@ } if (sc->sc_flags & SCF_SACK) to.to_flags |= TOF_SACKPERM; - if (sc->sc_flags & SCF_UTO) { - to.to_uto = sc->sc_uto; + if (sc->sc_flags & SCF_SND_UTO) { + to.to_uto = sc->sc_snd_uto; to.to_flags |= TOF_UTO; } #ifdef TCP_SIGNATURE ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_syncache.h#3 (text+ko) ==== @@ -74,7 +74,8 @@ u_int8_t sc_ip_tos; /* IPv4 TOS */ u_int8_t sc_requested_s_scale:4, sc_requested_r_scale:4; - u_int16_t sc_uto; /* user timeout to send */ + u_int32_t sc_snd_uto; /* user timeout to send */ + u_int32_t sc_rcv_uto; /* user timeout received */ u_int16_t sc_flags; #ifndef TCP_OFFLOAD_DISABLE struct toe_usrreqs *sc_tu; /* TOE operations */ @@ -95,7 +96,8 @@ #define SCF_SIGNATURE 0x20 /* send MD5 digests */ #define SCF_SACK 0x80 /* send SACK option */ #define SCF_ECN 0x100 /* send ECN setup packet */ -#define SCF_UTO 0x200 /* send UTO */ +#define SCF_SND_UTO 0x200 /* send UTO */ +#define SCF_RCV_UTO 0x400 /* receive UTO suggestions */ #define SYNCOOKIE_SECRET_SIZE 8 /* dwords */ #define SYNCOOKIE_LIFETIME 16 /* seconds */ From owner-p4-projects@FreeBSD.ORG Sun Jun 26 20:25:16 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E82F51065673; Sun, 26 Jun 2011 20:25:15 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AAF541065670 for ; Sun, 26 Jun 2011 20:25:15 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7EE158FC19 for ; Sun, 26 Jun 2011 20:25:15 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5QKPF1m039381 for ; Sun, 26 Jun 2011 20:25:15 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5QKPF4e039378 for perforce@freebsd.org; Sun, 26 Jun 2011 20:25:15 GMT (envelope-from cnicutar@freebsd.org) Date: Sun, 26 Jun 2011 20:25:15 GMT Message-Id: <201106262025.p5QKPF4e039378@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195384 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 20:25:16 -0000 http://p4web.freebsd.org/@@195384?ac=10 Change 195384 by cnicutar@cnicutar_cronos on 2011/06/26 20:25:08 Change granularity handling for TCP UTO. Changing the fields in tcpcb will prove uncomfortable later. It's best to let tcp_addoptions handle it when sending the actual segment. Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_output.c#4 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_usrreq.c#4 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#4 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_output.c#4 (text+ko) ==== @@ -1474,9 +1474,27 @@ *optp++ = TCPOPT_UTO; *optp++ = TCPOLEN_UTO; - to->to_uto = htons(to->to_uto); - bcopy((u_char *)&to->to_uto, optp, sizeof(to->to_uto)); - optp += sizeof(to->to_uto); + if (to->to_uto > 3600) { + /* + * If the timeout is larger than 3600 + * we'll specify minutes. + * XXX-CN 3600 is arbitrary. + */ + to->to_uto /= 60; + to->to_uto |= 0x8000; + } + + /* + * XXX-CN to_uto is 32b because the user is allowed + * to specify more than 16b of seconds (dividing the + * value by 60 will make it fit). + */ + { + uint16_t uto = to->to_uto; + uto = htons(uto); + bcopy((u_char *)&uto, optp, sizeof(uto)); + optp += sizeof(uto); + } break; default: panic("%s: unknown TCP option type", __func__); ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_usrreq.c#4 (text+ko) ==== @@ -1312,15 +1312,6 @@ optval <= V_uto_max_timeout) { /* The timeout is acceptable. */ tp->snd_uto = optval; - if (tp->snd_uto > 3600) { - /* - * If the timeout is larger than 3600 - * we'll specify minutes. - * XXX-CN 3600 is arbitrary. - */ - tp->snd_uto /= 60; - tp->snd_uto |= 0x8000; - } tp->t_flags |= TF_SND_UTO; } else error = EINVAL; ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#4 (text+ko) ==== @@ -291,7 +291,7 @@ u_int16_t to_mss; /* maximum segment size */ u_int8_t to_wscale; /* window scaling */ u_int8_t to_nsacks; /* number of SACK blocks */ - u_int16_t to_uto; /* sent user timeout */ + u_int32_t to_uto; /* sent user timeout */ }; /* From owner-p4-projects@FreeBSD.ORG Sun Jun 26 20:43:54 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9C4911065674; Sun, 26 Jun 2011 20:43:54 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5C678106564A for ; Sun, 26 Jun 2011 20:43:54 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 48C1C8FC08 for ; Sun, 26 Jun 2011 20:43:54 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5QKhs7m042948 for ; Sun, 26 Jun 2011 20:43:54 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5QKhsjU042945 for perforce@freebsd.org; Sun, 26 Jun 2011 20:43:54 GMT (envelope-from cnicutar@freebsd.org) Date: Sun, 26 Jun 2011 20:43:54 GMT Message-Id: <201106262043.p5QKhsjU042945@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195386 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 20:43:54 -0000 http://p4web.freebsd.org/@@195386?ac=10 Change 195386 by cnicutar@cnicutar_cronos on 2011/06/26 20:43:13 Disable keepalives for connections using UTO (RFC 5482: "the keep-alive timer MUST be set to a value larger than that of the adopted USER TIMEOUT"). Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_timer.c#2 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_timer.c#2 (text+ko) ==== @@ -301,6 +301,19 @@ return; } callout_deactivate(&tp->t_timers->tt_keep); + if ((tp->t_flags & TF_SND_UTO) || ((tp->t_flags & TF_RCV_UTO) && + tp->rcv_uto)) { + /* + * This connection is using UTO (either sending or has + * received a value). We need to stop sending keepalives + * (RFC 5482 4.2). + * Returning without resetting the timer. + */ + INP_WUNLOCK(inp); + INP_INFO_WUNLOCK(&V_tcbinfo); + CURVNET_RESTORE(); + return; + } /* * Keep-alive timer went off; send something * or drop connection if idle for too long. From owner-p4-projects@FreeBSD.ORG Sun Jun 26 23:02:07 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4E1EB1065678; Sun, 26 Jun 2011 23:02:07 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0DD871065675 for ; Sun, 26 Jun 2011 23:02:07 +0000 (UTC) (envelope-from mjacob@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id EDA3F8FC0C for ; Sun, 26 Jun 2011 23:02:06 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5QN26jd069917 for ; Sun, 26 Jun 2011 23:02:06 GMT (envelope-from mjacob@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5QN216A069913 for perforce@freebsd.org; Sun, 26 Jun 2011 23:02:01 GMT (envelope-from mjacob@freebsd.org) Date: Sun, 26 Jun 2011 23:02:01 GMT Message-Id: <201106262302.p5QN216A069913@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to mjacob@freebsd.org using -f From: Matt Jacob To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195389 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Jun 2011 23:02:07 -0000 http://p4web.freebsd.org/@@195389?ac=10 Change 195389 by mjacob@mjacob-sandbox on 2011/06/26 23:01:16 IFC Affected files ... .. //depot/projects/mjacob-dev/Makefile#7 integrate .. //depot/projects/mjacob-dev/Makefile.inc1#9 integrate .. //depot/projects/mjacob-dev/UPDATING#6 integrate .. //depot/projects/mjacob-dev/bin/ps/extern.h#3 integrate .. //depot/projects/mjacob-dev/bin/ps/keyword.c#3 integrate .. //depot/projects/mjacob-dev/bin/ps/print.c#4 integrate .. //depot/projects/mjacob-dev/bin/ps/ps.1#6 integrate .. //depot/projects/mjacob-dev/bin/rcp/rcp.c#2 integrate .. //depot/projects/mjacob-dev/bin/realpath/realpath.1#2 integrate .. //depot/projects/mjacob-dev/bin/realpath/realpath.c#2 integrate .. //depot/projects/mjacob-dev/bin/sh/alias.c#5 integrate .. //depot/projects/mjacob-dev/bin/sh/alias.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/arith.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/arith_yacc.c#5 integrate .. //depot/projects/mjacob-dev/bin/sh/bltin/bltin.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/cd.c#4 integrate .. //depot/projects/mjacob-dev/bin/sh/cd.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/eval.c#7 integrate .. //depot/projects/mjacob-dev/bin/sh/eval.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/exec.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/expand.c#6 integrate .. //depot/projects/mjacob-dev/bin/sh/expand.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/histedit.c#3 integrate .. //depot/projects/mjacob-dev/bin/sh/jobs.c#5 integrate .. //depot/projects/mjacob-dev/bin/sh/jobs.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/main.c#6 integrate .. //depot/projects/mjacob-dev/bin/sh/main.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/mkbuiltins#2 integrate .. //depot/projects/mjacob-dev/bin/sh/mkinit.c#4 integrate .. //depot/projects/mjacob-dev/bin/sh/mktokens#3 integrate .. //depot/projects/mjacob-dev/bin/sh/myhistedit.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/nodetypes#2 integrate .. //depot/projects/mjacob-dev/bin/sh/options.c#4 integrate .. //depot/projects/mjacob-dev/bin/sh/options.h#2 integrate .. //depot/projects/mjacob-dev/bin/sh/parser.c#7 integrate .. //depot/projects/mjacob-dev/bin/sh/parser.h#4 integrate .. //depot/projects/mjacob-dev/bin/sh/sh.1#7 integrate .. //depot/projects/mjacob-dev/bin/sh/trap.c#4 integrate .. //depot/projects/mjacob-dev/bin/sh/trap.h#3 integrate .. //depot/projects/mjacob-dev/bin/sh/var.c#6 integrate .. //depot/projects/mjacob-dev/bin/sh/var.h#4 integrate .. //depot/projects/mjacob-dev/cddl/compat/opensolaris/include/assert.h#2 integrate .. //depot/projects/mjacob-dev/cddl/contrib/opensolaris/lib/libdtrace/common/dt_subr.c#2 integrate .. //depot/projects/mjacob-dev/contrib/binutils/bfd/coffcode.h#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/bfd/opncls.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/bfd/peicode.h#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/gas/config/obj-elf.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/gas/config/tc-arm.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/gas/frags.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/gas/subsegs.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/ld/ldexp.c#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/ld/sysdep.h#3 integrate .. //depot/projects/mjacob-dev/contrib/binutils/opcodes/i386-dis.c#3 integrate .. //depot/projects/mjacob-dev/contrib/dialog/dialog.h#3 integrate .. //depot/projects/mjacob-dev/contrib/gcc/cfg.c#2 integrate .. //depot/projects/mjacob-dev/contrib/gcc/output.h#2 integrate .. //depot/projects/mjacob-dev/contrib/gcc/rtl.h#2 integrate .. //depot/projects/mjacob-dev/contrib/gcc/tree.h#3 integrate .. //depot/projects/mjacob-dev/contrib/gdb/gdb/ppcfbsd-tdep.c#2 integrate .. //depot/projects/mjacob-dev/contrib/gperf/src/gen-perf.cc#3 integrate .. //depot/projects/mjacob-dev/contrib/gperf/src/key-list.cc#3 integrate .. //depot/projects/mjacob-dev/contrib/groff/tmac/doc-common#3 integrate .. //depot/projects/mjacob-dev/contrib/groff/tmac/doc-syms#3 integrate .. //depot/projects/mjacob-dev/contrib/groff/tmac/doc.tmac#3 integrate .. //depot/projects/mjacob-dev/contrib/less/NEWS#3 integrate .. //depot/projects/mjacob-dev/contrib/less/README#3 integrate .. //depot/projects/mjacob-dev/contrib/less/command.c#3 integrate .. //depot/projects/mjacob-dev/contrib/less/funcs.h#3 integrate .. //depot/projects/mjacob-dev/contrib/less/less.man#3 integrate .. //depot/projects/mjacob-dev/contrib/less/less.nro#3 integrate .. //depot/projects/mjacob-dev/contrib/less/lessecho.man#3 integrate .. //depot/projects/mjacob-dev/contrib/less/lessecho.nro#3 integrate .. //depot/projects/mjacob-dev/contrib/less/lesskey.man#3 integrate .. //depot/projects/mjacob-dev/contrib/less/lesskey.nro#3 integrate .. //depot/projects/mjacob-dev/contrib/less/optfunc.c#3 integrate .. //depot/projects/mjacob-dev/contrib/less/opttbl.c#3 integrate .. //depot/projects/mjacob-dev/contrib/less/version.c#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm-c/Core.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm-c/Disassembler.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/ADT/FoldingSet.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/ADT/PackedVector.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/ADT/StringRef.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/ADT/Triple.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/AliasAnalysis.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/BranchProbabilityInfo.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/CallGraph.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/DIBuilder.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/DebugInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/FindUsedTypes.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/IVUsers.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/RegionPass.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Analysis/ScalarEvolution.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Argument.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Attributes.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/AsmPrinter.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/CallingConvLower.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/FastISel.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/ISDOpcodes.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/LiveInterval.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/MachineInstr.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/MachineInstrBuilder.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/MachineModuleInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/MachineOperand.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/PseudoSourceValue.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/RegAllocPBQP.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/ScheduleDAG.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/SelectionDAG.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/CompilerDriver/Common.td#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/DefaultPasses.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/ExecutionEngine/ExecutionEngine.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Function.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/InitializePasses.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/IntrinsicInst.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Intrinsics.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/IntrinsicsARM.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/IntrinsicsX86.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/IntrinsicsXCore.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/LinkAllPasses.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCAsmInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCDwarf.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCELFSymbolFlags.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCExpr.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCInstPrinter.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCParser/MCAsmLexer.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCParser/MCAsmParser.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCStreamer.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/MC/MCWin64EH.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Metadata.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Operator.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/BranchProbability.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/Casting.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/CrashRecoveryContext.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/Dwarf.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/IRBuilder.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/MemoryBuffer.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/PassManagerBuilder.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/PatternMatch.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/Program.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/SourceMgr.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/StandardPasses.h#4 delete .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Support/Win64EH.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/Target.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetAsmInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetInstrItineraries.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetLibraryInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetLowering.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetLoweringObjectFile.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetOptions.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetRegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Target/TargetSelectionDAG.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Transforms/Instrumentation.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Transforms/Utils/Local.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Transforms/Utils/SSAUpdater.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/include/llvm/Type.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/Analysis.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/BasicAliasAnalysis.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/ConstantFolding.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/DIBuilder.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/IPA/CallGraph.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/IPA/FindUsedTypes.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/IVUsers.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/InlineCost.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/InstructionSimplify.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/LazyValueInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/Loads.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/RegionPass.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/ScalarEvolution.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Analysis/ValueTracking.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/AsmParser/LLLexer.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/AsmParser/LLLexer.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/AsmParser/LLParser.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/AsmParser/LLToken.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Bitcode/Reader/BitcodeReader.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AggressiveAntiDepBreaker.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AllocationOrder.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AllocationOrder.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AntiDepBreaker.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/ARMException.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfException.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/DwarfTableException.cpp#3 delete .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/AsmPrinter/Win64Exception.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/BranchFolding.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/BranchFolding.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/CalcSpillWeights.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/CallingConvLower.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/CriticalAntiDepBreaker.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/DwarfEHPrepare.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/IfConversion.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/InlineSpiller.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/LLVMTargetMachine.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/LiveDebugVariables.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/LiveDebugVariables.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/LiveRangeEdit.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/MachineBasicBlock.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/MachineFunction.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/MachineInstr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/MachineRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/MachineVerifier.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/PostRASchedulerList.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegAllocBase.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegAllocBasic.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegAllocFast.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegAllocGreedy.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegisterClassInfo.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegisterClassInfo.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/RegisterScavenging.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/ScheduleDAGInstrs.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/InstrEmitter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SimpleRegisterCoalescing.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SjLjEHPrepare.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SplitKit.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/SplitKit.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/TailDuplication.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/TargetInstrInfoImpl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/TwoAddressInstructionPass.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/UnreachableBlockElim.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/CodeGen/VirtRegMap.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/ExecutionEngine.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/JIT/JIT.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/JIT/JIT.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/JIT/TargetSelect.cpp#4 delete .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/MCJIT/MCJIT.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/MCJIT/MCJITMemoryManager.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/MCJIT/TargetSelect.cpp#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/ExecutionEngine/TargetSelect.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/ELFObjectWriter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/ELFObjectWriter.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCAsmInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCAsmInfoDarwin.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCAsmStreamer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCAssembler.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCDisassembler/Disassembler.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCDwarf.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCELF.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCELFStreamer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCExpr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCInstPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCMachOStreamer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCObjectStreamer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCParser/AsmLexer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCParser/AsmParser.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCParser/COFFAsmParser.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCParser/DarwinAsmParser.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCStreamer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/MCWin64EH.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/MC/WinCOFFStreamer.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/APInt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/BranchProbability.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/Dwarf.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/FoldingSet.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/Host.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/MemoryBuffer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/SourceMgr.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/Unix/Host.inc#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/Unix/Program.inc#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Support/Windows/Program.inc#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMAsmBackend.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMAsmPrinter.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMCodeEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMFastISel.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMFixupKinds.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMISelLowering.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMInstrFormats.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMInstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMInstrNEON.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMInstrThumb.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMInstrThumb2.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMMCAsmInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMMCCodeEmitter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMPerfectShuffle.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMRegisterInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/ARMSelectionDAGInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/InstPrinter/ARMInstPrinter.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Alpha/AlphaISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Alpha/AlphaRegisterInfo.td#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinFrameLowering.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinFrameLowering.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinISelDAGToDAG.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinInstrInfo.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Blackfin/BlackfinRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CBackend/CBackend.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CellSPU/SPUISelLowering.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/CellSPU/SPURegisterInfo.td#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeInstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MBlaze/MBlazeRegisterInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MSP430/MSP430ISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/MSP430/MSP430RegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/Mips.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsAsmPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsEmitGPRestore.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsFrameLowering.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsFrameLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsISelDAGToDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsISelLowering.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsInstrFPU.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsInstrFormats.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsInstrInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsInstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsMCAsmInfo.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsMachineFunction.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsTargetMachine.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Mips/MipsTargetMachine.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTX.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXISelLowering.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXInstrInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXRegisterInfo.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXSubtarget.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PTX/PTXSubtarget.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPC.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCHazardRecognizers.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCInstr64Bit.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCMCAsmInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCMCInstLower.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/PowerPC/PPCRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Sparc/SparcISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Sparc/SparcISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/Sparc/SparcRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/SystemZ/SystemZISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/TargetLibraryInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/TargetLoweringObjectFile.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/TargetMachine.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/TargetRegisterInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86FastISel.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86FrameLowering.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86ISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86ISelLowering.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrCompiler.td#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrExtension.td#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrFragmentsSIMD.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrMMX.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86InstrSSE.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86MCAsmInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86MCCodeEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86MCInstLower.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86RegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86RegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86RegisterInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/X86/X86Subtarget.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreISelLowering.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreISelLowering.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreInstrInfo.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Target/XCore/XCoreRegisterInfo.td#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/IPO/DeadTypeElimination.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/IPO/ExtractGV.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/IPO/GlobalOpt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/IPO/PruneEH.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombine.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Instrumentation/PathProfiling.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/GVN.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/JumpThreading.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/LICM.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/MemCpyOptimizer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/SCCP.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/BuildLibCalls.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/InlineFunction.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/Local.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/SSAUpdater.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/Transforms/Utils/SimplifyCFG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/Attributes.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/AutoUpgrade.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/DebugInfoProbe.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/Function.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/IRBuilder.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/InlineAsm.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/Instructions.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/PassManager.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/Type.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/lib/VMCore/Verifier.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang-c/Index.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/APValue.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/ASTContext.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/CanonicalType.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/Decl.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/DeclBase.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/DeclCXX.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/DeclObjC.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/DeclTemplate.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/Expr.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/ExternalASTSource.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/RecursiveASTVisitor.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/StmtVisitor.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/Type.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/TypeLoc.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/AST/TypeNodes.def#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsARM.def#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/BuiltinsX86.def#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DeclNodes.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/Diagnostic.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticCommonKinds.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticFrontendKinds.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticGroups.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticIDs.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticParseKinds.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/ExceptionSpecificationType.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/IdentifierTable.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/LangOptions.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/SourceLocation.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/SourceManager.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/Specifiers.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/StmtNodes.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/TargetInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/TokenKinds.def#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/TypeTraits.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Basic/arm_neon.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Driver/CC1AsOptions.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Driver/CC1Options.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Driver/Options.td#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Driver/ToolChain.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/ASTUnit.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/CodeGenOptions.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/DiagnosticOptions.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/LangStandard.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/LangStandards.def#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/PreprocessorOptions.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Frontend/Utils.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Lex/HeaderSearch.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Lex/LiteralSupport.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Lex/PreprocessingRecord.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Lex/Preprocessor.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Parse/Parser.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/CodeCompleteConsumer.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/DeclSpec.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Initialization.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Lookup.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Overload.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Scope.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Sema.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Sema/Template.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Serialization/ASTBitCodes.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Serialization/ASTReader.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Serialization/ASTWriter.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/Checker.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/GRState.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/Store.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/include/clang/Tooling/Tooling.h#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/APValue.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ASTContext.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ASTDiagnostic.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ASTImporter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/Decl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DeclBase.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DeclObjC.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DeclPrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DeclTemplate.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/DumpXML.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/Expr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ExprClassification.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ExprConstant.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ExternalASTSource.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/ItaniumMangle.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/Mangle.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/RecordLayoutBuilder.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/StmtPrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/StmtProfile.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/Type.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Analysis/AnalysisContext.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Analysis/CFG.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Analysis/CocoaConventions.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Analysis/LiveVariables.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Analysis/UninitializedValues.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/DiagnosticIDs.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/FileManager.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/IdentifierTable.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/SourceManager.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Basic/Targets.cpp#5 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/BackendUtil.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGBlocks.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGCall.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGCall.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGClass.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGDebugInfo.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGDeclCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGException.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGExpr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGExprAgg.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGExprCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGExprConstant.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGExprScalar.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGObjC.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGObjCMac.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGObjCRuntime.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGStmt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGVTT.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CGVTables.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CodeGenFunction.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CodeGenModule.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/CodeGenTypes.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/ItaniumCXXABI.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/ModuleBuilder.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/CodeGen/TargetInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/Driver.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/HostInfo.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/ToolChains.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/Tools.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Driver/Tools.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/ASTConsumers.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/ASTUnit.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/CompilerInvocation.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/CreateInvocationFromCommandLine.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/DiagChecker.cpp#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/InitHeaderSearch.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/InitPreprocessor.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/TextDiagnosticPrinter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Frontend/Warnings.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Headers/emmintrin.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Headers/mmintrin.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Headers/xmmintrin.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Index/CallGraph.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Index/Indexer.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/HeaderSearch.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/Lexer.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/LiteralSupport.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/MacroInfo.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/PPDirectives.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/PPMacroExpansion.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/Pragma.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/PreprocessingRecord.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Lex/Preprocessor.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseCXXInlineMethods.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseDeclCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseExpr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseExprCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseObjc.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParsePragma.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseStmt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseTemplate.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/ParseTentative.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Parse/Parser.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Rewrite/RewriteObjC.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/DeclSpec.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/JumpDiagnostics.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/Sema.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaAccess.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaCXXCast.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaCXXScopeSpec.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaDeclCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaDeclObjC.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaExceptionSpec.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaExpr.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaExprCXX.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaExprObjC.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaInit.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaLookup.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaStmt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaTemplate.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaTemplateDeduction.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiate.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/SemaType.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Sema/TreeTransform.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTReader.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTReaderDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTReaderStmt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTWriter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTWriterDecl.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Serialization/ASTWriterStmt.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/BasicStore.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/BasicValueFactory.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CFRefCount.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CXXExprEngine.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/CheckerManager.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/Environment.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/FlatStore.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/GRState.cpp#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/ObjCMessage.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/RegionStore.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Tooling/JsonCompileCommandLineDatabase.cpp#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Tooling/JsonCompileCommandLineDatabase.h#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/lib/Tooling/Tooling.cpp#2 delete .. //depot/projects/mjacob-dev/contrib/llvm/tools/clang/tools/driver/cc1as_main.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/AsmMatcherEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/AsmWriterEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/ClangDiagnosticsEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/CodeGenIntrinsics.h#2 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/CodeGenRegisters.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/CodeGenRegisters.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/CodeGenTarget.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/CodeGenTarget.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/DAGISelMatcherGen.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/EDEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/FastISelEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/IntrinsicEmitter.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/LLVMCConfigurationEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/NeonEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/Record.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/RegisterInfoEmitter.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/SetTheory.cpp#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/SetTheory.h#1 branch .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/TGLexer.cpp#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/TGLexer.h#4 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/TGParser.h#3 integrate .. //depot/projects/mjacob-dev/contrib/llvm/utils/TableGen/TableGen.cpp#4 integrate .. //depot/projects/mjacob-dev/contrib/lukemftp/COPYING#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/ChangeLog#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/FreeBSD-patchset#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/INSTALL#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/Makefile.in#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/NEWS#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/README#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/THANKS#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/acconfig.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/aclocal.m4#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/config.h.in#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/configure#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/configure.in#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/diffout#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/install-sh#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/lukemftp.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/Makefile#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/Makefile.in#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/cmds.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/cmdtab.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/complete.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/domacro.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/extern.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/fetch.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/ftp.1#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/ftp.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/ftp_var.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/main.c#3 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/progressbar.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/progressbar.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/ruserpass.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/util.c#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/src/version.h#2 delete .. //depot/projects/mjacob-dev/contrib/lukemftp/todo#2 delete .. //depot/projects/mjacob-dev/contrib/pf/pfctl/pfctl.8#2 integrate .. //depot/projects/mjacob-dev/contrib/pf/pfctl/pfctl.c#2 integrate .. //depot/projects/mjacob-dev/contrib/pf/pfctl/pfctl_optimize.c#2 integrate .. //depot/projects/mjacob-dev/contrib/pf/pfctl/pfctl_parser.c#2 integrate .. //depot/projects/mjacob-dev/contrib/pf/pfctl/pfctl_parser.h#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/CACerts#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/FREEBSD-upgrade#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/KNOWNBUGS#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/LICENSE#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/PGPKEYS#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/RELEASE_NOTES#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/cf/submit.cf#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/feature/ldap_routing.m4#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/m4/cfhead.m4#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/m4/proto.m4#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/m4/version.m4#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/cf/ostype/solaris11.m4#1 branch .. //depot/projects/mjacob-dev/contrib/sendmail/contrib/qtool.pl#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/doc/op/op.me#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/include/sm/conf.h#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/docs/overview.html#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/docs/smfi_stop.html#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/docs/xxfi_envrcpt.html#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/engine.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/sm_gethost.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libmilter/worker.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/libsm/ldap.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/makemap/makemap.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/Makefile.m4#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/conf.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/daemon.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/deliver.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/domain.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/envelope.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/err.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/main.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/map.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/mci.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/parseaddr.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/queue.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/readcf.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/sendmail.8#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/sendmail.h#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/sm_resolve.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/srvrsmtp.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/tls.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/udb.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/usersmtp.c#2 integrate .. //depot/projects/mjacob-dev/contrib/sendmail/src/version.c#2 integrate .. //depot/projects/mjacob-dev/contrib/tnftp/COPYING#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/ChangeLog#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/INSTALL#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/Makefile.am#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/Makefile.in#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/NEWS#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/README#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/THANKS#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/Makefile.am#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/Makefile.in#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/cmds.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/cmdtab.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/complete.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/domacro.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/extern.h#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/fetch.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/ftp.1#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/ftp.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/ftp_var.h#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/main.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/progressbar.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/progressbar.h#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/ruserpass.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/util.c#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/src/version.h#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/tnftp.h#1 branch .. //depot/projects/mjacob-dev/contrib/tnftp/todo#1 branch .. //depot/projects/mjacob-dev/contrib/top/display.c#3 integrate .. //depot/projects/mjacob-dev/contrib/top/top.h#2 integrate .. //depot/projects/mjacob-dev/contrib/traceroute/traceroute.c#4 integrate .. //depot/projects/mjacob-dev/etc/defaults/Makefile#2 integrate .. //depot/projects/mjacob-dev/etc/defaults/rc.conf#6 integrate .. //depot/projects/mjacob-dev/etc/devd/Makefile#2 integrate .. //depot/projects/mjacob-dev/etc/devd/uath.conf#2 integrate .. //depot/projects/mjacob-dev/etc/devd/usb.conf#1 branch .. //depot/projects/mjacob-dev/etc/mtree/BSD.include.dist#5 integrate .. //depot/projects/mjacob-dev/etc/network.subr#4 integrate .. //depot/projects/mjacob-dev/etc/periodic/daily/800.scrub-zfs#4 integrate .. //depot/projects/mjacob-dev/etc/periodic/monthly/Makefile#2 integrate .. //depot/projects/mjacob-dev/etc/rc.d/Makefile#3 integrate .. //depot/projects/mjacob-dev/etc/rc.d/kld#1 branch .. //depot/projects/mjacob-dev/etc/rc.d/mountcritremote#2 integrate .. //depot/projects/mjacob-dev/etc/rc.d/netwait#1 branch .. //depot/projects/mjacob-dev/etc/rc.d/nfsclient#3 integrate .. //depot/projects/mjacob-dev/etc/rc.d/rtadvd#2 integrate .. //depot/projects/mjacob-dev/etc/rc.d/var#2 integrate .. //depot/projects/mjacob-dev/etc/rc.subr#5 integrate .. //depot/projects/mjacob-dev/etc/regdomain.xml#2 integrate .. //depot/projects/mjacob-dev/etc/sendmail/freebsd.mc#2 integrate .. //depot/projects/mjacob-dev/etc/sendmail/freebsd.submit.mc#2 integrate .. //depot/projects/mjacob-dev/games/fortune/datfiles/fortunes#4 integrate .. //depot/projects/mjacob-dev/gnu/usr.bin/Makefile#3 integrate .. //depot/projects/mjacob-dev/gnu/usr.bin/gdb/kgdb/kthr.c#2 integrate .. //depot/projects/mjacob-dev/gnu/usr.bin/groff/tmac/mdoc.local#4 integrate .. //depot/projects/mjacob-dev/kerberos5/Makefile#2 integrate .. //depot/projects/mjacob-dev/lib/clang/include/clang/Basic/Version.inc#4 integrate .. //depot/projects/mjacob-dev/lib/clang/libclangfrontend/Makefile#4 integrate .. //depot/projects/mjacob-dev/lib/clang/libllvmasmprinter/Makefile#4 integrate .. //depot/projects/mjacob-dev/lib/clang/libllvmcodegen/Makefile#4 integrate .. //depot/projects/mjacob-dev/lib/clang/libllvmmc/Makefile#4 integrate .. //depot/projects/mjacob-dev/lib/clang/libllvmmipscodegen/Makefile#4 integrate .. //depot/projects/mjacob-dev/lib/libc/db/btree/bt_split.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/db/man/mpool.3#2 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/basename.3#2 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/basename.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/ftw.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/getutxent.3#3 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/posix_spawn.3#2 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/posix_spawn.c#3 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/pututxline.c#3 integrate .. //depot/projects/mjacob-dev/lib/libc/gen/sysconf.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/iconv/citrus_mapper.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/iconv/iconv.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/net/sctp_opt_info.3#2 integrate .. //depot/projects/mjacob-dev/lib/libc/net/sctp_sys_calls.c#3 integrate .. //depot/projects/mjacob-dev/lib/libc/stdlib/malloc.c#3 integrate .. //depot/projects/mjacob-dev/lib/libc/stdlib/ptsname.c#2 integrate .. //depot/projects/mjacob-dev/lib/libc/sys/wait.2#2 integrate .. //depot/projects/mjacob-dev/lib/libiconv/Makefile#2 integrate .. //depot/projects/mjacob-dev/lib/libkvm/kvm_pcpu.c#3 integrate .. //depot/projects/mjacob-dev/lib/libmemstat/memstat_uma.c#2 integrate .. //depot/projects/mjacob-dev/lib/libprocstat/Makefile#3 integrate .. //depot/projects/mjacob-dev/lib/libprocstat/libprocstat.c#4 integrate .. //depot/projects/mjacob-dev/lib/libstand/Makefile#3 integrate .. //depot/projects/mjacob-dev/lib/libstand/bswap.c#3 integrate .. //depot/projects/mjacob-dev/lib/libstand/net.c#3 integrate .. //depot/projects/mjacob-dev/lib/libstand/tftp.c#3 integrate .. //depot/projects/mjacob-dev/lib/libstand/zalloc.c#2 integrate .. //depot/projects/mjacob-dev/lib/libstand/zalloc_malloc.c#2 integrate .. //depot/projects/mjacob-dev/lib/libthr/arch/sparc64/Makefile.inc#2 integrate .. //depot/projects/mjacob-dev/lib/libthr/arch/sparc64/include/pthread_md.h#2 integrate .. //depot/projects/mjacob-dev/lib/libthr/arch/sparc64/sparc64/_umtx_op_err.S#1 branch .. //depot/projects/mjacob-dev/lib/libthr/arch/sparc64/sparc64/pthread_md.c#2 integrate .. //depot/projects/mjacob-dev/lib/libthr/thread/thr_init.c#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/Makefile#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/libusb01.c#1 branch .. //depot/projects/mjacob-dev/lib/libusb/libusb20.3#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/libusb20.c#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/libusb20.h#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/libusb20_compat01.c#3 delete .. //depot/projects/mjacob-dev/lib/libusb/libusb20_int.h#3 integrate .. //depot/projects/mjacob-dev/lib/libusb/libusb20_ugen20.c#3 integrate .. //depot/projects/mjacob-dev/lib/msun/ld80/e_rem_pio2l.h#3 integrate .. //depot/projects/mjacob-dev/lib/msun/src/e_rem_pio2.c#2 integrate .. //depot/projects/mjacob-dev/libexec/comsat/comsat.c#2 integrate .. //depot/projects/mjacob-dev/libexec/ftpd/ftpd.c#3 integrate .. //depot/projects/mjacob-dev/libexec/rtld-elf/Makefile#3 integrate .. //depot/projects/mjacob-dev/libexec/rtld-elf/rtld.c#5 integrate .. //depot/projects/mjacob-dev/libexec/tftpd/tftp-file.c#2 integrate .. //depot/projects/mjacob-dev/libexec/tftpd/tftpd.8#2 integrate .. //depot/projects/mjacob-dev/libexec/ulog-helper/Makefile#2 integrate .. //depot/projects/mjacob-dev/libexec/ulog-helper/ulog-helper.c#2 integrate .. //depot/projects/mjacob-dev/release/Makefile#5 integrate .. //depot/projects/mjacob-dev/release/doc/en_US.ISO8859-1/readme/article.sgml#2 integrate .. //depot/projects/mjacob-dev/release/doc/en_US.ISO8859-1/relnotes/article.sgml#3 integrate .. //depot/projects/mjacob-dev/release/doc/share/sgml/release.ent#3 integrate .. //depot/projects/mjacob-dev/release/ia64/mkisoimages.sh#4 integrate .. //depot/projects/mjacob-dev/release/powerpc/mkisoimages.sh#5 integrate .. //depot/projects/mjacob-dev/sbin/camcontrol/camcontrol.c#4 integrate .. //depot/projects/mjacob-dev/sbin/ddb/ddb.8#2 integrate .. //depot/projects/mjacob-dev/sbin/fsck_ffs/suj.c#4 integrate .. //depot/projects/mjacob-dev/sbin/geom/class/part/geom_part.c#7 integrate .. //depot/projects/mjacob-dev/sbin/geom/class/part/gpart.8#7 integrate .. //depot/projects/mjacob-dev/sbin/geom/class/sched/Makefile#3 integrate .. //depot/projects/mjacob-dev/sbin/growfs/growfs.8#3 integrate .. //depot/projects/mjacob-dev/sbin/growfs/growfs.c#3 integrate .. //depot/projects/mjacob-dev/sbin/hastd/primary.c#7 integrate .. //depot/projects/mjacob-dev/sbin/hastd/proto_common.c#4 integrate .. //depot/projects/mjacob-dev/sbin/hastd/secondary.c#6 integrate .. //depot/projects/mjacob-dev/sbin/ifconfig/af_inet6.c#3 integrate .. //depot/projects/mjacob-dev/sbin/ifconfig/af_nd6.c#3 integrate .. //depot/projects/mjacob-dev/sbin/ifconfig/ifconfig.c#4 integrate .. //depot/projects/mjacob-dev/sbin/ipfw/ipfw.8#3 integrate .. //depot/projects/mjacob-dev/sbin/ipfw/ipfw2.c#4 integrate .. //depot/projects/mjacob-dev/sbin/ipfw/ipfw2.h#3 integrate .. //depot/projects/mjacob-dev/sbin/ipfw/main.c#3 integrate .. //depot/projects/mjacob-dev/sbin/ipfw/nat.c#3 integrate .. //depot/projects/mjacob-dev/sbin/mount/mount.8#4 integrate .. //depot/projects/mjacob-dev/sbin/mount/mount.c#3 integrate .. //depot/projects/mjacob-dev/sbin/newfs/newfs.8#5 integrate .. //depot/projects/mjacob-dev/sbin/rcorder/rcorder.8#2 integrate .. //depot/projects/mjacob-dev/sbin/rtsol/Makefile#2 integrate .. //depot/projects/mjacob-dev/sbin/savecore/savecore.c#3 integrate .. //depot/projects/mjacob-dev/sbin/tunefs/tunefs.8#4 integrate .. //depot/projects/mjacob-dev/share/examples/etc/make.conf#5 integrate .. //depot/projects/mjacob-dev/share/man/man4/Makefile#7 integrate .. //depot/projects/mjacob-dev/share/man/man4/amdsbwd.4#2 integrate .. //depot/projects/mjacob-dev/share/man/man4/atkbd.4#3 integrate .. //depot/projects/mjacob-dev/share/man/man4/geom_map.4#3 integrate .. //depot/projects/mjacob-dev/share/man/man4/ng_ether.4#2 integrate .. //depot/projects/mjacob-dev/share/man/man4/snd_hda.4#2 integrate .. //depot/projects/mjacob-dev/share/man/man4/ucom.4#3 integrate .. //depot/projects/mjacob-dev/share/man/man4/umcs.4#1 branch .. //depot/projects/mjacob-dev/share/man/man4/umcs7840.4#2 delete .. //depot/projects/mjacob-dev/share/man/man5/fstab.5#2 integrate .. //depot/projects/mjacob-dev/share/man/man5/make.conf.5#2 integrate .. //depot/projects/mjacob-dev/share/man/man5/rc.conf.5#6 integrate .. //depot/projects/mjacob-dev/share/man/man5/src.conf.5#6 integrate .. //depot/projects/mjacob-dev/share/man/man7/build.7#4 integrate .. //depot/projects/mjacob-dev/share/man/man9/Makefile#5 integrate .. //depot/projects/mjacob-dev/share/man/man9/device_get_sysctl.9#2 integrate .. //depot/projects/mjacob-dev/share/misc/committers-ports.dot#5 integrate .. //depot/projects/mjacob-dev/share/misc/usb_hid_usages#2 integrate >>> TRUNCATED FOR MAIL (1000 lines) <<< From owner-p4-projects@FreeBSD.ORG Mon Jun 27 14:35:48 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A6E1C106574E; Mon, 27 Jun 2011 14:35:48 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 541561065772 for ; Mon, 27 Jun 2011 14:35:48 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 41A3D8FC13 for ; Mon, 27 Jun 2011 14:35:48 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5REZmcE057385 for ; Mon, 27 Jun 2011 14:35:48 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5REZmwX057382 for perforce@freebsd.org; Mon, 27 Jun 2011 14:35:48 GMT (envelope-from cnicutar@freebsd.org) Date: Mon, 27 Jun 2011 14:35:48 GMT Message-Id: <201106271435.p5REZmwX057382@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195421 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Jun 2011 14:35:49 -0000 http://p4web.freebsd.org/@@195421?ac=10 Change 195421 by cnicutar@cnicutar_cronos on 2011/06/27 14:35:32 When using UTO don't reset the connection if TCP_MAXRXTSHIFT retransmits are sent and the timeout has not been exceeded. If UTO is exceeded, drop the connection regardless of the number of retransmits performed. Add a field to tcpcb to record the starting time of retransmissions (and, implicitly, UTO). Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_timer.c#3 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#5 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_timer.c#3 (text+ko) ==== @@ -66,6 +66,9 @@ #include #endif +/* XXX-CN this will have to move */ +#define ticks_to_secs(t) ((t) / hz) + int tcp_keepinit; SYSCTL_PROC(_net_inet_tcp, TCPCTL_KEEPINIT, keepinit, CTLTYPE_INT|CTLFLAG_RW, &tcp_keepinit, 0, sysctl_msec_to_ticks, "I", "time to establish connection"); @@ -117,6 +120,7 @@ /* max idle time in persist */ int tcp_maxidle; + /* * Tcp protocol timeout routine called every 500 ms. * Updates timestamps used for TCP @@ -452,6 +456,7 @@ int rexmt; int headlocked; struct inpcb *inp; + int uto_left = 0; #ifdef TCPDEBUG int ostate; @@ -483,16 +488,49 @@ } callout_deactivate(&tp->t_timers->tt_rexmt); tcp_free_sackholes(tp); + + if (tp->t_rxtshift == 0) + tp->t_suto = 0; + + if ((tp->t_flags & TF_SND_UTO) || ((tp->t_flags & TF_RCV_UTO) && + tp->rcv_uto)) { + /* Using UTO for this connection. */ + uto_left = max(tp->snd_uto, tp->rcv_uto); + if (tp->t_suto) { + uto_left -= ticks_to_secs(ticks - tp->t_suto); + } + + /* + * The user may choose a value that's less than TCP_MAXRXTSHIFT + * retransmits. + */ + if (tp->t_rxtshift > TCP_MAXRXTSHIFT || uto_left <= 0) { + /* Before or after the retransmits, UTO was exceeded. */ + TCPSTAT_INC(tcps_timeoutdrop); + tp = tcp_drop(tp, ETIMEDOUT); + goto out; + } + } + /* * Retransmission timer went off. Message has not * been acked within retransmit interval. Back off * to a longer retransmit interval and retransmit one segment. */ if (++tp->t_rxtshift > TCP_MAXRXTSHIFT) { - tp->t_rxtshift = TCP_MAXRXTSHIFT; - TCPSTAT_INC(tcps_timeoutdrop); - tp = tcp_drop(tp, tp->t_softerror ? - tp->t_softerror : ETIMEDOUT); + if (uto_left > 0) { + /* + * Reset the timer for UTO; t_rxtshift will hint + * that it's not a normal retransmit. + */ + callout_reset(&tp->t_timers->tt_rexmt, hz * uto_left, + tcp_timer_rexmt, tp); + } else { + tp->t_rxtshift = TCP_MAXRXTSHIFT; + TCPSTAT_INC(tcps_timeoutdrop); + tp = tcp_drop(tp, tp->t_softerror ? + tp->t_softerror : ETIMEDOUT); + } goto out; } INP_INFO_WUNLOCK(&V_tcbinfo); @@ -515,6 +553,7 @@ else tp->t_flags &= ~TF_WASFRECOVERY; tp->t_badrxtwin = ticks + (tp->t_srtt >> (TCP_RTT_SHIFT + 1)); + tp->t_suto = ticks; /* Keep track of UTO start. */ } TCPSTAT_INC(tcps_rexmttimeo); if (tp->t_state == TCPS_SYN_SENT) @@ -523,6 +562,9 @@ rexmt = TCP_REXMTVAL(tp) * tcp_backoff[tp->t_rxtshift]; TCPT_RANGESET(tp->t_rxtcur, rexmt, tp->t_rttmin, TCPTV_REXMTMAX); + if (uto_left) { + tp->t_rxtcur = min(tp->t_rxtcur, hz * uto_left); + } /* * Disable rfc1323 if we haven't got any response to * our third SYN to work-around some broken terminal servers ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#5 (text+ko) ==== @@ -200,13 +200,14 @@ void *t_pspare2[6]; /* 2 CC / 4 TBD */ - uint64_t _pad[8]; /* 5 UTO, 3 TBD (1-2 CC/RTT?) */ + uint64_t _pad[7]; /* 4 UTO, 3 TBD (1-2 CC/RTT?) */ uint64_t t_sndrexmitpack;/* retransmit packets sent */ uint64_t t_rcvoopack; /* out-of-order packets received */ uint64_t snd_uto; /* sent timeout */ uint64_t rcv_uto; /* received suggestion from peer */ + uint64_t t_suto; /* uto starting time */ }; /* From owner-p4-projects@FreeBSD.ORG Mon Jun 27 15:10:55 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8A155106567A; Mon, 27 Jun 2011 15:10:55 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 42A821065676 for ; Mon, 27 Jun 2011 15:10:55 +0000 (UTC) (envelope-from cnicutar@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 185AB8FC1F for ; Mon, 27 Jun 2011 15:10:55 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5RFAsMM064112 for ; Mon, 27 Jun 2011 15:10:54 GMT (envelope-from cnicutar@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5RFAsR0064108 for perforce@freebsd.org; Mon, 27 Jun 2011 15:10:54 GMT (envelope-from cnicutar@freebsd.org) Date: Mon, 27 Jun 2011 15:10:54 GMT Message-Id: <201106271510.p5RFAsR0064108@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to cnicutar@freebsd.org using -f From: Catalin Nicutar To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195423 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 27 Jun 2011 15:10:55 -0000 http://p4web.freebsd.org/@@195423?ac=10 Change 195423 by cnicutar@cnicutar_cronos on 2011/06/27 15:10:25 Replace magic values used for UTO granularity with defines. Affected files ... .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_input.c#4 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_output.c#5 edit .. //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#6 edit Differences ... ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_input.c#4 (text+ko) ==== @@ -1092,8 +1092,8 @@ if (to.to_flags & TOF_UTO) { if (tp->t_flags & TF_RCV_UTO) { - tp->rcv_uto = (to.to_uto & 0x8000) ? - (to.to_uto & 0x7FFF) * 60 : to.to_uto; + tp->rcv_uto = (to.to_uto & UTO_MINS) ? + (to.to_uto & ~(UTO_MINS)) * 60 : to.to_uto; /* silently make it fit between min-max */ tp->rcv_uto = min(V_uto_max_timeout, max(V_uto_min_timeout, tp->rcv_uto)); @@ -1291,8 +1291,8 @@ /* Processing received UTO. */ if ((to.to_flags & TOF_UTO) && (tp->t_flags & TF_RCV_UTO)) { /* convert to seconds if granularity is set */ - tp->rcv_uto = (to.to_uto & 0x8000) ? - (to.to_uto & 0x7FFF) * 60 : to.to_uto; + tp->rcv_uto = (to.to_uto & UTO_MINS) ? + (to.to_uto & ~(UTO_MINS)) * 60 : to.to_uto; tp->rcv_uto = min(V_uto_max_timeout, max(V_uto_min_timeout, tp->rcv_uto)); } ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_output.c#5 (text+ko) ==== @@ -1474,14 +1474,14 @@ *optp++ = TCPOPT_UTO; *optp++ = TCPOLEN_UTO; - if (to->to_uto > 3600) { + if (to->to_uto > UTO_MINS_TH) { /* * If the timeout is larger than 3600 * we'll specify minutes. * XXX-CN 3600 is arbitrary. */ to->to_uto /= 60; - to->to_uto |= 0x8000; + to->to_uto |= UTO_MINS; } /* ==== //depot/projects/soc2011/cnicutar_tcputo_8/src/sys/netinet/tcp_var.h#6 (text+ko) ==== @@ -300,6 +300,12 @@ */ #define TO_SYN 0x01 /* parse SYN-only options */ +/* + * Flags for TCP UTO + */ +#define UTO_MINS 0x8000 /* highest bit set means "minutes" */ +#define UTO_MINS_TH 3600 /* send minutes if >= one hour */ + struct hc_metrics_lite { /* must stay in sync with hc_metrics */ u_long rmx_mtu; /* MTU for this path */ u_long rmx_ssthresh; /* outbound gateway buffer limit */ From owner-p4-projects@FreeBSD.ORG Wed Jun 29 02:15:21 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 655741065672; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 285C0106566B for ; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 165268FC14 for ; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5T2FKXH000440 for ; Wed, 29 Jun 2011 02:15:20 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5T2FKra000437 for perforce@freebsd.org; Wed, 29 Jun 2011 02:15:20 GMT (envelope-from jceel@freebsd.org) Date: Wed, 29 Jun 2011 02:15:20 GMT Message-Id: <201106290215.p5T2FKra000437@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195492 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Jun 2011 02:15:21 -0000 http://p4web.freebsd.org/@@195492?ac=10 Change 195492 by jceel@jceel_cyclone on 2011/06/29 02:14:41 Fixes in ethernet driver. Affected files ... .. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#3 edit .. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpereg.h#3 edit Differences ... ==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpe.c#3 (text+ko) ==== @@ -479,6 +479,10 @@ // device_printf(sc->lpe_dev, "lpe_start_locked()\n"); while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { + if (lpe_read_4(sc, LPE_TXDESC_PROD) == + lpe_read_4(sc, LPE_TXDESC_CONS) - 5) + break; + /* Dequeue first packet */ IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (!m_head) @@ -541,7 +545,7 @@ if (i == nsegs - 1) { hwd->lhr_control |= LPE_HWDESC_LASTFLAG; hwd->lhr_control |= LPE_HWDESC_INTERRUPT; - hwd->lhr_control |= (1 << 28) | (1 << 29); + hwd->lhr_control |= (1 << 28) | (1 << 29); // XXX } LPE_INC(prod, LPE_TXDESC_NUM); ==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/if_lpereg.h#3 (text+ko) ==== From owner-p4-projects@FreeBSD.ORG Wed Jun 29 02:15:22 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 30AD21065774; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B2AD106566C for ; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 397928FC16 for ; Wed, 29 Jun 2011 02:15:21 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5T2FL47000446 for ; Wed, 29 Jun 2011 02:15:21 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5T2FLPY000443 for perforce@freebsd.org; Wed, 29 Jun 2011 02:15:21 GMT (envelope-from jceel@freebsd.org) Date: Wed, 29 Jun 2011 02:15:21 GMT Message-Id: <201106290215.p5T2FLPY000443@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195493 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Jun 2011 02:15:22 -0000 http://p4web.freebsd.org/@@195493?ac=10 Change 195493 by jceel@jceel_cyclone on 2011/06/29 02:15:12 First version of USB OHCI host controller driver (broken). Affected files ... .. //depot/projects/soc2011/jceel_lpc/sys/arm/conf/EA3250#4 edit .. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/files.lpc#3 edit .. //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/lpc_ohci.c#2 edit .. //depot/projects/soc2011/jceel_lpc/sys/boot/fdt/dts/ea3250.dts#3 edit Differences ... ==== //depot/projects/soc2011/jceel_lpc/sys/arm/conf/EA3250#4 (text+ko) ==== @@ -73,6 +73,15 @@ device bpf device lpe +# USB +options USB_DEBUG +device usb +device ohci +device umass +device scbus +device pass +device da + # Flattened Device Tree options FDT options FDT_DTB_STATIC ==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/files.lpc#3 (text+ko) ==== @@ -10,5 +10,6 @@ arm/lpc/lpc_timer.c standard arm/lpc/lpc_rtc.c standard arm/lpc/if_lpe.c optional lpe +arm/lpc/lpc_ohci.c optional ohci dev/uart/uart_dev_ns8250.c optional uart kern/kern_clocksource.c standard ==== //depot/projects/soc2011/jceel_lpc/sys/arm/lpc/lpc_ohci.c#2 (text+ko) ==== @@ -27,15 +27,136 @@ #include __FBSDID("$FreeBSD$"); +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + + + static int lpc_ohci_probe(device_t dev); static int lpc_ohci_attach(device_t dev); +static int lpc_ohci_detach(device_t dev); +static int +lpc_ohci_probe(device_t dev) +{ + if (!ofw_bus_is_compatible(dev, "lpc,usb-ohci")) + return (ENXIO); + + device_set_desc(dev, "LPC32x0 USB OHCI controller"); + return (BUS_PROBE_DEFAULT); +} + +static int +lpc_ohci_attach(device_t dev) +{ + struct ohci_softc *sc = device_get_softc(dev); + int err; + int rid; + + sc->sc_bus.parent = dev; + sc->sc_bus.devices = sc->sc_devices; + sc->sc_bus.devices_max = OHCI_MAX_DEVICES; + + if (usb_bus_mem_alloc_all(&sc->sc_bus, USB_GET_DMA_TAG(dev), + &ohci_iterate_hw_softc)) + return (ENOMEM); + + rid = 0; + sc->sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE); + if (!sc->sc_io_res) { + device_printf(dev, "cannot map register space\n"); + goto fail; + } + + sc->sc_io_tag = rman_get_bustag(sc->sc_io_res); + sc->sc_io_hdl = rman_get_bushandle(sc->sc_io_res); + sc->sc_io_size = rman_get_size(sc->sc_io_res); + + rid = 0; + sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); + if (sc->sc_irq_res == NULL) { + device_printf(dev, "cannot allocate interrupt\n"); + goto fail; + } + + sc->sc_bus.bdev = device_add_child(dev, "usbus", -1); + if (!(sc->sc_bus.bdev)) + goto fail; + + device_set_ivars(sc->sc_bus.bdev, &sc->sc_bus); + strlcpy(sc->sc_vendor, "NXP", sizeof(sc->sc_vendor)); + + err = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE, + NULL , (void *)ohci_interrupt, sc, &sc->sc_intr_hdl); + if (err) { + sc->sc_intr_hdl = NULL; + goto fail; + } + + bus_space_write_4(sc->sc_io_tag, sc->sc_io_hdl, + OHCI_CONTROL, 0); + + err = ohci_init(sc); + if (err) + goto fail; + + err = device_probe_and_attach(sc->sc_bus.bdev); + if (err) + goto fail; + + return (0); + +fail: + /* XXX */ + return (ENXIO); +} + +static int +lpc_ohci_detach(device_t dev) +{ + return (0); +} + + static device_method_t lpc_ohci_methods[] = { /* Device interface */ DEVMETHOD(device_probe, lpc_ohci_probe), DEVMETHOD(device_attach, lpc_ohci_attach), DEVMETHOD(device_detach, lpc_ohci_detach), - DEVMETHOD(device_shutdown, lpc_ohci_shutdown), + DEVMETHOD(device_shutdown, bus_generic_shutdown), /* Bus interface */ DEVMETHOD(bus_print_child, bus_generic_print_child), ==== //depot/projects/soc2011/jceel_lpc/sys/boot/fdt/dts/ea3250.dts#3 (text+ko) ==== @@ -173,6 +173,13 @@ #size-cells = <1>; compatible = "simple-bus"; ranges = <0x0 0x30000000 0x10000000>; + + usb@1020000 { + compatible = "lpc,usb-ohci", "usb-ohci"; + reg = <0x1020000 0x20000>; + interrupts = <59>; + interrupt-parent = <&PIC>; + }; lpe@1060000 { compatible = "lpc,ethernet"; From owner-p4-projects@FreeBSD.ORG Wed Jun 29 08:27:38 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 10D7D1065679; Wed, 29 Jun 2011 08:27:38 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B2EA9106566C for ; Wed, 29 Jun 2011 08:27:37 +0000 (UTC) (envelope-from syuu@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id A01078FC22 for ; Wed, 29 Jun 2011 08:27:37 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p5T8Rbk3073989 for ; Wed, 29 Jun 2011 08:27:37 GMT (envelope-from syuu@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p5T8RbF5073986 for perforce@freebsd.org; Wed, 29 Jun 2011 08:27:37 GMT (envelope-from syuu@FreeBSD.org) Date: Wed, 29 Jun 2011 08:27:37 GMT Message-Id: <201106290827.p5T8RbF5073986@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to syuu@FreeBSD.org using -f From: Takuya ASADA To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195501 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Jun 2011 08:27:38 -0000 http://p4web.freebsd.org/@@195501?ac=10 Change 195501 by syuu@x200 on 2011/06/29 08:27:06 queue len, queue affinity ioctls moved from bpf to NIC device. Affected files ... .. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#7 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#10 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#6 edit .. //depot/projects/soc2011/mq_bpf/src/sys/sys/sockio.h#2 edit Differences ... ==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#7 (text+ko) ==== @@ -37,6 +37,7 @@ #include "opt_device_polling.h" #include "opt_inet.h" #include "opt_altq.h" +#include "opt_kdtrace.h" #endif #include @@ -55,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -92,6 +94,13 @@ #include "e1000_82575.h" #include "if_igb.h" +SDT_PROVIDER_DECLARE(igb); +SDT_PROVIDER_DEFINE(igb); +SDT_PROBE_DEFINE1(igb, functions, igb_ioctl_rxqlen, entry, entry, "int"); +SDT_PROBE_DEFINE1(igb, functions, igb_ioctl_txqlen, entry, entry, "int"); +SDT_PROBE_DEFINE2(igb, functions, igb_ioctl_rxqaffinity, entry, entry, "int", "int"); +SDT_PROBE_DEFINE2(igb, functions, igb_ioctl_txqaffinity, entry, entry, "int", "int"); + /********************************************************************* * Set this to one to display debug statistics *********************************************************************/ @@ -1173,6 +1182,60 @@ break; } + case SIOCGIFRXQLEN: + *(int *)data = ifp->if_rxq_num; + SDT_PROBE1(igb, functions, igb_ioctl_rxqlen, entry, ifp->if_rxq_num); + break; + + case SIOCGIFTXQLEN: + *(int *)data = ifp->if_txq_num; + SDT_PROBE1(igb, functions, igb_ioctl_txqlen, entry, ifp->if_txq_num); + break; + + case SIOCGIFRXQAFFINITY: + { + u_long index; + + index = *(u_long *)data; + if (index > ifp->if_rxq_num) { + log(LOG_ERR, "SIOCGIFRXQAFFINITY: index too large index:%lx rxq_num:%d\n", index, ifp->if_rxq_num); + error = EINVAL; + SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, -1, -1); + break; + } + if (!ifp->if_rxq_affinity) { + log(LOG_ERR, "!ifp->if_rxq_affinity\n"); + error = EINVAL; + SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, -1, -1); + break; + } + *(u_long *)data = ifp->if_rxq_affinity[index]; + SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, index, ifp->if_rxq_affinity[index]); + break; + } + + case SIOCGIFTXQAFFINITY: + { + u_long index; + + index = *(u_long *)data; + if (index > ifp->if_txq_num) { + log(LOG_ERR, "SIOCGIFTXQAFFINITY: index too large index:%lx txq_num:%x\n", index, ifp->if_txq_num); + error = EINVAL; + SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, -1, -1); + break; + } + if (!ifp->if_txq_affinity) { + log(LOG_ERR, "!ifp->if_txq_affinity\n"); + error = EINVAL; + SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, -1, -1); + break; + } + *(u_long *)data = ifp->if_txq_affinity[index]; + SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, index, ifp->if_txq_affinity[index]); + break; + } + default: error = ether_ioctl(ifp, command, data); break; ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#10 (text+ko) ==== @@ -210,10 +210,6 @@ SDT_PROBE_DEFINE3(bpf, functions, bpf_mtap_tx, entry, entry, "void *", "uint32_t", "uint32_t"); SDT_PROBE_DEFINE3(bpf, functions, bpf_mtap2_rx, entry, entry, "void *", "uint32_t", "uint32_t"); SDT_PROBE_DEFINE3(bpf, functions, bpf_mtap2_tx, entry, entry, "void *", "uint32_t", "uint32_t"); -SDT_PROBE_DEFINE1(bpf, functions, bpfioctl_biocrxqlen, entry, entry, "int"); -SDT_PROBE_DEFINE1(bpf, functions, bpfioctl_bioctxqlen, entry, entry, "int"); -SDT_PROBE_DEFINE2(bpf, functions, bpfioctl_biocrxqaffinity, entry, entry, "int", "int"); -SDT_PROBE_DEFINE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, entry, "int", "int"); SDT_PROBE_DEFINE1(bpf, functions, bpfioctl_biocenaqmask, entry, entry, "int"); SDT_PROBE_DEFINE1(bpf, functions, bpfioctl_biocdisqmask, entry, entry, "int"); SDT_PROBE_DEFINE1(bpf, functions, bpfioctl_biocstrxqmask, entry, entry, "int"); @@ -1544,107 +1540,6 @@ error = bpf_ioctl_rotzbuf(td, d, (struct bpf_zbuf *)addr); break; - case BIOCRXQLEN: - { - struct ifnet *ifp; - - if (d->bd_bif == NULL) { - /* - * No interface attached yet. - */ - error = EINVAL; - SDT_PROBE1(bpf, functions, bpfioctl_biocrxqlen, entry, -1); - break; - } - ifp = d->bd_bif->bif_ifp; - *(int *)addr = ifp->if_rxq_num; - SDT_PROBE1(bpf, functions, bpfioctl_biocrxqlen, entry, ifp->if_rxq_num); - break; - } - - case BIOCTXQLEN: - { - struct ifnet *ifp; - - if (d->bd_bif == NULL) { - /* - * No interface attached yet. - */ - error = EINVAL; - SDT_PROBE1(bpf, functions, bpfioctl_bioctxqlen, entry, -1); - break; - } - ifp = d->bd_bif->bif_ifp; - *(int *)addr = ifp->if_txq_num; - SDT_PROBE1(bpf, functions, bpfioctl_bioctxqlen, entry, ifp->if_txq_num); - break; - } - - case BIOCRXQAFFINITY: - { - u_long index; - struct ifnet *ifp; - - if (d->bd_bif == NULL) { - /* - * No interface attached yet. - */ - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_biocrxqaffinity, entry, -1, -1); - break; - } - ifp = d->bd_bif->bif_ifp; - index = *(u_long *)addr; - if (index > ifp->if_rxq_num) { - log(LOG_ERR, "BIOCRXQAFFINITY: index too large index:%lx rxq_num:%d\n", index, ifp->if_rxq_num); - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_biocrxqaffinity, entry, -1, -1); - break; - } - if (!ifp->if_rxq_affinity) { - log(LOG_ERR, "!ifp->if_rxq_affinity\n"); - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_biocrxqaffinity, entry, -1, -1); - break; - } - *(u_long *)addr = ifp->if_rxq_affinity[index]; - SDT_PROBE2(bpf, functions, bpfioctl_biocrxqaffinity, entry, index, ifp->if_rxq_affinity[index]); - break; - } - - case BIOCTXQAFFINITY: - { - u_long index; - struct ifnet *ifp; - - if (d->bd_bif == NULL) { - log(LOG_ERR, "d->bd_bif == NULL\n"); - /* - * No interface attached yet. - */ - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, -1, -1); - break; - } - ifp = d->bd_bif->bif_ifp; - index = *(u_long *)addr; - if (index > ifp->if_txq_num) { - log(LOG_ERR, "BIOCTXQAFFINITY: index too large index:%lx txq_num:%x\n", index, ifp->if_txq_num); - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, -1, -1); - break; - } - if (!ifp->if_txq_affinity) { - log(LOG_ERR, "!ifp->if_txq_affinity\n"); - error = EINVAL; - SDT_PROBE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, -1, -1); - break; - } - *(u_long *)addr = ifp->if_txq_affinity[index]; - SDT_PROBE2(bpf, functions, bpfioctl_bioctxqaffinity, entry, index, ifp->if_txq_affinity[index]); - break; - } - case BIOCENAQMASK: { int i; ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.h#6 (text+ko) ==== @@ -150,21 +150,17 @@ #define BIOCSETFNR _IOW('B', 130, struct bpf_program) #define BIOCGTSTAMP _IOR('B', 131, u_int) #define BIOCSTSTAMP _IOW('B', 132, u_int) -#define BIOCRXQLEN _IOR('B', 133, int) -#define BIOCTXQLEN _IOR('B', 134, int) -#define BIOCRXQAFFINITY _IOWR('B', 135, u_long) -#define BIOCTXQAFFINITY _IOWR('B', 136, u_long) -#define BIOCENAQMASK _IO('B', 137) -#define BIOCDISQMASK _IO('B', 138) -#define BIOCSTRXQMASK _IOWR('B', 139, uint32_t) -#define BIOCCRRXQMASK _IOWR('B', 140, uint32_t) -#define BIOCGTRXQMASK _IOR('B', 141, uint32_t) -#define BIOCSTTXQMASK _IOWR('B', 141, uint32_t) -#define BIOCCRTXQMASK _IOWR('B', 142, uint32_t) -#define BIOCGTTXQMASK _IOR('B', 143, uint32_t) -#define BIOCSTOTHERMASK _IO('B', 143) -#define BIOCCROTHERMASK _IO('B', 144) -#define BIOCGTOTHERMASK _IOR('B', 145, uint32_t) +#define BIOCENAQMASK _IO('B', 133) +#define BIOCDISQMASK _IO('B', 134) +#define BIOCSTRXQMASK _IOWR('B', 135, uint32_t) +#define BIOCCRRXQMASK _IOWR('B', 136, uint32_t) +#define BIOCGTRXQMASK _IOR('B', 137, uint32_t) +#define BIOCSTTXQMASK _IOWR('B', 138, uint32_t) +#define BIOCCRTXQMASK _IOWR('B', 139, uint32_t) +#define BIOCGTTXQMASK _IOR('B', 140, uint32_t) +#define BIOCSTOTHERMASK _IO('B', 141) +#define BIOCCROTHERMASK _IO('B', 142) +#define BIOCGTOTHERMASK _IOR('B', 143, uint32_t) /* Obsolete */ #define BIOCGSEESENT BIOCGDIRECTION ==== //depot/projects/soc2011/mq_bpf/src/sys/sys/sockio.h#2 (text+ko) ==== @@ -97,6 +97,11 @@ #define SIOCGIFSTATUS _IOWR('i', 59, struct ifstat) /* get IF status */ #define SIOCSIFLLADDR _IOW('i', 60, struct ifreq) /* set linklevel addr */ +#define SIOCGIFRXQLEN _IOR('B', 61, int) /* get IF rx queue len */ +#define SIOCGIFTXQLEN _IOR('B', 62, int) /* get IF tx queue len */ +#define SIOCGIFRXQAFFINITY _IOWR('B', 63, u_long) /* get IF rx queue affinity */ +#define SIOCGIFTXQAFFINITY _IOWR('B', 64, u_long) /* get IF tx queue affinity */ + #define SIOCSIFPHYADDR _IOW('i', 70, struct ifaliasreq) /* set gif addres */ #define SIOCGIFPSRCADDR _IOWR('i', 71, struct ifreq) /* get gif psrc addr */ #define SIOCGIFPDSTADDR _IOWR('i', 72, struct ifreq) /* get gif pdst addr */ From owner-p4-projects@FreeBSD.ORG Sat Jul 2 00:36:01 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F25071065674; Sat, 2 Jul 2011 00:36:00 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B4A8F106566C for ; Sat, 2 Jul 2011 00:36:00 +0000 (UTC) (envelope-from syuu@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id A116E8FC0A for ; Sat, 2 Jul 2011 00:36:00 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p620a0Is041572 for ; Sat, 2 Jul 2011 00:36:00 GMT (envelope-from syuu@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p620a0iv041569 for perforce@freebsd.org; Sat, 2 Jul 2011 00:36:00 GMT (envelope-from syuu@FreeBSD.org) Date: Sat, 2 Jul 2011 00:36:00 GMT Message-Id: <201107020036.p620a0iv041569@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to syuu@FreeBSD.org using -f From: Takuya ASADA To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195608 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Jul 2011 00:36:01 -0000 http://p4web.freebsd.org/@@195608?ac=10 Change 195608 by syuu@x200 on 2011/07/02 00:35:38 queue len, queue affinity ioctls moved from bpf to NIC device, pt.2(some features still not working for now) queue len, queue affinity info show up on ifconfig. remove mq support on em. Affected files ... .. //depot/projects/soc2011/mq_bpf/src/sbin/ifconfig/ifconfig.c#2 edit .. //depot/projects/soc2011/mq_bpf/src/sys/amd64/conf/RSS#2 edit .. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_em.c#4 edit .. //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#8 edit .. //depot/projects/soc2011/mq_bpf/src/sys/kern/sys_socket.c#2 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#11 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/if.c#2 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/if.h#4 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/if_ethersubr.c#4 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/if_var.h#6 edit .. //depot/projects/soc2011/mq_bpf/src/sys/net/netisr.c#3 edit .. //depot/projects/soc2011/mq_bpf/src/sys/netinet/in_rss.c#2 edit .. //depot/projects/soc2011/mq_bpf/src/sys/sys/priv.h#3 edit .. //depot/projects/soc2011/mq_bpf/src/sys/sys/sockio.h#3 edit Differences ... ==== //depot/projects/soc2011/mq_bpf/src/sbin/ifconfig/ifconfig.c#2 (text+ko) ==== @@ -885,7 +885,7 @@ #define IFCAPBITS \ "\020\1RXCSUM\2TXCSUM\3NETCONS\4VLAN_MTU\5VLAN_HWTAGGING\6JUMBO_MTU\7POLLING" \ "\10VLAN_HWCSUM\11TSO4\12TSO6\13LRO\14WOL_UCAST\15WOL_MCAST\16WOL_MAGIC" \ -"\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE" +"\21VLAN_HWFILTER\23VLAN_HWTSO\24LINKSTATE\25MULTIQUEUE\26SOFT_MULTIQUEUE" /* * Print the status of the interface. If an address family was @@ -952,6 +952,35 @@ } } + if ((ifr.ifr_reqcap & IFCAP_MULTIQUEUE) | + (ifr.ifr_reqcap & IFCAP_SOFT_MULTIQUEUE)) { + int i, rxqlen = 0, txqlen = 0; + + if (ioctl(s, SIOCGIFQLEN, &ifr) == 0) { + rxqlen = ifr.ifr_rxqueue_len; + txqlen = ifr.ifr_txqueue_len; + }else + perror("ioctl"); + + printf("\trxqueue len:%d affinity:", rxqlen); + for (i = 0; i < rxqlen; i++) { + ifr.ifr_queue_affinity_idx = i; + if (ioctl(s, SIOCGIFRXQAFFINITY, &ifr) == 0) + printf(" %d:%d", ifr.ifr_queue_affinity_idx, + ifr.ifr_queue_affinity_cpu); + } + putchar('\n'); + + printf("\ttxqueue len:%d affinity:", txqlen); + for (i = 0; i < txqlen; i++) { + ifr.ifr_queue_affinity_idx = i; + if (ioctl(s, SIOCGIFTXQAFFINITY, &ifr) == 0) + printf(" %d:%d", ifr.ifr_queue_affinity_idx, + ifr.ifr_queue_affinity_cpu); + } + putchar('\n'); + } + tunnel_status(s); for (ift = ifa; ift != NULL; ift = ift->ifa_next) { ==== //depot/projects/soc2011/mq_bpf/src/sys/amd64/conf/RSS#2 (text+ko) ==== @@ -1,4 +1,9 @@ -include GENERIC +include VESA ident RSS options RSS +options KDTRACE_HOOKS +options DDB_CTF +options KDTRACE_FRAME + +makeoptions WITH_CTF=1 ==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_em.c#4 (text+ko) ==== @@ -436,7 +436,7 @@ { struct adapter *adapter; struct e1000_hw *hw; - int error = 0, i; + int error = 0; INIT_DEBUGOUT("em_attach: begin"); @@ -685,18 +685,7 @@ adapter->led_dev = led_create(em_led_func, adapter, device_get_nameunit(dev)); - adapter->ifp->if_rxq_num = adapter->num_queues; - adapter->ifp->if_txq_num = adapter->num_queues; - adapter->ifp->if_rxq_affinity = - (u_long *)malloc(sizeof(u_long) * adapter->num_queues, - M_DEVBUF, M_NOWAIT); - adapter->ifp->if_txq_affinity = - (u_long *)malloc(sizeof(u_long) * adapter->num_queues, - M_DEVBUF, M_NOWAIT); - for (i = 0; i < adapter->num_queues; i++) { - adapter->ifp->if_rxq_affinity[i] = i; - adapter->ifp->if_rxq_affinity[i] = i; - } + INIT_DEBUGOUT("em_attach: end"); return (0); @@ -876,9 +865,6 @@ enq++; drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); - next->m_pkthdr.rxqid = (uint32_t)-1; - next->m_pkthdr.txqid = txr->me; - ETHER_BPF_MTAP(ifp, next); if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) break; @@ -4304,8 +4290,6 @@ sendmp->m_pkthdr.flowid = rxr->msix; sendmp->m_flags |= M_FLOWID; #endif - sendmp->m_pkthdr.rxqid = rxr->msix; - sendmp->m_pkthdr.txqid = (uint32_t)-1; #ifndef __NO_STRICT_ALIGNMENT skip: #endif ==== //depot/projects/soc2011/mq_bpf/src/sys/dev/e1000/if_igb.c#8 (text+ko) ==== @@ -37,7 +37,6 @@ #include "opt_device_polling.h" #include "opt_inet.h" #include "opt_altq.h" -#include "opt_kdtrace.h" #endif #include @@ -56,7 +55,6 @@ #include #include #include -#include #include #include #include @@ -94,13 +92,6 @@ #include "e1000_82575.h" #include "if_igb.h" -SDT_PROVIDER_DECLARE(igb); -SDT_PROVIDER_DEFINE(igb); -SDT_PROBE_DEFINE1(igb, functions, igb_ioctl_rxqlen, entry, entry, "int"); -SDT_PROBE_DEFINE1(igb, functions, igb_ioctl_txqlen, entry, entry, "int"); -SDT_PROBE_DEFINE2(igb, functions, igb_ioctl_rxqaffinity, entry, entry, "int", "int"); -SDT_PROBE_DEFINE2(igb, functions, igb_ioctl_txqaffinity, entry, entry, "int", "int"); - /********************************************************************* * Set this to one to display debug statistics *********************************************************************/ @@ -274,6 +265,11 @@ const char *, int *, int); static int igb_set_flowcntl(SYSCTL_HANDLER_ARGS); +static int igb_get_rxqueue_len(struct ifnet *); +static int igb_get_txqueue_len(struct ifnet *); +static int igb_get_rxqueue_affinity(struct ifnet *, int); +static int igb_get_txqueue_affinity(struct ifnet *, int); + #ifdef DEVICE_POLLING static poll_handler_t igb_poll; #endif /* POLLING */ @@ -436,7 +432,7 @@ igb_attach(device_t dev) { struct adapter *adapter; - int error = 0, i; + int error = 0; u16 eeprom_data; INIT_DEBUGOUT("igb_attach: begin"); @@ -660,19 +656,6 @@ adapter->led_dev = led_create(igb_led_func, adapter, device_get_nameunit(dev)); - - adapter->ifp->if_rxq_num = adapter->num_queues; - adapter->ifp->if_txq_num = adapter->num_queues; - adapter->ifp->if_rxq_affinity = - (u_long *)malloc(sizeof(u_long) * adapter->ifp->if_rxq_num, - M_DEVBUF, M_NOWAIT); - adapter->ifp->if_txq_affinity = - (u_long *)malloc(sizeof(u_long) * adapter->ifp->if_txq_num, - M_DEVBUF, M_NOWAIT); - for (i = 0; i < adapter->ifp->if_rxq_num; i++) - adapter->ifp->if_rxq_affinity[i] = i; - for (i = 0; i < adapter->ifp->if_txq_num; i++) - adapter->ifp->if_txq_affinity[i] = i; INIT_DEBUGOUT("igb_attach: end"); return (0); @@ -1182,60 +1165,6 @@ break; } - case SIOCGIFRXQLEN: - *(int *)data = ifp->if_rxq_num; - SDT_PROBE1(igb, functions, igb_ioctl_rxqlen, entry, ifp->if_rxq_num); - break; - - case SIOCGIFTXQLEN: - *(int *)data = ifp->if_txq_num; - SDT_PROBE1(igb, functions, igb_ioctl_txqlen, entry, ifp->if_txq_num); - break; - - case SIOCGIFRXQAFFINITY: - { - u_long index; - - index = *(u_long *)data; - if (index > ifp->if_rxq_num) { - log(LOG_ERR, "SIOCGIFRXQAFFINITY: index too large index:%lx rxq_num:%d\n", index, ifp->if_rxq_num); - error = EINVAL; - SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, -1, -1); - break; - } - if (!ifp->if_rxq_affinity) { - log(LOG_ERR, "!ifp->if_rxq_affinity\n"); - error = EINVAL; - SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, -1, -1); - break; - } - *(u_long *)data = ifp->if_rxq_affinity[index]; - SDT_PROBE2(igb, functions, igb_ioctl_rxqaffinity, entry, index, ifp->if_rxq_affinity[index]); - break; - } - - case SIOCGIFTXQAFFINITY: - { - u_long index; - - index = *(u_long *)data; - if (index > ifp->if_txq_num) { - log(LOG_ERR, "SIOCGIFTXQAFFINITY: index too large index:%lx txq_num:%x\n", index, ifp->if_txq_num); - error = EINVAL; - SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, -1, -1); - break; - } - if (!ifp->if_txq_affinity) { - log(LOG_ERR, "!ifp->if_txq_affinity\n"); - error = EINVAL; - SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, -1, -1); - break; - } - *(u_long *)data = ifp->if_txq_affinity[index]; - SDT_PROBE2(igb, functions, igb_ioctl_txqaffinity, entry, index, ifp->if_txq_affinity[index]); - break; - } - default: error = ether_ioctl(ifp, command, data); break; @@ -2831,12 +2760,15 @@ ifp->if_transmit = igb_mq_start; ifp->if_qflush = igb_qflush; #endif + ifp->if_get_rxqueue_len = igb_get_rxqueue_len; + ifp->if_get_txqueue_len = igb_get_txqueue_len; + ifp->if_get_rxqueue_affinity = igb_get_rxqueue_affinity; + ifp->if_get_txqueue_affinity = igb_get_txqueue_affinity; + IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1); ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1; IFQ_SET_READY(&ifp->if_snd); - ether_ifattach(ifp, adapter->hw.mac.addr); - ifp->if_capabilities = ifp->if_capenable = 0; ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM; @@ -2870,6 +2802,8 @@ */ ifp->if_capabilities |= IFCAP_VLAN_HWFILTER; + ether_ifattach(ifp, adapter->hw.mac.addr); + /* * Specify the media types supported by this adapter and register * callbacks to update media and link information @@ -5656,3 +5590,29 @@ e1000_force_mac_fc(&adapter->hw); return error; } + +static int +igb_get_rxqueue_len(struct ifnet *ifp) +{ + struct adapter *adapter = ifp->if_softc; + return adapter->num_queues; +} + +static int +igb_get_txqueue_len(struct ifnet *ifp) +{ + struct adapter *adapter = ifp->if_softc; + return adapter->num_queues; +} + +static int +igb_get_rxqueue_affinity(struct ifnet *ifp, int queid) +{ + return queid; +} + +static int +igb_get_txqueue_affinity(struct ifnet *ifp, int queid) +{ + return queid; +} ==== //depot/projects/soc2011/mq_bpf/src/sys/kern/sys_socket.c#2 (text+ko) ==== ==== //depot/projects/soc2011/mq_bpf/src/sys/net/bpf.c#11 (text+ko) ==== @@ -41,7 +41,6 @@ #include "opt_compat.h" #include "opt_netgraph.h" #include "opt_kdtrace.h" -#include "opt_rss.h" #include #include @@ -77,9 +76,6 @@ #include #include #include -#ifdef SOFTRSS -#include -#endif #include #include #include @@ -1542,7 +1538,6 @@ case BIOCENAQMASK: { - int i; struct ifnet *ifp; if (d->bd_bif == NULL) { @@ -1561,41 +1556,23 @@ break; } ifp = d->bd_bif->bif_ifp; - if (!(ifp->if_capenable & IFCAP_MULTIQUEUE)) { -#ifdef SOFTRSS - ifp->if_rxq_num = netisr_get_cpucount(); - ifp->if_txq_num = 1; - ifp->if_capabilities |= IFCAP_SOFT_MULTIQUEUE; - ifp->if_capenable |= IFCAP_SOFT_MULTIQUEUE; - ifp->if_rxq_affinity = - (u_long *)malloc(sizeof(u_long) * ifp->if_rxq_num, - M_DEVBUF, M_NOWAIT); - ifp->if_txq_affinity = - (u_long *)malloc(sizeof(u_long) * ifp->if_txq_num, - M_DEVBUF, M_NOWAIT); - for (i = 0; i < ifp->if_rxq_num; i++) - ifp->if_rxq_affinity[i] = i; - for (i = 0; i < ifp->if_txq_num; i++) - ifp->if_txq_affinity[i] = i; -#else + if (!((ifp->if_capabilities & IFCAP_MULTIQUEUE) | + (ifp->if_capabilities & IFCAP_SOFT_MULTIQUEUE))) { log(LOG_ERR, "if doesn't support multiqueue"); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_biocenaqmask, entry, -1); break; -#endif + } - - log(LOG_DEBUG, "if_rxq_num:%d\n", ifp->if_rxq_num); - log(LOG_DEBUG, "if_txq_num:%d\n", ifp->if_txq_num); d->bd_qmask.qm_enabled = TRUE; d->bd_qmask.qm_rxq_mask = - malloc(ifp->if_rxq_num * sizeof(boolean_t), M_BPF, + malloc(ifp->if_get_rxqueue_len(ifp) * sizeof(boolean_t), M_BPF, M_WAITOK | M_ZERO); d->bd_qmask.qm_txq_mask = - malloc(ifp->if_txq_num * sizeof(boolean_t), M_BPF, + malloc(ifp->if_get_txqueue_len(ifp) * sizeof(boolean_t), M_BPF, M_WAITOK | M_ZERO); d->bd_qmask.qm_other_mask = FALSE; - SDT_PROBE1(bpf, functions, bpfioctl_biocenaqmask, entry, ifp->if_rxq_num); + SDT_PROBE1(bpf, functions, bpfioctl_biocenaqmask, entry, ifp->if_get_rxqueue_len(ifp)); break; } @@ -1645,8 +1622,8 @@ } ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_rxq_num) { - log(LOG_ERR, "BIOCSTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_rxq_num); + if (index > ifp->if_get_rxqueue_len(ifp)) { + log(LOG_ERR, "BIOCSTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp)); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_biocstrxqmask, entry, -1); break; @@ -1678,8 +1655,8 @@ } ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_rxq_num) { - log(LOG_ERR, "BIOCCRRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_rxq_num); + if (index > ifp->if_get_rxqueue_len(ifp)) { + log(LOG_ERR, "BIOCCRRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp)); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_bioccrrxqmask, entry, -1); break; @@ -1711,8 +1688,8 @@ } ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_rxq_num) { - log(LOG_ERR, "BIOCGTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_rxq_num); + if (index > ifp->if_get_rxqueue_len(ifp)) { + log(LOG_ERR, "BIOCGTRXQMASK: index too large index:%x rxq_num:%x\n", index, ifp->if_get_rxqueue_len(ifp)); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_biocgtrxqmask, entry, -1); break; @@ -1745,8 +1722,8 @@ ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_txq_num) { - log(LOG_ERR, "BIOCSTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_txq_num); + if (index > ifp->if_get_txqueue_len(ifp)) { + log(LOG_ERR, "BIOCSTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp)); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_biocsttxqmask, entry, -1); break; @@ -1779,8 +1756,8 @@ ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_txq_num) { - log(LOG_ERR, "BIOCCRTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_txq_num); + if (index > ifp->if_get_txqueue_len(ifp)) { + log(LOG_ERR, "BIOCCRTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp)); error = EINVAL; SDT_PROBE1(bpf, functions, bpfioctl_bioccrtxqmask, entry, -1); break; @@ -1812,8 +1789,8 @@ } ifp = d->bd_bif->bif_ifp; index = *(uint32_t *)addr; - if (index > ifp->if_txq_num) { - log(LOG_ERR, "BIOCGTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_txq_num); + if (index > ifp->if_get_txqueue_len(ifp)) { + log(LOG_ERR, "BIOCGTTXQMASK: index too large index:%x txq_num:%x\n", index, ifp->if_get_txqueue_len(ifp)); error = EINVAL; SDT_PROBE2(bpf, functions, bpfioctl_biocgttxqmask, entry, -1, -1); break; @@ -2219,17 +2196,18 @@ if (!d->bd_qmask.qm_other_mask) continue; } else { + struct ifnet *ifp = bp->bif_ifp; if (m->m_pkthdr.rxqid != (uint32_t)-1) - KASSERT(m->m_pkthdr.rxqid < bp->bif_ifp->if_rxq_num, + KASSERT(m->m_pkthdr.rxqid < ifp->if_get_rxqueue_len(ifp), ("rxqid is not vaild rxqid:%x rxq_num:%x", - m->m_pkthdr.rxqid, bp->bif_ifp->if_rxq_num)); + m->m_pkthdr.rxqid, ifp->if_get_rxqueue_len(ifp))); if (m->m_pkthdr.txqid != (uint32_t)-1) - KASSERT(m->m_pkthdr.txqid < bp->bif_ifp->if_txq_num, + KASSERT(m->m_pkthdr.txqid < ifp->if_get_txqueue_len(ifp), ("txqid is not vaild txqid:%x txq_num:%x", - m->m_pkthdr.txqid, bp->bif_ifp->if_txq_num)); + m->m_pkthdr.txqid, ifp->if_get_txqueue_len(ifp))); - SDT_PROBE3(bpf, functions, bpf_mtap_rx, entry, d, m->m_pkthdr.rxqid, bp->bif_ifp->if_rxq_num); - SDT_PROBE3(bpf, functions, bpf_mtap_tx, entry, d, m->m_pkthdr.txqid, bp->bif_ifp->if_txq_num); + SDT_PROBE3(bpf, functions, bpf_mtap_rx, entry, d, m->m_pkthdr.rxqid, ifp->if_get_rxqueue_len(ifp)); + SDT_PROBE3(bpf, functions, bpf_mtap_tx, entry, d, m->m_pkthdr.txqid, ifp->if_get_txqueue_len(ifp)); if (m->m_pkthdr.rxqid != (uint32_t)-1 && !d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqid]) continue; @@ -2300,8 +2278,9 @@ BPFIF_RLOCK(bp, &tracker); LIST_FOREACH(d, &bp->bif_dlist, bd_next) { if (d->bd_qmask.qm_enabled) { - SDT_PROBE3(bpf, functions, bpf_mtap2_rx, entry, d, m->m_pkthdr.rxqid, bp->bif_ifp->if_rxq_num); - SDT_PROBE3(bpf, functions, bpf_mtap2_tx, entry, d, m->m_pkthdr.txqid, bp->bif_ifp->if_txq_num); + struct ifnet *ifp = bp->bif_ifp; + SDT_PROBE3(bpf, functions, bpf_mtap2_rx, entry, d, m->m_pkthdr.rxqid, ifp->if_get_rxqueue_len(ifp)); + SDT_PROBE3(bpf, functions, bpf_mtap2_tx, entry, d, m->m_pkthdr.txqid, ifp->if_get_txqueue_len(ifp)); if (m->m_pkthdr.rxqid != (uint32_t)-1 && !d->bd_qmask.qm_rxq_mask[m->m_pkthdr.rxqid]) ==== //depot/projects/soc2011/mq_bpf/src/sys/net/if.c#2 (text+ko) ==== @@ -2418,6 +2418,32 @@ break; } + case SIOCGIFQLEN: + if (!ifp->if_capabilities & IFCAP_MULTIQUEUE && + !ifp->if_capabilities & IFCAP_SOFT_MULTIQUEUE) + return (EOPNOTSUPP); + KASSERT(ifp->if_get_rxqueue_len, ("if_get_rxqueue_len not set")); + KASSERT(ifp->if_get_txqueue_len, ("if_get_txqueue_len not set")); + ifr->ifr_rxqueue_len = ifp->if_get_rxqueue_len(ifp); + ifr->ifr_txqueue_len = ifp->if_get_txqueue_len(ifp); + break; + + case SIOCGIFRXQAFFINITY: + if (!ifp->if_capabilities & IFCAP_MULTIQUEUE && + !ifp->if_capabilities & IFCAP_SOFT_MULTIQUEUE) + return (EOPNOTSUPP); + KASSERT(ifp->if_get_rxqueue_affinity, ("if_get_rxqueue_affinity not set")); + ifr->ifr_affinity_cpu = ifp->if_get_rxqueue_affinity(ifp, ifr->ifr_affinity_que); + break; + + case SIOCGIFTXQAFFINITY: + if (!ifp->if_capabilities & IFCAP_MULTIQUEUE && + !ifp->if_capabilities & IFCAP_SOFT_MULTIQUEUE) + return (EOPNOTSUPP); + KASSERT(ifp->if_get_rxqueue_affinity, ("if_get_rxqueue_affinity not set")); + ifr->ifr_affinity_cpu = ifp->if_get_rxqueue_affinity(ifp, ifr->ifr_affinity_que); + break; + default: error = ENOIOCTL; break; ==== //depot/projects/soc2011/mq_bpf/src/sys/net/if.h#4 (text+ko) ==== @@ -317,6 +317,8 @@ int ifru_media; caddr_t ifru_data; int ifru_cap[2]; + int ifru_queue_len[2]; + int ifru_queue_affinity[2]; } ifr_ifru; #define ifr_addr ifr_ifru.ifru_addr /* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ @@ -333,6 +335,10 @@ #define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */ #define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ #define ifr_index ifr_ifru.ifru_index /* interface index */ +#define ifr_rxqueue_len ifr_ifru.ifru_queue_len[0] /* rxqueue len */ +#define ifr_txqueue_len ifr_ifru.ifru_queue_len[1] /* txqueue len */ +#define ifr_affinity_que ifr_ifru.ifru_queue_affinity[0] /* queue id */ +#define ifr_affinity_cpu ifr_ifru.ifru_queue_affinity[1] /* cpu id */ }; #define _SIZEOF_ADDR_IFREQ(ifr) \ ==== //depot/projects/soc2011/mq_bpf/src/sys/net/if_ethersubr.c#4 (text+ko) ==== @@ -153,6 +153,12 @@ #define V_ether_ipfw VNET(ether_ipfw) #endif +#ifdef SOFTRSS +static int softrss_get_rxqueue_len(struct ifnet *); +static int softrss_get_txqueue_len(struct ifnet *); +static int softrss_get_rxqueue_affinity(struct ifnet *, int); +static int softrss_get_txqueue_affinity(struct ifnet *, int); +#endif /* * Ethernet output routine. @@ -823,7 +829,6 @@ static void ether_input(struct ifnet *ifp, struct mbuf *m) { - log(LOG_DEBUG, "%s ifp:%p m:%p\n", __func__, ifp, m); #if defined(RSS) || defined(SOFTRSS) /* * We will rely on rcvif being set properly in the deferred context, @@ -1054,6 +1059,17 @@ break; if (i != ifp->if_addrlen) if_printf(ifp, "Ethernet address: %6D\n", lla, ":"); + +#ifdef SOFTRSS + if (!ifp->if_capabilities & IFCAP_MULTIQUEUE) { + ifp->if_capabilities |= IFCAP_SOFT_MULTIQUEUE; + ifp->if_capenable |= IFCAP_SOFT_MULTIQUEUE; + ifp->if_get_rxqueue_len = softrss_get_rxqueue_len; + ifp->if_get_txqueue_len = softrss_get_txqueue_len; + ifp->if_get_rxqueue_affinity = softrss_get_rxqueue_affinity; + ifp->if_get_txqueue_affinity = softrss_get_txqueue_affinity; + } +#endif } /* @@ -1439,5 +1455,31 @@ return (m); } +#ifdef SOFTRSS +static int +softrss_get_rxqueue_len(struct ifnet *ifp) +{ + return netisr_get_cpucount(); +} + +static int +softrss_get_txqueue_len(struct ifnet *ifp) +{ + return 1; +} + +static int +softrss_get_rxqueue_affinity(struct ifnet *ifp, int queid) +{ + netisr_get_cpuid(queid); +} + +static int +softrss_get_txqueue_affinity(struct ifnet *ifp, int queid) +{ + return 0; +} +#endif + DECLARE_MODULE(ether, ether_mod, SI_SUB_INIT_IF, SI_ORDER_ANY); MODULE_VERSION(ether, 1); ==== //depot/projects/soc2011/mq_bpf/src/sys/net/if_var.h#6 (text+ko) ==== @@ -171,6 +171,15 @@ (struct ifnet *, struct mbuf *); void (*if_reassign) /* reassign to vnet routine */ (struct ifnet *, struct vnet *, char *); + int (*if_get_rxqueue_len) + (struct ifnet *); + int (*if_get_txqueue_len) + (struct ifnet *); + int (*if_get_rxqueue_affinity) + (struct ifnet *, int); + int (*if_get_txqueue_affinity) + (struct ifnet *, int); + struct vnet *if_home_vnet; /* where this ifnet originates from */ struct ifaddr *if_addr; /* pointer to link-level address */ void *if_llsoftc; /* link layer softc */ @@ -206,11 +215,6 @@ char *if_description; /* interface description */ void *if_pspare[7]; int if_ispare[4]; - - int if_rxq_num; - int if_txq_num; - u_long *if_rxq_affinity; - u_long *if_txq_affinity; }; typedef void if_init_f_t(void *); ==== //depot/projects/soc2011/mq_bpf/src/sys/net/netisr.c#3 (text+ko) ==== @@ -65,7 +65,6 @@ #include "opt_ddb.h" #include "opt_device_polling.h" -#include "opt_kdtrace.h" #include #include @@ -83,7 +82,6 @@ #include #include #include -#include #include #ifdef DDB @@ -306,11 +304,6 @@ #define NWS_UNLOCK(s) mtx_unlock(&(s)->nws_mtx) #define NWS_SIGNAL(s) swi_sched((s)->nws_swi_cookie, 0) -SDT_PROVIDER_DECLARE(netisr); -SDT_PROVIDER_DEFINE(netisr); -SDT_PROBE_DEFINE2(netisr, functions, netisr_dispatch_src, entry, entry, "u_int", "u_int"); -SDT_PROBE_DEFINE1(netisr, functions, netisr_select_cpuid, entry, entry, "u_int"); - /* * Utility routines for protocols that implement their own mapping of flows * to CPUs. @@ -751,8 +744,7 @@ { struct ifnet *ifp; u_int policy; - log(LOG_DEBUG, "%s npp:%p dispatch_policy:%d m:%p\n", - __func__, npp, dispatch_policy,m); + NETISR_LOCK_ASSERT(); /* @@ -1021,7 +1013,6 @@ int netisr_queue(u_int proto, struct mbuf *m) { - log(LOG_DEBUG, "%s: proto:%d m:%p\n", __func__, proto, m); return (netisr_queue_src(proto, 0, m)); } @@ -1050,8 +1041,6 @@ KASSERT(npp->np_handler != NULL, ("%s: invalid proto %u", __func__, proto)); - SDT_PROBE2(netisr, functions, netisr_dispatch_src, entry, npp->np_dispatch, npp->np_policy); - dispatch_policy = netisr_get_dispatch(npp); if (dispatch_policy == NETISR_DISPATCH_DEFERRED) return (netisr_queue_src(proto, source, m)); @@ -1084,7 +1073,6 @@ sched_pin(); m = netisr_select_cpuid(&netisr_proto[proto], NETISR_DISPATCH_HYBRID, source, m, &cpuid); - SDT_PROBE1(netisr, functions, netisr_select_cpuid, entry, cpuid); if (m == NULL) { error = ENOBUFS; goto out_unpin; @@ -1158,7 +1146,6 @@ int netisr_dispatch(u_int proto, struct mbuf *m) { - log(LOG_DEBUG, "%s proto:%d m:%p\n", __func__, proto, m); return (netisr_dispatch_src(proto, 0, m)); } ==== //depot/projects/soc2011/mq_bpf/src/sys/netinet/in_rss.c#2 (text+ko) ==== @@ -179,8 +179,9 @@ }; static struct rss_table_entry rss_table[RSS_TABLE_MAXLEN]; - +#ifdef SOFTRSS static void softrss_set_flowid(struct mbuf *m); +#endif SDT_PROVIDER_DECLARE(rss); SDT_PROVIDER_DEFINE(rss); @@ -426,7 +427,6 @@ struct mbuf * rss_m2cpuid(struct mbuf *m, uintptr_t source, u_int *cpuid) { - log(LOG_DEBUG,"%s m:%p\n", __func__, m); M_ASSERTPKTHDR(m); #ifdef SOFTRSS ==== //depot/projects/soc2011/mq_bpf/src/sys/sys/priv.h#3 (text+ko) ==== ==== //depot/projects/soc2011/mq_bpf/src/sys/sys/sockio.h#3 (text+ko) ==== @@ -82,6 +82,10 @@ #define SIOCSIFDESCR _IOW('i', 41, struct ifreq) /* set ifnet descr */ #define SIOCGIFDESCR _IOWR('i', 42, struct ifreq) /* get ifnet descr */ +#define SIOCGIFQLEN _IOWR('i', 45, struct ifreq) /* get IF queue len */ +#define SIOCGIFRXQAFFINITY _IOWR('i', 46, u_long) /* get IF rx queue affinity */ +#define SIOCGIFTXQAFFINITY _IOWR('i', 47, u_long) /* get IF tx queue affinity */ + #define SIOCADDMULTI _IOW('i', 49, struct ifreq) /* add m'cast addr */ #define SIOCDELMULTI _IOW('i', 50, struct ifreq) /* del m'cast addr */ #define SIOCGIFMTU _IOWR('i', 51, struct ifreq) /* get IF mtu */ @@ -97,11 +101,6 @@ #define SIOCGIFSTATUS _IOWR('i', 59, struct ifstat) /* get IF status */ #define SIOCSIFLLADDR _IOW('i', 60, struct ifreq) /* set linklevel addr */ -#define SIOCGIFRXQLEN _IOR('B', 61, int) /* get IF rx queue len */ -#define SIOCGIFTXQLEN _IOR('B', 62, int) /* get IF tx queue len */ -#define SIOCGIFRXQAFFINITY _IOWR('B', 63, u_long) /* get IF rx queue affinity */ -#define SIOCGIFTXQAFFINITY _IOWR('B', 64, u_long) /* get IF tx queue affinity */ - #define SIOCSIFPHYADDR _IOW('i', 70, struct ifaliasreq) /* set gif addres */ #define SIOCGIFPSRCADDR _IOWR('i', 71, struct ifreq) /* get gif psrc addr */ #define SIOCGIFPDSTADDR _IOWR('i', 72, struct ifreq) /* get gif pdst addr */ From owner-p4-projects@FreeBSD.ORG Sat Jul 2 19:45:23 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 50E711065677; Sat, 2 Jul 2011 19:45:23 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EEE5E1065673 for ; Sat, 2 Jul 2011 19:45:22 +0000 (UTC) (envelope-from rene@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id DC6718FC16 for ; Sat, 2 Jul 2011 19:45:22 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p62JjMmZ077134 for ; Sat, 2 Jul 2011 19:45:22 GMT (envelope-from rene@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p62JjMYA077131 for perforce@freebsd.org; Sat, 2 Jul 2011 19:45:22 GMT (envelope-from rene@FreeBSD.org) Date: Sat, 2 Jul 2011 19:45:22 GMT Message-Id: <201107021945.p62JjMYA077131@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to rene@FreeBSD.org using -f From: Rene Ladan To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 195641 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Jul 2011 19:45:23 -0000 http://p4web.freebsd.org/@@195641?ac=10 Change 195641 by rene@rene_acer on 2011/07/02 19:45:15 IFC Affected files ... .. //depot/projects/docproj_nl/en_US.ISO8859-1/articles/contributors/contrib.additional.sgml#95 integrate .. //depot/projects/docproj_nl/en_US.ISO8859-1/books/porters-handbook/book.sgml#108 integrate .. //depot/projects/docproj_nl/nl_NL.ISO8859-1/books/handbook/users/chapter.sgml#6 integrate .. //depot/projects/docproj_nl/www/share/sgml/commercial.consult.xml#30 integrate Differences ... ==== //depot/projects/docproj_nl/en_US.ISO8859-1/articles/contributors/contrib.additional.sgml#95 (text+ko) ==== @@ -1,4 +1,4 @@ - + 9.0-CURRENT after importing the libprocstat(3) library and fuser(1) utility to the base system. + + 900038 + May 22, 2011 + 9.0-CURRENT after adding a lock flag argument to + VFS_FHTOVP(9). + + + 900039 + June 28, 2011 + 9.0-CURRENT after importing pf from OpenBSD + 4.5. + ==== //depot/projects/docproj_nl/nl_NL.ISO8859-1/books/handbook/users/chapter.sgml#6 (text+ko) ==== @@ -1,7 +1,7 @@ + - $FreeBSD: www/share/sgml/commercial.consult.xml,v 1.128 2011/06/05 17:44:14 jkois Exp $ + $FreeBSD: www/share/sgml/commercial.consult.xml,v 1.129 2011/07/01 04:46:13 loader Exp $ @@ -661,6 +661,20 @@ + + iXsystems, Inc. + http://www.ixsystems.com + + Based in the heart of Silicon Valley in San Jose, California, iXsystems + offers FreeBSD technical support and custom development with a devoted + Professional Services and Call Center based in the US to assist with issues. + Getting FreeBSD up and running is fast and easy, but having expert help + on-hand to solve your problems can take your solution to new heights. From + optimizing your small office set-up to guidance on very large deployments, + our team can ensure you get the most from FreeBSD. + + + Okanagan Technology Solutions http://www.okts.ca/