From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 03:02:47 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 44780106566B; Sun, 22 Feb 2009 03:02:47 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 307268FC14; Sun, 22 Feb 2009 03:02:47 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1M32lLo082429; Sun, 22 Feb 2009 03:02:47 GMT (envelope-from alc@svn.freebsd.org) Received: (from alc@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1M32lZ2082427; Sun, 22 Feb 2009 03:02:47 GMT (envelope-from alc@svn.freebsd.org) Message-Id: <200902220302.n1M32lZ2082427@svn.freebsd.org> From: Alan Cox Date: Sun, 22 Feb 2009 03:02:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188909 - in stable/7/sys: . amd64/amd64 contrib/pf dev/ath/ath_hal dev/cxgb i386/i386 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 03:02:48 -0000 Author: alc Date: Sun Feb 22 03:02:46 2009 New Revision: 188909 URL: http://svn.freebsd.org/changeset/base/188909 Log: MFC r188608 Remove unnecessary page queues locking around vm_page_busy() and vm_page_wakeup(). Modified: stable/7/sys/ (props changed) stable/7/sys/amd64/amd64/pmap.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/i386/i386/pmap.c Modified: stable/7/sys/amd64/amd64/pmap.c ============================================================================== --- stable/7/sys/amd64/amd64/pmap.c Sun Feb 22 02:50:31 2009 (r188908) +++ stable/7/sys/amd64/amd64/pmap.c Sun Feb 22 03:02:46 2009 (r188909) @@ -2639,9 +2639,7 @@ retry: } p = vm_page_lookup(object, pindex); - vm_page_lock_queues(); vm_page_wakeup(p); - vm_page_unlock_queues(); } ptepa = VM_PAGE_TO_PHYS(p); @@ -2655,15 +2653,11 @@ retry: while ((pdpg = pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) { PMAP_UNLOCK(pmap); - vm_page_lock_queues(); vm_page_busy(p); - vm_page_unlock_queues(); VM_OBJECT_UNLOCK(object); VM_WAIT; VM_OBJECT_LOCK(object); - vm_page_lock_queues(); vm_page_wakeup(p); - vm_page_unlock_queues(); PMAP_LOCK(pmap); } pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg)); Modified: stable/7/sys/i386/i386/pmap.c ============================================================================== --- stable/7/sys/i386/i386/pmap.c Sun Feb 22 02:50:31 2009 (r188908) +++ stable/7/sys/i386/i386/pmap.c Sun Feb 22 03:02:46 2009 (r188909) @@ -2713,9 +2713,7 @@ retry: } p = vm_page_lookup(object, pindex); - vm_page_lock_queues(); vm_page_wakeup(p); - vm_page_unlock_queues(); } ptepa = VM_PAGE_TO_PHYS(p); From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 10:17:11 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0B20A106568C; Sun, 22 Feb 2009 10:17:11 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EBC228FC0C; Sun, 22 Feb 2009 10:17:10 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1MAHAci090152; Sun, 22 Feb 2009 10:17:10 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1MAHAiC090149; Sun, 22 Feb 2009 10:17:10 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <200902221017.n1MAHAiC090149@svn.freebsd.org> From: Konstantin Belousov Date: Sun, 22 Feb 2009 10:17:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188910 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern sys ufs/ufs X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 10:17:12 -0000 Author: kib Date: Sun Feb 22 10:17:10 2009 New Revision: 188910 URL: http://svn.freebsd.org/changeset/base/188910 Log: MFC r187528: Move the code from ufs_lookup.c used to do dotdot lookup, into the helper function. It is supposed to be useful for any filesystem that has to unlock dvp to walk to the ".." entry in lookup routine. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/kern/vfs_vnops.c stable/7/sys/sys/vnode.h stable/7/sys/ufs/ufs/ufs_lookup.c Modified: stable/7/sys/kern/vfs_vnops.c ============================================================================== --- stable/7/sys/kern/vfs_vnops.c Sun Feb 22 03:02:46 2009 (r188909) +++ stable/7/sys/kern/vfs_vnops.c Sun Feb 22 10:17:10 2009 (r188910) @@ -1221,3 +1221,35 @@ vn_extattr_rm(struct vnode *vp, int iofl return (error); } + +int +vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp) +{ + struct mount *mp; + int ltype, error; + + mp = vp->v_mount; + ltype = VOP_ISLOCKED(vp, curthread); + KASSERT(ltype == LK_EXCLUSIVE || ltype == LK_SHARED, + ("vn_vget_ino: vp not locked")); + for (;;) { + error = vfs_busy(mp, LK_NOWAIT, NULL, curthread); + if (error == 0) + break; + VOP_UNLOCK(vp, 0, curthread); + pause("vn_vget", 1); + vn_lock(vp, ltype | LK_RETRY, curthread); + if (vp->v_iflag & VI_DOOMED) + return (ENOENT); + } + VOP_UNLOCK(vp, 0, curthread); + error = VFS_VGET(mp, ino, lkflags, rvp); + vfs_unbusy(mp, curthread); + vn_lock(vp, ltype | LK_RETRY, curthread); + if (vp->v_iflag & VI_DOOMED) { + if (error == 0) + vput(*rvp); + error = ENOENT; + } + return (error); +} Modified: stable/7/sys/sys/vnode.h ============================================================================== --- stable/7/sys/sys/vnode.h Sun Feb 22 03:02:46 2009 (r188909) +++ stable/7/sys/sys/vnode.h Sun Feb 22 10:17:10 2009 (r188910) @@ -633,6 +633,9 @@ int vn_extattr_set(struct vnode *vp, int const char *attrname, int buflen, char *buf, struct thread *td); int vn_extattr_rm(struct vnode *vp, int ioflg, int attrnamespace, const char *attrname, struct thread *td); +int vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, + struct vnode **rvp); + int vfs_cache_lookup(struct vop_lookup_args *ap); void vfs_timestamp(struct timespec *); void vfs_write_resume(struct mount *mp); Modified: stable/7/sys/ufs/ufs/ufs_lookup.c ============================================================================== --- stable/7/sys/ufs/ufs/ufs_lookup.c Sun Feb 22 03:02:46 2009 (r188909) +++ stable/7/sys/ufs/ufs/ufs_lookup.c Sun Feb 22 10:17:10 2009 (r188910) @@ -158,7 +158,6 @@ ufs_lookup(ap) struct thread *td = cnp->cn_thread; ino_t ino; int ltype; - struct mount *mp; bp = NULL; slotoffset = -1; @@ -579,27 +578,7 @@ found: */ pdp = vdp; if (flags & ISDOTDOT) { - ltype = VOP_ISLOCKED(pdp, td); - mp = pdp->v_mount; - for (;;) { - error = vfs_busy(mp, LK_NOWAIT, NULL, td); - if (error == 0) - break; - VOP_UNLOCK(pdp, 0, td); - pause("ufs_dd", 1); - vn_lock(pdp, ltype | LK_RETRY, td); - if (pdp->v_iflag & VI_DOOMED) - return (ENOENT); - } - VOP_UNLOCK(pdp, 0, td); /* race to get the inode */ - error = VFS_VGET(mp, ino, cnp->cn_lkflags, &tdp); - vfs_unbusy(mp, td); - vn_lock(pdp, ltype | LK_RETRY, td); - if (pdp->v_iflag & VI_DOOMED) { - if (error == 0) - vput(tdp); - error = ENOENT; - } + error = vn_vget_ino(pdp, ino, cnp->cn_lkflags, &tdp); if (error) return (error); *vpp = tdp; From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 10:25:07 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DA920106564A; Sun, 22 Feb 2009 10:25:07 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C68AF8FC23; Sun, 22 Feb 2009 10:25:07 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1MAP7bN093861; Sun, 22 Feb 2009 10:25:07 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1MAP7rl093858; Sun, 22 Feb 2009 10:25:07 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <200902221025.n1MAP7rl093858@svn.freebsd.org> From: Konstantin Belousov Date: Sun, 22 Feb 2009 10:25:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188911 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb fs/tmpfs X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 10:25:09 -0000 Author: kib Date: Sun Feb 22 10:25:07 2009 New Revision: 188911 URL: http://svn.freebsd.org/changeset/base/188911 Log: MFC r188318: Lookup up the directory entry for the tmpfs node that are deleted by both node pointer and name component. This does the right thing for hardlinks to the same node in the same directory. PR: kern/131356 Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/fs/tmpfs/tmpfs.h stable/7/sys/fs/tmpfs/tmpfs_subr.c stable/7/sys/fs/tmpfs/tmpfs_vnops.c Modified: stable/7/sys/fs/tmpfs/tmpfs.h ============================================================================== --- stable/7/sys/fs/tmpfs/tmpfs.h Sun Feb 22 10:17:10 2009 (r188910) +++ stable/7/sys/fs/tmpfs/tmpfs.h Sun Feb 22 10:25:07 2009 (r188911) @@ -408,9 +408,8 @@ int tmpfs_alloc_file(struct vnode *, str void tmpfs_dir_attach(struct vnode *, struct tmpfs_dirent *); void tmpfs_dir_detach(struct vnode *, struct tmpfs_dirent *); struct tmpfs_dirent * tmpfs_dir_lookup(struct tmpfs_node *node, + struct tmpfs_node *f, struct componentname *cnp); -struct tmpfs_dirent *tmpfs_dir_search(struct tmpfs_node *node, - struct tmpfs_node *f); int tmpfs_dir_getdotdent(struct tmpfs_node *, struct uio *); int tmpfs_dir_getdotdotdent(struct tmpfs_node *, struct uio *); struct tmpfs_dirent * tmpfs_dir_lookupbycookie(struct tmpfs_node *, off_t); Modified: stable/7/sys/fs/tmpfs/tmpfs_subr.c ============================================================================== --- stable/7/sys/fs/tmpfs/tmpfs_subr.c Sun Feb 22 10:17:10 2009 (r188910) +++ stable/7/sys/fs/tmpfs/tmpfs_subr.c Sun Feb 22 10:25:07 2009 (r188911) @@ -572,7 +572,8 @@ tmpfs_dir_detach(struct vnode *vp, struc * Returns a pointer to the entry when found, otherwise NULL. */ struct tmpfs_dirent * -tmpfs_dir_lookup(struct tmpfs_node *node, struct componentname *cnp) +tmpfs_dir_lookup(struct tmpfs_node *node, struct tmpfs_node *f, + struct componentname *cnp) { boolean_t found; struct tmpfs_dirent *de; @@ -584,6 +585,8 @@ tmpfs_dir_lookup(struct tmpfs_node *node found = 0; TAILQ_FOREACH(de, &node->tn_dir.tn_dirhead, td_entries) { + if (f != NULL && de->td_node != f) + continue; MPASS(cnp->cn_namelen < 0xffff); if (de->td_namelen == (uint16_t)cnp->cn_namelen && memcmp(de->td_name, cnp->cn_nameptr, de->td_namelen) == 0) { @@ -596,20 +599,6 @@ tmpfs_dir_lookup(struct tmpfs_node *node return found ? de : NULL; } -struct tmpfs_dirent * -tmpfs_dir_search(struct tmpfs_node *node, struct tmpfs_node *f) -{ - struct tmpfs_dirent *de; - - TMPFS_VALIDATE_DIR(node); - node->tn_status |= TMPFS_NODE_ACCESSED; - TAILQ_FOREACH(de, &node->tn_dir.tn_dirhead, td_entries) { - if (de->td_node == f) - return (de); - } - return (NULL); -} - /* --------------------------------------------------------------------- */ /* Modified: stable/7/sys/fs/tmpfs/tmpfs_vnops.c ============================================================================== --- stable/7/sys/fs/tmpfs/tmpfs_vnops.c Sun Feb 22 10:17:10 2009 (r188910) +++ stable/7/sys/fs/tmpfs/tmpfs_vnops.c Sun Feb 22 10:25:07 2009 (r188911) @@ -104,7 +104,7 @@ tmpfs_lookup(struct vop_cachedlookup_arg *vpp = dvp; error = 0; } else { - de = tmpfs_dir_lookup(dnode, cnp); + de = tmpfs_dir_lookup(dnode, NULL, cnp); if (de == NULL) { /* The entry was not found in the directory. * This is OK if we are creating or renaming an @@ -771,7 +771,7 @@ tmpfs_remove(struct vop_remove_args *v) dnode = VP_TO_TMPFS_DIR(dvp); node = VP_TO_TMPFS_NODE(vp); tmp = VFS_TO_TMPFS(vp->v_mount); - de = tmpfs_dir_search(dnode, node); + de = tmpfs_dir_lookup(dnode, node, v->a_cnp); MPASS(de != NULL); /* Files marked as immutable or append-only cannot be deleted. */ @@ -918,7 +918,7 @@ tmpfs_rename(struct vop_rename_args *v) } fdnode = VP_TO_TMPFS_DIR(fdvp); fnode = VP_TO_TMPFS_NODE(fvp); - de = tmpfs_dir_search(fdnode, fnode); + de = tmpfs_dir_lookup(fdnode, fnode, fcnp); /* Avoid manipulating '.' and '..' entries. */ if (de == NULL) { @@ -1030,7 +1030,7 @@ tmpfs_rename(struct vop_rename_args *v) * from the target directory. */ if (tvp != NULL) { /* Remove the old entry from the target directory. */ - de = tmpfs_dir_search(tdnode, tnode); + de = tmpfs_dir_lookup(tdnode, tnode, tcnp); tmpfs_dir_detach(tdvp, de); /* Free the directory entry we just deleted. Note that the @@ -1118,7 +1118,7 @@ tmpfs_rmdir(struct vop_rmdir_args *v) /* Get the directory entry associated with node (vp). This was * filled by tmpfs_lookup while looking up the entry. */ - de = tmpfs_dir_search(dnode, node); + de = tmpfs_dir_lookup(dnode, node, v->a_cnp); MPASS(TMPFS_DIRENT_MATCHES(de, v->a_cnp->cn_nameptr, v->a_cnp->cn_namelen)); From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 10:28:09 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CA801106564A; Sun, 22 Feb 2009 10:28:09 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B75398FC26; Sun, 22 Feb 2009 10:28:09 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1MAS9xW094058; Sun, 22 Feb 2009 10:28:09 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1MAS9EV094057; Sun, 22 Feb 2009 10:28:09 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <200902221028.n1MAS9EV094057@svn.freebsd.org> From: Konstantin Belousov Date: Sun, 22 Feb 2009 10:28:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188913 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb vm X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 10:28:10 -0000 Author: kib Date: Sun Feb 22 10:28:09 2009 New Revision: 188913 URL: http://svn.freebsd.org/changeset/base/188913 Log: MFC r188320: Do not leak the MAP_ENTRY_IN_TRANSITION flag when copying map entry on fork. Otherwise, copied entry cannot be removed in the child map. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/vm/vm_map.c Modified: stable/7/sys/vm/vm_map.c ============================================================================== --- stable/7/sys/vm/vm_map.c Sun Feb 22 10:26:02 2009 (r188912) +++ stable/7/sys/vm/vm_map.c Sun Feb 22 10:28:09 2009 (r188913) @@ -2648,7 +2648,8 @@ vmspace_fork(struct vmspace *vm1) */ new_entry = vm_map_entry_create(new_map); *new_entry = *old_entry; - new_entry->eflags &= ~MAP_ENTRY_USER_WIRED; + new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED | + MAP_ENTRY_IN_TRANSITION); new_entry->wired_count = 0; /* @@ -2674,7 +2675,8 @@ vmspace_fork(struct vmspace *vm1) */ new_entry = vm_map_entry_create(new_map); *new_entry = *old_entry; - new_entry->eflags &= ~MAP_ENTRY_USER_WIRED; + new_entry->eflags &= ~(MAP_ENTRY_USER_WIRED | + MAP_ENTRY_IN_TRANSITION); new_entry->wired_count = 0; new_entry->object.vm_object = NULL; vm_map_entry_link(new_map, new_map->header.prev, From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 12:58:17 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 97356106566B; Sun, 22 Feb 2009 12:58:17 +0000 (UTC) (envelope-from bms@incunabulum.net) Received: from out1.smtp.messagingengine.com (out1.smtp.messagingengine.com [66.111.4.25]) by mx1.freebsd.org (Postfix) with ESMTP id 51BE58FC12; Sun, 22 Feb 2009 12:58:17 +0000 (UTC) (envelope-from bms@incunabulum.net) Received: from compute2.internal (compute2.internal [10.202.2.42]) by out1.messagingengine.com (Postfix) with ESMTP id 755422A1B35; Sun, 22 Feb 2009 07:58:16 -0500 (EST) Received: from heartbeat2.messagingengine.com ([10.202.2.161]) by compute2.internal (MEProxy); Sun, 22 Feb 2009 07:58:16 -0500 X-Sasl-enc: nD4D84ukm2Gth7AmYWsQe5tozmnpjJCEM254SKshovL0 1235307496 Received: from [192.168.123.18] (82-35-112-254.cable.ubr07.dals.blueyonder.co.uk [82.35.112.254]) by mail.messagingengine.com (Postfix) with ESMTPSA id 1E7AB230D1; Sun, 22 Feb 2009 07:58:14 -0500 (EST) Message-ID: <49A14BE5.7020400@incunabulum.net> Date: Sun, 22 Feb 2009 12:58:13 +0000 From: Bruce Simpson User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) MIME-Version: 1.0 To: John Baldwin References: <200902171957.n1HJvqk8026145@svn.freebsd.org> <200902181005.28625.jhb@freebsd.org> <499C269D.7030406@incunabulum.net> <200902181054.35709.jhb@freebsd.org> In-Reply-To: <200902181054.35709.jhb@freebsd.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org Subject: Re: svn commit: r188727 - in stable/7: sys sys/contrib/pf sys/dev/ath/ath_hal sys/dev/cxgb sys/kern sys/modules/sem sys/sys tools/regression/posixsem usr.bin/procstat X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 12:58:18 -0000 John Baldwin wrote: > Hmm, by symbols I meant having things built with debug symbols (i.e. "-g"). > OK... I will try to build a Python interpreter w/debug symbols next time around. I am just giving this a dry run for now -- I am collaborating on a project where we've ended up implementing stuff on Linux using Python multiprocessing as it seemed the best fit for the team's capabilities. So I'm posting this here for lists to pick up, hopefully someone looking to use multiprocessing seriously on FreeBSD will come across this. It would be nice to port to FreeBSD at a later date, unfortunately, we're a bit further down this road now... > Also, do you have 'sem.ko' loaded? The only reason I can think of why you > would get a core dump in ksem_open() itself would be if you got a SIGSYS > because the module wasn't loaded. > That seems to have been the issue! Thanks. If I cd src/modules/sem && make && make install, and kldload the module before running Python, then I do not see the core dump. I didn't realise a separate kernel module was needed for POSIX semaphores, the option seems to be P1003_1B_SEMAPHORES according to sem(4). It is quite possible the Python guys totally missed this... It seems that whilst ipcs(1) is the appropriate tool to examine SYSV IPC facilities, there is no such tool for POSIX semaphores on FreeBSD, or am I wrong? When the Python process is running and using sem(4), I see a segment of shared memory in ipcs(1) output. Perhaps the libc wrapper should be taught to return ENOSYS if the system call(s) it requires are not present, rather than SIGSYS? However, the mp_benchmarks.py script just hangs when testing multiprocessing.Queue. A ktrace reveals that a child process is simply waiting for data on a pipe which doesn't arrive. Killing Python at this point and restarting results in future attempts to open a semaphore by the module failing with ENFILE after the 4th ksem_open() call: %%% Traceback (most recent call last): File "Doc/includes/mp_benchmarks.py", line 238, in test() File "Doc/includes/mp_benchmarks.py", line 192, in test multiprocessing.Condition()) File "/usr/local/lib/python2.5/site-packages/multiprocessing-2.6.1.1-py2.5-freebsd-7.1-STABLE-amd64.egg/multiprocessing/__init__.py", line 190, in Condition return Condition(lock) File "/usr/local/lib/python2.5/site-packages/multiprocessing-2.6.1.1-py2.5-freebsd-7.1-STABLE-amd64.egg/multiprocessing/synchronize.py", line 168, in __init__ self._lock = lock or RLock() File "/usr/local/lib/python2.5/site-packages/multiprocessing-2.6.1.1-py2.5-freebsd-7.1-STABLE-amd64.egg/multiprocessing/synchronize.py", line 142, in __init__ SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1) File "/usr/local/lib/python2.5/site-packages/multiprocessing-2.6.1.1-py2.5-freebsd-7.1-STABLE-amd64.egg/multiprocessing/synchronize.py", line 49, in __init__ sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue) OSError: [Errno 23] Too many open files in system Exit 1 anglepoise:~/p/multiprocessing-2.6.1.1 % %%% From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 13:34:01 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DFD07106566B; Sun, 22 Feb 2009 13:34:01 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CDAB08FC0A; Sun, 22 Feb 2009 13:34:01 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1MDY1wR097388; Sun, 22 Feb 2009 13:34:01 GMT (envelope-from bms@svn.freebsd.org) Received: (from bms@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1MDY1Kn097387; Sun, 22 Feb 2009 13:34:01 GMT (envelope-from bms@svn.freebsd.org) Message-Id: <200902221334.n1MDY1Kn097387@svn.freebsd.org> From: Bruce M Simpson Date: Sun, 22 Feb 2009 13:34:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188915 - stable/7/usr.sbin/ifmcstat X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 13:34:02 -0000 Author: bms Date: Sun Feb 22 13:34:01 2009 New Revision: 188915 URL: http://svn.freebsd.org/changeset/base/188915 Log: MFC: Fix a typo which caused ifmcstat's sysctl path to print the network-layer endpoint address of the group membership, rather than its link-layer mapping as intended. The KVM path is not affected. Modified: stable/7/usr.sbin/ifmcstat/ifmcstat.c Modified: stable/7/usr.sbin/ifmcstat/ifmcstat.c ============================================================================== --- stable/7/usr.sbin/ifmcstat/ifmcstat.c Sun Feb 22 12:40:58 2009 (r188914) +++ stable/7/usr.sbin/ifmcstat/ifmcstat.c Sun Feb 22 13:34:01 2009 (r188915) @@ -768,7 +768,7 @@ ifmcstat_getifmaddrs(void) /* Link-layer mapping, if present. */ pllsa = (sockunion_t *)ifma->ifma_lladdr; if (pllsa != NULL) { - error = getnameinfo(&pifasa->sa, pifasa->sa.sa_len, + error = getnameinfo(&pllasa->sa, pllasa->sa.sa_len, addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST); fprintf(stdout, "\t\t\tmcast-macaddr %s\n", addrbuf); } From owner-svn-src-stable@FreeBSD.ORG Sun Feb 22 19:23:58 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A5311106567C; Sun, 22 Feb 2009 19:23:58 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 926528FC12; Sun, 22 Feb 2009 19:23:58 +0000 (UTC) (envelope-from bms@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1MJNwld004471; Sun, 22 Feb 2009 19:23:58 GMT (envelope-from bms@svn.freebsd.org) Received: (from bms@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1MJNwq0004470; Sun, 22 Feb 2009 19:23:58 GMT (envelope-from bms@svn.freebsd.org) Message-Id: <200902221923.n1MJNwq0004470@svn.freebsd.org> From: Bruce M Simpson Date: Sun, 22 Feb 2009 19:23:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188928 - stable/7/usr.sbin/ifmcstat X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Feb 2009 19:23:59 -0000 Author: bms Date: Sun Feb 22 19:23:58 2009 New Revision: 188928 URL: http://svn.freebsd.org/changeset/base/188928 Log: fix typo! Modified: stable/7/usr.sbin/ifmcstat/ifmcstat.c Modified: stable/7/usr.sbin/ifmcstat/ifmcstat.c ============================================================================== --- stable/7/usr.sbin/ifmcstat/ifmcstat.c Sun Feb 22 18:53:56 2009 (r188927) +++ stable/7/usr.sbin/ifmcstat/ifmcstat.c Sun Feb 22 19:23:58 2009 (r188928) @@ -768,7 +768,7 @@ ifmcstat_getifmaddrs(void) /* Link-layer mapping, if present. */ pllsa = (sockunion_t *)ifma->ifma_lladdr; if (pllsa != NULL) { - error = getnameinfo(&pllasa->sa, pllasa->sa.sa_len, + error = getnameinfo(&pllsa->sa, pllsa->sa.sa_len, addrbuf, sizeof(addrbuf), NULL, 0, NI_NUMERICHOST); fprintf(stdout, "\t\t\tmcast-macaddr %s\n", addrbuf); } From owner-svn-src-stable@FreeBSD.ORG Mon Feb 23 19:52:47 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BFE721065702; Mon, 23 Feb 2009 19:52:47 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id AAFCE8FC18; Mon, 23 Feb 2009 19:52:47 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1NJqlUn034516; Mon, 23 Feb 2009 19:52:47 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1NJqlR0034513; Mon, 23 Feb 2009 19:52:47 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <200902231952.n1NJqlR0034513@svn.freebsd.org> From: Alexander Motin Date: Mon, 23 Feb 2009 19:52:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188952 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/mmc X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Feb 2009 19:52:49 -0000 Author: mav Date: Mon Feb 23 19:52:47 2009 New Revision: 188952 URL: http://svn.freebsd.org/changeset/base/188952 Log: MFC rev. 187525 187543 187546 187551 187875 187877 188044 188725 Sync MMC subsystem with HEAD. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/dev/mmc/mmc.c stable/7/sys/dev/mmc/mmcreg.h stable/7/sys/dev/mmc/mmcsd.c Modified: stable/7/sys/dev/mmc/mmc.c ============================================================================== --- stable/7/sys/dev/mmc/mmc.c Mon Feb 23 19:31:48 2009 (r188951) +++ stable/7/sys/dev/mmc/mmc.c Mon Feb 23 19:52:47 2009 (r188952) @@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -104,6 +105,11 @@ struct mmc_ivars { #define CMD_RETRIES 3 +SYSCTL_NODE(_hw, OID_AUTO, mmc, CTLFLAG_RD, NULL, "mmc driver"); + +static int mmc_debug; +SYSCTL_INT(_hw_mmc, OID_AUTO, debug, CTLFLAG_RW, &mmc_debug, 0, "Debug level"); + /* bus entry points */ static int mmc_probe(device_t dev); static int mmc_attach(device_t dev); @@ -233,7 +239,7 @@ mmc_acquire_bus(device_t busdev, device_ sc->last_rca = rca; /* Prepare bus width for the new card. */ ivar = device_get_ivars(dev); - if (bootverbose) { + if (bootverbose || mmc_debug) { device_printf(busdev, "setting bus width to %d bits\n", (ivar->bus_width == bus_width_4) ? 4 : @@ -315,11 +321,21 @@ mmc_wait_for_req(struct mmc_softc *sc, s req->done = mmc_wakeup; req->done_data = sc; + if (mmc_debug > 1) { + device_printf(sc->dev, "REQUEST: CMD%d arg %#x flags %#x", + req->cmd->opcode, req->cmd->arg, req->cmd->flags); + if (req->cmd->data) { + printf(" data %d\n", (int)req->cmd->data->len); + } else + printf("\n"); + } MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req); MMC_LOCK(sc); while ((req->flags & MMC_REQ_DONE) == 0) msleep(req, &sc->sc_mtx, 0, "mmcreq", 0); MMC_UNLOCK(sc); + if (mmc_debug > 2 || (mmc_debug > 1 && req->cmd->error)) + device_printf(sc->dev, "RESULT: %d\n", req->cmd->error); return (0); } @@ -340,7 +356,6 @@ mmc_wait_for_cmd(struct mmc_softc *sc, s memset(cmd->resp, 0, sizeof(cmd->resp)); cmd->retries = retries; mreq.cmd = cmd; -/* printf("CMD: %x ARG %x\n", cmd->opcode, cmd->arg); */ mmc_wait_for_req(sc, &mreq); return (cmd->error); } @@ -555,7 +570,8 @@ mmc_switch(struct mmc_softc *sc, uint8_t } static int -mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp, uint8_t value, uint8_t *res) +mmc_sd_switch(struct mmc_softc *sc, uint8_t mode, uint8_t grp, uint8_t value, + uint8_t *res) { int err; struct mmc_command cmd; @@ -563,11 +579,11 @@ mmc_sd_switch(struct mmc_softc *sc, uint memset(&cmd, 0, sizeof(struct mmc_command)); memset(&data, 0, sizeof(struct mmc_data)); - memset(res, 0, 64); + cmd.opcode = SD_SWITCH_FUNC; cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; - cmd.arg = mode << 31; + cmd.arg = mode << 31; /* 0 - check, 1 - set */ cmd.arg |= 0x00FFFFFF; cmd.arg &= ~(0xF << (grp * 4)); cmd.arg |= value << (grp * 4); @@ -584,11 +600,11 @@ mmc_sd_switch(struct mmc_softc *sc, uint static int mmc_set_card_bus_width(struct mmc_softc *sc, uint16_t rca, int width) { + struct mmc_command cmd; int err; + uint8_t value; if (mmcbr_get_mode(sc->dev) == mode_sd) { - struct mmc_command cmd; - memset(&cmd, 0, sizeof(struct mmc_command)); cmd.opcode = ACMD_SET_BUS_WIDTH; cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; @@ -604,8 +620,6 @@ mmc_set_card_bus_width(struct mmc_softc } err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES); } else { - uint8_t value; - switch (width) { case bus_width_1: value = EXT_CSD_BUS_WIDTH_1; @@ -619,7 +633,8 @@ mmc_set_card_bus_width(struct mmc_softc default: return (MMC_ERR_INVALID); } - err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, value); + err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, + value); } return (err); } @@ -629,6 +644,7 @@ mmc_set_timing(struct mmc_softc *sc, int { int err; uint8_t value; + u_char switch_res[64]; switch (timing) { case bus_timing_normal: @@ -640,14 +656,12 @@ mmc_set_timing(struct mmc_softc *sc, int default: return (MMC_ERR_INVALID); } - if (mmcbr_get_mode(sc->dev) == mode_sd) { - u_char switch_res[64]; - - err = mmc_sd_switch(sc, 1, 0, value, switch_res); - } else { + if (mmcbr_get_mode(sc->dev) == mode_sd) + err = mmc_sd_switch(sc, SD_SWITCH_MODE_SET, SD_SWITCH_GROUP1, + value, switch_res); + else err = mmc_switch(sc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, value); - } return (err); } @@ -749,9 +763,10 @@ mmc_decode_cid_sd(uint32_t *raw_cid, str cid->oid = mmc_get_bits(raw_cid, 128, 104, 16); for (i = 0; i < 5; i++) cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); + cid->pnm[5] = 0; cid->prv = mmc_get_bits(raw_cid, 128, 56, 8); cid->psn = mmc_get_bits(raw_cid, 128, 24, 32); - cid->mdt_year = mmc_get_bits(raw_cid, 128, 12, 8) + 2001; + cid->mdt_year = mmc_get_bits(raw_cid, 128, 12, 8) + 2000; cid->mdt_month = mmc_get_bits(raw_cid, 128, 8, 4); } @@ -766,6 +781,7 @@ mmc_decode_cid_mmc(uint32_t *raw_cid, st cid->oid = mmc_get_bits(raw_cid, 128, 104, 8); for (i = 0; i < 6; i++) cid->pnm[i] = mmc_get_bits(raw_cid, 128, 96 - i * 8, 8); + cid->pnm[6] = 0; cid->prv = mmc_get_bits(raw_cid, 128, 48, 8); cid->psn = mmc_get_bits(raw_cid, 128, 16, 32); cid->mdt_month = mmc_get_bits(raw_cid, 128, 12, 4); @@ -1060,6 +1076,29 @@ mmc_send_relative_addr(struct mmc_softc } static void +mmc_log_card(device_t dev, struct mmc_ivars *ivar, int newcard) +{ + device_printf(dev, "Card at relative address %d%s:\n", + ivar->rca, newcard ? " added" : ""); + device_printf(dev, " card: %s%s (0x%x/0x%x/\"%s\" rev %d.%d " + "m/d %02d.%04d s/n %08x)\n", + ivar->mode == mode_sd ? "SD" : "MMC", + ivar->high_cap ? " High Capacity" : "", + ivar->cid.mid, ivar->cid.oid, + ivar->cid.pnm, ivar->cid.prv >> 4, ivar->cid.prv & 0x0f, + ivar->cid.mdt_month, ivar->cid.mdt_year, ivar->cid.psn); + device_printf(dev, " bus: %ubit, %uMHz%s\n", + (ivar->bus_width == bus_width_1 ? 1 : + (ivar->bus_width == bus_width_4 ? 4 : 8)), + (ivar->timing == bus_timing_hs ? + ivar->hs_tran_speed : ivar->tran_speed) / 1000000, + ivar->timing == bus_timing_hs ? ", high speed timing" : ""); + device_printf(dev, " memory: %u blocks, erase sector %u blocks%s\n", + ivar->sec_count, ivar->erase_sector, + ivar->read_only ? ", read-only" : ""); +} + +static void mmc_discover_cards(struct mmc_softc *sc) { struct mmc_ivars *ivar = NULL; @@ -1071,6 +1110,8 @@ mmc_discover_cards(struct mmc_softc *sc) uint16_t rca = 2; u_char switch_res[64]; + if (bootverbose || mmc_debug) + device_printf(sc->dev, "Probing cards\n"); while (1) { err = mmc_all_send_cid(sc, raw_cid); if (err == MMC_ERR_TIMEOUT) @@ -1090,6 +1131,11 @@ mmc_discover_cards(struct mmc_softc *sc) } } free(devlist, M_TEMP); + if (bootverbose || mmc_debug) { + device_printf(sc->dev, "%sard detected (CID %08x%08x%08x%08x)\n", + newcard ? "New c" : "C", + raw_cid[0], raw_cid[1], raw_cid[2], raw_cid[3]); + } if (newcard) { ivar = malloc(sizeof(struct mmc_ivars), M_DEVBUF, M_WAITOK | M_ZERO); @@ -1100,6 +1146,7 @@ mmc_discover_cards(struct mmc_softc *sc) if (mmcbr_get_ro(sc->dev)) ivar->read_only = 1; ivar->bus_width = bus_width_1; + ivar->timing = bus_timing_normal; ivar->mode = mmcbr_get_mode(sc->dev); if (ivar->mode == mode_sd) { mmc_decode_cid_sd(ivar->raw_cid, &ivar->cid); @@ -1118,13 +1165,15 @@ mmc_discover_cards(struct mmc_softc *sc) mmc_select_card(sc, ivar->rca); mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); - /* Get card switch capabilities. */ + /* Get card switch capabilities (command class 10). */ if ((ivar->scr.sda_vsn >= 1) && (ivar->csd.ccc & (1<<10))) { - mmc_sd_switch(sc, 0, 0, 0xF, switch_res); + mmc_sd_switch(sc, SD_SWITCH_MODE_CHECK, + SD_SWITCH_GROUP1, SD_SWITCH_NOCHANGE, + switch_res); if (switch_res[13] & 2) { ivar->timing = bus_timing_hs; - ivar->hs_tran_speed = 50000000; + ivar->hs_tran_speed = SD_MAX_HS; } } mmc_app_sd_status(sc, ivar->rca, ivar->raw_sd_status); @@ -1139,6 +1188,8 @@ mmc_discover_cards(struct mmc_softc *sc) if ((mmcbr_get_caps(sc->dev) & MMC_CAP_4_BIT_DATA) && (ivar->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) ivar->bus_width = bus_width_4; + if (bootverbose || mmc_debug) + mmc_log_card(sc->dev, ivar, newcard); if (newcard) { /* Add device. */ child = device_add_child(sc->dev, NULL, -1); @@ -1174,10 +1225,10 @@ mmc_discover_cards(struct mmc_softc *sc) ivar->timing = bus_timing_hs; if (ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_52) - ivar->hs_tran_speed = 52000000; + ivar->hs_tran_speed = MMC_TYPE_52_MAX_HS; else if (ivar->raw_ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_26) - ivar->hs_tran_speed = 26000000; + ivar->hs_tran_speed = MMC_TYPE_26_MAX_HS; else ivar->hs_tran_speed = ivar->tran_speed; /* Find max supported bus width. */ @@ -1194,6 +1245,8 @@ mmc_discover_cards(struct mmc_softc *sc) ivar->bus_width = bus_width_1; ivar->timing = bus_timing_normal; } + if (bootverbose || mmc_debug) + mmc_log_card(sc->dev, ivar, newcard); if (newcard) { /* Add device. */ child = device_add_child(sc->dev, NULL, -1); @@ -1214,6 +1267,9 @@ mmc_rescan_cards(struct mmc_softc *sc) for (i = 0; i < devcount; i++) { ivar = device_get_ivars(devlist[i]); if (mmc_select_card(sc, ivar->rca)) { + if (bootverbose || mmc_debug) + device_printf(sc->dev, "Card at relative address %d lost.\n", + ivar->rca); device_delete_child(sc->dev, devlist[i]); free(ivar, M_DEVBUF); } @@ -1233,6 +1289,9 @@ mmc_delete_cards(struct mmc_softc *sc) return (err); for (i = 0; i < devcount; i++) { ivar = device_get_ivars(devlist[i]); + if (bootverbose || mmc_debug) + device_printf(sc->dev, "Card at relative address %d deleted.\n", + ivar->rca); device_delete_child(sc->dev, devlist[i]); free(ivar, M_DEVBUF); } @@ -1255,17 +1314,30 @@ mmc_go_discovery(struct mmc_softc *sc) mmcbr_set_mode(dev, mode_sd); mmc_power_up(sc); mmcbr_set_bus_mode(dev, pushpull); + if (bootverbose || mmc_debug) + device_printf(sc->dev, "Probing bus\n"); mmc_idle_cards(sc); err = mmc_send_if_cond(sc, 1); + if ((bootverbose || mmc_debug) && err == 0) + device_printf(sc->dev, "SD 2.0 interface conditions: OK\n"); if (mmc_send_app_op_cond(sc, err ? 0 : MMC_OCR_CCS, &ocr) != MMC_ERR_NONE) { + if (bootverbose || mmc_debug) + device_printf(sc->dev, "SD probe: failed\n"); /* * Failed, try MMC */ mmcbr_set_mode(dev, mode_mmc); - if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) + if (mmc_send_op_cond(sc, 0, &ocr) != MMC_ERR_NONE) { + if (bootverbose || mmc_debug) + device_printf(sc->dev, "MMC probe: failed\n"); ocr = 0; /* Failed both, powerdown. */ - } + } else if (bootverbose || mmc_debug) + device_printf(sc->dev, + "MMC probe: OK (OCR: 0x%08x)\n", ocr); + } else if (bootverbose || mmc_debug) + device_printf(sc->dev, "SD probe: OK (OCR: 0x%08x)\n", ocr); + mmcbr_set_ocr(dev, mmc_select_vdd(sc, ocr)); if (mmcbr_get_ocr(dev) != 0) mmc_idle_cards(sc); @@ -1279,6 +1351,8 @@ mmc_go_discovery(struct mmc_softc *sc) * Make sure that we have a mutually agreeable voltage to at least * one card on the bus. */ + if (bootverbose || mmc_debug) + device_printf(sc->dev, "Current OCR: 0x%08x\n", mmcbr_get_ocr(dev)); if (mmcbr_get_ocr(dev) == 0) { mmc_delete_cards(sc); mmc_power_down(sc); @@ -1326,7 +1400,7 @@ mmc_calculate_clock(struct mmc_softc *sc max_timing = ivar->timing; if (ivar->tran_speed < max_dtr) max_dtr = ivar->tran_speed; - if (ivar->hs_tran_speed < max_dtr) + if (ivar->hs_tran_speed < max_hs_dtr) max_hs_dtr = ivar->hs_tran_speed; } for (i = 0; i < nkid; i++) { @@ -1340,7 +1414,7 @@ mmc_calculate_clock(struct mmc_softc *sc free(kids, M_TEMP); if (max_timing == bus_timing_hs) max_dtr = max_hs_dtr; - if (bootverbose) { + if (bootverbose || mmc_debug) { device_printf(sc->dev, "setting transfer rate to %d.%03dMHz%s\n", max_dtr / 1000000, (max_dtr / 1000) % 1000, @@ -1454,5 +1528,5 @@ static driver_t mmc_driver = { static devclass_t mmc_devclass; -DRIVER_MODULE(mmc, at91_mci, mmc_driver, mmc_devclass, 0, 0); -DRIVER_MODULE(mmc, sdhci, mmc_driver, mmc_devclass, 0, 0); +DRIVER_MODULE(mmc, at91_mci, mmc_driver, mmc_devclass, NULL, NULL); +DRIVER_MODULE(mmc, sdhci, mmc_driver, mmc_devclass, NULL, NULL); Modified: stable/7/sys/dev/mmc/mmcreg.h ============================================================================== --- stable/7/sys/dev/mmc/mmcreg.h Mon Feb 23 19:31:48 2009 (r188951) +++ stable/7/sys/dev/mmc/mmcreg.h Mon Feb 23 19:52:47 2009 (r188952) @@ -97,6 +97,7 @@ struct mmc_command { #define MMC_ERR_FAILED 4 #define MMC_ERR_INVALID 5 #define MMC_ERR_NO_MEMORY 6 +#define MMC_ERR_MAX 6 struct mmc_data *data; /* Data segment with cmd */ struct mmc_request *mrq; /* backpointer to request */ }; @@ -287,7 +288,6 @@ struct mmc_request { /* * EXT_CSD fields */ - #define EXT_CSD_ERASE_GRP_DEF 175 /* R/W */ #define EXT_CSD_BUS_WIDTH 183 /* R/W */ #define EXT_CSD_HS_TIMING 185 /* R/W */ @@ -300,7 +300,6 @@ struct mmc_request { /* * EXT_CSD field definitions */ - #define EXT_CSD_CMD_SET_NORMAL 1 #define EXT_CSD_CMD_SET_SECURE 2 #define EXT_CSD_CMD_SET_CPSECURE 4 @@ -312,12 +311,27 @@ struct mmc_request { #define EXT_CSD_BUS_WIDTH_4 1 #define EXT_CSD_BUS_WIDTH_8 2 +#define MMC_TYPE_26_MAX_HS 26000000 +#define MMC_TYPE_52_MAX_HS 52000000 + /* * SD bus widths */ #define SD_BUS_WIDTH_1 0 #define SD_BUS_WIDTH_4 2 +/* + * SD Switch + */ +#define SD_SWITCH_MODE_CHECK 0 +#define SD_SWITCH_MODE_SET 1 +#define SD_SWITCH_GROUP1 0 +#define SD_SWITCH_NORMAL_MODE 0 +#define SD_SWITCH_HS_MODE 1 +#define SD_SWITCH_NOCHANGE 0xF + +#define SD_MAX_HS 50000000 + /* OCR bits */ /* Modified: stable/7/sys/dev/mmc/mmcsd.c ============================================================================== --- stable/7/sys/dev/mmc/mmcsd.c Mon Feb 23 19:31:48 2009 (r188951) +++ stable/7/sys/dev/mmc/mmcsd.c Mon Feb 23 19:52:47 2009 (r188952) @@ -91,6 +91,8 @@ static int mmcsd_detach(device_t dev); static int mmcsd_open(struct disk *dp); static int mmcsd_close(struct disk *dp); static void mmcsd_strategy(struct bio *bp); +static int mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, + off_t offset, size_t length); static void mmcsd_task(void *arg); static const char *mmcsd_card_name(device_t dev); @@ -130,7 +132,7 @@ mmcsd_attach(device_t dev) d->d_open = mmcsd_open; d->d_close = mmcsd_close; d->d_strategy = mmcsd_strategy; - // d->d_dump = mmcsd_dump; Need polling mmc layer + d->d_dump = mmcsd_dump; d->d_name = "mmcsd"; d->d_drv1 = sc; d->d_maxsize = 4*1024*1024; /* Maximum defined SD card AU size. */ @@ -415,6 +417,33 @@ mmcsd_delete(struct mmcsd_softc *sc, str return (end); } +static int +mmcsd_dump(void *arg, void *virtual, vm_offset_t physical, + off_t offset, size_t length) +{ + struct disk *disk = arg; + struct mmcsd_softc *sc = (struct mmcsd_softc *)disk->d_drv1; + device_t dev = sc->dev; + struct bio bp; + daddr_t block, end; + + /* length zero is special and really means flush buffers to media */ + if (!length) + return (0); + + bzero(&bp, sizeof(struct bio)); + bp.bio_disk = disk; + bp.bio_pblkno = offset / disk->d_sectorsize; + bp.bio_bcount = length; + bp.bio_data = virtual; + bp.bio_cmd = BIO_WRITE; + end = bp.bio_pblkno + bp.bio_bcount / sc->disk->d_sectorsize; + MMCBUS_ACQUIRE_BUS(device_get_parent(dev), dev); + block = mmcsd_rw(sc, &bp); + MMCBUS_RELEASE_BUS(device_get_parent(dev), dev); + return ((end < block) ? EIO : 0); +} + static void mmcsd_task(void *arg) { From owner-svn-src-stable@FreeBSD.ORG Mon Feb 23 19:58:36 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3EFD510657BA; Mon, 23 Feb 2009 19:58:36 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 297B78FC12; Mon, 23 Feb 2009 19:58:36 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1NJwawJ034749; Mon, 23 Feb 2009 19:58:36 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1NJwaqB034748; Mon, 23 Feb 2009 19:58:36 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <200902231958.n1NJwaqB034748@svn.freebsd.org> From: Alexander Motin Date: Mon, 23 Feb 2009 19:58:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188953 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/sdhci X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 23 Feb 2009 19:58:38 -0000 Author: mav Date: Mon Feb 23 19:58:35 2009 New Revision: 188953 URL: http://svn.freebsd.org/changeset/base/188953 Log: MFC rev. 187876, 188462, 188724 Sync sdhci driver with HEAD: Add hw.sdhci.debug sysctl to control debug level. Fix read_ivar prototype. Add support for interruptless kernel dumping. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/dev/sdhci/sdhci.c Modified: stable/7/sys/dev/sdhci/sdhci.c ============================================================================== --- stable/7/sys/dev/sdhci/sdhci.c Mon Feb 23 19:52:47 2009 (r188952) +++ stable/7/sys/dev/sdhci/sdhci.c Mon Feb 23 19:58:35 2009 (r188953) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -151,6 +152,12 @@ struct sdhci_softc { struct sdhci_slot slots[6]; }; +SYSCTL_NODE(_hw, OID_AUTO, sdhci, CTLFLAG_RD, 0, "sdhci driver"); + +int sdhci_debug; +TUNABLE_INT("hw.sdhci.debug", &sdhci_debug); +SYSCTL_INT(_hw_sdhci, OID_AUTO, debug, CTLFLAG_RW, &sdhci_debug, 0, "Debug level"); + static inline uint8_t RD1(struct sdhci_slot *slot, bus_size_t off) { @@ -734,7 +741,7 @@ sdhci_attach(device_t dev) if (sc->quirks & SDHCI_QUIRK_FORCE_DMA) slot->opt |= SDHCI_HAVE_DMA; - if (bootverbose) { + if (bootverbose || sdhci_debug) { slot_printf(slot, "%uMHz%s 4bits%s%s%s %s\n", slot->max_clk / 1000000, (caps & SDHCI_CAN_DO_HISPD) ? " HS" : "", @@ -1146,17 +1153,10 @@ sdhci_start(struct sdhci_slot *slot) return; } */ - if (req->cmd->error) { - if (bootverbose) { - slot_printf(slot, - "Command error %d (opcode %u arg %u flags %u " - "dlen %u dflags %u)\n", - req->cmd->error, req->cmd->opcode, req->cmd->arg, - req->cmd->flags, - (req->cmd->data)?(u_int)req->cmd->data->len:0, - (req->cmd->data)?(u_int)req->cmd->data->flags:0); - } - } else if (slot->sc->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST) { + if (sdhci_debug > 1) + slot_printf(slot, "result: %d\n", req->cmd->error); + if (!req->cmd->error && + (slot->sc->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)) { sdhci_reset(slot, SDHCI_RESET_CMD); sdhci_reset(slot, SDHCI_RESET_DATA); } @@ -1177,13 +1177,22 @@ sdhci_request(device_t brdev, device_t r SDHCI_UNLOCK(slot); return (EBUSY); } -/* printf("%s cmd op %u arg %u flags %u data %ju\n", __func__, - req->cmd->opcode, req->cmd->arg, req->cmd->flags, - (req->cmd->data)?req->cmd->data->len:0); */ + if (sdhci_debug > 1) { + slot_printf(slot, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n", + req->cmd->opcode, req->cmd->arg, req->cmd->flags, + (req->cmd->data)?(u_int)req->cmd->data->len:0, + (req->cmd->data)?req->cmd->data->flags:0); + } slot->req = req; slot->flags = 0; sdhci_start(slot); SDHCI_UNLOCK(slot); + if (dumping) { + while (slot->req != NULL) { + sdhci_intr(slot->sc); + DELAY(10); + } + } return (0); } @@ -1363,23 +1372,23 @@ sdhci_intr(void *arg) SDHCI_UNLOCK(slot); continue; } -/* - slot_printf(slot, "got interrupt %x\n", intmask); -*/ + if (sdhci_debug > 2) + slot_printf(slot, "Interrupt %#x\n", intmask); + /* Handle card presence interrupts. */ if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { WR4(slot, SDHCI_INT_STATUS, intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)); if (intmask & SDHCI_INT_CARD_REMOVE) { - if (bootverbose) + if (bootverbose || sdhci_debug) slot_printf(slot, "Card removed\n"); callout_stop(&slot->card_callout); taskqueue_enqueue(taskqueue_swi_giant, &slot->card_task); } if (intmask & SDHCI_INT_CARD_INSERT) { - if (bootverbose) + if (bootverbose || sdhci_debug) slot_printf(slot, "Card inserted\n"); callout_reset(&slot->card_callout, hz / 2, sdhci_card_delay, slot); @@ -1424,7 +1433,7 @@ sdhci_intr(void *arg) } static int -sdhci_read_ivar(device_t bus, device_t child, int which, u_char *result) +sdhci_read_ivar(device_t bus, device_t child, int which, uintptr_t *result) { struct sdhci_slot *slot = device_get_ivars(child); From owner-svn-src-stable@FreeBSD.ORG Tue Feb 24 19:41:24 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 59ED710656BE; Tue, 24 Feb 2009 19:41:24 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2BBE18FC25; Tue, 24 Feb 2009 19:41:24 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1OJfO5L074562; Tue, 24 Feb 2009 19:41:24 GMT (envelope-from gallatin@svn.freebsd.org) Received: (from gallatin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1OJfOBD074561; Tue, 24 Feb 2009 19:41:24 GMT (envelope-from gallatin@svn.freebsd.org) Message-Id: <200902241941.n1OJfOBD074561@svn.freebsd.org> From: Andrew Gallatin Date: Tue, 24 Feb 2009 19:41:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189008 - in stable/7/sys: . contrib/pf dev/cxgb net X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2009 19:41:26 -0000 Author: gallatin Date: Tue Feb 24 19:41:23 2009 New Revision: 189008 URL: http://svn.freebsd.org/changeset/base/189008 Log: MFH r186260: Additional 10GbE media types (10Gbase-LRM, 10Gbase-Twinax*) Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/net/if_media.h Modified: stable/7/sys/net/if_media.h ============================================================================== --- stable/7/sys/net/if_media.h Tue Feb 24 18:53:07 2009 (r189007) +++ stable/7/sys/net/if_media.h Tue Feb 24 19:41:23 2009 (r189008) @@ -145,6 +145,11 @@ uint64_t ifmedia_baudrate(int); #define IFM_10G_SR 19 /* 10GBase-SR 850nm Multi-mode */ #define IFM_10G_CX4 20 /* 10GBase CX4 copper */ #define IFM_2500_SX 21 /* 2500BaseSX - multi-mode fiber */ +#define IFM_10G_TWINAX 22 /* 10GBase Twinax copper */ +#define IFM_10G_TWINAX_LONG 23 /* 10GBase Twinax Long copper */ +#define IFM_10G_LRM 24 /* 10GBase-LRM 850nm Multi-mode */ +#define IFM_UNKNOWN 25 /* New media types that have not been defined yet */ + /* note 31 is the max! */ @@ -349,6 +354,10 @@ struct ifmedia_description { { IFM_10G_SR, "10Gbase-SR" }, \ { IFM_10G_CX4, "10Gbase-CX4" }, \ { IFM_2500_SX, "2500BaseSX" }, \ + { IFM_10G_LRM, "10Gbase-LRM" }, \ + { IFM_10G_TWINAX, "10Gbase-Twinax" }, \ + { IFM_10G_TWINAX_LONG, "10Gbase-Twinax-Long" }, \ + { IFM_UNKNOWN, "Unknown" }, \ { 0, NULL }, \ } @@ -603,6 +612,9 @@ struct ifmedia_baudrate { { IFM_ETHER | IFM_10G_SR, IF_Gbps(10ULL) }, \ { IFM_ETHER | IFM_10G_CX4, IF_Gbps(10ULL) }, \ { IFM_ETHER | IFM_2500_SX, IF_Mbps(2500ULL) }, \ + { IFM_ETHER | IFM_10G_TWINAX, IF_Gbps(10ULL) }, \ + { IFM_ETHER | IFM_10G_TWINAX_LONG, IF_Gbps(10ULL) }, \ + { IFM_ETHER | IFM_10G_LRM, IF_Gbps(10ULL) }, \ \ { IFM_TOKEN | IFM_TOK_STP4, IF_Mbps(4) }, \ { IFM_TOKEN | IFM_TOK_STP16, IF_Mbps(16) }, \ From owner-svn-src-stable@FreeBSD.ORG Tue Feb 24 19:42:49 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D260A1065782; Tue, 24 Feb 2009 19:42:49 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A18DA8FC12; Tue, 24 Feb 2009 19:42:49 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1OJgnF4074629; Tue, 24 Feb 2009 19:42:49 GMT (envelope-from gallatin@svn.freebsd.org) Received: (from gallatin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1OJgnnC074628; Tue, 24 Feb 2009 19:42:49 GMT (envelope-from gallatin@svn.freebsd.org) Message-Id: <200902241942.n1OJgnnC074628@svn.freebsd.org> From: Andrew Gallatin Date: Tue, 24 Feb 2009 19:42:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org X-SVN-Group: stable-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189009 - in stable/6/sys: . contrib/pf dev/cxgb net X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2009 19:42:52 -0000 Author: gallatin Date: Tue Feb 24 19:42:49 2009 New Revision: 189009 URL: http://svn.freebsd.org/changeset/base/189009 Log: MFH r186260: Additional 10GbE media types (10Gbase-LRM, 10Gbase-Twinax*) Modified: stable/6/sys/ (props changed) stable/6/sys/contrib/pf/ (props changed) stable/6/sys/dev/cxgb/ (props changed) stable/6/sys/net/if_media.h Modified: stable/6/sys/net/if_media.h ============================================================================== --- stable/6/sys/net/if_media.h Tue Feb 24 19:41:23 2009 (r189008) +++ stable/6/sys/net/if_media.h Tue Feb 24 19:42:49 2009 (r189009) @@ -145,6 +145,11 @@ uint64_t ifmedia_baudrate(int); #define IFM_10G_SR 19 /* 10GBase-SR 850nm Multi-mode */ #define IFM_10G_CX4 20 /* 10GBase CX4 copper */ #define IFM_2500_SX 21 /* 2500baseSX - multi-mode fiber */ +#define IFM_10G_TWINAX 22 /* 10GBase Twinax copper */ +#define IFM_10G_TWINAX_LONG 23 /* 10GBase Twinax Long copper */ +#define IFM_10G_LRM 24 /* 10GBase-LRM 850nm Multi-mode */ +#define IFM_UNKNOWN 25 /* New media types that have not been defined yet */ + /* note 31 is the max! */ @@ -345,6 +350,10 @@ struct ifmedia_description { { IFM_10G_SR, "10Gbase-SR" }, \ { IFM_10G_CX4, "10Gbase-CX4" }, \ { IFM_2500_SX, "2500baseSX" }, \ + { IFM_10G_LRM, "10Gbase-LRM" }, \ + { IFM_10G_TWINAX, "10Gbase-Twinax" }, \ + { IFM_10G_TWINAX_LONG, "10Gbase-Twinax-Long" }, \ + { IFM_UNKNOWN, "Unknown" }, \ { 0, NULL }, \ } @@ -597,6 +606,9 @@ struct ifmedia_baudrate { { IFM_ETHER | IFM_10G_SR, IF_Gbps(10ULL) }, \ { IFM_ETHER | IFM_10G_CX4, IF_Gbps(10ULL) }, \ { IFM_ETHER | IFM_2500_SX, IF_Mbps(2500ULL) }, \ + { IFM_ETHER | IFM_10G_TWINAX, IF_Gbps(10ULL) }, \ + { IFM_ETHER | IFM_10G_TWINAX_LONG, IF_Gbps(10ULL) }, \ + { IFM_ETHER | IFM_10G_LRM, IF_Gbps(10ULL) }, \ \ { IFM_TOKEN | IFM_TOK_STP4, IF_Mbps(4) }, \ { IFM_TOKEN | IFM_TOK_STP16, IF_Mbps(16) }, \ From owner-svn-src-stable@FreeBSD.ORG Tue Feb 24 20:16:34 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D1F41106564A; Tue, 24 Feb 2009 20:16:34 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id BE57B8FC0C; Tue, 24 Feb 2009 20:16:34 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1OKGYtS075289; Tue, 24 Feb 2009 20:16:34 GMT (envelope-from gallatin@svn.freebsd.org) Received: (from gallatin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1OKGY8J075287; Tue, 24 Feb 2009 20:16:34 GMT (envelope-from gallatin@svn.freebsd.org) Message-Id: <200902242016.n1OKGY8J075287@svn.freebsd.org> From: Andrew Gallatin Date: Tue, 24 Feb 2009 20:16:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189010 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/mxge X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2009 20:16:35 -0000 Author: gallatin Date: Tue Feb 24 20:16:34 2009 New Revision: 189010 URL: http://svn.freebsd.org/changeset/base/189010 Log: MFH r188736 and r188737: Better support for recent Myricom 10GbE NICs Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/dev/mxge/eth_z8e.h stable/7/sys/dev/mxge/ethp_z8e.h stable/7/sys/dev/mxge/if_mxge.c stable/7/sys/dev/mxge/if_mxge_var.h stable/7/sys/dev/mxge/mxge_mcp.h stable/7/sys/dev/mxge/rss_eth_z8e.h stable/7/sys/dev/mxge/rss_ethp_z8e.h Modified: stable/7/sys/dev/mxge/eth_z8e.h ============================================================================== --- stable/7/sys/dev/mxge/eth_z8e.h Tue Feb 24 19:42:49 2009 (r189009) +++ stable/7/sys/dev/mxge/eth_z8e.h Tue Feb 24 20:16:34 2009 (r189010) @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2008, Myricom Inc. +Copyright (c) 2006-2009, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,7074 +28,6951 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int eth_z8e_uncompressed_length = 369604; -static unsigned int eth_z8e_length = 113069; -static unsigned char eth_z8e[113069 + 1] = - "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x66\x32\xc0\x24\x0d" - "\x4c\xb4\x94\x8e\x88\x3a\x2a\xb6\xa3\xa2\x46\xc5\x16\x2d\x6a\x2c" - "\x70\x1b\xef\x8b\x12\x21\x68\x90\x1f\x09\x36\xf8\x44\x45\x18\x21" - "\xc0\x04\x43\x26\x0c\xd8\x06\xca\xaf\x6a\xb4\x28\x81\xa4\x15\x6f" - "\xb1\xc5\x8a\xb7\x78\x4b\x5b\x7e\x8c\x12\xef\xa5\x36\xc9\x44\xc1" - "\xe7\x06\x3f\xb4\x4e\x79\x22\x4d\x79\x82\x4e\xc9\x40\x62\x32\x33" - "\xfb\xfd\xae\xbd\xcf\x99\x9c\x99\x9c\x09\x72\xef\xfd\xbc\xef\x3f" - "\xcd\xe7\x73\x72\x66\xef\xbd\xf6\xda\x6b\xad\xbd\xf6\xda\x6b\xff" - "\x38\x7b\x13\xfd\x37\xfe\xac\x47\x03\xff\x9d\xec\xff\xf8\xfb\xc7" - "\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc\xfd\xe3\xef\xff\x9f\xbf" - "\xb3\x56\x1b\xbd\xbb\x85\xa8\xdb\x6f\x77\x86\x2c\xb7\x4e\xfe\xc9" - "\x0b\x22\x8a\x68\x4b\x88\xec\x4e\x7e\x6b\x0f\x3d\x8f\x78\xeb\x16" - "\xb2\x5f\x93\x43\xd9\x93\xb6\x13\xd5\x8e\x12\x9d\x2f\xbc\x24\xc2" - "\x6b\x5e\x12\x9d\x93\x5f\x23\x6a\x1c\x4b\xf4\xc2\x28\x11\x01\x9e" - "\x39\x21\x5a\x5b\xc9\x78\xd6\x20\xcc\xe9\x6b\x47\x89\x30\xe2\xcb" - "\x11\x1f\xe1\xf8\xd5\xa3\x80\x6b\x24\x91\xff\x25\xd1\x63\xc0\x6b" - "\xe7\xfc\x8c\x73\xf2\xd5\x92\x9e\x9d\x29\x78\x18\xc7\xbe\x10\x3d" - "\xb7\x70\x10\x1c\xd9\x9c\x5f\xd2\x86\x3c\x5d\x7e\x72\x46\xac\x64" - "\x89\xf8\x03\x5f\x43\xde\x08\x78\x72\x73\xde\xcd\x48\x17\x7e\xca" - "\x60\xbc\xc1\x9e\x28\x35\x56\x12\x01\x96\x5c\x55\x64\x39\x45\x99" - "\x77\x03\xde\xb2\x46\xe5\x77\x21\xce\x2a\xe3\x80\x87\xe3\x38\x0d" - "\xf1\x63\x39\xdc\xed\xcf\xcc\x4f\xe0\x64\x59\x70\xba\x35\x60\x45" - "\xba\x05\xf9\x6c\xc8\xb7\xac\xb1\x81\x48\xe1\xca\xc9\x0c\x51\x66" - "\x9d\x96\xaf\x1a\xf9\xaa\x39\xdf\x61\xa4\x4f\xaa\x53\x3c\xce\xa8" - "\x23\x2b\xa7\xb3\x7c\x51\x8e\x15\x70\xbb\x74\xfc\x0a\x87\xf5\x7e" - "\x8d\x9f\xaf\x20\xad\x31\x39\xcd\xf6\xbc\x96\x96\x8d\xb4\x50\x72" - "\x1a\xf0\xa9\xb4\x4b\x90\x16\x4d\x93\x76\x69\xb7\x3f\xcb\x99\x9c" - "\x76\x30\x57\x4b\xfb\x3a\xd2\xc6\x27\xa7\x59\xf4\x7c\x4e\xa4\x15" - "\xe8\x69\xc6\x7a\x51\x1a\x66\xc3\x33\xc4\x4e\x34\x14\xcf\x30\xbb" - "\x5e\x57\x4b\x9d\x22\xee\xbb\x8c\x6c\x62\xfd\x7e\x7b\xdc\x2f\x28" - "\xe8\xed\x21\xd7\x68\xf2\x9d\xa4\xac\x00\xf0\xd2\xa6\x95\x64\xf7" - "\x79\x44\x4f\xd0\xdb\x49\x2d\xe1\x4e\xf2\x85\x45\x47\x30\x7a\x8e" - "\xaa\xce\x91\x3d\x18\x3d\x43\x55\xcf\x90\xb3\xb1\xf2\x53\x32\xd3" - "\x83\xb8\x55\x90\x6f\x0c\xe7\x6d\xa7\x96\xba\x76\xf2\xd5\x25\xe7" - "\xf5\x5d\x41\xce\x66\x84\xa1\x03\x8e\xf2\xad\x22\xde\xe8\x8a\x52" - "\x34\x6b\xbf\xbd\xf2\x35\xb2\xf9\xae\x26\x6b\x73\x69\x80\x5c\xdf" - "\x60\x5a\xbe\x52\xc3\xb4\xac\x7d\x92\xec\xaf\x3e\x1e\xb0\x8a\xf5" - "\x8d\xf6\x5f\xf5\xf6\x58\xd7\x9c\x26\xdb\x61\xe7\x64\x3a\xec\x3c" - "\x41\xc1\xad\x77\x53\x30\x12\xa5\x4d\x4f\x52\xf6\xe1\xc8\x44\x0a" - "\xae\x8d\x13\xe3\x0b\x2e\x9c\x88\xf7\x39\xc0\x74\x92\x6b\x09\xd1" - "\x29\xfa\x8a\xb7\x16\x78\x42\x0a\x27\x74\xe0\x2b\x6b\xdf\xf1\x10" - "\xb1\xcc\x38\x9c\x46\x9f\x73\x5e\x60\x5d\xb5\x4a\x1d\xea\xac\x1f" - "\x25\x3a\xae\xad\xa5\x91\x80\xcf\x41\xfe\xc6\x90\x75\xef\x3e\x4d" - "\x9f\x3b\x6e\xa9\xa5\x9c\xbd\x55\x61\x1b\xf4\xb0\xd3\xe1\x85\xfe" - "\xad\xa4\x21\x8e\x28\x59\xc0\xc3\xeb\xf5\x88\xbb\x76\xa4\xcc\xd3" - "\x13\xa2\xb7\xda\x38\x8f\xf8\xfa\xec\xbf\xc7\xbf\x3e\x3b\x1c\xff" - "\xc9\xec\xb3\xe2\x27\xb3\xbb\x62\x3f\x99\x1d\xf1\x55\x90\x3d\xf6" - "\xf5\xd9\xe7\x5a\x3c\x52\x56\x39\x2d\x1e\xc8\x2a\x46\xf6\x55\x67" - "\x28\x67\xde\x33\xa8\xa3\xe8\x9f\x68\xd5\x13\xe4\x8c\x67\xbe\x1b" - "\x08\x46\x3f\xa2\x79\x95\x24\xf0\xbb\xd5\x8c\xf6\xae\xac\xc6\x7c" - "\xa5\x5b\x76\xb4\xe5\x6c\x0f\x68\x95\xe5\x76\x65\x35\x69\xf1\x4c" - "\x4f\x76\x8d\x1e\x2f\xb2\x1a\x0b\x51\x1f\xbe\x11\xab\x2d\xb4\xa3" - "\x97\xe8\x96\x38\x59\x4e\x53\x76\x2d\x78\xc9\x31\xe2\x9f\x3e\xe5" - "\xe1\xbb\x29\xf7\xce\x9b\x72\x6f\xff\xf6\x84\xdb\xe9\x81\xfb\x26" - "\xdd\x4d\x05\x8f\x4c\xc7\xbf\x07\xef\xa6\xa2\x7f\xba\x1f\x3f\x26" - "\xdd\x7d\x6b\xee\xf7\x6e\x2a\x98\x74\xff\x94\x9b\x26\xd0\x43\x85" - "\xb7\xe5\xde\x76\x1b\xdd\x37\x65\xea\xad\xb9\xb9\xda\xfb\xd6\x5c" - "\x06\x7a\x74\xc2\x94\x19\x37\x15\x2c\x59\x5c\xbe\xf8\xa6\x07\xef" - "\x9f\x64\xb4\x6f\x39\xf1\xe5\x71\xda\x01\x1d\x17\x5d\xf9\xc4\xb2" - "\x0f\x54\x9d\x45\xfd\x0d\xff\x29\xe4\x1f\x56\xba\x9f\xbd\x07\xf4" - "\xdb\xba\xfd\xc3\xf3\x43\xd6\xb7\x9d\x4c\xbf\xeb\x1a\xae\xe3\x11" - "\x5b\xb9\x3d\xa3\x0e\x22\xcc\x5f\x46\xa5\x84\x59\xa8\xd7\x53\x3c" - "\x6b\x7f\x6e\x64\x69\x99\xb4\x3b\x88\x5f\x8b\xbc\x21\x8e\xdf\x84" - "\x70\xa3\x27\x8f\xc4\xab\xf9\x16\x9b\x4b\xda\x0e\x2e\x2f\xb7\x96" - "\x69\xc8\x6a\x2a\x12\x7d\x45\xa4\xc5\xb5\xc6\x39\xbc\xbe\x69\x96" - "\xf0\x21\x6e\xa5\x8c\xfb\x00\xe1\xa2\x6e\xd8\xb3\x6e\x51\x46\xf1" - "\xa5\x45\xac\x6f\x19\xa0\x65\x0a\x78\xe8\x90\xf0\x5d\x32\xff\x50" - "\xc4\x5d\x07\x7c\xb3\xf0\x3c\xaa\xe1\x84\x6d\xbb\x24\x8c\xfc\xb3" - "\xe3\xa2\x88\x44\xf6\x65\x76\xfc\x9e\x13\x58\xd9\x49\xa7\x3c\x64" - "\x0d\x21\x2d\xee\x2b\x23\x43\xf9\x11\xee\x0f\x50\x96\xad\xbb\xaf" - "\x8c\x42\x34\xbc\x47\xe2\x62\x9c\xfd\x30\xed\x5c\x26\x78\x0c\x43" - "\x4e\x6f\x77\xfb\x47\x80\xff\x7f\x33\xca\xa8\x86\xe1\xc1\x73\x07" - "\xf3\x01\x1c\x21\x2e\x03\x38\xad\x1a\x4e\x3d\x3f\xcb\xf9\xa0\x92" - "\xf3\x88\x3d\x29\x72\x6e\x43\xda\x61\xe8\x7d\x24\xc3\x2b\xd3\x5b" - "\xd1\xae\x6a\x39\x1d\xf9\xcb\x99\x46\x65\x8b\x65\x5a\x67\x72\x5e" - "\x87\xd3\x50\x47\x59\xaa\x8e\x1c\x39\x7a\x1d\x71\xfe\x48\xe6\x71" - "\x8f\x56\xfe\x11\xc0\x64\x20\x3d\x37\x05\xc7\x54\xa4\x35\x71\xbd" - "\x8d\xf0\x50\x06\xe7\xd9\x31\x4a\xb7\xff\x12\x5f\x49\x32\x7c\xce" - "\x18\xc0\x7f\xb0\x59\xe1\xfc\x04\x3a\x6d\x83\x2e\x75\x1e\xf6\x72" - "\x3f\xe7\xd8\x90\x2c\x1f\xc7\x2e\x96\x8b\x94\x87\x90\xf2\xd0\xf9" - "\xe9\x44\xde\x53\x80\xdf\x9f\x02\xdf\x06\x79\xcd\x92\xf5\xdf\x35" - "\x00\xfe\x33\xc0\x77\x26\xc3\xe7\x64\x4b\xfd\x51\x79\xf4\x7a\x2c" - "\xd7\xea\xd5\x92\x52\x26\xf3\x33\xbc\xdb\x9f\x93\xc2\xff\x25\xfb" - "\x80\xfb\xfc\x26\xd5\x46\x46\xa0\xde\x6f\x02\xde\x05\x23\xc2\xe4" - "\x40\xd8\x61\x08\xe7\xe0\xb9\x44\x74\xff\x3f\x71\xc4\xdd\x86\xb8" - "\xe7\xd0\x9e\xac\x08\xc7\x54\xf8\x92\xb7\x10\xb6\x80\x9e\x47\x05" - "\xeb\x59\x77\x3e\xeb\xd0\x78\xc4\xbf\xae\xa5\xff\x54\xc2\x03\x26" - "\xce\x7a\xd6\x95\xd0\xd9\x97\x99\x3e\xd6\x5b\x3d\x9f\x58\x21\xd3" - "\x26\x21\xed\x39\xbc\xef\xc7\xfb\x19\xbc\x1f\xc2\xfb\x01\xdf\x17" - "\xe4\xf4\xc5\x44\x87\x16\xbe\x13\xef\xe9\x78\x5f\x87\xf7\x0c\xbc" - "\x2f\xe1\x36\xc6\x3c\x87\x9f\x45\xfb\xc9\x92\x6d\x69\xa8\x51\x96" - "\xc6\xf6\x95\x88\x53\x70\x56\xa3\xfc\x40\x07\xb7\xdd\x02\xf0\xd9" - "\xc1\x65\x6a\xb8\x86\x98\xe0\xb2\x99\xe0\xb2\x18\x71\x85\x28\x67" - "\xbf\xcf\x2b\x04\xde\xbb\x46\x44\x38\x7c\x49\x03\xe4\x60\x43\x78" - "\x2d\xcb\x44\xd9\x90\x4b\x8e\x24\xd7\xed\xf0\x72\x96\x89\xae\x3b" - "\x5a\x59\x43\x8c\x65\x99\xd9\xea\x3e\xeb\xc8\x77\xd0\x0f\x5f\xda" - "\xe7\x73\x93\xa8\xd9\xef\xba\x89\xc8\x3a\xae\x9a\x32\x83\xd1\x63" - "\x34\x2d\x2a\x62\x78\xfa\xae\x27\xba\x24\x18\x6d\xa2\x6f\x12\x5d" - "\x1d\x8c\xd6\xa2\x2f\x28\xe7\xb4\x43\xd7\x92\xc5\x82\xb7\xef\x06" - "\xb2\x5a\x82\xd1\xf1\x88\xdf\x49\x63\xc9\x66\xf9\xa7\xe7\x44\x77" - "\x30\x3a\x19\xe1\x85\x54\x1c\xa3\x9c\xa9\x43\x84\x6f\x5a\x4c\x7c" - "\xf2\x4f\x43\xe2\x22\x18\x6d\x44\x7c\x29\x4d\x8b\x7d\x21\xa6\xc5" - "\xba\xf1\x7c\x8e\xe7\x13\x3c\x87\xf0\xf8\x84\x58\xb7\xdf\xd5\x87" - "\x3e\x02\x34\xe5\xf6\x89\xb2\x0c\xd0\x94\x8b\x3e\x43\x88\xac\xfd" - "\x79\xc1\xe8\x44\xe0\xb3\x12\x60\x72\xfb\xfa\x90\xb6\x7e\xff\xbd" - "\x12\x26\x6b\xff\x3d\x32\x5c\xb3\xbf\x40\xd8\xf7\xe7\xdd\x54\x4d" - "\xc3\x98\xfe\x38\x64\x16\x8c\xa2\x9f\x8e\x7e\x4a\xd3\x2a\xc2\x82" - "\x79\x18\xb1\x5a\xe0\xf7\x21\x01\xb9\x3a\xa6\x55\xf8\x44\x71\x94" - "\xec\x22\x93\x71\x77\x32\xde\x02\xe0\x7a\x40\xc3\xe5\x01\x6c\x98" - "\xe1\x18\x97\x8e\x87\x71\x30\xec\xb4\x18\xf4\x7d\xdd\x7e\x4f\xdf" - "\xba\xfd\x25\x78\xaa\xf1\xec\x41\xde\x77\xfb\x9e\x95\x72\x6c\xc5" - "\xef\x50\x0f\xea\x55\xca\x31\x46\xc3\x00\xdb\x8a\xfa\x98\xdc\x2d" - "\xe9\x3e\x40\x92\xee\xf5\xfb\x45\x8f\xa2\x3f\xae\xf1\x13\xe3\xf8" - "\x08\xea\x0d\x30\xae\x88\x4c\x3b\x70\x15\xf2\x15\xca\x7c\x35\x07" - "\x5c\xc2\x7e\x20\x37\x0e\x7d\x84\x3c\xab\x59\x96\x90\x6f\x35\xfb" - "\x49\x2c\x53\xb1\x0e\xe9\x99\x07\x72\xfb\xd6\x1d\xc8\x43\xfe\xe9" - "\x7d\x02\xb4\x64\x1d\x28\xe9\x51\x65\x16\x03\xcf\x9c\x6e\xc6\x69" - "\x3f\x50\x02\x5c\x9e\x2f\xfc\x2e\xc8\x42\xf4\x4c\x8b\xae\x8e\x16" - "\x57\x50\x86\x9b\xaa\x41\xef\x76\xf8\x63\x0b\x81\x6f\x2d\xa7\x7d" - "\x32\xad\x82\xbe\x8a\xb2\x0e\x01\x6f\x09\x97\x87\x32\x3c\xc0\xf9" - "\x34\x70\x95\x32\x4d\xbd\x7e\xca\x41\xb8\xba\x57\xd1\xd7\x10\xaf" - "\x39\x10\x88\xdb\x0f\xec\x31\xea\x8f\x92\x19\xeb\xcd\x1b\x1c\x97" - "\xa3\xeb\x4a\xac\xe6\xc0\x96\x1b\x89\x72\x1e\x8c\x88\x28\xeb\xcb" - "\x2d\xe4\xb1\xb4\x44\x9a\xa8\x38\x6a\xa7\x16\xcf\x5e\xba\x81\xd8" - "\x67\x8b\x50\x4b\xa4\x16\xe1\x8d\x78\x97\x53\x73\xe7\x4e\x62\x1a" - "\x1f\xf4\x44\x56\xc7\xec\x07\x73\x9a\x3b\x1f\x20\xe4\x3f\x04\x1a" - "\xe3\xf3\x3c\xb6\xea\x16\x4f\x84\xc3\xbe\xe6\x4e\xe8\x68\x4c\xc4" - "\xa2\x35\x07\xaa\xa3\xf6\x83\xae\x07\xcf\x89\xf0\x03\x9d\xd5\x43" - "\x10\xd7\xe7\xb0\x88\xa8\xc3\xeb\x13\xcd\x9d\x6b\x69\xde\x39\xb2" - "\x34\x97\xed\x95\xba\x3a\xcf\xe3\x21\x99\xff\x5c\xd4\x31\xb7\xb3" - "\x9a\xe6\x96\xd1\x08\xc0\x7f\xce\xba\x2b\x46\x54\x53\x53\x7b\x29" - "\x3d\x70\x26\x9a\xf1\xe0\xb9\x3e\xd1\x54\x52\x4b\xcd\x65\xb5\x2c" - "\x8f\x06\xf6\x99\x1e\x38\xd3\x25\x1e\x3c\xd7\x2d\x9a\xcb\xde\xa0" - "\xa6\x92\xbd\x34\xf5\xd3\x80\x23\xb6\xee\xc0\x96\x78\xe6\x81\x3d" - "\xf1\x75\x07\x02\xd1\x75\x07\xaa\x63\x99\x07\x73\xa2\x99\x07\x5d" - "\x62\xfd\xc1\x2d\x90\x5f\xa6\xac\x8b\xac\x83\x9b\xf0\xdb\x25\xeb" - "\xd7\x7e\xb0\x41\xd4\x1c\x0c\xf4\xad\x3b\xb8\x27\xe8\x9d\x48\x22" - "\xf3\x60\x03\xeb\xbc\x58\x77\x30\x00\xb8\x80\xd2\x91\x83\xad\xac" - "\x23\x80\x09\xe1\x09\xf7\xad\x3b\x84\xb6\x72\xa8\x00\x38\x2e\x51" - "\xf8\x0e\x4d\x63\xb8\xb8\xfd\x50\x41\xbc\xe6\x50\x89\xb0\x1f\xf2" - "\xc0\xb7\xb2\x3e\xf8\x4c\x0f\xe4\x07\xd9\x79\x21\x77\x3f\xda\x87" - "\x37\x86\x70\x8c\xe6\x3d\x43\xbe\xa0\xf7\x04\x7e\x9f\x20\x71\x70" - "\x0b\x3d\xf8\xcc\x21\xc1\x69\x0f\x3e\xe3\x13\x90\x8d\x23\x9e\x09" - "\x3c\xeb\x80\x27\x13\x78\xd6\x07\x2e\xed\x61\x9d\xaa\x09\xe4\x3c" - "\xf0\x9c\x08\x0b\x7b\xc0\x13\x1f\x4a\xb2\x6d\xc4\x0f\x0a\xa1\xda" - "\x47\x27\x74\x72\x74\x75\xb1\x97\x1a\xc4\xba\x40\x8e\xc8\x0c\x20" - "\xdf\xbb\xff\x0a\xbb\x95\x21\xa4\x8d\x79\x77\x4f\xdf\xba\x77\x5b" - "\xf1\x04\xfa\xdb\x14\xb7\xbd\x77\xf7\x7c\xd9\xf1\x43\xb7\x7f\x14" - "\xc6\x3f\xc7\xa4\xff\x84\xdf\xe8\xff\x3f\xda\xab\xfd\x3e\x11\xa2" - "\xfd\xd9\xd2\xa7\x84\x2d\xf3\x54\xd1\xd7\x4e\xd3\xd7\xb7\x80\x5f" - "\xc2\xef\x6c\xfc\xae\x9d\x76\xfd\x21\x11\xdf\x60\x9b\x80\x3a\xed" - "\x66\x5b\x23\xfc\xe3\xd9\xff\xc8\xeb\xee\x2e\xb3\x8b\x6e\x77\xb6" - "\xc8\x6a\x7e\x49\xf4\x39\xd9\xf7\x75\x20\x3c\x02\xb2\x1b\x8b\xf7" - "\xa5\xdb\xcf\xd3\x48\x3c\xce\xed\xfe\x78\x35\xdb\x52\xfc\xce\x15" - "\x2b\x9c\x59\x9b\x96\xd3\x38\x47\x84\xec\xf5\xfe\x78\x91\x63\x75" - "\x0e\xc1\xef\x1e\xc9\xbf\x85\x3f\x90\x5b\x7f\x9e\x6c\xec\x8f\xc7" - "\x87\xa3\x3c\xaf\x43\x88\xa5\x6e\xaa\x5f\x02\x7b\x83\xb1\x69\xbd" - "\x5f\xec\x89\x75\xbb\xad\x4c\xa7\x4e\x0b\xd3\x06\x3a\xaf\x00\x9d" - "\x3b\x67\x56\xe4\xd1\x7b\xf0\x11\xcc\x6c\x76\xb7\xff\xeb\x09\xfe" - "\xd3\xa4\xb7\xeb\x32\x31\x4f\x77\xda\x74\x39\xa5\x19\x7b\x8c\xe4" - "\xb6\x1c\x3b\x2f\xc2\x9b\x17\x11\xcb\xc2\xe9\x8b\x8a\xff\x03\x7b" - "\x5a\x5d\x15\xa3\x2b\xa6\x55\x5c\x25\x82\x61\x11\x08\x7a\xcf\xc8" - "\x71\x7f\x3d\x60\xaa\xa2\x22\xae\x8f\xbf\x6b\x5f\x82\xef\xb9\xae" - "\xd9\x2b\xd6\x35\x97\x77\x2d\x17\x51\xf8\x47\xed\x28\xd3\x1b\xa2" - "\x5b\xa3\xaa\x6e\x0e\x34\xc0\x7f\x68\xef\xb2\x37\x97\x03\xf7\x25" - "\x8c\xbb\xc5\x23\x02\xf1\xcc\xe6\x4a\xc0\x35\x84\xe8\x2f\xd9\xc6" - "\xb1\xff\x5a\xe0\x5c\x0b\x9c\x48\xdb\x1f\xa2\x2b\x06\xcc\x01\xa8" - "\x59\x0a\x42\xbd\xb8\xfa\x27\x37\x2c\x9a\xfa\xe8\x7f\x39\x78\xf2" - "\xcc\x93\x75\xbe\xd1\xf6\x5c\x5d\xf0\xf9\x7d\xab\x68\x0c\xea\xe1" - "\xf2\xd3\x74\xd9\xad\xe8\x87\x4f\x09\xbf\xf3\xc8\xab\x2b\x7b\x30" - "\x26\xbf\x6c\x62\x88\x76\xd5\xa6\x93\x9b\x60\xdb\x77\x5e\x74\x6c" - "\x5e\x9e\x90\xd9\x5f\xa6\x55\xc4\x05\xff\xe6\x36\x55\x8f\x78\x96" - "\x07\xf0\xac\xd5\x65\x91\x46\xfe\x36\x51\xd3\x5c\xa3\x7c\xea\xcb" - "\xda\x05\xc6\xc8\x81\x2b\xa3\xfc\xfb\x53\xe9\x33\xd4\x1c\xdc\xd3" - "\x05\x5b\xc1\xe3\x33\x8c\xef\x22\x18\x4f\xf7\x00\x67\x5b\x88\xae" - "\x0e\x69\xf3\x11\x91\x60\x74\x0a\xdb\x8d\x3d\xe9\xeb\x57\xc7\x3f" - "\xe6\x98\x86\x33\x20\xec\xc7\xf7\x56\x29\xba\x7b\xaa\x22\xa2\x83" - "\x71\xf3\xf8\xa7\x1d\x30\x3b\x50\x0f\xa2\xe6\xf8\xae\x4d\x1c\xb7" - "\xbc\x97\xe3\x3e\x82\x1e\x0b\x45\xd7\x98\x8f\x20\xb7\xaf\xc3\xc7" - "\x0d\x07\x56\xf6\xd2\xa9\x4a\xca\xe0\x71\x67\xb7\x7f\xf4\xc2\x10" - "\xdd\xd3\x20\xc7\x7e\x7e\xfa\x45\x97\x75\xe6\x4c\xc4\x55\x87\xe8" - "\xde\x46\x19\x67\xa5\xaf\x21\xbc\x25\x01\x03\x1c\x08\x37\x18\xf2" - "\xcc\xec\xb2\xde\xf0\x0b\xc4\xed\x4d\xc9\xd3\x98\x92\xe7\x98\x1e" - "\x06\x7d\x9d\xae\xe5\x92\xaf\x17\x91\xbf\x01\x4f\xb5\x56\x6e\x4f" - "\x32\x8e\xcb\xed\xc9\x38\x2e\x77\x0e\xa4\xf5\xf2\x71\x29\x79\x26" - "\xa6\xe4\x99\x3a\x90\xd6\xcb\x4b\x52\xf2\x78\x52\xf2\x54\xeb\x61" - "\x6d\x0e\x26\x17\x71\xb5\x29\x79\x76\xa6\xe4\xd9\x6b\x08\x7f\x15" - "\xe1\x04\xff\x5c\xd7\xf0\x07\x04\x8f\xab\xa1\xb7\xac\xc3\x0d\x6c" - "\x4f\x79\xce\x63\x69\x25\xdc\x8b\x75\x07\x1b\x00\x1f\xd1\xf1\xeb" - "\xba\x23\xe1\x95\xfe\x74\x28\xfd\x19\xe3\x4c\xc0\xc0\xc5\x6a\x74" - "\x45\x08\xb2\xec\xe0\xf9\xb2\x60\x64\x8a\x36\xde\x1c\x33\x87\x75" - "\x4a\x2f\xd3\x51\xa9\xf4\x86\xe7\x0e\xf4\x32\x43\xd0\x15\xee\xaf" - "\x0c\xfa\xd9\xce\x65\x69\x65\x54\xea\x65\x00\x77\x3b\xeb\x8f\x9c" - "\x2f\x01\x7e\x2d\xdf\x1e\x25\xf7\x31\x3b\x93\xe5\x31\x66\x6f\xb2" - "\x3c\xc6\x34\x1a\x65\xc8\x36\x22\x44\x97\xd7\xa4\xf3\x71\xe1\xef" - "\x78\xe0\x93\x5f\xe9\x8b\x8b\x93\xa7\xe8\x8a\x59\xd0\xfb\x0c\x7e" - "\x4b\x3f\xaa\x07\xfc\xda\x8f\x4e\x94\x3e\x54\xe5\x39\xf4\xb9\x12" - "\xf6\xab\x80\x6d\x07\xcc\xfd\x1a\xec\xfd\x6a\x4e\x4f\xbe\x87\xf1" - "\x1b\xfe\xd4\xd3\xb0\x45\x25\x61\x1f\xf7\xdb\xc7\x3d\x7a\x18\x63" - "\x12\x8c\x09\xaf\x70\x8a\x75\x47\x27\x9a\xd3\x82\x3e\x53\xd9\xd6" - "\x4e\x94\xf3\x75\xb6\x11\x90\xdf\x65\xb0\x33\x7f\xa9\x5a\x45\x5f" - "\x65\xfb\x20\x32\x9b\x6b\x95\xbc\xaf\xd8\x2d\xfc\xd5\x14\x44\x6f" - "\xe8\x59\x4e\x97\xc3\x9e\x6e\x38\x4d\x57\xbc\x53\x5c\xe9\x02\xad" - "\x18\xc7\x7e\x46\x24\xfb\x8e\xcc\xe6\x2d\xdc\x8f\xd6\x7f\xc6\x63" - "\xca\x2b\x42\xba\x6d\xc1\xef\xce\xc1\xec\x3c\xea\x2e\xac\xc6\x54" - "\x57\xce\xe2\x3a\x3a\x49\x57\x4e\x66\x7e\xd5\x5c\xe8\x95\x77\x88" - "\xf3\x62\x8e\x60\x5f\x1c\xbe\x46\x88\xae\xf4\xe0\x1d\x96\x8f\x9f" - "\x4a\xb4\x70\x08\x70\x63\xc5\xf9\x38\xc3\xa0\x0e\xae\x9c\x28\xfc" - "\x16\xb6\x71\xfb\xbb\xfd\x57\x96\x85\x68\x7c\x40\x8d\xab\xaf\x1c" - "\xcf\xb8\xd2\xd0\x10\xea\x9f\x67\xb9\xf2\x03\x57\x95\x85\xe9\x78" - "\x4d\xda\x24\xe0\xaa\xb7\xaa\xfe\x36\x0e\x5a\x77\xf8\xe3\x65\xe8" - "\x5b\xcb\xe2\xeb\xff\xb7\x57\xfe\xd6\xd2\x98\x8e\x38\xca\x37\xc5" - "\x9f\xb0\x51\x57\xad\xd2\xec\x5c\x6b\xdc\x7e\x30\xac\xd9\x67\x1e" - "\x17\x66\x9e\xa4\xab\x2a\x11\xc6\x58\xf3\x2a\xd7\xaf\xe2\x61\xeb" - "\x3b\xe5\x7a\x17\x71\x55\xa5\xc9\x93\x8f\xa7\x08\x4f\xa9\x16\xf6" - "\x48\x1e\xba\x4a\x31\x4e\xbb\xaa\x32\x9e\x09\xf9\xd4\xb0\xbc\xae" - "\x2a\x10\x5d\x63\xad\xfa\xef\xfa\xbf\xf3\xdc\xc0\x55\xd0\xff\x2b" - "\x2b\xd3\xd6\x47\x82\x56\xd7\x9d\x06\x5a\x43\x06\x5a\xed\x27\xc9" - "\x35\x41\xa3\xb5\x29\x99\x56\xd7\x04\x3c\xe8\xd2\x5c\x63\xf0\x8c" - "\xd3\xc2\x86\xe7\xaa\x30\xca\x47\x5d\x5c\xd1\xa3\xea\x84\xe3\x50" - "\x06\xcb\xe2\xef\x64\x8f\xf7\x15\x11\xcf\x8f\x72\x3c\xcb\x93\xe3" - "\xe3\xf0\x83\x10\xce\x41\x7a\x0e\xeb\xca\xe6\xb8\xd2\x05\x73\x9f" - "\xc2\x55\x94\xf0\xbd\xe0\x7b\xb2\xfe\x76\xd2\xd5\xa5\xd0\x71\xf0" - "\xf1\x9f\x5e\xd5\xd7\x5c\xbd\x80\xc3\x68\x5b\x7f\xc1\xef\x92\x66" - "\x48\xaf\x77\x7d\x53\x7e\x9f\x95\x86\xf5\x5a\x29\x2f\xba\xc9\x36" - "\x27\x9a\xd5\x58\x18\xec\xd8\x4b\x2d\xd1\x7f\x25\xd7\x93\x12\xc7" - "\xac\x60\x19\x6c\x55\x85\x88\xbd\xd9\xbb\x0b\xe3\xb9\xcf\x03\xe8" - "\x9b\xaf\x3a\x4d\x57\x4b\xfa\x7f\x74\x12\xdc\xcd\x93\xb8\x15\x3f" - "\xd9\xb6\x09\x9b\x1e\x87\x7d\x39\x25\x22\xf0\xe3\xb2\x36\xf6\xd2" - "\xb8\x57\x56\x52\x6e\x5d\x2f\x8d\xdd\xd1\x4b\x6e\xf1\x57\xb7\xb5" - "\x0e\xfe\xd9\xbc\x73\x39\x04\x1d\x2a\x1a\xe1\x21\xfb\x8e\x95\xf0" - "\xd3\xa2\x64\x89\x6d\x84\x9f\x16\x85\x9f\xf6\xb9\x9b\xdb\x52\xc2" - "\x4f\xeb\xeb\x63\x3f\xad\xb9\x87\x61\xd0\x06\x7b\x86\x97\x91\x25" - "\xbb\x84\x72\x40\x9f\xef\x33\x72\xbd\x9c\xdd\x0e\x1f\x11\x3c\x87" - "\x34\x7e\x21\xb3\xdd\x8e\x32\x1a\x26\x79\x45\xfb\x16\xeb\xfe\xd3" - "\x9b\x6e\xdd\x83\x6d\x6d\xe0\xca\x08\xcf\x47\x33\x0f\x6f\xf1\x5c" - "\xed\xde\xd1\x3d\xb6\xa5\x75\xa2\x87\xe3\xcb\xaf\x16\x3d\x88\xdf" - "\xca\x65\xef\x41\x7c\xb7\xff\xea\x40\xc8\xfa\xd6\x89\x8b\x99\x6f" - "\x67\x7f\x42\xae\x89\xc8\xbe\xe3\x1a\x4a\xe9\x7f\x60\x33\xae\x19" - "\xa9\xdb\xdb\xf2\xab\xc9\x59\xee\x12\x1d\x83\xcc\x49\x47\x74\x3f" - "\xef\xf0\x18\x99\xb7\x20\xe1\x77\xa8\xb5\x15\x52\x3e\xc3\x35\xb2" - "\x0d\xb3\x4f\xc0\x7d\x0c\xfb\xc1\x3c\x87\xaa\xe6\xbd\xae\x59\x6b" - "\xf0\x55\xb8\x8f\x89\xec\x5d\xd9\x63\xe3\xfc\xcc\xa7\x96\xbf\x34" - "\x9d\x3d\xe7\xb5\x1e\xf8\x22\x5b\x5b\xea\x88\x5a\xe0\xf2\x35\xd7" - "\xe5\xc1\x3f\xea\x95\xbe\xe8\x49\xba\x46\xce\x99\x07\x16\xf5\x12" - "\xff\x0e\x56\xde\x45\x41\xc0\x28\x7b\x7a\xed\xd8\x46\xaf\x9a\xff" - "\x6b\xf4\x9c\xe5\x75\x1f\x11\x58\xc2\x76\xe7\xda\x87\x0e\x57\x86" - "\x41\xd7\xb5\x63\xf4\x39\xe9\x10\x5d\x5b\xc0\xe5\x77\xd5\x1c\xdf" - "\xc2\xf3\x7b\x72\xce\x2e\x32\x81\x61\xf2\x42\x74\x4d\x62\x2d\x09" - "\x7e\x2c\xec\xde\x35\x3d\x83\xd0\x9a\xa3\xfa\xac\x6b\xbd\xc9\xfe" - "\xc5\x10\xf4\x73\xd7\x6e\x48\xee\xe7\xae\xad\x4b\xee\xe7\xae\xdd" - "\x9d\xec\x5f\x58\xe1\x5f\x5c\x1b\x48\xc9\xd3\x9a\x92\x27\x64\xc8" - "\xb3\x45\x2b\x27\x92\x9c\x67\xac\x2d\x39\xcf\xd8\x91\x86\x30\x78" - "\x1c\x3b\x56\xaf\x9f\x2e\xb9\x5e\x31\x76\xbc\x21\x6c\xad\x95\x6b" - "\x7a\x63\xf3\xf5\x38\xf4\xa3\x04\xff\x30\xc2\x3a\xa1\xe1\x2b\x4d" - "\xd1\x31\x86\xf7\xa6\xd0\x50\x93\x42\xc3\xd6\x84\x4f\x03\xfc\xa8" - "\xaf\x77\x4f\xd1\x75\x1e\xa9\x43\xec\xd3\x55\xd1\x34\x0e\x03\xd7" - "\x56\xc0\x43\x0e\x63\x8f\xa4\xe0\x6b\x4b\xc1\xd7\x61\x08\xe7\x20" - "\xdc\x63\xe0\x21\x27\xc3\x49\x16\xe8\x0b\xc6\x14\xd7\xe5\xe8\xf1" - "\xec\xdb\x82\xde\x0e\x9f\x5c\x2b\xca\xe3\x35\xa9\x4b\x4f\xd2\xd8" - "\x18\xfb\xc1\x0a\xe7\x75\x46\xff\x8f\x14\x5f\xd7\x15\x24\xd3\x71" - "\x5d\x49\x32\x1d\xd7\x79\x0c\x7c\x45\x1c\xab\xe9\x21\x47\x74\xfa" - "\x2c\xf6\x93\x79\xdd\x90\xfd\x55\xf8\x6d\x4e\x94\x99\xc3\xeb\x60" - "\xa7\xca\x29\x23\xe8\xed\x80\x1f\xd2\x1c\x49\xab\x4f\x59\xc7\x1b" - "\xb4\x75\x14\x17\xf0\xb7\xea\xfa\x88\xdf\x18\xff\x5e\x3b\x47\xda" - "\xe0\xf5\x47\x03\xc2\x57\xb4\x15\x72\x44\x5f\xfe\x8d\xf7\x54\x7f" - "\x72\x7c\x2f\xb7\x45\xf8\x4b\x1d\xb0\x33\xd9\x6a\xbe\xfa\x1b\x39" - "\x06\x7d\x8e\xb8\x56\xde\x2b\x4e\xd2\x37\x3e\x60\x3b\xc4\xfe\x1f" - "\xfb\xfc\x87\x23\x61\xf4\x0d\xa7\x89\x69\x46\x5a\xab\x96\x2f\xdf" - "\x90\x2f\xcc\x6d\x8a\xe1\x39\xed\x96\x28\xd9\x38\x0f\x70\x8c\x94" - "\xe3\x01\xe0\x3b\x8c\x36\x8a\x3c\x95\x7a\x1e\xc0\xca\x3c\x8e\x72" - "\xb2\xdd\x5c\x49\xb6\xc0\xca\x93\x12\xb7\x56\xdf\x1d\x1b\x21\x97" - "\x60\x65\x07\x7c\xc3\x36\x1e\x53\xdb\x02\x55\x27\x19\x4f\x6b\x46" - "\x0f\xd9\xbb\xd6\x1d\xc7\x98\xe1\x1b\xad\xb1\x75\xc7\xb7\xc6\x6b" - "\x8e\xef\x09\xd1\x75\x3d\xd0\x3f\x53\x9b\x65\xbe\x46\x48\x8e\xcd" - "\xfe\x78\x5b\xa0\xaa\x9d\x71\x46\xb9\xdf\x0d\x3a\xa3\xd4\x52\x17" - "\x45\x3f\x43\x39\x72\xad\x10\x63\xdb\x60\x03\x7c\x53\x8c\xdb\x8a" - "\xbd\x94\x07\x5f\xa3\x4d\x24\xf2\x45\x90\xef\x9b\xe3\x99\xd6\xb5" - "\x1c\x8f\xfc\xb0\x99\x61\xf6\x65\xd3\xf4\xeb\x0e\x86\x0b\x5c\xc3" - "\x7d\xfb\x37\x17\x2a\xdf\x86\xf2\xe1\xcb\xb4\x99\xae\x9f\x59\x29" - "\xd8\xed\xff\xe6\xae\x10\x4d\xca\xd7\x75\xed\xf0\x56\x59\xdf\x18" - "\x83\x7e\x13\xed\xff\x1b\xe1\x74\x3e\x84\xa6\x97\x1e\xc0\x0e\x03" - "\x6c\xe7\x60\xb0\x4c\xf7\x61\xf0\x2d\xd6\x37\x95\xbc\x5a\x95\x3b" - "\x44\xd3\x29\xf4\xe5\xee\xb1\x7a\xbe\x2f\xc3\x1f\xdb\x63\xb6\x09" - "\xe8\x17\x22\x6a\x2e\xfa\xfa\x97\x79\xed\x12\x78\x30\xfe\xfb\xe6" - "\x16\x8d\x87\xaf\x20\x8c\xfa\xff\x66\x8f\xbe\xee\xc5\x7d\xdf\x52" - "\x0f\xfa\x04\x67\x04\xba\xe1\xde\xaa\xa7\xc9\xf1\x05\xa7\x61\xfc" - "\x72\xd8\xd9\xce\x69\x7b\x13\x69\x9c\x8f\xe9\xf6\x46\x39\xbe\x49" - "\x8f\x57\x76\xcb\x7d\x22\x25\xdc\xa9\x87\xf1\x1b\xed\xff\x9b\x25" - "\xfa\x7a\x3d\x74\x8e\xe7\xeb\x2d\x27\xe9\xfa\x59\x3b\xa4\x3d\xbb" - "\xde\xa9\xa7\x33\x5d\xbe\x9f\x8a\x30\xcf\x3d\xc6\xb3\x9a\x4a\xa4" - "\x9d\x47\x9e\x37\xcf\xf6\x0c\xc1\xd8\xd2\x22\xfa\xca\x88\xe3\x18" - "\x0f\xf7\x6b\xd0\x77\xee\xdb\x3a\x81\x2b\xbb\x9e\xf5\x1a\xf5\xba" - "\x22\x4a\x63\x3c\xf7\xf0\x18\xe2\xfa\x22\xa9\xd3\x7e\xa9\x3f\x82" - "\xf1\xc1\x27\x90\xb8\x19\xdf\x26\xee\x33\xbb\x78\x0d\xec\x7a\xe6" - "\xbf\x29\xfd\x9c\xcd\xf5\xfb\x0c\xb2\x1c\x82\xf0\x91\x64\x5e\xaf" - "\x6f\x4b\x09\x77\xe8\x61\xc8\xab\x5a\xe9\xde\xf5\x27\x54\xda\x0d" - "\xb6\xc1\xca\x62\x7f\x01\x30\xee\xe4\xf2\x6e\x98\x90\x8c\xff\x86" - "\xfc\x94\x70\x91\x1e\xae\x95\xeb\x13\x37\x94\xe9\x65\xc8\x3a\x83" - "\x8e\xed\xac\x0a\x0f\xf9\x72\xfa\x73\xe3\x3b\x4a\x7f\x6e\xd8\x6d" - "\xa0\x61\x28\xc2\xfb\xfb\xeb\xf3\x86\x23\x3a\x7e\xfc\x3e\x66\x80" - "\x43\x1b\xb9\xa1\x3d\x55\x5f\x96\x7a\x59\xcf\x58\x67\x6e\x24\x93" - "\xb4\x1e\x2d\x6d\x8c\xb9\x9e\xdd\x38\xde\x10\x1f\x56\xbe\xc4\x8d" - "\x2f\xeb\x7d\x93\x5c\xdb\xf3\x15\x5a\xa4\x8f\xf3\x92\xd2\x0b\xe8" - "\x43\x44\xea\x85\xdc\xbb\x72\x63\x79\x2a\xde\xc0\xca\x68\x3f\x8e" - "\x7e\x9c\x93\xd5\x5a\xdc\x8d\x3b\xfb\x79\xbb\x11\xf6\xed\xfa\x9d" - "\xba\xde\x2a\x3f\xfa\x86\x86\x74\xfe\x06\xe0\x43\xc9\x32\xbb\x31" - "\xdc\x2f\xb3\x1b\xa3\xfd\x78\xc7\xd9\x0d\x70\xff\x81\xb0\xb3\x1f" - "\x6e\xdc\xd8\x0b\xe9\x87\xda\xef\x33\x6e\x6a\x72\x59\xe3\xe6\x18" - "\x70\x94\x19\xca\x2a\x37\xc0\xb5\x21\xbc\x36\x7d\xfd\x8c\x6b\x48" - "\x5f\x3f\xe3\xf6\x9b\xd7\xcf\xb8\x63\x86\x72\x43\x17\xd6\xed\x9b" - "\x6c\x06\x7a\xea\x11\x1e\x99\xac\xcb\x37\x8d\x4d\x09\x27\xea\x5f" - "\xa0\xfd\xee\x5c\x99\x37\x84\xe3\xe1\x2b\xe7\x28\x5d\xbf\xa9\xd0" - "\x98\xfe\x66\xaf\x4a\x67\x1a\x79\x0e\x44\xce\xfd\x29\xb8\xca\x54" - "\x38\x86\x31\xa4\xd7\xe9\xb4\xaf\x45\x38\xd5\xbf\x4f\xd8\x6d\xad" - "\x1f\x0a\xc6\xb9\x1f\xba\x69\xbf\x1a\x03\x37\x97\x08\xff\xa1\xa2" - "\x74\x7d\x0a\x70\xc3\xfe\xdd\xb4\x47\xcd\x01\x35\x97\x40\x8f\x7a" - "\x4f\xd1\xcd\x3f\xc6\xbb\x0f\xef\x65\xc9\x7d\xdb\xcd\x39\x18\x7b" - "\xcf\xa8\xf7\xa7\xf6\x79\x37\xbb\xe1\xbf\xf4\x3a\xa2\xd5\x45\x26" - "\x69\x93\x85\x3f\x63\xba\x49\x3c\xcf\x21\xf4\x86\xe8\xe6\x2d\x4c" - "\xa3\x21\xbe\x5c\xf8\x47\x14\x32\x7c\x88\xcb\x43\x1e\xf3\xf9\x81" - "\xe6\x92\xa5\x97\x91\x13\x74\x7e\x71\x8a\x6e\xb9\x7e\xa9\x53\x8e" - "\x83\x41\xf3\x2d\xab\x52\xca\x69\x4c\x43\xf3\x09\xd0\xfc\x45\x1a" - "\x9a\xa5\xdf\x2e\xac\xa0\x7b\x40\xff\x7e\xcb\x48\xd0\xfd\x85\x94" - "\x6b\x72\xfc\x38\xdf\xcb\xc4\xf4\xca\x3c\x33\x2a\xfb\xeb\x43\x4b" - "\x9f\xea\xd8\x4a\x05\x03\xcb\xba\xa5\x54\xf8\x87\xcd\x08\xd1\x2d" - "\x75\x7a\x7f\xa0\xc5\x57\x2a\x1a\x20\x0b\xab\x94\x45\x23\xe7\x4b" - "\x57\x8f\x7a\xdb\x63\x39\x74\xfb\x6f\x41\xff\x77\x73\x9d\xde\x67" - "\xa2\xbf\x0c\xb3\xac\xb4\xb4\x8e\x94\xb4\x9e\xfe\xb4\x5c\x5b\x52" - "\xda\xaa\x44\xfc\x18\x3d\xfe\x02\x75\x01\xf9\xe7\xbe\xc3\x79\x92" - "\x79\xcc\xcd\x37\xaf\x83\xdc\x12\xd4\x41\x9f\x79\x1d\xe4\x56\x9a" - "\xeb\x4d\x6e\xad\x78\x9e\xcc\x70\xed\x46\xbd\xf4\x71\xbd\x70\x3d" - "\x0c\x94\x7f\x6e\x93\x2e\xff\x0b\xf0\x10\x3b\x45\xb7\x2e\xeb\xd7" - "\xa7\x5b\xdf\x49\xc6\x73\xeb\x48\x73\x5e\x6e\x1d\x07\x5e\x62\xe6" - "\xbc\xdc\x9a\x6f\xce\xcb\xad\x68\x9b\x14\x1b\xa8\x4b\xb7\x7a\x11" - "\x6f\x06\xbf\x45\xf8\x4d\xf1\xef\x62\xdf\x21\x44\xb7\x9e\xe0\x39" - "\x21\x43\x7c\xa0\xbf\x2d\x81\x6e\xe4\xe1\xf9\xa2\x40\xd5\x6d\xc4" - "\xf4\x9c\x72\x91\x75\x30\x79\x80\xff\xcf\x4f\xd1\x6d\xab\xe3\x56" - "\xcb\x4e\x25\x8b\xdb\x6f\x4d\x2e\xf7\x36\x97\xb9\x2c\x6e\x9b\x00" - "\x59\x7c\x6e\x2e\x8b\xdb\x0a\xcd\x65\x71\xdb\x42\xf0\xfc\xf9\x40" - "\x59\xdc\xb6\x56\x97\x05\xc6\x93\x0e\xb1\xad\x58\xdc\xec\x21\x3b" - "\xf8\xcc\x71\xa0\x8e\x15\x5c\x27\xc3\xed\x76\xf4\xa8\xfa\x75\x2d" - "\x21\xfb\x67\x74\x5b\x9d\xdc\x47\xb2\x6d\xb6\x18\x11\xa6\x61\x0c" - "\x1f\xf4\x7e\x1e\x08\xa2\xa7\xe3\x31\x7d\x4a\x19\x1d\xe6\x6d\xf3" - "\x76\x96\xd3\xf3\x26\xf1\x4e\xb5\x1f\xe3\xf6\xa9\xc9\x6d\xf6\xf6" - "\xdc\x7e\x79\x43\x36\xc8\x63\xd8\x2f\x3b\xe8\x33\x78\x1d\x8c\xbf" - "\x5a\xc9\x7f\xfc\x90\x14\x3a\x1a\xcc\xe5\x7f\xfb\xbe\xf4\xf2\xbf" - "\xfd\x98\xb9\xfc\x6f\xe7\x39\x9a\xcf\x43\x34\xde\x95\x6c\x8f\xc7" - "\xdb\xfa\x79\xba\x9d\xf7\x9b\x38\x84\x7f\xe8\x57\x39\xfc\x65\x79" - "\xd3\x1f\xe0\xb7\xd4\xbf\x42\x90\xa9\xe5\xea\xff\x4a\xfe\x74\xcf" - "\x96\xd1\xe6\xeb\xa1\x18\x2b\x90\xeb\x4a\x1e\xe7\x8e\xff\x14\xba" - "\xd3\x86\xdf\xd6\x53\xf4\xad\x8d\x71\xbf\xb5\x52\x93\xed\x27\xa7" - "\xe8\x8e\xf9\x4a\xb6\xdf\x7a\x3a\x59\x1e\xe3\xa3\xe6\xb2\xbd\x63" - "\x24\x64\xfb\x89\xb9\x6c\xef\xc8\x4d\xdf\x6f\xdc\x31\x15\xfc\x7f" - "\x32\x50\xbf\xef\x28\x55\x79\x68\x0d\xe7\x51\xfb\x42\xef\xf8\x88" - "\x61\x94\x1e\xdf\x71\x80\xd3\x59\xe7\x0d\x79\xb6\x02\x57\x51\xbf" - "\xae\xdf\x51\xab\xe1\x30\xe2\xdd\xef\x08\x9b\xe9\xf4\x1d\x72\x5d" - "\xef\xe6\x88\x94\x4f\xd1\x0e\x2e\x73\x39\xd1\x67\xf4\xad\xeb\x19" - "\x8e\xe3\xaf\x75\x1a\x75\xfa\x5b\x36\x1d\x8e\x6d\x8c\x82\xbd\x23" - "\x2a\xb6\x95\x11\xc3\x25\xe3\xfe\x96\xc6\xff\xb0\x19\xf5\x1a\x3c" - "\xc3\xa5\xc0\x14\xaa\xb6\xf3\xad\xad\xc9\x6d\xe7\x5b\x0b\x93\xfb" - "\xbb\xf1\x3c\xde\x72\xc4\xfd\x16\xf8\xbc\xe3\xdb\x41\xc3\x97\xd6" - "\x97\x41\xda\x12\xea\xfb\xdb\x4f\xab\xfa\xfe\xf6\x43\x29\x74\x75" - "\x9a\xd7\xf7\xb7\x6d\xe9\xeb\xfb\xdb\x2e\xf3\xb6\xf4\xed\x09\x5c" - "\xd7\x21\xfa\xf6\xc2\xe4\xb6\xf4\xed\x82\xfe\xb6\xf4\xad\x4e\xd5" - "\x96\xe8\x92\x8b\x69\x0b\xf0\x15\xd2\xb6\x3d\xbd\x7d\x7d\x59\x99" - "\xa0\x3d\x30\x4d\xd2\xd7\xc1\x18\x7f\x02\xcb\xa8\xc5\x29\xf7\xbc" - "\xfb\x4e\xd1\x84\x0a\x9e\xc7\x55\xb2\xba\xf3\x8e\x64\xfe\x26\x38" - "\xcd\x65\x35\x21\x17\xb2\xf2\x99\xcb\x6a\xc2\x54\x73\x59\x4d\x28" - "\xe5\x3d\xbe\x03\xdb\xc5\x84\x4a\xb6\xfb\xa0\x91\xf7\x50\xb4\x7d" - "\x46\x13\x9a\xa5\xfd\xef\x2a\x16\xd0\x3b\x13\xfb\x3f\xa1\xdf\xfe" - "\x8f\xe6\x36\x31\x41\xfa\x53\xa2\x0b\xf6\x7f\x2b\x0d\xe3\xbe\xa0" - "\xbf\x0f\xc8\x35\xe9\x03\x26\x74\x9a\xf7\x01\x77\xda\xcc\xfb\x80" - "\x3b\xc7\x28\x3d\xbe\xb3\x20\x59\x8f\xef\x1c\xdf\x5f\xc7\x90\xd3" - "\xff\x4c\x1f\xb0\xf9\x14\xdd\x95\x89\x7e\xb8\x5a\xd5\xc7\x5d\xbf" - "\x4d\xa1\x65\x97\x79\x7d\xdc\x19\x40\x7d\x6c\x36\xaf\x8f\x3b\x4f" - "\x98\xd7\xc7\x9d\x3c\x7e\xda\x3c\xb0\x3e\xee\xca\xfe\x72\xfd\xf0" - "\x5d\xe3\x93\xfb\xe1\xbb\xc6\x7e\xf9\x7e\xf8\x2e\x8f\x79\x1d\xdc" - "\x55\x63\x5e\x07\x77\x35\xa8\x3a\xb8\xeb\x58\x72\x1d\xdc\xb5\xaf" - "\xbf\x0e\x20\x9b\xff\x7e\x1d\x94\xaa\xf5\xdd\xef\xdc\xd1\x25\xe7" - "\xcf\xbe\x33\x2e\x44\xdf\x89\xa8\xf5\x80\xef\x74\xa8\x39\x54\x59" - "\x4f\x6f\x02\xc6\x35\xd0\x16\x7f\x27\x5f\x8b\x7b\x64\x60\xbf\xf0" - "\x9d\x52\xd8\xc9\xce\xc6\x4a\xb9\xd6\xa3\xea\x09\xf2\xdd\x0c\x38" - "\x35\x17\xf0\x9d\xb5\x9c\x17\xf5\x28\xf8\xbb\x14\xb6\xad\x80\x8f" - "\x30\x9e\x46\x57\x2c\x45\x7e\xdf\xd9\x73\x31\xfd\x66\x3a\x5e\xd9" - "\x3f\x3c\x45\xf7\xcc\x67\x98\x38\xf3\xb5\x9c\xea\x4f\xd1\xc4\x8d" - "\x78\x43\xf7\xee\xb9\x2f\xb9\xcc\x89\x63\xcd\x75\x6f\xe2\x44\xd0" - "\x5c\x6f\xae\x7b\x13\x8b\xd2\xf7\x93\x13\xe5\x9e\x54\xe8\x58\x7d" - "\x5c\xf9\xf2\x97\xce\xab\x0c\xa5\xf8\xf2\x13\xb7\xea\x7d\x5b\x57" - "\x26\xea\x66\x39\xcb\xfd\xee\x9b\x34\xfa\xae\x4b\x81\x6d\x54\x65" - "\x59\x66\x98\x94\x15\x02\x8d\x6f\xa6\xa1\x31\x6a\xde\x3e\xee\x1e" - "\xa9\xd5\xe5\x9b\x22\x33\xb5\x8d\xdc\x0d\xff\xcf\x6c\x6c\x72\xb7" - "\x5e\xff\x45\x92\x86\xa4\xfa\xbd\xbb\x34\xb9\x7e\xa9\xa8\x1c\xe3" - "\x35\x13\xb8\x0d\x46\x38\xde\x8b\xc3\xb0\xac\x03\x26\xb0\xfb\x52" - "\x71\xa6\x81\x0b\x0d\xd0\x2d\xde\x9b\x61\xaa\x5b\xf7\x64\xab\xb6" - "\x76\xcf\xc2\xe4\xb6\x76\xcf\xd8\xfe\xb6\x36\xb1\x31\x25\x4f\x5e" - "\x72\x9f\x3e\x71\xac\xec\xd3\xa1\x53\xf8\xbd\x97\xeb\xed\x7f\xc0" - "\x36\x1e\x3a\x45\xf7\x6a\xfe\xf1\xbd\x29\xf3\x15\xf7\x04\xcc\x75" - "\xf3\x9e\x36\xf0\x7c\xc8\xbc\xde\xef\x89\x98\xd7\xfb\xbd\x6c\xff" - "\x0e\x69\xe3\xcb\x4b\x67\x54\xe6\x0d\x4b\x49\x1f\x67\x6e\xbb\xee" - "\x4d\x33\xff\x71\xef\x1c\x25\xcf\x7b\xb7\x24\xcb\xf3\x5e\xc3\xfc" - "\x07\xe8\xff\x9f\xe9\x3f\x82\xa7\x28\xef\x7e\x25\xa3\xfb\x6e\x4a" - "\xa1\xa3\xdd\x5c\x46\xf7\x46\x21\xa3\xa0\xb9\x8c\xf2\x9c\xe9\xdb" - "\x6f\x1e\xfa\x3f\x0a\x0e\xec\x3f\xf2\xa6\xfa\xb6\xcb\xf9\x11\xd9" - "\x0e\x67\x44\xe1\x7f\xfa\xf5\x74\xee\x37\xf2\x78\xfc\x27\x1c\x63" - "\xa8\x20\xb8\x35\xca\x7b\x90\x72\x18\xae\xb8\x32\x75\x9d\x24\x4f" - "\xf9\xba\x7e\x41\x0e\x6f\x02\xd6\xae\xc3\xa6\xe0\xe4\xfe\x4f\xe8" - "\x70\x6a\x5e\xa6\x3a\xc5\x96\xe4\xb5\x9b\xd7\x5b\x5e\x9a\xf6\x7f" - "\xdf\x48\x55\x6f\xf7\xa5\x8c\xfd\xee\x1b\x97\xac\xeb\x90\xeb\x45" - "\xd4\x1d\xaf\xa3\x98\xd6\xdf\x9a\xd9\x6d\x9e\x2a\xba\xf2\x34\xdd" - "\xf7\x37\x89\x1f\x61\xfe\x1e\xaa\x38\x4a\x56\xb1\xe6\x29\xe8\xb1" - "\x85\xea\xfd\xa2\x67\xb3\x55\xb4\x6e\xf6\x8b\xd6\x60\xf4\x2c\xfb" - "\x6c\x5f\x3d\x49\xf7\xfd\x56\xd1\x27\x7a\x94\x2c\xee\xdb\xc3\xb0" - "\xdd\xfe\xfb\x3a\xf4\xf9\xbe\x74\xe5\xf1\xfe\x6c\xc6\x3d\xf8\x1c" - "\xef\x77\x73\x21\x83\xb5\xfa\x5a\x2e\xc2\x79\xfd\xfb\x8b\xbe\x3b" - "\x15\x69\x5f\xea\xbb\x4e\xc0\x7a\x8d\x78\xd4\x37\x9d\xdf\xdd\xa0" - "\xef\x11\xc2\xef\xad\x17\xc0\xa5\xd3\x13\x48\xa1\xa7\x15\x7d\xff" - "\x5a\x0d\xc7\x89\xc1\x70\x70\x3d\x29\xfd\xe2\x7a\xfc\x6e\x64\xb0" - "\x79\xa2\x0c\x27\x15\xbc\x30\x40\xe7\x27\xb9\x59\xd6\x8c\x23\x5d" - "\x1b\x54\x7d\xea\xe4\xcb\x54\x1b\x9c\xf4\x45\x4a\xfe\x32\x35\x77" - "\xa8\xfa\xa8\x79\xd1\x54\x1d\x9d\x54\xe3\x88\x98\xe9\xe8\xa4\x06" - "\x5d\x47\xe1\xf3\x32\xde\xe3\x29\xe9\x01\xa5\xab\x93\x9d\xe8\x27" - "\x0d\xe3\x90\x49\x72\xfc\x20\x2e\x55\x6d\x31\x04\xb8\x94\x7c\x3d" - "\xc9\xba\x3c\xa9\x6c\xb0\x79\x58\x8d\xb7\xb7\x14\x6f\x53\x7e\x9c" - "\x8c\x6b\xf2\xe4\xc1\x79\x9b\x5c\x6a\xce\xdb\xe4\xca\x64\xde\xa6" - "\x3c\x93\x92\x2e\xfd\xfb\xae\x01\x7d\xf0\xe4\xbd\xba\x9f\xea\xba" - "\x86\xfd\xcf\x29\x43\xa4\xbf\x5a\x5f\x2c\xc6\xba\xcc\xfc\xd5\xc9" - "\xed\x09\x7f\x55\xc2\x4f\x56\xfb\x5e\xeb\xe1\xaf\x36\xa4\x8e\x1b" - "\xf2\xe8\x70\x34\xd5\x67\x9d\x32\xd6\x51\x67\x46\xff\x94\x89\x9a" - "\x8d\x7c\x7e\xa0\x8d\x9c\x52\xa4\xea\x65\xca\x9e\x64\x1b\x32\xc5" - "\x93\x5c\x2f\x93\xeb\x52\xf2\x6d\x49\xae\x97\xc9\x93\xff\xab\xfd" - "\x03\x0f\x12\x33\x32\x32\xac\x19\x16\xab\x25\x03\xc9\x60\x93\x86" - "\x65\xd8\x32\x86\xe0\x19\xaa\xbd\x87\x59\x33\xac\x36\x3c\x43\xb4" - "\xf7\xd0\x94\xf0\x30\xce\x8b\xc7\xa6\xbd\x87\xa4\x84\x87\x5e\x20" - "\x7d\x98\x56\xae\x5e\xbe\x2d\x25\x3c\xe4\x02\xe9\x43\xff\x9b\xf9" - "\x69\x40\x38\x79\x9f\xd4\xfd\x8b\x96\xcf\x5f\xf8\x44\xa9\x6b\xc5" - "\x92\x27\xca\x17\xb8\xe6\x7f\xff\xfb\x0b\x96\x2e\x75\x95\x2f\x76" - "\x7d\xf7\xbe\xe9\xb7\xdd\xe5\xca\xf5\x5e\xe7\x1d\xe7\x5a\x78\xf7" - "\x75\xa5\x59\xf4\xc0\x8a\x25\x9c\xf0\xc0\x8c\xfb\x8b\x5c\x05\xdf" - "\xbd\x2f\x39\x51\x47\xb3\x64\xc1\xfc\xd2\x41\xb1\x18\x6c\x5a\xde" - "\xba\x51\x44\x1b\x47\x49\xdb\xd6\xde\x8c\x51\x8e\x1a\xab\x3f\xb6" - "\xa0\x69\x27\x91\xe8\xf5\x89\xc0\x35\xbc\xe7\xe2\x7b\x6f\x33\x13" - "\x37\x35\x54\x93\xe7\x71\xfe\x8e\xe1\x7b\x1f\x88\x83\x61\x72\xfd" - "\x33\x59\x4f\xd2\xea\xcc\x46\x78\x9d\x1c\x0e\xb6\x47\xc9\xe5\x23" - "\x3b\xf2\x5f\x82\x34\x8b\xb8\x27\x8e\xb8\x88\xb6\xb7\xf2\x9f\xdf" - "\x93\x71\x07\xab\x75\x38\xc7\x29\xca\xaf\x10\x07\x85\x0c\x8b\x7b" - "\xb6\x68\x70\xf9\xf7\xc7\xfd\xdf\x93\x6b\xb2\x2f\x5f\x4a\xf6\x97" - "\x47\x89\x13\x75\xcf\x93\x6d\xc7\xf3\xbc\x0e\x96\x3f\x31\x64\xfd" - "\xd7\xdd\x6c\x5f\xd7\x21\x3e\x44\xab\xed\x5c\x36\xc3\xc6\xad\xdf" - "\xbb\x8d\xe1\x25\xec\xa5\x44\x9c\x0f\xf0\x0b\x93\xe1\xf3\xf3\xac" - "\x80\x9d\xf6\x29\x39\x7a\xb2\x1a\xf3\x83\x95\xd5\xe4\x88\x89\xbf" - "\xdf\x9c\x4f\x96\x16\x8c\x7e\x2a\xa2\x22\x1a\x58\x72\x9a\x69\x38" - "\xe0\xa8\x10\x7f\x0f\x46\x88\x1e\xe8\xf4\x89\x4d\x67\xc8\x86\x31" - "\xa8\x25\xb0\x84\xf7\x92\xe4\xef\xdc\xf1\x05\xd9\x20\x87\x31\xa7" - "\xe9\xfe\x63\x95\x0f\x88\x98\xef\x01\xb2\xbd\xef\xad\x26\xb1\xbe" - "\xf9\xa5\x4d\x1f\x92\xed\x97\xbd\xd5\xd6\x5e\xe1\xa4\xca\x72\x5e" - "\x9f\x10\xe4\x8b\x88\x1e\x5e\x6f\x6f\x2a\x89\x31\xcc\x0f\xba\x7d" - "\x4e\x6a\x29\x8f\xd0\xaa\x13\xa2\xa7\xe6\x43\xb2\xf3\x5c\x57\x73" - "\x67\x84\xbf\x2b\xb7\xaf\x7a\x80\x32\x4e\x15\x91\xb5\xb9\x6c\x2b" - "\x05\xe7\x44\xa8\xf2\x84\xe8\x68\x2a\xf9\x94\x5a\xca\xf6\x50\x71" - "\x1b\x59\x9b\xda\xff\x44\xf2\x5b\xe9\x4d\xb6\x82\xaa\x73\xe4\x5c" - "\xf5\x04\xc7\x9d\xa3\x95\xab\x68\xf8\xca\x8f\xc8\x11\xec\x68\x43" - "\x39\x67\xe8\xd1\x63\x64\x01\x3e\xeb\xb3\x7f\x22\xe7\xb3\xb3\x78" - "\xbf\x66\x1e\xd5\x55\x91\x53\xf8\xdc\xd9\xbd\x3e\x77\x4e\xaf\x70" - "\x5f\xda\xed\x73\x8f\x6c\xf1\x00\xbe\xfd\x00\x8d\x68\xa3\x91\x07" - "\x4f\xb7\x59\xb7\x9e\xa5\x31\xae\x07\x59\x07\xee\x6f\xad\x3b\x0b" - "\xf8\xf5\xc7\x5b\xe3\xc8\x6b\xcc\x13\xcd\x3c\xde\x11\x2c\xea\xa1" - "\x38\x70\x6d\xed\xa5\x31\x75\xbd\xe4\x8c\xaf\x3b\xde\xca\xb2\xe8" - "\x5b\xdf\x94\x0f\x3b\x38\xec\xcd\xc7\xf6\xd9\x82\x4d\x9d\xd4\x1c" - "\xe9\xa5\x16\xfa\x98\x82\xde\xbf\x06\x7e\xf9\xd8\xbe\x21\x71\x34" - "\x80\xc0\x4a\xde\xf7\xa2\xf4\xc6\xd7\xcc\xdf\xc8\x55\xd3\xe6\x2a" - "\xca\xf6\xac\xa4\x61\xa7\x11\xaf\xc6\xb9\x87\x0a\x82\xd1\xbf\x06" - "\x56\xca\xbd\x9a\xab\xed\x55\xcd\x94\xd1\x12\xd9\xca\xdf\x86\x5b" - "\x63\x23\x6c\x05\xc1\x48\x2b\x05\x3d\x9f\x04\xe2\xd9\xb6\x09\x1b" - "\xe2\x64\x7f\xe3\x7c\xab\x35\x68\x3b\x4f\xc1\xa2\x08\x1d\x42\xd9" - "\x62\x93\x6d\x0e\x6c\x56\x5e\x4b\xa4\x87\xbf\x79\xc9\x15\x5d\xce" - "\xac\xcd\x4b\x68\xdc\x8e\xb3\x34\x76\xfb\x59\x72\x8b\x6e\xb7\x95" - "\xf7\x5f\xce\x3d\x93\x43\xdb\xf1\xce\x6e\x87\xee\x9c\x55\xfb\x30" - "\xc5\x70\x6d\x1f\x66\x9f\x9b\xea\x7b\xfb\xf7\x61\xf6\x76\xf5\xef" - "\xc3\x64\x5d\xe2\xbd\x98\x68\x1b\x3d\xac\xd3\x1b\x16\x91\x6d\xcd" - "\x67\x44\xb7\x54\x5b\x79\xdf\xa8\x38\x89\xf4\xc3\xa5\x31\xf2\xfd" - "\x8d\x65\xff\xcf\x3d\xc9\x7b\x65\xf3\x31\x5e\x99\x06\x23\x30\x2d" - "\x07\xcf\x18\x3c\xe8\xd7\xa7\x8d\xc7\x03\x89\x4c\x83\xbf\x3e\x0d" - "\xf6\x79\x9a\x17\x4f\x0d\x9e\xad\x78\xd0\x32\xa7\xed\xc2\x03\x3b" - "\x3e\x0d\x63\xae\x69\xe8\x6f\xa7\x35\xe1\xc1\xb8\x6a\x1a\xb4\xb4" - "\x00\x76\xa4\x00\x78\x0a\x26\xe0\x29\xc4\x83\xfc\x05\xd5\x78\x90" - "\xb7\x00\x79\x0a\x90\xa7\xe0\x08\x9e\x56\x3c\xe8\x93\x0b\x90\xaf" - "\xa0\x93\xe8\x21\x90\xf3\x10\x2c\xf5\x43\x28\xff\x21\xf4\x23\x0f" - "\xa1\xbf\x78\x08\x54\x3e\x04\xfb\xff\x10\xca\x7c\x08\xf9\x1e\x42" - "\x9e\x87\x90\xe7\xa1\x0e\x3c\x61\x3c\xb0\xe9\xd3\x91\x6f\x3a\xc6" - "\x69\xd3\x5d\x78\x40\xf7\x74\xd0\x3d\x1d\x74\x4f\x07\xcd\xd3\xe1" - "\x37\x4f\x47\x99\xd3\x41\xe3\x74\xe4\x9b\x8e\x3c\xd3\x91\x67\x06" - "\x68\x9c\x01\x7e\x67\xc0\xa7\x9f\x81\x7c\x33\xe0\xc7\xce\x80\x1c" - "\x66\x80\xde\x19\x65\x78\x2a\xf1\x80\xde\x19\x7b\xf1\xa0\xcc\x19" - "\xa0\x71\x06\xf2\x15\x22\x4f\x21\xf2\x14\x82\xc6\xc2\x5c\x3c\xe0" - "\xb1\x10\xf9\x0a\x91\xaf\x10\x7c\x16\x62\xbc\x5a\x08\xd9\x14\x62" - "\xfc\x5d\x08\x1a\x67\x82\xae\x99\x80\x9b\x09\x9a\x66\x02\xef\x4c" - "\xc8\x70\x26\xf8\x99\x09\x98\x99\xa0\x6b\x26\x78\x9a\x09\xda\x66" - "\xa2\xff\x9d\x09\xda\x1e\x06\xfc\xc3\xc0\xfd\xf0\x64\x3c\x80\x7f" - "\x18\xf8\x1e\x06\xdc\xc3\x90\xd7\xc3\xc0\xf7\x08\xe8\x7e\x04\x34" - "\x3c\x02\x98\x47\x80\xf7\x11\x94\xff\x08\xca\x7f\x04\xe5\x3f\x82" - "\xf2\x1f\x01\xfc\x23\xc0\xfd\x08\xca\x7f\x04\xf0\x45\xc0\x57\x04" - "\xb8\x22\x94\x5f\x04\x7c\x45\x28\xbf\x08\xe5\x17\x01\xa6\x08\x78" - "\x8b\x50\x7e\x11\xca\x2f\x02\xfe\x22\xc8\xa7\x88\xf3\x80\xcf\x59" - "\x28\x67\x16\xe4\x32\x0b\xf8\x67\x15\xe0\x81\x3c\x67\x01\xff\x2c" - "\x58\xa6\x59\x28\x63\x16\x64\x33\x0b\x75\x32\x0b\x78\x66\x01\xcf" - "\x2c\xe0\x98\x85\xfc\xb3\xc0\xc3\xa3\xc8\xfb\x28\xf2\x3e\x0a\xba" - "\x1e\x2d\xc1\x83\xba\x7f\x14\xf5\xf0\x28\xe0\x1e\x85\x9e\xc0\x1a" - "\xd0\xa3\x28\xe7\x51\x86\x45\x59\xb3\x51\x7f\xb3\xc1\xd3\x6c\xf0" - "\x34\x1b\x79\x66\xa3\xde\x67\xa3\xac\xd9\xa0\x73\x36\xf2\xcc\x86" - "\xfc\x67\xb7\x13\xf1\xd0\x71\x0e\xf4\x6a\xce\x58\x3c\xa0\x6b\x0e" - "\x60\xe7\x80\xaf\x39\xa0\x6f\x0e\xca\x99\x83\xfa\x9e\x83\x3c\x73" - "\x40\xd3\x1c\xd0\x33\x07\x75\x36\x17\x79\xe6\x82\x96\xb9\xd0\x8b" - "\xb9\x80\x9b\x8b\x71\xfc\x5c\xe8\xd4\x5c\xc8\x61\x2e\x60\xe7\x82" - "\x8f\xb9\xe0\x63\x2e\xf2\xcc\x85\x2c\xe6\x42\x0e\x73\xc1\xc7\x5c" - "\xd0\x37\x0f\x79\xe7\xa1\xae\xe7\x41\x7e\xf3\xa0\x8f\xf3\x90\x7f" - "\x5e\x29\x1e\xe0\x98\x87\xb2\xe6\x81\xaf\x79\xc0\x33\x0f\x78\xe6" - "\x01\xc7\x3c\xe4\x9f\x07\x5a\xe7\x21\x6f\x31\xf2\x16\xa3\xdc\x62" - "\xd0\x58\x0c\xda\x8a\x51\x66\x31\xe0\x8a\x77\xe3\x81\x4e\x15\xa3" - "\x9c\x62\xc0\xc2\x8a\x52\x31\xe8\x2c\x86\x2c\x4a\x20\xb7\x12\xe4" - "\x29\x01\x6f\x25\x28\xab\x04\x32\x28\x41\x9e\x12\xc8\xa0\x04\xf5" - "\x59\x02\xb8\x92\x28\xd1\x7c\xb4\xd5\xf9\xa0\x6b\x3e\x60\xe7\x43" - "\x66\x0f\x72\x1c\x68\x9c\x8f\xb2\xe6\x23\xdf\x7c\x94\x37\x1f\x79" - "\xe7\x83\xb6\xf9\xa0\x6b\x3e\xe8\x9a\x8f\xfc\xf3\x51\xd6\x7c\xb4" - "\xb3\xf9\x68\xa3\x8f\x81\xbe\xc7\x50\xde\x83\x3d\x2f\xbc\x42\xc4" - "\xf6\xa3\x6e\x34\xd9\xf8\x7c\x10\x69\x4b\xb6\x95\xf1\x59\x21\x61" - "\xed\xb7\xa5\xff\xb7\x9b\xe3\x7b\xb4\x78\x2b\xc3\xf3\xf9\x22\x0c" - "\x2f\xe3\x2e\x97\x71\x61\x2d\xce\x32\x30\xce\x9d\x80\xe3\x77\xd7" - "\xb6\xb2\x0c\xc6\xa1\xe7\xd7\xc2\x61\x3d\x2f\x87\x43\xb0\x49\xea" - "\xcd\x61\x37\xf2\x4d\xb3\x69\xef\x1c\xf5\xce\xcf\x63\x1e\x7c\xa1" - "\x04\xed\x36\x94\xd5\xc1\x61\xfe\xad\x95\xc7\xe7\xa0\x84\x53\xe2" - "\x2c\x03\xe3\xdc\xf2\xbc\x94\x14\x38\xc5\x67\x89\xe8\xa8\x02\xef" - "\x08\xdb\xe2\xdb\x14\xfd\xba\x9c\xd2\xa4\x59\xd2\xa7\xb9\xc9\x58" - "\x86\xe4\xdb\x40\x33\xd3\x6b\x88\x0f\x1b\xe2\x8d\x72\x89\xc8\xf4" - "\x24\x3c\x52\x2e\x4d\xda\x3b\xa4\xbd\x03\x9a\x7c\xf4\xfa\x1c\xa2" - "\x95\xc5\x72\x1e\x92\x22\x1f\x63\x9c\x65\x60\x5c\x42\x3e\x46\x38" - "\x5d\x3e\x61\x8d\xcf\x21\x26\xf2\x31\x4b\xb3\xa4\x4f\x93\xf2\x49" - "\x94\x61\x90\x8f\x8c\x33\x91\x8f\x1e\x6f\x90\xcf\x43\x23\x35\xf9" - "\x18\xf0\xb0\x3c\x0a\x3a\xd5\xfb\x21\xd2\xc2\xa1\x64\xf9\xb8\x6d" - "\xfd\x65\xb9\x53\xf5\xc7\x18\x67\x19\x18\x67\x94\x8f\x3b\x55\x7f" - "\x34\x3e\xdd\x66\xfa\x63\x96\x66\x49\x9f\xa6\xcb\xc7\x9d\xaa\x3f" - "\x32\xce\x5c\x3e\xee\x14\xfd\x99\x3e\xbe\x5f\x3e\x6e\x83\xfe\x4c" - "\xcf\xd6\xde\x2e\xed\x4d\x9a\x7c\xf4\x76\x3f\x54\x2b\x8b\xdb\xf8" - "\xd0\x14\xf9\x18\xe3\x2c\x03\xe3\x12\xf2\x31\xc2\xe9\xf2\xe9\xd1" - "\xf4\x60\xa8\x89\x7c\xcc\xd2\x2c\xe9\xd3\xa4\x7c\x12\x65\x18\xe4" - "\x23\xe3\x4c\xe4\xa3\xc7\x1b\xe4\x33\xa3\x50\x93\x8f\x01\x0f\xcb" - "\x63\xc6\x38\xed\xad\x87\x5d\xba\xfd\x61\x5a\x0c\x76\x63\x68\xc2" - "\x6e\x84\x54\xfb\xd7\xed\x5c\x7c\x9b\x4c\x0b\xa7\xa4\x59\xd2\xa7" - "\xb9\x8d\xf9\x7a\x52\xf2\x59\xf5\xb4\x2a\xcd\x86\xb0\x8c\xab\x14" - "\xdd\x5c\xe7\xd6\xf8\xe5\xfd\xe5\x56\x69\xf6\xc4\x04\xc6\x72\x61" - "\x18\x03\x1d\x06\x7e\x75\xfb\x9c\x8e\xe7\xb8\xb1\x1e\x4c\xf8\x36" - "\xa6\x87\xe0\x43\xe9\x76\xad\x1f\xbf\xb2\xf3\x8c\x1f\xe9\x85\x2a" - "\x5c\xe8\xd1\xde\xba\xfd\x0f\x6b\xf0\x43\x52\x68\x09\x6b\x65\x0d" - "\x31\x91\xbf\x31\x2d\x55\xfe\x86\xb4\x01\xf2\x37\xe6\x4b\x95\x7f" - "\xd8\x20\xb7\x21\x69\xe4\x6f\x06\x93\x2a\x7f\x13\x98\x24\xf9\x27" - "\xf8\x35\x91\x7f\x12\xcf\x26\xf2\x4f\xe2\x3b\x59\xfe\x0f\x67\xeb" - "\x76\xa1\x1f\xbf\x51\xfe\x33\x8f\xa9\xf0\xcc\xb0\xf6\x0e\x24\xcb" - "\xdf\x9d\xaa\xff\x5a\x59\x6e\x33\xfd\x37\xa6\xa5\x91\xbf\xdb\x4c" - "\xff\x8d\xf9\x06\x91\xbf\x3b\x9d\xfe\x9b\xc1\x0c\x22\x7f\xb7\x99" - "\xfe\x27\xf8\x4d\x2f\x7f\x77\x3a\xfd\x4f\xe2\x3b\x59\xfe\x8f\x6c" - "\x48\x96\xbf\x3b\x45\xff\x1f\xd1\xf4\xff\x11\x4d\xff\x1f\xc9\xd3" - "\x7d\xb8\xe8\xe5\x65\xc3\xb8\x7c\x7e\x1b\xed\xa7\x21\x6c\x49\x0e" - "\x2b\x7f\xce\x90\x6e\x95\x76\x52\x8b\xd3\x65\x9b\xb0\xef\x03\xe3" - "\x2d\xe6\xf1\x6e\xd2\x71\xea\x3e\x9e\x96\x9e\xe4\xe7\x69\x71\x06" - "\x9b\x5b\xd4\xc1\xef\xfe\xbc\xcc\x5f\xd1\x11\xed\xdd\xa6\xbd\x75" - "\x7d\x4b\xf8\x3d\x92\x6f\x13\xff\x49\x8b\x1f\xe0\x3f\x0d\x8c\x77" - "\x1b\xe1\x7b\x0c\xf0\x56\xa3\x5c\x53\x7d\x39\x9d\x1f\x2d\x7d\x80" - "\xaf\xa7\xf3\x96\x3e\xdd\x50\xae\x56\xa6\xae\x4b\x66\x3c\xa5\xa4" - "\x25\xf1\x65\x4c\x0b\x61\x1c\x66\xf4\x0d\x75\xfd\xd1\xd2\x02\x2a" - "\x3c\x4b\x93\xe7\xac\x3d\x7a\xfb\xd5\x6d\xa7\xa1\xec\x24\x7f\xcb" - "\x50\x6e\x92\xbf\x35\x30\x7e\x80\x3c\x75\xf8\x54\x79\x26\xf9\x7e" - "\x26\xf2\x4c\x4d\x4f\x95\x67\x4a\x7a\x92\x3c\xc3\x46\xdb\x68\xc6" - "\x93\x89\x3c\x13\x7c\x25\xcb\x73\x76\x9e\xd1\x97\x4c\x96\xe7\x6c" - "\x6d\x1c\x32\xdb\xad\xbd\xa9\x5f\x9e\xee\x54\xfd\x4c\xf2\xcf\x92" - "\xcb\x75\x9b\xe9\xa7\x16\x6f\x26\x4f\xb7\x99\x7e\x26\xf9\x8a\xe9" - "\xe5\xe9\x4e\xa7\x9f\x29\xe9\xa9\xf2\x74\x9b\xe9\x67\x82\x27\x73" - "\x79\xba\x4d\xf4\x73\xce\x16\xa3\xef\x99\x2c\xcf\x39\x25\x2a\x3c" - "\xc7\xab\xbd\x0b\xfa\xed\x9b\x7b\xa8\xb2\x25\xee\xa1\xc9\xf6\x2d" - "\x11\xb6\x24\x87\x75\xfb\x96\x48\x37\xd8\x37\xf7\x50\x73\xfb\x96" - "\x14\x6f\x31\x8f\x67\xfb\xe6\x36\xda\xf4\x0e\x2d\x3d\xc5\xbe\xc9" - "\x38\x83\x7d\x9b\x7b\x44\xd9\x37\xb7\xc1\x9f\x9c\xbb\x4b\x7b\xef" - "\xd3\xde\x0d\x03\xed\x9b\x7b\xa8\xb9\x7d\x93\xf1\x26\xf6\x2d\x35" - "\xde\x6d\x84\x37\xb1\x6f\xee\xa1\x83\xdb\x37\xf7\xd0\xc1\xed\x5b" - "\xba\x74\x43\xb9\x03\xec\xdb\x40\x9e\x52\xd2\xd2\xd8\x37\x96\xdd" - "\xbc\x56\x73\xfb\x26\xd3\x1a\x54\x78\x9e\x26\xcf\x79\x5b\x06\xda" - "\xb7\x44\xd9\x29\xf6\x2d\x51\x6e\x8a\x7d\x4b\x8d\x1f\x20\xcf\x14" - "\xfb\xe6\x1e\x3a\xb8\x7d\x73\x0f\x1d\xdc\xbe\xa5\x4b\x4f\x92\x67" - "\x8a\x7d\x1b\xc8\x93\x89\x3c\x4d\xec\x1b\xcb\xac\xc4\x65\x6e\xdf" - "\x38\xad\x58\xf3\xf3\x4a\xec\xea\x5d\xac\xc6\xcb\xe0\x8f\xe7\x8c" - "\x8c\xed\xd0\x10\xb6\x24\x87\x55\x3b\x34\xa4\x27\xda\x21\xc7\x99" - "\xb5\xc3\x94\x78\x8b\x79\xbc\x9b\x74\x9c\x7a\x3b\xd4\xd2\x93\xda" - "\xa1\x16\x67\x68\x87\xf3\x0b\xf8\xdd\x9f\x97\xf9\x9a\x9f\xab\xbd" - "\x65\xf8\x24\x7d\xaf\x9d\xd7\x8c\xba\xac\x0e\x71\xb8\x74\xbc\x5c" - "\xc3\xd9\x3e\x4a\x1c\xd9\xfe\x92\x68\xec\xf6\x3f\x36\x21\x44\x1b" - "\xe5\x19\xd1\x1b\x11\xde\x88\xf8\xc3\x2e\x22\x9e\x73\x6f\x2c\xe3" - "\xb5\xa1\xc7\x8a\x42\x94\xd5\x94\xba\x36\x24\xfc\x53\x3a\x78\x5d" - "\xf6\x57\x55\xad\x43\x84\xf5\x9f\x3a\x5a\x3a\x3a\x69\xf7\xca\x8e" - "\x21\xbe\x3f\x90\x35\x18\x3d\x49\xb7\x8c\x24\x27\xef\x0f\xa8\x7f" - "\x49\x84\xf0\xee\xc0\xd3\xe9\x59\xc9\x67\x60\x3d\xf6\xfa\x8d\xb5" - "\x34\xf2\x8f\x7c\xf6\x89\x5c\xf3\x7a\xec\x9d\xfe\x35\xaf\xea\x8f" - "\x9a\xdb\x03\x86\xf5\xae\xea\xd5\xae\x01\xeb\x5d\x8f\x5f\x27\xe3" - "\x0e\x8a\xa8\x5a\xdf\x8a\x85\xb4\xf8\xcc\x94\xf8\x0e\x15\xbf\xe0" - "\x4c\x4a\x7c\x8f\x16\xff\x51\x4a\x7c\x58\x8b\x1f\xee\xd2\xd6\xd3" - "\x5a\x98\x8e\x15\xbc\x9e\x56\xfa\x77\x5e\x4f\x6b\x29\xd5\xd6\xd3" - "\xe4\xd9\x02\xa5\x1f\x89\x9f\x55\x13\x9f\x99\x84\xdf\x3f\x66\xfa" - "\xc5\x41\xd2\x69\xcf\x44\xdc\x43\x1c\xb7\xe5\xcf\x64\xc3\x23\xd7" - "\xd2\x84\xff\x7b\xd3\x78\x1d\x8d\xd7\xd3\xea\x9f\x27\xda\xf6\x92" - "\x38\x56\x37\x4a\xb4\xd6\xbd\x24\x9a\xba\xfd\xdf\x0f\xe8\x6b\x6a" - "\x1b\x10\xb7\x01\x71\x3f\x42\x3a\xaf\xab\xb1\x4c\xde\x9f\x13\x20" - "\x3e\x5b\x4b\xd4\x34\xd7\x3a\x2c\xe4\xd9\x74\x96\x6c\x7c\x96\xd9" - "\x5a\xc8\x37\x58\x1e\x91\xdf\x33\x6f\x7e\x49\xb4\xc7\xad\xb9\xd4" - "\x52\xde\xce\xeb\x39\xa3\xd6\xc4\xf9\x1b\xb5\x4f\xa9\x2a\x22\x4e" - "\xf3\x77\xcf\x4c\x43\x71\xc5\x3f\xf3\xf9\x89\x96\xc6\x02\x22\x3e" - "\x8b\xa2\xfe\x52\xa2\x1d\x97\x82\x46\xd0\x74\x78\x21\xd7\x77\x69" - "\x7e\x88\x02\xe5\x6a\x6f\xe4\x6a\x3b\x9f\x95\x7c\x92\xbe\xbf\x41" - "\xf8\x45\x0f\xf3\xe6\x88\x55\x13\x9f\xd5\x22\xac\x72\xcf\x4e\xd9" - "\x36\xfc\xde\xa2\x9f\xd7\xe2\x27\x1b\xc3\x04\x4f\xf4\x10\xd3\x1c" - "\xa2\xef\xb7\xbd\x5f\x19\xe0\xfc\x95\x2c\x1b\xe1\xf7\xe9\x38\x2c" - "\xf2\xbc\x17\x3f\xd9\xf9\xbc\x97\x2f\x83\x43\x64\x35\xe5\xbf\x5f" - "\x12\x26\x5e\x63\x0c\xb6\xf6\xd0\xfb\x95\x27\x65\x1a\xc3\x88\xac" - "\xc6\xa4\x34\x3d\x5f\xd6\x2a\xf1\x77\x94\x9d\xcf\x75\xc9\xe7\xb1" - "\xc5\xd4\xd9\x48\xd9\x7c\x76\x47\xa0\xea\x63\xae\xeb\x3f\xd4\xa3" - "\x6e\xb4\x33\xe5\xa0\x8b\x0b\x8e\xf0\xb9\x3b\x7c\x8e\x9c\x3c\x43" - "\xce\x3a\x9e\xc4\x0a\x77\x76\xe2\x1c\xb9\xff\x0f\xce\x90\x43\xdd" - "\x38\x77\x58\xd5\x19\x72\x09\xfe\xe7\x48\x19\xe6\xb2\xae\x72\xdc" - "\x8b\xf3\xc8\x18\xef\xe4\xf8\xcd\x7e\x71\x44\xd7\x13\x4e\x63\xbe" - "\x90\x46\x5a\x5a\xeb\xc0\xb4\xc7\x3a\x38\x8d\xd7\xd5\x82\xa5\x31" - "\xfa\xe5\xe3\x31\xeb\xfa\x5e\xb2\xf1\x1a\x9b\x86\x57\xca\x56\xad" - "\xb3\x3d\x5e\x92\xbc\xce\xf6\xa4\x07\x8f\x17\x4f\x0d\x9e\xad\x78" - "\x76\xe1\xd9\x87\xa7\x15\x4f\x07\xd1\x53\x00\x7b\x2a\x1b\x0f\x2c" - "\xc9\x53\xe3\xf1\x4c\xc4\x03\xab\xf1\x14\xb4\xee\xa9\x22\x3c\xa5" - "\x78\x80\xed\xa9\x0d\x78\x76\xe2\xd9\x8f\xe7\x18\x9e\x08\xd1\xc2" - "\x91\x78\x90\x67\x21\xe0\x17\x02\x6e\x21\x64\xba\x10\xe5\x2c\xac" - "\xc3\x03\xd8\x85\xbb\xf1\xec\xc5\xd3\x88\xe7\x04\x1e\xe4\x79\x1a" - "\x65\x3d\x3d\x16\xcf\x64\x3c\xc8\xf3\xf4\x5a\x3c\xa0\xeb\x69\xc0" - "\x3d\x0d\x9a\x9e\x6e\xc3\xd3\x89\x87\x61\xa3\x44\x8b\x6c\x78\x50" - "\xce\xa2\x71\x78\x90\x67\xd1\x1c\x3c\xa0\x67\x51\x2d\x1e\xe4\x59" - "\x04\x5a\x16\x81\x8f\xc5\x80\x5b\x0c\x1e\x16\xbb\xf1\x80\x87\xc5" - "\x80\x5d\x3c\x15\x4f\x21\x1e\x94\xb3\xb8\x12\x0f\xf2\x2c\x06\x4d" - "\x8b\x41\xcf\xe2\x76\x58\x35\xe4\xf1\x80\x16\xcf\x04\x3c\x80\xf3" - "\x40\x56\x1e\xc8\xca\x03\x5e\x3d\x80\xf5\x80\x0f\x0f\xf8\xf0\x80" - "\x67\x0f\xe8\xf7\x80\x9e\x67\xc6\xe0\x01\xfe\x67\x80\xf3\x19\xc0" - "\x3d\x03\x1a\x9e\x01\xdd\xcf\x80\xde\x25\x4e\x3c\xa0\x61\x09\xd2" - "\x97\xa0\xfc\x25\x28\x7f\x09\xf0\x2e\x41\x6b\x5d\x02\xd8\x25\x28" - "\x7b\x49\x13\x1e\xf0\xb7\x14\x3c\x2d\x05\xdc\x52\xe0\x59\x0a\xb9" - "\x2d\x45\x39\x4b\x8f\xe0\x01\xae\xa5\x9c\x0e\x7c\x4b\x51\x5e\x39" - "\x68\x2c\x47\x99\xe5\x80\x2d\x07\xef\xe5\xe0\xa3\x1c\x74\x95\x83" - "\x87\x72\xc0\x2d\x03\x9e\x65\xb9\x78\x50\xce\x32\xd0\xbe\x0c\xb8" - "\x96\x21\x7d\x19\xf0\x2d\x43\x79\xcb\x40\xdf\xb2\x00\x1e\xc8\x69" - "\x19\xe4\xb4\x0c\x38\x97\xe7\xe0\x81\x3c\x97\xa3\xde\x96\xa3\xfc" - "\xe5\x90\xe7\x72\xd0\xb7\x1c\x79\x96\x23\xcf\x72\xf0\xbb\x1c\xf8" - "\x97\x83\xd6\xe5\xc8\xb7\x1c\xf9\x56\x80\x8e\x15\xe0\x6d\x05\xe8" - "\x58\x01\xbd\x58\x01\x3a\x56\x34\xe0\x01\xdc\x0a\xc8\x66\x05\xf0" - "\x7a\x41\xa7\x17\xf2\xf4\x02\xc6\x0b\xfe\xbd\xe0\xdf\x0b\xba\xbc" - "\xe8\x9d\xbc\xa8\x67\x2f\xe0\xbd\xc0\xed\x45\x1d\x7b\x01\x5f\x01" - "\x7c\x15\x80\xab\x00\x5f\x15\xc0\x57\x01\xba\x2b\x40\x43\x05\x60" - "\x2a\x80\xb7\x02\xe5\x57\xa0\xfc\x0a\x94\xbf\x12\xe5\xaf\x04\xfc" - "\x4a\xe0\x5e\x89\xf2\x57\x02\x7e\x25\xf0\xad\x04\xdc\x4a\x94\xbf" - "\x12\xf8\x9e\x45\xf9\xcf\xa2\xfc\x67\x01\xf3\x2c\xf0\x3e\x8b\xf2" - "\x9f\x45\xf9\xcf\x96\xe0\x01\x8f\xcf\x42\x37\x9f\x45\x19\xcf\xee" - "\xc1\x03\xdc\xcf\x02\x6f\x25\xf0\x56\x42\x86\x95\x90\x47\x25\xf2" - "\x54\x22\x4f\x25\xe8\xa9\x84\x5c\x2a\x51\x6f\x95\xc8\x57\x89\x7c" - "\x95\xa0\x0b\xc6\x8d\x2a\x51\x56\x25\x7a\xc4\x55\x28\x6b\x55\x1e" - "\x1e\xc0\xad\x02\x2d\xab\x80\x77\x15\xe8\x5e\x05\x7a\x56\x01\x66" - "\x15\xf4\x6b\x15\xea\x67\x15\xea\xb1\xca\x8e\x07\x74\x55\x01\xbe" - "\x0a\xb8\xab\x50\x4f\x55\x80\xaf\x02\xbe\xaa\x76\x3e\xb9\x11\xd6" - "\x0e\xf8\x7c\xa0\xdb\x07\x1a\x7c\x80\xf1\x01\xaf\x0f\xe5\x3f\xc9" - "\x6f\xd0\xe0\xab\x61\xef\x07\x0f\x68\xf7\x35\xb2\x67\x89\x07\xf9" - "\xaa\xa1\x73\xd5\xd0\xf9\x6a\xe0\xae\x86\x5c\xaa\xc1\x6b\x35\xf4" - "\xb8\x9a\xdb\x7c\xc9\x36\xd8\x9f\x57\xfe\xcc\xfe\x86\xb2\x11\xfa" - "\xdb\xd7\x06\x1f\xf6\x93\x32\x63\x38\x8c\xb0\x25\x39\xec\x36\xa6" - "\xf7\x20\xdd\x6a\xcc\xef\x2b\x92\x71\x24\x8a\x93\xe2\xc3\x5a\xbc" - "\xc5\x3c\xde\x9d\x04\xdf\x57\xcc\x7e\x51\x32\x4d\x3a\x9d\x9c\xa6" - "\xd3\x65\x8c\x0b\xc1\x8e\xf1\xbb\xaf\xd8\x6d\xed\xe7\xeb\x49\xaf" - "\x0a\x3f\x59\xc3\xef\x6d\x9a\xdd\x95\x78\x8f\x49\xbc\x09\x19\x80" - "\x8e\x0e\x3d\x0e\xb4\x90\x21\x3e\x6c\x88\xb7\x98\xc7\xbb\x8d\xf0" - "\x3d\x06\xf8\x64\xd9\x14\x62\x4c\xc2\x32\x2b\xc6\x98\x04\x72\x4b" - "\x95\xb5\x49\xba\x65\xf0\x74\xf7\x00\x7e\x92\x64\x97\xc2\x53\x92" - "\x0c\x53\xf8\x4a\x96\xe5\x53\x3b\x25\x4c\x02\xa7\x51\xa6\x4f\x95" - "\xab\xf0\x53\x1b\xb4\x77\x29\xcb\x15\xb0\x5c\x27\x43\x52\xca\x96" - "\x71\x26\xf2\xd4\xe3\x53\xe5\xa9\xc5\x0f\x90\xa7\x0e\x9f\x2a\xcf" - "\xb0\x26\x8f\x21\x69\xe4\x99\x9a\x9e\x2a\xcf\x94\xf4\x24\x79\xca" - "\x32\x4d\xe4\x99\xe0\xc9\x44\x9e\x09\xbe\x92\xe5\xb9\x30\xa2\xc9" - "\x53\xc3\x69\x94\xe7\xc2\x46\x15\x5e\x78\x42\x7b\xef\xed\x97\xa7" - "\x3b\x55\x3f\x65\x9c\xb9\x3c\xdd\x66\xfa\xa9\xc5\x9b\xc9\xd3\x6d" - "\xa6\x9f\x9a\x3c\xdc\xe9\xf4\x33\x35\x3d\x8d\x3c\xdd\x66\xfa\x29" - "\xcb\x34\x97\xa7\x3b\x9d\x7e\x26\xf8\x4a\x96\xe7\xa2\xc9\xfd\xf2" - "\x74\xa7\xe8\xe7\xa2\x91\x2a\xbc\x68\x9c\xf6\xb6\x69\xf2\x64\xfb" - "\x33\x34\xa5\x6c\x19\x67\x22\x4f\x3d\x3e\x55\x9e\x5a\xfc\x00\x79" - "\xea\xf0\xa9\xf2\xec\xd1\xf4\x6b\x68\x1a\x79\xa6\xa6\xa7\xca\x33" - "\x25\x3d\x49\x9e\xb2\x4c\x13\x79\x26\x78\x32\x91\x67\x82\xaf\x64" - "\x79\x2e\xae\xd5\xe4\xa9\xe1\x34\xca\x73\x71\xa9\x0a\x2f\xae\xd4" - "\xde\x85\x9a\x3c\x25\x7f\x9a\xfd\x18\x9a\xc2\x77\x47\xd5\x31\x65" - "\xa7\x98\xe7\xf8\x27\x49\xe9\xe1\x94\x74\xcb\xe0\xe9\xee\xd4\xfc" - "\x3d\x29\xf9\xad\xc6\xf4\x2a\xcd\xe6\x71\xbd\x54\x1d\x4b\xd0\x67" - "\x8d\x17\x27\xd3\x51\xa5\xd9\x3f\x13\x38\xcb\x97\x83\x4b\xa1\xcb" - "\x20\x0f\x96\xe5\x97\x91\x49\x6a\x9f\x66\x26\x97\xe4\x7a\xf2\x44" - "\x75\xbb\xdc\x5f\x96\xdb\x6a\x2c\x0b\x30\xfb\x55\x3d\x79\x34\x7b" - "\xe2\xd9\xa9\xdb\x13\x2d\xcf\x10\x13\xda\xc2\x5a\xb9\x43\xd2\xd4" - "\x97\x31\xdd\xac\xbe\x0c\xe9\xa6\xf5\x65\xcc\x6f\x56\x5f\x61\x83" - "\x7c\x87\x0c\x52\x5f\x66\x70\x66\xf5\x65\x02\x37\xa0\xbe\x12\xf2" - "\x48\x53\x5f\x03\x64\x62\x52\x5f\x03\xe4\x92\x5c\x5f\x4b\x76\xeb" - "\x76\xaa\xbf\xac\xd4\xfa\x5a\xb2\x50\xd5\xd3\x12\xad\x3f\x5d\x52" - "\x98\x5c\x5f\x6e\xb3\xf6\xa5\x95\xeb\x4e\xd7\xbe\x8c\xe9\x83\xd4" - "\x97\x3b\x5d\xfb\x32\xe6\xbf\x40\x7d\xb9\x07\x6b\x5f\x66\x70\x17" - "\xa8\x2f\x77\xba\xf6\x95\x90\xc7\xe0\xf5\xe5\x1e\xac\x7d\x0d\x90" - "\x4b\x72\x7d\x95\xcf\x49\xae\x2f\xb7\x49\xfb\x2a\x1f\xa3\xea\xa9" - "\x7c\xa2\xf6\x96\xfd\x4b\xef\x27\xbc\x5e\xd0\x4f\x0f\x87\x53\xed" - "\xbd\x16\x67\x19\x18\x97\xec\x53\x6b\x70\xfd\x7d\x09\xcb\xdc\x10" - "\x3f\xa0\xbf\x4a\x4e\xb3\xa4\x4f\xeb\x2f\x87\xe3\x52\xfd\x6c\x9d" - "\xe6\x54\xb9\xe9\x74\x27\xcb\x6a\x59\x07\xbf\x15\x1e\x63\x7f\xb1" - "\x2c\xa0\xc2\xcb\x8e\x69\x6f\xdd\x9f\x91\xbe\xa4\x8e\x83\xf3\xa5" - "\xf3\x4f\xb5\x34\x53\xff\x74\x60\x9a\x3b\x35\x5f\x92\xff\x9d\x94" - "\x96\xc6\x07\x4f\x81\x31\xf5\xc3\x2f\x0c\x93\x42\x87\xc1\x1f\xbf" - "\x10\xcf\x7a\x3d\xa4\xe3\xdb\x98\x1e\xc2\x78\x3b\xd5\x37\x37\xe2" - "\x0f\x61\x5c\xae\xe4\xbe\x42\xf3\x8b\x96\x1f\x33\xfa\xe7\x26\xb4" - "\x0c\xf0\x67\x0d\x74\x0c\xf0\x67\x07\xa6\x99\xca\x3f\xe1\xaf\x9b" - "\xc8\x7f\x80\xcf\x6e\x22\xdb\x01\x7e\xfb\x85\x61\x06\xc8\x3f\xe1" - "\xbf\x5f\x88\x67\x13\xf9\x27\xf1\x9d\x2c\x7f\x6f\x43\xaa\x2f\x9f" - "\x2c\x7f\x6f\x99\x92\xbb\x77\xad\xf6\x2e\x34\xfa\xf3\xe6\xb4\xb8" - "\xd3\xe9\xff\x00\xff\x77\x60\x5a\x3a\xf9\xbb\xd3\xe9\xff\x00\x1f" - "\x3f\xbd\x6c\xdd\x83\xe9\xff\x00\x5f\x7f\xa0\xfc\xdd\xe9\xf4\x3f" - "\x89\x67\x73\xf9\xbb\xd3\xe8\xff\x4a\x57\x5f\x8a\xef\x9f\x2c\xff" - "\x0a\x4d\xff\x57\x6a\xfa\x5f\x71\x4c\xd9\x67\x77\x52\x7f\xc1\xe1" - "\x81\xf6\x59\xc6\x59\x06\xc6\xa5\xda\x67\x09\x67\x62\x9f\x55\xbc" - "\xb9\x7d\x4e\xa4\x99\xd8\x67\x3d\xcd\x68\x9f\xdd\xc9\xbe\xbd\x81" - "\xe6\x81\xf6\x59\xd1\x9d\x6c\x9f\x9f\xad\x51\xf6\xd9\x9d\xe2\xcf" - "\x3f\x5b\xa2\xc2\xcf\x6a\xe3\xf8\x67\x0b\xcd\xed\xb3\x7b\x68\x7a" - "\xfb\x2c\xd3\xd2\xd8\xe7\xd4\x34\x77\x6a\xbe\x34\xf6\x19\x69\x17" - "\xb4\xcf\x12\xe6\x02\xf6\x39\x1d\x4c\x0a\x1d\xa6\xf6\xd9\x9c\xe7" - "\x7e\xfd\x33\xe7\xdb\x98\x1e\xa2\xca\x40\x7a\xfb\x2c\xd3\x6b\x94" - "\xdc\x2b\x77\x6a\xef\x72\x73\xfb\x9c\xa0\xc5\xc4\x3e\x27\xe8\x30" - "\xb1\xcf\xa9\x69\xa6\xf2\x37\xb1\xcf\x09\xf9\x0f\x62\x9f\x13\xb2" - "\x1d\xc4\x3e\xa7\x83\x19\x20\x7f\x13\xfb\x6c\xce\xb3\x89\xfc\xd3" - "\xd8\x67\x96\x6f\x55\x5e\x7a\xfb\x2c\xd3\xed\x4a\xee\x55\x63\xd5" - "\x7b\x55\x44\xca\x1f\xbc\xf3\x9c\x68\xaa\x4d\xd0\xe2\x2c\x03\xe3" - "\x92\x6d\x82\x06\x37\xc0\x26\xe8\xf1\x66\x36\xc1\x90\x36\xc0\x26" - "\xf4\xa7\xf5\x97\xc3\x71\xa9\x36\x41\xa7\x39\xd5\x26\xe8\x74\x27" - "\xdb\x04\x5f\x1d\xbf\x15\x1e\xa3\x4d\xf0\x69\xb6\xc0\x27\x75\xf3" - "\x24\x3d\x76\xcc\xb8\xde\x9c\xbc\xce\x59\xbd\x4b\x5f\x6f\x3e\xec" - "\xe2\xf5\xc6\xea\x7d\x21\xca\xf2\x70\x98\xd7\x3b\x6b\x21\x4b\x7d" - "\xfd\x53\x5f\xaf\xe2\x32\xd6\x8e\x12\x21\x0e\x4f\x3a\x43\xc3\x0e" - "\x17\x10\xbd\x32\x4a\xb4\xa9\xf5\xeb\xea\x1e\xfd\xec\xe9\xf5\x88" - "\xe3\x35\x6c\xce\x63\xf6\xbd\xac\xfe\x7d\x66\xcc\x4f\x57\xc5\xac" - "\x64\x09\x56\x7f\x4c\xc1\xad\xa2\xba\x25\x7a\x8c\xe6\x95\x93\x35" - "\x9e\xf1\xd4\x5f\x78\x1d\xcd\x51\x49\x43\xf9\xcd\xeb\xc1\xa7\x69" - "\xf5\x94\xe2\x08\x0d\x15\x6b\x90\x66\x45\x9a\x97\xbe\x63\x48\x53" - "\x67\xac\xf4\xe7\xbb\xc9\x90\x26\xef\xa5\xb8\xe9\x33\xbe\xf3\x74" - "\xb5\x3b\x95\x9e\xff\x22\x2d\x1f\x0c\x42\xcb\x99\xf4\xb4\xf8\xe5" - "\xb7\x7f\x37\x75\x92\xc5\xb5\x88\x2e\xf9\x8c\x56\xef\xe5\xb0\xbc" - "\x9f\x70\x8d\x59\x39\xfe\x3b\xb5\xf4\x21\x86\x74\x43\x59\xfe\x59" - "\x26\xf9\x8d\xe5\x55\x5c\x00\xff\xcb\x17\xc0\xff\xdb\x0b\xe0\x3f" - "\xce\xeb\xd2\x90\x9d\x23\x6e\x4d\x86\xbb\x39\x2a\xcf\x4c\x00\xdc" - "\x69\xc0\xad\x91\x1f\x09\x8b\x35\xb3\xff\xe2\xbb\x5a\x7e\x07\x2e" - "\xef\xdb\xd8\x84\xf4\x60\xb4\x5d\xae\x99\x4f\x06\xa5\x37\x47\x92" - "\xf2\xdc\x91\x4a\xdb\x88\xa8\x4e\x9b\x4c\x9f\x99\x4a\x1b\xd2\x6f" - "\x32\xa4\x2f\xeb\xaf\x77\x7f\x38\x5d\xbd\xf3\x5a\x7c\x70\x2b\x11" - "\xdf\x8b\x7d\xd8\x46\xc4\xe7\x0b\xd7\x26\xce\x54\x58\xd3\x14\xa2" - "\xd5\x4e\xc3\x79\xea\x7c\xd6\xd8\x55\x2d\x91\x08\xf1\xf7\xae\xda" - "\xf9\xb3\x5f\xaf\x3a\x47\x97\xf2\xdd\x1e\x7c\x3f\x4f\x71\xac\xc0" - "\x7a\xb8\x92\xdb\xd3\x5a\xbb\x9e\x37\xdd\xd9\x0d\x5c\xae\x56\xa6" - "\x3c\x9b\x19\x79\x26\xea\x79\x18\x37\x9f\x47\x1c\x87\x5e\xaa\xfb" - "\x07\x3b\x79\xbd\xfb\xeb\xbe\x0a\x2e\x8b\xcb\x29\x21\xad\x1c\x0f" - "\xf2\xec\x1c\xa4\x9c\x41\xf8\x5b\xbb\xfb\xe2\xf9\x23\x9d\xbf\x8e" - "\x0b\xf0\x37\x48\xb9\xcf\x8d\xbd\xf8\x72\x73\xb4\x72\x9f\x2b\xb9" - "\x78\xb9\x3e\x57\xfb\xe5\xe5\x9a\xab\xc9\xf5\xb9\x23\x17\x90\xab" - "\x59\x39\xd1\x2f\x5f\x8e\x4b\x2b\xe7\x07\xb9\x66\xe5\x18\xed\xa4" - "\x3c\xe7\x83\xcb\x50\x77\x3d\x58\xd0\xe6\x32\x91\xaf\xcc\x78\x87" - "\x3b\xc7\x23\xae\x52\xbf\xc3\xbd\xff\x2c\xeb\x1f\xbc\x5c\xdc\x20" - "\xcf\x79\x89\x87\xe8\x07\x75\x7c\xc6\xfc\xe4\x55\xfa\xbd\xe9\x32" - "\xcf\x9e\xc1\xee\x8e\xe7\x7b\x4e\x85\x28\x92\xe7\xe3\xab\xbb\x9a" - "\x7e\xf0\x37\x3e\x7b\x59\xdd\x79\xfc\x83\x88\x6a\x83\x3f\x88\x00" - "\x77\xde\x20\x38\xe4\x9d\xca\x63\x9d\xbe\x2f\xe4\xfd\xed\x2b\xc9" - "\x16\x74\x2a\xdd\x38\x45\x3f\x9c\xa9\xce\x80\xfe\xe1\x04\x9d\x1f" - "\xed\x8c\x7d\xe0\xfd\xe1\x54\x9d\x9f\x10\xfd\x50\x9e\xf3\x23\xd6" - "\xff\x67\xf5\x60\xe7\x9c\x0b\xfb\x71\x79\xc7\x39\xca\xb0\x9f\xa2" - "\x9a\x9d\xf5\xea\x6c\x74\xfd\x4e\x67\x1b\xca\x3b\xa7\xe3\x8f\x58" - "\xab\xb9\xdc\x3d\x26\xe5\x36\xea\xe5\x0a\x3f\x65\xb3\xcc\x5c\xd7" - "\xc8\xbc\x67\x22\x99\xc7\x03\xa2\xe6\x78\x80\xef\x0a\x3a\xe5\xe2" - "\xfb\x89\x6b\x76\x92\x3c\x83\xe2\x87\x6d\x61\xa4\x71\x5f\xaa\x70" - "\x1f\xce\xee\xf6\xd7\x64\x0f\xc4\x5d\xe3\x32\xe0\xce\xe0\x3b\x10" - "\x94\x5c\x6b\x5e\x56\xf7\x42\xd5\xdc\x7f\x38\xca\x7b\x74\x28\x9b" - "\x71\x8a\x75\xc7\x03\x9c\x17\xf8\xbe\xc2\x6d\x88\xcb\x00\x8e\x52" - "\x1d\xaf\xb0\xb7\x55\x73\xfb\x61\x18\x79\xff\x4b\x94\x65\x59\xb3" - "\x36\xa1\x07\x88\x2b\x77\xc1\x7f\x83\xdc\x18\x9f\x76\x8f\x79\x44" - "\xc7\x9d\xee\x0e\x0c\x29\x33\xd4\xfb\x0b\x4a\x8f\xac\xa7\x68\xfd" - "\xf5\xac\x7f\xea\x9e\xae\x75\xcf\x69\x34\xcb\xfa\x64\x5a\x19\x57" - "\x88\xd6\xf3\xdd\xdd\xa4\xe8\xad\xe6\x76\xd1\xd1\xed\x5f\x97\xa3" - "\xd3\xca\xf7\x4e\xe8\x72\x68\x94\xba\xbf\x6e\x9c\xae\x7b\xbc\x37" - "\x86\xf7\x32\x09\xf0\xa7\xee\xb6\x5b\x97\x0f\x1a\xcb\x38\x4d\x9d" - "\x59\xbf\xee\x69\x52\xe7\xf0\xb4\xca\x3b\xd3\xe4\xf9\x3c\x19\x7f" - "\x3d\x49\xeb\xee\x96\x7a\xa1\xea\x24\x1b\x34\x85\x1b\x6d\xbc\x3e" - "\xbc\x5e\x9d\x09\x22\xef\xdc\xe0\xfc\x35\x7c\x2e\x6b\xf6\x66\x79" - "\x77\xb6\xac\x9f\x2c\x91\xd9\x56\x8d\x72\xf6\x18\xe8\x0b\xeb\xed" - "\x62\x6c\x65\xb1\xd4\x4f\xa4\xb7\x26\x68\xb4\x82\x46\x3f\x68\x04" - "\xaf\xf5\xf2\xfc\xfc\x75\x9d\xc9\x34\xae\xbf\x24\x0d\x8d\x7f\x19" - "\x8c\xc6\x7e\x7d\x7c\x17\xe5\xad\xcf\x1b\xa8\x33\xeb\x0b\xf5\xfa" - "\xe4\xf0\xe1\x6b\x26\x72\x59\x7b\x18\x87\xd2\xe1\xf5\xe5\x09\x1e" - "\x12\xfc\xae\xaf\xe5\xfb\xb5\x99\x5f\xdf\x17\x64\x77\x44\xc9\xca" - "\xed\xde\x80\x73\x97\xce\x57\x48\xc9\xc6\x9e\x6a\x7f\xd2\xdd\x77" - "\x84\x7e\x9c\xeb\xd1\x1a\x5e\x77\xb4\x7c\x5a\x54\xc4\xe1\x07\xa1" - "\x9e\xd7\xc3\xff\xdb\x28\x6d\x9f\x58\x2e\x9a\x36\xf7\xaa\xbb\x18" - "\xa7\xc5\xba\x44\x71\xcc\xce\xe7\x0c\x80\xce\x1f\x8d\xd1\xcf\x36" - "\x52\x6d\xfe\x47\xa8\xff\x1f\xec\xe7\x70\x38\xe3\x86\x4b\xf1\xb8" - "\x4d\xed\x87\x8e\x2f\xf3\x68\x79\x71\x2c\x5b\xe2\x52\xf7\x3c\xfe" - "\x68\x61\xe2\xce\x4b\xd0\x24\xb2\x9a\xcb\xf8\x3e\x9d\x70\x5f\x19" - "\x9f\xeb\x64\x51\x74\xfd\x68\x8b\x5e\xc6\x85\xee\x2f\x19\x84\xdf" - "\x36\xfd\x9c\x28\xe0\x0b\x85\x68\x53\x07\xe3\x73\x58\xf8\xfe\x34" - "\xd1\x83\x32\x47\x22\x3e\xc1\x3f\x9f\x15\xc5\x69\xea\xac\x99\x1f" - "\x1d\x53\x36\x72\x83\xd3\xec\xbc\xa8\xc7\x16\x2f\x2e\x2f\x5e\xb2" - "\x80\x5f\xee\xeb\x96\x5d\x9f\x95\x62\xf7\xb3\xd5\x1d\x56\x1b\xc6" - "\xf2\xfe\xc0\x17\x2e\xd5\xcf\x68\xda\x50\xaa\xef\x51\xe4\xb6\x8c" - "\x76\x73\x2f\xf7\x9b\xdc\xbf\x20\xad\xfa\x9d\xca\x55\x72\x7f\xd8" - "\x5f\xec\x64\x4d\xe7\xf7\xb0\x8e\x76\x65\x8a\x6a\x96\x97\xd8\x38" - "\x0a\x7d\xf2\x06\xf8\xff\x1b\x26\x0c\x72\x36\xb9\x27\xb6\xfe\xe3" - "\x1c\xd7\x68\xe2\x7b\x10\xad\xbf\x5e\xd9\x66\xe5\x73\x22\xaa\xf0" - "\x9b\xfd\x38\x79\xae\x84\x95\x04\xd3\x71\xf0\x6c\x1b\xec\xc5\x46" - "\xd8\x84\x66\xf8\x26\x1b\x6d\x69\x69\x30\x9c\xb5\xc5\x67\x1f\xb5" - "\xd3\xc6\xb1\xe9\x60\x45\x4d\x9b\x76\x9f\xe6\xc6\x8a\x46\x3e\x5b" - "\x75\x34\xfd\xf0\x24\x6d\x5c\x66\x73\x92\x13\xbf\x7f\x8e\xdf\xd2" - "\xd7\xe5\xb4\xa4\x3a\xbd\xe2\x4c\x83\x2d\x43\x58\x85\x10\x16\xa1" - "\xfe\x30\xa0\x52\x7f\x19\x78\xac\xc2\x22\x4f\xac\xc9\x80\xa4\x86" - "\x0d\xb5\x91\x63\x44\xb6\xfd\xaa\x2b\xc7\x38\xef\xbd\x67\xe2\x04" - "\x5f\x55\xa5\x57\xc4\xa3\x3d\x0e\x61\xbc\xc3\x54\xb8\x66\x5e\x5f" - "\xad\xce\x0d\x5b\x27\x5c\x66\xb4\x6e\xf4\x0b\x0f\xdf\xd9\x14\x1f" - "\x31\xaa\xc4\xb7\x8c\xac\x6f\xf6\x86\xac\x7c\xcf\xb8\x6b\x39\xef" - "\xc9\xfd\x13\x9d\xa4\x4d\x43\x0e\x21\x0e\xfc\x7b\xc5\x86\x51\x25" - "\x4a\x4f\x36\x4d\x89\x6f\x1a\x55\xd2\x8f\xdf\x46\x8c\xdf\xf7\x32" - "\x59\x77\x56\x75\x58\x83\xb6\x7b\x28\xe8\x8a\xd0\x21\xfc\x4e\x53" - "\x9f\x1e\xc8\x9f\x18\x47\xbd\x3f\x5e\x83\x36\x6f\xe5\x7d\x8d\xb0" - "\x05\xd6\xcf\x68\xd3\xaa\x3d\x69\xf2\xf1\x9d\x34\x5d\x59\x47\xef" - "\xea\xf6\x6f\x42\xfd\x7f\x3b\x71\x07\x15\xc2\x47\x74\x7d\x46\xfa" - "\x9d\x5d\x7e\x19\x77\x42\x87\x31\xef\xe7\x79\x4f\xaa\x08\x48\x3b" - "\x79\xfe\x6f\x1d\xf5\x55\xe6\xe7\x49\x83\xce\x61\x41\xef\x6d\x7c" - "\xce\xcb\x90\x11\x3d\x94\xed\x3b\x27\xfa\x30\x86\x18\x09\xb5\xb5" - "\x62\x0c\x76\x55\xf4\xbc\x28\x6a\xee\x3c\x4b\x2d\x91\x63\x7c\x46" - "\x94\xe5\x57\x8f\xbf\x6b\x0d\xf6\x7c\x1e\x08\xae\x8d\x53\x8b\x27" - "\x4a\xc1\xba\xcf\x03\xcd\x9d\xc7\xf0\x3b\x46\xcd\xf4\x31\x35\x7b" - "\xff\xb3\x5a\x8e\xdb\xea\x44\x35\xcb\xb9\xef\xbc\x28\x0c\xda\xfe" - "\x37\x71\x5f\x08\x3b\x31\x07\x72\x77\x7d\x46\x9b\x5f\x3b\x08\x3c" - "\x6f\xfe\x19\xb8\xa2\xec\x67\xde\x4d\x87\xf0\xbb\xdb\xbf\x79\x8f" - "\x7e\xbe\x99\x19\xad\x0e\x4b\x60\xa3\xc3\x3b\xd7\x1a\x3f\x2f\x26" - "\xf0\xfd\xb2\xe2\xbc\x18\xcf\x7c\x21\x9c\xcb\x61\xbc\xc7\xf1\xdb" - "\xb1\x3a\xb0\xdd\x11\x9d\x4b\xb0\x55\x45\x6c\x9f\x10\x5f\x58\x7f" - "\x9e\x38\x5c\xa0\x85\xa7\x6a\xe1\x7c\x2d\x3c\x59\x0b\xe7\x69\xe1" - "\x89\x1c\x66\x7a\xbb\xfd\x5b\x26\xeb\x34\x75\x59\x87\xb5\x22\x5c" - "\xa8\xd7\x05\xe8\x19\xee\xf0\xae\xb2\x0a\xa6\x47\xd1\x31\x5e\xa3" - "\x2b\x57\x0b\xeb\xf4\x5c\xe1\x88\xae\xfa\x9f\xa2\xe7\x58\x0a\x3d" - "\xed\x06\x7a\xc8\xe1\xcd\xfb\x32\xf4\xe4\x38\xa2\x79\xff\x2d\x7a" - "\x98\x16\x8e\xeb\xf6\xff\xb8\x34\x99\x9e\x1f\x97\xeb\xf4\xa4\xe9" - "\x3f\x3a\xb8\xff\x58\x7a\x99\xbc\x6b\x7d\x58\x30\x7a\x87\xa1\x0f" - "\xf9\xf1\x9e\xc1\xee\x0a\x46\x5b\x70\x02\x06\xfc\xff\xb8\x5a\x96" - "\xb7\x5c\xec\x57\xfd\xe7\x8f\x3b\xf4\xb3\xf5\xc0\xeb\xae\xcd\x8a" - "\xd7\xdd\x6b\xf9\x6e\xe2\x0a\xba\xdc\xe7\x15\x1d\xf0\xbb\xfe\x4f" - "\xa3\x2b\x9c\xd4\x06\x16\x96\x2f\x5d\xfa\xf4\x5d\xae\x85\xf3\x17" - "\x2d\x70\x5d\x57\xea\x5a\x5a\xf6\xc4\xe3\xe5\x0b\x92\xcf\xac\xca" - "\x61\xdb\xc1\x76\x7e\x87\xba\xbf\x2c\xcc\x6d\x80\xf5\x9f\xfb\x76" - "\x75\xde\xe8\xf3\xaf\x0b\xff\xf3\x23\xb9\x6f\xd8\xf1\x3c\xd9\xea" - "\xe5\xd9\x51\xcf\x7b\xf5\x3e\x61\x8d\xe6\xe3\x58\x73\xf8\x5e\x92" - "\xe7\xd1\xff\x6d\xce\x31\xc4\x33\xec\x4e\x3d\x8e\xf1\x6b\xb6\x69" - "\xd8\x49\x7a\x7e\x0a\x97\x69\x2a\xc3\xf3\xa2\x01\x3e\xb4\x25\x2e" - "\x8a\xac\xb0\x29\x82\xef\xaa\x84\xff\x6b\x45\x3e\x01\x7a\xce\xb1" - "\xed\x2d\x44\x98\xc7\xf6\x2e\x9f\x00\x8d\x2f\x64\x22\xcf\x4e\xc4" - "\xd9\x36\xc5\x79\x97\xa3\xe8\xe0\x7c\x88\xbf\x9a\xef\x7f\x2b\xe4" - "\x33\xe4\xa2\xf2\x6e\x08\x8e\xbb\x83\xef\x67\x43\x5c\x8e\x21\xee" - "\x7e\xc4\x39\x11\xe7\xd2\xf0\xcd\x62\x39\x23\x9c\xa7\xf9\xf2\x0c" - "\xf3\xb4\x56\x6e\xb5\x91\xe6\x82\x49\xf7\x4f\xb9\xed\xe6\x5c\x57" - "\xe1\x8c\x6f\xdd\x7d\xcf\xf7\x17\x2f\x7a\x3c\x8b\xa4\xd8\xdd\xb9" - "\xde\xeb\x72\x6f\xf3\x5e\x7f\x97\xcb\xb3\x60\xc1\x12\xd7\x8a\x05" - "\x8b\xca\x5d\xf3\x57\xcc\xaf\xc8\xa2\xc7\x17\x2f\xf9\xfe\x13\x8b" - "\xfe\x97\xac\x96\xa5\xc5\xdf\x7f\xfc\x7f\xf1\xc1\x62\x0a\x3a\x2b" - "\xa9\x3f\x2e\xe4\xbe\x5d\xbb\x8f\xef\x08\x1e\xbe\x2b\xd3\x89\x77" - "\x23\x9e\xfd\x78\xf6\xe1\xe1\xbb\x9c\x5b\x4f\xd3\xcb\x76\xbc\xf7" - "\x76\xfb\x6b\x73\x74\x7f\xa1\x5f\x77\x6a\xc7\xea\xba\x83\xfe\x7b" - "\xaf\xea\xd7\x6a\x0b\x5b\xa2\xb2\xdd\x24\x74\x69\xf3\xf9\x7e\x5d" - "\x92\x77\x78\xf3\x99\x79\xcb\x91\x0e\xdd\xe5\x7b\xb2\x20\xeb\x4c" - "\x96\xd7\x29\xfa\xc9\x65\xf0\x99\x9b\xf8\x6e\x48\xbc\x1b\xa1\x27" - "\x4d\xca\x07\xac\x6d\x05\xdc\xd5\x28\x63\xbf\x56\x86\x0a\x8f\x12" - "\x47\x90\x9e\x71\x52\x0b\x33\xae\x53\xf4\xd2\xeb\xfc\x9b\xdf\xda" - "\xfe\x7f\x47\x30\x22\xc7\x26\xd6\xfe\xb4\x17\xef\xd4\xca\xe0\x73" - "\x0e\xab\xd9\xf7\xd1\xfd\x5d\x1e\xe7\x3a\x2c\xf7\x0a\xd0\xf3\x79" - "\x3c\x63\x76\x9b\xbc\xaf\xb8\xba\x17\xb6\xe1\xf6\xdb\x83\x5e\x11" - "\x40\xba\x85\xc7\xc1\x0f\x7a\x44\xbc\xc5\x73\x8e\xe2\x19\x4f\xb5" - "\xb1\x2c\x59\x7e\xa7\xa9\x76\x88\x1a\x43\xbd\x6c\x97\xf8\x80\x5f" - "\xd1\xfb\xa2\x3a\x23\x57\xf9\xdd\x7c\x07\x18\xfb\xd5\xfb\xb8\x7c" - "\xbe\xcb\x0f\x70\xad\xf5\x2a\x7c\xac\x9f\xe7\x17\xd7\xea\x34\x69" - "\xf1\xad\x80\x3b\xa6\xee\xc9\xab\x3d\xa1\xa7\x29\xdf\xbc\x2e\x0f" - "\x32\xf8\x0b\xf3\xc2\x78\xe5\x37\x0f\xbd\x51\x09\x87\xbc\x7b\x74" - "\xbb\xc1\x76\xa2\x38\x86\x76\x26\x7d\xd8\x17\x43\x09\x1f\x36\x51" - "\x9f\x2f\x46\xcc\x6c\x81\x59\xfd\x69\x32\x9e\x2b\xfc\x2f\x78\x41" - "\xd7\x1e\x29\x4b\x43\x39\xb0\x4f\x7d\xaa\x9c\x97\xf2\x13\xbe\xad" - "\x96\x8e\xb4\x58\x88\x69\xeb\x95\xdf\xb1\x68\xed\xfe\x25\x8f\xde" - "\xee\x75\xb8\x78\x4d\x4b\x36\xda\xbe\xcd\x61\x11\x71\x87\xd7\x22" - "\x78\xce\x86\xfb\x3c\xe9\x53\x00\x66\xc4\x39\xc8\xb2\x97\xc7\x1f" - "\x2f\x8d\x8b\xaf\x6b\x51\x3e\xa6\xff\x85\x1f\xf5\xdb\x92\x97\x1a" - "\x53\x71\xb2\x2d\x91\x77\x27\xdb\x5b\xb2\x8b\x63\x36\x3e\x33\xd6" - "\x22\x32\x5b\xb2\x39\x5d\xa3\xb7\x27\x95\x5e\xd6\xb3\x69\xb1\x3e" - "\xa1\xdd\x4d\x0a\x7f\xe2\xa5\x42\x99\x36\x4a\x34\xaa\xba\xda\xfa" - "\x0e\xd7\x07\xda\xc9\xee\x6e\xff\x4f\x30\xfe\x7f\xbe\x51\x1b\xc3" - "\x34\xc1\x2e\xed\x3e\xbc\x72\x32\x60\x7e\x52\x98\x52\x9f\xfb\x35" - "\xdd\xae\x30\x8c\xb5\x8e\xa9\xfa\xbc\xa7\xfa\x24\xfd\xa4\xd6\x10" - "\xaf\xd5\xf3\xe1\x82\x93\xb4\xf5\x01\x35\x06\x6b\x6e\x52\xba\xf5" - "\x13\xa9\x0b\x3a\xad\x42\x8d\x9f\xf7\xf2\xfd\xa9\x5c\x07\xfd\x7c" - "\xfd\xa4\x55\xb7\xfd\xdc\x56\x43\x4a\x37\xf6\xb3\xcc\x20\x2b\x1b" - "\xe4\xf6\x0b\x25\xb3\x9f\xf4\x24\x64\xc6\x77\xd4\xa3\x8c\x11\xab" - "\x45\x7c\x44\x04\x6e\x27\xca\x2c\xae\xb0\x11\xeb\x3f\xb7\x59\x9e" - "\xef\x64\x18\xee\x1f\x75\xb9\x76\xfb\xb7\x4e\x18\x58\xdf\x7d\x22" - "\x44\x3f\xd9\xc5\x74\x24\xf3\x39\xac\xf5\xa4\xce\x3f\xec\x10\x8f" - "\xc5\x11\xf6\x6a\xe3\xdd\xa6\xc0\x68\xfe\x2e\xaa\x76\xd5\x61\xdb" - "\xb7\xe8\xb0\x77\x3c\x29\xf9\x6e\xdd\x0a\xf9\x8e\xd3\xc7\xda\x5c" - "\x37\x2c\x63\x96\xa9\xa8\x69\xb1\xeb\x75\xa4\xce\x7e\xab\xf5\x8a" - "\x75\x2d\x72\x8c\xc0\xb4\x74\x59\xe5\x3d\xe3\xad\x4c\x13\xdb\x3a" - "\x6e\x8f\xb2\x3d\x80\x9e\x7e\x39\x6d\xed\x31\xc8\xa9\x91\x65\xa4" - "\xc9\x6a\x6f\x8a\x6d\x5e\xe0\x5a\x78\xb7\xb2\xad\x2e\xf7\x75\xa5" - "\xb7\xf0\xc9\x8d\xd7\xbb\xfe\x69\xd2\x5d\xae\x82\xbb\xaf\xf3\x96" - "\x8d\x7b\x90\x5f\xff\xab\x6c\xdc\xa4\x82\xa9\x1c\x4e\xb6\xbf\xae" - "\x6e\xff\xcb\x25\x21\xcb\x3d\x36\x2e\x27\xbe\x5c\x74\x6e\x3e\x4b" - "\x14\x63\x79\x2f\x62\xbd\x6f\xde\x35\x0d\x36\x74\x5a\x85\xf8\xa2" - "\x1e\xf1\xf5\x88\xe3\xbe\x8d\xc7\x9a\xf1\x75\xcd\xbb\xc2\x99\xc2" - "\x15\xce\x8c\x87\xc2\x99\x47\xa7\x4e\xb9\xde\x27\x80\x6b\xb7\x4e" - "\xb3\xc8\xc0\xf8\x11\xf9\x75\x3b\x15\x8c\x76\xf0\xbd\x94\x36\x8c" - "\x61\x76\x89\x0c\x1e\x47\xbe\xdc\x06\x3b\x5e\xaa\xce\xc1\x7d\x19" - "\xfe\xcf\x0b\x47\x34\x5f\xb9\x00\x61\xb4\xff\x6f\xc8\x3b\x83\x85" - "\xd5\x49\x22\xe3\x86\xe9\x6c\x4b\x24\xce\x75\xf1\x90\x09\xde\xa1" - "\x3a\x5e\xfa\x92\x67\x8e\x8a\xac\x96\x1a\xfe\x76\xa9\xde\x1a\x2f" - "\x72\x44\x2d\xd5\xfc\xfd\x92\xfe\xad\x56\x7c\x3d\xd2\x2c\xea\xbe" - "\x65\xb4\xf7\x6a\x86\xd1\xd3\x36\xfb\xe3\xa1\xcd\xd6\x78\x0f\xc6" - "\x68\x39\xca\xef\xed\x64\xfb\x8d\x31\xe4\x2b\xbb\xf4\x7e\x49\xeb" - "\xd3\xaa\xd5\x39\xae\xaf\xfc\x81\xf3\x9d\xf5\xdb\x60\x1f\x5e\x2e" - "\xb8\x66\xa4\x1c\x5b\xf4\x08\xab\x3e\x9e\x7d\x65\x3b\xa7\x6f\x52" - "\xf3\x35\x57\x39\x56\x8b\x70\x55\x44\x84\x1d\x51\x11\xe6\xf9\x5b" - "\x69\xfb\xe9\x34\x05\x2b\xbb\xab\xf9\x5e\x75\xe9\xbb\xa0\x5c\x65" - "\xf7\x63\xca\xee\xa3\x7c\x8c\xf5\x4b\x60\xfb\x2d\xa7\xe9\x95\x85" - "\x4c\xbf\x26\xa3\xec\x38\xe4\x15\xe4\x7e\x8e\xe5\x93\xd5\x6a\x4f" - "\xc7\x33\x78\x0a\x6d\xf2\x83\x2f\x2b\xf8\xf2\x9e\xe1\xf6\xd1\xc3" - "\xdf\xd8\xa1\x7d\x8d\xea\xbf\xef\x6d\xdb\x06\x73\x1e\xb7\xbd\x31" - "\x38\x8f\xdb\x56\x6b\x6d\x4b\xd2\xc9\xf6\xa2\x93\xb6\xe5\x8d\x58" - "\xcd\xdf\xaf\x35\xef\x82\x4e\x4d\xe2\x76\xb2\xc3\x2f\xf8\xce\xb5" - "\x5d\x66\xf5\xa5\xce\x8b\x66\x5c\x75\x53\x1d\xab\xab\x4b\xba\xfd" - "\x75\x4e\x23\x2d\xdc\xe7\x68\xe9\x77\x9a\xd1\x12\xf7\x33\x2d\x4c" - "\x6b\xdd\x70\xce\xcf\x74\xf0\xfc\x98\x23\x8a\x41\x36\x74\x18\xe3" - "\xac\x1a\xb3\x72\x47\xac\x6e\x60\xba\x4c\xd3\x60\x73\x3a\xd9\x2e" - "\xc9\xfe\xcc\x4b\x62\x1a\x1e\xb6\x41\xa0\x6d\xaf\x6e\x7b\x1c\x16" - "\x57\x86\xb4\x05\x56\xb1\xc5\x0c\x87\x63\xf5\x16\xfe\x7e\x6e\x12" - "\xca\x37\x4d\x87\x8c\x5d\x90\xd1\xd6\xf8\x9a\x1b\xaf\x71\x58\xe8" - "\xde\x70\xc6\x8d\x59\x0e\x6f\x74\x2c\xcb\x10\x38\xbd\xa7\x68\xc7" - "\x3b\x3c\xbe\x54\xf7\x1e\x6f\x1f\x17\xa2\x37\xe4\xbc\x71\x38\xb3" - "\x79\xab\x9a\x13\xda\x9e\x17\xa2\xbd\xd9\xfd\x73\x44\xdb\x0b\x42" - "\x96\x2b\x95\x5d\xcd\xb8\xfc\x15\xb1\xfe\xa8\x33\xee\x77\x08\xd7" - "\x4a\x07\xfc\xbf\xed\x7f\x8b\x0b\xb7\x55\x64\x1d\x75\xf6\xeb\x89" - "\xfa\xb6\x4f\xd7\x13\xe4\xdf\x62\xae\x03\xdb\xdf\x1a\x5c\x07\xb6" - "\x3f\xc7\xe9\x2c\x77\x35\xc6\xd8\xde\x96\x98\xdf\x5a\x73\xf9\x2b" - "\xae\x2a\x59\xfe\x42\x55\x36\xcb\x24\x8f\xe7\xd6\xa6\x42\x2e\xd5" - "\xdd\xfe\x1d\xb6\x84\x3d\x80\xbe\x38\x62\x64\x61\xbb\xc4\xba\x82" - "\x34\x17\x6c\x8e\x9c\x8f\xe2\x3b\x84\x61\xd3\xc6\xc4\xfd\x2f\x8f" - "\x0c\xfb\xca\xb6\xf1\x19\xb0\x91\xcc\x96\x1c\xc0\x60\xfc\x77\x62" - "\x9f\x9a\xdf\x6d\xb1\xc3\x3e\x67\xd7\x5e\x0a\x7b\xab\xbe\x57\xcd" - "\xe6\x36\x8d\x77\x0e\xb7\x6b\xc4\x8d\x04\xdd\x39\x08\x63\x9c\xb2" - "\xa3\x52\xef\x83\xe2\xfe\x3c\xd8\x03\x21\x75\x13\x7d\xcc\x98\x2e" - "\xc8\xee\x45\x6b\x7c\xd7\xf9\x5b\x9c\xc4\x3c\x9f\x5f\x33\x7a\xd7" - "\x0f\x6f\x26\xdb\xbf\x3b\x1f\x23\xcf\x6d\x34\x72\xf5\xb7\x6c\xf4" - "\x7f\x27\x90\x95\xe5\x10\xa2\x1d\x1b\x94\xec\x76\x34\xe9\xf5\x13" - "\xa2\xed\xe3\xb9\x3e\x52\xfd\x6c\xd7\x13\x4b\x5d\xa5\x8b\x57\x2c" - "\xba\xfa\xea\xa4\x31\x8c\x8d\x1f\xe1\xdf\x11\x52\x7d\x63\xfd\x48" - "\x9d\x2e\xab\xbc\x1f\xb2\x1e\xfe\xef\xcb\xf9\xa9\x63\xae\xa9\xc5" - "\xda\x11\xbf\xc5\xb9\xd4\xff\xfb\x56\x9a\x7a\xab\x21\x78\x3b\x4d" - "\xbd\xed\xf6\xe2\xe9\x0b\xe6\x97\x56\x18\x62\xef\x30\xce\x9b\x6d" - "\x7e\x85\x6d\xef\xe8\xef\xc2\x16\x58\x1e\x7c\x96\xfb\xfa\x86\xcc" - "\xaa\xa8\xf8\xab\xe0\xbb\x79\xac\x54\xdc\x5c\x1e\xa5\x66\xd8\x2a" - "\x71\x39\x6c\xb5\x7f\x98\xba\x07\x02\x3e\x12\x74\xc7\x31\x0d\x76" - "\x0c\xfe\xda\x39\x9e\x37\x41\xbe\x9b\x5a\xb6\xf6\xa0\xcd\x1f\x2d" - "\x54\x3e\x43\x3d\x8f\x61\x2e\x41\xfc\x25\x78\x0f\xc5\xfb\x6b\xae" - "\x45\x18\x8f\xf0\x39\xc2\xcb\xf9\x1c\xe1\xfa\x18\xcb\xed\xe6\x48" - "\x35\xdd\xbc\x84\x7d\xea\xfa\x86\xc3\xe5\xec\x67\x35\x14\xc8\x35" - "\x09\xc0\x22\xee\x6f\xae\x27\x29\x97\xdf\xec\xd3\x86\x80\x53\xac" - "\x3b\x5a\x28\xb6\x61\x5c\x55\x45\x63\x81\xf3\x81\x0c\xcb\x5f\x28" - "\xc3\x39\x74\x7f\xb7\xbf\x61\x6a\x88\x36\xd4\xb2\x9c\x90\xdf\x7c" - "\x5e\x2c\xc5\xd7\x28\xae\x80\xaf\x87\x7e\xa6\xd8\xbb\x9e\xf0\xdb" - "\x56\x5f\xa5\x8f\x73\x1b\xb6\x1a\xe6\x5e\xb3\x10\xde\xa5\xeb\x33" - "\x7e\xef\xd5\xf5\xcd\x58\xc6\x94\x45\xe5\x0b\x96\x2c\x28\x75\x5d" - "\xb7\x34\x8b\x0a\x9f\x78\x7a\x41\xe9\x4d\x8b\x97\x95\xbb\x56\x94" - "\x2d\x58\xe4\x5a\xb2\xe0\x99\x65\x0b\x96\x96\xf3\x98\x89\x53\x93" - "\xfa\xe8\x91\x22\xeb\x83\x1a\xfd\x5c\x7a\xd7\x68\x96\xe3\x4f\x2f" *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable@FreeBSD.ORG Tue Feb 24 20:16:53 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3215E1065744; Tue, 24 Feb 2009 20:16:53 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1E95D8FC19; Tue, 24 Feb 2009 20:16:53 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1OKGrfg075330; Tue, 24 Feb 2009 20:16:53 GMT (envelope-from gallatin@svn.freebsd.org) Received: (from gallatin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1OKGrx5075328; Tue, 24 Feb 2009 20:16:53 GMT (envelope-from gallatin@svn.freebsd.org) Message-Id: <200902242016.n1OKGrx5075328@svn.freebsd.org> From: Andrew Gallatin Date: Tue, 24 Feb 2009 20:16:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org X-SVN-Group: stable-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189011 - in stable/6/sys: . contrib/pf dev/cxgb dev/mxge X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Feb 2009 20:16:53 -0000 Author: gallatin Date: Tue Feb 24 20:16:52 2009 New Revision: 189011 URL: http://svn.freebsd.org/changeset/base/189011 Log: MFH r188736 and r188737: Better support for recent Myricom 10GbE NICs Modified: stable/6/sys/ (props changed) stable/6/sys/contrib/pf/ (props changed) stable/6/sys/dev/cxgb/ (props changed) stable/6/sys/dev/mxge/eth_z8e.h stable/6/sys/dev/mxge/ethp_z8e.h stable/6/sys/dev/mxge/if_mxge.c stable/6/sys/dev/mxge/if_mxge_var.h stable/6/sys/dev/mxge/mxge_mcp.h stable/6/sys/dev/mxge/rss_eth_z8e.h stable/6/sys/dev/mxge/rss_ethp_z8e.h Modified: stable/6/sys/dev/mxge/eth_z8e.h ============================================================================== --- stable/6/sys/dev/mxge/eth_z8e.h Tue Feb 24 20:16:34 2009 (r189010) +++ stable/6/sys/dev/mxge/eth_z8e.h Tue Feb 24 20:16:52 2009 (r189011) @@ -1,6 +1,6 @@ /******************************************************************************* -Copyright (c) 2006-2008, Myricom Inc. +Copyright (c) 2006-2009, Myricom Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -28,7074 +28,6951 @@ POSSIBILITY OF SUCH DAMAGE. $FreeBSD$ ***************************************************************************/ -static unsigned int eth_z8e_uncompressed_length = 369604; -static unsigned int eth_z8e_length = 113069; -static unsigned char eth_z8e[113069 + 1] = - "\x78\x9c\xec\xbd\x7f\x7c\x54\xd5\xb5\x37\xbc\x66\x32\xc0\x24\x0d" - "\x4c\xb4\x94\x8e\x88\x3a\x2a\xb6\xa3\xa2\x46\xc5\x16\x2d\x6a\x2c" - "\x70\x1b\xef\x8b\x12\x21\x68\x90\x1f\x09\x36\xf8\x44\x45\x18\x21" - "\xc0\x04\x43\x26\x0c\xd8\x06\xca\xaf\x6a\xb4\x28\x81\xa4\x15\x6f" - "\xb1\xc5\x8a\xb7\x78\x4b\x5b\x7e\x8c\x12\xef\xa5\x36\xc9\x44\xc1" - "\xe7\x06\x3f\xb4\x4e\x79\x22\x4d\x79\x82\x4e\xc9\x40\x62\x32\x33" - "\xfb\xfd\xae\xbd\xcf\x99\x9c\x99\x9c\x09\x72\xef\xfd\xbc\xef\x3f" - "\xcd\xe7\x73\x72\x66\xef\xbd\xf6\xda\x6b\xad\xbd\xf6\xda\x6b\xff" - "\x38\x7b\x13\xfd\x37\xfe\xac\x47\x03\xff\x9d\xec\xff\xf8\xfb\xc7" - "\xdf\x3f\xfe\xfe\xf1\xf7\x8f\xbf\x7f\xfc\xfd\xe3\xef\xff\x9f\xbf" - "\xb3\x56\x1b\xbd\xbb\x85\xa8\xdb\x6f\x77\x86\x2c\xb7\x4e\xfe\xc9" - "\x0b\x22\x8a\x68\x4b\x88\xec\x4e\x7e\x6b\x0f\x3d\x8f\x78\xeb\x16" - "\xb2\x5f\x93\x43\xd9\x93\xb6\x13\xd5\x8e\x12\x9d\x2f\xbc\x24\xc2" - "\x6b\x5e\x12\x9d\x93\x5f\x23\x6a\x1c\x4b\xf4\xc2\x28\x11\x01\x9e" - "\x39\x21\x5a\x5b\xc9\x78\xd6\x20\xcc\xe9\x6b\x47\x89\x30\xe2\xcb" - "\x11\x1f\xe1\xf8\xd5\xa3\x80\x6b\x24\x91\xff\x25\xd1\x63\xc0\x6b" - "\xe7\xfc\x8c\x73\xf2\xd5\x92\x9e\x9d\x29\x78\x18\xc7\xbe\x10\x3d" - "\xb7\x70\x10\x1c\xd9\x9c\x5f\xd2\x86\x3c\x5d\x7e\x72\x46\xac\x64" - "\x89\xf8\x03\x5f\x43\xde\x08\x78\x72\x73\xde\xcd\x48\x17\x7e\xca" - "\x60\xbc\xc1\x9e\x28\x35\x56\x12\x01\x96\x5c\x55\x64\x39\x45\x99" - "\x77\x03\xde\xb2\x46\xe5\x77\x21\xce\x2a\xe3\x80\x87\xe3\x38\x0d" - "\xf1\x63\x39\xdc\xed\xcf\xcc\x4f\xe0\x64\x59\x70\xba\x35\x60\x45" - "\xba\x05\xf9\x6c\xc8\xb7\xac\xb1\x81\x48\xe1\xca\xc9\x0c\x51\x66" - "\x9d\x96\xaf\x1a\xf9\xaa\x39\xdf\x61\xa4\x4f\xaa\x53\x3c\xce\xa8" - "\x23\x2b\xa7\xb3\x7c\x51\x8e\x15\x70\xbb\x74\xfc\x0a\x87\xf5\x7e" - "\x8d\x9f\xaf\x20\xad\x31\x39\xcd\xf6\xbc\x96\x96\x8d\xb4\x50\x72" - "\x1a\xf0\xa9\xb4\x4b\x90\x16\x4d\x93\x76\x69\xb7\x3f\xcb\x99\x9c" - "\x76\x30\x57\x4b\xfb\x3a\xd2\xc6\x27\xa7\x59\xf4\x7c\x4e\xa4\x15" - "\xe8\x69\xc6\x7a\x51\x1a\x66\xc3\x33\xc4\x4e\x34\x14\xcf\x30\xbb" - "\x5e\x57\x4b\x9d\x22\xee\xbb\x8c\x6c\x62\xfd\x7e\x7b\xdc\x2f\x28" - "\xe8\xed\x21\xd7\x68\xf2\x9d\xa4\xac\x00\xf0\xd2\xa6\x95\x64\xf7" - "\x79\x44\x4f\xd0\xdb\x49\x2d\xe1\x4e\xf2\x85\x45\x47\x30\x7a\x8e" - "\xaa\xce\x91\x3d\x18\x3d\x43\x55\xcf\x90\xb3\xb1\xf2\x53\x32\xd3" - "\x83\xb8\x55\x90\x6f\x0c\xe7\x6d\xa7\x96\xba\x76\xf2\xd5\x25\xe7" - "\xf5\x5d\x41\xce\x66\x84\xa1\x03\x8e\xf2\xad\x22\xde\xe8\x8a\x52" - "\x34\x6b\xbf\xbd\xf2\x35\xb2\xf9\xae\x26\x6b\x73\x69\x80\x5c\xdf" - "\x60\x5a\xbe\x52\xc3\xb4\xac\x7d\x92\xec\xaf\x3e\x1e\xb0\x8a\xf5" - "\x8d\xf6\x5f\xf5\xf6\x58\xd7\x9c\x26\xdb\x61\xe7\x64\x3a\xec\x3c" - "\x41\xc1\xad\x77\x53\x30\x12\xa5\x4d\x4f\x52\xf6\xe1\xc8\x44\x0a" - "\xae\x8d\x13\xe3\x0b\x2e\x9c\x88\xf7\x39\xc0\x74\x92\x6b\x09\xd1" - "\x29\xfa\x8a\xb7\x16\x78\x42\x0a\x27\x74\xe0\x2b\x6b\xdf\xf1\x10" - "\xb1\xcc\x38\x9c\x46\x9f\x73\x5e\x60\x5d\xb5\x4a\x1d\xea\xac\x1f" - "\x25\x3a\xae\xad\xa5\x91\x80\xcf\x41\xfe\xc6\x90\x75\xef\x3e\x4d" - "\x9f\x3b\x6e\xa9\xa5\x9c\xbd\x55\x61\x1b\xf4\xb0\xd3\xe1\x85\xfe" - "\xad\xa4\x21\x8e\x28\x59\xc0\xc3\xeb\xf5\x88\xbb\x76\xa4\xcc\xd3" - "\x13\xa2\xb7\xda\x38\x8f\xf8\xfa\xec\xbf\xc7\xbf\x3e\x3b\x1c\xff" - "\xc9\xec\xb3\xe2\x27\xb3\xbb\x62\x3f\x99\x1d\xf1\x55\x90\x3d\xf6" - "\xf5\xd9\xe7\x5a\x3c\x52\x56\x39\x2d\x1e\xc8\x2a\x46\xf6\x55\x67" - "\x28\x67\xde\x33\xa8\xa3\xe8\x9f\x68\xd5\x13\xe4\x8c\x67\xbe\x1b" - "\x08\x46\x3f\xa2\x79\x95\x24\xf0\xbb\xd5\x8c\xf6\xae\xac\xc6\x7c" - "\xa5\x5b\x76\xb4\xe5\x6c\x0f\x68\x95\xe5\x76\x65\x35\x69\xf1\x4c" - "\x4f\x76\x8d\x1e\x2f\xb2\x1a\x0b\x51\x1f\xbe\x11\xab\x2d\xb4\xa3" - "\x97\xe8\x96\x38\x59\x4e\x53\x76\x2d\x78\xc9\x31\xe2\x9f\x3e\xe5" - "\xe1\xbb\x29\xf7\xce\x9b\x72\x6f\xff\xf6\x84\xdb\xe9\x81\xfb\x26" - "\xdd\x4d\x05\x8f\x4c\xc7\xbf\x07\xef\xa6\xa2\x7f\xba\x1f\x3f\x26" - "\xdd\x7d\x6b\xee\xf7\x6e\x2a\x98\x74\xff\x94\x9b\x26\xd0\x43\x85" - "\xb7\xe5\xde\x76\x1b\xdd\x37\x65\xea\xad\xb9\xb9\xda\xfb\xd6\x5c" - "\x06\x7a\x74\xc2\x94\x19\x37\x15\x2c\x59\x5c\xbe\xf8\xa6\x07\xef" - "\x9f\x64\xb4\x6f\x39\xf1\xe5\x71\xda\x01\x1d\x17\x5d\xf9\xc4\xb2" - "\x0f\x54\x9d\x45\xfd\x0d\xff\x29\xe4\x1f\x56\xba\x9f\xbd\x07\xf4" - "\xdb\xba\xfd\xc3\xf3\x43\xd6\xb7\x9d\x4c\xbf\xeb\x1a\xae\xe3\x11" - "\x5b\xb9\x3d\xa3\x0e\x22\xcc\x5f\x46\xa5\x84\x59\xa8\xd7\x53\x3c" - "\x6b\x7f\x6e\x64\x69\x99\xb4\x3b\x88\x5f\x8b\xbc\x21\x8e\xdf\x84" - "\x70\xa3\x27\x8f\xc4\xab\xf9\x16\x9b\x4b\xda\x0e\x2e\x2f\xb7\x96" - "\x69\xc8\x6a\x2a\x12\x7d\x45\xa4\xc5\xb5\xc6\x39\xbc\xbe\x69\x96" - "\xf0\x21\x6e\xa5\x8c\xfb\x00\xe1\xa2\x6e\xd8\xb3\x6e\x51\x46\xf1" - "\xa5\x45\xac\x6f\x19\xa0\x65\x0a\x78\xe8\x90\xf0\x5d\x32\xff\x50" - "\xc4\x5d\x07\x7c\xb3\xf0\x3c\xaa\xe1\x84\x6d\xbb\x24\x8c\xfc\xb3" - "\xe3\xa2\x88\x44\xf6\x65\x76\xfc\x9e\x13\x58\xd9\x49\xa7\x3c\x64" - "\x0d\x21\x2d\xee\x2b\x23\x43\xf9\x11\xee\x0f\x50\x96\xad\xbb\xaf" - "\x8c\x42\x34\xbc\x47\xe2\x62\x9c\xfd\x30\xed\x5c\x26\x78\x0c\x43" - "\x4e\x6f\x77\xfb\x47\x80\xff\x7f\x33\xca\xa8\x86\xe1\xc1\x73\x07" - "\xf3\x01\x1c\x21\x2e\x03\x38\xad\x1a\x4e\x3d\x3f\xcb\xf9\xa0\x92" - "\xf3\x88\x3d\x29\x72\x6e\x43\xda\x61\xe8\x7d\x24\xc3\x2b\xd3\x5b" - "\xd1\xae\x6a\x39\x1d\xf9\xcb\x99\x46\x65\x8b\x65\x5a\x67\x72\x5e" - "\x87\xd3\x50\x47\x59\xaa\x8e\x1c\x39\x7a\x1d\x71\xfe\x48\xe6\x71" - "\x8f\x56\xfe\x11\xc0\x64\x20\x3d\x37\x05\xc7\x54\xa4\x35\x71\xbd" - "\x8d\xf0\x50\x06\xe7\xd9\x31\x4a\xb7\xff\x12\x5f\x49\x32\x7c\xce" - "\x18\xc0\x7f\xb0\x59\xe1\xfc\x04\x3a\x6d\x83\x2e\x75\x1e\xf6\x72" - "\x3f\xe7\xd8\x90\x2c\x1f\xc7\x2e\x96\x8b\x94\x87\x90\xf2\xd0\xf9" - "\xe9\x44\xde\x53\x80\xdf\x9f\x02\xdf\x06\x79\xcd\x92\xf5\xdf\x35" - "\x00\xfe\x33\xc0\x77\x26\xc3\xe7\x64\x4b\xfd\x51\x79\xf4\x7a\x2c" - "\xd7\xea\xd5\x92\x52\x26\xf3\x33\xbc\xdb\x9f\x93\xc2\xff\x25\xfb" - "\x80\xfb\xfc\x26\xd5\x46\x46\xa0\xde\x6f\x02\xde\x05\x23\xc2\xe4" - "\x40\xd8\x61\x08\xe7\xe0\xb9\x44\x74\xff\x3f\x71\xc4\xdd\x86\xb8" - "\xe7\xd0\x9e\xac\x08\xc7\x54\xf8\x92\xb7\x10\xb6\x80\x9e\x47\x05" - "\xeb\x59\x77\x3e\xeb\xd0\x78\xc4\xbf\xae\xa5\xff\x54\xc2\x03\x26" - "\xce\x7a\xd6\x95\xd0\xd9\x97\x99\x3e\xd6\x5b\x3d\x9f\x58\x21\xd3" - "\x26\x21\xed\x39\xbc\xef\xc7\xfb\x19\xbc\x1f\xc2\xfb\x01\xdf\x17" - "\xe4\xf4\xc5\x44\x87\x16\xbe\x13\xef\xe9\x78\x5f\x87\xf7\x0c\xbc" - "\x2f\xe1\x36\xc6\x3c\x87\x9f\x45\xfb\xc9\x92\x6d\x69\xa8\x51\x96" - "\xc6\xf6\x95\x88\x53\x70\x56\xa3\xfc\x40\x07\xb7\xdd\x02\xf0\xd9" - "\xc1\x65\x6a\xb8\x86\x98\xe0\xb2\x99\xe0\xb2\x18\x71\x85\x28\x67" - "\xbf\xcf\x2b\x04\xde\xbb\x46\x44\x38\x7c\x49\x03\xe4\x60\x43\x78" - "\x2d\xcb\x44\xd9\x90\x4b\x8e\x24\xd7\xed\xf0\x72\x96\x89\xae\x3b" - "\x5a\x59\x43\x8c\x65\x99\xd9\xea\x3e\xeb\xc8\x77\xd0\x0f\x5f\xda" - "\xe7\x73\x93\xa8\xd9\xef\xba\x89\xc8\x3a\xae\x9a\x32\x83\xd1\x63" - "\x34\x2d\x2a\x62\x78\xfa\xae\x27\xba\x24\x18\x6d\xa2\x6f\x12\x5d" - "\x1d\x8c\xd6\xa2\x2f\x28\xe7\xb4\x43\xd7\x92\xc5\x82\xb7\xef\x06" - "\xb2\x5a\x82\xd1\xf1\x88\xdf\x49\x63\xc9\x66\xf9\xa7\xe7\x44\x77" - "\x30\x3a\x19\xe1\x85\x54\x1c\xa3\x9c\xa9\x43\x84\x6f\x5a\x4c\x7c" - "\xf2\x4f\x43\xe2\x22\x18\x6d\x44\x7c\x29\x4d\x8b\x7d\x21\xa6\xc5" - "\xba\xf1\x7c\x8e\xe7\x13\x3c\x87\xf0\xf8\x84\x58\xb7\xdf\xd5\x87" - "\x3e\x02\x34\xe5\xf6\x89\xb2\x0c\xd0\x94\x8b\x3e\x43\x88\xac\xfd" - "\x79\xc1\xe8\x44\xe0\xb3\x12\x60\x72\xfb\xfa\x90\xb6\x7e\xff\xbd" - "\x12\x26\x6b\xff\x3d\x32\x5c\xb3\xbf\x40\xd8\xf7\xe7\xdd\x54\x4d" - "\xc3\x98\xfe\x38\x64\x16\x8c\xa2\x9f\x8e\x7e\x4a\xd3\x2a\xc2\x82" - "\x79\x18\xb1\x5a\xe0\xf7\x21\x01\xb9\x3a\xa6\x55\xf8\x44\x71\x94" - "\xec\x22\x93\x71\x77\x32\xde\x02\xe0\x7a\x40\xc3\xe5\x01\x6c\x98" - "\xe1\x18\x97\x8e\x87\x71\x30\xec\xb4\x18\xf4\x7d\xdd\x7e\x4f\xdf" - "\xba\xfd\x25\x78\xaa\xf1\xec\x41\xde\x77\xfb\x9e\x95\x72\x6c\xc5" - "\xef\x50\x0f\xea\x55\xca\x31\x46\xc3\x00\xdb\x8a\xfa\x98\xdc\x2d" - "\xe9\x3e\x40\x92\xee\xf5\xfb\x45\x8f\xa2\x3f\xae\xf1\x13\xe3\xf8" - "\x08\xea\x0d\x30\xae\x88\x4c\x3b\x70\x15\xf2\x15\xca\x7c\x35\x07" - "\x5c\xc2\x7e\x20\x37\x0e\x7d\x84\x3c\xab\x59\x96\x90\x6f\x35\xfb" - "\x49\x2c\x53\xb1\x0e\xe9\x99\x07\x72\xfb\xd6\x1d\xc8\x43\xfe\xe9" - "\x7d\x02\xb4\x64\x1d\x28\xe9\x51\x65\x16\x03\xcf\x9c\x6e\xc6\x69" - "\x3f\x50\x02\x5c\x9e\x2f\xfc\x2e\xc8\x42\xf4\x4c\x8b\xae\x8e\x16" - "\x57\x50\x86\x9b\xaa\x41\xef\x76\xf8\x63\x0b\x81\x6f\x2d\xa7\x7d" - "\x32\xad\x82\xbe\x8a\xb2\x0e\x01\x6f\x09\x97\x87\x32\x3c\xc0\xf9" - "\x34\x70\x95\x32\x4d\xbd\x7e\xca\x41\xb8\xba\x57\xd1\xd7\x10\xaf" - "\x39\x10\x88\xdb\x0f\xec\x31\xea\x8f\x92\x19\xeb\xcd\x1b\x1c\x97" - "\xa3\xeb\x4a\xac\xe6\xc0\x96\x1b\x89\x72\x1e\x8c\x88\x28\xeb\xcb" - "\x2d\xe4\xb1\xb4\x44\x9a\xa8\x38\x6a\xa7\x16\xcf\x5e\xba\x81\xd8" - "\x67\x8b\x50\x4b\xa4\x16\xe1\x8d\x78\x97\x53\x73\xe7\x4e\x62\x1a" - "\x1f\xf4\x44\x56\xc7\xec\x07\x73\x9a\x3b\x1f\x20\xe4\x3f\x04\x1a" - "\xe3\xf3\x3c\xb6\xea\x16\x4f\x84\xc3\xbe\xe6\x4e\xe8\x68\x4c\xc4" - "\xa2\x35\x07\xaa\xa3\xf6\x83\xae\x07\xcf\x89\xf0\x03\x9d\xd5\x43" - "\x10\xd7\xe7\xb0\x88\xa8\xc3\xeb\x13\xcd\x9d\x6b\x69\xde\x39\xb2" - "\x34\x97\xed\x95\xba\x3a\xcf\xe3\x21\x99\xff\x5c\xd4\x31\xb7\xb3" - "\x9a\xe6\x96\xd1\x08\xc0\x7f\xce\xba\x2b\x46\x54\x53\x53\x7b\x29" - "\x3d\x70\x26\x9a\xf1\xe0\xb9\x3e\xd1\x54\x52\x4b\xcd\x65\xb5\x2c" - "\x8f\x06\xf6\x99\x1e\x38\xd3\x25\x1e\x3c\xd7\x2d\x9a\xcb\xde\xa0" - "\xa6\x92\xbd\x34\xf5\xd3\x80\x23\xb6\xee\xc0\x96\x78\xe6\x81\x3d" - "\xf1\x75\x07\x02\xd1\x75\x07\xaa\x63\x99\x07\x73\xa2\x99\x07\x5d" - "\x62\xfd\xc1\x2d\x90\x5f\xa6\xac\x8b\xac\x83\x9b\xf0\xdb\x25\xeb" - "\xd7\x7e\xb0\x41\xd4\x1c\x0c\xf4\xad\x3b\xb8\x27\xe8\x9d\x48\x22" - "\xf3\x60\x03\xeb\xbc\x58\x77\x30\x00\xb8\x80\xd2\x91\x83\xad\xac" - "\x23\x80\x09\xe1\x09\xf7\xad\x3b\x84\xb6\x72\xa8\x00\x38\x2e\x51" - "\xf8\x0e\x4d\x63\xb8\xb8\xfd\x50\x41\xbc\xe6\x50\x89\xb0\x1f\xf2" - "\xc0\xb7\xb2\x3e\xf8\x4c\x0f\xe4\x07\xd9\x79\x21\x77\x3f\xda\x87" - "\x37\x86\x70\x8c\xe6\x3d\x43\xbe\xa0\xf7\x04\x7e\x9f\x20\x71\x70" - "\x0b\x3d\xf8\xcc\x21\xc1\x69\x0f\x3e\xe3\x13\x90\x8d\x23\x9e\x09" - "\x3c\xeb\x80\x27\x13\x78\xd6\x07\x2e\xed\x61\x9d\xaa\x09\xe4\x3c" - "\xf0\x9c\x08\x0b\x7b\xc0\x13\x1f\x4a\xb2\x6d\xc4\x0f\x0a\xa1\xda" - "\x47\x27\x74\x72\x74\x75\xb1\x97\x1a\xc4\xba\x40\x8e\xc8\x0c\x20" - "\xdf\xbb\xff\x0a\xbb\x95\x21\xa4\x8d\x79\x77\x4f\xdf\xba\x77\x5b" - "\xf1\x04\xfa\xdb\x14\xb7\xbd\x77\xf7\x7c\xd9\xf1\x43\xb7\x7f\x14" - "\xc6\x3f\xc7\xa4\xff\x84\xdf\xe8\xff\x3f\xda\xab\xfd\x3e\x11\xa2" - "\xfd\xd9\xd2\xa7\x84\x2d\xf3\x54\xd1\xd7\x4e\xd3\xd7\xb7\x80\x5f" - "\xc2\xef\x6c\xfc\xae\x9d\x76\xfd\x21\x11\xdf\x60\x9b\x80\x3a\xed" - "\x66\x5b\x23\xfc\xe3\xd9\xff\xc8\xeb\xee\x2e\xb3\x8b\x6e\x77\xb6" - "\xc8\x6a\x7e\x49\xf4\x39\xd9\xf7\x75\x20\x3c\x02\xb2\x1b\x8b\xf7" - "\xa5\xdb\xcf\xd3\x48\x3c\xce\xed\xfe\x78\x35\xdb\x52\xfc\xce\x15" - "\x2b\x9c\x59\x9b\x96\xd3\x38\x47\x84\xec\xf5\xfe\x78\x91\x63\x75" - "\x0e\xc1\xef\x1e\xc9\xbf\x85\x3f\x90\x5b\x7f\x9e\x6c\xec\x8f\xc7" - "\x87\xa3\x3c\xaf\x43\x88\xa5\x6e\xaa\x5f\x02\x7b\x83\xb1\x69\xbd" - "\x5f\xec\x89\x75\xbb\xad\x4c\xa7\x4e\x0b\xd3\x06\x3a\xaf\x00\x9d" - "\x3b\x67\x56\xe4\xd1\x7b\xf0\x11\xcc\x6c\x76\xb7\xff\xeb\x09\xfe" - "\xd3\xa4\xb7\xeb\x32\x31\x4f\x77\xda\x74\x39\xa5\x19\x7b\x8c\xe4" - "\xb6\x1c\x3b\x2f\xc2\x9b\x17\x11\xcb\xc2\xe9\x8b\x8a\xff\x03\x7b" - "\x5a\x5d\x15\xa3\x2b\xa6\x55\x5c\x25\x82\x61\x11\x08\x7a\xcf\xc8" - "\x71\x7f\x3d\x60\xaa\xa2\x22\xae\x8f\xbf\x6b\x5f\x82\xef\xb9\xae" - "\xd9\x2b\xd6\x35\x97\x77\x2d\x17\x51\xf8\x47\xed\x28\xd3\x1b\xa2" - "\x5b\xa3\xaa\x6e\x0e\x34\xc0\x7f\x68\xef\xb2\x37\x97\x03\xf7\x25" - "\x8c\xbb\xc5\x23\x02\xf1\xcc\xe6\x4a\xc0\x35\x84\xe8\x2f\xd9\xc6" - "\xb1\xff\x5a\xe0\x5c\x0b\x9c\x48\xdb\x1f\xa2\x2b\x06\xcc\x01\xa8" - "\x59\x0a\x42\xbd\xb8\xfa\x27\x37\x2c\x9a\xfa\xe8\x7f\x39\x78\xf2" - "\xcc\x93\x75\xbe\xd1\xf6\x5c\x5d\xf0\xf9\x7d\xab\x68\x0c\xea\xe1" - "\xf2\xd3\x74\xd9\xad\xe8\x87\x4f\x09\xbf\xf3\xc8\xab\x2b\x7b\x30" - "\x26\xbf\x6c\x62\x88\x76\xd5\xa6\x93\x9b\x60\xdb\x77\x5e\x74\x6c" - "\x5e\x9e\x90\xd9\x5f\xa6\x55\xc4\x05\xff\xe6\x36\x55\x8f\x78\x96" - "\x07\xf0\xac\xd5\x65\x91\x46\xfe\x36\x51\xd3\x5c\xa3\x7c\xea\xcb" - "\xda\x05\xc6\xc8\x81\x2b\xa3\xfc\xfb\x53\xe9\x33\xd4\x1c\xdc\xd3" - "\x05\x5b\xc1\xe3\x33\x8c\xef\x22\x18\x4f\xf7\x00\x67\x5b\x88\xae" - "\x0e\x69\xf3\x11\x91\x60\x74\x0a\xdb\x8d\x3d\xe9\xeb\x57\xc7\x3f" - "\xe6\x98\x86\x33\x20\xec\xc7\xf7\x56\x29\xba\x7b\xaa\x22\xa2\x83" - "\x71\xf3\xf8\xa7\x1d\x30\x3b\x50\x0f\xa2\xe6\xf8\xae\x4d\x1c\xb7" - "\xbc\x97\xe3\x3e\x82\x1e\x0b\x45\xd7\x98\x8f\x20\xb7\xaf\xc3\xc7" - "\x0d\x07\x56\xf6\xd2\xa9\x4a\xca\xe0\x71\x67\xb7\x7f\xf4\xc2\x10" - "\xdd\xd3\x20\xc7\x7e\x7e\xfa\x45\x97\x75\xe6\x4c\xc4\x55\x87\xe8" - "\xde\x46\x19\x67\xa5\xaf\x21\xbc\x25\x01\x03\x1c\x08\x37\x18\xf2" - "\xcc\xec\xb2\xde\xf0\x0b\xc4\xed\x4d\xc9\xd3\x98\x92\xe7\x98\x1e" - "\x06\x7d\x9d\xae\xe5\x92\xaf\x17\x91\xbf\x01\x4f\xb5\x56\x6e\x4f" - "\x32\x8e\xcb\xed\xc9\x38\x2e\x77\x0e\xa4\xf5\xf2\x71\x29\x79\x26" - "\xa6\xe4\x99\x3a\x90\xd6\xcb\x4b\x52\xf2\x78\x52\xf2\x54\xeb\x61" - "\x6d\x0e\x26\x17\x71\xb5\x29\x79\x76\xa6\xe4\xd9\x6b\x08\x7f\x15" - "\xe1\x04\xff\x5c\xd7\xf0\x07\x04\x8f\xab\xa1\xb7\xac\xc3\x0d\x6c" - "\x4f\x79\xce\x63\x69\x25\xdc\x8b\x75\x07\x1b\x00\x1f\xd1\xf1\xeb" - "\xba\x23\xe1\x95\xfe\x74\x28\xfd\x19\xe3\x4c\xc0\xc0\xc5\x6a\x74" - "\x45\x08\xb2\xec\xe0\xf9\xb2\x60\x64\x8a\x36\xde\x1c\x33\x87\x75" - "\x4a\x2f\xd3\x51\xa9\xf4\x86\xe7\x0e\xf4\x32\x43\xd0\x15\xee\xaf" - "\x0c\xfa\xd9\xce\x65\x69\x65\x54\xea\x65\x00\x77\x3b\xeb\x8f\x9c" - "\x2f\x01\x7e\x2d\xdf\x1e\x25\xf7\x31\x3b\x93\xe5\x31\x66\x6f\xb2" - "\x3c\xc6\x34\x1a\x65\xc8\x36\x22\x44\x97\xd7\xa4\xf3\x71\xe1\xef" - "\x78\xe0\x93\x5f\xe9\x8b\x8b\x93\xa7\xe8\x8a\x59\xd0\xfb\x0c\x7e" - "\x4b\x3f\xaa\x07\xfc\xda\x8f\x4e\x94\x3e\x54\xe5\x39\xf4\xb9\x12" - "\xf6\xab\x80\x6d\x07\xcc\xfd\x1a\xec\xfd\x6a\x4e\x4f\xbe\x87\xf1" - "\x1b\xfe\xd4\xd3\xb0\x45\x25\x61\x1f\xf7\xdb\xc7\x3d\x7a\x18\x63" - "\x12\x8c\x09\xaf\x70\x8a\x75\x47\x27\x9a\xd3\x82\x3e\x53\xd9\xd6" - "\x4e\x94\xf3\x75\xb6\x11\x90\xdf\x65\xb0\x33\x7f\xa9\x5a\x45\x5f" - "\x65\xfb\x20\x32\x9b\x6b\x95\xbc\xaf\xd8\x2d\xfc\xd5\x14\x44\x6f" - "\xe8\x59\x4e\x97\xc3\x9e\x6e\x38\x4d\x57\xbc\x53\x5c\xe9\x02\xad" - "\x18\xc7\x7e\x46\x24\xfb\x8e\xcc\xe6\x2d\xdc\x8f\xd6\x7f\xc6\x63" - "\xca\x2b\x42\xba\x6d\xc1\xef\xce\xc1\xec\x3c\xea\x2e\xac\xc6\x54" - "\x57\xce\xe2\x3a\x3a\x49\x57\x4e\x66\x7e\xd5\x5c\xe8\x95\x77\x88" - "\xf3\x62\x8e\x60\x5f\x1c\xbe\x46\x88\xae\xf4\xe0\x1d\x96\x8f\x9f" - "\x4a\xb4\x70\x08\x70\x63\xc5\xf9\x38\xc3\xa0\x0e\xae\x9c\x28\xfc" - "\x16\xb6\x71\xfb\xbb\xfd\x57\x96\x85\x68\x7c\x40\x8d\xab\xaf\x1c" - "\xcf\xb8\xd2\xd0\x10\xea\x9f\x67\xb9\xf2\x03\x57\x95\x85\xe9\x78" - "\x4d\xda\x24\xe0\xaa\xb7\xaa\xfe\x36\x0e\x5a\x77\xf8\xe3\x65\xe8" - "\x5b\xcb\xe2\xeb\xff\xb7\x57\xfe\xd6\xd2\x98\x8e\x38\xca\x37\xc5" - "\x9f\xb0\x51\x57\xad\xd2\xec\x5c\x6b\xdc\x7e\x30\xac\xd9\x67\x1e" - "\x17\x66\x9e\xa4\xab\x2a\x11\xc6\x58\xf3\x2a\xd7\xaf\xe2\x61\xeb" - "\x3b\xe5\x7a\x17\x71\x55\xa5\xc9\x93\x8f\xa7\x08\x4f\xa9\x16\xf6" - "\x48\x1e\xba\x4a\x31\x4e\xbb\xaa\x32\x9e\x09\xf9\xd4\xb0\xbc\xae" - "\x2a\x10\x5d\x63\xad\xfa\xef\xfa\xbf\xf3\xdc\xc0\x55\xd0\xff\x2b" - "\x2b\xd3\xd6\x47\x82\x56\xd7\x9d\x06\x5a\x43\x06\x5a\xed\x27\xc9" - "\x35\x41\xa3\xb5\x29\x99\x56\xd7\x04\x3c\xe8\xd2\x5c\x63\xf0\x8c" - "\xd3\xc2\x86\xe7\xaa\x30\xca\x47\x5d\x5c\xd1\xa3\xea\x84\xe3\x50" - "\x06\xcb\xe2\xef\x64\x8f\xf7\x15\x11\xcf\x8f\x72\x3c\xcb\x93\xe3" - "\xe3\xf0\x83\x10\xce\x41\x7a\x0e\xeb\xca\xe6\xb8\xd2\x05\x73\x9f" - "\xc2\x55\x94\xf0\xbd\xe0\x7b\xb2\xfe\x76\xd2\xd5\xa5\xd0\x71\xf0" - "\xf1\x9f\x5e\xd5\xd7\x5c\xbd\x80\xc3\x68\x5b\x7f\xc1\xef\x92\x66" - "\x48\xaf\x77\x7d\x53\x7e\x9f\x95\x86\xf5\x5a\x29\x2f\xba\xc9\x36" - "\x27\x9a\xd5\x58\x18\xec\xd8\x4b\x2d\xd1\x7f\x25\xd7\x93\x12\xc7" - "\xac\x60\x19\x6c\x55\x85\x88\xbd\xd9\xbb\x0b\xe3\xb9\xcf\x03\xe8" - "\x9b\xaf\x3a\x4d\x57\x4b\xfa\x7f\x74\x12\xdc\xcd\x93\xb8\x15\x3f" - "\xd9\xb6\x09\x9b\x1e\x87\x7d\x39\x25\x22\xf0\xe3\xb2\x36\xf6\xd2" - "\xb8\x57\x56\x52\x6e\x5d\x2f\x8d\xdd\xd1\x4b\x6e\xf1\x57\xb7\xb5" - "\x0e\xfe\xd9\xbc\x73\x39\x04\x1d\x2a\x1a\xe1\x21\xfb\x8e\x95\xf0" - "\xd3\xa2\x64\x89\x6d\x84\x9f\x16\x85\x9f\xf6\xb9\x9b\xdb\x52\xc2" - "\x4f\xeb\xeb\x63\x3f\xad\xb9\x87\x61\xd0\x06\x7b\x86\x97\x91\x25" - "\xbb\x84\x72\x40\x9f\xef\x33\x72\xbd\x9c\xdd\x0e\x1f\x11\x3c\x87" - "\x34\x7e\x21\xb3\xdd\x8e\x32\x1a\x26\x79\x45\xfb\x16\xeb\xfe\xd3" - "\x9b\x6e\xdd\x83\x6d\x6d\xe0\xca\x08\xcf\x47\x33\x0f\x6f\xf1\x5c" - "\xed\xde\xd1\x3d\xb6\xa5\x75\xa2\x87\xe3\xcb\xaf\x16\x3d\x88\xdf" - "\xca\x65\xef\x41\x7c\xb7\xff\xea\x40\xc8\xfa\xd6\x89\x8b\x99\x6f" - "\x67\x7f\x42\xae\x89\xc8\xbe\xe3\x1a\x4a\xe9\x7f\x60\x33\xae\x19" - "\xa9\xdb\xdb\xf2\xab\xc9\x59\xee\x12\x1d\x83\xcc\x49\x47\x74\x3f" - "\xef\xf0\x18\x99\xb7\x20\xe1\x77\xa8\xb5\x15\x52\x3e\xc3\x35\xb2" - "\x0d\xb3\x4f\xc0\x7d\x0c\xfb\xc1\x3c\x87\xaa\xe6\xbd\xae\x59\x6b" - "\xf0\x55\xb8\x8f\x89\xec\x5d\xd9\x63\xe3\xfc\xcc\xa7\x96\xbf\x34" - "\x9d\x3d\xe7\xb5\x1e\xf8\x22\x5b\x5b\xea\x88\x5a\xe0\xf2\x35\xd7" - "\xe5\xc1\x3f\xea\x95\xbe\xe8\x49\xba\x46\xce\x99\x07\x16\xf5\x12" - "\xff\x0e\x56\xde\x45\x41\xc0\x28\x7b\x7a\xed\xd8\x46\xaf\x9a\xff" - "\x6b\xf4\x9c\xe5\x75\x1f\x11\x58\xc2\x76\xe7\xda\x87\x0e\x57\x86" - "\x41\xd7\xb5\x63\xf4\x39\xe9\x10\x5d\x5b\xc0\xe5\x77\xd5\x1c\xdf" - "\xc2\xf3\x7b\x72\xce\x2e\x32\x81\x61\xf2\x42\x74\x4d\x62\x2d\x09" - "\x7e\x2c\xec\xde\x35\x3d\x83\xd0\x9a\xa3\xfa\xac\x6b\xbd\xc9\xfe" - "\xc5\x10\xf4\x73\xd7\x6e\x48\xee\xe7\xae\xad\x4b\xee\xe7\xae\xdd" - "\x9d\xec\x5f\x58\xe1\x5f\x5c\x1b\x48\xc9\xd3\x9a\x92\x27\x64\xc8" - "\xb3\x45\x2b\x27\x92\x9c\x67\xac\x2d\x39\xcf\xd8\x91\x86\x30\x78" - "\x1c\x3b\x56\xaf\x9f\x2e\xb9\x5e\x31\x76\xbc\x21\x6c\xad\x95\x6b" - "\x7a\x63\xf3\xf5\x38\xf4\xa3\x04\xff\x30\xc2\x3a\xa1\xe1\x2b\x4d" - "\xd1\x31\x86\xf7\xa6\xd0\x50\x93\x42\xc3\xd6\x84\x4f\x03\xfc\xa8" - "\xaf\x77\x4f\xd1\x75\x1e\xa9\x43\xec\xd3\x55\xd1\x34\x0e\x03\xd7" - "\x56\xc0\x43\x0e\x63\x8f\xa4\xe0\x6b\x4b\xc1\xd7\x61\x08\xe7\x20" - "\xdc\x63\xe0\x21\x27\xc3\x49\x16\xe8\x0b\xc6\x14\xd7\xe5\xe8\xf1" - "\xec\xdb\x82\xde\x0e\x9f\x5c\x2b\xca\xe3\x35\xa9\x4b\x4f\xd2\xd8" - "\x18\xfb\xc1\x0a\xe7\x75\x46\xff\x8f\x14\x5f\xd7\x15\x24\xd3\x71" - "\x5d\x49\x32\x1d\xd7\x79\x0c\x7c\x45\x1c\xab\xe9\x21\x47\x74\xfa" - "\x2c\xf6\x93\x79\xdd\x90\xfd\x55\xf8\x6d\x4e\x94\x99\xc3\xeb\x60" - "\xa7\xca\x29\x23\xe8\xed\x80\x1f\xd2\x1c\x49\xab\x4f\x59\xc7\x1b" - "\xb4\x75\x14\x17\xf0\xb7\xea\xfa\x88\xdf\x18\xff\x5e\x3b\x47\xda" - "\xe0\xf5\x47\x03\xc2\x57\xb4\x15\x72\x44\x5f\xfe\x8d\xf7\x54\x7f" - "\x72\x7c\x2f\xb7\x45\xf8\x4b\x1d\xb0\x33\xd9\x6a\xbe\xfa\x1b\x39" - "\x06\x7d\x8e\xb8\x56\xde\x2b\x4e\xd2\x37\x3e\x60\x3b\xc4\xfe\x1f" - "\xfb\xfc\x87\x23\x61\xf4\x0d\xa7\x89\x69\x46\x5a\xab\x96\x2f\xdf" - "\x90\x2f\xcc\x6d\x8a\xe1\x39\xed\x96\x28\xd9\x38\x0f\x70\x8c\x94" - "\xe3\x01\xe0\x3b\x8c\x36\x8a\x3c\x95\x7a\x1e\xc0\xca\x3c\x8e\x72" - "\xb2\xdd\x5c\x49\xb6\xc0\xca\x93\x12\xb7\x56\xdf\x1d\x1b\x21\x97" - "\x60\x65\x07\x7c\xc3\x36\x1e\x53\xdb\x02\x55\x27\x19\x4f\x6b\x46" - "\x0f\xd9\xbb\xd6\x1d\xc7\x98\xe1\x1b\xad\xb1\x75\xc7\xb7\xc6\x6b" - "\x8e\xef\x09\xd1\x75\x3d\xd0\x3f\x53\x9b\x65\xbe\x46\x48\x8e\xcd" - "\xfe\x78\x5b\xa0\xaa\x9d\x71\x46\xb9\xdf\x0d\x3a\xa3\xd4\x52\x17" - "\x45\x3f\x43\x39\x72\xad\x10\x63\xdb\x60\x03\x7c\x53\x8c\xdb\x8a" - "\xbd\x94\x07\x5f\xa3\x4d\x24\xf2\x45\x90\xef\x9b\xe3\x99\xd6\xb5" - "\x1c\x8f\xfc\xb0\x99\x61\xf6\x65\xd3\xf4\xeb\x0e\x86\x0b\x5c\xc3" - "\x7d\xfb\x37\x17\x2a\xdf\x86\xf2\xe1\xcb\xb4\x99\xae\x9f\x59\x29" - "\xd8\xed\xff\xe6\xae\x10\x4d\xca\xd7\x75\xed\xf0\x56\x59\xdf\x18" - "\x83\x7e\x13\xed\xff\x1b\xe1\x74\x3e\x84\xa6\x97\x1e\xc0\x0e\x03" - "\x6c\xe7\x60\xb0\x4c\xf7\x61\xf0\x2d\xd6\x37\x95\xbc\x5a\x95\x3b" - "\x44\xd3\x29\xf4\xe5\xee\xb1\x7a\xbe\x2f\xc3\x1f\xdb\x63\xb6\x09" - "\xe8\x17\x22\x6a\x2e\xfa\xfa\x97\x79\xed\x12\x78\x30\xfe\xfb\xe6" - "\x16\x8d\x87\xaf\x20\x8c\xfa\xff\x66\x8f\xbe\xee\xc5\x7d\xdf\x52" - "\x0f\xfa\x04\x67\x04\xba\xe1\xde\xaa\xa7\xc9\xf1\x05\xa7\x61\xfc" - "\x72\xd8\xd9\xce\x69\x7b\x13\x69\x9c\x8f\xe9\xf6\x46\x39\xbe\x49" - "\x8f\x57\x76\xcb\x7d\x22\x25\xdc\xa9\x87\xf1\x1b\xed\xff\x9b\x25" - "\xfa\x7a\x3d\x74\x8e\xe7\xeb\x2d\x27\xe9\xfa\x59\x3b\xa4\x3d\xbb" - "\xde\xa9\xa7\x33\x5d\xbe\x9f\x8a\x30\xcf\x3d\xc6\xb3\x9a\x4a\xa4" - "\x9d\x47\x9e\x37\xcf\xf6\x0c\xc1\xd8\xd2\x22\xfa\xca\x88\xe3\x18" - "\x0f\xf7\x6b\xd0\x77\xee\xdb\x3a\x81\x2b\xbb\x9e\xf5\x1a\xf5\xba" - "\x22\x4a\x63\x3c\xf7\xf0\x18\xe2\xfa\x22\xa9\xd3\x7e\xa9\x3f\x82" - "\xf1\xc1\x27\x90\xb8\x19\xdf\x26\xee\x33\xbb\x78\x0d\xec\x7a\xe6" - "\xbf\x29\xfd\x9c\xcd\xf5\xfb\x0c\xb2\x1c\x82\xf0\x91\x64\x5e\xaf" - "\x6f\x4b\x09\x77\xe8\x61\xc8\xab\x5a\xe9\xde\xf5\x27\x54\xda\x0d" - "\xb6\xc1\xca\x62\x7f\x01\x30\xee\xe4\xf2\x6e\x98\x90\x8c\xff\x86" - "\xfc\x94\x70\x91\x1e\xae\x95\xeb\x13\x37\x94\xe9\x65\xc8\x3a\x83" - "\x8e\xed\xac\x0a\x0f\xf9\x72\xfa\x73\xe3\x3b\x4a\x7f\x6e\xd8\x6d" - "\xa0\x61\x28\xc2\xfb\xfb\xeb\xf3\x86\x23\x3a\x7e\xfc\x3e\x66\x80" - "\x43\x1b\xb9\xa1\x3d\x55\x5f\x96\x7a\x59\xcf\x58\x67\x6e\x24\x93" - "\xb4\x1e\x2d\x6d\x8c\xb9\x9e\xdd\x38\xde\x10\x1f\x56\xbe\xc4\x8d" - "\x2f\xeb\x7d\x93\x5c\xdb\xf3\x15\x5a\xa4\x8f\xf3\x92\xd2\x0b\xe8" - "\x43\x44\xea\x85\xdc\xbb\x72\x63\x79\x2a\xde\xc0\xca\x68\x3f\x8e" - "\x7e\x9c\x93\xd5\x5a\xdc\x8d\x3b\xfb\x79\xbb\x11\xf6\xed\xfa\x9d" - "\xba\xde\x2a\x3f\xfa\x86\x86\x74\xfe\x06\xe0\x43\xc9\x32\xbb\x31" - "\xdc\x2f\xb3\x1b\xa3\xfd\x78\xc7\xd9\x0d\x70\xff\x81\xb0\xb3\x1f" - "\x6e\xdc\xd8\x0b\xe9\x87\xda\xef\x33\x6e\x6a\x72\x59\xe3\xe6\x18" - "\x70\x94\x19\xca\x2a\x37\xc0\xb5\x21\xbc\x36\x7d\xfd\x8c\x6b\x48" - "\x5f\x3f\xe3\xf6\x9b\xd7\xcf\xb8\x63\x86\x72\x43\x17\xd6\xed\x9b" - "\x6c\x06\x7a\xea\x11\x1e\x99\xac\xcb\x37\x8d\x4d\x09\x27\xea\x5f" - "\xa0\xfd\xee\x5c\x99\x37\x84\xe3\xe1\x2b\xe7\x28\x5d\xbf\xa9\xd0" - "\x98\xfe\x66\xaf\x4a\x67\x1a\x79\x0e\x44\xce\xfd\x29\xb8\xca\x54" - "\x38\x86\x31\xa4\xd7\xe9\xb4\xaf\x45\x38\xd5\xbf\x4f\xd8\x6d\xad" - "\x1f\x0a\xc6\xb9\x1f\xba\x69\xbf\x1a\x03\x37\x97\x08\xff\xa1\xa2" - "\x74\x7d\x0a\x70\xc3\xfe\xdd\xb4\x47\xcd\x01\x35\x97\x40\x8f\x7a" - "\x4f\xd1\xcd\x3f\xc6\xbb\x0f\xef\x65\xc9\x7d\xdb\xcd\x39\x18\x7b" - "\xcf\xa8\xf7\xa7\xf6\x79\x37\xbb\xe1\xbf\xf4\x3a\xa2\xd5\x45\x26" - "\x69\x93\x85\x3f\x63\xba\x49\x3c\xcf\x21\xf4\x86\xe8\xe6\x2d\x4c" - "\xa3\x21\xbe\x5c\xf8\x47\x14\x32\x7c\x88\xcb\x43\x1e\xf3\xf9\x81" - "\xe6\x92\xa5\x97\x91\x13\x74\x7e\x71\x8a\x6e\xb9\x7e\xa9\x53\x8e" - "\x83\x41\xf3\x2d\xab\x52\xca\x69\x4c\x43\xf3\x09\xd0\xfc\x45\x1a" - "\x9a\xa5\xdf\x2e\xac\xa0\x7b\x40\xff\x7e\xcb\x48\xd0\xfd\x85\x94" - "\x6b\x72\xfc\x38\xdf\xcb\xc4\xf4\xca\x3c\x33\x2a\xfb\xeb\x43\x4b" - "\x9f\xea\xd8\x4a\x05\x03\xcb\xba\xa5\x54\xf8\x87\xcd\x08\xd1\x2d" - "\x75\x7a\x7f\xa0\xc5\x57\x2a\x1a\x20\x0b\xab\x94\x45\x23\xe7\x4b" - "\x57\x8f\x7a\xdb\x63\x39\x74\xfb\x6f\x41\xff\x77\x73\x9d\xde\x67" - "\xa2\xbf\x0c\xb3\xac\xb4\xb4\x8e\x94\xb4\x9e\xfe\xb4\x5c\x5b\x52" - "\xda\xaa\x44\xfc\x18\x3d\xfe\x02\x75\x01\xf9\xe7\xbe\xc3\x79\x92" - "\x79\xcc\xcd\x37\xaf\x83\xdc\x12\xd4\x41\x9f\x79\x1d\xe4\x56\x9a" - "\xeb\x4d\x6e\xad\x78\x9e\xcc\x70\xed\x46\xbd\xf4\x71\xbd\x70\x3d" - "\x0c\x94\x7f\x6e\x93\x2e\xff\x0b\xf0\x10\x3b\x45\xb7\x2e\xeb\xd7" - "\xa7\x5b\xdf\x49\xc6\x73\xeb\x48\x73\x5e\x6e\x1d\x07\x5e\x62\xe6" - "\xbc\xdc\x9a\x6f\xce\xcb\xad\x68\x9b\x14\x1b\xa8\x4b\xb7\x7a\x11" - "\x6f\x06\xbf\x45\xf8\x4d\xf1\xef\x62\xdf\x21\x44\xb7\x9e\xe0\x39" - "\x21\x43\x7c\xa0\xbf\x2d\x81\x6e\xe4\xe1\xf9\xa2\x40\xd5\x6d\xc4" - "\xf4\x9c\x72\x91\x75\x30\x79\x80\xff\xcf\x4f\xd1\x6d\xab\xe3\x56" - "\xcb\x4e\x25\x8b\xdb\x6f\x4d\x2e\xf7\x36\x97\xb9\x2c\x6e\x9b\x00" - "\x59\x7c\x6e\x2e\x8b\xdb\x0a\xcd\x65\x71\xdb\x42\xf0\xfc\xf9\x40" - "\x59\xdc\xb6\x56\x97\x05\xc6\x93\x0e\xb1\xad\x58\xdc\xec\x21\x3b" - "\xf8\xcc\x71\xa0\x8e\x15\x5c\x27\xc3\xed\x76\xf4\xa8\xfa\x75\x2d" - "\x21\xfb\x67\x74\x5b\x9d\xdc\x47\xb2\x6d\xb6\x18\x11\xa6\x61\x0c" - "\x1f\xf4\x7e\x1e\x08\xa2\xa7\xe3\x31\x7d\x4a\x19\x1d\xe6\x6d\xf3" - "\x76\x96\xd3\xf3\x26\xf1\x4e\xb5\x1f\xe3\xf6\xa9\xc9\x6d\xf6\xf6" - "\xdc\x7e\x79\x43\x36\xc8\x63\xd8\x2f\x3b\xe8\x33\x78\x1d\x8c\xbf" - "\x5a\xc9\x7f\xfc\x90\x14\x3a\x1a\xcc\xe5\x7f\xfb\xbe\xf4\xf2\xbf" - "\xfd\x98\xb9\xfc\x6f\xe7\x39\x9a\xcf\x43\x34\xde\x95\x6c\x8f\xc7" - "\xdb\xfa\x79\xba\x9d\xf7\x9b\x38\x84\x7f\xe8\x57\x39\xfc\x65\x79" - "\xd3\x1f\xe0\xb7\xd4\xbf\x42\x90\xa9\xe5\xea\xff\x4a\xfe\x74\xcf" - "\x96\xd1\xe6\xeb\xa1\x18\x2b\x90\xeb\x4a\x1e\xe7\x8e\xff\x14\xba" - "\xd3\x86\xdf\xd6\x53\xf4\xad\x8d\x71\xbf\xb5\x52\x93\xed\x27\xa7" - "\xe8\x8e\xf9\x4a\xb6\xdf\x7a\x3a\x59\x1e\xe3\xa3\xe6\xb2\xbd\x63" - "\x24\x64\xfb\x89\xb9\x6c\xef\xc8\x4d\xdf\x6f\xdc\x31\x15\xfc\x7f" - "\x32\x50\xbf\xef\x28\x55\x79\x68\x0d\xe7\x51\xfb\x42\xef\xf8\x88" - "\x61\x94\x1e\xdf\x71\x80\xd3\x59\xe7\x0d\x79\xb6\x02\x57\x51\xbf" - "\xae\xdf\x51\xab\xe1\x30\xe2\xdd\xef\x08\x9b\xe9\xf4\x1d\x72\x5d" - "\xef\xe6\x88\x94\x4f\xd1\x0e\x2e\x73\x39\xd1\x67\xf4\xad\xeb\x19" - "\x8e\xe3\xaf\x75\x1a\x75\xfa\x5b\x36\x1d\x8e\x6d\x8c\x82\xbd\x23" - "\x2a\xb6\x95\x11\xc3\x25\xe3\xfe\x96\xc6\xff\xb0\x19\xf5\x1a\x3c" - "\xc3\xa5\xc0\x14\xaa\xb6\xf3\xad\xad\xc9\x6d\xe7\x5b\x0b\x93\xfb" - "\xbb\xf1\x3c\xde\x72\xc4\xfd\x16\xf8\xbc\xe3\xdb\x41\xc3\x97\xd6" - "\x97\x41\xda\x12\xea\xfb\xdb\x4f\xab\xfa\xfe\xf6\x43\x29\x74\x75" - "\x9a\xd7\xf7\xb7\x6d\xe9\xeb\xfb\xdb\x2e\xf3\xb6\xf4\xed\x09\x5c" - "\xd7\x21\xfa\xf6\xc2\xe4\xb6\xf4\xed\x82\xfe\xb6\xf4\xad\x4e\xd5" - "\x96\xe8\x92\x8b\x69\x0b\xf0\x15\xd2\xb6\x3d\xbd\x7d\x7d\x59\x99" - "\xa0\x3d\x30\x4d\xd2\xd7\xc1\x18\x7f\x02\xcb\xa8\xc5\x29\xf7\xbc" - "\xfb\x4e\xd1\x84\x0a\x9e\xc7\x55\xb2\xba\xf3\x8e\x64\xfe\x26\x38" - "\xcd\x65\x35\x21\x17\xb2\xf2\x99\xcb\x6a\xc2\x54\x73\x59\x4d\x28" - "\xe5\x3d\xbe\x03\xdb\xc5\x84\x4a\xb6\xfb\xa0\x91\xf7\x50\xb4\x7d" - "\x46\x13\x9a\xa5\xfd\xef\x2a\x16\xd0\x3b\x13\xfb\x3f\xa1\xdf\xfe" - "\x8f\xe6\x36\x31\x41\xfa\x53\xa2\x0b\xf6\x7f\x2b\x0d\xe3\xbe\xa0" - "\xbf\x0f\xc8\x35\xe9\x03\x26\x74\x9a\xf7\x01\x77\xda\xcc\xfb\x80" - "\x3b\xc7\x28\x3d\xbe\xb3\x20\x59\x8f\xef\x1c\xdf\x5f\xc7\x90\xd3" - "\xff\x4c\x1f\xb0\xf9\x14\xdd\x95\x89\x7e\xb8\x5a\xd5\xc7\x5d\xbf" - "\x4d\xa1\x65\x97\x79\x7d\xdc\x19\x40\x7d\x6c\x36\xaf\x8f\x3b\x4f" - "\x98\xd7\xc7\x9d\x3c\x7e\xda\x3c\xb0\x3e\xee\xca\xfe\x72\xfd\xf0" - "\x5d\xe3\x93\xfb\xe1\xbb\xc6\x7e\xf9\x7e\xf8\x2e\x8f\x79\x1d\xdc" - "\x55\x63\x5e\x07\x77\x35\xa8\x3a\xb8\xeb\x58\x72\x1d\xdc\xb5\xaf" - "\xbf\x0e\x20\x9b\xff\x7e\x1d\x94\xaa\xf5\xdd\xef\xdc\xd1\x25\xe7" - "\xcf\xbe\x33\x2e\x44\xdf\x89\xa8\xf5\x80\xef\x74\xa8\x39\x54\x59" - "\x4f\x6f\x02\xc6\x35\xd0\x16\x7f\x27\x5f\x8b\x7b\x64\x60\xbf\xf0" - "\x9d\x52\xd8\xc9\xce\xc6\x4a\xb9\xd6\xa3\xea\x09\xf2\xdd\x0c\x38" - "\x35\x17\xf0\x9d\xb5\x9c\x17\xf5\x28\xf8\xbb\x14\xb6\xad\x80\x8f" - "\x30\x9e\x46\x57\x2c\x45\x7e\xdf\xd9\x73\x31\xfd\x66\x3a\x5e\xd9" - "\x3f\x3c\x45\xf7\xcc\x67\x98\x38\xf3\xb5\x9c\xea\x4f\xd1\xc4\x8d" - "\x78\x43\xf7\xee\xb9\x2f\xb9\xcc\x89\x63\xcd\x75\x6f\xe2\x44\xd0" - "\x5c\x6f\xae\x7b\x13\x8b\xd2\xf7\x93\x13\xe5\x9e\x54\xe8\x58\x7d" - "\x5c\xf9\xf2\x97\xce\xab\x0c\xa5\xf8\xf2\x13\xb7\xea\x7d\x5b\x57" - "\x26\xea\x66\x39\xcb\xfd\xee\x9b\x34\xfa\xae\x4b\x81\x6d\x54\x65" - "\x59\x66\x98\x94\x15\x02\x8d\x6f\xa6\xa1\x31\x6a\xde\x3e\xee\x1e" - "\xa9\xd5\xe5\x9b\x22\x33\xb5\x8d\xdc\x0d\xff\xcf\x6c\x6c\x72\xb7" - "\x5e\xff\x45\x92\x86\xa4\xfa\xbd\xbb\x34\xb9\x7e\xa9\xa8\x1c\xe3" - "\x35\x13\xb8\x0d\x46\x38\xde\x8b\xc3\xb0\xac\x03\x26\xb0\xfb\x52" - "\x71\xa6\x81\x0b\x0d\xd0\x2d\xde\x9b\x61\xaa\x5b\xf7\x64\xab\xb6" - "\x76\xcf\xc2\xe4\xb6\x76\xcf\xd8\xfe\xb6\x36\xb1\x31\x25\x4f\x5e" - "\x72\x9f\x3e\x71\xac\xec\xd3\xa1\x53\xf8\xbd\x97\xeb\xed\x7f\xc0" - "\x36\x1e\x3a\x45\xf7\x6a\xfe\xf1\xbd\x29\xf3\x15\xf7\x04\xcc\x75" - "\xf3\x9e\x36\xf0\x7c\xc8\xbc\xde\xef\x89\x98\xd7\xfb\xbd\x6c\xff" - "\x0e\x69\xe3\xcb\x4b\x67\x54\xe6\x0d\x4b\x49\x1f\x67\x6e\xbb\xee" - "\x4d\x33\xff\x71\xef\x1c\x25\xcf\x7b\xb7\x24\xcb\xf3\x5e\xc3\xfc" - "\x07\xe8\xff\x9f\xe9\x3f\x82\xa7\x28\xef\x7e\x25\xa3\xfb\x6e\x4a" - "\xa1\xa3\xdd\x5c\x46\xf7\x46\x21\xa3\xa0\xb9\x8c\xf2\x9c\xe9\xdb" - "\x6f\x1e\xfa\x3f\x0a\x0e\xec\x3f\xf2\xa6\xfa\xb6\xcb\xf9\x11\xd9" - "\x0e\x67\x44\xe1\x7f\xfa\xf5\x74\xee\x37\xf2\x78\xfc\x27\x1c\x63" - "\xa8\x20\xb8\x35\xca\x7b\x90\x72\x18\xae\xb8\x32\x75\x9d\x24\x4f" - "\xf9\xba\x7e\x41\x0e\x6f\x02\xd6\xae\xc3\xa6\xe0\xe4\xfe\x4f\xe8" - "\x70\x6a\x5e\xa6\x3a\xc5\x96\xe4\xb5\x9b\xd7\x5b\x5e\x9a\xf6\x7f" - "\xdf\x48\x55\x6f\xf7\xa5\x8c\xfd\xee\x1b\x97\xac\xeb\x90\xeb\x45" - "\xd4\x1d\xaf\xa3\x98\xd6\xdf\x9a\xd9\x6d\x9e\x2a\xba\xf2\x34\xdd" - "\xf7\x37\x89\x1f\x61\xfe\x1e\xaa\x38\x4a\x56\xb1\xe6\x29\xe8\xb1" - "\x85\xea\xfd\xa2\x67\xb3\x55\xb4\x6e\xf6\x8b\xd6\x60\xf4\x2c\xfb" - "\x6c\x5f\x3d\x49\xf7\xfd\x56\xd1\x27\x7a\x94\x2c\xee\xdb\xc3\xb0" - "\xdd\xfe\xfb\x3a\xf4\xf9\xbe\x74\xe5\xf1\xfe\x6c\xc6\x3d\xf8\x1c" - "\xef\x77\x73\x21\x83\xb5\xfa\x5a\x2e\xc2\x79\xfd\xfb\x8b\xbe\x3b" - "\x15\x69\x5f\xea\xbb\x4e\xc0\x7a\x8d\x78\xd4\x37\x9d\xdf\xdd\xa0" - "\xef\x11\xc2\xef\xad\x17\xc0\xa5\xd3\x13\x48\xa1\xa7\x15\x7d\xff" - "\x5a\x0d\xc7\x89\xc1\x70\x70\x3d\x29\xfd\xe2\x7a\xfc\x6e\x64\xb0" - "\x79\xa2\x0c\x27\x15\xbc\x30\x40\xe7\x27\xb9\x59\xd6\x8c\x23\x5d" - "\x1b\x54\x7d\xea\xe4\xcb\x54\x1b\x9c\xf4\x45\x4a\xfe\x32\x35\x77" - "\xa8\xfa\xa8\x79\xd1\x54\x1d\x9d\x54\xe3\x88\x98\xe9\xe8\xa4\x06" - "\x5d\x47\xe1\xf3\x32\xde\xe3\x29\xe9\x01\xa5\xab\x93\x9d\xe8\x27" - "\x0d\xe3\x90\x49\x72\xfc\x20\x2e\x55\x6d\x31\x04\xb8\x94\x7c\x3d" - "\xc9\xba\x3c\xa9\x6c\xb0\x79\x58\x8d\xb7\xb7\x14\x6f\x53\x7e\x9c" - "\x8c\x6b\xf2\xe4\xc1\x79\x9b\x5c\x6a\xce\xdb\xe4\xca\x64\xde\xa6" - "\x3c\x93\x92\x2e\xfd\xfb\xae\x01\x7d\xf0\xe4\xbd\xba\x9f\xea\xba" - "\x86\xfd\xcf\x29\x43\xa4\xbf\x5a\x5f\x2c\xc6\xba\xcc\xfc\xd5\xc9" - "\xed\x09\x7f\x55\xc2\x4f\x56\xfb\x5e\xeb\xe1\xaf\x36\xa4\x8e\x1b" - "\xf2\xe8\x70\x34\xd5\x67\x9d\x32\xd6\x51\x67\x46\xff\x94\x89\x9a" - "\x8d\x7c\x7e\xa0\x8d\x9c\x52\xa4\xea\x65\xca\x9e\x64\x1b\x32\xc5" - "\x93\x5c\x2f\x93\xeb\x52\xf2\x6d\x49\xae\x97\xc9\x93\xff\xab\xfd" - "\x03\x0f\x12\x33\x32\x32\xac\x19\x16\xab\x25\x03\xc9\x60\x93\x86" - "\x65\xd8\x32\x86\xe0\x19\xaa\xbd\x87\x59\x33\xac\x36\x3c\x43\xb4" - "\xf7\xd0\x94\xf0\x30\xce\x8b\xc7\xa6\xbd\x87\xa4\x84\x87\x5e\x20" - "\x7d\x98\x56\xae\x5e\xbe\x2d\x25\x3c\xe4\x02\xe9\x43\xff\x9b\xf9" - "\x69\x40\x38\x79\x9f\xd4\xfd\x8b\x96\xcf\x5f\xf8\x44\xa9\x6b\xc5" - "\x92\x27\xca\x17\xb8\xe6\x7f\xff\xfb\x0b\x96\x2e\x75\x95\x2f\x76" - "\x7d\xf7\xbe\xe9\xb7\xdd\xe5\xca\xf5\x5e\xe7\x1d\xe7\x5a\x78\xf7" - "\x75\xa5\x59\xf4\xc0\x8a\x25\x9c\xf0\xc0\x8c\xfb\x8b\x5c\x05\xdf" - "\xbd\x2f\x39\x51\x47\xb3\x64\xc1\xfc\xd2\x41\xb1\x18\x6c\x5a\xde" - "\xba\x51\x44\x1b\x47\x49\xdb\xd6\xde\x8c\x51\x8e\x1a\xab\x3f\xb6" - "\xa0\x69\x27\x91\xe8\xf5\x89\xc0\x35\xbc\xe7\xe2\x7b\x6f\x33\x13" - "\x37\x35\x54\x93\xe7\x71\xfe\x8e\xe1\x7b\x1f\x88\x83\x61\x72\xfd" - "\x33\x59\x4f\xd2\xea\xcc\x46\x78\x9d\x1c\x0e\xb6\x47\xc9\xe5\x23" - "\x3b\xf2\x5f\x82\x34\x8b\xb8\x27\x8e\xb8\x88\xb6\xb7\xf2\x9f\xdf" - "\x93\x71\x07\xab\x75\x38\xc7\x29\xca\xaf\x10\x07\x85\x0c\x8b\x7b" - "\xb6\x68\x70\xf9\xf7\xc7\xfd\xdf\x93\x6b\xb2\x2f\x5f\x4a\xf6\x97" - "\x47\x89\x13\x75\xcf\x93\x6d\xc7\xf3\xbc\x0e\x96\x3f\x31\x64\xfd" - "\xd7\xdd\x6c\x5f\xd7\x21\x3e\x44\xab\xed\x5c\x36\xc3\xc6\xad\xdf" - "\xbb\x8d\xe1\x25\xec\xa5\x44\x9c\x0f\xf0\x0b\x93\xe1\xf3\xf3\xac" - "\x80\x9d\xf6\x29\x39\x7a\xb2\x1a\xf3\x83\x95\xd5\xe4\x88\x89\xbf" - "\xdf\x9c\x4f\x96\x16\x8c\x7e\x2a\xa2\x22\x1a\x58\x72\x9a\x69\x38" - "\xe0\xa8\x10\x7f\x0f\x46\x88\x1e\xe8\xf4\x89\x4d\x67\xc8\x86\x31" - "\xa8\x25\xb0\x84\xf7\x92\xe4\xef\xdc\xf1\x05\xd9\x20\x87\x31\xa7" - "\xe9\xfe\x63\x95\x0f\x88\x98\xef\x01\xb2\xbd\xef\xad\x26\xb1\xbe" - "\xf9\xa5\x4d\x1f\x92\xed\x97\xbd\xd5\xd6\x5e\xe1\xa4\xca\x72\x5e" - "\x9f\x10\xe4\x8b\x88\x1e\x5e\x6f\x6f\x2a\x89\x31\xcc\x0f\xba\x7d" - "\x4e\x6a\x29\x8f\xd0\xaa\x13\xa2\xa7\xe6\x43\xb2\xf3\x5c\x57\x73" - "\x67\x84\xbf\x2b\xb7\xaf\x7a\x80\x32\x4e\x15\x91\xb5\xb9\x6c\x2b" - "\x05\xe7\x44\xa8\xf2\x84\xe8\x68\x2a\xf9\x94\x5a\xca\xf6\x50\x71" - "\x1b\x59\x9b\xda\xff\x44\xf2\x5b\xe9\x4d\xb6\x82\xaa\x73\xe4\x5c" - "\xf5\x04\xc7\x9d\xa3\x95\xab\x68\xf8\xca\x8f\xc8\x11\xec\x68\x43" - "\x39\x67\xe8\xd1\x63\x64\x01\x3e\xeb\xb3\x7f\x22\xe7\xb3\xb3\x78" - "\xbf\x66\x1e\xd5\x55\x91\x53\xf8\xdc\xd9\xbd\x3e\x77\x4e\xaf\x70" - "\x5f\xda\xed\x73\x8f\x6c\xf1\x00\xbe\xfd\x00\x8d\x68\xa3\x91\x07" - "\x4f\xb7\x59\xb7\x9e\xa5\x31\xae\x07\x59\x07\xee\x6f\xad\x3b\x0b" - "\xf8\xf5\xc7\x5b\xe3\xc8\x6b\xcc\x13\xcd\x3c\xde\x11\x2c\xea\xa1" - "\x38\x70\x6d\xed\xa5\x31\x75\xbd\xe4\x8c\xaf\x3b\xde\xca\xb2\xe8" - "\x5b\xdf\x94\x0f\x3b\x38\xec\xcd\xc7\xf6\xd9\x82\x4d\x9d\xd4\x1c" - "\xe9\xa5\x16\xfa\x98\x82\xde\xbf\x06\x7e\xf9\xd8\xbe\x21\x71\x34" - "\x80\xc0\x4a\xde\xf7\xa2\xf4\xc6\xd7\xcc\xdf\xc8\x55\xd3\xe6\x2a" - "\xca\xf6\xac\xa4\x61\xa7\x11\xaf\xc6\xb9\x87\x0a\x82\xd1\xbf\x06" - "\x56\xca\xbd\x9a\xab\xed\x55\xcd\x94\xd1\x12\xd9\xca\xdf\x86\x5b" - "\x63\x23\x6c\x05\xc1\x48\x2b\x05\x3d\x9f\x04\xe2\xd9\xb6\x09\x1b" - "\xe2\x64\x7f\xe3\x7c\xab\x35\x68\x3b\x4f\xc1\xa2\x08\x1d\x42\xd9" - "\x62\x93\x6d\x0e\x6c\x56\x5e\x4b\xa4\x87\xbf\x79\xc9\x15\x5d\xce" - "\xac\xcd\x4b\x68\xdc\x8e\xb3\x34\x76\xfb\x59\x72\x8b\x6e\xb7\x95" - "\xf7\x5f\xce\x3d\x93\x43\xdb\xf1\xce\x6e\x87\xee\x9c\x55\xfb\x30" - "\xc5\x70\x6d\x1f\x66\x9f\x9b\xea\x7b\xfb\xf7\x61\xf6\x76\xf5\xef" - "\xc3\x64\x5d\xe2\xbd\x98\x68\x1b\x3d\xac\xd3\x1b\x16\x91\x6d\xcd" - "\x67\x44\xb7\x54\x5b\x79\xdf\xa8\x38\x89\xf4\xc3\xa5\x31\xf2\xfd" - "\x8d\x65\xff\xcf\x3d\xc9\x7b\x65\xf3\x31\x5e\x99\x06\x23\x30\x2d" - "\x07\xcf\x18\x3c\xe8\xd7\xa7\x8d\xc7\x03\x89\x4c\x83\xbf\x3e\x0d" - "\xf6\x79\x9a\x17\x4f\x0d\x9e\xad\x78\xd0\x32\xa7\xed\xc2\x03\x3b" - "\x3e\x0d\x63\xae\x69\xe8\x6f\xa7\x35\xe1\xc1\xb8\x6a\x1a\xb4\xb4" - "\x00\x76\xa4\x00\x78\x0a\x26\xe0\x29\xc4\x83\xfc\x05\xd5\x78\x90" - "\xb7\x00\x79\x0a\x90\xa7\xe0\x08\x9e\x56\x3c\xe8\x93\x0b\x90\xaf" - "\xa0\x93\xe8\x21\x90\xf3\x10\x2c\xf5\x43\x28\xff\x21\xf4\x23\x0f" - "\xa1\xbf\x78\x08\x54\x3e\x04\xfb\xff\x10\xca\x7c\x08\xf9\x1e\x42" - "\x9e\x87\x90\xe7\xa1\x0e\x3c\x61\x3c\xb0\xe9\xd3\x91\x6f\x3a\xc6" - "\x69\xd3\x5d\x78\x40\xf7\x74\xd0\x3d\x1d\x74\x4f\x07\xcd\xd3\xe1" - "\x37\x4f\x47\x99\xd3\x41\xe3\x74\xe4\x9b\x8e\x3c\xd3\x91\x67\x06" - "\x68\x9c\x01\x7e\x67\xc0\xa7\x9f\x81\x7c\x33\xe0\xc7\xce\x80\x1c" - "\x66\x80\xde\x19\x65\x78\x2a\xf1\x80\xde\x19\x7b\xf1\xa0\xcc\x19" - "\xa0\x71\x06\xf2\x15\x22\x4f\x21\xf2\x14\x82\xc6\xc2\x5c\x3c\xe0" - "\xb1\x10\xf9\x0a\x91\xaf\x10\x7c\x16\x62\xbc\x5a\x08\xd9\x14\x62" - "\xfc\x5d\x08\x1a\x67\x82\xae\x99\x80\x9b\x09\x9a\x66\x02\xef\x4c" - "\xc8\x70\x26\xf8\x99\x09\x98\x99\xa0\x6b\x26\x78\x9a\x09\xda\x66" - "\xa2\xff\x9d\x09\xda\x1e\x06\xfc\xc3\xc0\xfd\xf0\x64\x3c\x80\x7f" - "\x18\xf8\x1e\x06\xdc\xc3\x90\xd7\xc3\xc0\xf7\x08\xe8\x7e\x04\x34" - "\x3c\x02\x98\x47\x80\xf7\x11\x94\xff\x08\xca\x7f\x04\xe5\x3f\x82" - "\xf2\x1f\x01\xfc\x23\xc0\xfd\x08\xca\x7f\x04\xf0\x45\xc0\x57\x04" - "\xb8\x22\x94\x5f\x04\x7c\x45\x28\xbf\x08\xe5\x17\x01\xa6\x08\x78" - "\x8b\x50\x7e\x11\xca\x2f\x02\xfe\x22\xc8\xa7\x88\xf3\x80\xcf\x59" - "\x28\x67\x16\xe4\x32\x0b\xf8\x67\x15\xe0\x81\x3c\x67\x01\xff\x2c" - "\x58\xa6\x59\x28\x63\x16\x64\x33\x0b\x75\x32\x0b\x78\x66\x01\xcf" - "\x2c\xe0\x98\x85\xfc\xb3\xc0\xc3\xa3\xc8\xfb\x28\xf2\x3e\x0a\xba" - "\x1e\x2d\xc1\x83\xba\x7f\x14\xf5\xf0\x28\xe0\x1e\x85\x9e\xc0\x1a" - "\xd0\xa3\x28\xe7\x51\x86\x45\x59\xb3\x51\x7f\xb3\xc1\xd3\x6c\xf0" - "\x34\x1b\x79\x66\xa3\xde\x67\xa3\xac\xd9\xa0\x73\x36\xf2\xcc\x86" - "\xfc\x67\xb7\x13\xf1\xd0\x71\x0e\xf4\x6a\xce\x58\x3c\xa0\x6b\x0e" - "\x60\xe7\x80\xaf\x39\xa0\x6f\x0e\xca\x99\x83\xfa\x9e\x83\x3c\x73" - "\x40\xd3\x1c\xd0\x33\x07\x75\x36\x17\x79\xe6\x82\x96\xb9\xd0\x8b" - "\xb9\x80\x9b\x8b\x71\xfc\x5c\xe8\xd4\x5c\xc8\x61\x2e\x60\xe7\x82" - "\x8f\xb9\xe0\x63\x2e\xf2\xcc\x85\x2c\xe6\x42\x0e\x73\xc1\xc7\x5c" - "\xd0\x37\x0f\x79\xe7\xa1\xae\xe7\x41\x7e\xf3\xa0\x8f\xf3\x90\x7f" - "\x5e\x29\x1e\xe0\x98\x87\xb2\xe6\x81\xaf\x79\xc0\x33\x0f\x78\xe6" - "\x01\xc7\x3c\xe4\x9f\x07\x5a\xe7\x21\x6f\x31\xf2\x16\xa3\xdc\x62" - "\xd0\x58\x0c\xda\x8a\x51\x66\x31\xe0\x8a\x77\xe3\x81\x4e\x15\xa3" - "\x9c\x62\xc0\xc2\x8a\x52\x31\xe8\x2c\x86\x2c\x4a\x20\xb7\x12\xe4" - "\x29\x01\x6f\x25\x28\xab\x04\x32\x28\x41\x9e\x12\xc8\xa0\x04\xf5" - "\x59\x02\xb8\x92\x28\xd1\x7c\xb4\xd5\xf9\xa0\x6b\x3e\x60\xe7\x43" - "\x66\x0f\x72\x1c\x68\x9c\x8f\xb2\xe6\x23\xdf\x7c\x94\x37\x1f\x79" - "\xe7\x83\xb6\xf9\xa0\x6b\x3e\xe8\x9a\x8f\xfc\xf3\x51\xd6\x7c\xb4" - "\xb3\xf9\x68\xa3\x8f\x81\xbe\xc7\x50\xde\x83\x3d\x2f\xbc\x42\xc4" - "\xf6\xa3\x6e\x34\xd9\xf8\x7c\x10\x69\x4b\xb6\x95\xf1\x59\x21\x61" - "\xed\xb7\xa5\xff\xb7\x9b\xe3\x7b\xb4\x78\x2b\xc3\xf3\xf9\x22\x0c" - "\x2f\xe3\x2e\x97\x71\x61\x2d\xce\x32\x30\xce\x9d\x80\xe3\x77\xd7" - "\xb6\xb2\x0c\xc6\xa1\xe7\xd7\xc2\x61\x3d\x2f\x87\x43\xb0\x49\xea" - "\xcd\x61\x37\xf2\x4d\xb3\x69\xef\x1c\xf5\xce\xcf\x63\x1e\x7c\xa1" - "\x04\xed\x36\x94\xd5\xc1\x61\xfe\xad\x95\xc7\xe7\xa0\x84\x53\xe2" - "\x2c\x03\xe3\xdc\xf2\xbc\x94\x14\x38\xc5\x67\x89\xe8\xa8\x02\xef" - "\x08\xdb\xe2\xdb\x14\xfd\xba\x9c\xd2\xa4\x59\xd2\xa7\xb9\xc9\x58" - "\x86\xe4\xdb\x40\x33\xd3\x6b\x88\x0f\x1b\xe2\x8d\x72\x89\xc8\xf4" - "\x24\x3c\x52\x2e\x4d\xda\x3b\xa4\xbd\x03\x9a\x7c\xf4\xfa\x1c\xa2" - "\x95\xc5\x72\x1e\x92\x22\x1f\x63\x9c\x65\x60\x5c\x42\x3e\x46\x38" - "\x5d\x3e\x61\x8d\xcf\x21\x26\xf2\x31\x4b\xb3\xa4\x4f\x93\xf2\x49" - "\x94\x61\x90\x8f\x8c\x33\x91\x8f\x1e\x6f\x90\xcf\x43\x23\x35\xf9" - "\x18\xf0\xb0\x3c\x0a\x3a\xd5\xfb\x21\xd2\xc2\xa1\x64\xf9\xb8\x6d" - "\xfd\x65\xb9\x53\xf5\xc7\x18\x67\x19\x18\x67\x94\x8f\x3b\x55\x7f" - "\x34\x3e\xdd\x66\xfa\x63\x96\x66\x49\x9f\xa6\xcb\xc7\x9d\xaa\x3f" - "\x32\xce\x5c\x3e\xee\x14\xfd\x99\x3e\xbe\x5f\x3e\x6e\x83\xfe\x4c" - "\xcf\xd6\xde\x2e\xed\x4d\x9a\x7c\xf4\x76\x3f\x54\x2b\x8b\xdb\xf8" - "\xd0\x14\xf9\x18\xe3\x2c\x03\xe3\x12\xf2\x31\xc2\xe9\xf2\xe9\xd1" - "\xf4\x60\xa8\x89\x7c\xcc\xd2\x2c\xe9\xd3\xa4\x7c\x12\x65\x18\xe4" - "\x23\xe3\x4c\xe4\xa3\xc7\x1b\xe4\x33\xa3\x50\x93\x8f\x01\x0f\xcb" - "\x63\xc6\x38\xed\xad\x87\x5d\xba\xfd\x61\x5a\x0c\x76\x63\x68\xc2" - "\x6e\x84\x54\xfb\xd7\xed\x5c\x7c\x9b\x4c\x0b\xa7\xa4\x59\xd2\xa7" - "\xb9\x8d\xf9\x7a\x52\xf2\x59\xf5\xb4\x2a\xcd\x86\xb0\x8c\xab\x14" - "\xdd\x5c\xe7\xd6\xf8\xe5\xfd\xe5\x56\x69\xf6\xc4\x04\xc6\x72\x61" - "\x18\x03\x1d\x06\x7e\x75\xfb\x9c\x8e\xe7\xb8\xb1\x1e\x4c\xf8\x36" - "\xa6\x87\xe0\x43\xe9\x76\xad\x1f\xbf\xb2\xf3\x8c\x1f\xe9\x85\x2a" - "\x5c\xe8\xd1\xde\xba\xfd\x0f\x6b\xf0\x43\x52\x68\x09\x6b\x65\x0d" - "\x31\x91\xbf\x31\x2d\x55\xfe\x86\xb4\x01\xf2\x37\xe6\x4b\x95\x7f" - "\xd8\x20\xb7\x21\x69\xe4\x6f\x06\x93\x2a\x7f\x13\x98\x24\xf9\x27" - "\xf8\x35\x91\x7f\x12\xcf\x26\xf2\x4f\xe2\x3b\x59\xfe\x0f\x67\xeb" - "\x76\xa1\x1f\xbf\x51\xfe\x33\x8f\xa9\xf0\xcc\xb0\xf6\x0e\x24\xcb" - "\xdf\x9d\xaa\xff\x5a\x59\x6e\x33\xfd\x37\xa6\xa5\x91\xbf\xdb\x4c" - "\xff\x8d\xf9\x06\x91\xbf\x3b\x9d\xfe\x9b\xc1\x0c\x22\x7f\xb7\x99" - "\xfe\x27\xf8\x4d\x2f\x7f\x77\x3a\xfd\x4f\xe2\x3b\x59\xfe\x8f\x6c" - "\x48\x96\xbf\x3b\x45\xff\x1f\xd1\xf4\xff\x11\x4d\xff\x1f\xc9\xd3" - "\x7d\xb8\xe8\xe5\x65\xc3\xb8\x7c\x7e\x1b\xed\xa7\x21\x6c\x49\x0e" - "\x2b\x7f\xce\x90\x6e\x95\x76\x52\x8b\xd3\x65\x9b\xb0\xef\x03\xe3" - "\x2d\xe6\xf1\x6e\xd2\x71\xea\x3e\x9e\x96\x9e\xe4\xe7\x69\x71\x06" - "\x9b\x5b\xd4\xc1\xef\xfe\xbc\xcc\x5f\xd1\x11\xed\xdd\xa6\xbd\x75" - "\x7d\x4b\xf8\x3d\x92\x6f\x13\xff\x49\x8b\x1f\xe0\x3f\x0d\x8c\x77" - "\x1b\xe1\x7b\x0c\xf0\x56\xa3\x5c\x53\x7d\x39\x9d\x1f\x2d\x7d\x80" - "\xaf\xa7\xf3\x96\x3e\xdd\x50\xae\x56\xa6\xae\x4b\x66\x3c\xa5\xa4" - "\x25\xf1\x65\x4c\x0b\x61\x1c\x66\xf4\x0d\x75\xfd\xd1\xd2\x02\x2a" - "\x3c\x4b\x93\xe7\xac\x3d\x7a\xfb\xd5\x6d\xa7\xa1\xec\x24\x7f\xcb" - "\x50\x6e\x92\xbf\x35\x30\x7e\x80\x3c\x75\xf8\x54\x79\x26\xf9\x7e" - "\x26\xf2\x4c\x4d\x4f\x95\x67\x4a\x7a\x92\x3c\xc3\x46\xdb\x68\xc6" - "\x93\x89\x3c\x13\x7c\x25\xcb\x73\x76\x9e\xd1\x97\x4c\x96\xe7\x6c" - "\x6d\x1c\x32\xdb\xad\xbd\xa9\x5f\x9e\xee\x54\xfd\x4c\xf2\xcf\x92" - "\xcb\x75\x9b\xe9\xa7\x16\x6f\x26\x4f\xb7\x99\x7e\x26\xf9\x8a\xe9" - "\xe5\xe9\x4e\xa7\x9f\x29\xe9\xa9\xf2\x74\x9b\xe9\x67\x82\x27\x73" - "\x79\xba\x4d\xf4\x73\xce\x16\xa3\xef\x99\x2c\xcf\x39\x25\x2a\x3c" - "\xc7\xab\xbd\x0b\xfa\xed\x9b\x7b\xa8\xb2\x25\xee\xa1\xc9\xf6\x2d" - "\x11\xb6\x24\x87\x75\xfb\x96\x48\x37\xd8\x37\xf7\x50\x73\xfb\x96" - "\x14\x6f\x31\x8f\x67\xfb\xe6\x36\xda\xf4\x0e\x2d\x3d\xc5\xbe\xc9" - "\x38\x83\x7d\x9b\x7b\x44\xd9\x37\xb7\xc1\x9f\x9c\xbb\x4b\x7b\xef" - "\xd3\xde\x0d\x03\xed\x9b\x7b\xa8\xb9\x7d\x93\xf1\x26\xf6\x2d\x35" - "\xde\x6d\x84\x37\xb1\x6f\xee\xa1\x83\xdb\x37\xf7\xd0\xc1\xed\x5b" - "\xba\x74\x43\xb9\x03\xec\xdb\x40\x9e\x52\xd2\xd2\xd8\x37\x96\xdd" - "\xbc\x56\x73\xfb\x26\xd3\x1a\x54\x78\x9e\x26\xcf\x79\x5b\x06\xda" - "\xb7\x44\xd9\x29\xf6\x2d\x51\x6e\x8a\x7d\x4b\x8d\x1f\x20\xcf\x14" - "\xfb\xe6\x1e\x3a\xb8\x7d\x73\x0f\x1d\xdc\xbe\xa5\x4b\x4f\x92\x67" - "\x8a\x7d\x1b\xc8\x93\x89\x3c\x4d\xec\x1b\xcb\xac\xc4\x65\x6e\xdf" - "\x38\xad\x58\xf3\xf3\x4a\xec\xea\x5d\xac\xc6\xcb\xe0\x8f\xe7\x8c" - "\x8c\xed\xd0\x10\xb6\x24\x87\x55\x3b\x34\xa4\x27\xda\x21\xc7\x99" - "\xb5\xc3\x94\x78\x8b\x79\xbc\x9b\x74\x9c\x7a\x3b\xd4\xd2\x93\xda" - "\xa1\x16\x67\x68\x87\xf3\x0b\xf8\xdd\x9f\x97\xf9\x9a\x9f\xab\xbd" - "\x65\xf8\x24\x7d\xaf\x9d\xd7\x8c\xba\xac\x0e\x71\xb8\x74\xbc\x5c" - "\xc3\xd9\x3e\x4a\x1c\xd9\xfe\x92\x68\xec\xf6\x3f\x36\x21\x44\x1b" - "\xe5\x19\xd1\x1b\x11\xde\x88\xf8\xc3\x2e\x22\x9e\x73\x6f\x2c\xe3" - "\xb5\xa1\xc7\x8a\x42\x94\xd5\x94\xba\x36\x24\xfc\x53\x3a\x78\x5d" - "\xf6\x57\x55\xad\x43\x84\xf5\x9f\x3a\x5a\x3a\x3a\x69\xf7\xca\x8e" - "\x21\xbe\x3f\x90\x35\x18\x3d\x49\xb7\x8c\x24\x27\xef\x0f\xa8\x7f" - "\x49\x84\xf0\xee\xc0\xd3\xe9\x59\xc9\x67\x60\x3d\xf6\xfa\x8d\xb5" - "\x34\xf2\x8f\x7c\xf6\x89\x5c\xf3\x7a\xec\x9d\xfe\x35\xaf\xea\x8f" - "\x9a\xdb\x03\x86\xf5\xae\xea\xd5\xae\x01\xeb\x5d\x8f\x5f\x27\xe3" - "\x0e\x8a\xa8\x5a\xdf\x8a\x85\xb4\xf8\xcc\x94\xf8\x0e\x15\xbf\xe0" - "\x4c\x4a\x7c\x8f\x16\xff\x51\x4a\x7c\x58\x8b\x1f\xee\xd2\xd6\xd3" - "\x5a\x98\x8e\x15\xbc\x9e\x56\xfa\x77\x5e\x4f\x6b\x29\xd5\xd6\xd3" - "\xe4\xd9\x02\xa5\x1f\x89\x9f\x55\x13\x9f\x99\x84\xdf\x3f\x66\xfa" - "\xc5\x41\xd2\x69\xcf\x44\xdc\x43\x1c\xb7\xe5\xcf\x64\xc3\x23\xd7" - "\xd2\x84\xff\x7b\xd3\x78\x1d\x8d\xd7\xd3\xea\x9f\x27\xda\xf6\x92" - "\x38\x56\x37\x4a\xb4\xd6\xbd\x24\x9a\xba\xfd\xdf\x0f\xe8\x6b\x6a" - "\x1b\x10\xb7\x01\x71\x3f\x42\x3a\xaf\xab\xb1\x4c\xde\x9f\x13\x20" - "\x3e\x5b\x4b\xd4\x34\xd7\x3a\x2c\xe4\xd9\x74\x96\x6c\x7c\x96\xd9" - "\x5a\xc8\x37\x58\x1e\x91\xdf\x33\x6f\x7e\x49\xb4\xc7\xad\xb9\xd4" - "\x52\xde\xce\xeb\x39\xa3\xd6\xc4\xf9\x1b\xb5\x4f\xa9\x2a\x22\x4e" - "\xf3\x77\xcf\x4c\x43\x71\xc5\x3f\xf3\xf9\x89\x96\xc6\x02\x22\x3e" - "\x8b\xa2\xfe\x52\xa2\x1d\x97\x82\x46\xd0\x74\x78\x21\xd7\x77\x69" - "\x7e\x88\x02\xe5\x6a\x6f\xe4\x6a\x3b\x9f\x95\x7c\x92\xbe\xbf\x41" - "\xf8\x45\x0f\xf3\xe6\x88\x55\x13\x9f\xd5\x22\xac\x72\xcf\x4e\xd9" - "\x36\xfc\xde\xa2\x9f\xd7\xe2\x27\x1b\xc3\x04\x4f\xf4\x10\xd3\x1c" - "\xa2\xef\xb7\xbd\x5f\x19\xe0\xfc\x95\x2c\x1b\xe1\xf7\xe9\x38\x2c" - "\xf2\xbc\x17\x3f\xd9\xf9\xbc\x97\x2f\x83\x43\x64\x35\xe5\xbf\x5f" - "\x12\x26\x5e\x63\x0c\xb6\xf6\xd0\xfb\x95\x27\x65\x1a\xc3\x88\xac" - "\xc6\xa4\x34\x3d\x5f\xd6\x2a\xf1\x77\x94\x9d\xcf\x75\xc9\xe7\xb1" - "\xc5\xd4\xd9\x48\xd9\x7c\x76\x47\xa0\xea\x63\xae\xeb\x3f\xd4\xa3" - "\x6e\xb4\x33\xe5\xa0\x8b\x0b\x8e\xf0\xb9\x3b\x7c\x8e\x9c\x3c\x43" - "\xce\x3a\x9e\xc4\x0a\x77\x76\xe2\x1c\xb9\xff\x0f\xce\x90\x43\xdd" - "\x38\x77\x58\xd5\x19\x72\x09\xfe\xe7\x48\x19\xe6\xb2\xae\x72\xdc" - "\x8b\xf3\xc8\x18\xef\xe4\xf8\xcd\x7e\x71\x44\xd7\x13\x4e\x63\xbe" - "\x90\x46\x5a\x5a\xeb\xc0\xb4\xc7\x3a\x38\x8d\xd7\xd5\x82\xa5\x31" - "\xfa\xe5\xe3\x31\xeb\xfa\x5e\xb2\xf1\x1a\x9b\x86\x57\xca\x56\xad" - "\xb3\x3d\x5e\x92\xbc\xce\xf6\xa4\x07\x8f\x17\x4f\x0d\x9e\xad\x78" - "\x76\xe1\xd9\x87\xa7\x15\x4f\x07\xd1\x53\x00\x7b\x2a\x1b\x0f\x2c" - "\xc9\x53\xe3\xf1\x4c\xc4\x03\xab\xf1\x14\xb4\xee\xa9\x22\x3c\xa5" - "\x78\x80\xed\xa9\x0d\x78\x76\xe2\xd9\x8f\xe7\x18\x9e\x08\xd1\xc2" - "\x91\x78\x90\x67\x21\xe0\x17\x02\x6e\x21\x64\xba\x10\xe5\x2c\xac" - "\xc3\x03\xd8\x85\xbb\xf1\xec\xc5\xd3\x88\xe7\x04\x1e\xe4\x79\x1a" - "\x65\x3d\x3d\x16\xcf\x64\x3c\xc8\xf3\xf4\x5a\x3c\xa0\xeb\x69\xc0" - "\x3d\x0d\x9a\x9e\x6e\xc3\xd3\x89\x87\x61\xa3\x44\x8b\x6c\x78\x50" - "\xce\xa2\x71\x78\x90\x67\xd1\x1c\x3c\xa0\x67\x51\x2d\x1e\xe4\x59" - "\x04\x5a\x16\x81\x8f\xc5\x80\x5b\x0c\x1e\x16\xbb\xf1\x80\x87\xc5" - "\x80\x5d\x3c\x15\x4f\x21\x1e\x94\xb3\xb8\x12\x0f\xf2\x2c\x06\x4d" - "\x8b\x41\xcf\xe2\x76\x58\x35\xe4\xf1\x80\x16\xcf\x04\x3c\x80\xf3" - "\x40\x56\x1e\xc8\xca\x03\x5e\x3d\x80\xf5\x80\x0f\x0f\xf8\xf0\x80" - "\x67\x0f\xe8\xf7\x80\x9e\x67\xc6\xe0\x01\xfe\x67\x80\xf3\x19\xc0" - "\x3d\x03\x1a\x9e\x01\xdd\xcf\x80\xde\x25\x4e\x3c\xa0\x61\x09\xd2" - "\x97\xa0\xfc\x25\x28\x7f\x09\xf0\x2e\x41\x6b\x5d\x02\xd8\x25\x28" - "\x7b\x49\x13\x1e\xf0\xb7\x14\x3c\x2d\x05\xdc\x52\xe0\x59\x0a\xb9" - "\x2d\x45\x39\x4b\x8f\xe0\x01\xae\xa5\x9c\x0e\x7c\x4b\x51\x5e\x39" - "\x68\x2c\x47\x99\xe5\x80\x2d\x07\xef\xe5\xe0\xa3\x1c\x74\x95\x83" - "\x87\x72\xc0\x2d\x03\x9e\x65\xb9\x78\x50\xce\x32\xd0\xbe\x0c\xb8" - "\x96\x21\x7d\x19\xf0\x2d\x43\x79\xcb\x40\xdf\xb2\x00\x1e\xc8\x69" - "\x19\xe4\xb4\x0c\x38\x97\xe7\xe0\x81\x3c\x97\xa3\xde\x96\xa3\xfc" - "\xe5\x90\xe7\x72\xd0\xb7\x1c\x79\x96\x23\xcf\x72\xf0\xbb\x1c\xf8" - "\x97\x83\xd6\xe5\xc8\xb7\x1c\xf9\x56\x80\x8e\x15\xe0\x6d\x05\xe8" - "\x58\x01\xbd\x58\x01\x3a\x56\x34\xe0\x01\xdc\x0a\xc8\x66\x05\xf0" - "\x7a\x41\xa7\x17\xf2\xf4\x02\xc6\x0b\xfe\xbd\xe0\xdf\x0b\xba\xbc" - "\xe8\x9d\xbc\xa8\x67\x2f\xe0\xbd\xc0\xed\x45\x1d\x7b\x01\x5f\x01" - "\x7c\x15\x80\xab\x00\x5f\x15\xc0\x57\x01\xba\x2b\x40\x43\x05\x60" - "\x2a\x80\xb7\x02\xe5\x57\xa0\xfc\x0a\x94\xbf\x12\xe5\xaf\x04\xfc" - "\x4a\xe0\x5e\x89\xf2\x57\x02\x7e\x25\xf0\xad\x04\xdc\x4a\x94\xbf" - "\x12\xf8\x9e\x45\xf9\xcf\xa2\xfc\x67\x01\xf3\x2c\xf0\x3e\x8b\xf2" - "\x9f\x45\xf9\xcf\x96\xe0\x01\x8f\xcf\x42\x37\x9f\x45\x19\xcf\xee" - "\xc1\x03\xdc\xcf\x02\x6f\x25\xf0\x56\x42\x86\x95\x90\x47\x25\xf2" - "\x54\x22\x4f\x25\xe8\xa9\x84\x5c\x2a\x51\x6f\x95\xc8\x57\x89\x7c" - "\x95\xa0\x0b\xc6\x8d\x2a\x51\x56\x25\x7a\xc4\x55\x28\x6b\x55\x1e" - "\x1e\xc0\xad\x02\x2d\xab\x80\x77\x15\xe8\x5e\x05\x7a\x56\x01\x66" - "\x15\xf4\x6b\x15\xea\x67\x15\xea\xb1\xca\x8e\x07\x74\x55\x01\xbe" - "\x0a\xb8\xab\x50\x4f\x55\x80\xaf\x02\xbe\xaa\x76\x3e\xb9\x11\xd6" - "\x0e\xf8\x7c\xa0\xdb\x07\x1a\x7c\x80\xf1\x01\xaf\x0f\xe5\x3f\xc9" - "\x6f\xd0\xe0\xab\x61\xef\x07\x0f\x68\xf7\x35\xb2\x67\x89\x07\xf9" - "\xaa\xa1\x73\xd5\xd0\xf9\x6a\xe0\xae\x86\x5c\xaa\xc1\x6b\x35\xf4" - "\xb8\x9a\xdb\x7c\xc9\x36\xd8\x9f\x57\xfe\xcc\xfe\x86\xb2\x11\xfa" - "\xdb\xd7\x06\x1f\xf6\x93\x32\x63\x38\x8c\xb0\x25\x39\xec\x36\xa6" - "\xf7\x20\xdd\x6a\xcc\xef\x2b\x92\x71\x24\x8a\x93\xe2\xc3\x5a\xbc" - "\xc5\x3c\xde\x9d\x04\xdf\x57\xcc\x7e\x51\x32\x4d\x3a\x9d\x9c\xa6" - "\xd3\x65\x8c\x0b\xc1\x8e\xf1\xbb\xaf\xd8\x6d\xed\xe7\xeb\x49\xaf" - "\x0a\x3f\x59\xc3\xef\x6d\x9a\xdd\x95\x78\x8f\x49\xbc\x09\x19\x80" - "\x8e\x0e\x3d\x0e\xb4\x90\x21\x3e\x6c\x88\xb7\x98\xc7\xbb\x8d\xf0" - "\x3d\x06\xf8\x64\xd9\x14\x62\x4c\xc2\x32\x2b\xc6\x98\x04\x72\x4b" - "\x95\xb5\x49\xba\x65\xf0\x74\xf7\x00\x7e\x92\x64\x97\xc2\x53\x92" - "\x0c\x53\xf8\x4a\x96\xe5\x53\x3b\x25\x4c\x02\xa7\x51\xa6\x4f\x95" - "\xab\xf0\x53\x1b\xb4\x77\x29\xcb\x15\xb0\x5c\x27\x43\x52\xca\x96" - "\x71\x26\xf2\xd4\xe3\x53\xe5\xa9\xc5\x0f\x90\xa7\x0e\x9f\x2a\xcf" - "\xb0\x26\x8f\x21\x69\xe4\x99\x9a\x9e\x2a\xcf\x94\xf4\x24\x79\xca" - "\x32\x4d\xe4\x99\xe0\xc9\x44\x9e\x09\xbe\x92\xe5\xb9\x30\xa2\xc9" - "\x53\xc3\x69\x94\xe7\xc2\x46\x15\x5e\x78\x42\x7b\xef\xed\x97\xa7" - "\x3b\x55\x3f\x65\x9c\xb9\x3c\xdd\x66\xfa\xa9\xc5\x9b\xc9\xd3\x6d" - "\xa6\x9f\x9a\x3c\xdc\xe9\xf4\x33\x35\x3d\x8d\x3c\xdd\x66\xfa\x29" - "\xcb\x34\x97\xa7\x3b\x9d\x7e\x26\xf8\x4a\x96\xe7\xa2\xc9\xfd\xf2" - "\x74\xa7\xe8\xe7\xa2\x91\x2a\xbc\x68\x9c\xf6\xb6\x69\xf2\x64\xfb" - "\x33\x34\xa5\x6c\x19\x67\x22\x4f\x3d\x3e\x55\x9e\x5a\xfc\x00\x79" - "\xea\xf0\xa9\xf2\xec\xd1\xf4\x6b\x68\x1a\x79\xa6\xa6\xa7\xca\x33" - "\x25\x3d\x49\x9e\xb2\x4c\x13\x79\x26\x78\x32\x91\x67\x82\xaf\x64" - "\x79\x2e\xae\xd5\xe4\xa9\xe1\x34\xca\x73\x71\xa9\x0a\x2f\xae\xd4" - "\xde\x85\x9a\x3c\x25\x7f\x9a\xfd\x18\x9a\xc2\x77\x47\xd5\x31\x65" - "\xa7\x98\xe7\xf8\x27\x49\xe9\xe1\x94\x74\xcb\xe0\xe9\xee\xd4\xfc" - "\x3d\x29\xf9\xad\xc6\xf4\x2a\xcd\xe6\x71\xbd\x54\x1d\x4b\xd0\x67" - "\x8d\x17\x27\xd3\x51\xa5\xd9\x3f\x13\x38\xcb\x97\x83\x4b\xa1\xcb" - "\x20\x0f\x96\xe5\x97\x91\x49\x6a\x9f\x66\x26\x97\xe4\x7a\xf2\x44" - "\x75\xbb\xdc\x5f\x96\xdb\x6a\x2c\x0b\x30\xfb\x55\x3d\x79\x34\x7b" - "\xe2\xd9\xa9\xdb\x13\x2d\xcf\x10\x13\xda\xc2\x5a\xb9\x43\xd2\xd4" - "\x97\x31\xdd\xac\xbe\x0c\xe9\xa6\xf5\x65\xcc\x6f\x56\x5f\x61\x83" - "\x7c\x87\x0c\x52\x5f\x66\x70\x66\xf5\x65\x02\x37\xa0\xbe\x12\xf2" - "\x48\x53\x5f\x03\x64\x62\x52\x5f\x03\xe4\x92\x5c\x5f\x4b\x76\xeb" - "\x76\xaa\xbf\xac\xd4\xfa\x5a\xb2\x50\xd5\xd3\x12\xad\x3f\x5d\x52" - "\x98\x5c\x5f\x6e\xb3\xf6\xa5\x95\xeb\x4e\xd7\xbe\x8c\xe9\x83\xd4" - "\x97\x3b\x5d\xfb\x32\xe6\xbf\x40\x7d\xb9\x07\x6b\x5f\x66\x70\x17" - "\xa8\x2f\x77\xba\xf6\x95\x90\xc7\xe0\xf5\xe5\x1e\xac\x7d\x0d\x90" - "\x4b\x72\x7d\x95\xcf\x49\xae\x2f\xb7\x49\xfb\x2a\x1f\xa3\xea\xa9" - "\x7c\xa2\xf6\x96\xfd\x4b\xef\x27\xbc\x5e\xd0\x4f\x0f\x87\x53\xed" - "\xbd\x16\x67\x19\x18\x97\xec\x53\x6b\x70\xfd\x7d\x09\xcb\xdc\x10" - "\x3f\xa0\xbf\x4a\x4e\xb3\xa4\x4f\xeb\x2f\x87\xe3\x52\xfd\x6c\x9d" - "\xe6\x54\xb9\xe9\x74\x27\xcb\x6a\x59\x07\xbf\x15\x1e\x63\x7f\xb1" - "\x2c\xa0\xc2\xcb\x8e\x69\x6f\xdd\x9f\x91\xbe\xa4\x8e\x83\xf3\xa5" - "\xf3\x4f\xb5\x34\x53\xff\x74\x60\x9a\x3b\x35\x5f\x92\xff\x9d\x94" - "\x96\xc6\x07\x4f\x81\x31\xf5\xc3\x2f\x0c\x93\x42\x87\xc1\x1f\xbf" - "\x10\xcf\x7a\x3d\xa4\xe3\xdb\x98\x1e\xc2\x78\x3b\xd5\x37\x37\xe2" - "\x0f\x61\x5c\xae\xe4\xbe\x42\xf3\x8b\x96\x1f\x33\xfa\xe7\x26\xb4" - "\x0c\xf0\x67\x0d\x74\x0c\xf0\x67\x07\xa6\x99\xca\x3f\xe1\xaf\x9b" - "\xc8\x7f\x80\xcf\x6e\x22\xdb\x01\x7e\xfb\x85\x61\x06\xc8\x3f\xe1" - "\xbf\x5f\x88\x67\x13\xf9\x27\xf1\x9d\x2c\x7f\x6f\x43\xaa\x2f\x9f" - "\x2c\x7f\x6f\x99\x92\xbb\x77\xad\xf6\x2e\x34\xfa\xf3\xe6\xb4\xb8" - "\xd3\xe9\xff\x00\xff\x77\x60\x5a\x3a\xf9\xbb\xd3\xe9\xff\x00\x1f" - "\x3f\xbd\x6c\xdd\x83\xe9\xff\x00\x5f\x7f\xa0\xfc\xdd\xe9\xf4\x3f" - "\x89\x67\x73\xf9\xbb\xd3\xe8\xff\x4a\x57\x5f\x8a\xef\x9f\x2c\xff" - "\x0a\x4d\xff\x57\x6a\xfa\x5f\x71\x4c\xd9\x67\x77\x52\x7f\xc1\xe1" - "\x81\xf6\x59\xc6\x59\x06\xc6\xa5\xda\x67\x09\x67\x62\x9f\x55\xbc" - "\xb9\x7d\x4e\xa4\x99\xd8\x67\x3d\xcd\x68\x9f\xdd\xc9\xbe\xbd\x81" - "\xe6\x81\xf6\x59\xd1\x9d\x6c\x9f\x9f\xad\x51\xf6\xd9\x9d\xe2\xcf" - "\x3f\x5b\xa2\xc2\xcf\x6a\xe3\xf8\x67\x0b\xcd\xed\xb3\x7b\x68\x7a" - "\xfb\x2c\xd3\xd2\xd8\xe7\xd4\x34\x77\x6a\xbe\x34\xf6\x19\x69\x17" - "\xb4\xcf\x12\xe6\x02\xf6\x39\x1d\x4c\x0a\x1d\xa6\xf6\xd9\x9c\xe7" - "\x7e\xfd\x33\xe7\xdb\x98\x1e\xa2\xca\x40\x7a\xfb\x2c\xd3\x6b\x94" - "\xdc\x2b\x77\x6a\xef\x72\x73\xfb\x9c\xa0\xc5\xc4\x3e\x27\xe8\x30" - "\xb1\xcf\xa9\x69\xa6\xf2\x37\xb1\xcf\x09\xf9\x0f\x62\x9f\x13\xb2" - "\x1d\xc4\x3e\xa7\x83\x19\x20\x7f\x13\xfb\x6c\xce\xb3\x89\xfc\xd3" - "\xd8\x67\x96\x6f\x55\x5e\x7a\xfb\x2c\xd3\xed\x4a\xee\x55\x63\xd5" - "\x7b\x55\x44\xca\x1f\xbc\xf3\x9c\x68\xaa\x4d\xd0\xe2\x2c\x03\xe3" - "\x92\x6d\x82\x06\x37\xc0\x26\xe8\xf1\x66\x36\xc1\x90\x36\xc0\x26" - "\xf4\xa7\xf5\x97\xc3\x71\xa9\x36\x41\xa7\x39\xd5\x26\xe8\x74\x27" - "\xdb\x04\x5f\x1d\xbf\x15\x1e\xa3\x4d\xf0\x69\xb6\xc0\x27\x75\xf3" - "\x24\x3d\x76\xcc\xb8\xde\x9c\xbc\xce\x59\xbd\x4b\x5f\x6f\x3e\xec" - "\xe2\xf5\xc6\xea\x7d\x21\xca\xf2\x70\x98\xd7\x3b\x6b\x21\x4b\x7d" - "\xfd\x53\x5f\xaf\xe2\x32\xd6\x8e\x12\x21\x0e\x4f\x3a\x43\xc3\x0e" - "\x17\x10\xbd\x32\x4a\xb4\xa9\xf5\xeb\xea\x1e\xfd\xec\xe9\xf5\x88" - "\xe3\x35\x6c\xce\x63\xf6\xbd\xac\xfe\x7d\x66\xcc\x4f\x57\xc5\xac" - "\x64\x09\x56\x7f\x4c\xc1\xad\xa2\xba\x25\x7a\x8c\xe6\x95\x93\x35" - "\x9e\xf1\xd4\x5f\x78\x1d\xcd\x51\x49\x43\xf9\xcd\xeb\xc1\xa7\x69" - "\xf5\x94\xe2\x08\x0d\x15\x6b\x90\x66\x45\x9a\x97\xbe\x63\x48\x53" - "\x67\xac\xf4\xe7\xbb\xc9\x90\x26\xef\xa5\xb8\xe9\x33\xbe\xf3\x74" - "\xb5\x3b\x95\x9e\xff\x22\x2d\x1f\x0c\x42\xcb\x99\xf4\xb4\xf8\xe5" - "\xb7\x7f\x37\x75\x92\xc5\xb5\x88\x2e\xf9\x8c\x56\xef\xe5\xb0\xbc" - "\x9f\x70\x8d\x59\x39\xfe\x3b\xb5\xf4\x21\x86\x74\x43\x59\xfe\x59" - "\x26\xf9\x8d\xe5\x55\x5c\x00\xff\xcb\x17\xc0\xff\xdb\x0b\xe0\x3f" - "\xce\xeb\xd2\x90\x9d\x23\x6e\x4d\x86\xbb\x39\x2a\xcf\x4c\x00\xdc" - "\x69\xc0\xad\x91\x1f\x09\x8b\x35\xb3\xff\xe2\xbb\x5a\x7e\x07\x2e" - "\xef\xdb\xd8\x84\xf4\x60\xb4\x5d\xae\x99\x4f\x06\xa5\x37\x47\x92" - "\xf2\xdc\x91\x4a\xdb\x88\xa8\x4e\x9b\x4c\x9f\x99\x4a\x1b\xd2\x6f" - "\x32\xa4\x2f\xeb\xaf\x77\x7f\x38\x5d\xbd\xf3\x5a\x7c\x70\x2b\x11" - "\xdf\x8b\x7d\xd8\x46\xc4\xe7\x0b\xd7\x26\xce\x54\x58\xd3\x14\xa2" - "\xd5\x4e\xc3\x79\xea\x7c\xd6\xd8\x55\x2d\x91\x08\xf1\xf7\xae\xda" - "\xf9\xb3\x5f\xaf\x3a\x47\x97\xf2\xdd\x1e\x7c\x3f\x4f\x71\xac\xc0" - "\x7a\xb8\x92\xdb\xd3\x5a\xbb\x9e\x37\xdd\xd9\x0d\x5c\xae\x56\xa6" - "\x3c\x9b\x19\x79\x26\xea\x79\x18\x37\x9f\x47\x1c\x87\x5e\xaa\xfb" - "\x07\x3b\x79\xbd\xfb\xeb\xbe\x0a\x2e\x8b\xcb\x29\x21\xad\x1c\x0f" - "\xf2\xec\x1c\xa4\x9c\x41\xf8\x5b\xbb\xfb\xe2\xf9\x23\x9d\xbf\x8e" - "\x0b\xf0\x37\x48\xb9\xcf\x8d\xbd\xf8\x72\x73\xb4\x72\x9f\x2b\xb9" - "\x78\xb9\x3e\x57\xfb\xe5\xe5\x9a\xab\xc9\xf5\xb9\x23\x17\x90\xab" - "\x59\x39\xd1\x2f\x5f\x8e\x4b\x2b\xe7\x07\xb9\x66\xe5\x18\xed\xa4" - "\x3c\xe7\x83\xcb\x50\x77\x3d\x58\xd0\xe6\x32\x91\xaf\xcc\x78\x87" - "\x3b\xc7\x23\xae\x52\xbf\xc3\xbd\xff\x2c\xeb\x1f\xbc\x5c\xdc\x20" - "\xcf\x79\x89\x87\xe8\x07\x75\x7c\xc6\xfc\xe4\x55\xfa\xbd\xe9\x32" - "\xcf\x9e\xc1\xee\x8e\xe7\x7b\x4e\x85\x28\x92\xe7\xe3\xab\xbb\x9a" - "\x7e\xf0\x37\x3e\x7b\x59\xdd\x79\xfc\x83\x88\x6a\x83\x3f\x88\x00" - "\x77\xde\x20\x38\xe4\x9d\xca\x63\x9d\xbe\x2f\xe4\xfd\xed\x2b\xc9" - "\x16\x74\x2a\xdd\x38\x45\x3f\x9c\xa9\xce\x80\xfe\xe1\x04\x9d\x1f" - "\xed\x8c\x7d\xe0\xfd\xe1\x54\x9d\x9f\x10\xfd\x50\x9e\xf3\x23\xd6" - "\xff\x67\xf5\x60\xe7\x9c\x0b\xfb\x71\x79\xc7\x39\xca\xb0\x9f\xa2" - "\x9a\x9d\xf5\xea\x6c\x74\xfd\x4e\x67\x1b\xca\x3b\xa7\xe3\x8f\x58" - "\xab\xb9\xdc\x3d\x26\xe5\x36\xea\xe5\x0a\x3f\x65\xb3\xcc\x5c\xd7" - "\xc8\xbc\x67\x22\x99\xc7\x03\xa2\xe6\x78\x80\xef\x0a\x3a\xe5\xe2" - "\xfb\x89\x6b\x76\x92\x3c\x83\xe2\x87\x6d\x61\xa4\x71\x5f\xaa\x70" - "\x1f\xce\xee\xf6\xd7\x64\x0f\xc4\x5d\xe3\x32\xe0\xce\xe0\x3b\x10" - "\x94\x5c\x6b\x5e\x56\xf7\x42\xd5\xdc\x7f\x38\xca\x7b\x74\x28\x9b" - "\x71\x8a\x75\xc7\x03\x9c\x17\xf8\xbe\xc2\x6d\x88\xcb\x00\x8e\x52" - "\x1d\xaf\xb0\xb7\x55\x73\xfb\x61\x18\x79\xff\x4b\x94\x65\x59\xb3" - "\x36\xa1\x07\x88\x2b\x77\xc1\x7f\x83\xdc\x18\x9f\x76\x8f\x79\x44" - "\xc7\x9d\xee\x0e\x0c\x29\x33\xd4\xfb\x0b\x4a\x8f\xac\xa7\x68\xfd" - "\xf5\xac\x7f\xea\x9e\xae\x75\xcf\x69\x34\xcb\xfa\x64\x5a\x19\x57" - "\x88\xd6\xf3\xdd\xdd\xa4\xe8\xad\xe6\x76\xd1\xd1\xed\x5f\x97\xa3" - "\xd3\xca\xf7\x4e\xe8\x72\x68\x94\xba\xbf\x6e\x9c\xae\x7b\xbc\x37" - "\x86\xf7\x32\x09\xf0\xa7\xee\xb6\x5b\x97\x0f\x1a\xcb\x38\x4d\x9d" - "\x59\xbf\xee\x69\x52\xe7\xf0\xb4\xca\x3b\xd3\xe4\xf9\x3c\x19\x7f" - "\x3d\x49\xeb\xee\x96\x7a\xa1\xea\x24\x1b\x34\x85\x1b\x6d\xbc\x3e" - "\xbc\x5e\x9d\x09\x22\xef\xdc\xe0\xfc\x35\x7c\x2e\x6b\xf6\x66\x79" - "\x77\xb6\xac\x9f\x2c\x91\xd9\x56\x8d\x72\xf6\x18\xe8\x0b\xeb\xed" - "\x62\x6c\x65\xb1\xd4\x4f\xa4\xb7\x26\x68\xb4\x82\x46\x3f\x68\x04" - "\xaf\xf5\xf2\xfc\xfc\x75\x9d\xc9\x34\xae\xbf\x24\x0d\x8d\x7f\x19" - "\x8c\xc6\x7e\x7d\x7c\x17\xe5\xad\xcf\x1b\xa8\x33\xeb\x0b\xf5\xfa" - "\xe4\xf0\xe1\x6b\x26\x72\x59\x7b\x18\x87\xd2\xe1\xf5\xe5\x09\x1e" - "\x12\xfc\xae\xaf\xe5\xfb\xb5\x99\x5f\xdf\x17\x64\x77\x44\xc9\xca" - "\xed\xde\x80\x73\x97\xce\x57\x48\xc9\xc6\x9e\x6a\x7f\xd2\xdd\x77" - "\x84\x7e\x9c\xeb\xd1\x1a\x5e\x77\xb4\x7c\x5a\x54\xc4\xe1\x07\xa1" - "\x9e\xd7\xc3\xff\xdb\x28\x6d\x9f\x58\x2e\x9a\x36\xf7\xaa\xbb\x18" - "\xa7\xc5\xba\x44\x71\xcc\xce\xe7\x0c\x80\xce\x1f\x8d\xd1\xcf\x36" - "\x52\x6d\xfe\x47\xa8\xff\x1f\xec\xe7\x70\x38\xe3\x86\x4b\xf1\xb8" - "\x4d\xed\x87\x8e\x2f\xf3\x68\x79\x71\x2c\x5b\xe2\x52\xf7\x3c\xfe" - "\x68\x61\xe2\xce\x4b\xd0\x24\xb2\x9a\xcb\xf8\x3e\x9d\x70\x5f\x19" - "\x9f\xeb\x64\x51\x74\xfd\x68\x8b\x5e\xc6\x85\xee\x2f\x19\x84\xdf" - "\x36\xfd\x9c\x28\xe0\x0b\x85\x68\x53\x07\xe3\x73\x58\xf8\xfe\x34" - "\xd1\x83\x32\x47\x22\x3e\xc1\x3f\x9f\x15\xc5\x69\xea\xac\x99\x1f" - "\x1d\x53\x36\x72\x83\xd3\xec\xbc\xa8\xc7\x16\x2f\x2e\x2f\x5e\xb2" - "\x80\x5f\xee\xeb\x96\x5d\x9f\x95\x62\xf7\xb3\xd5\x1d\x56\x1b\xc6" - "\xf2\xfe\xc0\x17\x2e\xd5\xcf\x68\xda\x50\xaa\xef\x51\xe4\xb6\x8c" - "\x76\x73\x2f\xf7\x9b\xdc\xbf\x20\xad\xfa\x9d\xca\x55\x72\x7f\xd8" - "\x5f\xec\x64\x4d\xe7\xf7\xb0\x8e\x76\x65\x8a\x6a\x96\x97\xd8\x38" - "\x0a\x7d\xf2\x06\xf8\xff\x1b\x26\x0c\x72\x36\xb9\x27\xb6\xfe\xe3" - "\x1c\xd7\x68\xe2\x7b\x10\xad\xbf\x5e\xd9\x66\xe5\x73\x22\xaa\xf0" - "\x9b\xfd\x38\x79\xae\x84\x95\x04\xd3\x71\xf0\x6c\x1b\xec\xc5\x46" - "\xd8\x84\x66\xf8\x26\x1b\x6d\x69\x69\x30\x9c\xb5\xc5\x67\x1f\xb5" - "\xd3\xc6\xb1\xe9\x60\x45\x4d\x9b\x76\x9f\xe6\xc6\x8a\x46\x3e\x5b" - "\x75\x34\xfd\xf0\x24\x6d\x5c\x66\x73\x92\x13\xbf\x7f\x8e\xdf\xd2" - "\xd7\xe5\xb4\xa4\x3a\xbd\xe2\x4c\x83\x2d\x43\x58\x85\x10\x16\xa1" - "\xfe\x30\xa0\x52\x7f\x19\x78\xac\xc2\x22\x4f\xac\xc9\x80\xa4\x86" - "\x0d\xb5\x91\x63\x44\xb6\xfd\xaa\x2b\xc7\x38\xef\xbd\x67\xe2\x04" - "\x5f\x55\xa5\x57\xc4\xa3\x3d\x0e\x61\xbc\xc3\x54\xb8\x66\x5e\x5f" - "\xad\xce\x0d\x5b\x27\x5c\x66\xb4\x6e\xf4\x0b\x0f\xdf\xd9\x14\x1f" - "\x31\xaa\xc4\xb7\x8c\xac\x6f\xf6\x86\xac\x7c\xcf\xb8\x6b\x39\xef" - "\xc9\xfd\x13\x9d\xa4\x4d\x43\x0e\x21\x0e\xfc\x7b\xc5\x86\x51\x25" - "\x4a\x4f\x36\x4d\x89\x6f\x1a\x55\xd2\x8f\xdf\x46\x8c\xdf\xf7\x32" - "\x59\x77\x56\x75\x58\x83\xb6\x7b\x28\xe8\x8a\xd0\x21\xfc\x4e\x53" - "\x9f\x1e\xc8\x9f\x18\x47\xbd\x3f\x5e\x83\x36\x6f\xe5\x7d\x8d\xb0" - "\x05\xd6\xcf\x68\xd3\xaa\x3d\x69\xf2\xf1\x9d\x34\x5d\x59\x47\xef" - "\xea\xf6\x6f\x42\xfd\x7f\x3b\x71\x07\x15\xc2\x47\x74\x7d\x46\xfa" - "\x9d\x5d\x7e\x19\x77\x42\x87\x31\xef\xe7\x79\x4f\xaa\x08\x48\x3b" - "\x79\xfe\x6f\x1d\xf5\x55\xe6\xe7\x49\x83\xce\x61\x41\xef\x6d\x7c" - "\xce\xcb\x90\x11\x3d\x94\xed\x3b\x27\xfa\x30\x86\x18\x09\xb5\xb5" - "\x62\x0c\x76\x55\xf4\xbc\x28\x6a\xee\x3c\x4b\x2d\x91\x63\x7c\x46" - "\x94\xe5\x57\x8f\xbf\x6b\x0d\xf6\x7c\x1e\x08\xae\x8d\x53\x8b\x27" - "\x4a\xc1\xba\xcf\x03\xcd\x9d\xc7\xf0\x3b\x46\xcd\xf4\x31\x35\x7b" - "\xff\xb3\x5a\x8e\xdb\xea\x44\x35\xcb\xb9\xef\xbc\x28\x0c\xda\xfe" - "\x37\x71\x5f\x08\x3b\x31\x07\x72\x77\x7d\x46\x9b\x5f\x3b\x08\x3c" - "\x6f\xfe\x19\xb8\xa2\xec\x67\xde\x4d\x87\xf0\xbb\xdb\xbf\x79\x8f" - "\x7e\xbe\x99\x19\xad\x0e\x4b\x60\xa3\xc3\x3b\xd7\x1a\x3f\x2f\x26" - "\xf0\xfd\xb2\xe2\xbc\x18\xcf\x7c\x21\x9c\xcb\x61\xbc\xc7\xf1\xdb" - "\xb1\x3a\xb0\xdd\x11\x9d\x4b\xb0\x55\x45\x6c\x9f\x10\x5f\x58\x7f" - "\x9e\x38\x5c\xa0\x85\xa7\x6a\xe1\x7c\x2d\x3c\x59\x0b\xe7\x69\xe1" - "\x89\x1c\x66\x7a\xbb\xfd\x5b\x26\xeb\x34\x75\x59\x87\xb5\x22\x5c" - "\xa8\xd7\x05\xe8\x19\xee\xf0\xae\xb2\x0a\xa6\x47\xd1\x31\x5e\xa3" - "\x2b\x57\x0b\xeb\xf4\x5c\xe1\x88\xae\xfa\x9f\xa2\xe7\x58\x0a\x3d" - "\xed\x06\x7a\xc8\xe1\xcd\xfb\x32\xf4\xe4\x38\xa2\x79\xff\x2d\x7a" - "\x98\x16\x8e\xeb\xf6\xff\xb8\x34\x99\x9e\x1f\x97\xeb\xf4\xa4\xe9" - "\x3f\x3a\xb8\xff\x58\x7a\x99\xbc\x6b\x7d\x58\x30\x7a\x87\xa1\x0f" - "\xf9\xf1\x9e\xc1\xee\x0a\x46\x5b\x70\x02\x06\xfc\xff\xb8\x5a\x96" - "\xb7\x5c\xec\x57\xfd\xe7\x8f\x3b\xf4\xb3\xf5\xc0\xeb\xae\xcd\x8a" - "\xd7\xdd\x6b\xf9\x6e\xe2\x0a\xba\xdc\xe7\x15\x1d\xf0\xbb\xfe\x4f" - "\xa3\x2b\x9c\xd4\x06\x16\x96\x2f\x5d\xfa\xf4\x5d\xae\x85\xf3\x17" - "\x2d\x70\x5d\x57\xea\x5a\x5a\xf6\xc4\xe3\xe5\x0b\x92\xcf\xac\xca" - "\x61\xdb\xc1\x76\x7e\x87\xba\xbf\x2c\xcc\x6d\x80\xf5\x9f\xfb\x76" - "\x75\xde\xe8\xf3\xaf\x0b\xff\xf3\x23\xb9\x6f\xd8\xf1\x3c\xd9\xea" - "\xe5\xd9\x51\xcf\x7b\xf5\x3e\x61\x8d\xe6\xe3\x58\x73\xf8\x5e\x92" - "\xe7\xd1\xff\x6d\xce\x31\xc4\x33\xec\x4e\x3d\x8e\xf1\x6b\xb6\x69" - "\xd8\x49\x7a\x7e\x0a\x97\x69\x2a\xc3\xf3\xa2\x01\x3e\xb4\x25\x2e" - "\x8a\xac\xb0\x29\x82\xef\xaa\x84\xff\x6b\x45\x3e\x01\x7a\xce\xb1" - "\xed\x2d\x44\x98\xc7\xf6\x2e\x9f\x00\x8d\x2f\x64\x22\xcf\x4e\xc4" - "\xd9\x36\xc5\x79\x97\xa3\xe8\xe0\x7c\x88\xbf\x9a\xef\x7f\x2b\xe4" - "\x33\xe4\xa2\xf2\x6e\x08\x8e\xbb\x83\xef\x67\x43\x5c\x8e\x21\xee" - "\x7e\xc4\x39\x11\xe7\xd2\xf0\xcd\x62\x39\x23\x9c\xa7\xf9\xf2\x0c" - "\xf3\xb4\x56\x6e\xb5\x91\xe6\x82\x49\xf7\x4f\xb9\xed\xe6\x5c\x57" - "\xe1\x8c\x6f\xdd\x7d\xcf\xf7\x17\x2f\x7a\x3c\x8b\xa4\xd8\xdd\xb9" - "\xde\xeb\x72\x6f\xf3\x5e\x7f\x97\xcb\xb3\x60\xc1\x12\xd7\x8a\x05" - "\x8b\xca\x5d\xf3\x57\xcc\xaf\xc8\xa2\xc7\x17\x2f\xf9\xfe\x13\x8b" - "\xfe\x97\xac\x96\xa5\xc5\xdf\x7f\xfc\x7f\xf1\xc1\x62\x0a\x3a\x2b" - "\xa9\x3f\x2e\xe4\xbe\x5d\xbb\x8f\xef\x08\x1e\xbe\x2b\xd3\x89\x77" - "\x23\x9e\xfd\x78\xf6\xe1\xe1\xbb\x9c\x5b\x4f\xd3\xcb\x76\xbc\xf7" - "\x76\xfb\x6b\x73\x74\x7f\xa1\x5f\x77\x6a\xc7\xea\xba\x83\xfe\x7b" - "\xaf\xea\xd7\x6a\x0b\x5b\xa2\xb2\xdd\x24\x74\x69\xf3\xf9\x7e\x5d" - "\x92\x77\x78\xf3\x99\x79\xcb\x91\x0e\xdd\xe5\x7b\xb2\x20\xeb\x4c" - "\x96\xd7\x29\xfa\xc9\x65\xf0\x99\x9b\xf8\x6e\x48\xbc\x1b\xa1\x27" - "\x4d\xca\x07\xac\x6d\x05\xdc\xd5\x28\x63\xbf\x56\x86\x0a\x8f\x12" - "\x47\x90\x9e\x71\x52\x0b\x33\xae\x53\xf4\xd2\xeb\xfc\x9b\xdf\xda" - "\xfe\x7f\x47\x30\x22\xc7\x26\xd6\xfe\xb4\x17\xef\xd4\xca\xe0\x73" - "\x0e\xab\xd9\xf7\xd1\xfd\x5d\x1e\xe7\x3a\x2c\xf7\x0a\xd0\xf3\x79" - "\x3c\x63\x76\x9b\xbc\xaf\xb8\xba\x17\xb6\xe1\xf6\xdb\x83\x5e\x11" - "\x40\xba\x85\xc7\xc1\x0f\x7a\x44\xbc\xc5\x73\x8e\xe2\x19\x4f\xb5" - "\xb1\x2c\x59\x7e\xa7\xa9\x76\x88\x1a\x43\xbd\x6c\x97\xf8\x80\x5f" - "\xd1\xfb\xa2\x3a\x23\x57\xf9\xdd\x7c\x07\x18\xfb\xd5\xfb\xb8\x7c" - "\xbe\xcb\x0f\x70\xad\xf5\x2a\x7c\xac\x9f\xe7\x17\xd7\xea\x34\x69" - "\xf1\xad\x80\x3b\xa6\xee\xc9\xab\x3d\xa1\xa7\x29\xdf\xbc\x2e\x0f" - "\x32\xf8\x0b\xf3\xc2\x78\xe5\x37\x0f\xbd\x51\x09\x87\xbc\x7b\x74" - "\xbb\xc1\x76\xa2\x38\x86\x76\x26\x7d\xd8\x17\x43\x09\x1f\x36\x51" - "\x9f\x2f\x46\xcc\x6c\x81\x59\xfd\x69\x32\x9e\x2b\xfc\x2f\x78\x41" - "\xd7\x1e\x29\x4b\x43\x39\xb0\x4f\x7d\xaa\x9c\x97\xf2\x13\xbe\xad" - "\x96\x8e\xb4\x58\x88\x69\xeb\x95\xdf\xb1\x68\xed\xfe\x25\x8f\xde" - "\xee\x75\xb8\x78\x4d\x4b\x36\xda\xbe\xcd\x61\x11\x71\x87\xd7\x22" - "\x78\xce\x86\xfb\x3c\xe9\x53\x00\x66\xc4\x39\xc8\xb2\x97\xc7\x1f" - "\x2f\x8d\x8b\xaf\x6b\x51\x3e\xa6\xff\x85\x1f\xf5\xdb\x92\x97\x1a" - "\x53\x71\xb2\x2d\x91\x77\x27\xdb\x5b\xb2\x8b\x63\x36\x3e\x33\xd6" - "\x22\x32\x5b\xb2\x39\x5d\xa3\xb7\x27\x95\x5e\xd6\xb3\x69\xb1\x3e" - "\xa1\xdd\x4d\x0a\x7f\xe2\xa5\x42\x99\x36\x4a\x34\xaa\xba\xda\xfa" - "\x0e\xd7\x07\xda\xc9\xee\x6e\xff\x4f\x30\xfe\x7f\xbe\x51\x1b\xc3" - "\x34\xc1\x2e\xed\x3e\xbc\x72\x32\x60\x7e\x52\x98\x52\x9f\xfb\x35" - "\xdd\xae\x30\x8c\xb5\x8e\xa9\xfa\xbc\xa7\xfa\x24\xfd\xa4\xd6\x10" - "\xaf\xd5\xf3\xe1\x82\x93\xb4\xf5\x01\x35\x06\x6b\x6e\x52\xba\xf5" - "\x13\xa9\x0b\x3a\xad\x42\x8d\x9f\xf7\xf2\xfd\xa9\x5c\x07\xfd\x7c" - "\xfd\xa4\x55\xb7\xfd\xdc\x56\x43\x4a\x37\xf6\xb3\xcc\x20\x2b\x1b" - "\xe4\xf6\x0b\x25\xb3\x9f\xf4\x24\x64\xc6\x77\xd4\xa3\x8c\x11\xab" - "\x45\x7c\x44\x04\x6e\x27\xca\x2c\xae\xb0\x11\xeb\x3f\xb7\x59\x9e" - "\xef\x64\x18\xee\x1f\x75\xb9\x76\xfb\xb7\x4e\x18\x58\xdf\x7d\x22" - "\x44\x3f\xd9\xc5\x74\x24\xf3\x39\xac\xf5\xa4\xce\x3f\xec\x10\x8f" - "\xc5\x11\xf6\x6a\xe3\xdd\xa6\xc0\x68\xfe\x2e\xaa\x76\xd5\x61\xdb" - "\xb7\xe8\xb0\x77\x3c\x29\xf9\x6e\xdd\x0a\xf9\x8e\xd3\xc7\xda\x5c" - "\x37\x2c\x63\x96\xa9\xa8\x69\xb1\xeb\x75\xa4\xce\x7e\xab\xf5\x8a" - "\x75\x2d\x72\x8c\xc0\xb4\x74\x59\xe5\x3d\xe3\xad\x4c\x13\xdb\x3a" - "\x6e\x8f\xb2\x3d\x80\x9e\x7e\x39\x6d\xed\x31\xc8\xa9\x91\x65\xa4" - "\xc9\x6a\x6f\x8a\x6d\x5e\xe0\x5a\x78\xb7\xb2\xad\x2e\xf7\x75\xa5" - "\xb7\xf0\xc9\x8d\xd7\xbb\xfe\x69\xd2\x5d\xae\x82\xbb\xaf\xf3\x96" - "\x8d\x7b\x90\x5f\xff\xab\x6c\xdc\xa4\x82\xa9\x1c\x4e\xb6\xbf\xae" - "\x6e\xff\xcb\x25\x21\xcb\x3d\x36\x2e\x27\xbe\x5c\x74\x6e\x3e\x4b" - "\x14\x63\x79\x2f\x62\xbd\x6f\xde\x35\x0d\x36\x74\x5a\x85\xf8\xa2" - "\x1e\xf1\xf5\x88\xe3\xbe\x8d\xc7\x9a\xf1\x75\xcd\xbb\xc2\x99\xc2" - "\x15\xce\x8c\x87\xc2\x99\x47\xa7\x4e\xb9\xde\x27\x80\x6b\xb7\x4e" - "\xb3\xc8\xc0\xf8\x11\xf9\x75\x3b\x15\x8c\x76\xf0\xbd\x94\x36\x8c" - "\x61\x76\x89\x0c\x1e\x47\xbe\xdc\x06\x3b\x5e\xaa\xce\xc1\x7d\x19" - "\xfe\xcf\x0b\x47\x34\x5f\xb9\x00\x61\xb4\xff\x6f\xc8\x3b\x83\x85" - "\xd5\x49\x22\xe3\x86\xe9\x6c\x4b\x24\xce\x75\xf1\x90\x09\xde\xa1" - "\x3a\x5e\xfa\x92\x67\x8e\x8a\xac\x96\x1a\xfe\x76\xa9\xde\x1a\x2f" - "\x72\x44\x2d\xd5\xfc\xfd\x92\xfe\xad\x56\x7c\x3d\xd2\x2c\xea\xbe" - "\x65\xb4\xf7\x6a\x86\xd1\xd3\x36\xfb\xe3\xa1\xcd\xd6\x78\x0f\xc6" - "\x68\x39\xca\xef\xed\x64\xfb\x8d\x31\xe4\x2b\xbb\xf4\x7e\x49\xeb" - "\xd3\xaa\xd5\x39\xae\xaf\xfc\x81\xf3\x9d\xf5\xdb\x60\x1f\x5e\x2e" - "\xb8\x66\xa4\x1c\x5b\xf4\x08\xab\x3e\x9e\x7d\x65\x3b\xa7\x6f\x52" - "\xf3\x35\x57\x39\x56\x8b\x70\x55\x44\x84\x1d\x51\x11\xe6\xf9\x5b" - "\x69\xfb\xe9\x34\x05\x2b\xbb\xab\xf9\x5e\x75\xe9\xbb\xa0\x5c\x65" - "\xf7\x63\xca\xee\xa3\x7c\x8c\xf5\x4b\x60\xfb\x2d\xa7\xe9\x95\x85" - "\x4c\xbf\x26\xa3\xec\x38\xe4\x15\xe4\x7e\x8e\xe5\x93\xd5\x6a\x4f" - "\xc7\x33\x78\x0a\x6d\xf2\x83\x2f\x2b\xf8\xf2\x9e\xe1\xf6\xd1\xc3" - "\xdf\xd8\xa1\x7d\x8d\xea\xbf\xef\x6d\xdb\x06\x73\x1e\xb7\xbd\x31" - "\x38\x8f\xdb\x56\x6b\x6d\x4b\xd2\xc9\xf6\xa2\x93\xb6\xe5\x8d\x58" - "\xcd\xdf\xaf\x35\xef\x82\x4e\x4d\xe2\x76\xb2\xc3\x2f\xf8\xce\xb5" - "\x5d\x66\xf5\xa5\xce\x8b\x66\x5c\x75\x53\x1d\xab\xab\x4b\xba\xfd" - "\x75\x4e\x23\x2d\xdc\xe7\x68\xe9\x77\x9a\xd1\x12\xf7\x33\x2d\x4c" - "\x6b\xdd\x70\xce\xcf\x74\xf0\xfc\x98\x23\x8a\x41\x36\x74\x18\xe3" - "\xac\x1a\xb3\x72\x47\xac\x6e\x60\xba\x4c\xd3\x60\x73\x3a\xd9\x2e" - "\xc9\xfe\xcc\x4b\x62\x1a\x1e\xb6\x41\xa0\x6d\xaf\x6e\x7b\x1c\x16" - "\x57\x86\xb4\x05\x56\xb1\xc5\x0c\x87\x63\xf5\x16\xfe\x7e\x6e\x12" - "\xca\x37\x4d\x87\x8c\x5d\x90\xd1\xd6\xf8\x9a\x1b\xaf\x71\x58\xe8" - "\xde\x70\xc6\x8d\x59\x0e\x6f\x74\x2c\xcb\x10\x38\xbd\xa7\x68\xc7" - "\x3b\x3c\xbe\x54\xf7\x1e\x6f\x1f\x17\xa2\x37\xe4\xbc\x71\x38\xb3" - "\x79\xab\x9a\x13\xda\x9e\x17\xa2\xbd\xd9\xfd\x73\x44\xdb\x0b\x42" - "\x96\x2b\x95\x5d\xcd\xb8\xfc\x15\xb1\xfe\xa8\x33\xee\x77\x08\xd7" - "\x4a\x07\xfc\xbf\xed\x7f\x8b\x0b\xb7\x55\x64\x1d\x75\xf6\xeb\x89" - "\xfa\xb6\x4f\xd7\x13\xe4\xdf\x62\xae\x03\xdb\xdf\x1a\x5c\x07\xb6" - "\x3f\xc7\xe9\x2c\x77\x35\xc6\xd8\xde\x96\x98\xdf\x5a\x73\xf9\x2b" - "\xae\x2a\x59\xfe\x42\x55\x36\xcb\x24\x8f\xe7\xd6\xa6\x42\x2e\xd5" - "\xdd\xfe\x1d\xb6\x84\x3d\x80\xbe\x38\x62\x64\x61\xbb\xc4\xba\x82" - "\x34\x17\x6c\x8e\x9c\x8f\xe2\x3b\x84\x61\xd3\xc6\xc4\xfd\x2f\x8f" - "\x0c\xfb\xca\xb6\xf1\x19\xb0\x91\xcc\x96\x1c\xc0\x60\xfc\x77\x62" - "\x9f\x9a\xdf\x6d\xb1\xc3\x3e\x67\xd7\x5e\x0a\x7b\xab\xbe\x57\xcd" - "\xe6\x36\x8d\x77\x0e\xb7\x6b\xc4\x8d\x04\xdd\x39\x08\x63\x9c\xb2" - "\xa3\x52\xef\x83\xe2\xfe\x3c\xd8\x03\x21\x75\x13\x7d\xcc\x98\x2e" - "\xc8\xee\x45\x6b\x7c\xd7\xf9\x5b\x9c\xc4\x3c\x9f\x5f\x33\x7a\xd7" - "\x0f\x6f\x26\xdb\xbf\x3b\x1f\x23\xcf\x6d\x34\x72\xf5\xb7\x6c\xf4" - "\x7f\x27\x90\x95\xe5\x10\xa2\x1d\x1b\x94\xec\x76\x34\xe9\xf5\x13" - "\xa2\xed\xe3\xb9\x3e\x52\xfd\x6c\xd7\x13\x4b\x5d\xa5\x8b\x57\x2c" - "\xba\xfa\xea\xa4\x31\x8c\x8d\x1f\xe1\xdf\x11\x52\x7d\x63\xfd\x48" - "\x9d\x2e\xab\xbc\x1f\xb2\x1e\xfe\xef\xcb\xf9\xa9\x63\xae\xa9\xc5" - "\xda\x11\xbf\xc5\xb9\xd4\xff\xfb\x56\x9a\x7a\xab\x21\x78\x3b\x4d" - "\xbd\xed\xf6\xe2\xe9\x0b\xe6\x97\x56\x18\x62\xef\x30\xce\x9b\x6d" - "\x7e\x85\x6d\xef\xe8\xef\xc2\x16\x58\x1e\x7c\x96\xfb\xfa\x86\xcc" - "\xaa\xa8\xf8\xab\xe0\xbb\x79\xac\x54\xdc\x5c\x1e\xa5\x66\xd8\x2a" - "\x71\x39\x6c\xb5\x7f\x98\xba\x07\x02\x3e\x12\x74\xc7\x31\x0d\x76" - "\x0c\xfe\xda\x39\x9e\x37\x41\xbe\x9b\x5a\xb6\xf6\xa0\xcd\x1f\x2d" - "\x54\x3e\x43\x3d\x8f\x61\x2e\x41\xfc\x25\x78\x0f\xc5\xfb\x6b\xae" - "\x45\x18\x8f\xf0\x39\xc2\xcb\xf9\x1c\xe1\xfa\x18\xcb\xed\xe6\x48" - "\x35\xdd\xbc\x84\x7d\xea\xfa\x86\xc3\xe5\xec\x67\x35\x14\xc8\x35" - "\x09\xc0\x22\xee\x6f\xae\x27\x29\x97\xdf\xec\xd3\x86\x80\x53\xac" - "\x3b\x5a\x28\xb6\x61\x5c\x55\x45\x63\x81\xf3\x81\x0c\xcb\x5f\x28" - "\xc3\x39\x74\x7f\xb7\xbf\x61\x6a\x88\x36\xd4\xb2\x9c\x90\xdf\x7c" - "\x5e\x2c\xc5\xd7\x28\xae\x80\xaf\x87\x7e\xa6\xd8\xbb\x9e\xf0\xdb" - "\x56\x5f\xa5\x8f\x73\x1b\xb6\x1a\xe6\x5e\xb3\x10\xde\xa5\xeb\x33" - "\x7e\xef\xd5\xf5\xcd\x58\xc6\x94\x45\xe5\x0b\x96\x2c\x28\x75\x5d" - "\xb7\x34\x8b\x0a\x9f\x78\x7a\x41\xe9\x4d\x8b\x97\x95\xbb\x56\x94" - "\x2d\x58\xe4\x5a\xb2\xe0\x99\x65\x0b\x96\x96\xf3\x98\x89\x53\x93" - "\xfa\xe8\x91\x22\xeb\x83\x1a\xfd\x5c\x7a\xd7\x68\x96\xe3\x4f\x2f" *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 11:00:13 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3A8FE106564A; Wed, 25 Feb 2009 11:00:13 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 665B08FC1B; Wed, 25 Feb 2009 10:59:57 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PAxviH094200; Wed, 25 Feb 2009 10:59:57 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PAxv4d094194; Wed, 25 Feb 2009 10:59:57 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251059.n1PAxv4d094194@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 10:59:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189026 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb net netinet netinet6 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 11:00:15 -0000 Author: rwatson Date: Wed Feb 25 10:59:56 2009 New Revision: 189026 URL: http://svn.freebsd.org/changeset/base/189026 Log: Merge r185747, r185774, r185807, r185849, r185964, r185965, r186051, r186052 from head to stable/7; note that only the locking fixes and invariants checking are added from r185747, but not the move to an rwlock which would modify the kernel binary interface, nor the move to a non-recursible lock, which is still seeing problem reports in head. This corrects, among other things, a deadlock that may occur when processing incoming ICMP redirects. r185747: - convert radix node head lock from mutex to rwlock - make radix node head lock not recursive - fix LOR in rtexpunge - fix LOR in rtredirect Reviewed by: sam r185774: - avoid recursively locking the radix node head lock - assert that it is held if RTF_RNH_LOCKED is not passed r185807: Fix a bug introduced in r185747: rather than dereferencing an uninitialized *rt to something undefined, use the fibnum that came in as function argument. Found with: Coverity Prevent(tm) CID: 4168 r185849: fix a reported panic when adding a route and one hit here when deleting a route - pass RTF_RNH_LOCKED to rtalloc1_fib in 2 cases where the lock is held - make sure the rnh lock is held across rt_setgate and rt_getifa_fib r185964: Pass RTF_RNH_LOCKED to rtalloc1 sunce the node head is locked, this avoids a recursive lock panic on inet6 detach. Reviewed by: kmacy r185965: RTF_RNH_LOCKED needs to be passed in the flags arg not report, apologies to thompsa r186051: in6_addroute is called through rnh_addadr which is always called with the radix node head lock held exclusively. Pass RTF_RNH_LOCKED to rtalloc so that rtalloc1_fib will not try to re-acquire the lock. r186052: don't acquire lock recursively Oiginal commits to head were by kmacy, except r185964 by thompsa and r185807 by bz. A subset of this is a potential errata patch candidate. Reviewed by: bz, kmacy Tested by: Pete French sa_family != AF_INET) /* Only INET supports > 1 fib now */ @@ -290,7 +291,13 @@ rtalloc1_fib(struct sockaddr *dst, int r rtstat.rts_unreach++; goto miss2; } - RADIX_NODE_HEAD_LOCK(rnh); + needlock = !(ignflags & RTF_RNH_LOCKED); + if (needlock) + RADIX_NODE_HEAD_LOCK(rnh); +#ifdef INVARIANTS + else + RADIX_NODE_HEAD_LOCK_ASSERT(rnh); +#endif if ((rn = rnh->rnh_matchaddr(dst, rnh)) && (rn->rn_flags & RNF_ROOT) == 0) { /* @@ -343,7 +350,8 @@ rtalloc1_fib(struct sockaddr *dst, int r RT_LOCK(newrt); RT_ADDREF(newrt); } - RADIX_NODE_HEAD_UNLOCK(rnh); + if (needlock) + RADIX_NODE_HEAD_UNLOCK(rnh); } else { /* * Either we hit the root or couldn't find any match, @@ -352,7 +360,8 @@ rtalloc1_fib(struct sockaddr *dst, int r */ rtstat.rts_unreach++; miss: - RADIX_NODE_HEAD_UNLOCK(rnh); + if (needlock) + RADIX_NODE_HEAD_UNLOCK(rnh); miss2: if (report) { /* * If required, report the failure to the supervising @@ -482,6 +491,8 @@ rtredirect_fib(struct sockaddr *dst, short *stat = NULL; struct rt_addrinfo info; struct ifaddr *ifa; + struct radix_node_head *rnh = + rt_tables[fibnum][dst->sa_family]; /* verify the gateway is directly reachable */ if ((ifa = ifa_ifwithnet(gateway)) == NULL) { @@ -531,6 +542,8 @@ rtredirect_fib(struct sockaddr *dst, info.rti_info[RTAX_NETMASK] = netmask; info.rti_ifa = ifa; info.rti_flags = flags; + if (rt0 != NULL) + RT_UNLOCK(rt0); /* drop lock to avoid LOR with RNH */ error = rtrequest1_fib(RTM_ADD, &info, &rt, fibnum); if (rt != NULL) { RT_LOCK(rt); @@ -538,7 +551,7 @@ rtredirect_fib(struct sockaddr *dst, flags = rt->rt_flags; } if (rt0) - RTFREE_LOCKED(rt0); + RTFREE(rt0); stat = &rtstat.rts_dynamic; } else { @@ -554,8 +567,12 @@ rtredirect_fib(struct sockaddr *dst, /* * add the key and gateway (in one malloc'd chunk). */ + RT_UNLOCK(rt); + RADIX_NODE_HEAD_LOCK(rnh); + RT_LOCK(rt); rt_setgate(rt, rt_key(rt), gateway); - gwrt = rtalloc1(gateway, 1, 0); + gwrt = rtalloc1(gateway, 1, RTF_RNH_LOCKED); + RADIX_NODE_HEAD_UNLOCK(rnh); EVENTHANDLER_INVOKE(route_redirect_event, rt, gwrt, dst); RTFREE_LOCKED(gwrt); } @@ -641,7 +658,7 @@ ifa_ifwithroute_fib(int flags, struct so if (ifa == NULL) ifa = ifa_ifwithnet(gateway); if (ifa == NULL) { - struct rtentry *rt = rtalloc1_fib(gateway, 0, 0UL, fibnum); + struct rtentry *rt = rtalloc1_fib(gateway, 0, RTF_RNH_LOCKED, fibnum); if (rt == NULL) return (NULL); /* @@ -788,7 +805,9 @@ rtexpunge(struct rtentry *rt) struct ifaddr *ifa; int error = 0; + rnh = rt_tables[rt->rt_fibnum][rt_key(rt)->sa_family]; RT_LOCK_ASSERT(rt); + RADIX_NODE_HEAD_LOCK_ASSERT(rnh); #if 0 /* * We cannot assume anything about the reference count @@ -804,8 +823,6 @@ rtexpunge(struct rtentry *rt) if (rnh == NULL) return (EAFNOSUPPORT); - RADIX_NODE_HEAD_LOCK(rnh); - /* * Remove the item from the tree; it should be there, * but when callers invoke us blindly it may not (sigh). @@ -860,7 +877,6 @@ rtexpunge(struct rtentry *rt) */ rttrash++; bad: - RADIX_NODE_HEAD_UNLOCK(rnh); return (error); } @@ -874,7 +890,7 @@ int rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt, u_int fibnum) { - int error = 0; + int error = 0, needlock = 0; register struct rtentry *rt; register struct radix_node *rn; register struct radix_node_head *rnh; @@ -891,7 +907,12 @@ rtrequest1_fib(int req, struct rt_addrin rnh = rt_tables[fibnum][dst->sa_family]; if (rnh == NULL) return (EAFNOSUPPORT); - RADIX_NODE_HEAD_LOCK(rnh); + needlock = ((flags & RTF_RNH_LOCKED) == 0); + flags &= ~RTF_RNH_LOCKED; + if (needlock) + RADIX_NODE_HEAD_LOCK(rnh); + else + RADIX_NODE_HEAD_LOCK_ASSERT(rnh); /* * If we are adding a host route then we don't want to put * a netmask in the tree, nor do we want to clone it. @@ -1036,7 +1057,7 @@ rtrequest1_fib(int req, struct rt_addrin * then we just blow it away and retry the insertion * of the new one. */ - rt2 = rtalloc1_fib(dst, 0, 0, fibnum); + rt2 = rtalloc1_fib(dst, 0, RTF_RNH_LOCKED, fibnum); if (rt2 && rt2->rt_parent) { rtexpunge(rt2); RT_UNLOCK(rt2); @@ -1125,7 +1146,8 @@ rtrequest1_fib(int req, struct rt_addrin error = EOPNOTSUPP; } bad: - RADIX_NODE_HEAD_UNLOCK(rnh); + if (needlock) + RADIX_NODE_HEAD_UNLOCK(rnh); return (error); #undef senderr } @@ -1153,7 +1175,7 @@ rt_fixdelete(struct radix_node *rn, void if (rt->rt_parent == rt0 && !(rt->rt_flags & (RTF_PINNED | RTF_CLONING))) { return rtrequest_fib(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt), - rt->rt_flags, NULL, rt->rt_fibnum); + rt->rt_flags|RTF_RNH_LOCKED, NULL, rt->rt_fibnum); } return 0; } @@ -1230,6 +1252,7 @@ rt_setgate(struct rtentry *rt, struct so again: RT_LOCK_ASSERT(rt); + RADIX_NODE_HEAD_LOCK_ASSERT(rnh); /* * A host route with the destination equal to the gateway @@ -1256,7 +1279,7 @@ again: struct rtentry *gwrt; RT_UNLOCK(rt); /* XXX workaround LOR */ - gwrt = rtalloc1_fib(gate, 1, 0, rt->rt_fibnum); + gwrt = rtalloc1_fib(gate, 1, RTF_RNH_LOCKED, rt->rt_fibnum); if (gwrt == rt) { RT_REMREF(rt); return (EADDRINUSE); /* failure */ @@ -1327,12 +1350,8 @@ again: arg.rnh = rnh; arg.rt0 = rt; - RT_UNLOCK(rt); /* XXX workaround LOR */ - RADIX_NODE_HEAD_LOCK(rnh); - RT_LOCK(rt); rnh->rnh_walktree_from(rnh, rt_key(rt), rt_mask(rt), rt_fixchange, &arg); - RADIX_NODE_HEAD_UNLOCK(rnh); } return 0; Modified: stable/7/sys/net/route.h ============================================================================== --- stable/7/sys/net/route.h Wed Feb 25 10:52:09 2009 (r189025) +++ stable/7/sys/net/route.h Wed Feb 25 10:59:56 2009 (r189026) @@ -172,6 +172,7 @@ struct ortentry { #define RTF_BROADCAST 0x400000 /* route represents a bcast address */ #define RTF_MULTICAST 0x800000 /* route represents a mcast address */ /* 0x1000000 and up unassigned */ +#define RTF_RNH_LOCKED 0x40000000 /* radix node head locked by caller */ /* Mask of RTF flags that are allowed to be modified by RTM_CHANGE. */ #define RTF_FMASK \ Modified: stable/7/sys/net/rtsock.c ============================================================================== --- stable/7/sys/net/rtsock.c Wed Feb 25 10:52:09 2009 (r189025) +++ stable/7/sys/net/rtsock.c Wed Feb 25 10:59:56 2009 (r189026) @@ -628,9 +628,11 @@ route_output(struct mbuf *m, struct sock !sa_equal(info.rti_info[RTAX_IFA], rt->rt_ifa->ifa_addr))) { RT_UNLOCK(rt); + RADIX_NODE_HEAD_LOCK(rnh); if ((error = rt_getifa_fib(&info, rt->rt_fibnum)) != 0) senderr(error); + RADIX_NODE_HEAD_UNLOCK(rnh); RT_LOCK(rt); } if (info.rti_ifa != NULL && @@ -642,8 +644,14 @@ route_output(struct mbuf *m, struct sock IFAFREE(rt->rt_ifa); } if (info.rti_info[RTAX_GATEWAY] != NULL) { - if ((error = rt_setgate(rt, rt_key(rt), - info.rti_info[RTAX_GATEWAY])) != 0) { + RT_UNLOCK(rt); + RADIX_NODE_HEAD_LOCK(rnh); + RT_LOCK(rt); + + error = rt_setgate(rt, rt_key(rt), + info.rti_info[RTAX_GATEWAY]); + RADIX_NODE_HEAD_UNLOCK(rnh); + if (error != 0) { RT_UNLOCK(rt); senderr(error); } Modified: stable/7/sys/netinet/in_rmx.c ============================================================================== --- stable/7/sys/netinet/in_rmx.c Wed Feb 25 10:52:09 2009 (r189025) +++ stable/7/sys/netinet/in_rmx.c Wed Feb 25 10:59:56 2009 (r189026) @@ -111,7 +111,7 @@ in_addroute(void *v_arg, void *n_arg, st * ARP entry and delete it if so. */ rt2 = in_rtalloc1((struct sockaddr *)sin, 0, - RTF_CLONING, rt->rt_fibnum); + RTF_CLONING|RTF_RNH_LOCKED, rt->rt_fibnum); if (rt2) { if (rt2->rt_flags & RTF_LLINFO && rt2->rt_flags & RTF_HOST && Modified: stable/7/sys/netinet6/in6_ifattach.c ============================================================================== --- stable/7/sys/netinet6/in6_ifattach.c Wed Feb 25 10:52:09 2009 (r189025) +++ stable/7/sys/netinet6/in6_ifattach.c Wed Feb 25 10:59:56 2009 (r189026) @@ -823,7 +823,7 @@ in6_ifdetach(struct ifnet *ifp) /* XXX grab lock first to avoid LOR */ if (rt_tables[0][AF_INET6] != NULL) { RADIX_NODE_HEAD_LOCK(rt_tables[0][AF_INET6]); - rt = rtalloc1((struct sockaddr *)&sin6, 0, 0UL); + rt = rtalloc1((struct sockaddr *)&sin6, 0, RTF_RNH_LOCKED); if (rt) { if (rt->rt_ifp == ifp) rtexpunge(rt); Modified: stable/7/sys/netinet6/in6_rmx.c ============================================================================== --- stable/7/sys/netinet6/in6_rmx.c Wed Feb 25 10:52:09 2009 (r189025) +++ stable/7/sys/netinet6/in6_rmx.c Wed Feb 25 10:59:56 2009 (r189026) @@ -154,7 +154,7 @@ in6_addroute(void *v_arg, void *n_arg, s * Find out if it is because of an * ARP entry and delete it if so. */ - rt2 = rtalloc1((struct sockaddr *)sin6, 0, RTF_CLONING); + rt2 = rtalloc1((struct sockaddr *)sin6, 0, RTF_RNH_LOCKED|RTF_CLONING); if (rt2) { if (rt2->rt_flags & RTF_LLINFO && rt2->rt_flags & RTF_HOST && @@ -181,7 +181,7 @@ in6_addroute(void *v_arg, void *n_arg, s * net route entry, 3ffe:0501:: -> if0. * This case should not raise an error. */ - rt2 = rtalloc1((struct sockaddr *)sin6, 0, RTF_CLONING); + rt2 = rtalloc1((struct sockaddr *)sin6, 0, RTF_RNH_LOCKED|RTF_CLONING); if (rt2) { if ((rt2->rt_flags & (RTF_CLONING|RTF_HOST|RTF_GATEWAY)) == RTF_CLONING From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 11:18:18 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 77448106566B; Wed, 25 Feb 2009 11:18:18 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4A72A8FC2F; Wed, 25 Feb 2009 11:18:18 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PBIIog094669; Wed, 25 Feb 2009 11:18:18 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PBIIcQ094668; Wed, 25 Feb 2009 11:18:18 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251118.n1PBIIcQ094668@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 11:18:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189029 - stable/7/sys/net X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 11:18:19 -0000 Author: rwatson Date: Wed Feb 25 11:18:18 2009 New Revision: 189029 URL: http://svn.freebsd.org/changeset/base/189029 Log: Correct a deadlock and a rtentry leak in rt_check(): - In the event that a gateway route has to be looked up, drop the lock on 'rt' before reacquiring it 'rt0' in order to avoid deadlock. - In the event the original route has evaporated or is no longer up after the gateway route lookup, call RTFREE() on the gateway route before retrying. This is a potential errata candidate patch. PR: kern/130652 Submitted by: Dmitrij Tejblum Reviewed by: bz Tested by: Pete French Modified: stable/7/sys/net/route.c Modified: stable/7/sys/net/route.c ============================================================================== --- stable/7/sys/net/route.c Wed Feb 25 11:13:13 2009 (r189028) +++ stable/7/sys/net/route.c Wed Feb 25 11:18:18 2009 (r189029) @@ -1650,27 +1650,34 @@ retry: return (ENETUNREACH); } /* - * Relock it and lose the added reference. - * All sorts of things could have happenned while we - * had no lock on it, so check for them. + * Relock it and lose the added reference. All sorts + * of things could have happenned while we had no + * lock on it, so check for them. rt need to be + * unlocked to avoid possible deadlock. */ + RT_UNLOCK(rt); RT_RELOCK(rt0); - if (rt0 == NULL || ((rt0->rt_flags & RTF_UP) == 0)) + if (rt0 == NULL || ((rt0->rt_flags & RTF_UP) == 0)) { /* Ru-roh.. what we had is no longer any good */ + RTFREE(rt); goto retry; + } /* * While we were away, someone replaced the gateway. * Since a reference count is involved we can't just * overwrite it. */ if (rt0->rt_gwroute) { - if (rt0->rt_gwroute != rt) { - RTFREE_LOCKED(rt); - goto retry; - } + if (rt0->rt_gwroute != rt) + RTFREE(rt); } else { rt0->rt_gwroute = rt; } + /* + * Since rt was not locked, we need recheck that + * it still may be used (e.g. up) + */ + goto retry; } RT_LOCK_ASSERT(rt); RT_UNLOCK(rt0); From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 11:37:19 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6C12F106566B; Wed, 25 Feb 2009 11:37:19 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 585418FC18; Wed, 25 Feb 2009 11:37:19 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PBbJar095112; Wed, 25 Feb 2009 11:37:19 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PBbJkM095110; Wed, 25 Feb 2009 11:37:19 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251137.n1PBbJkM095110@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 11:37:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189030 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb dev/nve X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 11:37:20 -0000 Author: rwatson Date: Wed Feb 25 11:37:19 2009 New Revision: 189030 URL: http://svn.freebsd.org/changeset/base/189030 Log: Merge r179458 from head to stable/7: Import rewritten nve device id's, which brings this more inline with if_nfe. PR: 110883 Submitted by: Claudel Approved by: imp (mentor, implicit) Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/dev/nve/if_nve.c stable/7/sys/dev/nve/if_nvereg.h Modified: stable/7/sys/dev/nve/if_nve.c ============================================================================== --- stable/7/sys/dev/nve/if_nve.c Wed Feb 25 11:18:18 2009 (r189029) +++ stable/7/sys/dev/nve/if_nve.c Wed Feb 25 11:37:19 2009 (r189030) @@ -211,32 +211,52 @@ DRIVER_MODULE(nve, pci, nve_driver, nve_ DRIVER_MODULE(miibus, nve, miibus_driver, miibus_devclass, 0, 0); static struct nve_type nve_devs[] = { - {NVIDIA_VENDORID, NFORCE_MCPNET1_DEVICEID, - "NVIDIA nForce MCP Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET2_DEVICEID, - "NVIDIA nForce MCP2 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET3_DEVICEID, - "NVIDIA nForce MCP3 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET4_DEVICEID, - "NVIDIA nForce MCP4 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET5_DEVICEID, - "NVIDIA nForce MCP5 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET6_DEVICEID, - "NVIDIA nForce MCP6 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET7_DEVICEID, - "NVIDIA nForce MCP7 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET8_DEVICEID, - "NVIDIA nForce MCP8 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET9_DEVICEID, - "NVIDIA nForce MCP9 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET10_DEVICEID, - "NVIDIA nForce MCP10 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET11_DEVICEID, - "NVIDIA nForce MCP11 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET12_DEVICEID, - "NVIDIA nForce MCP12 Networking Adapter"}, - {NVIDIA_VENDORID, NFORCE_MCPNET13_DEVICEID, - "NVIDIA nForce MCP13 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE_LAN, + "NVIDIA nForce MCP Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_LAN, + "NVIDIA nForce2 MCP2 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN1, + "NVIDIA nForce2 400 MCP4 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN2, + "NVIDIA nForce2 400 MCP5 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN1, + "NVIDIA nForce3 MCP3 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_250_LAN, + "NVIDIA nForce3 250 MCP6 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE3_LAN4, + "NVIDIA nForce3 MCP7 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE4_LAN1, + "NVIDIA nForce4 CK804 MCP8 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE4_LAN2, + "NVIDIA nForce4 CK804 MCP9 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN1, + "NVIDIA nForce MCP04 Networking Adapter"}, // MCP10 + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP04_LAN2, + "NVIDIA nForce MCP04 Networking Adapter"}, // MCP11 + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE430_LAN1, + "NVIDIA nForce 430 MCP12 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_NFORCE430_LAN2, + "NVIDIA nForce 430 MCP13 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN1, + "NVIDIA nForce MCP55 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP55_LAN2, + "NVIDIA nForce MCP55 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN1, + "NVIDIA nForce MCP61 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN2, + "NVIDIA nForce MCP61 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN3, + "NVIDIA nForce MCP61 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP61_LAN4, + "NVIDIA nForce MCP61 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN1, + "NVIDIA nForce MCP65 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN2, + "NVIDIA nForce MCP65 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN3, + "NVIDIA nForce MCP65 Networking Adapter"}, + {PCI_VENDOR_NVIDIA, PCI_PRODUCT_NVIDIA_MCP65_LAN4, + "NVIDIA nForce MCP65 Networking Adapter"}, {0, 0, NULL} }; Modified: stable/7/sys/dev/nve/if_nvereg.h ============================================================================== --- stable/7/sys/dev/nve/if_nvereg.h Wed Feb 25 11:18:18 2009 (r189029) +++ stable/7/sys/dev/nve/if_nvereg.h Wed Feb 25 11:37:19 2009 (r189030) @@ -31,23 +31,41 @@ #ifndef _IF_NVEREG_H_ #define _IF_NVEREG_H_ -#ifndef NVIDIA_VENDORID -#define NVIDIA_VENDORID 0x10DE +#ifndef PCI_VENDOR_NVIDIA +#define PCI_VENDOR_NVIDIA 0x10DE #endif -#define NFORCE_MCPNET1_DEVICEID 0x01C3 -#define NFORCE_MCPNET2_DEVICEID 0x0066 -#define NFORCE_MCPNET3_DEVICEID 0x00D6 -#define NFORCE_MCPNET4_DEVICEID 0x0086 -#define NFORCE_MCPNET5_DEVICEID 0x008C -#define NFORCE_MCPNET6_DEVICEID 0x00E6 -#define NFORCE_MCPNET7_DEVICEID 0x00DF -#define NFORCE_MCPNET8_DEVICEID 0x0056 -#define NFORCE_MCPNET9_DEVICEID 0x0057 -#define NFORCE_MCPNET10_DEVICEID 0x0037 -#define NFORCE_MCPNET11_DEVICEID 0x0038 -#define NFORCE_MCPNET12_DEVICEID 0x0268 -#define NFORCE_MCPNET13_DEVICEID 0x0269 +#define PCI_PRODUCT_NVIDIA_NFORCE_LAN 0x01C3 +#define PCI_PRODUCT_NVIDIA_NFORCE2_LAN 0x0066 +#define PCI_PRODUCT_NVIDIA_NFORCE3_LAN1 0x00D6 +#define PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN1 0x0086 +#define PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN2 0x008C +#define PCI_PRODUCT_NVIDIA_NFORCE3_250_LAN 0x00E6 +#define PCI_PRODUCT_NVIDIA_NFORCE3_LAN4 0x00DF +#define PCI_PRODUCT_NVIDIA_NFORCE4_LAN1 0x0056 +#define PCI_PRODUCT_NVIDIA_NFORCE4_LAN2 0x0057 +#define PCI_PRODUCT_NVIDIA_MCP04_LAN1 0x0037 +#define PCI_PRODUCT_NVIDIA_MCP04_LAN2 0x0038 +#define PCI_PRODUCT_NVIDIA_NFORCE430_LAN1 0x0268 +#define PCI_PRODUCT_NVIDIA_NFORCE430_LAN2 0x0269 +#define PCI_PRODUCT_NVIDIA_MCP55_LAN1 0x0372 +#define PCI_PRODUCT_NVIDIA_MCP55_LAN2 0x0373 +#define PCI_PRODUCT_NVIDIA_MCP61_LAN1 0x03e5 +#define PCI_PRODUCT_NVIDIA_MCP61_LAN2 0x03e6 +#define PCI_PRODUCT_NVIDIA_MCP61_LAN3 0x03ee +#define PCI_PRODUCT_NVIDIA_MCP61_LAN4 0x03ef +#define PCI_PRODUCT_NVIDIA_MCP65_LAN1 0x0450 +#define PCI_PRODUCT_NVIDIA_MCP65_LAN2 0x0451 +#define PCI_PRODUCT_NVIDIA_MCP65_LAN3 0x0452 +#define PCI_PRODUCT_NVIDIA_MCP65_LAN4 0x0453 + +#define PCI_PRODUCT_NVIDIA_NFORCE3_LAN2 PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN1 +#define PCI_PRODUCT_NVIDIA_NFORCE3_LAN3 PCI_PRODUCT_NVIDIA_NFORCE2_400_LAN2 +#define PCI_PRODUCT_NVIDIA_NFORCE3_LAN5 PCI_PRODUCT_NVIDIA_NFORCE3_250_LAN +#define PCI_PRODUCT_NVIDIA_CK804_LAN1 PCI_PRODUCT_NVIDIA_NFORCE4_LAN1 +#define PCI_PRODUCT_NVIDIA_CK804_LAN2 PCI_PRODUCT_NVIDIA_NFORCE4_LAN2 +#define PCI_PRODUCT_NVIDIA_MCP51_LAN1 PCI_PRODUCT_NVIDIA_NFORCE430_LAN1 +#define PCI_PRODUCT_NVIDIA_MCP51_LAN2 PCI_PRODUCT_NVIDIA_NFORCE430_LAN2 #define NV_RID 0x10 From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 11:44:03 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A077F1065670; Wed, 25 Feb 2009 11:44:03 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8CD3A8FC14; Wed, 25 Feb 2009 11:44:03 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PBi32D095314; Wed, 25 Feb 2009 11:44:03 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PBi3Jp095313; Wed, 25 Feb 2009 11:44:03 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251144.n1PBi3Jp095313@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 11:44:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189031 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 11:44:04 -0000 Author: rwatson Date: Wed Feb 25 11:44:03 2009 New Revision: 189031 URL: http://svn.freebsd.org/changeset/base/189031 Log: Merge r186825 from head to stable/7: Do a lockless read of the audit pipe list before grabbing the audit pipe lock in order to avoid the lock acquire hit if the pipe list is very likely empty. Obtained from: TrustedBSD Project Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 11:37:19 2009 (r189030) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 11:44:03 2009 (r189031) @@ -407,6 +407,10 @@ audit_pipe_preselect(au_id_t auid, au_ev { struct audit_pipe *ap; + /* Lockless read to avoid acquiring the global lock if not needed. */ + if (TAILQ_EMPTY(&audit_pipe_list)) + return (0); + AUDIT_PIPE_LIST_RLOCK(); TAILQ_FOREACH(ap, &audit_pipe_list, ap_list) { AUDIT_PIPE_LOCK(ap); From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 12:00:15 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EE49410656D8; Wed, 25 Feb 2009 12:00:15 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DA05A8FC17; Wed, 25 Feb 2009 12:00:15 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PC0FHb095818; Wed, 25 Feb 2009 12:00:15 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PC0FE9095817; Wed, 25 Feb 2009 12:00:15 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251200.n1PC0FE9095817@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 12:00:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189032 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 12:00:17 -0000 Author: rwatson Date: Wed Feb 25 12:00:15 2009 New Revision: 189032 URL: http://svn.freebsd.org/changeset/base/189032 Log: Merge r184508 from head to stable/7: Historically, /dev/auditpipe has allows only whole records to be read via read(2), which meant that records longer than the buffer passed to read(2) were dropped. Instead take the approach of allowing partial reads to be continued across multiple system calls more in the style of streaming character device. This means retaining a record on the per-pipe queue in a partially read state, so maintain a current offset into the record. Keep the record on the queue during a read, so add a new lock, ap_sx, to serialize removal of records from the queue by either read(2) or ioctl(2) requesting a pipe flush. Modify the kqueue handler to return bytes left in the current record rather than simply the size of the current record. It is now possible to use praudit, which used the standard FILE * buffer sizes, to track much larger record sizes from /dev/auditpipe, such as very long command lines to execve(2). Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 11:44:03 2009 (r189031) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 12:00:15 2009 (r189032) @@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -84,6 +85,7 @@ static MALLOC_DEFINE(M_AUDIT_PIPE_PRESEL struct audit_pipe_entry { void *ape_record; u_int ape_record_len; + u_int ape_record_offset; TAILQ_ENTRY(audit_pipe_entry) ape_queue; }; @@ -120,7 +122,15 @@ struct audit_pipe { /* * Per-pipe mutex protecting most fields in this data structure. */ - struct mtx ap_lock; + struct mtx ap_mtx; + + /* + * Per-pipe sleep lock serializing user-generated reads and flushes. + * uiomove() is called to copy out the current head record's data + * while the record remains in the queue, so we prevent other threads + * from removing it using this lock. + */ + struct sx ap_sx; /* * Condition variable to signal when data has been delivered to a @@ -147,7 +157,9 @@ struct audit_pipe { TAILQ_HEAD(, audit_pipe_preselect) ap_preselect_list; /* - * Current pending record list. + * Current pending record list. Protected by a combination of ap_mtx + * and ap_sx. Note particularly that *both* locks are required to + * remove a record from the head of the queue, as an in-progress read * may sleep while copying and therefore cannot hold ap_mtx. */ TAILQ_HEAD(, audit_pipe_entry) ap_queue; @@ -157,13 +169,19 @@ struct audit_pipe { TAILQ_ENTRY(audit_pipe) ap_list; }; -#define AUDIT_PIPE_LOCK(ap) mtx_lock(&(ap)->ap_lock) -#define AUDIT_PIPE_LOCK_ASSERT(ap) mtx_assert(&(ap)->ap_lock, MA_OWNED) -#define AUDIT_PIPE_LOCK_DESTROY(ap) mtx_destroy(&(ap)->ap_lock) -#define AUDIT_PIPE_LOCK_INIT(ap) mtx_init(&(ap)->ap_lock, \ - "audit_pipe_lock", NULL, MTX_DEF) -#define AUDIT_PIPE_UNLOCK(ap) mtx_unlock(&(ap)->ap_lock) -#define AUDIT_PIPE_MTX(ap) (&(ap)->ap_lock) +#define AUDIT_PIPE_LOCK(ap) mtx_lock(&(ap)->ap_mtx) +#define AUDIT_PIPE_LOCK_ASSERT(ap) mtx_assert(&(ap)->ap_mtx, MA_OWNED) +#define AUDIT_PIPE_LOCK_DESTROY(ap) mtx_destroy(&(ap)->ap_mtx) +#define AUDIT_PIPE_LOCK_INIT(ap) mtx_init(&(ap)->ap_mtx, \ + "audit_pipe_mtx", NULL, MTX_DEF) +#define AUDIT_PIPE_UNLOCK(ap) mtx_unlock(&(ap)->ap_mtx) +#define AUDIT_PIPE_MTX(ap) (&(ap)->ap_mtx) + +#define AUDIT_PIPE_SX_LOCK_DESTROY(ap) sx_destroy(&(ap)->ap_sx) +#define AUDIT_PIPE_SX_LOCK_INIT(ap) sx_init(&(ap)->ap_sx, "audit_pipe_sx") +#define AUDIT_PIPE_SX_XLOCK_ASSERT(ap) sx_assert(&(ap)->ap_sx, SA_XLOCKED) +#define AUDIT_PIPE_SX_XLOCK_SIG(ap) sx_xlock_sig(&(ap)->ap_sx) +#define AUDIT_PIPE_SX_XUNLOCK(ap) sx_xunlock(&(ap)->ap_sx) /* * Global list of audit pipes, rwlock to protect it. Individual record @@ -461,6 +479,7 @@ audit_pipe_append(struct audit_pipe *ap, bcopy(record, ape->ape_record, record_len); ape->ape_record_len = record_len; + ape->ape_record_offset = 0; TAILQ_INSERT_TAIL(&ap->ap_queue, ape, ape_queue); ap->ap_inserts++; @@ -534,26 +553,6 @@ audit_pipe_submit_user(void *record, u_i } /* - * Pop the next record off of an audit pipe. - */ -static struct audit_pipe_entry * -audit_pipe_pop(struct audit_pipe *ap) -{ - struct audit_pipe_entry *ape; - - AUDIT_PIPE_LOCK_ASSERT(ap); - - ape = TAILQ_FIRST(&ap->ap_queue); - KASSERT((ape == NULL && ap->ap_qlen == 0) || - (ape != NULL && ap->ap_qlen != 0), ("audit_pipe_pop: qlen")); - if (ape == NULL) - return (NULL); - TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); - ap->ap_qlen--; - return (ape); -} - -/* * Allocate a new audit pipe. Connects the pipe, on success, to the global * list and updates statistics. */ @@ -572,6 +571,7 @@ audit_pipe_alloc(void) knlist_init(&ap->ap_selinfo.si_note, AUDIT_PIPE_MTX(ap), NULL, NULL, NULL); AUDIT_PIPE_LOCK_INIT(ap); + AUDIT_PIPE_SX_LOCK_INIT(ap); cv_init(&ap->ap_cv, "audit_pipe"); /* @@ -630,6 +630,7 @@ audit_pipe_free(struct audit_pipe *ap) audit_pipe_preselect_flush_locked(ap); audit_pipe_flush(ap); cv_destroy(&ap->ap_cv); + AUDIT_PIPE_SX_LOCK_DESTROY(ap); AUDIT_PIPE_LOCK_DESTROY(ap); knlist_destroy(&ap->ap_selinfo.si_note); TAILQ_REMOVE(&audit_pipe_list, ap, ap_list); @@ -758,7 +759,8 @@ audit_pipe_ioctl(struct cdev *dev, u_lon AUDIT_PIPE_LOCK(ap); if (TAILQ_FIRST(&ap->ap_queue) != NULL) *(int *)data = - TAILQ_FIRST(&ap->ap_queue)->ape_record_len; + TAILQ_FIRST(&ap->ap_queue)->ape_record_len - + TAILQ_FIRST(&ap->ap_queue)->ape_record_offset; else *(int *)data = 0; AUDIT_PIPE_UNLOCK(ap); @@ -892,9 +894,12 @@ audit_pipe_ioctl(struct cdev *dev, u_lon break; case AUDITPIPE_FLUSH: + if (AUDIT_PIPE_SX_XLOCK_SIG(ap) != 0) + return (EINTR); AUDIT_PIPE_LOCK(ap); audit_pipe_flush(ap); AUDIT_PIPE_UNLOCK(ap); + AUDIT_PIPE_SX_XUNLOCK(ap); error = 0; break; @@ -949,45 +954,68 @@ audit_pipe_read(struct cdev *dev, struct { struct audit_pipe_entry *ape; struct audit_pipe *ap; + u_int toread; int error; ap = dev->si_drv1; KASSERT(ap != NULL, ("audit_pipe_read: ap == NULL")); + /* + * We hold an sx(9) lock over read and flush because we rely on the + * stability of a record in the queue during uiomove(9). + */ + if (AUDIT_PIPE_SX_XLOCK_SIG(ap) != 0) + return (EINTR); AUDIT_PIPE_LOCK(ap); - do { - /* - * Wait for a record that fits into the read buffer, dropping - * records that would be truncated if actually passed to the - * process. This helps maintain the discreet record read - * interface. - */ - while ((ape = audit_pipe_pop(ap)) == NULL) { - if (ap->ap_flags & AUDIT_PIPE_NBIO) { - AUDIT_PIPE_UNLOCK(ap); - return (EAGAIN); - } - error = cv_wait_sig(&ap->ap_cv, AUDIT_PIPE_MTX(ap)); - if (error) { - AUDIT_PIPE_UNLOCK(ap); - return (error); - } + while (TAILQ_EMPTY(&ap->ap_queue)) { + if (ap->ap_flags & AUDIT_PIPE_NBIO) { + AUDIT_PIPE_UNLOCK(ap); + AUDIT_PIPE_SX_XUNLOCK(ap); + return (EAGAIN); } - if (ape->ape_record_len <= uio->uio_resid) - break; - audit_pipe_entry_free(ape); - ap->ap_truncates++; - } while (1); + error = cv_wait_sig(&ap->ap_cv, AUDIT_PIPE_MTX(ap)); + if (error) { + AUDIT_PIPE_UNLOCK(ap); + AUDIT_PIPE_SX_XUNLOCK(ap); + return (error); + } + } + + /* + * Copy as many remaining bytes from the current record to userspace + * as we can. + * + * Note: we rely on the SX lock to maintain ape's stability here. + */ ap->ap_reads++; + ape = TAILQ_FIRST(&ap->ap_queue); + toread = MIN(ape->ape_record_len - ape->ape_record_offset, + uio->uio_resid); AUDIT_PIPE_UNLOCK(ap); + error = uiomove((char *)ape->ape_record + ape->ape_record_offset, + toread, uio); + if (error) { + AUDIT_PIPE_SX_XUNLOCK(ap); + return (error); + } /* - * Now read record to user space memory. Even if the read is short, - * we abandon the remainder of the record, supporting only discreet - * record reads. + * If the copy succeeded, update book-keeping, and if no bytes remain + * in the current record, free it. */ - error = uiomove(ape->ape_record, ape->ape_record_len, uio); - audit_pipe_entry_free(ape); + AUDIT_PIPE_LOCK(ap); + KASSERT(TAILQ_FIRST(&ap->ap_queue) == ape, + ("audit_pipe_read: queue out of sync after uiomove")); + ape->ape_record_offset += toread; + if (ape->ape_record_offset == ape->ape_record_len) { + TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); + ap->ap_qlen--; + } else + ape = NULL; + AUDIT_PIPE_UNLOCK(ap); + AUDIT_PIPE_SX_XUNLOCK(ap); + if (ape != NULL) + audit_pipe_entry_free(ape); return (error); } @@ -1056,7 +1084,7 @@ audit_pipe_kqread(struct knote *kn, long ape = TAILQ_FIRST(&ap->ap_queue); KASSERT(ape != NULL, ("audit_pipe_kqread: ape == NULL")); - kn->kn_data = ape->ape_record_len; + kn->kn_data = ape->ape_record_len - ape->ape_record_offset; return (1); } else { kn->kn_data = 0; From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 12:22:26 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A062C106566B; Wed, 25 Feb 2009 12:22:26 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 7915A8FC14; Wed, 25 Feb 2009 12:22:26 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from fledge.watson.org (fledge.watson.org [65.122.17.41]) by cyrus.watson.org (Postfix) with ESMTPS id 1BC5B46B2A; Wed, 25 Feb 2009 07:22:26 -0500 (EST) Date: Wed, 25 Feb 2009 12:22:25 +0000 (GMT) From: Robert Watson X-X-Sender: robert@fledge.watson.org To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org In-Reply-To: <200902251118.n1PBIIcQ094668@svn.freebsd.org> Message-ID: References: <200902251118.n1PBIIcQ094668@svn.freebsd.org> User-Agent: Alpine 2.00 (BSF 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: Subject: Re: svn commit: r189029 - stable/7/sys/net X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 12:22:30 -0000 On Wed, 25 Feb 2009, Robert Watson wrote: > Author: rwatson > Date: Wed Feb 25 11:18:18 2009 > New Revision: 189029 > URL: http://svn.freebsd.org/changeset/base/189029 > > Log: > Correct a deadlock and a rtentry leak in rt_check(): > > - In the event that a gateway route has to be looked up, drop the lock > on 'rt' before reacquiring it 'rt0' in order to avoid deadlock. > > - In the event the original route has evaporated or is no longer up > after the gateway route lookup, call RTFREE() on the gateway route > before retrying. > > This is a potential errata candidate patch. Just to clarify preemptively: rt_check() isn't present in 8.x due to the link layer routing rewrite, so this was committed directly to 7.x. Robert N M Watson Computer Laboratory University of Cambridge > > PR: kern/130652 > Submitted by: Dmitrij Tejblum > Reviewed by: bz > Tested by: Pete French > > Modified: > stable/7/sys/net/route.c > > Modified: stable/7/sys/net/route.c > ============================================================================== > --- stable/7/sys/net/route.c Wed Feb 25 11:13:13 2009 (r189028) > +++ stable/7/sys/net/route.c Wed Feb 25 11:18:18 2009 (r189029) > @@ -1650,27 +1650,34 @@ retry: > return (ENETUNREACH); > } > /* > - * Relock it and lose the added reference. > - * All sorts of things could have happenned while we > - * had no lock on it, so check for them. > + * Relock it and lose the added reference. All sorts > + * of things could have happenned while we had no > + * lock on it, so check for them. rt need to be > + * unlocked to avoid possible deadlock. > */ > + RT_UNLOCK(rt); > RT_RELOCK(rt0); > - if (rt0 == NULL || ((rt0->rt_flags & RTF_UP) == 0)) > + if (rt0 == NULL || ((rt0->rt_flags & RTF_UP) == 0)) { > /* Ru-roh.. what we had is no longer any good */ > + RTFREE(rt); > goto retry; > + } > /* > * While we were away, someone replaced the gateway. > * Since a reference count is involved we can't just > * overwrite it. > */ > if (rt0->rt_gwroute) { > - if (rt0->rt_gwroute != rt) { > - RTFREE_LOCKED(rt); > - goto retry; > - } > + if (rt0->rt_gwroute != rt) > + RTFREE(rt); > } else { > rt0->rt_gwroute = rt; > } > + /* > + * Since rt was not locked, we need recheck that > + * it still may be used (e.g. up) > + */ > + goto retry; > } > RT_LOCK_ASSERT(rt); > RT_UNLOCK(rt0); > From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 12:32:16 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 07C60106566C; Wed, 25 Feb 2009 12:32:16 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E89258FC12; Wed, 25 Feb 2009 12:32:15 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PCWFcY096643; Wed, 25 Feb 2009 12:32:15 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PCWF9O096642; Wed, 25 Feb 2009 12:32:15 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251232.n1PCWF9O096642@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 12:32:15 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189033 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 12:32:17 -0000 Author: rwatson Date: Wed Feb 25 12:32:15 2009 New Revision: 189033 URL: http://svn.freebsd.org/changeset/base/189033 Log: Merge 3184510 from head to stable/7: Since there is no longer the opportunity for record truncation, just return 0 if the truncation counter is queried on an audit pipe. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 12:00:15 2009 (r189032) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 12:32:15 2009 (r189033) @@ -144,7 +144,6 @@ struct audit_pipe { u_int64_t ap_inserts; /* Records added. */ u_int64_t ap_reads; /* Records read. */ u_int64_t ap_drops; /* Records dropped. */ - u_int64_t ap_truncates; /* Records too long. */ /* * Fields relating to pipe interest: global masks for unmatched @@ -924,7 +923,7 @@ audit_pipe_ioctl(struct cdev *dev, u_lon break; case AUDITPIPE_GET_TRUNCATES: - *(u_int *)data = ap->ap_truncates; + *(u_int *)data = 0; error = 0; break; From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:17:47 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EB688106566C; Wed, 25 Feb 2009 13:17:46 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D84A18FC15; Wed, 25 Feb 2009 13:17:46 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDHkmT097582; Wed, 25 Feb 2009 13:17:46 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDHkA3097581; Wed, 25 Feb 2009 13:17:46 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251317.n1PDHkA3097581@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:17:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189034 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:17:47 -0000 Author: rwatson Date: Wed Feb 25 13:17:46 2009 New Revision: 189034 URL: http://svn.freebsd.org/changeset/base/189034 Log: Merge r184534 from head to stable/7: Allow a single read(2) system call on an audit pipe to retrieve data from more than one audit record at a time in order to improve efficiency. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 12:32:15 2009 (r189033) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:17:46 2009 (r189034) @@ -934,19 +934,8 @@ audit_pipe_ioctl(struct cdev *dev, u_lon } /* - * Audit pipe read. Pull one record off the queue and copy to user space. - * On error, the record is dropped. - * - * Providing more sophisticated behavior, such as partial reads, is tricky - * due to the potential for parallel I/O. If partial read support is - * required, it will require a per-pipe "current record being read" along - * with an offset into that trecord which has already been read. Threads - * performing partial reads will need to allocate per-thread copies of the - * data so that if another thread completes the read of the record, it can be - * freed without adding reference count logic. If this is added, a flag to - * indicate that only atomic record reads are desired would be useful, as if - * different threads are all waiting for records on the pipe, they will want - * independent record reads, which is currently the behavior. + * Audit pipe read. Read one or more partial or complete records to user + * memory. */ static int audit_pipe_read(struct cdev *dev, struct uio *uio, int flag) @@ -982,40 +971,43 @@ audit_pipe_read(struct cdev *dev, struct /* * Copy as many remaining bytes from the current record to userspace - * as we can. + * as we can. Keep processing records until we run out of records in + * the queue, or until the user buffer runs out of space. * * Note: we rely on the SX lock to maintain ape's stability here. */ ap->ap_reads++; - ape = TAILQ_FIRST(&ap->ap_queue); - toread = MIN(ape->ape_record_len - ape->ape_record_offset, - uio->uio_resid); - AUDIT_PIPE_UNLOCK(ap); - error = uiomove((char *)ape->ape_record + ape->ape_record_offset, - toread, uio); - if (error) { - AUDIT_PIPE_SX_XUNLOCK(ap); - return (error); - } + while ((ape = TAILQ_FIRST(&ap->ap_queue)) != NULL && + uio->uio_resid > 0) { + AUDIT_PIPE_LOCK_ASSERT(ap); - /* - * If the copy succeeded, update book-keeping, and if no bytes remain - * in the current record, free it. - */ - AUDIT_PIPE_LOCK(ap); - KASSERT(TAILQ_FIRST(&ap->ap_queue) == ape, - ("audit_pipe_read: queue out of sync after uiomove")); - ape->ape_record_offset += toread; - if (ape->ape_record_offset == ape->ape_record_len) { - TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); - ap->ap_qlen--; - } else - ape = NULL; + toread = MIN(ape->ape_record_len - ape->ape_record_offset, + uio->uio_resid); + AUDIT_PIPE_UNLOCK(ap); + error = uiomove((char *)ape->ape_record + + ape->ape_record_offset, toread, uio); + if (error) { + AUDIT_PIPE_SX_XUNLOCK(ap); + return (error); + } + + /* + * If the copy succeeded, update book-keeping, and if no + * bytes remain in the current record, free it. + */ + AUDIT_PIPE_LOCK(ap); + KASSERT(TAILQ_FIRST(&ap->ap_queue) == ape, + ("audit_pipe_read: queue out of sync after uiomove")); + ape->ape_record_offset += toread; + if (ape->ape_record_offset == ape->ape_record_len) { + TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); + audit_pipe_entry_free(ape); + ap->ap_qlen--; + } + } AUDIT_PIPE_UNLOCK(ap); AUDIT_PIPE_SX_XUNLOCK(ap); - if (ape != NULL) - audit_pipe_entry_free(ape); - return (error); + return (0); } /* From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:21:28 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6A9C21065679; Wed, 25 Feb 2009 13:21:28 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 55C588FC12; Wed, 25 Feb 2009 13:21:28 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDLSDR097764; Wed, 25 Feb 2009 13:21:28 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDLSNK097763; Wed, 25 Feb 2009 13:21:28 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251321.n1PDLSNK097763@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:21:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189035 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:21:30 -0000 Author: rwatson Date: Wed Feb 25 13:21:28 2009 New Revision: 189035 URL: http://svn.freebsd.org/changeset/base/189035 Log: Merge r184536 from head to stable/7: We only allow a partial read of the first record in an audit pipe record queue, so move the offset field from the per-record audit_pipe_entry structure to the audit_pipe structure. Now that we support reading more than one record at a time, add a new summary field to audit_pipe, ap_qbyteslen, which tracks the total number of bytes present in a pipe, and return that (minus the current offset) via FIONREAD and kqueue's data variable for the pending byte count rather than the number of bytes remaining in only the first record. Add a number of asserts to confirm that these counts and offsets following the expected rules. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:17:46 2009 (r189034) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:21:28 2009 (r189035) @@ -85,7 +85,6 @@ static MALLOC_DEFINE(M_AUDIT_PIPE_PRESEL struct audit_pipe_entry { void *ape_record; u_int ape_record_len; - u_int ape_record_offset; TAILQ_ENTRY(audit_pipe_entry) ape_queue; }; @@ -138,8 +137,17 @@ struct audit_pipe { */ struct cv ap_cv; + /* + * Various queue-reated variables: qlen and qlimit are a count of + * records in the queue; qbyteslen is the number of bytes of data + * across all records, and qoffset is the amount read so far of the + * first record in the queue. The number of bytes available for + * reading in the queue is qbyteslen - qoffset. + */ u_int ap_qlen; u_int ap_qlimit; + u_int ap_qbyteslen; + u_int ap_qoffset; u_int64_t ap_inserts; /* Records added. */ u_int64_t ap_reads; /* Records read. */ @@ -478,11 +486,11 @@ audit_pipe_append(struct audit_pipe *ap, bcopy(record, ape->ape_record, record_len); ape->ape_record_len = record_len; - ape->ape_record_offset = 0; TAILQ_INSERT_TAIL(&ap->ap_queue, ape, ape_queue); ap->ap_inserts++; ap->ap_qlen++; + ap->ap_qbyteslen += ape->ape_record_len; selwakeuppri(&ap->ap_selinfo, PSOCK); KNOTE_LOCKED(&ap->ap_selinfo.si_note, 0); if (ap->ap_flags & AUDIT_PIPE_ASYNC) @@ -607,10 +615,14 @@ audit_pipe_flush(struct audit_pipe *ap) while ((ape = TAILQ_FIRST(&ap->ap_queue)) != NULL) { TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); + ap->ap_qbyteslen -= ape->ape_record_len; audit_pipe_entry_free(ape); ap->ap_qlen--; } - KASSERT(ap->ap_qlen == 0, ("audit_pipe_free: ap_qlen")); + ap->ap_qoffset = 0; + + KASSERT(ap->ap_qlen == 0, ("audit_pipe_free: ap_qbyteslen")); + KASSERT(ap->ap_qbyteslen == 0, ("audit_pipe_flush: ap_qbyteslen")); } /* @@ -756,12 +768,7 @@ audit_pipe_ioctl(struct cdev *dev, u_lon case FIONREAD: AUDIT_PIPE_LOCK(ap); - if (TAILQ_FIRST(&ap->ap_queue) != NULL) - *(int *)data = - TAILQ_FIRST(&ap->ap_queue)->ape_record_len - - TAILQ_FIRST(&ap->ap_queue)->ape_record_offset; - else - *(int *)data = 0; + *(int *)data = ap->ap_qbyteslen - ap->ap_qoffset; AUDIT_PIPE_UNLOCK(ap); error = 0; break; @@ -981,11 +988,13 @@ audit_pipe_read(struct cdev *dev, struct uio->uio_resid > 0) { AUDIT_PIPE_LOCK_ASSERT(ap); - toread = MIN(ape->ape_record_len - ape->ape_record_offset, + KASSERT(ape->ape_record_len > ap->ap_qoffset, + ("audit_pipe_read: record_len > qoffset (1)")); + toread = MIN(ape->ape_record_len - ap->ap_qoffset, uio->uio_resid); AUDIT_PIPE_UNLOCK(ap); - error = uiomove((char *)ape->ape_record + - ape->ape_record_offset, toread, uio); + error = uiomove((char *)ape->ape_record + ap->ap_qoffset, + toread, uio); if (error) { AUDIT_PIPE_SX_XUNLOCK(ap); return (error); @@ -998,11 +1007,15 @@ audit_pipe_read(struct cdev *dev, struct AUDIT_PIPE_LOCK(ap); KASSERT(TAILQ_FIRST(&ap->ap_queue) == ape, ("audit_pipe_read: queue out of sync after uiomove")); - ape->ape_record_offset += toread; - if (ape->ape_record_offset == ape->ape_record_len) { + ap->ap_qoffset += toread; + KASSERT(ape->ape_record_len >= ap->ap_qoffset, + ("audit_pipe_read: record_len >= qoffset (2)")); + if (ap->ap_qoffset == ape->ape_record_len) { TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue); + ap->ap_qbyteslen -= ape->ape_record_len; audit_pipe_entry_free(ape); ap->ap_qlen--; + ap->ap_qoffset = 0; } } AUDIT_PIPE_UNLOCK(ap); @@ -1075,7 +1088,7 @@ audit_pipe_kqread(struct knote *kn, long ape = TAILQ_FIRST(&ap->ap_queue); KASSERT(ape != NULL, ("audit_pipe_kqread: ape == NULL")); - kn->kn_data = ape->ape_record_len - ape->ape_record_offset; + kn->kn_data = ap->ap_qbyteslen - ap->ap_qoffset; return (1); } else { kn->kn_data = 0; From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:26:30 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 75652106564A; Wed, 25 Feb 2009 13:26:30 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 632568FC08; Wed, 25 Feb 2009 13:26:30 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDQUTl097929; Wed, 25 Feb 2009 13:26:30 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDQUO2097928; Wed, 25 Feb 2009 13:26:30 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251326.n1PDQUO2097928@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:26:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189036 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:26:31 -0000 Author: rwatson Date: Wed Feb 25 13:26:30 2009 New Revision: 189036 URL: http://svn.freebsd.org/changeset/base/189036 Log: Merge r184540 from head to stable/7: Add comment for per-pipe stats. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:21:28 2009 (r189035) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:26:30 2009 (r189036) @@ -149,6 +149,9 @@ struct audit_pipe { u_int ap_qbyteslen; u_int ap_qoffset; + /* + * Per-pipe operation statistics. + */ u_int64_t ap_inserts; /* Records added. */ u_int64_t ap_reads; /* Records read. */ u_int64_t ap_drops; /* Records dropped. */ From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:30:17 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A7CF7106566B; Wed, 25 Feb 2009 13:30:17 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7A99D8FC20; Wed, 25 Feb 2009 13:30:17 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDUHnP098087; Wed, 25 Feb 2009 13:30:17 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDUH3P098086; Wed, 25 Feb 2009 13:30:17 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251330.n1PDUH3P098086@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:30:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189037 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:30:18 -0000 Author: rwatson Date: Wed Feb 25 13:30:17 2009 New Revision: 189037 URL: http://svn.freebsd.org/changeset/base/189037 Log: Merge r184544 and r184545 from head to stable/7: Remove stale comment about filtering in audit pipe ioctl routine: we do support filtering now, although we may want to make it more interesting in the future. Update introductory comment for audit pipes. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:26:30 2009 (r189036) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:30:17 2009 (r189037) @@ -57,10 +57,10 @@ __FBSDID("$FreeBSD$"); /* * Implementation of a clonable special device providing a live stream of BSM - * audit data. This is a "tee" of the data going to the file. It provides - * unreliable but timely access to audit events. Consumers of this interface - * should be very careful to avoid introducing event cycles. Consumers may - * express interest via a set of preselection ioctls. + * audit data. Consumers receive a "tee" of the system audit trail by + * default, but may also define alternative event selections using ioctls. + * This interface provides unreliable but timely access to audit events. + * Consumers should be very careful to avoid introducing event cycles. */ /* @@ -736,9 +736,6 @@ audit_pipe_close(struct cdev *dev, int f /* * Audit pipe ioctl() routine. Handle file descriptor and audit pipe layer * commands. - * - * Would be desirable to support filtering, although perhaps something simple - * like an event mask, as opposed to something complicated like BPF. */ static int audit_pipe_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:42:39 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1AE6C106566B; Wed, 25 Feb 2009 13:42:39 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0775B8FC19; Wed, 25 Feb 2009 13:42:39 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDgc8t098368; Wed, 25 Feb 2009 13:42:38 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDgcdd098367; Wed, 25 Feb 2009 13:42:38 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251342.n1PDgcdd098367@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:42:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189038 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:42:39 -0000 Author: rwatson Date: Wed Feb 25 13:42:38 2009 New Revision: 189038 URL: http://svn.freebsd.org/changeset/base/189038 Log: Merge r184825 from head to stable/7: Wrap sx locking of the audit worker sleep lock in macros, update comments. Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_worker.c Modified: stable/7/sys/security/audit/audit_worker.c ============================================================================== --- stable/7/sys/security/audit/audit_worker.c Wed Feb 25 13:30:17 2009 (r189037) +++ stable/7/sys/security/audit/audit_worker.c Wed Feb 25 13:42:38 2009 (r189038) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1999-2005 Apple Inc. + * Copyright (c) 1999-2008 Apple Inc. * Copyright (c) 2006-2008 Robert N. M. Watson * All rights reserved. * @@ -78,17 +78,24 @@ static struct proc *audit_thread; /* * audit_cred and audit_vp are the stored credential and vnode to use for - * active audit trail. They are protected by audit_worker_sx, which will be - * held across all I/O and all rotation to prevent them from being replaced - * (rotated) while in use. The audit_file_rotate_wait flag is set when the - * kernel has delivered a trigger to auditd to rotate the trail, and is - * cleared when the next rotation takes place. It is also protected by - * audit_worker_sx. + * active audit trail. They are protected by the audit worker lock, which + * will be held across all I/O and all rotation to prevent them from being + * replaced (rotated) while in use. The audit_file_rotate_wait flag is set + * when the kernel has delivered a trigger to auditd to rotate the trail, and + * is cleared when the next rotation takes place. It is also protected by + * the audit worker lock. */ static int audit_file_rotate_wait; -static struct sx audit_worker_sx; static struct ucred *audit_cred; static struct vnode *audit_vp; +static struct sx audit_worker_lock; + +#define AUDIT_WORKER_LOCK_INIT() sx_init(&audit_worker_lock, \ + "audit_worker_lock"); +#define AUDIT_WORKER_LOCK_ASSERT() sx_assert(&audit_worker_lock, \ + SA_XLOCKED) +#define AUDIT_WORKER_LOCK() sx_xlock(&audit_worker_lock) +#define AUDIT_WORKER_UNLOCK() sx_xunlock(&audit_worker_lock) /* * Write an audit record to a file, performed as the last stage after both @@ -111,7 +118,7 @@ audit_record_write(struct vnode *vp, str struct vattr vattr; long temp; - sx_assert(&audit_worker_sx, SA_LOCKED); /* audit_file_rotate_wait. */ + AUDIT_WORKER_LOCK_ASSERT(); if (vp == NULL) return; @@ -191,7 +198,7 @@ audit_record_write(struct vnode *vp, str */ if ((audit_fstat.af_filesz != 0) && (audit_file_rotate_wait == 0) && (vattr.va_size >= audit_fstat.af_filesz)) { - sx_assert(&audit_worker_sx, SA_XLOCKED); + AUDIT_WORKER_LOCK_ASSERT(); audit_file_rotate_wait = 1; (void)audit_send_trigger(AUDIT_TRIGGER_ROTATE_KERNEL); @@ -300,20 +307,20 @@ audit_worker_process_record(struct kaudi au_event_t event; au_id_t auid; int error, sorf; - int trail_locked; + int locked; /* - * We hold the audit_worker_sx lock over both writes, if there are - * two, so that the two records won't be split across a rotation and - * end up in two different trail files. + * We hold the audit worker lock over both writes, if there are two, + * so that the two records won't be split across a rotation and end + * up in two different trail files. */ if (((ar->k_ar_commit & AR_COMMIT_USER) && (ar->k_ar_commit & AR_PRESELECT_USER_TRAIL)) || (ar->k_ar_commit & AR_PRESELECT_TRAIL)) { - sx_xlock(&audit_worker_sx); - trail_locked = 1; + AUDIT_WORKER_LOCK(); + locked = 1; } else - trail_locked = 0; + locked = 0; /* * First, handle the user record, if any: commit to the system trail @@ -321,7 +328,7 @@ audit_worker_process_record(struct kaudi */ if ((ar->k_ar_commit & AR_COMMIT_USER) && (ar->k_ar_commit & AR_PRESELECT_USER_TRAIL)) { - sx_assert(&audit_worker_sx, SA_XLOCKED); + AUDIT_WORKER_LOCK_ASSERT(); audit_record_write(audit_vp, audit_cred, ar->k_udata, ar->k_ulen); } @@ -360,7 +367,7 @@ audit_worker_process_record(struct kaudi } if (ar->k_ar_commit & AR_PRESELECT_TRAIL) { - sx_assert(&audit_worker_sx, SA_XLOCKED); + AUDIT_WORKER_LOCK_ASSERT(); audit_record_write(audit_vp, audit_cred, bsm->data, bsm->len); } @@ -371,8 +378,8 @@ audit_worker_process_record(struct kaudi kau_free(bsm); out: - if (trail_locked) - sx_xunlock(&audit_worker_sx); + if (locked) + AUDIT_WORKER_UNLOCK(); } /* @@ -453,14 +460,14 @@ audit_rotate_vnode(struct ucred *cred, s * Rotate the vnode/cred, and clear the rotate flag so that we will * send a rotate trigger if the new file fills. */ - sx_xlock(&audit_worker_sx); + AUDIT_WORKER_LOCK(); old_audit_cred = audit_cred; old_audit_vp = audit_vp; audit_cred = cred; audit_vp = vp; audit_file_rotate_wait = 0; audit_enabled = (audit_vp != NULL); - sx_xunlock(&audit_worker_sx); + AUDIT_WORKER_UNLOCK(); /* * If there was an old vnode/credential, close and free. @@ -479,7 +486,7 @@ audit_worker_init(void) { int error; - sx_init(&audit_worker_sx, "audit_worker_sx"); + AUDIT_WORKER_LOCK_INIT(); error = kthread_create(audit_worker, NULL, &audit_thread, RFHIGHPID, 0, "audit"); if (error) From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 13:47:10 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 26214106566C; Wed, 25 Feb 2009 13:47:10 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 135CC8FC0C; Wed, 25 Feb 2009 13:47:10 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PDl9BU098534; Wed, 25 Feb 2009 13:47:09 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PDl9KO098533; Wed, 25 Feb 2009 13:47:09 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251347.n1PDl9KO098533@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 13:47:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189039 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 13:47:11 -0000 Author: rwatson Date: Wed Feb 25 13:47:09 2009 New Revision: 189039 URL: http://svn.freebsd.org/changeset/base/189039 Log: Merge r188122 from head to stable/7: Eliminate the local variable 'ape' in audit_pipe_kqread(), as it's only used for an assertion that we don't really need anymore. Reported by: Christoph Mallon Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_pipe.c Modified: stable/7/sys/security/audit/audit_pipe.c ============================================================================== --- stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:42:38 2009 (r189038) +++ stable/7/sys/security/audit/audit_pipe.c Wed Feb 25 13:47:09 2009 (r189039) @@ -1076,18 +1076,13 @@ audit_pipe_kqfilter(struct cdev *dev, st static int audit_pipe_kqread(struct knote *kn, long hint) { - struct audit_pipe_entry *ape; struct audit_pipe *ap; ap = (struct audit_pipe *)kn->kn_hook; KASSERT(ap != NULL, ("audit_pipe_kqread: ap == NULL")); - AUDIT_PIPE_LOCK_ASSERT(ap); if (ap->ap_qlen != 0) { - ape = TAILQ_FIRST(&ap->ap_queue); - KASSERT(ape != NULL, ("audit_pipe_kqread: ape == NULL")); - kn->kn_data = ap->ap_qbyteslen - ap->ap_qoffset; return (1); } else { From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 14:08:28 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E3164106568A; Wed, 25 Feb 2009 14:08:28 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B5F1F8FC1A; Wed, 25 Feb 2009 14:08:28 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PE8Sp0099032; Wed, 25 Feb 2009 14:08:28 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PE8SsE099031; Wed, 25 Feb 2009 14:08:28 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251408.n1PE8SsE099031@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 14:08:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189040 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 14:08:29 -0000 Author: rwatson Date: Wed Feb 25 14:08:28 2009 New Revision: 189040 URL: http://svn.freebsd.org/changeset/base/189040 Log: Merge r183689 from head to stable/7: Differentiate pr_usrreqs for stream and datagram UNIX domain sockets, and employ soreceive_dgram for the datagram case. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/kern/uipc_usrreq.c Modified: stable/7/sys/kern/uipc_usrreq.c ============================================================================== --- stable/7/sys/kern/uipc_usrreq.c Wed Feb 25 13:47:09 2009 (r189039) +++ stable/7/sys/kern/uipc_usrreq.c Wed Feb 25 14:08:28 2009 (r189040) @@ -247,20 +247,20 @@ static struct mbuf *unp_addsockcred(stru * Definitions of protocols supported in the LOCAL domain. */ static struct domain localdomain; -static struct pr_usrreqs uipc_usrreqs; +static struct pr_usrreqs uipc_usrreqs_dgram, uipc_usrreqs_stream; static struct protosw localsw[] = { { .pr_type = SOCK_STREAM, .pr_domain = &localdomain, .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS, .pr_ctloutput = &uipc_ctloutput, - .pr_usrreqs = &uipc_usrreqs + .pr_usrreqs = &uipc_usrreqs_stream }, { .pr_type = SOCK_DGRAM, .pr_domain = &localdomain, .pr_flags = PR_ATOMIC|PR_ADDR|PR_RIGHTS, - .pr_usrreqs = &uipc_usrreqs + .pr_usrreqs = &uipc_usrreqs_dgram }, }; @@ -990,7 +990,7 @@ uipc_sockaddr(struct socket *so, struct return (0); } -static struct pr_usrreqs uipc_usrreqs = { +static struct pr_usrreqs uipc_usrreqs_dgram = { .pru_abort = uipc_abort, .pru_accept = uipc_accept, .pru_attach = uipc_attach, @@ -1006,6 +1006,27 @@ static struct pr_usrreqs uipc_usrreqs = .pru_sense = uipc_sense, .pru_shutdown = uipc_shutdown, .pru_sockaddr = uipc_sockaddr, + .pru_soreceive = soreceive_dgram, + .pru_close = uipc_close, +}; + +static struct pr_usrreqs uipc_usrreqs_stream = { + .pru_abort = uipc_abort, + .pru_accept = uipc_accept, + .pru_attach = uipc_attach, + .pru_bind = uipc_bind, + .pru_connect = uipc_connect, + .pru_connect2 = uipc_connect2, + .pru_detach = uipc_detach, + .pru_disconnect = uipc_disconnect, + .pru_listen = uipc_listen, + .pru_peeraddr = uipc_peeraddr, + .pru_rcvd = uipc_rcvd, + .pru_send = uipc_send, + .pru_sense = uipc_sense, + .pru_shutdown = uipc_shutdown, + .pru_sockaddr = uipc_sockaddr, + .pru_soreceive = soreceive_generic, .pru_close = uipc_close, }; From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 14:26:16 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 917FD1065674; Wed, 25 Feb 2009 14:26:16 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7B4A78FC20; Wed, 25 Feb 2009 14:26:16 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PEQGpT099441; Wed, 25 Feb 2009 14:26:16 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PEQG4v099440; Wed, 25 Feb 2009 14:26:16 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251426.n1PEQG4v099440@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 14:26:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189041 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 14:26:19 -0000 Author: rwatson Date: Wed Feb 25 14:26:16 2009 New Revision: 189041 URL: http://svn.freebsd.org/changeset/base/189041 Log: Merge r188123 from head to stable/7: Remove written-to but never read local variable 'offset' from soreceive_dgram(). Submitted by: Christoph Mallon Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/kern/uipc_socket.c Modified: stable/7/sys/kern/uipc_socket.c ============================================================================== --- stable/7/sys/kern/uipc_socket.c Wed Feb 25 14:08:28 2009 (r189040) +++ stable/7/sys/kern/uipc_socket.c Wed Feb 25 14:26:16 2009 (r189041) @@ -1851,7 +1851,7 @@ soreceive_dgram(struct socket *so, struc struct mbuf **mp0, struct mbuf **controlp, int *flagsp) { struct mbuf *m, *m2; - int flags, len, error, offset; + int flags, len, error; struct protosw *pr = so->so_proto; struct mbuf *nextrecord; @@ -2001,7 +2001,6 @@ soreceive_dgram(struct socket *so, struc } KASSERT(m->m_type == MT_DATA, ("soreceive_dgram: !data")); - offset = 0; while (m != NULL && uio->uio_resid > 0) { len = uio->uio_resid; if (len > m->m_len) From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 14:48:13 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6D08E106564A; Wed, 25 Feb 2009 14:48:13 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5A3B68FC15; Wed, 25 Feb 2009 14:48:13 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PEmD9R099899; Wed, 25 Feb 2009 14:48:13 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PEmD0r099898; Wed, 25 Feb 2009 14:48:13 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251448.n1PEmD0r099898@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 14:48:13 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189042 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb netatalk X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 14:48:14 -0000 Author: rwatson Date: Wed Feb 25 14:48:13 2009 New Revision: 189042 URL: http://svn.freebsd.org/changeset/base/189042 Log: Merge 3188124 from head to stable/7: Remove local variable 'ddp' from DDP's attach and detach routines; they were used only for assertions, and rather than ifdef'ing them INVARIANTS and using local variables, just directly access so_pcb. Submitted by: Christoph Mallon Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/netatalk/ddp_usrreq.c Modified: stable/7/sys/netatalk/ddp_usrreq.c ============================================================================== --- stable/7/sys/netatalk/ddp_usrreq.c Wed Feb 25 14:26:16 2009 (r189041) +++ stable/7/sys/netatalk/ddp_usrreq.c Wed Feb 25 14:48:13 2009 (r189042) @@ -75,11 +75,9 @@ static struct ifqueue atintrq1, atintrq2 static int ddp_attach(struct socket *so, int proto, struct thread *td) { - struct ddpcb *ddp; int error = 0; - ddp = sotoddpcb(so); - KASSERT(ddp == NULL, ("ddp_attach: ddp != NULL")); + KASSERT(sotoddpcb(so) == NULL, ("ddp_attach: ddp != NULL")); /* * Allocate socket buffer space first so that it's present @@ -175,10 +173,8 @@ ddp_disconnect(struct socket *so) static int ddp_shutdown(struct socket *so) { - struct ddpcb *ddp; - ddp = sotoddpcb(so); - KASSERT(ddp != NULL, ("ddp_shutdown: ddp == NULL")); + KASSERT(sotoddpcb(so) != NULL, ("ddp_shutdown: ddp == NULL")); socantsendmore(so); return (0); From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 15:01:27 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 274E8106566B; Wed, 25 Feb 2009 15:01:27 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 149CE8FC08; Wed, 25 Feb 2009 15:01:27 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PF1QJR000387; Wed, 25 Feb 2009 15:01:26 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PF1Qcv000386; Wed, 25 Feb 2009 15:01:26 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251501.n1PF1Qcv000386@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 15:01:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189043 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb security/audit X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 15:01:28 -0000 Author: rwatson Date: Wed Feb 25 15:01:26 2009 New Revision: 189043 URL: http://svn.freebsd.org/changeset/base/189043 Log: Merge r188312 from head to stable/7: Audit AUE_MAC_EXECVE; currently just the standard AUE_EXECVE arguments and not the label. Obtained from: TrustedBSD Project Sponsored by: Apple, Inc. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/security/audit/audit_bsm.c Modified: stable/7/sys/security/audit/audit_bsm.c ============================================================================== --- stable/7/sys/security/audit/audit_bsm.c Wed Feb 25 14:48:13 2009 (r189042) +++ stable/7/sys/security/audit/audit_bsm.c Wed Feb 25 15:01:26 2009 (r189043) @@ -764,6 +764,7 @@ kaudit_to_bsm(struct kaudit_record *kar, break; case AUE_EXECVE: + case AUE_MAC_EXECVE: if (ARG_IS_VALID(kar, ARG_ARGV)) { tok = au_to_exec_args(ar->ar_arg_argv, ar->ar_arg_argc); From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 15:04:30 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D7F01106568C; Wed, 25 Feb 2009 15:04:30 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A96438FC1F; Wed, 25 Feb 2009 15:04:30 +0000 (UTC) (envelope-from rwatson@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PF4UaO000512; Wed, 25 Feb 2009 15:04:30 GMT (envelope-from rwatson@svn.freebsd.org) Received: (from rwatson@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PF4UjR000511; Wed, 25 Feb 2009 15:04:30 GMT (envelope-from rwatson@svn.freebsd.org) Message-Id: <200902251504.n1PF4UjR000511@svn.freebsd.org> From: Robert Watson Date: Wed, 25 Feb 2009 15:04:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 15:04:32 -0000 Author: rwatson Date: Wed Feb 25 15:04:30 2009 New Revision: 189044 URL: http://svn.freebsd.org/changeset/base/189044 Log: Merge r188485 from head to stable/7: Modify fdcopy() so that, during fork(2), it won't copy file descriptors from the parent to the child process if they have an operation vector of &badfileops. This narrows a set of races involving system calls that allocate a new file descriptor, potentially block for some extended period, and then return the file descriptor, when invoked by a threaded program that concurrently invokes fork(2). Similar approches are used in both Solaris and Linux, and the wideness of this race was introduced in FreeBSD when we moved to a more optimistic implementation of accept(2) in order to simplify locking. A small race necessarily remains because the fork(2) might occur after the finit() in accept(2) but before the system call has returned, but that appears unavoidable using current APIs. However, this race is vastly narrower. The fix can be validated using the newfileops_on_fork regression test. PR: kern/130348 Reported by: Ivan Shcheklein Reviewed by: jhb, kib Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/kern/kern_descrip.c Modified: stable/7/sys/kern/kern_descrip.c ============================================================================== --- stable/7/sys/kern/kern_descrip.c Wed Feb 25 15:01:26 2009 (r189043) +++ stable/7/sys/kern/kern_descrip.c Wed Feb 25 15:04:30 2009 (r189044) @@ -1613,7 +1613,8 @@ fdcopy(struct filedesc *fdp) newfdp->fd_freefile = -1; for (i = 0; i <= fdp->fd_lastfile; ++i) { if (fdisused(fdp, i) && - fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE) { + fdp->fd_ofiles[i]->f_type != DTYPE_KQUEUE && + fdp->fd_ofiles[i]->f_ops != &badfileops) { newfdp->fd_ofiles[i] = fdp->fd_ofiles[i]; newfdp->fd_ofileflags[i] = fdp->fd_ofileflags[i]; fhold(newfdp->fd_ofiles[i]); From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 16:29:45 2009 Return-Path: Delivered-To: svn-src-stable@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1CE0C106564A; Wed, 25 Feb 2009 16:29:45 +0000 (UTC) (envelope-from gallatin@cs.duke.edu) Received: from duke.cs.duke.edu (duke.cs.duke.edu [152.3.140.1]) by mx1.freebsd.org (Postfix) with ESMTP id CF28F8FC1F; Wed, 25 Feb 2009 16:29:44 +0000 (UTC) (envelope-from gallatin@cs.duke.edu) Received: from [172.31.193.10] (cpe-075-177-134-250.nc.res.rr.com [75.177.134.250]) (authenticated bits=0) by duke.cs.duke.edu (8.14.2/8.14.2) with ESMTP id n1PGSrLV000119 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 25 Feb 2009 11:29:01 -0500 (EST) X-DKIM: Sendmail DKIM Filter v2.5.3 duke.cs.duke.edu n1PGSrLV000119 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=cs.duke.edu; s=mail; t=1235579341; bh=bssSBSsTnBNTXxG5C6QOrYGNjFYPwh1HOpbqkkWGDTo=; h=Message-ID:Date:From:MIME-Version:To:CC:Subject:References: In-Reply-To:Content-Type:Content-Transfer-Encoding; b=NThwOdakM0bv 9a00FBuAxgunrzzmnaO2YLps3hge3KIzq7PwbGQtq88MvDjsCHL85+dFQk0uILh+Hrm dR0UL8kHzYe7sUhrBXrwYoDjzR27UKEbA3Sy+eaFWV6CCkhf8ZahiFLeSyN39/rU7Kk HTJ1zp6MZzJpPyQmiPO8ImQfE= Message-ID: <49A571BE.4060107@cs.duke.edu> Date: Wed, 25 Feb 2009 11:28:46 -0500 From: Andrew Gallatin User-Agent: Thunderbird 2.0.0.19 (X11/20090105) MIME-Version: 1.0 To: src-committers@FreeBSD.org References: <200902251504.n1PF4UjR000511@svn.freebsd.org> In-Reply-To: <200902251504.n1PF4UjR000511@svn.freebsd.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-stable@FreeBSD.org, svn-src-all@FreeBSD.org, svn-src-stable-7@FreeBSD.org Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 16:29:45 -0000 Just picking a commit at random, but is there any way to clean up the props on pf, ath and cxgb: > stable/7/sys/contrib/pf/ (props changed) > stable/7/sys/dev/ath/ath_hal/ (props changed) > stable/7/sys/dev/cxgb/ (props changed) > stable/7/sys/kern/kern_descrip.c Or at the very least, have the email script ignore them? Having this props change garbage always in the $SUBJECT of MFCs makes it very hard to distinguish from the commit message what part of the tree is actually changing. Thanks, Drew From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 16:42:57 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 372F3106566C; Wed, 25 Feb 2009 16:42:57 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 042438FC1A; Wed, 25 Feb 2009 16:42:57 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from server.baldwin.cx (pool-98-109-39-197.nwrknj.fios.verizon.net [98.109.39.197]) by cyrus.watson.org (Postfix) with ESMTPSA id 78B3B46B23; Wed, 25 Feb 2009 11:42:56 -0500 (EST) Received: from localhost (john@localhost [127.0.0.1]) (authenticated bits=0) by server.baldwin.cx (8.14.3/8.14.3) with ESMTP id n1PGgo0m034125; Wed, 25 Feb 2009 11:42:50 -0500 (EST) (envelope-from jhb@freebsd.org) From: John Baldwin To: Andrew Gallatin Date: Wed, 25 Feb 2009 11:42:37 -0500 User-Agent: KMail/1.9.7 References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> In-Reply-To: <49A571BE.4060107@cs.duke.edu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200902251142.38334.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by milter-greylist-2.0.2 (server.baldwin.cx [127.0.0.1]); Wed, 25 Feb 2009 11:42:50 -0500 (EST) X-Virus-Scanned: ClamAV 0.94.2/9047/Wed Feb 25 05:59:41 2009 on server.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-4.4 required=4.2 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.1.3 X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on server.baldwin.cx Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 16:42:57 -0000 On Wednesday 25 February 2009 11:28:46 am Andrew Gallatin wrote: > Just picking a commit at random, but is there any way > to clean up the props on pf, ath and cxgb: > > > stable/7/sys/contrib/pf/ (props changed) > > stable/7/sys/dev/ath/ath_hal/ (props changed) > > stable/7/sys/dev/cxgb/ (props changed) > > stable/7/sys/kern/kern_descrip.c > > Or at the very least, have the email script ignore them? > > Having this props change garbage always in the $SUBJECT of > MFCs makes it very hard to distinguish from the commit > message what part of the tree is actually changing. In theory the mail script is just a python script in svnadmin so we can change it. I know several folks miss the subject lines from CVS that had all the filenames (so you could easily search for commit e-mails to a file by searching subjects in a mail client like kmail), and excluding paths that only have property changes at the same time would probably be good. -- John Baldwin From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 17:22:22 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D15F51065672; Wed, 25 Feb 2009 17:22:22 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from mail.cksoft.de (mail.cksoft.de [62.111.66.27]) by mx1.freebsd.org (Postfix) with ESMTP id 860A38FC1A; Wed, 25 Feb 2009 17:22:22 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from localhost (amavis.str.cksoft.de [192.168.74.71]) by mail.cksoft.de (Postfix) with ESMTP id 9C58741C6B4; Wed, 25 Feb 2009 18:05:05 +0100 (CET) X-Virus-Scanned: amavisd-new at cksoft.de Received: from mail.cksoft.de ([62.111.66.27]) by localhost (amavis.str.cksoft.de [192.168.74.71]) (amavisd-new, port 10024) with ESMTP id oVG-plkqXG-N; Wed, 25 Feb 2009 18:05:05 +0100 (CET) Received: by mail.cksoft.de (Postfix, from userid 66) id 0986341C677; Wed, 25 Feb 2009 18:05:05 +0100 (CET) Received: from maildrop.int.zabbadoz.net (maildrop.int.zabbadoz.net [10.111.66.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.int.zabbadoz.net (Postfix) with ESMTP id A0CC54448E6; Wed, 25 Feb 2009 17:03:52 +0000 (UTC) Date: Wed, 25 Feb 2009 17:03:52 +0000 (UTC) From: "Bjoern A. Zeeb" X-X-Sender: bz@maildrop.int.zabbadoz.net To: John Baldwin In-Reply-To: <200902251142.38334.jhb@freebsd.org> Message-ID: <20090225170115.R53478@maildrop.int.zabbadoz.net> References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> <200902251142.38334.jhb@freebsd.org> X-OpenPGP-Key: 0x14003F198FEFA3E77207EE8D2B58B8F83CCF1842 MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org, Andrew Gallatin Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 17:22:23 -0000 On Wed, 25 Feb 2009, John Baldwin wrote: > On Wednesday 25 February 2009 11:28:46 am Andrew Gallatin wrote: >> Just picking a commit at random, but is there any way >> to clean up the props on pf, ath and cxgb: >> >>> stable/7/sys/contrib/pf/ (props changed) >>> stable/7/sys/dev/ath/ath_hal/ (props changed) >>> stable/7/sys/dev/cxgb/ (props changed) >>> stable/7/sys/kern/kern_descrip.c >> >> Or at the very least, have the email script ignore them? >> >> Having this props change garbage always in the $SUBJECT of >> MFCs makes it very hard to distinguish from the commit >> message what part of the tree is actually changing. > > In theory the mail script is just a python script in svnadmin so we can change > it. I know several folks miss the subject lines from CVS that had all the > filenames (so you could easily search for commit e-mails to a file by > searching subjects in a mail client like kmail), and excluding paths that > only have property changes at the same time would probably be good. I think there are two points here: 1) the svn interface; I remember peter mumbling something about old we use and new one. Maybe that was for something else. 2) the script itself seems very readable but it made me run away last time I tried to look at this. If you like python and have a svn test installation with the freebsd setup it's probably fixable; we could at least sort the prop-only changes to the end of the subject. I think we might need to keep them for the time when people do svn merge --record-only as that ends to be a prop-only change as well. -- Bjoern A. Zeeb The greatest risk is not taking one. From owner-svn-src-stable@FreeBSD.ORG Wed Feb 25 20:56:28 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2225B106566B; Wed, 25 Feb 2009 20:56:28 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0EF0C8FC12; Wed, 25 Feb 2009 20:56:28 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1PKuRph007811; Wed, 25 Feb 2009 20:56:27 GMT (envelope-from emaste@svn.freebsd.org) Received: (from emaste@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1PKuRhk007807; Wed, 25 Feb 2009 20:56:27 GMT (envelope-from emaste@svn.freebsd.org) Message-Id: <200902252056.n1PKuRhk007807@svn.freebsd.org> From: Ed Maste Date: Wed, 25 Feb 2009 20:56:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189056 - stable/7/lib/libthread_db X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Feb 2009 20:56:28 -0000 Author: emaste Date: Wed Feb 25 20:56:27 2009 New Revision: 189056 URL: http://svn.freebsd.org/changeset/base/189056 Log: MFC r177490 - diff reduction w/ head. Use linker set to collection all target operations. Modified: stable/7/lib/libthread_db/ (props changed) stable/7/lib/libthread_db/libc_r_db.c stable/7/lib/libthread_db/libpthread_db.c stable/7/lib/libthread_db/libthr_db.c stable/7/lib/libthread_db/thread_db.c Modified: stable/7/lib/libthread_db/libc_r_db.c ============================================================================== --- stable/7/lib/libthread_db/libc_r_db.c Wed Feb 25 20:26:48 2009 (r189055) +++ stable/7/lib/libthread_db/libc_r_db.c Wed Feb 25 20:56:27 2009 (r189056) @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -346,3 +347,5 @@ struct ta_ops libc_r_db_ops = { .to_thr_setxmmregs = libc_r_db_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libc_r_db_ops); Modified: stable/7/lib/libthread_db/libpthread_db.c ============================================================================== --- stable/7/lib/libthread_db/libpthread_db.c Wed Feb 25 20:26:48 2009 (r189055) +++ stable/7/lib/libthread_db/libpthread_db.c Wed Feb 25 20:56:27 2009 (r189056) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1147,3 +1148,5 @@ struct ta_ops libpthread_db_ops = { .to_thr_setxmmregs = pt_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libpthread_db_ops); Modified: stable/7/lib/libthread_db/libthr_db.c ============================================================================== --- stable/7/lib/libthread_db/libthr_db.c Wed Feb 25 20:26:48 2009 (r189055) +++ stable/7/lib/libthread_db/libthr_db.c Wed Feb 25 20:56:27 2009 (r189056) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -791,3 +792,5 @@ struct ta_ops libthr_db_ops = { .to_thr_setxmmregs = pt_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libthr_db_ops); Modified: stable/7/lib/libthread_db/thread_db.c ============================================================================== --- stable/7/lib/libthread_db/thread_db.c Wed Feb 25 20:26:48 2009 (r189055) +++ stable/7/lib/libthread_db/thread_db.c Wed Feb 25 20:56:27 2009 (r189056) @@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include "thread_db_int.h" @@ -41,24 +43,20 @@ struct td_thragent static TAILQ_HEAD(, td_thragent) proclist = TAILQ_HEAD_INITIALIZER(proclist); -extern struct ta_ops libpthread_db_ops; -extern struct ta_ops libthr_db_ops; - -static struct ta_ops *ops[] = { - &libpthread_db_ops, - &libthr_db_ops, -}; +SET_DECLARE(__ta_ops, struct ta_ops); td_err_e td_init(void) { td_err_e ret, tmp; + struct ta_ops *ops_p, **ops_pp; size_t i; ret = 0; - for (i = 0; i < sizeof(ops)/sizeof(ops[0]); i++) { - if (ops[i]->to_init != NULL) { - tmp = ops[i]->to_init(); + SET_FOREACH(ops_pp, __ta_ops) { + ops_p = *ops_pp; + if (ops_p->to_init != NULL) { + tmp = ops_p->to_init(); if (tmp != TD_OK) ret = tmp; } @@ -107,11 +105,13 @@ td_err_e td_ta_new(struct ps_prochandle *ph, td_thragent_t **pta) { size_t i; + struct ta_ops *ops_p, **ops_pp; - for (i = 0; i < sizeof(ops)/sizeof(ops[0]); ++i) { - if (ops[i]->to_ta_new(ph, pta) == TD_OK) { + SET_FOREACH(ops_pp, __ta_ops) { + ops_p = *ops_pp; + if (ops_p->to_ta_new(ph, pta) == TD_OK) { TAILQ_INSERT_HEAD(&proclist, *pta, ta_next); - (*pta)->ta_ops = ops[i]; + (*pta)->ta_ops = ops_p; return (TD_OK); } } From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 03:36:11 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 94A39106564A; Thu, 26 Feb 2009 03:36:11 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8162D8FC18; Thu, 26 Feb 2009 03:36:11 +0000 (UTC) (envelope-from emaste@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1Q3aB9I015473; Thu, 26 Feb 2009 03:36:11 GMT (envelope-from emaste@svn.freebsd.org) Received: (from emaste@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1Q3aBYM015469; Thu, 26 Feb 2009 03:36:11 GMT (envelope-from emaste@svn.freebsd.org) Message-Id: <200902260336.n1Q3aBYM015469@svn.freebsd.org> From: Ed Maste Date: Thu, 26 Feb 2009 03:36:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org X-SVN-Group: stable-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189058 - stable/6/lib/libthread_db X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 03:36:12 -0000 Author: emaste Date: Thu Feb 26 03:36:10 2009 New Revision: 189058 URL: http://svn.freebsd.org/changeset/base/189058 Log: MFC r177490 - diff reduction w/ head. Use linker set to collection all target operations. Modified: stable/6/lib/libthread_db/ (props changed) stable/6/lib/libthread_db/libc_r_db.c stable/6/lib/libthread_db/libpthread_db.c stable/6/lib/libthread_db/libthr_db.c stable/6/lib/libthread_db/thread_db.c Modified: stable/6/lib/libthread_db/libc_r_db.c ============================================================================== --- stable/6/lib/libthread_db/libc_r_db.c Wed Feb 25 22:24:56 2009 (r189057) +++ stable/6/lib/libthread_db/libc_r_db.c Thu Feb 26 03:36:10 2009 (r189058) @@ -28,6 +28,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -346,3 +347,5 @@ struct ta_ops libc_r_db_ops = { .to_thr_setxmmregs = libc_r_db_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libc_r_db_ops); Modified: stable/6/lib/libthread_db/libpthread_db.c ============================================================================== --- stable/6/lib/libthread_db/libpthread_db.c Wed Feb 25 22:24:56 2009 (r189057) +++ stable/6/lib/libthread_db/libpthread_db.c Thu Feb 26 03:36:10 2009 (r189058) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1147,3 +1148,5 @@ struct ta_ops libpthread_db_ops = { .to_thr_setxmmregs = pt_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libpthread_db_ops); Modified: stable/6/lib/libthread_db/libthr_db.c ============================================================================== --- stable/6/lib/libthread_db/libthr_db.c Wed Feb 25 22:24:56 2009 (r189057) +++ stable/6/lib/libthread_db/libthr_db.c Thu Feb 26 03:36:10 2009 (r189058) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -791,3 +792,5 @@ struct ta_ops libthr_db_ops = { .to_thr_setxmmregs = pt_thr_setxmmregs, #endif }; + +DATA_SET(__ta_ops, libthr_db_ops); Modified: stable/6/lib/libthread_db/thread_db.c ============================================================================== --- stable/6/lib/libthread_db/thread_db.c Wed Feb 25 22:24:56 2009 (r189057) +++ stable/6/lib/libthread_db/thread_db.c Thu Feb 26 03:36:10 2009 (r189058) @@ -31,6 +31,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include "thread_db_int.h" @@ -41,26 +43,20 @@ struct td_thragent static TAILQ_HEAD(, td_thragent) proclist = TAILQ_HEAD_INITIALIZER(proclist); -extern struct ta_ops libc_r_db_ops; -extern struct ta_ops libpthread_db_ops; -extern struct ta_ops libthr_db_ops; - -static struct ta_ops *ops[] = { - &libpthread_db_ops, - &libthr_db_ops, - &libc_r_db_ops -}; +SET_DECLARE(__ta_ops, struct ta_ops); td_err_e td_init(void) { td_err_e ret, tmp; + struct ta_ops *ops_p, **ops_pp; size_t i; ret = 0; - for (i = 0; i < sizeof(ops)/sizeof(ops[0]); i++) { - if (ops[i]->to_init != NULL) { - tmp = ops[i]->to_init(); + SET_FOREACH(ops_pp, __ta_ops) { + ops_p = *ops_pp; + if (ops_p->to_init != NULL) { + tmp = ops_p->to_init(); if (tmp != TD_OK) ret = tmp; } @@ -109,11 +105,13 @@ td_err_e td_ta_new(struct ps_prochandle *ph, td_thragent_t **pta) { size_t i; + struct ta_ops *ops_p, **ops_pp; - for (i = 0; i < sizeof(ops)/sizeof(ops[0]); ++i) { - if (ops[i]->to_ta_new(ph, pta) == TD_OK) { + SET_FOREACH(ops_pp, __ta_ops) { + ops_p = *ops_pp; + if (ops_p->to_ta_new(ph, pta) == TD_OK) { TAILQ_INSERT_HEAD(&proclist, *pta, ta_next); - (*pta)->ta_ops = ops[i]; + (*pta)->ta_ops = ops_p; return (TD_OK); } } From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 15:59:22 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A669F106566B; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8FF368FC12; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QFxM3L031880; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QFxMwT031876; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261559.n1QFxMwT031876@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 15:59:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189075 - in stable/7: lib/libc lib/libc/string lib/libc/sys share/man/man9 sys sys/amd64/amd64 sys/amd64/include sys/arm/arm sys/arm/include sys/conf sys/contrib/pf sys/dev/ath/ath_hal... X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 15:59:23 -0000 Author: jhb Date: Thu Feb 26 15:59:22 2009 New Revision: 189075 URL: http://svn.freebsd.org/changeset/base/189075 Log: MFC: Add support for "superpages" on amd64 and i386. This includes adding the superpage reservation system to the machine-independent VM system as well as changes to the pmap code for amd64 and i386 to support superpages. Reviewed by: alc Tested by: ps Added: stable/7/sys/vm/vm_reserv.c - copied, changed from r174982, head/sys/vm/vm_reserv.c stable/7/sys/vm/vm_reserv.h - copied, changed from r174982, head/sys/vm/vm_reserv.h Deleted: stable/7/sys/vm/vm_pageq.c Modified: stable/7/lib/libc/ (props changed) stable/7/lib/libc/string/ffsll.c (props changed) stable/7/lib/libc/string/flsll.c (props changed) stable/7/lib/libc/sys/mincore.2 stable/7/share/man/man9/ (props changed) stable/7/share/man/man9/vm_map_find.9 stable/7/sys/ (props changed) stable/7/sys/amd64/amd64/pmap.c stable/7/sys/amd64/include/pmap.h stable/7/sys/amd64/include/vmparam.h stable/7/sys/arm/arm/pmap.c stable/7/sys/arm/include/vmparam.h stable/7/sys/conf/files stable/7/sys/conf/options stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/i386/i386/pmap.c stable/7/sys/i386/include/pmap.h stable/7/sys/i386/include/vmparam.h stable/7/sys/ia64/ia64/pmap.c stable/7/sys/ia64/include/vmparam.h stable/7/sys/kern/kern_exec.c stable/7/sys/kern/kern_malloc.c stable/7/sys/powerpc/include/vmparam.h stable/7/sys/powerpc/powerpc/pmap_dispatch.c stable/7/sys/sparc64/include/vmparam.h stable/7/sys/sparc64/sparc64/pmap.c stable/7/sys/sun4v/include/vmparam.h stable/7/sys/sun4v/sun4v/pmap.c stable/7/sys/sys/mman.h stable/7/sys/vm/device_pager.c stable/7/sys/vm/memguard.c stable/7/sys/vm/pmap.h stable/7/sys/vm/vm.h stable/7/sys/vm/vm_extern.h stable/7/sys/vm/vm_fault.c stable/7/sys/vm/vm_init.c stable/7/sys/vm/vm_kern.c stable/7/sys/vm/vm_map.c stable/7/sys/vm/vm_map.h stable/7/sys/vm/vm_mmap.c stable/7/sys/vm/vm_object.c stable/7/sys/vm/vm_object.h stable/7/sys/vm/vm_page.c stable/7/sys/vm/vm_page.h stable/7/sys/vm/vm_pageout.c stable/7/sys/vm/vm_phys.c stable/7/sys/vm/vm_phys.h stable/7/sys/vm/vnode_pager.c Modified: stable/7/lib/libc/sys/mincore.2 ============================================================================== --- stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:59:22 2009 (r189075) @@ -72,6 +72,8 @@ Page has been modified by us. Page has been referenced. .It Dv MINCORE_MODIFIED_OTHER Page has been modified. +.It Dv MINCORE_SUPER +Page is part of a "super" page. (only i386 & amd64) .El .Pp The information returned by Modified: stable/7/share/man/man9/vm_map_find.9 ============================================================================== --- stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:59:22 2009 (r189075) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 19, 2003 +.Dd May 10, 2008 .Dt VM_MAP_FIND 9 .Os .Sh NAME @@ -38,7 +38,7 @@ .Ft int .Fo vm_map_find .Fa "vm_map_t map" "vm_object_t object" "vm_ooffset_t offset" -.Fa "vm_offset_t *addr" "vm_size_t length" "boolean_t find_space" +.Fa "vm_offset_t *addr" "vm_size_t length" "int find_space" .Fa "vm_prot_t prot" "vm_prot_t max" "int cow" .Fc .Sh DESCRIPTION @@ -70,11 +70,25 @@ by the caller before calling this functi .Pp If .Fa find_space -is -.Dv TRUE , +is either +.Dv VMFS_ALIGNED_SPACE +or +.Dv VMFS_ANY_SPACE , the function will call .Xr vm_map_findspace 9 to discover a free region. +Moreover, if +.Fa find_space +is +.Dv VMFS_ALIGNED_SPACE , +the address of the free region will be optimized for the use of superpages. +Otherwise, if +.Fa find_space +is +.Dv VMFS_NO_SPACE , +.Xr vm_map_insert 9 +is called with the given address, +.Fa addr . .Sh IMPLEMENTATION NOTES This function acquires a lock on .Fa map @@ -90,9 +104,14 @@ The .Fn vm_map_find function returns .Dv KERN_SUCCESS -if space for the mapping could be found and -the mapping was successfully created. -If space could not be found in the map, +if the mapping was successfully created. +If space could not be found or +.Fa find_space +was +.Dv VMFS_NO_SPACE +and the given address, +.Fa addr , +was already mapped, .Dv KERN_NO_SPACE will be returned. If the discovered range turned out to be bogus, Modified: stable/7/sys/amd64/amd64/pmap.c ============================================================================== --- stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:59:22 2009 (r189075) @@ -7,7 +7,7 @@ * All rights reserved. * Copyright (c) 2003 Peter Wemm * All rights reserved. - * Copyright (c) 2005 Alan L. Cox + * Copyright (c) 2005-2008 Alan L. Cox * All rights reserved. * * This code is derived from software contributed to Berkeley by @@ -107,10 +107,12 @@ __FBSDID("$FreeBSD$"); #include "opt_msgbuf.h" #include "opt_pmap.h" +#include "opt_vm.h" #include #include #include +#include #include #include #include @@ -134,6 +136,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -149,11 +152,7 @@ __FBSDID("$FreeBSD$"); #define PMAP_SHPGPERPROC 200 #endif -#if defined(DIAGNOSTIC) -#define PMAP_DIAGNOSTIC -#endif - -#if !defined(PMAP_DIAGNOSTIC) +#if !defined(DIAGNOSTIC) #define PMAP_INLINE __gnu89_inline #else #define PMAP_INLINE @@ -166,6 +165,9 @@ __FBSDID("$FreeBSD$"); #define PV_STAT(x) do { } while (0) #endif +#define pa_index(pa) ((pa) >> PDRSHIFT) +#define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) + struct pmap kernel_pmap_store; vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ @@ -176,6 +178,12 @@ static vm_paddr_t dmaplimit; vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS; pt_entry_t pg_nx; +SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); + +static int pg_ps_enabled; +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, + "Are large page mappings enabled?"); + static u_int64_t KPTphys; /* phys addr of kernel level 1 */ static u_int64_t KPDphys; /* phys addr of kernel level 2 */ u_int64_t KPDPphys; /* phys addr of kernel level 3 */ @@ -188,6 +196,7 @@ static u_int64_t DMPDPphys; /* phys addr * Data for the pv entry allocation mechanism */ static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; +static struct md_page *pv_table; static int shpgperproc = PMAP_SHPGPERPROC; /* @@ -204,11 +213,29 @@ static caddr_t crashdumpmap; static void free_pv_entry(pmap_t pmap, pv_entry_t pv); static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); - +static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); +static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, + vm_offset_t va); + +static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_prot_t prot); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte); +static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); +static boolean_t pmap_is_modified_pvh(struct md_page *pvh); +static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); +static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, + vm_prot_t prot); +static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free); +static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte); static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free); static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, @@ -362,21 +389,6 @@ pmap_pte(pmap_t pmap, vm_offset_t va) } -static __inline pt_entry_t * -pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde) -{ - pd_entry_t *pde; - - pde = pmap_pde(pmap, va); - if (pde == NULL || (*pde & PG_V) == 0) - return NULL; - *ptepde = *pde; - if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */ - return ((pt_entry_t *)pde); - return (pmap_pde_to_pte(pde, va)); -} - - PMAP_INLINE pt_entry_t * vtopte(vm_offset_t va) { @@ -511,6 +523,7 @@ pmap_bootstrap(vm_paddr_t *firstaddr) */ PMAP_LOCK_INIT(kernel_pmap); kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys); + kernel_pmap->pm_root = NULL; kernel_pmap->pm_active = -1; /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvchunk); @@ -609,6 +622,26 @@ pmap_page_init(vm_page_t m) void pmap_init(void) { + pd_entry_t *pd; + vm_page_t mpte; + vm_size_t s; + int i, pv_npg; + + /* + * Initialize the vm page array entries for the kernel pmap's + * page table pages. + */ + pd = pmap_pde(kernel_pmap, VM_MIN_KERNEL_ADDRESS); + for (i = 0; i < NKPT; i++) { + if ((pd[i] & (PG_PS | PG_V)) == (PG_PS | PG_V)) + continue; + mpte = PHYS_TO_VM_PAGE(pd[i] & PG_FRAME); + KASSERT(mpte >= vm_page_array && + mpte < &vm_page_array[vm_page_array_size], + ("pmap_init: page table page is out of range")); + mpte->pindex = pmap_pde_pindex(VM_MIN_KERNEL_ADDRESS) + i; + mpte->phys_addr = pd[i] & PG_FRAME; + } /* * Initialize the address space (zone) for the pv entries. Set a @@ -619,9 +652,28 @@ pmap_init(void) pv_entry_max = shpgperproc * maxproc + cnt.v_page_count; TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max); pv_entry_high_water = 9 * (pv_entry_max / 10); + + /* + * Are large page mappings enabled? + */ + TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled); + + /* + * Calculate the size of the pv head table for superpages. + */ + for (i = 0; phys_avail[i + 1]; i += 2); + pv_npg = round_2mpage(phys_avail[(i - 2) + 1]) / NBPDR; + + /* + * Allocate memory for the pv head table for superpages. + */ + s = (vm_size_t)(pv_npg * sizeof(struct md_page)); + s = round_page(s); + pv_table = (struct md_page *)kmem_alloc(kernel_map, s); + for (i = 0; i < pv_npg; i++) + TAILQ_INIT(&pv_table[i].pv_list); } -SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); static int pmap_pventry_proc(SYSCTL_HANDLER_ARGS) { @@ -652,6 +704,25 @@ pmap_shpgperproc_proc(SYSCTL_HANDLER_ARG SYSCTL_PROC(_vm_pmap, OID_AUTO, shpgperproc, CTLTYPE_INT|CTLFLAG_RW, &shpgperproc, 0, pmap_shpgperproc_proc, "IU", "Page share factor per proc"); +SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, + "2MB page mapping counters"); + +static u_long pmap_pde_demotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, demotions, CTLFLAG_RD, + &pmap_pde_demotions, 0, "2MB page demotions"); + +static u_long pmap_pde_mappings; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD, + &pmap_pde_mappings, 0, "2MB page mappings"); + +static u_long pmap_pde_p_failures; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD, + &pmap_pde_p_failures, 0, "2MB page promotion failures"); + +static u_long pmap_pde_promotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD, + &pmap_pde_promotions, 0, "2MB page promotions"); + /*************************************************** * Low level helper routines..... @@ -953,17 +1024,25 @@ pmap_extract_and_hold(pmap_t pmap, vm_of vm_paddr_t pmap_kextract(vm_offset_t va) { - pd_entry_t *pde; + pd_entry_t pde; vm_paddr_t pa; if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) { pa = DMAP_TO_PHYS(va); } else { - pde = vtopde(va); - if (*pde & PG_PS) { - pa = (*pde & PG_PS_FRAME) | (va & PDRMASK); + pde = *vtopde(va); + if (pde & PG_PS) { + pa = (pde & PG_PS_FRAME) | (va & PDRMASK); } else { - pa = *vtopte(va); + /* + * Beware of a concurrent promotion that changes the + * PDE at this point! For example, vtopte() must not + * be used to access the PTE because it would use the + * new PDE. It is, however, safe to use the old PDE + * because the page table page is preserved by the + * promotion. + */ + pa = *pmap_pde_to_pte(&pde, va); pa = (pa & PG_FRAME) | (va & PAGE_MASK); } } @@ -1085,8 +1164,105 @@ pmap_free_zero_pages(vm_page_t free) while (free != NULL) { m = free; free = m->right; - vm_page_free_zero(m); + /* Preserve the page's PG_ZERO setting. */ + vm_page_free_toq(m); + } +} + +/* + * Schedule the specified unused page table page to be freed. Specifically, + * add the page to the specified list of pages that will be released to the + * physical memory manager after the TLB has been updated. + */ +static __inline void +pmap_add_delayed_free_list(vm_page_t m, vm_page_t *free, boolean_t set_PG_ZERO) +{ + + if (set_PG_ZERO) + m->flags |= PG_ZERO; + else + m->flags &= ~PG_ZERO; + m->right = *free; + *free = m; +} + +/* + * Inserts the specified page table page into the specified pmap's collection + * of idle page table pages. Each of a pmap's page table pages is responsible + * for mapping a distinct range of virtual addresses. The pmap's collection is + * ordered by this virtual address range. + */ +static void +pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + root = pmap->pm_root; + if (root == NULL) { + mpte->left = NULL; + mpte->right = NULL; + } else { + root = vm_page_splay(mpte->pindex, root); + if (mpte->pindex < root->pindex) { + mpte->left = root->left; + mpte->right = root; + root->left = NULL; + } else if (mpte->pindex == root->pindex) + panic("pmap_insert_pt_page: pindex already inserted"); + else { + mpte->right = root->right; + mpte->left = root; + root->right = NULL; + } + } + pmap->pm_root = mpte; +} + +/* + * Looks for a page table page mapping the specified virtual address in the + * specified pmap's collection of idle page table pages. Returns NULL if there + * is no page table page corresponding to the specified virtual address. + */ +static vm_page_t +pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va) +{ + vm_page_t mpte; + vm_pindex_t pindex = pmap_pde_pindex(va); + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if ((mpte = pmap->pm_root) != NULL && mpte->pindex != pindex) { + mpte = vm_page_splay(pindex, mpte); + if ((pmap->pm_root = mpte)->pindex != pindex) + mpte = NULL; } + return (mpte); +} + +/* + * Removes the specified page table page from the specified pmap's collection + * of idle page table pages. The specified page table page must be a member of + * the pmap's collection. + */ +static void +pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if (mpte != pmap->pm_root) { + root = vm_page_splay(mpte->pindex, pmap->pm_root); + KASSERT(mpte == root, + ("pmap_remove_pt_page: mpte %p is missing from pmap %p", + mpte, pmap)); + } + if (mpte->left == NULL) + root = mpte->right; + else { + root = vm_page_splay(mpte->pindex, mpte->left); + root->right = mpte->right; + } + pmap->pm_root = root; } /* @@ -1165,8 +1341,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of * Put page on a list so that it is released after * *ALL* TLB shootdown is done */ - m->right = *free; - *free = m; + pmap_add_delayed_free_list(m, free, TRUE); return 1; } @@ -1193,6 +1368,7 @@ pmap_pinit0(pmap_t pmap) PMAP_LOCK_INIT(pmap); pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys); + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1229,6 +1405,7 @@ pmap_pinit(pmap_t pmap) /* install self-referential address mapping entry(s) */ pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | PG_V | PG_RW | PG_A | PG_M; + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1404,7 +1581,7 @@ pmap_allocpte(pmap_t pmap, vm_offset_t v { vm_pindex_t ptepindex; pd_entry_t *pd; - vm_page_t m, free; + vm_page_t m; KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, @@ -1424,21 +1601,21 @@ retry: * This supports switching from a 2MB page to a * normal 4K page. */ - if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { - *pd = 0; - pd = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - free = NULL; - pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va), &free); - pmap_invalidate_all(kernel_pmap); - pmap_free_zero_pages(free); + if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { + if (!pmap_demote_pde(pmap, pd, va)) { + /* + * Invalidation of the 2MB page mapping may have caused + * the deallocation of the underlying PD page. + */ + pd = NULL; + } } /* * If the page table page is mapped, we just increment the * hold count, and activate it. */ - if (pd != 0 && (*pd & PG_V) != 0) { + if (pd != NULL && (*pd & PG_V) != 0) { m = PHYS_TO_VM_PAGE(*pd & PG_FRAME); m->wire_count++; } else { @@ -1471,6 +1648,8 @@ pmap_release(pmap_t pmap) KASSERT(pmap->pm_stats.resident_count == 0, ("pmap_release: pmap resident count %ld != 0", pmap->pm_stats.resident_count)); + KASSERT(pmap->pm_root == NULL, + ("pmap_release: pmap has reserved page table page(s)")); m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME); @@ -1645,11 +1824,16 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll * drastic measures to free some pages so we can allocate * another pv entry chunk. This is normally called to * unmap inactive pages, and if necessary, active pages. + * + * We do not, however, unmap 2mpages because subsequent accesses will + * allocate per-page pv entries until repromotion occurs, thereby + * exacerbating the shortage of free pv entries. */ static void pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) { - pd_entry_t ptepde; + struct md_page *pvh; + pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; pv_entry_t next_pv, pv; @@ -1668,28 +1852,27 @@ pmap_collect(pmap_t locked_pmap, struct else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) continue; pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_collect"); - } + pde = pmap_pde(pmap, va); + KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, va); tpte = pte_load_clear(pte); KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#lx", tpte)); if (tpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_collect: modified page not writable: va: %#lx, pte: %#lx", - va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, va, ptepde, &free); + pmap_unuse_pt(pmap, va, *pde, &free); pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); @@ -1824,24 +2007,133 @@ retry: return (pv); } -static void -pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +/* + * First find and then remove the pv entry for the specified pmap and virtual + * address from the specified pv list. Returns the pv entry if found and NULL + * otherwise. This operation can be performed on pv lists for either 4KB or + * 2MB page mappings. + */ +static __inline pv_entry_t +pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) { pv_entry_t pv; - PMAP_LOCK_ASSERT(pmap, MA_OWNED); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { - if (pmap == PV_PMAP(pv) && va == pv->pv_va) + TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { + if (pmap == PV_PMAP(pv) && va == pv->pv_va) { + TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); break; + } } - KASSERT(pv != NULL, ("pmap_remove_entry: pv not found")); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + return (pv); +} + +/* + * After demotion from a 2MB page mapping to 512 4KB page mappings, + * destroy the pv entry for the 2MB page mapping and reinstantiate the pv + * entries for each of the 4KB page mappings. + */ +static void +pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_demote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the 2mpage's pv entry for this mapping to the first + * page's pv list. + */ + pvh = pa_to_pvh(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found")); + m = PHYS_TO_VM_PAGE(pa); + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); + /* Instantiate the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_pv_demote_pde: page %p is not managed", m)); + va += PAGE_SIZE; + pmap_insert_entry(pmap, va, m); + } while (va < va_last); +} + +/* + * After promotion from 512 4KB page mappings to a single 2MB page mapping, + * replace the many pv entries for the 4KB page mappings by a single pv entry + * for the 2MB page mapping. + */ +static void +pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_promote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the first page's pv entry for this mapping to the + * 2mpage's pv list. Aside from avoiding the cost of a call + * to get_pv_entry(), a transfer avoids the possibility that + * get_pv_entry() calls pmap_collect() and that pmap_collect() + * removes one of the mappings that is being promoted. + */ + m = PHYS_TO_VM_PAGE(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(&m->md, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found")); + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + /* Free the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + va += PAGE_SIZE; + pmap_pvh_free(&m->md, pmap, va); + } while (va < va_last); +} + +/* + * First find and then destroy the pv entry for the specified pmap and virtual + * address. This operation can be performed on pv lists for either 4KB or 2MB + * page mappings. + */ +static void +pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +{ + pv_entry_t pv; + + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pvh_free: pv not found")); free_pv_entry(pmap, pv); } +static void +pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +{ + struct md_page *pvh; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pmap_pvh_free(&m->md, pmap, va); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } +} + /* * Create a pv entry for page at pa for * (pmap, va). @@ -1878,6 +2170,170 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm } /* + * Create the pv entry for a 2MB page mapping. + */ +static boolean_t +pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if (pv_entry_count < pv_entry_high_water && + (pv = get_pv_entry(pmap, TRUE)) != NULL) { + pv->pv_va = va; + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + return (TRUE); + } else + return (FALSE); +} + +/* + * Tries to demote a 2MB page mapping. + */ +static boolean_t +pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +{ + pd_entry_t newpde, oldpde; + pt_entry_t *firstpte, newpte, *pte; + vm_paddr_t mptepa; + vm_page_t free, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + mpte = pmap_lookup_pt_page(pmap, va); + if (mpte != NULL) + pmap_remove_pt_page(pmap, mpte); + else { + KASSERT((*pde & PG_W) == 0, + ("pmap_demote_pde: page table page for a wired mapping" + " is missing")); + free = NULL; + pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free); + pmap_invalidate_page(pmap, trunc_2mpage(va)); + pmap_free_zero_pages(free); + CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx" + " in pmap %p", va, pmap); + return (FALSE); + } + mptepa = VM_PAGE_TO_PHYS(mpte); + firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa); + oldpde = *pde; + newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V; + KASSERT((oldpde & (PG_A | PG_V)) == (PG_A | PG_V), + ("pmap_demote_pde: oldpde is missing PG_A and/or PG_V")); + KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW, + ("pmap_demote_pde: oldpde is missing PG_M")); + KASSERT((oldpde & PG_PS) != 0, + ("pmap_demote_pde: oldpde is missing PG_PS")); + newpte = oldpde & ~PG_PS; + if ((newpte & PG_PDE_PAT) != 0) + newpte ^= PG_PDE_PAT | PG_PTE_PAT; + + /* + * If the mapping has changed attributes, update the page table + * entries. + */ + KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME), + ("pmap_demote_pde: firstpte and newpte map different physical" + " addresses")); + if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE)) + for (pte = firstpte; pte < firstpte + NPTEPG; pte++) { + *pte = newpte; + newpte += PAGE_SIZE; + } + + /* + * Demote the mapping. This pmap is locked. The old PDE has + * PG_A set. If the old PDE has PG_RW set, it also has PG_M + * set. Thus, there is no danger of a race with another + * processor changing the setting of PG_A and/or PG_M between + * the read above and the store below. + */ + pde_store(pde, newpde); + + /* + * Invalidate a stale mapping of the page table page. + */ + pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va)); + + /* + * Demote the pv entry. This depends on the earlier demotion + * of the mapping. Specifically, the (re)creation of a per- + * page pv entry might trigger the execution of pmap_collect(), + * which might reclaim a newly (re)created per-page pv entry + * and destroy the associated mapping. In order to destroy + * the mapping, the PDE must have already changed from mapping + * the 2mpage to referencing the page table page. + */ + if ((oldpde & PG_MANAGED) != 0) + pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME); + + pmap_pde_demotions++; + CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx" + " in pmap %p", va, pmap); + return (TRUE); +} + +/* + * pmap_remove_pde: do the things to unmap a superpage in a process + */ +static int +pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free) +{ + struct md_page *pvh; + pd_entry_t oldpde; + vm_offset_t eva, va; + vm_page_t m, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + KASSERT((sva & PDRMASK) == 0, + ("pmap_remove_pde: sva is not 2mpage aligned")); + oldpde = pte_load_clear(pdq); + if (oldpde & PG_W) + pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE; + + /* + * Machines that don't support invlpg, also don't support + * PG_G. + */ + if (oldpde & PG_G) + pmap_invalidate_page(kernel_pmap, sva); + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + if (oldpde & PG_MANAGED) { + pvh = pa_to_pvh(oldpde & PG_PS_FRAME); + pmap_pvh_free(pvh, pmap, sva); + eva = sva + NBPDR; + for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); + va < eva; va += PAGE_SIZE, m++) { + if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if (oldpde & PG_A) + vm_page_flag_set(m, PG_REFERENCED); + if (TAILQ_EMPTY(&m->md.pv_list) && + TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } + } + if (pmap == kernel_pmap) { + if (!pmap_demote_pde(pmap, pdq, sva)) + panic("pmap_remove_pde: failed demotion"); + } else { + mpte = pmap_lookup_pt_page(pmap, sva); + if (mpte != NULL) { + pmap_remove_pt_page(pmap, mpte); + KASSERT(mpte->wire_count == NPTEPG, + ("pmap_remove_pde: pte page wire count error")); + mpte->wire_count = 0; + pmap_add_delayed_free_list(mpte, free, FALSE); + atomic_subtract_int(&cnt.v_wire_count, 1); + } + } + return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free)); +} + +/* * pmap_remove_pte: do the things to unmap a page in a process */ static int @@ -1900,12 +2356,8 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t pmap->pm_stats.resident_count -= 1; if (oldpte & PG_MANAGED) { m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME); - if (oldpte & PG_M) { - KASSERT((oldpte & PG_RW), - ("pmap_remove_pte: modified page not writable: va: %#lx, pte: %#lx", - va, oldpte)); + if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } if (oldpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); pmap_remove_entry(pmap, m, va); @@ -2013,11 +2465,24 @@ pmap_remove(pmap_t pmap, vm_offset_t sva * Check for large page. */ if ((ptpaddr & PG_PS) != 0) { - *pde = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - pmap_unuse_pt(pmap, sva, *pdpe, &free); - anyvalid = 1; - continue; + /* + * Are we removing the entire large page? If not, + * demote the mapping and fall through. + */ + if (sva + NBPDR == va_next && eva >= va_next) { + /* + * The TLB entry for a PG_G mapping is + * invalidated by pmap_remove_pde(). + */ + if ((ptpaddr & PG_G) == 0) + anyvalid = 1; + pmap_remove_pde(pmap, pde, sva, &free); + continue; + } else if (!pmap_demote_pde(pmap, pde, sva)) { + /* The large page mapping was destroyed. */ + continue; + } else + ptpaddr = *pde; } /* @@ -2067,30 +2532,34 @@ out: void pmap_remove_all(vm_page_t m) { + struct md_page *pvh; pv_entry_t pv; pmap_t pmap; pt_entry_t *pte, tpte; - pd_entry_t ptepde; + pd_entry_t *pde; + vm_offset_t va; vm_page_t free; -#if defined(PMAP_DIAGNOSTIC) - /* - * XXX This makes pmap_remove_all() illegal for non-managed pages! - */ - if (m->flags & PG_FICTITIOUS) { - panic("pmap_remove_all: illegal for unmanaged page, va: 0x%lx", - VM_PAGE_TO_PHYS(m)); - } -#endif + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("pmap_remove_all: page %p is fictitious", m)); mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { + va = pv->pv_va; + pmap = PV_PMAP(pv); + PMAP_LOCK(pmap); + pde = pmap_pde(pmap, va); + (void)pmap_demote_pde(pmap, pde, va); + PMAP_UNLOCK(pmap); + } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, pv->pv_va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_remove_all"); - } + pde = pmap_pde(pmap, pv->pv_va); + KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, pv->pv_va); tpte = pte_load_clear(pte); if (tpte & PG_W) pmap->pm_stats.wired_count--; @@ -2100,14 +2569,10 @@ pmap_remove_all(vm_page_t m) /* * Update the vm_page_t clean and reference bits. */ - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_remove_all: modified page not writable: va: %#lx, pte: %#lx", - pv->pv_va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); + pmap_unuse_pt(pmap, pv->pv_va, *pde, &free); pmap_invalidate_page(pmap, pv->pv_va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); @@ -2118,6 +2583,54 @@ pmap_remove_all(vm_page_t m) } /* + * pmap_protect_pde: do the things to protect a 2mpage in a process + */ +static boolean_t +pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 18:14:14 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2C3DC10656C5; Thu, 26 Feb 2009 18:14:14 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from mail17.syd.optusnet.com.au (mail17.syd.optusnet.com.au [211.29.132.198]) by mx1.freebsd.org (Postfix) with ESMTP id A65D78FC0A; Thu, 26 Feb 2009 18:14:13 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from server.vk2pj.dyndns.org (c122-106-216-167.belrs3.nsw.optusnet.com.au [122.106.216.167]) by mail17.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id n1QIE03a029493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 27 Feb 2009 05:14:02 +1100 X-Bogosity: Ham, spamicity=0.000000 Received: from server.vk2pj.dyndns.org (localhost.vk2pj.dyndns.org [127.0.0.1]) by server.vk2pj.dyndns.org (8.14.3/8.14.3) with ESMTP id n1QIE0Qk070630; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter@server.vk2pj.dyndns.org) Received: (from peter@localhost) by server.vk2pj.dyndns.org (8.14.3/8.14.3/Submit) id n1QIE01T070629; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter) Date: Fri, 27 Feb 2009 05:14:00 +1100 From: Peter Jeremy To: Andrew Gallatin Message-ID: <20090226181400.GB3540@server.vk2pj.dyndns.org> References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5/uDoXvLw7AC5HRs" Content-Disposition: inline In-Reply-To: <49A571BE.4060107@cs.duke.edu> X-PGP-Key: http://members.optusnet.com.au/peterjeremy/pubkey.asc User-Agent: Mutt/1.5.19 (2009-01-05) Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 18:14:15 -0000 --5/uDoXvLw7AC5HRs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2009-Feb-25 11:28:46 -0500, Andrew Gallatin wrote: > Just picking a commit at random, but is there any way > to clean up the props on pf, ath and cxgb: > >> stable/7/sys/contrib/pf/ (props changed) >> stable/7/sys/dev/ath/ath_hal/ (props changed) >> stable/7/sys/dev/cxgb/ (props changed) >> stable/7/sys/kern/kern_descrip.c > > Or at the very least, have the email script ignore them? Having virtually every single commit to 7.x report that properties on sys/contrib/pf, sys/dev/ath/ath_hal and sys/dev/cxgb have changed strikes me as a bug somewhere in the SVN repo or configuration. > Having this props change garbage always in the $SUBJECT of > MFCs makes it very hard to distinguish from the commit > message what part of the tree is actually changing. I also miss having the list of affected files in $SUBJECT - that made it easier to scan for commits to files of interest. --=20 Peter Jeremy --5/uDoXvLw7AC5HRs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.10 (FreeBSD) iEYEARECAAYFAkmm2+gACgkQ/opHv/APuIdl4gCeNfSucr4ssY0R3ibBhzrXe/bm 7gsAn1hZBox7NQvO0KqKSPPOMQH8JO04 =PO3U -----END PGP SIGNATURE----- --5/uDoXvLw7AC5HRs-- From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 18:46:22 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B18810656CB; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 48A0B8FC17; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QIkMhY035220; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QIkMZp035219; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261846.n1QIkMZp035219@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 18:46:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189079 - stable/7/usr.sbin/pciconf X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 18:46:23 -0000 Author: jhb Date: Thu Feb 26 18:46:22 2009 New Revision: 189079 URL: http://svn.freebsd.org/changeset/base/189079 Log: MFC: Sort getopt options alphabetically. Modified: stable/7/usr.sbin/pciconf/ (props changed) stable/7/usr.sbin/pciconf/pciconf.c Modified: stable/7/usr.sbin/pciconf/pciconf.c ============================================================================== --- stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:01:07 2009 (r189078) +++ stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:46:22 2009 (r189079) @@ -97,16 +97,24 @@ main(int argc, char **argv) listmode = readmode = writemode = attachedmode = caps = verbose = byte = isshort = 0; - while ((c = getopt(argc, argv, "aclrwbhv")) != -1) { + while ((c = getopt(argc, argv, "abchlrwv")) != -1) { switch(c) { case 'a': attachedmode = 1; break; + case 'b': + byte = 1; + break; + case 'c': caps = 1; break; + case 'h': + isshort = 1; + break; + case 'l': listmode = 1; break; @@ -119,14 +127,6 @@ main(int argc, char **argv) writemode = 1; break; - case 'b': - byte = 1; - break; - - case 'h': - isshort = 1; - break; - case 'v': verbose = 1; break; From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 18:54:25 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6B95B106567A; Thu, 26 Feb 2009 18:54:25 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 568FF8FC1F; Thu, 26 Feb 2009 18:54:25 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QIsPHx035426; Thu, 26 Feb 2009 18:54:25 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QIsPLP035420; Thu, 26 Feb 2009 18:54:25 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261854.n1QIsPLP035420@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 18:54:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189080 - in stable/7: sys sys/contrib/pf sys/dev/ath/ath_hal sys/dev/cardbus sys/dev/cxgb sys/dev/pci sys/sys usr.sbin/pciconf X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 18:54:26 -0000 Author: jhb Date: Thu Feb 26 18:54:24 2009 New Revision: 189080 URL: http://svn.freebsd.org/changeset/base/189080 Log: MFC: Add a new ioctl to fetch details about an individual BAR of a device and add support for displaying BAR details via a new pciconf flag. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cardbus/cardbus.c stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/dev/pci/pci_user.c stable/7/sys/dev/pci/pcireg.h stable/7/sys/sys/pciio.h stable/7/usr.sbin/pciconf/ (props changed) stable/7/usr.sbin/pciconf/pciconf.8 stable/7/usr.sbin/pciconf/pciconf.c Modified: stable/7/sys/dev/cardbus/cardbus.c ============================================================================== --- stable/7/sys/dev/cardbus/cardbus.c Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/sys/dev/cardbus/cardbus.c Thu Feb 26 18:54:24 2009 (r189080) @@ -145,7 +145,7 @@ cardbus_device_setup_regs(pcicfgregs *cf * Some cards power up with garbage in their BARs. This * code clears all that junk out. */ - for (i = 0; i < PCI_MAX_BAR_0; i++) + for (i = 0; i < PCIR_MAX_BAR_0; i++) pci_write_config(dev, PCIR_BAR(i), 0, 4); cfg->intline = Modified: stable/7/sys/dev/pci/pci_user.c ============================================================================== --- stable/7/sys/dev/pci/pci_user.c Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/sys/dev/pci/pci_user.c Thu Feb 26 18:54:24 2009 (r189080) @@ -307,7 +307,10 @@ pci_ioctl(struct cdev *dev, u_long cmd, struct pci_conf_io *cio; struct pci_devinfo *dinfo; struct pci_io *io; + struct pci_bar_io *bio; struct pci_match_conf *pattern_buf; + struct resource_list_entry *rle; + uint32_t value; size_t confsz, iolen, pbufsz; int error, ionum, i, num_patterns; #ifdef PRE7_COMPAT @@ -319,11 +322,11 @@ pci_ioctl(struct cdev *dev, u_long cmd, io_old = NULL; pattern_buf_old = NULL; - if (!(flag & FWRITE) && - (cmd != PCIOCGETCONF && cmd != PCIOCGETCONF_OLD)) + if (!(flag & FWRITE) && cmd != PCIOCGETBAR && + cmd != PCIOCGETCONF && cmd != PCIOCGETCONF_OLD) return EPERM; #else - if (!(flag & FWRITE) && cmd != PCIOCGETCONF) + if (!(flag & FWRITE) && cmd != PCIOCGETBAR && cmd != PCIOCGETCONF) return EPERM; #endif @@ -669,6 +672,70 @@ getconfexit: } break; + case PCIOCGETBAR: + bio = (struct pci_bar_io *)data; + + /* + * Assume that the user-level bus number is + * in fact the physical PCI bus number. + */ + pcidev = pci_find_dbsf(bio->pbi_sel.pc_domain, + bio->pbi_sel.pc_bus, bio->pbi_sel.pc_dev, + bio->pbi_sel.pc_func); + if (pcidev == NULL) { + error = ENODEV; + break; + } + dinfo = device_get_ivars(pcidev); + + /* + * Look for a resource list entry matching the requested BAR. + * + * XXX: This will not find BARs that are not initialized, but + * maybe that is ok? + */ + rle = resource_list_find(&dinfo->resources, SYS_RES_MEMORY, + bio->pbi_reg); + if (rle == NULL) + rle = resource_list_find(&dinfo->resources, + SYS_RES_IOPORT, bio->pbi_reg); + if (rle == NULL || rle->res == NULL) { + error = EINVAL; + break; + } + + /* + * Ok, we have a resource for this BAR. Read the lower + * 32 bits to get any flags. + */ + value = pci_read_config(pcidev, bio->pbi_reg, 4); + if (PCI_BAR_MEM(value)) { + if (rle->type != SYS_RES_MEMORY) { + error = EINVAL; + break; + } + value &= ~PCIM_BAR_MEM_BASE; + } else { + if (rle->type != SYS_RES_IOPORT) { + error = EINVAL; + break; + } + value &= ~PCIM_BAR_IO_BASE; + } + bio->pbi_base = rman_get_start(rle->res) | value; + bio->pbi_length = rman_get_size(rle->res); + + /* + * Check the command register to determine if this BAR + * is enabled. + */ + value = pci_read_config(pcidev, PCIR_COMMAND, 2); + if (rle->type == SYS_RES_MEMORY) + bio->pbi_enabled = (value & PCIM_CMD_MEMEN) != 0; + else + bio->pbi_enabled = (value & PCIM_CMD_PORTEN) != 0; + error = 0; + break; default: error = ENOTTY; break; Modified: stable/7/sys/dev/pci/pcireg.h ============================================================================== --- stable/7/sys/dev/pci/pcireg.h Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/sys/dev/pci/pcireg.h Thu Feb 26 18:54:24 2009 (r189080) @@ -117,7 +117,7 @@ #define PCIR_BARS 0x10 #define PCIR_BAR(x) (PCIR_BARS + (x) * 4) -#define PCI_MAX_BAR_0 5 /* Number of standard bars */ +#define PCIR_MAX_BAR_0 5 #define PCI_RID2BAR(rid) (((rid) - PCIR_BARS) / 4) #define PCI_BAR_IO(x) (((x) & PCIM_BAR_SPACE) == PCIM_BAR_IO_SPACE) #define PCI_BAR_MEM(x) (((x) & PCIM_BAR_SPACE) == PCIM_BAR_MEM_SPACE) @@ -158,6 +158,7 @@ /* config registers for header type 1 (PCI-to-PCI bridge) devices */ +#define PCIR_MAX_BAR_1 1 #define PCIR_SECSTAT_1 0x1e #define PCIR_PRIBUS_1 0x18 @@ -188,6 +189,7 @@ /* config registers for header type 2 (CardBus) devices */ +#define PCIR_MAX_BAR_2 0 #define PCIR_CAP_PTR_2 0x14 #define PCIR_SECSTAT_2 0x16 Modified: stable/7/sys/sys/pciio.h ============================================================================== --- stable/7/sys/sys/pciio.h Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/sys/sys/pciio.h Thu Feb 26 18:54:24 2009 (r189080) @@ -108,9 +108,18 @@ struct pci_io { u_int32_t pi_data; /* data to write or result of read */ }; +struct pci_bar_io { + struct pcisel pbi_sel; /* device to operate on */ + int pbi_reg; /* starting address of BAR */ + int pbi_enabled; /* decoding enabled */ + uint64_t pbi_base; /* current value of BAR */ + uint64_t pbi_length; /* length of BAR */ +}; + #define PCIOCGETCONF _IOWR('p', 5, struct pci_conf_io) #define PCIOCREAD _IOWR('p', 2, struct pci_io) #define PCIOCWRITE _IOWR('p', 3, struct pci_io) #define PCIOCATTACHED _IOWR('p', 4, struct pci_io) +#define PCIOCGETBAR _IOWR('p', 6, struct pci_bar_io) #endif /* !_SYS_PCIIO_H_ */ Modified: stable/7/usr.sbin/pciconf/pciconf.8 ============================================================================== --- stable/7/usr.sbin/pciconf/pciconf.8 Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/usr.sbin/pciconf/pciconf.8 Thu Feb 26 18:54:24 2009 (r189080) @@ -33,7 +33,7 @@ .Nd diagnostic utility for the PCI bus .Sh SYNOPSIS .Nm -.Fl l Op Fl cv +.Fl l Op Fl bcv .Nm .Fl a Ar selector .Nm @@ -112,6 +112,32 @@ device, which contains several (similar one chip. .Pp If the +.Fl b +option is supplied, +.Nm +will list any base address registers +.Pq BARs +that are assigned resources for each device. +Each BAR will be enumerated via a line in the following format: +.Bd -literal + bar [10] = type Memory, range 32, base 0xda060000, size 131072, enabled +.Ed +.Pp +The first value after the +.Dq Li bar +prefix in the square brackets is the offset of the BAR in config space in +hexadecimal. +The type of a BAR is one of +.Dq Memory , +.Dq Prefetchable Memory , +or +.Dq I/O Port . +The range indicates the maximum address the BAR decodes. +The base and size indicate the start and length of the BAR's address window, +respectively. +Finally, the last flag indicates if the BAR is enabled or disabled. +.Pp +If the .Fl c option is supplied, .Nm Modified: stable/7/usr.sbin/pciconf/pciconf.c ============================================================================== --- stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:46:22 2009 (r189079) +++ stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:54:24 2009 (r189080) @@ -37,6 +37,7 @@ static const char rcsid[] = #include #include +#include #include #include #include @@ -66,7 +67,8 @@ struct pci_vendor_info TAILQ_HEAD(,pci_vendor_info) pci_vendors; -static void list_devs(int verbose, int caps); +static void list_bars(int fd, struct pci_conf *p); +static void list_devs(int verbose, int bars, int caps); static void list_verbose(struct pci_conf *p); static const char *guess_class(struct pci_conf *p); static const char *guess_subclass(struct pci_conf *p); @@ -81,7 +83,7 @@ static void usage(void) { fprintf(stderr, "%s\n%s\n%s\n%s\n", - "usage: pciconf -l [-cv]", + "usage: pciconf -l [-bcv]", " pciconf -a selector", " pciconf -r [-b | -h] selector addr[:addr2]", " pciconf -w [-b | -h] selector addr value"); @@ -92,10 +94,10 @@ int main(int argc, char **argv) { int c; - int listmode, readmode, writemode, attachedmode, caps, verbose; + int listmode, readmode, writemode, attachedmode, bars, caps, verbose; int byte, isshort; - listmode = readmode = writemode = attachedmode = caps = verbose = byte = isshort = 0; + listmode = readmode = writemode = attachedmode = bars = caps = verbose = byte = isshort = 0; while ((c = getopt(argc, argv, "abchlrwv")) != -1) { switch(c) { @@ -104,6 +106,7 @@ main(int argc, char **argv) break; case 'b': + bars = 1; byte = 1; break; @@ -143,7 +146,7 @@ main(int argc, char **argv) usage(); if (listmode) { - list_devs(verbose, caps); + list_devs(verbose, bars, caps); } else if (attachedmode) { chkattached(argv[optind], byte ? 1 : isshort ? 2 : 4); @@ -161,7 +164,7 @@ main(int argc, char **argv) } static void -list_devs(int verbose, int caps) +list_devs(int verbose, int bars, int caps) { int fd; struct pci_conf_io pc; @@ -217,6 +220,8 @@ list_devs(int verbose, int caps) p->pc_revid, p->pc_hdr); if (verbose) list_verbose(p); + if (bars) + list_bars(fd, p); if (caps) list_caps(fd, p); } @@ -226,6 +231,64 @@ list_devs(int verbose, int caps) } static void +list_bars(int fd, struct pci_conf *p) +{ + struct pci_bar_io bar; + uint64_t base; + const char *type; + int i, range, max; + + switch (p->pc_hdr & PCIM_HDRTYPE) { + case PCIM_HDRTYPE_NORMAL: + max = PCIR_MAX_BAR_0; + break; + case PCIM_HDRTYPE_BRIDGE: + max = PCIR_MAX_BAR_1; + break; + case PCIM_HDRTYPE_CARDBUS: + max = PCIR_MAX_BAR_2; + break; + default: + return; + } + + for (i = 0; i <= max; i++) { + bar.pbi_sel = p->pc_sel; + bar.pbi_reg = PCIR_BAR(i); + if (ioctl(fd, PCIOCGETBAR, &bar) < 0) + continue; + if (PCI_BAR_IO(bar.pbi_base)) { + type = "I/O Port"; + range = 32; + base = bar.pbi_base & PCIM_BAR_IO_BASE; + } else { + if (bar.pbi_base & PCIM_BAR_MEM_PREFETCH) + type = "Prefetchable Memory"; + else + type = "Memory"; + switch (bar.pbi_base & PCIM_BAR_MEM_TYPE) { + case PCIM_BAR_MEM_32: + range = 32; + break; + case PCIM_BAR_MEM_1MB: + range = 20; + break; + case PCIM_BAR_MEM_64: + range = 64; + break; + default: + range = -1; + } + base = bar.pbi_base & ~((uint64_t)0xf); + } + printf(" bar [%02x] = type %s, range %2d, base %#jx, ", + PCIR_BAR(i), type, range, (uintmax_t)base); + printf("size %2d, %s\n", (int)bar.pbi_length, + bar.pbi_enabled ? "enabled" : "disabled"); + } +} + +static void list_verbose(struct pci_conf *p) { struct pci_vendor_info *vi; From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 18:55:55 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C98081065695; Thu, 26 Feb 2009 18:55:55 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B39CC8FC23; Thu, 26 Feb 2009 18:55:55 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QIttcp035519; Thu, 26 Feb 2009 18:55:55 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QIttgE035518; Thu, 26 Feb 2009 18:55:55 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261855.n1QIttgE035518@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 18:55:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189081 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb nfsclient X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 18:55:58 -0000 Author: jhb Date: Thu Feb 26 18:55:55 2009 New Revision: 189081 URL: http://svn.freebsd.org/changeset/base/189081 Log: MFC: Don't clear the attribute cache of a file when it is closed. Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/nfsclient/nfs_vnops.c Modified: stable/7/sys/nfsclient/nfs_vnops.c ============================================================================== --- stable/7/sys/nfsclient/nfs_vnops.c Thu Feb 26 18:54:24 2009 (r189080) +++ stable/7/sys/nfsclient/nfs_vnops.c Thu Feb 26 18:55:55 2009 (r189081) @@ -594,13 +594,6 @@ nfs_close(struct vop_close_args *ap) error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1); mtx_lock(&np->n_mtx); } - /* - * Invalidate the attribute cache in all cases. - * An open is going to fetch fresh attrs any way, other procs - * on this node that have file open will be forced to do an - * otw attr fetch, but this is safe. - */ - np->n_attrstamp = 0; if (np->n_flag & NWRITEERR) { np->n_flag &= ~NWRITEERR; error = np->n_error; From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:08:25 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3709E10656C2; Thu, 26 Feb 2009 19:08:25 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 241618FC23; Thu, 26 Feb 2009 19:08:25 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QJ8PTU035830; Thu, 26 Feb 2009 19:08:25 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QJ8PBs035829; Thu, 26 Feb 2009 19:08:25 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261908.n1QJ8PBs035829@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 19:08:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-6@freebsd.org X-SVN-Group: stable-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189083 - in stable/6/sys: . contrib/pf dev/cxgb nfsclient X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:08:26 -0000 Author: jhb Date: Thu Feb 26 19:08:24 2009 New Revision: 189083 URL: http://svn.freebsd.org/changeset/base/189083 Log: MFC: Don't clear the attribute cache of a file when it is closed. Modified: stable/6/sys/ (props changed) stable/6/sys/contrib/pf/ (props changed) stable/6/sys/dev/cxgb/ (props changed) stable/6/sys/nfsclient/nfs_vnops.c Modified: stable/6/sys/nfsclient/nfs_vnops.c ============================================================================== --- stable/6/sys/nfsclient/nfs_vnops.c Thu Feb 26 18:58:41 2009 (r189082) +++ stable/6/sys/nfsclient/nfs_vnops.c Thu Feb 26 19:08:24 2009 (r189083) @@ -542,13 +542,6 @@ nfs_close(struct vop_close_args *ap) } else error = nfs_vinvalbuf(vp, V_SAVE, ap->a_td, 1); } - /* - * Invalidate the attribute cache in all cases. - * An open is going to fetch fresh attrs any way, other procs - * on this node that have file open will be forced to do an - * otw attr fetch, but this is safe. - */ - np->n_attrstamp = 0; if (np->n_flag & NWRITEERR) { np->n_flag &= ~NWRITEERR; error = np->n_error; From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:37:49 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 75AEA106564A; Thu, 26 Feb 2009 19:37:49 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards1.yandex.ru (forwards1.yandex.ru [77.88.60.125]) by mx1.freebsd.org (Postfix) with ESMTP id 07D958FC19; Thu, 26 Feb 2009 19:37:49 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront57.yandex.ru (mxfront57.yandex.ru [77.88.60.150]) by forwards1.yandex.ru (Yandex) with ESMTP id 46A6ED06B9; Thu, 26 Feb 2009 22:35:30 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:60145 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S11109642AbZBZSqv for (+ 3 others); Thu, 26 Feb 2009 21:46:51 +0300 X-Yandex-TimeMark: 1235674011 X-Yandex-Spam: 2 X-Yandex-Front: mxfront57 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id E16A21A7148; Thu, 26 Feb 2009 18:46:36 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 7F9FE106570A; Thu, 26 Feb 2009 18:46:36 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B18810656CB; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 48A0B8FC17; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QIkMhY035220; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QIkMZp035219; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261846.n1QIkMZp035219@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 18:46:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: Subject: svn commit: r189079 - stable/7/usr.sbin/pciconf X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:37:50 -0000 Author: jhb Date: Thu Feb 26 18:46:22 2009 New Revision: 189079 URL: http://svn.freebsd.org/changeset/base/189079 Log: MFC: Sort getopt options alphabetically. Modified: stable/7/usr.sbin/pciconf/ (props changed) stable/7/usr.sbin/pciconf/pciconf.c Modified: stable/7/usr.sbin/pciconf/pciconf.c ============================================================================== --- stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:01:07 2009 (r189078) +++ stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:46:22 2009 (r189079) @@ -97,16 +97,24 @@ main(int argc, char **argv) listmode = readmode = writemode = attachedmode = caps = verbose = byte = isshort = 0; - while ((c = getopt(argc, argv, "aclrwbhv")) != -1) { + while ((c = getopt(argc, argv, "abchlrwv")) != -1) { switch(c) { case 'a': attachedmode = 1; break; + case 'b': + byte = 1; + break; + case 'c': caps = 1; break; + case 'h': + isshort = 1; + break; + case 'l': listmode = 1; break; @@ -119,14 +127,6 @@ main(int argc, char **argv) writemode = 1; break; - case 'b': - byte = 1; - break; - - case 'h': - isshort = 1; - break; - case 'v': verbose = 1; break; _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:38:20 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 90D88106568A; Thu, 26 Feb 2009 19:38:20 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards1.yandex.ru (forwards1.yandex.ru [77.88.60.125]) by mx1.freebsd.org (Postfix) with ESMTP id 0D23E8FC1B; Thu, 26 Feb 2009 19:38:20 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront41.yandex.ru (mxfront41.yandex.ru [77.88.60.156]) by forwards1.yandex.ru (Yandex) with ESMTP id A6C06D02B6; Thu, 26 Feb 2009 22:27:00 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:12017 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S8177478AbZBZSqr for (+ 3 others); Thu, 26 Feb 2009 21:46:47 +0300 X-Yandex-TimeMark: 1235674007 X-Yandex-Spam: 2 X-Yandex-Front: mxfront41 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id A87A81A712F; Thu, 26 Feb 2009 18:46:36 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 3D09C10656FE; Thu, 26 Feb 2009 18:46:36 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5B18810656CB; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 48A0B8FC17; Thu, 26 Feb 2009 18:46:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QIkMhY035220; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QIkMZp035219; Thu, 26 Feb 2009 18:46:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261846.n1QIkMZp035219@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 18:46:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: Subject: svn commit: r189079 - stable/7/usr.sbin/pciconf X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:38:21 -0000 Author: jhb Date: Thu Feb 26 18:46:22 2009 New Revision: 189079 URL: http://svn.freebsd.org/changeset/base/189079 Log: MFC: Sort getopt options alphabetically. Modified: stable/7/usr.sbin/pciconf/ (props changed) stable/7/usr.sbin/pciconf/pciconf.c Modified: stable/7/usr.sbin/pciconf/pciconf.c ============================================================================== --- stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:01:07 2009 (r189078) +++ stable/7/usr.sbin/pciconf/pciconf.c Thu Feb 26 18:46:22 2009 (r189079) @@ -97,16 +97,24 @@ main(int argc, char **argv) listmode = readmode = writemode = attachedmode = caps = verbose = byte = isshort = 0; - while ((c = getopt(argc, argv, "aclrwbhv")) != -1) { + while ((c = getopt(argc, argv, "abchlrwv")) != -1) { switch(c) { case 'a': attachedmode = 1; break; + case 'b': + byte = 1; + break; + case 'c': caps = 1; break; + case 'h': + isshort = 1; + break; + case 'l': listmode = 1; break; @@ -119,14 +127,6 @@ main(int argc, char **argv) writemode = 1; break; - case 'b': - byte = 1; - break; - - case 'h': - isshort = 1; - break; - case 'v': verbose = 1; break; _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:39:34 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 086B51065675; Thu, 26 Feb 2009 19:39:34 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards1.yandex.ru (forwards1.yandex.ru [77.88.60.125]) by mx1.freebsd.org (Postfix) with ESMTP id EF7198FC22; Thu, 26 Feb 2009 19:39:32 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront38.yandex.ru (mxfront38.yandex.ru [77.88.60.159]) by forwards1.yandex.ru (Yandex) with ESMTP id E7F7AE0251; Thu, 26 Feb 2009 22:25:00 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:54724 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S3330639AbZBZP76 for (+ 3 others); Thu, 26 Feb 2009 18:59:58 +0300 X-Yandex-TimeMark: 1235663998 X-Yandex-Spam: 2 X-Yandex-Front: mxfront38 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id 3DB511A6DDF; Thu, 26 Feb 2009 15:59:45 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id B38AC10656C6; Thu, 26 Feb 2009 15:59:44 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A669F106566B; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8FF368FC12; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QFxM3L031880; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QFxMwT031876; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261559.n1QFxMwT031876@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 15:59:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: Subject: svn commit: r189075 - in stable/7: lib/libc lib/libc/string lib/libc/sys share/man/man9 sys sys/amd64/amd64 sys/amd64/include sys/arm/arm sys/arm/include sys/conf sys/contrib/pf sys/dev/ath/ath_hal... X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:39:34 -0000 Author: jhb Date: Thu Feb 26 15:59:22 2009 New Revision: 189075 URL: http://svn.freebsd.org/changeset/base/189075 Log: MFC: Add support for "superpages" on amd64 and i386. This includes adding the superpage reservation system to the machine-independent VM system as well as changes to the pmap code for amd64 and i386 to support superpages. Reviewed by: alc Tested by: ps Added: stable/7/sys/vm/vm_reserv.c - copied, changed from r174982, head/sys/vm/vm_reserv.c stable/7/sys/vm/vm_reserv.h - copied, changed from r174982, head/sys/vm/vm_reserv.h Deleted: stable/7/sys/vm/vm_pageq.c Modified: stable/7/lib/libc/ (props changed) stable/7/lib/libc/string/ffsll.c (props changed) stable/7/lib/libc/string/flsll.c (props changed) stable/7/lib/libc/sys/mincore.2 stable/7/share/man/man9/ (props changed) stable/7/share/man/man9/vm_map_find.9 stable/7/sys/ (props changed) stable/7/sys/amd64/amd64/pmap.c stable/7/sys/amd64/include/pmap.h stable/7/sys/amd64/include/vmparam.h stable/7/sys/arm/arm/pmap.c stable/7/sys/arm/include/vmparam.h stable/7/sys/conf/files stable/7/sys/conf/options stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/i386/i386/pmap.c stable/7/sys/i386/include/pmap.h stable/7/sys/i386/include/vmparam.h stable/7/sys/ia64/ia64/pmap.c stable/7/sys/ia64/include/vmparam.h stable/7/sys/kern/kern_exec.c stable/7/sys/kern/kern_malloc.c stable/7/sys/powerpc/include/vmparam.h stable/7/sys/powerpc/powerpc/pmap_dispatch.c stable/7/sys/sparc64/include/vmparam.h stable/7/sys/sparc64/sparc64/pmap.c stable/7/sys/sun4v/include/vmparam.h stable/7/sys/sun4v/sun4v/pmap.c stable/7/sys/sys/mman.h stable/7/sys/vm/device_pager.c stable/7/sys/vm/memguard.c stable/7/sys/vm/pmap.h stable/7/sys/vm/vm.h stable/7/sys/vm/vm_extern.h stable/7/sys/vm/vm_fault.c stable/7/sys/vm/vm_init.c stable/7/sys/vm/vm_kern.c stable/7/sys/vm/vm_map.c stable/7/sys/vm/vm_map.h stable/7/sys/vm/vm_mmap.c stable/7/sys/vm/vm_object.c stable/7/sys/vm/vm_object.h stable/7/sys/vm/vm_page.c stable/7/sys/vm/vm_page.h stable/7/sys/vm/vm_pageout.c stable/7/sys/vm/vm_phys.c stable/7/sys/vm/vm_phys.h stable/7/sys/vm/vnode_pager.c Modified: stable/7/lib/libc/sys/mincore.2 ============================================================================== --- stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:59:22 2009 (r189075) @@ -72,6 +72,8 @@ Page has been modified by us. Page has been referenced. .It Dv MINCORE_MODIFIED_OTHER Page has been modified. +.It Dv MINCORE_SUPER +Page is part of a "super" page. (only i386 & amd64) .El .Pp The information returned by Modified: stable/7/share/man/man9/vm_map_find.9 ============================================================================== --- stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:59:22 2009 (r189075) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 19, 2003 +.Dd May 10, 2008 .Dt VM_MAP_FIND 9 .Os .Sh NAME @@ -38,7 +38,7 @@ .Ft int .Fo vm_map_find .Fa "vm_map_t map" "vm_object_t object" "vm_ooffset_t offset" -.Fa "vm_offset_t *addr" "vm_size_t length" "boolean_t find_space" +.Fa "vm_offset_t *addr" "vm_size_t length" "int find_space" .Fa "vm_prot_t prot" "vm_prot_t max" "int cow" .Fc .Sh DESCRIPTION @@ -70,11 +70,25 @@ by the caller before calling this functi .Pp If .Fa find_space -is -.Dv TRUE , +is either +.Dv VMFS_ALIGNED_SPACE +or +.Dv VMFS_ANY_SPACE , the function will call .Xr vm_map_findspace 9 to discover a free region. +Moreover, if +.Fa find_space +is +.Dv VMFS_ALIGNED_SPACE , +the address of the free region will be optimized for the use of superpages. +Otherwise, if +.Fa find_space +is +.Dv VMFS_NO_SPACE , +.Xr vm_map_insert 9 +is called with the given address, +.Fa addr . .Sh IMPLEMENTATION NOTES This function acquires a lock on .Fa map @@ -90,9 +104,14 @@ The .Fn vm_map_find function returns .Dv KERN_SUCCESS -if space for the mapping could be found and -the mapping was successfully created. -If space could not be found in the map, +if the mapping was successfully created. +If space could not be found or +.Fa find_space +was +.Dv VMFS_NO_SPACE +and the given address, +.Fa addr , +was already mapped, .Dv KERN_NO_SPACE will be returned. If the discovered range turned out to be bogus, Modified: stable/7/sys/amd64/amd64/pmap.c ============================================================================== --- stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:59:22 2009 (r189075) @@ -7,7 +7,7 @@ * All rights reserved. * Copyright (c) 2003 Peter Wemm * All rights reserved. - * Copyright (c) 2005 Alan L. Cox + * Copyright (c) 2005-2008 Alan L. Cox * All rights reserved. * * This code is derived from software contributed to Berkeley by @@ -107,10 +107,12 @@ __FBSDID("$FreeBSD$"); #include "opt_msgbuf.h" #include "opt_pmap.h" +#include "opt_vm.h" #include #include #include +#include #include #include #include @@ -134,6 +136,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -149,11 +152,7 @@ __FBSDID("$FreeBSD$"); #define PMAP_SHPGPERPROC 200 #endif -#if defined(DIAGNOSTIC) -#define PMAP_DIAGNOSTIC -#endif - -#if !defined(PMAP_DIAGNOSTIC) +#if !defined(DIAGNOSTIC) #define PMAP_INLINE __gnu89_inline #else #define PMAP_INLINE @@ -166,6 +165,9 @@ __FBSDID("$FreeBSD$"); #define PV_STAT(x) do { } while (0) #endif +#define pa_index(pa) ((pa) >> PDRSHIFT) +#define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) + struct pmap kernel_pmap_store; vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ @@ -176,6 +178,12 @@ static vm_paddr_t dmaplimit; vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS; pt_entry_t pg_nx; +SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); + +static int pg_ps_enabled; +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, + "Are large page mappings enabled?"); + static u_int64_t KPTphys; /* phys addr of kernel level 1 */ static u_int64_t KPDphys; /* phys addr of kernel level 2 */ u_int64_t KPDPphys; /* phys addr of kernel level 3 */ @@ -188,6 +196,7 @@ static u_int64_t DMPDPphys; /* phys addr * Data for the pv entry allocation mechanism */ static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; +static struct md_page *pv_table; static int shpgperproc = PMAP_SHPGPERPROC; /* @@ -204,11 +213,29 @@ static caddr_t crashdumpmap; static void free_pv_entry(pmap_t pmap, pv_entry_t pv); static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); - +static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); +static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, + vm_offset_t va); + +static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_prot_t prot); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte); +static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); +static boolean_t pmap_is_modified_pvh(struct md_page *pvh); +static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); +static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, + vm_prot_t prot); +static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free); +static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte); static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free); static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, @@ -362,21 +389,6 @@ pmap_pte(pmap_t pmap, vm_offset_t va) } -static __inline pt_entry_t * -pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde) -{ - pd_entry_t *pde; - - pde = pmap_pde(pmap, va); - if (pde == NULL || (*pde & PG_V) == 0) - return NULL; - *ptepde = *pde; - if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */ - return ((pt_entry_t *)pde); - return (pmap_pde_to_pte(pde, va)); -} - - PMAP_INLINE pt_entry_t * vtopte(vm_offset_t va) { @@ -511,6 +523,7 @@ pmap_bootstrap(vm_paddr_t *firstaddr) */ PMAP_LOCK_INIT(kernel_pmap); kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys); + kernel_pmap->pm_root = NULL; kernel_pmap->pm_active = -1; /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvchunk); @@ -609,6 +622,26 @@ pmap_page_init(vm_page_t m) void pmap_init(void) { + pd_entry_t *pd; + vm_page_t mpte; + vm_size_t s; + int i, pv_npg; + + /* + * Initialize the vm page array entries for the kernel pmap's + * page table pages. + */ + pd = pmap_pde(kernel_pmap, VM_MIN_KERNEL_ADDRESS); + for (i = 0; i < NKPT; i++) { + if ((pd[i] & (PG_PS | PG_V)) == (PG_PS | PG_V)) + continue; + mpte = PHYS_TO_VM_PAGE(pd[i] & PG_FRAME); + KASSERT(mpte >= vm_page_array && + mpte < &vm_page_array[vm_page_array_size], + ("pmap_init: page table page is out of range")); + mpte->pindex = pmap_pde_pindex(VM_MIN_KERNEL_ADDRESS) + i; + mpte->phys_addr = pd[i] & PG_FRAME; + } /* * Initialize the address space (zone) for the pv entries. Set a @@ -619,9 +652,28 @@ pmap_init(void) pv_entry_max = shpgperproc * maxproc + cnt.v_page_count; TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max); pv_entry_high_water = 9 * (pv_entry_max / 10); + + /* + * Are large page mappings enabled? + */ + TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled); + + /* + * Calculate the size of the pv head table for superpages. + */ + for (i = 0; phys_avail[i + 1]; i += 2); + pv_npg = round_2mpage(phys_avail[(i - 2) + 1]) / NBPDR; + + /* + * Allocate memory for the pv head table for superpages. + */ + s = (vm_size_t)(pv_npg * sizeof(struct md_page)); + s = round_page(s); + pv_table = (struct md_page *)kmem_alloc(kernel_map, s); + for (i = 0; i < pv_npg; i++) + TAILQ_INIT(&pv_table[i].pv_list); } -SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); static int pmap_pventry_proc(SYSCTL_HANDLER_ARGS) { @@ -652,6 +704,25 @@ pmap_shpgperproc_proc(SYSCTL_HANDLER_ARG SYSCTL_PROC(_vm_pmap, OID_AUTO, shpgperproc, CTLTYPE_INT|CTLFLAG_RW, &shpgperproc, 0, pmap_shpgperproc_proc, "IU", "Page share factor per proc"); +SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, + "2MB page mapping counters"); + +static u_long pmap_pde_demotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, demotions, CTLFLAG_RD, + &pmap_pde_demotions, 0, "2MB page demotions"); + +static u_long pmap_pde_mappings; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD, + &pmap_pde_mappings, 0, "2MB page mappings"); + +static u_long pmap_pde_p_failures; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD, + &pmap_pde_p_failures, 0, "2MB page promotion failures"); + +static u_long pmap_pde_promotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD, + &pmap_pde_promotions, 0, "2MB page promotions"); + /*************************************************** * Low level helper routines..... @@ -953,17 +1024,25 @@ pmap_extract_and_hold(pmap_t pmap, vm_of vm_paddr_t pmap_kextract(vm_offset_t va) { - pd_entry_t *pde; + pd_entry_t pde; vm_paddr_t pa; if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) { pa = DMAP_TO_PHYS(va); } else { - pde = vtopde(va); - if (*pde & PG_PS) { - pa = (*pde & PG_PS_FRAME) | (va & PDRMASK); + pde = *vtopde(va); + if (pde & PG_PS) { + pa = (pde & PG_PS_FRAME) | (va & PDRMASK); } else { - pa = *vtopte(va); + /* + * Beware of a concurrent promotion that changes the + * PDE at this point! For example, vtopte() must not + * be used to access the PTE because it would use the + * new PDE. It is, however, safe to use the old PDE + * because the page table page is preserved by the + * promotion. + */ + pa = *pmap_pde_to_pte(&pde, va); pa = (pa & PG_FRAME) | (va & PAGE_MASK); } } @@ -1085,8 +1164,105 @@ pmap_free_zero_pages(vm_page_t free) while (free != NULL) { m = free; free = m->right; - vm_page_free_zero(m); + /* Preserve the page's PG_ZERO setting. */ + vm_page_free_toq(m); + } +} + +/* + * Schedule the specified unused page table page to be freed. Specifically, + * add the page to the specified list of pages that will be released to the + * physical memory manager after the TLB has been updated. + */ +static __inline void +pmap_add_delayed_free_list(vm_page_t m, vm_page_t *free, boolean_t set_PG_ZERO) +{ + + if (set_PG_ZERO) + m->flags |= PG_ZERO; + else + m->flags &= ~PG_ZERO; + m->right = *free; + *free = m; +} + +/* + * Inserts the specified page table page into the specified pmap's collection + * of idle page table pages. Each of a pmap's page table pages is responsible + * for mapping a distinct range of virtual addresses. The pmap's collection is + * ordered by this virtual address range. + */ +static void +pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + root = pmap->pm_root; + if (root == NULL) { + mpte->left = NULL; + mpte->right = NULL; + } else { + root = vm_page_splay(mpte->pindex, root); + if (mpte->pindex < root->pindex) { + mpte->left = root->left; + mpte->right = root; + root->left = NULL; + } else if (mpte->pindex == root->pindex) + panic("pmap_insert_pt_page: pindex already inserted"); + else { + mpte->right = root->right; + mpte->left = root; + root->right = NULL; + } + } + pmap->pm_root = mpte; +} + +/* + * Looks for a page table page mapping the specified virtual address in the + * specified pmap's collection of idle page table pages. Returns NULL if there + * is no page table page corresponding to the specified virtual address. + */ +static vm_page_t +pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va) +{ + vm_page_t mpte; + vm_pindex_t pindex = pmap_pde_pindex(va); + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if ((mpte = pmap->pm_root) != NULL && mpte->pindex != pindex) { + mpte = vm_page_splay(pindex, mpte); + if ((pmap->pm_root = mpte)->pindex != pindex) + mpte = NULL; } + return (mpte); +} + +/* + * Removes the specified page table page from the specified pmap's collection + * of idle page table pages. The specified page table page must be a member of + * the pmap's collection. + */ +static void +pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if (mpte != pmap->pm_root) { + root = vm_page_splay(mpte->pindex, pmap->pm_root); + KASSERT(mpte == root, + ("pmap_remove_pt_page: mpte %p is missing from pmap %p", + mpte, pmap)); + } + if (mpte->left == NULL) + root = mpte->right; + else { + root = vm_page_splay(mpte->pindex, mpte->left); + root->right = mpte->right; + } + pmap->pm_root = root; } /* @@ -1165,8 +1341,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of * Put page on a list so that it is released after * *ALL* TLB shootdown is done */ - m->right = *free; - *free = m; + pmap_add_delayed_free_list(m, free, TRUE); return 1; } @@ -1193,6 +1368,7 @@ pmap_pinit0(pmap_t pmap) PMAP_LOCK_INIT(pmap); pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys); + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1229,6 +1405,7 @@ pmap_pinit(pmap_t pmap) /* install self-referential address mapping entry(s) */ pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | PG_V | PG_RW | PG_A | PG_M; + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1404,7 +1581,7 @@ pmap_allocpte(pmap_t pmap, vm_offset_t v { vm_pindex_t ptepindex; pd_entry_t *pd; - vm_page_t m, free; + vm_page_t m; KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, @@ -1424,21 +1601,21 @@ retry: * This supports switching from a 2MB page to a * normal 4K page. */ - if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { - *pd = 0; - pd = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - free = NULL; - pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va), &free); - pmap_invalidate_all(kernel_pmap); - pmap_free_zero_pages(free); + if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { + if (!pmap_demote_pde(pmap, pd, va)) { + /* + * Invalidation of the 2MB page mapping may have caused + * the deallocation of the underlying PD page. + */ + pd = NULL; + } } /* * If the page table page is mapped, we just increment the * hold count, and activate it. */ - if (pd != 0 && (*pd & PG_V) != 0) { + if (pd != NULL && (*pd & PG_V) != 0) { m = PHYS_TO_VM_PAGE(*pd & PG_FRAME); m->wire_count++; } else { @@ -1471,6 +1648,8 @@ pmap_release(pmap_t pmap) KASSERT(pmap->pm_stats.resident_count == 0, ("pmap_release: pmap resident count %ld != 0", pmap->pm_stats.resident_count)); + KASSERT(pmap->pm_root == NULL, + ("pmap_release: pmap has reserved page table page(s)")); m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME); @@ -1645,11 +1824,16 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll * drastic measures to free some pages so we can allocate * another pv entry chunk. This is normally called to * unmap inactive pages, and if necessary, active pages. + * + * We do not, however, unmap 2mpages because subsequent accesses will + * allocate per-page pv entries until repromotion occurs, thereby + * exacerbating the shortage of free pv entries. */ static void pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) { - pd_entry_t ptepde; + struct md_page *pvh; + pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; pv_entry_t next_pv, pv; @@ -1668,28 +1852,27 @@ pmap_collect(pmap_t locked_pmap, struct else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) continue; pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_collect"); - } + pde = pmap_pde(pmap, va); + KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, va); tpte = pte_load_clear(pte); KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#lx", tpte)); if (tpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_collect: modified page not writable: va: %#lx, pte: %#lx", - va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, va, ptepde, &free); + pmap_unuse_pt(pmap, va, *pde, &free); pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); @@ -1824,24 +2007,133 @@ retry: return (pv); } -static void -pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +/* + * First find and then remove the pv entry for the specified pmap and virtual + * address from the specified pv list. Returns the pv entry if found and NULL + * otherwise. This operation can be performed on pv lists for either 4KB or + * 2MB page mappings. + */ +static __inline pv_entry_t +pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) { pv_entry_t pv; - PMAP_LOCK_ASSERT(pmap, MA_OWNED); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { - if (pmap == PV_PMAP(pv) && va == pv->pv_va) + TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { + if (pmap == PV_PMAP(pv) && va == pv->pv_va) { + TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); break; + } } - KASSERT(pv != NULL, ("pmap_remove_entry: pv not found")); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + return (pv); +} + +/* + * After demotion from a 2MB page mapping to 512 4KB page mappings, + * destroy the pv entry for the 2MB page mapping and reinstantiate the pv + * entries for each of the 4KB page mappings. + */ +static void +pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_demote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the 2mpage's pv entry for this mapping to the first + * page's pv list. + */ + pvh = pa_to_pvh(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found")); + m = PHYS_TO_VM_PAGE(pa); + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); + /* Instantiate the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_pv_demote_pde: page %p is not managed", m)); + va += PAGE_SIZE; + pmap_insert_entry(pmap, va, m); + } while (va < va_last); +} + +/* + * After promotion from 512 4KB page mappings to a single 2MB page mapping, + * replace the many pv entries for the 4KB page mappings by a single pv entry + * for the 2MB page mapping. + */ +static void +pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_promote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the first page's pv entry for this mapping to the + * 2mpage's pv list. Aside from avoiding the cost of a call + * to get_pv_entry(), a transfer avoids the possibility that + * get_pv_entry() calls pmap_collect() and that pmap_collect() + * removes one of the mappings that is being promoted. + */ + m = PHYS_TO_VM_PAGE(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(&m->md, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found")); + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + /* Free the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + va += PAGE_SIZE; + pmap_pvh_free(&m->md, pmap, va); + } while (va < va_last); +} + +/* + * First find and then destroy the pv entry for the specified pmap and virtual + * address. This operation can be performed on pv lists for either 4KB or 2MB + * page mappings. + */ +static void +pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +{ + pv_entry_t pv; + + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pvh_free: pv not found")); free_pv_entry(pmap, pv); } +static void +pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +{ + struct md_page *pvh; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pmap_pvh_free(&m->md, pmap, va); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } +} + /* * Create a pv entry for page at pa for * (pmap, va). @@ -1878,6 +2170,170 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm } /* + * Create the pv entry for a 2MB page mapping. + */ +static boolean_t +pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if (pv_entry_count < pv_entry_high_water && + (pv = get_pv_entry(pmap, TRUE)) != NULL) { + pv->pv_va = va; + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + return (TRUE); + } else + return (FALSE); +} + +/* + * Tries to demote a 2MB page mapping. + */ +static boolean_t +pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +{ + pd_entry_t newpde, oldpde; + pt_entry_t *firstpte, newpte, *pte; + vm_paddr_t mptepa; + vm_page_t free, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + mpte = pmap_lookup_pt_page(pmap, va); + if (mpte != NULL) + pmap_remove_pt_page(pmap, mpte); + else { + KASSERT((*pde & PG_W) == 0, + ("pmap_demote_pde: page table page for a wired mapping" + " is missing")); + free = NULL; + pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free); + pmap_invalidate_page(pmap, trunc_2mpage(va)); + pmap_free_zero_pages(free); + CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx" + " in pmap %p", va, pmap); + return (FALSE); + } + mptepa = VM_PAGE_TO_PHYS(mpte); + firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa); + oldpde = *pde; + newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V; + KASSERT((oldpde & (PG_A | PG_V)) == (PG_A | PG_V), + ("pmap_demote_pde: oldpde is missing PG_A and/or PG_V")); + KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW, + ("pmap_demote_pde: oldpde is missing PG_M")); + KASSERT((oldpde & PG_PS) != 0, + ("pmap_demote_pde: oldpde is missing PG_PS")); + newpte = oldpde & ~PG_PS; + if ((newpte & PG_PDE_PAT) != 0) + newpte ^= PG_PDE_PAT | PG_PTE_PAT; + + /* + * If the mapping has changed attributes, update the page table + * entries. + */ + KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME), + ("pmap_demote_pde: firstpte and newpte map different physical" + " addresses")); + if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE)) + for (pte = firstpte; pte < firstpte + NPTEPG; pte++) { + *pte = newpte; + newpte += PAGE_SIZE; + } + + /* + * Demote the mapping. This pmap is locked. The old PDE has + * PG_A set. If the old PDE has PG_RW set, it also has PG_M + * set. Thus, there is no danger of a race with another + * processor changing the setting of PG_A and/or PG_M between + * the read above and the store below. + */ + pde_store(pde, newpde); + + /* + * Invalidate a stale mapping of the page table page. + */ + pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va)); + + /* + * Demote the pv entry. This depends on the earlier demotion + * of the mapping. Specifically, the (re)creation of a per- + * page pv entry might trigger the execution of pmap_collect(), + * which might reclaim a newly (re)created per-page pv entry + * and destroy the associated mapping. In order to destroy + * the mapping, the PDE must have already changed from mapping + * the 2mpage to referencing the page table page. + */ + if ((oldpde & PG_MANAGED) != 0) + pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME); + + pmap_pde_demotions++; + CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx" + " in pmap %p", va, pmap); + return (TRUE); +} + +/* + * pmap_remove_pde: do the things to unmap a superpage in a process + */ +static int +pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free) +{ + struct md_page *pvh; + pd_entry_t oldpde; + vm_offset_t eva, va; + vm_page_t m, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + KASSERT((sva & PDRMASK) == 0, + ("pmap_remove_pde: sva is not 2mpage aligned")); + oldpde = pte_load_clear(pdq); + if (oldpde & PG_W) + pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE; + + /* + * Machines that don't support invlpg, also don't support + * PG_G. + */ + if (oldpde & PG_G) + pmap_invalidate_page(kernel_pmap, sva); + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + if (oldpde & PG_MANAGED) { + pvh = pa_to_pvh(oldpde & PG_PS_FRAME); + pmap_pvh_free(pvh, pmap, sva); + eva = sva + NBPDR; + for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); + va < eva; va += PAGE_SIZE, m++) { + if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if (oldpde & PG_A) + vm_page_flag_set(m, PG_REFERENCED); + if (TAILQ_EMPTY(&m->md.pv_list) && + TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } + } + if (pmap == kernel_pmap) { + if (!pmap_demote_pde(pmap, pdq, sva)) + panic("pmap_remove_pde: failed demotion"); + } else { + mpte = pmap_lookup_pt_page(pmap, sva); + if (mpte != NULL) { + pmap_remove_pt_page(pmap, mpte); + KASSERT(mpte->wire_count == NPTEPG, + ("pmap_remove_pde: pte page wire count error")); + mpte->wire_count = 0; + pmap_add_delayed_free_list(mpte, free, FALSE); + atomic_subtract_int(&cnt.v_wire_count, 1); + } + } + return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free)); +} + +/* * pmap_remove_pte: do the things to unmap a page in a process */ static int @@ -1900,12 +2356,8 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t pmap->pm_stats.resident_count -= 1; if (oldpte & PG_MANAGED) { m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME); - if (oldpte & PG_M) { - KASSERT((oldpte & PG_RW), - ("pmap_remove_pte: modified page not writable: va: %#lx, pte: %#lx", - va, oldpte)); + if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } if (oldpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); pmap_remove_entry(pmap, m, va); @@ -2013,11 +2465,24 @@ pmap_remove(pmap_t pmap, vm_offset_t sva * Check for large page. */ if ((ptpaddr & PG_PS) != 0) { - *pde = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - pmap_unuse_pt(pmap, sva, *pdpe, &free); - anyvalid = 1; - continue; + /* + * Are we removing the entire large page? If not, + * demote the mapping and fall through. + */ + if (sva + NBPDR == va_next && eva >= va_next) { + /* + * The TLB entry for a PG_G mapping is + * invalidated by pmap_remove_pde(). + */ + if ((ptpaddr & PG_G) == 0) + anyvalid = 1; + pmap_remove_pde(pmap, pde, sva, &free); + continue; + } else if (!pmap_demote_pde(pmap, pde, sva)) { + /* The large page mapping was destroyed. */ + continue; + } else + ptpaddr = *pde; } /* @@ -2067,30 +2532,34 @@ out: void pmap_remove_all(vm_page_t m) { + struct md_page *pvh; pv_entry_t pv; pmap_t pmap; pt_entry_t *pte, tpte; - pd_entry_t ptepde; + pd_entry_t *pde; + vm_offset_t va; vm_page_t free; -#if defined(PMAP_DIAGNOSTIC) - /* - * XXX This makes pmap_remove_all() illegal for non-managed pages! - */ - if (m->flags & PG_FICTITIOUS) { - panic("pmap_remove_all: illegal for unmanaged page, va: 0x%lx", - VM_PAGE_TO_PHYS(m)); - } -#endif + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("pmap_remove_all: page %p is fictitious", m)); mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { + va = pv->pv_va; + pmap = PV_PMAP(pv); + PMAP_LOCK(pmap); + pde = pmap_pde(pmap, va); + (void)pmap_demote_pde(pmap, pde, va); + PMAP_UNLOCK(pmap); + } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, pv->pv_va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_remove_all"); - } + pde = pmap_pde(pmap, pv->pv_va); + KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, pv->pv_va); tpte = pte_load_clear(pte); if (tpte & PG_W) pmap->pm_stats.wired_count--; @@ -2100,14 +2569,10 @@ pmap_remove_all(vm_page_t m) /* * Update the vm_page_t clean and reference bits. */ - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_remove_all: modified page not writable: va: %#lx, pte: %#lx", - pv->pv_va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); + pmap_unuse_pt(pmap, pv->pv_va, *pde, &free); pmap_invalidate_page(pmap, pv->pv_va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); @@ -2118,6 +2583,54 @@ pmap_remove_all(vm_page_t m) } /* + * pmap_protect_pde: do the things to protect a 2mpage in a process + */ +static boolean_t +pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:42:05 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5D28D106572A; Thu, 26 Feb 2009 19:42:05 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards3.yandex.ru (forwards3.yandex.ru [213.180.223.174]) by mx1.freebsd.org (Postfix) with ESMTP id 496EF8FC17; Thu, 26 Feb 2009 19:42:04 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront73.yandex.ru (mxfront73.yandex.ru [213.180.223.30]) by forwards3.yandex.ru (Yandex) with ESMTP id BC3EF2930F3; Thu, 26 Feb 2009 22:37:26 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:12230 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S17664744AbZBZQAS for (+ 3 others); Thu, 26 Feb 2009 19:00:18 +0300 X-Yandex-TimeMark: 1235664005 X-Yandex-Spam: 2 X-Yandex-Front: mxfront73 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id 618A51A6DEA; Thu, 26 Feb 2009 15:59:45 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id DE4EA10656CD; Thu, 26 Feb 2009 15:59:44 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A669F106566B; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8FF368FC12; Thu, 26 Feb 2009 15:59:22 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QFxM3L031880; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QFxMwT031876; Thu, 26 Feb 2009 15:59:22 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902261559.n1QFxMwT031876@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 15:59:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: Subject: svn commit: r189075 - in stable/7: lib/libc lib/libc/string lib/libc/sys share/man/man9 sys sys/amd64/amd64 sys/amd64/include sys/arm/arm sys/arm/include sys/conf sys/contrib/pf sys/dev/ath/ath_hal... X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:42:06 -0000 Author: jhb Date: Thu Feb 26 15:59:22 2009 New Revision: 189075 URL: http://svn.freebsd.org/changeset/base/189075 Log: MFC: Add support for "superpages" on amd64 and i386. This includes adding the superpage reservation system to the machine-independent VM system as well as changes to the pmap code for amd64 and i386 to support superpages. Reviewed by: alc Tested by: ps Added: stable/7/sys/vm/vm_reserv.c - copied, changed from r174982, head/sys/vm/vm_reserv.c stable/7/sys/vm/vm_reserv.h - copied, changed from r174982, head/sys/vm/vm_reserv.h Deleted: stable/7/sys/vm/vm_pageq.c Modified: stable/7/lib/libc/ (props changed) stable/7/lib/libc/string/ffsll.c (props changed) stable/7/lib/libc/string/flsll.c (props changed) stable/7/lib/libc/sys/mincore.2 stable/7/share/man/man9/ (props changed) stable/7/share/man/man9/vm_map_find.9 stable/7/sys/ (props changed) stable/7/sys/amd64/amd64/pmap.c stable/7/sys/amd64/include/pmap.h stable/7/sys/amd64/include/vmparam.h stable/7/sys/arm/arm/pmap.c stable/7/sys/arm/include/vmparam.h stable/7/sys/conf/files stable/7/sys/conf/options stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/i386/i386/pmap.c stable/7/sys/i386/include/pmap.h stable/7/sys/i386/include/vmparam.h stable/7/sys/ia64/ia64/pmap.c stable/7/sys/ia64/include/vmparam.h stable/7/sys/kern/kern_exec.c stable/7/sys/kern/kern_malloc.c stable/7/sys/powerpc/include/vmparam.h stable/7/sys/powerpc/powerpc/pmap_dispatch.c stable/7/sys/sparc64/include/vmparam.h stable/7/sys/sparc64/sparc64/pmap.c stable/7/sys/sun4v/include/vmparam.h stable/7/sys/sun4v/sun4v/pmap.c stable/7/sys/sys/mman.h stable/7/sys/vm/device_pager.c stable/7/sys/vm/memguard.c stable/7/sys/vm/pmap.h stable/7/sys/vm/vm.h stable/7/sys/vm/vm_extern.h stable/7/sys/vm/vm_fault.c stable/7/sys/vm/vm_init.c stable/7/sys/vm/vm_kern.c stable/7/sys/vm/vm_map.c stable/7/sys/vm/vm_map.h stable/7/sys/vm/vm_mmap.c stable/7/sys/vm/vm_object.c stable/7/sys/vm/vm_object.h stable/7/sys/vm/vm_page.c stable/7/sys/vm/vm_page.h stable/7/sys/vm/vm_pageout.c stable/7/sys/vm/vm_phys.c stable/7/sys/vm/vm_phys.h stable/7/sys/vm/vnode_pager.c Modified: stable/7/lib/libc/sys/mincore.2 ============================================================================== --- stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/lib/libc/sys/mincore.2 Thu Feb 26 15:59:22 2009 (r189075) @@ -72,6 +72,8 @@ Page has been modified by us. Page has been referenced. .It Dv MINCORE_MODIFIED_OTHER Page has been modified. +.It Dv MINCORE_SUPER +Page is part of a "super" page. (only i386 & amd64) .El .Pp The information returned by Modified: stable/7/share/man/man9/vm_map_find.9 ============================================================================== --- stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/share/man/man9/vm_map_find.9 Thu Feb 26 15:59:22 2009 (r189075) @@ -25,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd July 19, 2003 +.Dd May 10, 2008 .Dt VM_MAP_FIND 9 .Os .Sh NAME @@ -38,7 +38,7 @@ .Ft int .Fo vm_map_find .Fa "vm_map_t map" "vm_object_t object" "vm_ooffset_t offset" -.Fa "vm_offset_t *addr" "vm_size_t length" "boolean_t find_space" +.Fa "vm_offset_t *addr" "vm_size_t length" "int find_space" .Fa "vm_prot_t prot" "vm_prot_t max" "int cow" .Fc .Sh DESCRIPTION @@ -70,11 +70,25 @@ by the caller before calling this functi .Pp If .Fa find_space -is -.Dv TRUE , +is either +.Dv VMFS_ALIGNED_SPACE +or +.Dv VMFS_ANY_SPACE , the function will call .Xr vm_map_findspace 9 to discover a free region. +Moreover, if +.Fa find_space +is +.Dv VMFS_ALIGNED_SPACE , +the address of the free region will be optimized for the use of superpages. +Otherwise, if +.Fa find_space +is +.Dv VMFS_NO_SPACE , +.Xr vm_map_insert 9 +is called with the given address, +.Fa addr . .Sh IMPLEMENTATION NOTES This function acquires a lock on .Fa map @@ -90,9 +104,14 @@ The .Fn vm_map_find function returns .Dv KERN_SUCCESS -if space for the mapping could be found and -the mapping was successfully created. -If space could not be found in the map, +if the mapping was successfully created. +If space could not be found or +.Fa find_space +was +.Dv VMFS_NO_SPACE +and the given address, +.Fa addr , +was already mapped, .Dv KERN_NO_SPACE will be returned. If the discovered range turned out to be bogus, Modified: stable/7/sys/amd64/amd64/pmap.c ============================================================================== --- stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:51:54 2009 (r189074) +++ stable/7/sys/amd64/amd64/pmap.c Thu Feb 26 15:59:22 2009 (r189075) @@ -7,7 +7,7 @@ * All rights reserved. * Copyright (c) 2003 Peter Wemm * All rights reserved. - * Copyright (c) 2005 Alan L. Cox + * Copyright (c) 2005-2008 Alan L. Cox * All rights reserved. * * This code is derived from software contributed to Berkeley by @@ -107,10 +107,12 @@ __FBSDID("$FreeBSD$"); #include "opt_msgbuf.h" #include "opt_pmap.h" +#include "opt_vm.h" #include #include #include +#include #include #include #include @@ -134,6 +136,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -149,11 +152,7 @@ __FBSDID("$FreeBSD$"); #define PMAP_SHPGPERPROC 200 #endif -#if defined(DIAGNOSTIC) -#define PMAP_DIAGNOSTIC -#endif - -#if !defined(PMAP_DIAGNOSTIC) +#if !defined(DIAGNOSTIC) #define PMAP_INLINE __gnu89_inline #else #define PMAP_INLINE @@ -166,6 +165,9 @@ __FBSDID("$FreeBSD$"); #define PV_STAT(x) do { } while (0) #endif +#define pa_index(pa) ((pa) >> PDRSHIFT) +#define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) + struct pmap kernel_pmap_store; vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ @@ -176,6 +178,12 @@ static vm_paddr_t dmaplimit; vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS; pt_entry_t pg_nx; +SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); + +static int pg_ps_enabled; +SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RD, &pg_ps_enabled, 0, + "Are large page mappings enabled?"); + static u_int64_t KPTphys; /* phys addr of kernel level 1 */ static u_int64_t KPDphys; /* phys addr of kernel level 2 */ u_int64_t KPDPphys; /* phys addr of kernel level 3 */ @@ -188,6 +196,7 @@ static u_int64_t DMPDPphys; /* phys addr * Data for the pv entry allocation mechanism */ static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0; +static struct md_page *pv_table; static int shpgperproc = PMAP_SHPGPERPROC; /* @@ -204,11 +213,29 @@ static caddr_t crashdumpmap; static void free_pv_entry(pmap_t pmap, pv_entry_t pv); static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try); - +static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa); +static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va); +static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, + vm_offset_t va); + +static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_prot_t prot); static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte); +static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte); +static boolean_t pmap_is_modified_pvh(struct md_page *pvh); +static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va); +static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va); +static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, + vm_prot_t prot); +static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free); static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva, pd_entry_t ptepde, vm_page_t *free); +static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte); static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free); static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, @@ -362,21 +389,6 @@ pmap_pte(pmap_t pmap, vm_offset_t va) } -static __inline pt_entry_t * -pmap_pte_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *ptepde) -{ - pd_entry_t *pde; - - pde = pmap_pde(pmap, va); - if (pde == NULL || (*pde & PG_V) == 0) - return NULL; - *ptepde = *pde; - if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */ - return ((pt_entry_t *)pde); - return (pmap_pde_to_pte(pde, va)); -} - - PMAP_INLINE pt_entry_t * vtopte(vm_offset_t va) { @@ -511,6 +523,7 @@ pmap_bootstrap(vm_paddr_t *firstaddr) */ PMAP_LOCK_INIT(kernel_pmap); kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys); + kernel_pmap->pm_root = NULL; kernel_pmap->pm_active = -1; /* don't allow deactivation */ TAILQ_INIT(&kernel_pmap->pm_pvchunk); @@ -609,6 +622,26 @@ pmap_page_init(vm_page_t m) void pmap_init(void) { + pd_entry_t *pd; + vm_page_t mpte; + vm_size_t s; + int i, pv_npg; + + /* + * Initialize the vm page array entries for the kernel pmap's + * page table pages. + */ + pd = pmap_pde(kernel_pmap, VM_MIN_KERNEL_ADDRESS); + for (i = 0; i < NKPT; i++) { + if ((pd[i] & (PG_PS | PG_V)) == (PG_PS | PG_V)) + continue; + mpte = PHYS_TO_VM_PAGE(pd[i] & PG_FRAME); + KASSERT(mpte >= vm_page_array && + mpte < &vm_page_array[vm_page_array_size], + ("pmap_init: page table page is out of range")); + mpte->pindex = pmap_pde_pindex(VM_MIN_KERNEL_ADDRESS) + i; + mpte->phys_addr = pd[i] & PG_FRAME; + } /* * Initialize the address space (zone) for the pv entries. Set a @@ -619,9 +652,28 @@ pmap_init(void) pv_entry_max = shpgperproc * maxproc + cnt.v_page_count; TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max); pv_entry_high_water = 9 * (pv_entry_max / 10); + + /* + * Are large page mappings enabled? + */ + TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled); + + /* + * Calculate the size of the pv head table for superpages. + */ + for (i = 0; phys_avail[i + 1]; i += 2); + pv_npg = round_2mpage(phys_avail[(i - 2) + 1]) / NBPDR; + + /* + * Allocate memory for the pv head table for superpages. + */ + s = (vm_size_t)(pv_npg * sizeof(struct md_page)); + s = round_page(s); + pv_table = (struct md_page *)kmem_alloc(kernel_map, s); + for (i = 0; i < pv_npg; i++) + TAILQ_INIT(&pv_table[i].pv_list); } -SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); static int pmap_pventry_proc(SYSCTL_HANDLER_ARGS) { @@ -652,6 +704,25 @@ pmap_shpgperproc_proc(SYSCTL_HANDLER_ARG SYSCTL_PROC(_vm_pmap, OID_AUTO, shpgperproc, CTLTYPE_INT|CTLFLAG_RW, &shpgperproc, 0, pmap_shpgperproc_proc, "IU", "Page share factor per proc"); +SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, + "2MB page mapping counters"); + +static u_long pmap_pde_demotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, demotions, CTLFLAG_RD, + &pmap_pde_demotions, 0, "2MB page demotions"); + +static u_long pmap_pde_mappings; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD, + &pmap_pde_mappings, 0, "2MB page mappings"); + +static u_long pmap_pde_p_failures; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD, + &pmap_pde_p_failures, 0, "2MB page promotion failures"); + +static u_long pmap_pde_promotions; +SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD, + &pmap_pde_promotions, 0, "2MB page promotions"); + /*************************************************** * Low level helper routines..... @@ -953,17 +1024,25 @@ pmap_extract_and_hold(pmap_t pmap, vm_of vm_paddr_t pmap_kextract(vm_offset_t va) { - pd_entry_t *pde; + pd_entry_t pde; vm_paddr_t pa; if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) { pa = DMAP_TO_PHYS(va); } else { - pde = vtopde(va); - if (*pde & PG_PS) { - pa = (*pde & PG_PS_FRAME) | (va & PDRMASK); + pde = *vtopde(va); + if (pde & PG_PS) { + pa = (pde & PG_PS_FRAME) | (va & PDRMASK); } else { - pa = *vtopte(va); + /* + * Beware of a concurrent promotion that changes the + * PDE at this point! For example, vtopte() must not + * be used to access the PTE because it would use the + * new PDE. It is, however, safe to use the old PDE + * because the page table page is preserved by the + * promotion. + */ + pa = *pmap_pde_to_pte(&pde, va); pa = (pa & PG_FRAME) | (va & PAGE_MASK); } } @@ -1085,8 +1164,105 @@ pmap_free_zero_pages(vm_page_t free) while (free != NULL) { m = free; free = m->right; - vm_page_free_zero(m); + /* Preserve the page's PG_ZERO setting. */ + vm_page_free_toq(m); + } +} + +/* + * Schedule the specified unused page table page to be freed. Specifically, + * add the page to the specified list of pages that will be released to the + * physical memory manager after the TLB has been updated. + */ +static __inline void +pmap_add_delayed_free_list(vm_page_t m, vm_page_t *free, boolean_t set_PG_ZERO) +{ + + if (set_PG_ZERO) + m->flags |= PG_ZERO; + else + m->flags &= ~PG_ZERO; + m->right = *free; + *free = m; +} + +/* + * Inserts the specified page table page into the specified pmap's collection + * of idle page table pages. Each of a pmap's page table pages is responsible + * for mapping a distinct range of virtual addresses. The pmap's collection is + * ordered by this virtual address range. + */ +static void +pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + root = pmap->pm_root; + if (root == NULL) { + mpte->left = NULL; + mpte->right = NULL; + } else { + root = vm_page_splay(mpte->pindex, root); + if (mpte->pindex < root->pindex) { + mpte->left = root->left; + mpte->right = root; + root->left = NULL; + } else if (mpte->pindex == root->pindex) + panic("pmap_insert_pt_page: pindex already inserted"); + else { + mpte->right = root->right; + mpte->left = root; + root->right = NULL; + } + } + pmap->pm_root = mpte; +} + +/* + * Looks for a page table page mapping the specified virtual address in the + * specified pmap's collection of idle page table pages. Returns NULL if there + * is no page table page corresponding to the specified virtual address. + */ +static vm_page_t +pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va) +{ + vm_page_t mpte; + vm_pindex_t pindex = pmap_pde_pindex(va); + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if ((mpte = pmap->pm_root) != NULL && mpte->pindex != pindex) { + mpte = vm_page_splay(pindex, mpte); + if ((pmap->pm_root = mpte)->pindex != pindex) + mpte = NULL; } + return (mpte); +} + +/* + * Removes the specified page table page from the specified pmap's collection + * of idle page table pages. The specified page table page must be a member of + * the pmap's collection. + */ +static void +pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte) +{ + vm_page_t root; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + if (mpte != pmap->pm_root) { + root = vm_page_splay(mpte->pindex, pmap->pm_root); + KASSERT(mpte == root, + ("pmap_remove_pt_page: mpte %p is missing from pmap %p", + mpte, pmap)); + } + if (mpte->left == NULL) + root = mpte->right; + else { + root = vm_page_splay(mpte->pindex, mpte->left); + root->right = mpte->right; + } + pmap->pm_root = root; } /* @@ -1165,8 +1341,7 @@ _pmap_unwire_pte_hold(pmap_t pmap, vm_of * Put page on a list so that it is released after * *ALL* TLB shootdown is done */ - m->right = *free; - *free = m; + pmap_add_delayed_free_list(m, free, TRUE); return 1; } @@ -1193,6 +1368,7 @@ pmap_pinit0(pmap_t pmap) PMAP_LOCK_INIT(pmap); pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys); + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1229,6 +1405,7 @@ pmap_pinit(pmap_t pmap) /* install self-referential address mapping entry(s) */ pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | PG_V | PG_RW | PG_A | PG_M; + pmap->pm_root = NULL; pmap->pm_active = 0; TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -1404,7 +1581,7 @@ pmap_allocpte(pmap_t pmap, vm_offset_t v { vm_pindex_t ptepindex; pd_entry_t *pd; - vm_page_t m, free; + vm_page_t m; KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, @@ -1424,21 +1601,21 @@ retry: * This supports switching from a 2MB page to a * normal 4K page. */ - if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { - *pd = 0; - pd = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - free = NULL; - pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va), &free); - pmap_invalidate_all(kernel_pmap); - pmap_free_zero_pages(free); + if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { + if (!pmap_demote_pde(pmap, pd, va)) { + /* + * Invalidation of the 2MB page mapping may have caused + * the deallocation of the underlying PD page. + */ + pd = NULL; + } } /* * If the page table page is mapped, we just increment the * hold count, and activate it. */ - if (pd != 0 && (*pd & PG_V) != 0) { + if (pd != NULL && (*pd & PG_V) != 0) { m = PHYS_TO_VM_PAGE(*pd & PG_FRAME); m->wire_count++; } else { @@ -1471,6 +1648,8 @@ pmap_release(pmap_t pmap) KASSERT(pmap->pm_stats.resident_count == 0, ("pmap_release: pmap resident count %ld != 0", pmap->pm_stats.resident_count)); + KASSERT(pmap->pm_root == NULL, + ("pmap_release: pmap has reserved page table page(s)")); m = PHYS_TO_VM_PAGE(pmap->pm_pml4[PML4PML4I] & PG_FRAME); @@ -1645,11 +1824,16 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_coll * drastic measures to free some pages so we can allocate * another pv entry chunk. This is normally called to * unmap inactive pages, and if necessary, active pages. + * + * We do not, however, unmap 2mpages because subsequent accesses will + * allocate per-page pv entries until repromotion occurs, thereby + * exacerbating the shortage of free pv entries. */ static void pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq) { - pd_entry_t ptepde; + struct md_page *pvh; + pd_entry_t *pde; pmap_t pmap; pt_entry_t *pte, tpte; pv_entry_t next_pv, pv; @@ -1668,28 +1852,27 @@ pmap_collect(pmap_t locked_pmap, struct else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) continue; pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_collect"); - } + pde = pmap_pde(pmap, va); + KASSERT((*pde & PG_PS) == 0, ("pmap_collect: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, va); tpte = pte_load_clear(pte); KASSERT((tpte & PG_W) == 0, ("pmap_collect: wired pte %#lx", tpte)); if (tpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_collect: modified page not writable: va: %#lx, pte: %#lx", - va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, va, ptepde, &free); + pmap_unuse_pt(pmap, va, *pde, &free); pmap_invalidate_page(pmap, va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); @@ -1824,24 +2007,133 @@ retry: return (pv); } -static void -pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +/* + * First find and then remove the pv entry for the specified pmap and virtual + * address from the specified pv list. Returns the pv entry if found and NULL + * otherwise. This operation can be performed on pv lists for either 4KB or + * 2MB page mappings. + */ +static __inline pv_entry_t +pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) { pv_entry_t pv; - PMAP_LOCK_ASSERT(pmap, MA_OWNED); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) { - if (pmap == PV_PMAP(pv) && va == pv->pv_va) + TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) { + if (pmap == PV_PMAP(pv) && va == pv->pv_va) { + TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); break; + } } - KASSERT(pv != NULL, ("pmap_remove_entry: pv not found")); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_flag_clear(m, PG_WRITEABLE); + return (pv); +} + +/* + * After demotion from a 2MB page mapping to 512 4KB page mappings, + * destroy the pv entry for the 2MB page mapping and reinstantiate the pv + * entries for each of the 4KB page mappings. + */ +static void +pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_demote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the 2mpage's pv entry for this mapping to the first + * page's pv list. + */ + pvh = pa_to_pvh(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found")); + m = PHYS_TO_VM_PAGE(pa); + TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); + /* Instantiate the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + KASSERT((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0, + ("pmap_pv_demote_pde: page %p is not managed", m)); + va += PAGE_SIZE; + pmap_insert_entry(pmap, va, m); + } while (va < va_last); +} + +/* + * After promotion from 512 4KB page mappings to a single 2MB page mapping, + * replace the many pv entries for the 4KB page mappings by a single pv entry + * for the 2MB page mapping. + */ +static void +pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + KASSERT((pa & PDRMASK) == 0, + ("pmap_pv_promote_pde: pa is not 2mpage aligned")); + + /* + * Transfer the first page's pv entry for this mapping to the + * 2mpage's pv list. Aside from avoiding the cost of a call + * to get_pv_entry(), a transfer avoids the possibility that + * get_pv_entry() calls pmap_collect() and that pmap_collect() + * removes one of the mappings that is being promoted. + */ + m = PHYS_TO_VM_PAGE(pa); + va = trunc_2mpage(va); + pv = pmap_pvh_remove(&m->md, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found")); + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + /* Free the remaining NPTEPG - 1 pv entries. */ + va_last = va + NBPDR - PAGE_SIZE; + do { + m++; + va += PAGE_SIZE; + pmap_pvh_free(&m->md, pmap, va); + } while (va < va_last); +} + +/* + * First find and then destroy the pv entry for the specified pmap and virtual + * address. This operation can be performed on pv lists for either 4KB or 2MB + * page mappings. + */ +static void +pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +{ + pv_entry_t pv; + + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pvh_free: pv not found")); free_pv_entry(pmap, pv); } +static void +pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va) +{ + struct md_page *pvh; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pmap_pvh_free(&m->md, pmap, va); + if (TAILQ_EMPTY(&m->md.pv_list)) { + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } +} + /* * Create a pv entry for page at pa for * (pmap, va). @@ -1878,6 +2170,170 @@ pmap_try_insert_pv_entry(pmap_t pmap, vm } /* + * Create the pv entry for a 2MB page mapping. + */ +static boolean_t +pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + if (pv_entry_count < pv_entry_high_water && + (pv = get_pv_entry(pmap, TRUE)) != NULL) { + pv->pv_va = va; + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + return (TRUE); + } else + return (FALSE); +} + +/* + * Tries to demote a 2MB page mapping. + */ +static boolean_t +pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va) +{ + pd_entry_t newpde, oldpde; + pt_entry_t *firstpte, newpte, *pte; + vm_paddr_t mptepa; + vm_page_t free, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + mpte = pmap_lookup_pt_page(pmap, va); + if (mpte != NULL) + pmap_remove_pt_page(pmap, mpte); + else { + KASSERT((*pde & PG_W) == 0, + ("pmap_demote_pde: page table page for a wired mapping" + " is missing")); + free = NULL; + pmap_remove_pde(pmap, pde, trunc_2mpage(va), &free); + pmap_invalidate_page(pmap, trunc_2mpage(va)); + pmap_free_zero_pages(free); + CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx" + " in pmap %p", va, pmap); + return (FALSE); + } + mptepa = VM_PAGE_TO_PHYS(mpte); + firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa); + oldpde = *pde; + newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V; + KASSERT((oldpde & (PG_A | PG_V)) == (PG_A | PG_V), + ("pmap_demote_pde: oldpde is missing PG_A and/or PG_V")); + KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW, + ("pmap_demote_pde: oldpde is missing PG_M")); + KASSERT((oldpde & PG_PS) != 0, + ("pmap_demote_pde: oldpde is missing PG_PS")); + newpte = oldpde & ~PG_PS; + if ((newpte & PG_PDE_PAT) != 0) + newpte ^= PG_PDE_PAT | PG_PTE_PAT; + + /* + * If the mapping has changed attributes, update the page table + * entries. + */ + KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME), + ("pmap_demote_pde: firstpte and newpte map different physical" + " addresses")); + if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE)) + for (pte = firstpte; pte < firstpte + NPTEPG; pte++) { + *pte = newpte; + newpte += PAGE_SIZE; + } + + /* + * Demote the mapping. This pmap is locked. The old PDE has + * PG_A set. If the old PDE has PG_RW set, it also has PG_M + * set. Thus, there is no danger of a race with another + * processor changing the setting of PG_A and/or PG_M between + * the read above and the store below. + */ + pde_store(pde, newpde); + + /* + * Invalidate a stale mapping of the page table page. + */ + pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va)); + + /* + * Demote the pv entry. This depends on the earlier demotion + * of the mapping. Specifically, the (re)creation of a per- + * page pv entry might trigger the execution of pmap_collect(), + * which might reclaim a newly (re)created per-page pv entry + * and destroy the associated mapping. In order to destroy + * the mapping, the PDE must have already changed from mapping + * the 2mpage to referencing the page table page. + */ + if ((oldpde & PG_MANAGED) != 0) + pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME); + + pmap_pde_demotions++; + CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx" + " in pmap %p", va, pmap); + return (TRUE); +} + +/* + * pmap_remove_pde: do the things to unmap a superpage in a process + */ +static int +pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva, + vm_page_t *free) +{ + struct md_page *pvh; + pd_entry_t oldpde; + vm_offset_t eva, va; + vm_page_t m, mpte; + + PMAP_LOCK_ASSERT(pmap, MA_OWNED); + KASSERT((sva & PDRMASK) == 0, + ("pmap_remove_pde: sva is not 2mpage aligned")); + oldpde = pte_load_clear(pdq); + if (oldpde & PG_W) + pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE; + + /* + * Machines that don't support invlpg, also don't support + * PG_G. + */ + if (oldpde & PG_G) + pmap_invalidate_page(kernel_pmap, sva); + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + if (oldpde & PG_MANAGED) { + pvh = pa_to_pvh(oldpde & PG_PS_FRAME); + pmap_pvh_free(pvh, pmap, sva); + eva = sva + NBPDR; + for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME); + va < eva; va += PAGE_SIZE, m++) { + if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) + vm_page_dirty(m); + if (oldpde & PG_A) + vm_page_flag_set(m, PG_REFERENCED); + if (TAILQ_EMPTY(&m->md.pv_list) && + TAILQ_EMPTY(&pvh->pv_list)) + vm_page_flag_clear(m, PG_WRITEABLE); + } + } + if (pmap == kernel_pmap) { + if (!pmap_demote_pde(pmap, pdq, sva)) + panic("pmap_remove_pde: failed demotion"); + } else { + mpte = pmap_lookup_pt_page(pmap, sva); + if (mpte != NULL) { + pmap_remove_pt_page(pmap, mpte); + KASSERT(mpte->wire_count == NPTEPG, + ("pmap_remove_pde: pte page wire count error")); + mpte->wire_count = 0; + pmap_add_delayed_free_list(mpte, free, FALSE); + atomic_subtract_int(&cnt.v_wire_count, 1); + } + } + return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free)); +} + +/* * pmap_remove_pte: do the things to unmap a page in a process */ static int @@ -1900,12 +2356,8 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t pmap->pm_stats.resident_count -= 1; if (oldpte & PG_MANAGED) { m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME); - if (oldpte & PG_M) { - KASSERT((oldpte & PG_RW), - ("pmap_remove_pte: modified page not writable: va: %#lx, pte: %#lx", - va, oldpte)); + if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } if (oldpte & PG_A) vm_page_flag_set(m, PG_REFERENCED); pmap_remove_entry(pmap, m, va); @@ -2013,11 +2465,24 @@ pmap_remove(pmap_t pmap, vm_offset_t sva * Check for large page. */ if ((ptpaddr & PG_PS) != 0) { - *pde = 0; - pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; - pmap_unuse_pt(pmap, sva, *pdpe, &free); - anyvalid = 1; - continue; + /* + * Are we removing the entire large page? If not, + * demote the mapping and fall through. + */ + if (sva + NBPDR == va_next && eva >= va_next) { + /* + * The TLB entry for a PG_G mapping is + * invalidated by pmap_remove_pde(). + */ + if ((ptpaddr & PG_G) == 0) + anyvalid = 1; + pmap_remove_pde(pmap, pde, sva, &free); + continue; + } else if (!pmap_demote_pde(pmap, pde, sva)) { + /* The large page mapping was destroyed. */ + continue; + } else + ptpaddr = *pde; } /* @@ -2067,30 +2532,34 @@ out: void pmap_remove_all(vm_page_t m) { + struct md_page *pvh; pv_entry_t pv; pmap_t pmap; pt_entry_t *pte, tpte; - pd_entry_t ptepde; + pd_entry_t *pde; + vm_offset_t va; vm_page_t free; -#if defined(PMAP_DIAGNOSTIC) - /* - * XXX This makes pmap_remove_all() illegal for non-managed pages! - */ - if (m->flags & PG_FICTITIOUS) { - panic("pmap_remove_all: illegal for unmanaged page, va: 0x%lx", - VM_PAGE_TO_PHYS(m)); - } -#endif + KASSERT((m->flags & PG_FICTITIOUS) == 0, + ("pmap_remove_all: page %p is fictitious", m)); mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { + va = pv->pv_va; + pmap = PV_PMAP(pv); + PMAP_LOCK(pmap); + pde = pmap_pde(pmap, va); + (void)pmap_demote_pde(pmap, pde, va); + PMAP_UNLOCK(pmap); + } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pmap->pm_stats.resident_count--; - pte = pmap_pte_pde(pmap, pv->pv_va, &ptepde); - if (pte == NULL) { - panic("null pte in pmap_remove_all"); - } + pde = pmap_pde(pmap, pv->pv_va); + KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found" + " a 2mpage in page %p's pv list", m)); + pte = pmap_pde_to_pte(pde, pv->pv_va); tpte = pte_load_clear(pte); if (tpte & PG_W) pmap->pm_stats.wired_count--; @@ -2100,14 +2569,10 @@ pmap_remove_all(vm_page_t m) /* * Update the vm_page_t clean and reference bits. */ - if (tpte & PG_M) { - KASSERT((tpte & PG_RW), - ("pmap_remove_all: modified page not writable: va: %#lx, pte: %#lx", - pv->pv_va, tpte)); + if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) vm_page_dirty(m); - } free = NULL; - pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free); + pmap_unuse_pt(pmap, pv->pv_va, *pde, &free); pmap_invalidate_page(pmap, pv->pv_va); pmap_free_zero_pages(free); TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); @@ -2118,6 +2583,54 @@ pmap_remove_all(vm_page_t m) } /* + * pmap_protect_pde: do the things to protect a 2mpage in a process + */ +static boolean_t +pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot) *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:43:51 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7BDA41065678; Thu, 26 Feb 2009 19:43:51 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards3.yandex.ru (forwards3.yandex.ru [213.180.223.174]) by mx1.freebsd.org (Postfix) with ESMTP id F2A458FC14; Thu, 26 Feb 2009 19:43:50 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront72.yandex.ru (mxfront72.yandex.ru [213.180.223.29]) by forwards3.yandex.ru (Yandex) with ESMTP id F14111D35A6; Thu, 26 Feb 2009 22:38:36 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:45545 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S9733812AbZBZSOi for (+ 4 others); Thu, 26 Feb 2009 21:14:38 +0300 X-Yandex-TimeMark: 1235672078 X-Yandex-Spam: 2 X-Yandex-Front: mxfront72 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id 642B714DB7D; Thu, 26 Feb 2009 18:14:26 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 01F8D1065790; Thu, 26 Feb 2009 18:14:24 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2C3DC10656C5; Thu, 26 Feb 2009 18:14:14 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from mail17.syd.optusnet.com.au (mail17.syd.optusnet.com.au [211.29.132.198]) by mx1.freebsd.org (Postfix) with ESMTP id A65D78FC0A; Thu, 26 Feb 2009 18:14:13 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from server.vk2pj.dyndns.org (c122-106-216-167.belrs3.nsw.optusnet.com.au [122.106.216.167]) by mail17.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id n1QIE03a029493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 27 Feb 2009 05:14:02 +1100 X-Bogosity: Ham, spamicity=0.000000 Received: from server.vk2pj.dyndns.org (localhost.vk2pj.dyndns.org [127.0.0.1]) by server.vk2pj.dyndns.org (8.14.3/8.14.3) with ESMTP id n1QIE0Qk070630; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter@server.vk2pj.dyndns.org) Received: (from peter@localhost) by server.vk2pj.dyndns.org (8.14.3/8.14.3/Submit) id n1QIE01T070629; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter) Date: Fri, 27 Feb 2009 05:14:00 +1100 From: Peter Jeremy To: Andrew Gallatin Message-ID: <20090226181400.GB3540@server.vk2pj.dyndns.org> References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5/uDoXvLw7AC5HRs" Content-Disposition: inline In-Reply-To: <49A571BE.4060107@cs.duke.edu> X-PGP-Key: http://members.optusnet.com.au/peterjeremy/pubkey.asc User-Agent: Mutt/1.5.19 (2009-01-05) X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:43:53 -0000 --5/uDoXvLw7AC5HRs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2009-Feb-25 11:28:46 -0500, Andrew Gallatin wrote: > Just picking a commit at random, but is there any way > to clean up the props on pf, ath and cxgb: > >> stable/7/sys/contrib/pf/ (props changed) >> stable/7/sys/dev/ath/ath_hal/ (props changed) >> stable/7/sys/dev/cxgb/ (props changed) >> stable/7/sys/kern/kern_descrip.c > > Or at the very least, have the email script ignore them? Having virtually every single commit to 7.x report that properties on sys/contrib/pf, sys/dev/ath/ath_hal and sys/dev/cxgb have changed strikes me as a bug somewhere in the SVN repo or configuration. > Having this props change garbage always in the $SUBJECT of > MFCs makes it very hard to distinguish from the commit > message what part of the tree is actually changing. I also miss having the list of affected files in $SUBJECT - that made it easier to scan for commits to files of interest. --=20 Peter Jeremy --5/uDoXvLw7AC5HRs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.10 (FreeBSD) iEYEARECAAYFAkmm2+gACgkQ/opHv/APuIdl4gCeNfSucr4ssY0R3ibBhzrXe/bm 7gsAn1hZBox7NQvO0KqKSPPOMQH8JO04 =PO3U -----END PGP SIGNATURE----- --5/uDoXvLw7AC5HRs-- From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 19:47:57 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8CE981065678; Thu, 26 Feb 2009 19:47:57 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from forwards5.yandex.ru (forwards5.yandex.ru [77.88.61.37]) by mx1.freebsd.org (Postfix) with ESMTP id 05E898FC25; Thu, 26 Feb 2009 19:47:56 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from mxfront6.yandex.ru (mxfront6.yandex.ru [77.88.47.142]) by forwards5.yandex.ru (Yandex) with ESMTP id 15CDFB1CA96; Thu, 26 Feb 2009 22:15:17 +0300 (MSK) Received: from mx2.freebsd.org ([69.147.83.53]:34794 "EHLO mx2.freebsd.org" smtp-auth: TLS-CIPHER: TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S3803631AbZBZSOn for (+ 4 others); Thu, 26 Feb 2009 21:14:43 +0300 X-Yandex-TimeMark: 1235672083 X-Yandex-Spam: 2 X-Yandex-Front: mxfront6 Received: from hub.freebsd.org (hub.freebsd.org [IPv6:2001:4f8:fff6::36]) by mx2.freebsd.org (Postfix) with ESMTP id D969A14E34F; Thu, 26 Feb 2009 18:14:28 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Received: from hub.freebsd.org (localhost [127.0.0.1]) by hub.freebsd.org (Postfix) with ESMTP id 463C8106579F; Thu, 26 Feb 2009 18:14:24 +0000 (UTC) (envelope-from owner-svn-src-all@freebsd.org) Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2C3DC10656C5; Thu, 26 Feb 2009 18:14:14 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from mail17.syd.optusnet.com.au (mail17.syd.optusnet.com.au [211.29.132.198]) by mx1.freebsd.org (Postfix) with ESMTP id A65D78FC0A; Thu, 26 Feb 2009 18:14:13 +0000 (UTC) (envelope-from peterjeremy@optushome.com.au) Received: from server.vk2pj.dyndns.org (c122-106-216-167.belrs3.nsw.optusnet.com.au [122.106.216.167]) by mail17.syd.optusnet.com.au (8.13.1/8.13.1) with ESMTP id n1QIE03a029493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 27 Feb 2009 05:14:02 +1100 X-Bogosity: Ham, spamicity=0.000000 Received: from server.vk2pj.dyndns.org (localhost.vk2pj.dyndns.org [127.0.0.1]) by server.vk2pj.dyndns.org (8.14.3/8.14.3) with ESMTP id n1QIE0Qk070630; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter@server.vk2pj.dyndns.org) Received: (from peter@localhost) by server.vk2pj.dyndns.org (8.14.3/8.14.3/Submit) id n1QIE01T070629; Fri, 27 Feb 2009 05:14:00 +1100 (EST) (envelope-from peter) Date: Fri, 27 Feb 2009 05:14:00 +1100 From: Peter Jeremy To: Andrew Gallatin Message-ID: <20090226181400.GB3540@server.vk2pj.dyndns.org> References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5/uDoXvLw7AC5HRs" Content-Disposition: inline In-Reply-To: <49A571BE.4060107@cs.duke.edu> X-PGP-Key: http://members.optusnet.com.au/peterjeremy/pubkey.asc User-Agent: Mutt/1.5.19 (2009-01-05) X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Sender: owner-svn-src-all@freebsd.org Errors-To: owner-svn-src-all@freebsd.org Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 19:47:58 -0000 --5/uDoXvLw7AC5HRs Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 2009-Feb-25 11:28:46 -0500, Andrew Gallatin wrote: > Just picking a commit at random, but is there any way > to clean up the props on pf, ath and cxgb: > >> stable/7/sys/contrib/pf/ (props changed) >> stable/7/sys/dev/ath/ath_hal/ (props changed) >> stable/7/sys/dev/cxgb/ (props changed) >> stable/7/sys/kern/kern_descrip.c > > Or at the very least, have the email script ignore them? Having virtually every single commit to 7.x report that properties on sys/contrib/pf, sys/dev/ath/ath_hal and sys/dev/cxgb have changed strikes me as a bug somewhere in the SVN repo or configuration. > Having this props change garbage always in the $SUBJECT of > MFCs makes it very hard to distinguish from the commit > message what part of the tree is actually changing. I also miss having the list of affected files in $SUBJECT - that made it easier to scan for commits to files of interest. --=20 Peter Jeremy --5/uDoXvLw7AC5HRs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.10 (FreeBSD) iEYEARECAAYFAkmm2+gACgkQ/opHv/APuIdl4gCeNfSucr4ssY0R3ibBhzrXe/bm 7gsAn1hZBox7NQvO0KqKSPPOMQH8JO04 =PO3U -----END PGP SIGNATURE----- --5/uDoXvLw7AC5HRs-- From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 20:38:38 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 11CDA1065706; Thu, 26 Feb 2009 20:38:38 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id F15008FC08; Thu, 26 Feb 2009 20:38:37 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1QKcbVc037677; Thu, 26 Feb 2009 20:38:37 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1QKcbHL037672; Thu, 26 Feb 2009 20:38:37 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902262038.n1QKcbHL037672@svn.freebsd.org> From: John Baldwin Date: Thu, 26 Feb 2009 20:38:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189088 - in stable/7/sys: . arm/arm contrib/pf dev/ath/ath_hal dev/cxgb ia64/ia64 powerpc/powerpc sparc64/sparc64 sun4v/sun4v X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 20:38:39 -0000 Author: jhb Date: Thu Feb 26 20:38:37 2009 New Revision: 189088 URL: http://svn.freebsd.org/changeset/base/189088 Log: MFC: Add a stub for pmap_align_superpage() on machines that don't (yet) implement pmap-level support for superpages. Pointy hat to: jhb Modified: stable/7/sys/ (props changed) stable/7/sys/arm/arm/pmap.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/ia64/ia64/pmap.c stable/7/sys/powerpc/powerpc/pmap_dispatch.c stable/7/sys/sparc64/sparc64/pmap.c stable/7/sys/sun4v/sun4v/pmap.c Modified: stable/7/sys/arm/arm/pmap.c ============================================================================== --- stable/7/sys/arm/arm/pmap.c Thu Feb 26 20:32:11 2009 (r189087) +++ stable/7/sys/arm/arm/pmap.c Thu Feb 26 20:38:37 2009 (r189088) @@ -3829,7 +3829,8 @@ pmap_pinit(pmap_t pmap) bzero(&pmap->pm_stats, sizeof pmap->pm_stats); pmap->pm_stats.resident_count = 1; if (vector_page < KERNBASE) { - pmap_enter(pmap, vector_page, PHYS_TO_VM_PAGE(systempage.pv_pa), + pmap_enter(pmap, vector_page, + VM_PROT_READ, PHYS_TO_VM_PAGE(systempage.pv_pa), VM_PROT_READ, 1); } return (1); @@ -4559,6 +4560,16 @@ pmap_addr_hint(vm_object_t obj, vm_offse return(addr); } +/* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ +void +pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, + vm_offset_t *addr, vm_size_t size) +{ +} + /* * Map a set of physical memory pages into the kernel virtual Modified: stable/7/sys/ia64/ia64/pmap.c ============================================================================== --- stable/7/sys/ia64/ia64/pmap.c Thu Feb 26 20:32:11 2009 (r189087) +++ stable/7/sys/ia64/ia64/pmap.c Thu Feb 26 20:38:37 2009 (r189088) @@ -2237,6 +2237,16 @@ pmap_addr_hint(vm_object_t obj, vm_offse return addr; } +/* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ +void +pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, + vm_offset_t *addr, vm_size_t size) +{ +} + #include "opt_ddb.h" #ifdef DDB Modified: stable/7/sys/powerpc/powerpc/pmap_dispatch.c ============================================================================== --- stable/7/sys/powerpc/powerpc/pmap_dispatch.c Thu Feb 26 20:32:11 2009 (r189087) +++ stable/7/sys/powerpc/powerpc/pmap_dispatch.c Thu Feb 26 20:38:37 2009 (r189088) @@ -296,6 +296,16 @@ pmap_addr_hint(vm_object_t obj, vm_offse return (MMU_ADDR_HINT(mmu_obj, obj, addr, size)); } +/* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ +void +pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, + vm_offset_t *addr, vm_size_t size) +{ +} + /* Modified: stable/7/sys/sparc64/sparc64/pmap.c ============================================================================== --- stable/7/sys/sparc64/sparc64/pmap.c Thu Feb 26 20:32:11 2009 (r189087) +++ stable/7/sys/sparc64/sparc64/pmap.c Thu Feb 26 20:38:37 2009 (r189088) @@ -1963,3 +1963,13 @@ pmap_addr_hint(vm_object_t object, vm_of return (va); } + +/* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ +void +pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, + vm_offset_t *addr, vm_size_t size) +{ +} Modified: stable/7/sys/sun4v/sun4v/pmap.c ============================================================================== --- stable/7/sys/sun4v/sun4v/pmap.c Thu Feb 26 20:32:11 2009 (r189087) +++ stable/7/sys/sun4v/sun4v/pmap.c Thu Feb 26 20:38:37 2009 (r189088) @@ -431,6 +431,16 @@ pmap_addr_hint(vm_object_t object, vm_of } /* + * Increase the starting virtual address of the given mapping if a + * different alignment might result in more superpage mappings. + */ +void +pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, + vm_offset_t *addr, vm_size_t size) +{ +} + +/* * Bootstrap the system enough to run with virtual memory. */ void From owner-svn-src-stable@FreeBSD.ORG Thu Feb 26 20:50:51 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 676CE1065673; Thu, 26 Feb 2009 20:50:51 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id E1E248FC20; Thu, 26 Feb 2009 20:50:50 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from server.baldwin.cx (pool-98-109-39-197.nwrknj.fios.verizon.net [98.109.39.197]) by cyrus.watson.org (Postfix) with ESMTPSA id 88E6A46B43; Thu, 26 Feb 2009 15:50:50 -0500 (EST) Received: from localhost (john@localhost [127.0.0.1]) (authenticated bits=0) by server.baldwin.cx (8.14.3/8.14.3) with ESMTP id n1QKoib2044955; Thu, 26 Feb 2009 15:50:44 -0500 (EST) (envelope-from jhb@freebsd.org) From: John Baldwin To: Peter Jeremy Date: Thu, 26 Feb 2009 15:40:36 -0500 User-Agent: KMail/1.9.7 References: <200902251504.n1PF4UjR000511@svn.freebsd.org> <49A571BE.4060107@cs.duke.edu> <20090226181400.GB3540@server.vk2pj.dyndns.org> In-Reply-To: <20090226181400.GB3540@server.vk2pj.dyndns.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200902261540.37400.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by milter-greylist-2.0.2 (server.baldwin.cx [127.0.0.1]); Thu, 26 Feb 2009 15:50:44 -0500 (EST) X-Virus-Scanned: ClamAV 0.94.2/9051/Thu Feb 26 08:08:01 2009 on server.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-4.4 required=4.2 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.1.3 X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on server.baldwin.cx Cc: svn-src-stable@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, svn-src-stable-7@freebsd.org, Andrew Gallatin Subject: Re: svn commit: r189044 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb kern X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Feb 2009 20:50:52 -0000 On Thursday 26 February 2009 1:14:00 pm Peter Jeremy wrote: > On 2009-Feb-25 11:28:46 -0500, Andrew Gallatin wrote: > > Just picking a commit at random, but is there any way > > to clean up the props on pf, ath and cxgb: > > > >> stable/7/sys/contrib/pf/ (props changed) > >> stable/7/sys/dev/ath/ath_hal/ (props changed) > >> stable/7/sys/dev/cxgb/ (props changed) > >> stable/7/sys/kern/kern_descrip.c > > > > Or at the very least, have the email script ignore them? > > Having virtually every single commit to 7.x report that properties on > sys/contrib/pf, sys/dev/ath/ath_hal and sys/dev/cxgb have changed > strikes me as a bug somewhere in the SVN repo or configuration. It's a result of SVN's merge metadata scheme not really scaling well. -- John Baldwin From owner-svn-src-stable@FreeBSD.ORG Fri Feb 27 15:25:47 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D66A61065678; Fri, 27 Feb 2009 15:25:47 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C466A8FC22; Fri, 27 Feb 2009 15:25:47 +0000 (UTC) (envelope-from jhb@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1RFPlhB073982; Fri, 27 Feb 2009 15:25:47 GMT (envelope-from jhb@svn.freebsd.org) Received: (from jhb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1RFPlqi073981; Fri, 27 Feb 2009 15:25:47 GMT (envelope-from jhb@svn.freebsd.org) Message-Id: <200902271525.n1RFPlqi073981@svn.freebsd.org> From: John Baldwin Date: Fri, 27 Feb 2009 15:25:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189107 - stable/7/sys/amd64/amd64 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Feb 2009 15:25:49 -0000 Author: jhb Date: Fri Feb 27 15:25:47 2009 New Revision: 189107 URL: http://svn.freebsd.org/changeset/base/189107 Log: Catch up to the 6GB KVA changes. The original superpages patches on 7 were tested prior to the MFC of the 6GB KVA changes, and I failed to do an extra sanity check yesterday. This should fix the pmap_init() panics. Pointy hat to: jhb Modified: stable/7/sys/amd64/amd64/pmap.c Modified: stable/7/sys/amd64/amd64/pmap.c ============================================================================== --- stable/7/sys/amd64/amd64/pmap.c Fri Feb 27 14:12:05 2009 (r189106) +++ stable/7/sys/amd64/amd64/pmap.c Fri Feb 27 15:25:47 2009 (r189107) @@ -631,15 +631,17 @@ pmap_init(void) * Initialize the vm page array entries for the kernel pmap's * page table pages. */ - pd = pmap_pde(kernel_pmap, VM_MIN_KERNEL_ADDRESS); + pd = pmap_pde(kernel_pmap, KERNBASE); for (i = 0; i < NKPT; i++) { if ((pd[i] & (PG_PS | PG_V)) == (PG_PS | PG_V)) continue; + KASSERT((pd[i] & PG_V) != 0, + ("pmap_init: page table page is missing")); mpte = PHYS_TO_VM_PAGE(pd[i] & PG_FRAME); KASSERT(mpte >= vm_page_array && mpte < &vm_page_array[vm_page_array_size], ("pmap_init: page table page is out of range")); - mpte->pindex = pmap_pde_pindex(VM_MIN_KERNEL_ADDRESS) + i; + mpte->pindex = pmap_pde_pindex(KERNBASE) + i; mpte->phys_addr = pd[i] & PG_FRAME; } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:24:58 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 037BD106564A; Sat, 28 Feb 2009 10:24:58 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DB2268FC13; Sat, 28 Feb 2009 10:24:57 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAOvaS002516; Sat, 28 Feb 2009 10:24:57 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAOvjS002515; Sat, 28 Feb 2009 10:24:57 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281024.n1SAOvjS002515@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:24:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189144 - in stable/7/sys: . cam contrib/pf dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:24:58 -0000 Author: trasz Date: Sat Feb 28 10:24:57 2009 New Revision: 189144 URL: http://svn.freebsd.org/changeset/base/189144 Log: MFC r186184: Get rid of dead_sim. There is no way to make it work - any attempt to actually use it would panic on mtx operation, as dead_sim doesn't have a proper mutex. Even if it had a properly initialized mutex, it wouldn't have properly locked and owned one. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:10:30 2009 (r189143) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:24:57 2009 (r189144) @@ -698,19 +698,6 @@ static struct cdevsw xpt_cdevsw = { }; -static void dead_sim_action(struct cam_sim *sim, union ccb *ccb); -static void dead_sim_poll(struct cam_sim *sim); - -/* Dummy SIM that is used when the real one has gone. */ -static struct cam_sim cam_dead_sim = { - .sim_action = dead_sim_action, - .sim_poll = dead_sim_poll, - .sim_name = "dead_sim", -}; - -#define SIM_DEAD(sim) ((sim) == &cam_dead_sim) - - /* Storage for debugging datastructures */ #ifdef CAMDEBUG struct cam_path *cam_dpath; @@ -3023,19 +3010,10 @@ xpt_action(union ccb *start_ccb) case XPT_ENG_EXEC: { struct cam_path *path; - struct cam_sim *sim; int runq; path = start_ccb->ccb_h.path; - sim = path->bus->sim; - if (SIM_DEAD(sim)) { - /* The SIM has gone; just execute the CCB directly. */ - cam_ccbq_send_ccb(&path->device->ccbq, start_ccb); - (*(sim->sim_action))(sim, start_ccb); - break; - } - cam_ccbq_insert_ccb(&path->device->ccbq, start_ccb); if (path->device->qfrozen_cnt == 0) runq = xpt_schedule_dev_sendq(path->bus, path->device); @@ -3623,7 +3601,6 @@ void xpt_schedule(struct cam_periph *perph, u_int32_t new_priority) { struct cam_ed *device; - union ccb *work_ccb; int runq; mtx_assert(perph->sim->mtx, MA_OWNED); @@ -3640,15 +3617,6 @@ xpt_schedule(struct cam_periph *perph, u new_priority); } runq = 0; - } else if (SIM_DEAD(perph->path->bus->sim)) { - /* The SIM is gone so just call periph_start directly. */ - work_ccb = xpt_get_ccb(perph->path->device); - if (work_ccb == NULL) - return; /* XXX */ - xpt_setup_ccb(&work_ccb->ccb_h, perph->path, new_priority); - perph->pinfo.priority = new_priority; - perph->periph_start(perph, work_ccb); - return; } else { /* New entry on the queue */ CAM_DEBUG(perph->path, CAM_DEBUG_SUBTRACE, @@ -4372,15 +4340,8 @@ int32_t xpt_bus_deregister(path_id_t pathid) { struct cam_path bus_path; - struct cam_ed *device; - struct cam_ed_qinfo *qinfo; - struct cam_devq *devq; - struct cam_periph *periph; - struct cam_sim *ccbsim; - union ccb *work_ccb; cam_status status; - status = xpt_compile_path(&bus_path, NULL, pathid, CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); if (status != CAM_REQ_CMP) @@ -4389,42 +4350,6 @@ xpt_bus_deregister(path_id_t pathid) xpt_async(AC_LOST_DEVICE, &bus_path, NULL); xpt_async(AC_PATH_DEREGISTERED, &bus_path, NULL); - /* The SIM may be gone, so use a dummy SIM for any stray operations. */ - devq = bus_path.bus->sim->devq; - ccbsim = bus_path.bus->sim; - bus_path.bus->sim = &cam_dead_sim; - - /* Execute any pending operations now. */ - while ((qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->send_queue, - CAMQ_HEAD)) != NULL || - (qinfo = (struct cam_ed_qinfo *)camq_remove(&devq->alloc_queue, - CAMQ_HEAD)) != NULL) { - do { - device = qinfo->device; - work_ccb = cam_ccbq_peek_ccb(&device->ccbq, CAMQ_HEAD); - if (work_ccb != NULL) { - devq->active_dev = device; - cam_ccbq_remove_ccb(&device->ccbq, work_ccb); - cam_ccbq_send_ccb(&device->ccbq, work_ccb); - (*(ccbsim->sim_action))(ccbsim, work_ccb); - } - - periph = (struct cam_periph *)camq_remove(&device->drvq, - CAMQ_HEAD); - if (periph != NULL) - xpt_schedule(periph, periph->pinfo.priority); - } while (work_ccb != NULL || periph != NULL); - } - - /* Make sure all completed CCBs are processed. */ - while (!TAILQ_EMPTY(&ccbsim->sim_doneq)) { - camisr_runqueue(&ccbsim->sim_doneq); - - /* Repeat the async's for the benefit of any new devices. */ - xpt_async(AC_LOST_DEVICE, &bus_path, NULL); - xpt_async(AC_PATH_DEREGISTERED, &bus_path, NULL); - } - /* Release the reference count held while registered. */ xpt_release_bus(bus_path.bus); xpt_release_path(&bus_path); @@ -4982,9 +4907,6 @@ xpt_alloc_device(struct cam_eb *bus, str struct cam_devq *devq; cam_status status; - if (SIM_DEAD(bus->sim)) - return (NULL); - /* Make space for us in the device queue on our bus */ devq = bus->sim->devq; status = cam_devq_resize(devq, devq->alloc_queue.array_size + 1); @@ -5094,11 +5016,9 @@ xpt_release_device(struct cam_eb *bus, s TAILQ_REMOVE(&target->ed_entries, device,links); target->generation++; bus->sim->max_ccbs -= device->ccbq.devq_openings; - if (!SIM_DEAD(bus->sim)) { - /* Release our slot in the devq */ - devq = bus->sim->devq; - cam_devq_resize(devq, devq->alloc_queue.array_size - 1); - } + /* Release our slot in the devq */ + devq = bus->sim->devq; + cam_devq_resize(devq, devq->alloc_queue.array_size - 1); camq_fini(&device->drvq); camq_fini(&device->ccbq.queue); free(device, M_CAMXPT); @@ -7269,11 +7189,8 @@ camisr_runqueue(void *V_queue) dev = ccb_h->path->device; cam_ccbq_ccb_done(&dev->ccbq, (union ccb *)ccb_h); - - if (!SIM_DEAD(ccb_h->path->bus->sim)) { - ccb_h->path->bus->sim->devq->send_active--; - ccb_h->path->bus->sim->devq->send_openings++; - } + ccb_h->path->bus->sim->devq->send_active--; + ccb_h->path->bus->sim->devq->send_openings++; if (((dev->flags & CAM_DEV_REL_ON_COMPLETE) != 0 && (ccb_h->status&CAM_STATUS_MASK) != CAM_REQUEUE_REQ) @@ -7317,15 +7234,3 @@ camisr_runqueue(void *V_queue) } } -static void -dead_sim_action(struct cam_sim *sim, union ccb *ccb) -{ - - ccb->ccb_h.status = CAM_DEV_NOT_THERE; - xpt_done(ccb); -} - -static void -dead_sim_poll(struct cam_sim *sim) -{ -} From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:27:47 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 001DC106566B; Sat, 28 Feb 2009 10:27:46 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E1A918FC14; Sat, 28 Feb 2009 10:27:46 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SARk8C002616; Sat, 28 Feb 2009 10:27:46 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SARkDb002613; Sat, 28 Feb 2009 10:27:46 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281027.n1SARkDb002613@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:27:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189145 - in stable/7/sys: . cam contrib/pf dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:27:47 -0000 Author: trasz Date: Sat Feb 28 10:27:46 2009 New Revision: 189145 URL: http://svn.freebsd.org/changeset/base/189145 Log: MFC r186185: Add SIM refcounting. This is slightly different from what DragonFly does - in DragonFly, it's cam_sim_release() what actually frees the SIM; cam_sim_free does nothing more than calling cam_sim_release(). Here, we drain in cam_sim_free, waiting for refcount to drop to zero. We cannot do the same think DragonFly does, because after cam_sim_free returns, client would destroy the sim->mtx, and CAM would trip over an initialized mutex. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_sim.c stable/7/sys/cam/cam_sim.h stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_sim.c ============================================================================== --- stable/7/sys/cam/cam_sim.c Sat Feb 28 10:24:57 2009 (r189144) +++ stable/7/sys/cam/cam_sim.c Sat Feb 28 10:27:46 2009 (r189145) @@ -84,6 +84,7 @@ cam_sim_alloc(sim_action_func sim_action sim->max_tagged_dev_openings = max_tagged_dev_transactions; sim->max_dev_openings = max_dev_transactions; sim->flags = 0; + sim->refcount = 1; sim->devq = queue; sim->mtx = mtx; if (mtx == &Giant) { @@ -103,12 +104,40 @@ cam_sim_alloc(sim_action_func sim_action void cam_sim_free(struct cam_sim *sim, int free_devq) { + int error; + + sim->refcount--; + if (sim->refcount > 0) { + error = msleep(sim, sim->mtx, PRIBIO, "simfree", 0); + KASSERT(error == 0, ("invalid error value for msleep(9)")); + } + + KASSERT(sim->refcount == 0, ("sim->refcount == 0")); + if (free_devq) cam_simq_free(sim->devq); free(sim, M_CAMSIM); } void +cam_sim_release(struct cam_sim *sim) +{ + KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); + + sim->refcount--; + if (sim->refcount <= 1) + wakeup(sim); +} + +void +cam_sim_hold(struct cam_sim *sim) +{ + KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); + + sim->refcount++; +} + +void cam_sim_set_path(struct cam_sim *sim, u_int32_t path_id) { sim->path_id = path_id; Modified: stable/7/sys/cam/cam_sim.h ============================================================================== --- stable/7/sys/cam/cam_sim.h Sat Feb 28 10:24:57 2009 (r189144) +++ stable/7/sys/cam/cam_sim.h Sat Feb 28 10:27:46 2009 (r189145) @@ -61,6 +61,8 @@ struct cam_sim * cam_sim_alloc(sim_acti int max_tagged_dev_transactions, struct cam_devq *queue); void cam_sim_free(struct cam_sim *sim, int free_devq); +void cam_sim_hold(struct cam_sim *sim); +void cam_sim_release(struct cam_sim *sim); /* Optional sim attributes may be set with these. */ void cam_sim_set_path(struct cam_sim *sim, u_int32_t path_id); @@ -105,6 +107,7 @@ struct cam_sim { #define CAM_SIM_ON_DONEQ 0x04 struct callout callout; struct cam_devq *devq; /* Device Queue to use for this SIM */ + int refcount; /* References to the SIM. */ /* "Pool" of inactive ccbs managed by xpt_alloc_ccb and xpt_free_ccb */ SLIST_HEAD(,ccb_hdr) ccb_freeq; Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:24:57 2009 (r189144) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:27:46 2009 (r189145) @@ -4304,6 +4304,7 @@ xpt_bus_register(struct cam_sim *sim, de TAILQ_INIT(&new_bus->et_entries); new_bus->path_id = sim->path_id; + cam_sim_hold(sim); new_bus->sim = sim; timevalclear(&new_bus->last_reset); new_bus->flags = 0; @@ -4846,6 +4847,7 @@ xpt_release_bus(struct cam_eb *bus) TAILQ_REMOVE(&xsoftc.xpt_busses, bus, links); xsoftc.bus_generation++; mtx_unlock(&xsoftc.xpt_topo_lock); + cam_sim_release(bus->sim); free(bus, M_CAMXPT); } } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:29:55 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B0A20106564A; Sat, 28 Feb 2009 10:29:55 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9E5DE8FC14; Sat, 28 Feb 2009 10:29:55 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SATtvF002709; Sat, 28 Feb 2009 10:29:55 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SATtIM002708; Sat, 28 Feb 2009 10:29:55 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281029.n1SATtIM002708@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:29:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189146 - in stable/7/sys: . cam contrib/pf dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:29:56 -0000 Author: trasz Date: Sat Feb 28 10:29:55 2009 New Revision: 189146 URL: http://svn.freebsd.org/changeset/base/189146 Log: MFC r186318: Move mtx_assert lower, when we can be sure that the pointer to the mutex is valid. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_periph.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_periph.c ============================================================================== --- stable/7/sys/cam/cam_periph.c Sat Feb 28 10:27:46 2009 (r189145) +++ stable/7/sys/cam/cam_periph.c Sat Feb 28 10:29:55 2009 (r189146) @@ -311,8 +311,6 @@ cam_periph_hold(struct cam_periph *perip struct mtx *mtx; int error; - mtx_assert(periph->sim->mtx, MA_OWNED); - /* * Increment the reference count on the peripheral * while we wait for our lock attempt to succeed @@ -324,6 +322,7 @@ cam_periph_hold(struct cam_periph *perip return (ENXIO); mtx = periph->sim->mtx; + mtx_assert(mtx, MA_OWNED); if (mtx == &Giant) mtx = NULL; From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:33:00 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id AD1D7106566C; Sat, 28 Feb 2009 10:33:00 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9AC2D8FC08; Sat, 28 Feb 2009 10:33:00 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAX0Ft002815; Sat, 28 Feb 2009 10:33:00 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAX0Nx002810; Sat, 28 Feb 2009 10:33:00 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281033.n1SAX0Nx002810@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:33:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189147 - in stable/7/sys: . cam cam/scsi contrib/pf dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:33:01 -0000 Author: trasz Date: Sat Feb 28 10:33:00 2009 New Revision: 189147 URL: http://svn.freebsd.org/changeset/base/189147 Log: MFC r186319: Periph driver fixes, second try. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_periph.c stable/7/sys/cam/cam_periph.h stable/7/sys/cam/cam_xpt.c stable/7/sys/cam/scsi/scsi_da.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_periph.c ============================================================================== --- stable/7/sys/cam/cam_periph.c Sat Feb 28 10:29:55 2009 (r189146) +++ stable/7/sys/cam/cam_periph.c Sat Feb 28 10:33:00 2009 (r189147) @@ -290,7 +290,7 @@ cam_periph_acquire(struct cam_periph *pe } void -cam_periph_release(struct cam_periph *periph) +cam_periph_release_locked(struct cam_periph *periph) { if (periph == NULL) @@ -302,7 +302,21 @@ cam_periph_release(struct cam_periph *pe camperiphfree(periph); } xpt_unlock_buses(); +} + +void +cam_periph_release(struct cam_periph *periph) +{ + struct cam_sim *sim; + if (periph == NULL) + return; + + sim = periph->sim; + mtx_assert(sim->mtx, MA_NOTOWNED); + mtx_lock(sim->mtx); + cam_periph_release_locked(periph); + mtx_unlock(sim->mtx); } int @@ -329,7 +343,7 @@ cam_periph_hold(struct cam_periph *perip while ((periph->flags & CAM_PERIPH_LOCKED) != 0) { periph->flags |= CAM_PERIPH_LOCK_WANTED; if ((error = msleep(periph, mtx, priority, "caplck", 0)) != 0) { - cam_periph_release(periph); + cam_periph_release_locked(periph); return (error); } } @@ -350,7 +364,7 @@ cam_periph_unhold(struct cam_periph *per wakeup(periph); } - cam_periph_release(periph); + cam_periph_release_locked(periph); } /* Modified: stable/7/sys/cam/cam_periph.h ============================================================================== --- stable/7/sys/cam/cam_periph.h Sat Feb 28 10:29:55 2009 (r189146) +++ stable/7/sys/cam/cam_periph.h Sat Feb 28 10:33:00 2009 (r189147) @@ -141,6 +141,7 @@ cam_status cam_periph_alloc(periph_ctor_ struct cam_periph *cam_periph_find(struct cam_path *path, char *name); cam_status cam_periph_acquire(struct cam_periph *periph); void cam_periph_release(struct cam_periph *periph); +void cam_periph_release_locked(struct cam_periph *periph); int cam_periph_hold(struct cam_periph *periph, int priority); void cam_periph_unhold(struct cam_periph *periph); void cam_periph_invalidate(struct cam_periph *periph); Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:29:55 2009 (r189146) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:33:00 2009 (r189147) @@ -6314,7 +6314,7 @@ probedone(struct cam_periph *periph, uni xpt_done(done_ccb); if (TAILQ_FIRST(&softc->request_ccbs) == NULL) { cam_periph_invalidate(periph); - cam_periph_release(periph); + cam_periph_release_locked(periph); } else { probeschedule(periph); } Modified: stable/7/sys/cam/scsi/scsi_da.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_da.c Sat Feb 28 10:29:55 2009 (r189146) +++ stable/7/sys/cam/scsi/scsi_da.c Sat Feb 28 10:33:00 2009 (r189147) @@ -771,8 +771,8 @@ daclose(struct disk *dp) softc->flags &= ~DA_FLAG_OPEN; cam_periph_unhold(periph); - cam_periph_release(periph); cam_periph_unlock(periph); + cam_periph_release(periph); return (0); } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:35:30 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BC1E41065676; Sat, 28 Feb 2009 10:35:30 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A9F688FC1A; Sat, 28 Feb 2009 10:35:30 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAZUe4004972; Sat, 28 Feb 2009 10:35:30 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAZU4T004960; Sat, 28 Feb 2009 10:35:30 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281035.n1SAZU4T004960@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:35:30 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189148 - in stable/7/sys: . cam contrib/pf dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:35:31 -0000 Author: trasz Date: Sat Feb 28 10:35:30 2009 New Revision: 189148 URL: http://svn.freebsd.org/changeset/base/189148 Log: MFC r186320: Fix cam_sim_free() wakeup condition and add mtx_asserts. Submitted by: Christoph Mallon Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_sim.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_sim.c ============================================================================== --- stable/7/sys/cam/cam_sim.c Sat Feb 28 10:33:00 2009 (r189147) +++ stable/7/sys/cam/cam_sim.c Sat Feb 28 10:35:30 2009 (r189148) @@ -123,9 +123,10 @@ void cam_sim_release(struct cam_sim *sim) { KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); + mtx_assert(sim->mtx, MA_OWNED); sim->refcount--; - if (sim->refcount <= 1) + if (sim->refcount == 0) wakeup(sim); } @@ -133,6 +134,7 @@ void cam_sim_hold(struct cam_sim *sim) { KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); + mtx_assert(sim->mtx, MA_OWNED); sim->refcount++; } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:38:32 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C4972106566B; Sat, 28 Feb 2009 10:38:32 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B1C748FC13; Sat, 28 Feb 2009 10:38:32 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAcWbj005998; Sat, 28 Feb 2009 10:38:32 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAcWkq005995; Sat, 28 Feb 2009 10:38:32 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281038.n1SAcWkq005995@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:38:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189149 - in stable/7/sys: . cam contrib/pf dev/ata dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:38:33 -0000 Author: trasz Date: Sat Feb 28 10:38:32 2009 New Revision: 189149 URL: http://svn.freebsd.org/changeset/base/189149 Log: MFC r186905: Make "kldunload atapicam" return EBUSY instead of deadlocking when a device created by atapicam is being kept opened or mounted. This is probably just a temporary solution until we invent something better. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Reported by: Jaakko Heinonen Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/cam/cam_xpt_sim.h stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ata/atapi-cam.c stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:35:30 2009 (r189148) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:38:32 2009 (r189149) @@ -2642,6 +2642,39 @@ xptbustraverse(struct cam_eb *start_bus, return(retval); } +int +xpt_sim_opened(struct cam_sim *sim) +{ + struct cam_eb *bus; + struct cam_et *target; + struct cam_ed *device; + struct cam_periph *periph; + + KASSERT(sim->refcount >= 1, ("sim->refcount >= 1")); + mtx_assert(sim->mtx, MA_OWNED); + + mtx_lock(&xsoftc.xpt_topo_lock); + TAILQ_FOREACH(bus, &xsoftc.xpt_busses, links) { + if (bus->sim != sim) + continue; + + TAILQ_FOREACH(target, &bus->et_entries, links) { + TAILQ_FOREACH(device, &target->ed_entries, links) { + SLIST_FOREACH(periph, &device->periphs, + periph_links) { + if (periph->refcount > 0) { + mtx_unlock(&xsoftc.xpt_topo_lock); + return (1); + } + } + } + } + } + + mtx_unlock(&xsoftc.xpt_topo_lock); + return (0); +} + static int xpttargettraverse(struct cam_eb *bus, struct cam_et *start_target, xpt_targetfunc_t *tr_func, void *arg) @@ -4277,7 +4310,7 @@ xpt_release_ccb(union ccb *free_ccb) * for this new bus and places it in the array of busses and assigns * it a path_id. The path_id may be influenced by "hard wiring" * information specified by the user. Once interrupt services are - * availible, the bus will be probed. + * available, the bus will be probed. */ int32_t xpt_bus_register(struct cam_sim *sim, device_t parent, u_int32_t bus) Modified: stable/7/sys/cam/cam_xpt_sim.h ============================================================================== --- stable/7/sys/cam/cam_xpt_sim.h Sat Feb 28 10:35:30 2009 (r189148) +++ stable/7/sys/cam/cam_xpt_sim.h Sat Feb 28 10:38:32 2009 (r189149) @@ -45,6 +45,7 @@ void xpt_release_simq(struct cam_sim *s u_int32_t xpt_freeze_devq(struct cam_path *path, u_int count); void xpt_release_devq(struct cam_path *path, u_int count, int run_queue); +int xpt_sim_opened(struct cam_sim *sim); void xpt_done(union ccb *done_ccb); #endif Modified: stable/7/sys/dev/ata/atapi-cam.c ============================================================================== --- stable/7/sys/dev/ata/atapi-cam.c Sat Feb 28 10:35:30 2009 (r189148) +++ stable/7/sys/dev/ata/atapi-cam.c Sat Feb 28 10:38:32 2009 (r189149) @@ -254,6 +254,10 @@ atapi_cam_detach(device_t dev) struct atapi_xpt_softc *scp = device_get_softc(dev); mtx_lock(&scp->state_lock); + if (xpt_sim_opened(scp->sim)) { + mtx_unlock(&scp->state_lock); + return (EBUSY); + } xpt_freeze_simq(scp->sim, 1 /*count*/); scp->flags |= DETACHING; mtx_unlock(&scp->state_lock); From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:40:53 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 71A8110656C9; Sat, 28 Feb 2009 10:40:53 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5EB748FC08; Sat, 28 Feb 2009 10:40:53 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAeruj006145; Sat, 28 Feb 2009 10:40:53 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAer4K006139; Sat, 28 Feb 2009 10:40:53 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281040.n1SAer4K006139@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:40:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189151 - in stable/7/sys: . cam/scsi contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:40:54 -0000 Author: trasz Date: Sat Feb 28 10:40:52 2009 New Revision: 189151 URL: http://svn.freebsd.org/changeset/base/189151 Log: MFC r187028: Don't call destroy_dev(9) with a mutex held. While here, shuffle things around so the periph destructors look alike. Based on a patch by Jaakko Heinonen. Submitted by: Jaakko Heinonen Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/scsi/scsi_ch.c stable/7/sys/cam/scsi/scsi_pass.c stable/7/sys/cam/scsi/scsi_pt.c stable/7/sys/cam/scsi/scsi_sa.c stable/7/sys/cam/scsi/scsi_ses.c stable/7/sys/cam/scsi/scsi_sg.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/scsi/scsi_ch.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_ch.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_ch.c Sat Feb 28 10:40:52 2009 (r189151) @@ -262,9 +262,11 @@ chcleanup(struct cam_periph *periph) softc = (struct ch_softc *)periph->softc; + xpt_print(periph->path, "removing device entry\n"); devstat_remove_entry(softc->device_stats); + cam_periph_unlock(periph); destroy_dev(softc->dev); - xpt_print(periph->path, "removing device entry\n"); + cam_periph_lock(periph); free(softc, M_DEVBUF); } Modified: stable/7/sys/cam/scsi/scsi_pass.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_pass.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_pass.c Sat Feb 28 10:40:52 2009 (r189151) @@ -165,13 +165,12 @@ passcleanup(struct cam_periph *periph) softc = (struct pass_softc *)periph->softc; + if (bootverbose) + xpt_print(periph->path, "removing device entry\n"); devstat_remove_entry(softc->device_stats); - + cam_periph_unlock(periph); destroy_dev(softc->dev); - - if (bootverbose) { - xpt_print(periph->path, "removing device entry\n"); - } + cam_periph_lock(periph); free(softc, M_DEVBUF); } Modified: stable/7/sys/cam/scsi/scsi_pt.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_pt.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_pt.c Sat Feb 28 10:40:52 2009 (r189151) @@ -342,11 +342,11 @@ ptdtor(struct cam_periph *periph) softc = (struct pt_softc *)periph->softc; + xpt_print(periph->path, "removing device entry\n"); devstat_remove_entry(softc->device_stats); - + cam_periph_unlock(periph); destroy_dev(softc->dev); - - xpt_print(periph->path, "removing device entry\n"); + cam_periph_lock(periph); free(softc, M_DEVBUF); } Modified: stable/7/sys/cam/scsi/scsi_sa.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_sa.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_sa.c Sat Feb 28 10:40:52 2009 (r189151) @@ -1377,17 +1377,16 @@ sacleanup(struct cam_periph *periph) softc = (struct sa_softc *)periph->softc; + xpt_print(periph->path, "removing device entry\n"); devstat_remove_entry(softc->device_stats); - + cam_periph_unlock(periph); destroy_dev(softc->devs.ctl_dev); - for (i = 0; i < SA_NUM_MODES; i++) { destroy_dev(softc->devs.mode_devs[i].r_dev); destroy_dev(softc->devs.mode_devs[i].nr_dev); destroy_dev(softc->devs.mode_devs[i].er_dev); } - - xpt_print(periph->path, "removing device entry\n"); + cam_periph_lock(periph); free(softc, M_SCSISA); } Modified: stable/7/sys/cam/scsi/scsi_ses.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_ses.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_ses.c Sat Feb 28 10:40:52 2009 (r189151) @@ -227,9 +227,10 @@ sescleanup(struct cam_periph *periph) softc = (struct ses_softc *)periph->softc; - destroy_dev(softc->ses_dev); - xpt_print(periph->path, "removing device entry\n"); + cam_periph_unlock(periph); + destroy_dev(softc->ses_dev); + cam_periph_lock(periph); free(softc, M_SCSISES); } Modified: stable/7/sys/cam/scsi/scsi_sg.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_sg.c Sat Feb 28 10:40:37 2009 (r189150) +++ stable/7/sys/cam/scsi/scsi_sg.c Sat Feb 28 10:40:52 2009 (r189151) @@ -200,11 +200,12 @@ sgcleanup(struct cam_periph *periph) struct sg_softc *softc; softc = (struct sg_softc *)periph->softc; + if (bootverbose) + xpt_print(periph->path, "removing device entry\n"); devstat_remove_entry(softc->device_stats); + cam_periph_unlock(periph); destroy_dev(softc->dev); - if (bootverbose) { - xpt_print(periph->path, "removing device entry\n"); - } + cam_periph_lock(periph); free(softc, M_DEVBUF); } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:43:11 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 26E4A1065673; Sat, 28 Feb 2009 10:43:11 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 143F58FC15; Sat, 28 Feb 2009 10:43:11 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAhAjN006232; Sat, 28 Feb 2009 10:43:10 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAhA0D006231; Sat, 28 Feb 2009 10:43:10 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281043.n1SAhA0D006231@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:43:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189152 - in stable/7/sys: . cam/scsi contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:43:11 -0000 Author: trasz Date: Sat Feb 28 10:43:10 2009 New Revision: 189152 URL: http://svn.freebsd.org/changeset/base/189152 Log: MFC r187243: Add missing 'break' statement. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 3927 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/scsi/scsi_all.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/scsi/scsi_all.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_all.c Sat Feb 28 10:40:52 2009 (r189151) +++ stable/7/sys/cam/scsi/scsi_all.c Sat Feb 28 10:43:10 2009 (r189152) @@ -2263,6 +2263,7 @@ scsi_print_inquiry(struct scsi_inquiry_d break; case T_NODEVICE: dtype = "Uninstalled"; + break; default: dtype = "unknown"; break; From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:45:32 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 42DA81065672; Sat, 28 Feb 2009 10:45:32 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 30AF78FC1D; Sat, 28 Feb 2009 10:45:32 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAjWqX006389; Sat, 28 Feb 2009 10:45:32 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAjW8R006388; Sat, 28 Feb 2009 10:45:32 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281045.n1SAjW8R006388@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:45:32 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189154 - in stable/7/sys: . cam/scsi contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:45:32 -0000 Author: trasz Date: Sat Feb 28 10:45:31 2009 New Revision: 189154 URL: http://svn.freebsd.org/changeset/base/189154 Log: MFC r187244: Remove unused variable. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 3665 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/scsi/scsi_da.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/scsi/scsi_da.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_da.c Sat Feb 28 10:44:39 2009 (r189153) +++ stable/7/sys/cam/scsi/scsi_da.c Sat Feb 28 10:45:31 2009 (r189154) @@ -1012,7 +1012,6 @@ daasync(void *callback_arg, u_int32_t co case AC_FOUND_DEVICE: { struct ccb_getdev *cgd; - struct cam_sim *sim; cam_status status; cgd = (struct ccb_getdev *)arg; @@ -1029,7 +1028,6 @@ daasync(void *callback_arg, u_int32_t co * this device and start the probe * process. */ - sim = xpt_path_sim(cgd->ccb_h.path); status = cam_periph_alloc(daregister, daoninvalidate, dacleanup, dastart, "da", CAM_PERIPH_BIO, From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:48:11 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 791131065672; Sat, 28 Feb 2009 10:48:11 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 671498FC14; Sat, 28 Feb 2009 10:48:11 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAmB8t006498; Sat, 28 Feb 2009 10:48:11 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAmBA8006497; Sat, 28 Feb 2009 10:48:11 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281048.n1SAmBA8006497@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:48:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189155 - in stable/7/sys: . cam contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:48:15 -0000 Author: trasz Date: Sat Feb 28 10:48:11 2009 New Revision: 189155 URL: http://svn.freebsd.org/changeset/base/189155 Log: MFC r187245: Fix use after free. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 3712 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:45:31 2009 (r189154) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:48:11 2009 (r189155) @@ -6137,7 +6137,7 @@ probedone(struct cam_periph *periph, uni } xpt_release_ccb(done_ccb); softc->action = PROBE_TUR_FOR_NEGOTIATION; - xpt_schedule(periph, done_ccb->ccb_h.pinfo.priority); + xpt_schedule(periph, priority); return; } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:50:59 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B5CBC106564A; Sat, 28 Feb 2009 10:50:59 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A31AF8FC15; Sat, 28 Feb 2009 10:50:59 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAoxKp006645; Sat, 28 Feb 2009 10:50:59 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAoxNt006644; Sat, 28 Feb 2009 10:50:59 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281050.n1SAoxNt006644@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:50:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189156 - in stable/7/sys: . cam/scsi contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:51:00 -0000 Author: trasz Date: Sat Feb 28 10:50:59 2009 New Revision: 189156 URL: http://svn.freebsd.org/changeset/base/189156 Log: MFC r187247. Add missing 'break' statement. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 3667 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/scsi/scsi_sg.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/scsi/scsi_sg.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_sg.c Sat Feb 28 10:48:11 2009 (r189155) +++ stable/7/sys/cam/scsi/scsi_sg.c Sat Feb 28 10:50:59 2009 (r189156) @@ -941,6 +941,7 @@ sg_scsiio_status(struct ccb_scsiio *csio case CAM_DEV_NOT_THERE: *hoststat = DID_BAD_TARGET; *drvstat = 0; + break; case CAM_SEL_TIMEOUT: *hoststat = DID_NO_CONNECT; *drvstat = 0; From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:53:20 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BCCF41065670; Sat, 28 Feb 2009 10:53:20 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id AA80E8FC16; Sat, 28 Feb 2009 10:53:20 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SArK9A006755; Sat, 28 Feb 2009 10:53:20 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SArKi5006754; Sat, 28 Feb 2009 10:53:20 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281053.n1SArKi5006754@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:53:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189157 - in stable/7/sys: . cam contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:53:21 -0000 Author: trasz Date: Sat Feb 28 10:53:20 2009 New Revision: 189157 URL: http://svn.freebsd.org/changeset/base/189157 Log: MFC r187649: Guard against NULL pointer dereference. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 130 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_periph.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_periph.c ============================================================================== --- stable/7/sys/cam/cam_periph.c Sat Feb 28 10:50:59 2009 (r189156) +++ stable/7/sys/cam/cam_periph.c Sat Feb 28 10:53:20 2009 (r189157) @@ -171,6 +171,10 @@ cam_periph_alloc(periph_ctor_t *periph_c break; } xpt_unlock_buses(); + if (p_drv == NULL) { + printf("cam_periph_alloc: invalid periph name '%s'\n", name); + return (CAM_REQ_INVALID); + } sim = xpt_path_sim(path); path_id = xpt_path_path_id(path); From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 10:59:49 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 19ECC1065673; Sat, 28 Feb 2009 10:59:49 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 074AB8FC12; Sat, 28 Feb 2009 10:59:49 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SAxm90006937; Sat, 28 Feb 2009 10:59:48 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SAxmV6006936; Sat, 28 Feb 2009 10:59:48 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281059.n1SAxmV6006936@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 10:59:48 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189158 - in stable/7/sys: . cam contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 10:59:49 -0000 Author: trasz Date: Sat Feb 28 10:59:48 2009 New Revision: 189158 URL: http://svn.freebsd.org/changeset/base/189158 Log: MFC r187650: Guard against NULL pointer dereference. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 1847 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:53:20 2009 (r189157) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 10:59:48 2009 (r189158) @@ -4177,7 +4177,10 @@ xpt_path_string(struct cam_path *path, c { struct sbuf sb; - mtx_assert(path->bus->sim->mtx, MA_OWNED); +#ifdef INVARIANTS + if (path != NULL && path->bus != NULL && path->bus->sim != NULL) + mtx_assert(path->bus->sim->mtx, MA_OWNED); +#endif sbuf_new(&sb, str, str_len, 0); From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:03:24 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 68A65106564A; Sat, 28 Feb 2009 11:03:24 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 562FC8FC18; Sat, 28 Feb 2009 11:03:24 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SB3O98007063; Sat, 28 Feb 2009 11:03:24 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SB3OxW007062; Sat, 28 Feb 2009 11:03:24 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281103.n1SB3OxW007062@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:03:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189159 - in stable/7/sys: . cam/scsi contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:03:25 -0000 Author: trasz Date: Sat Feb 28 11:03:24 2009 New Revision: 189159 URL: http://svn.freebsd.org/changeset/base/189159 Log: MFC r187651: Don't leak memory when alloc fails. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Found with: Coverity Prevent(tm) CID: 2908 Modified: stable/7/sys/ (props changed) stable/7/sys/cam/scsi/scsi_low.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/scsi/scsi_low.c ============================================================================== --- stable/7/sys/cam/scsi/scsi_low.c Sat Feb 28 10:59:48 2009 (r189158) +++ stable/7/sys/cam/scsi/scsi_low.c Sat Feb 28 11:03:24 2009 (r189159) @@ -966,16 +966,16 @@ scsi_low_rescan_bus_cam(slp) struct scsi_low_softc *slp; { struct cam_path *path; - union ccb *ccb = xpt_alloc_ccb(); + union ccb *ccb; cam_status status; - bzero(ccb, sizeof(union ccb)); - status = xpt_create_path(&path, xpt_periph, cam_sim_path(slp->sl_si.sim), -1, 0); if (status != CAM_REQ_CMP) return; + ccb = xpt_alloc_ccb(); + bzero(ccb, sizeof(union ccb)); xpt_setup_ccb(&ccb->ccb_h, path, 5); ccb->ccb_h.func_code = XPT_SCAN_BUS; ccb->ccb_h.cbfcnp = scsi_low_cam_rescan_callback; From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:09:28 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 09783106564A; Sat, 28 Feb 2009 11:09:28 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E8CC58FC0C; Sat, 28 Feb 2009 11:09:27 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SB9RT6007215; Sat, 28 Feb 2009 11:09:27 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SB9RJH007214; Sat, 28 Feb 2009 11:09:27 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281109.n1SB9RJH007214@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:09:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189160 - in stable/7/sys: . cam contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:09:30 -0000 Author: trasz Date: Sat Feb 28 11:09:27 2009 New Revision: 189160 URL: http://svn.freebsd.org/changeset/base/189160 Log: MFC r187652: Protect against NULL pointer dereference. Reviewed by: scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 11:03:24 2009 (r189159) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 11:09:27 2009 (r189160) @@ -5194,6 +5194,11 @@ xpt_scan_bus(struct cam_periph *periph, /* Save some state for use while we probe for devices */ scan_info = (xpt_scan_bus_info *) malloc(sizeof(xpt_scan_bus_info), M_CAMXPT, M_NOWAIT); + if (scan_info == NULL) { + request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL; + xpt_done(request_ccb); + return; + } scan_info->request_ccb = request_ccb; scan_info->cpi = &work_ccb->cpi; From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:11:38 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CA888106566B; Sat, 28 Feb 2009 11:11:38 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B82EE8FC18; Sat, 28 Feb 2009 11:11:38 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SBBcHE007317; Sat, 28 Feb 2009 11:11:38 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SBBcQ6007316; Sat, 28 Feb 2009 11:11:38 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281111.n1SBBcQ6007316@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:11:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189161 - in stable/7/sys: . cam contrib/pf dev/ath/ath_hal dev/cxgb X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:11:39 -0000 Author: trasz Date: Sat Feb 28 11:11:38 2009 New Revision: 189161 URL: http://svn.freebsd.org/changeset/base/189161 Log: MFC r188345: Remove an overzealous check. Submitted by: das Reviewed by: scottl Approved by: rwatson (mentor, implicit) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/cam/cam_xpt.c stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/cam/cam_xpt.c ============================================================================== --- stable/7/sys/cam/cam_xpt.c Sat Feb 28 11:09:27 2009 (r189160) +++ stable/7/sys/cam/cam_xpt.c Sat Feb 28 11:11:38 2009 (r189161) @@ -4178,7 +4178,7 @@ xpt_path_string(struct cam_path *path, c struct sbuf sb; #ifdef INVARIANTS - if (path != NULL && path->bus != NULL && path->bus->sim != NULL) + if (path != NULL && path->bus != NULL) mtx_assert(path->bus->sim->mtx, MA_OWNED); #endif From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:16:58 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 378AB1065773; Sat, 28 Feb 2009 11:16:58 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0AD598FC08; Sat, 28 Feb 2009 11:16:58 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SBGvBB007450; Sat, 28 Feb 2009 11:16:57 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SBGvpj007449; Sat, 28 Feb 2009 11:16:57 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281116.n1SBGvpj007449@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:16:57 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189162 - in stable/7/sys: . contrib/pf dev/cxgb geom X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:16:59 -0000 Author: trasz Date: Sat Feb 28 11:16:57 2009 New Revision: 189162 URL: http://svn.freebsd.org/changeset/base/189162 Log: MFC r186188: Implement g_vfs_orphan(). Without it, the filesystem never closes the device, which means refcount on periph drivers never drops, which means cam_sim_free() never returns, which results in umass sleeping there ad infinitum. Submitted by: pjd Reviewed by: scottl, pjd Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/geom/geom_vfs.c Modified: stable/7/sys/geom/geom_vfs.c ============================================================================== --- stable/7/sys/geom/geom_vfs.c Sat Feb 28 11:11:38 2009 (r189161) +++ stable/7/sys/geom/geom_vfs.c Sat Feb 28 11:16:57 2009 (r189162) @@ -93,10 +93,23 @@ g_vfs_strategy(struct bufobj *bo, struct { struct g_consumer *cp; struct bio *bip; + int vfslocked; cp = bo->bo_private; G_VALID_CONSUMER(cp); + /* + * If the the provider has orphaned us, just return EXIO. + */ + if (cp->provider == NULL) { + bp->b_error = ENXIO; + bp->b_ioflags |= BIO_ERROR; + vfslocked = VFS_LOCK_GIANT(((struct mount *)NULL)); + bufdone(bp); + VFS_UNLOCK_GIANT(vfslocked); + return; + } + bip = g_alloc_bio(); bip->bio_cmd = bp->b_iocmd; bip->bio_offset = bp->b_iooffset; @@ -110,18 +123,20 @@ g_vfs_strategy(struct bufobj *bo, struct static void g_vfs_orphan(struct g_consumer *cp) { + struct g_geom *gp; + struct bufobj *bo; + + g_topology_assert(); + + gp = cp->geom; + bo = gp->softc; + g_trace(G_T_TOPOLOGY, "g_vfs_orphan(%p(%s))", cp, gp->name); + if (cp->acr > 0 || cp->acw > 0 || cp->ace > 0) + g_access(cp, -cp->acr, -cp->acw, -cp->ace); + g_detach(cp); /* - * Don't do anything here yet. - * - * Ideally we should detach the consumer already now, but that - * leads to a locking requirement in the I/O path to see if we have - * a consumer or not. Considering how ugly things are going to get - * anyway as none of our filesystems are graceful about i/o errors, - * this is not important right now. - * - * Down the road, this is the place where we could give the user - * a "Abort, Retry or Ignore" option to replace the media again. + * Do not destroy the geom. Filesystem will do this during unmount. */ } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:19:03 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EE5E51065675; Sat, 28 Feb 2009 11:19:02 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id DBA638FC14; Sat, 28 Feb 2009 11:19:02 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SBJ2RU007530; Sat, 28 Feb 2009 11:19:02 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SBJ2wU007529; Sat, 28 Feb 2009 11:19:02 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281119.n1SBJ2wU007529@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:19:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189163 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb geom X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:19:05 -0000 Author: trasz Date: Sat Feb 28 11:19:02 2009 New Revision: 189163 URL: http://svn.freebsd.org/changeset/base/189163 Log: MFC r187053: Prevent a panic that happens on SMP machines when removing a disk with many writes queued up. Reviewed by: phk, scottl Approved by: rwatson (mentor) Sponsored by: FreeBSD Foundation Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/geom/geom_vfs.c Modified: stable/7/sys/geom/geom_vfs.c ============================================================================== --- stable/7/sys/geom/geom_vfs.c Sat Feb 28 11:16:57 2009 (r189162) +++ stable/7/sys/geom/geom_vfs.c Sat Feb 28 11:19:02 2009 (r189163) @@ -71,6 +71,16 @@ g_vfs_done(struct bio *bip) struct buf *bp; int vfslocked; + /* + * Provider ('bio_to') could have withered away sometime + * between incrementing the 'nend' in g_io_deliver() and now, + * making 'bio_to' a dangling pointer. We cannot do that + * in g_wither_geom(), as it would require going over + * the 'g_bio_run_up' list, resetting the pointer. + */ + if (bip->bio_from->provider == NULL) + bip->bio_to = NULL; + if (bip->bio_error) { printf("g_vfs_done():"); g_print_bio(bip); @@ -136,7 +146,7 @@ g_vfs_orphan(struct g_consumer *cp) g_detach(cp); /* - * Do not destroy the geom. Filesystem will do this during unmount. + * Do not destroy the geom. Filesystem will do that during unmount. */ } From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:20:37 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D54E8106564A; Sat, 28 Feb 2009 11:20:37 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C36BA8FC18; Sat, 28 Feb 2009 11:20:37 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SBKb3d007612; Sat, 28 Feb 2009 11:20:37 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SBKbJU007611; Sat, 28 Feb 2009 11:20:37 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281120.n1SBKbJU007611@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:20:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189164 - stable/7/share/man/man4 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:20:39 -0000 Author: trasz Date: Sat Feb 28 11:20:37 2009 New Revision: 189164 URL: http://svn.freebsd.org/changeset/base/189164 Log: MFC r188916: Fix a typo and add manpage links to geom(4). Approved by: rwatson (mentor) Modified: stable/7/share/man/man4/ (props changed) stable/7/share/man/man4/geom.4 stable/7/share/man/man4/igb.4 (props changed) Modified: stable/7/share/man/man4/geom.4 ============================================================================== --- stable/7/share/man/man4/geom.4 Sat Feb 28 11:19:02 2009 (r189163) +++ stable/7/share/man/man4/geom.4 Sat Feb 28 11:20:37 2009 (r189164) @@ -249,7 +249,7 @@ It will explicitly close (i.e.: zero the which will propagate all the way down through the mesh. It will then detach and destroy its geom. .It -The geom whose provider is now attached will destroy the provider, +The geom whose provider is now detached will destroy the provider, detach and destroy its consumer and destroy its geom. .It This process percolates all the way down through the mesh, until @@ -431,6 +431,18 @@ This is unused at this time. .It 0x80 Pq Dv G_F_CTLDUMP Dump contents of gctl requests. .El +.Sh SEE ALSO +.Xr disk 9 , +.Xr DECLARE_GEOM_CLASS 9 , +.Xr g_access 9 , +.Xr g_attach 9 , +.Xr g_bio 9 , +.Xr g_consumer 9 , +.Xr g_data 9 , +.Xr g_event 9 , +.Xr g_geom 9 , +.Xr g_provider 9 , +.Xr g_provider_by_name 9 .Sh HISTORY This software was developed for the .Fx From owner-svn-src-stable@FreeBSD.ORG Sat Feb 28 11:22:09 2009 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E05C210656BC; Sat, 28 Feb 2009 11:22:09 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CD7FE8FC14; Sat, 28 Feb 2009 11:22:09 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1SBM9uQ007702; Sat, 28 Feb 2009 11:22:09 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1SBM97B007700; Sat, 28 Feb 2009 11:22:09 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <200902281122.n1SBM97B007700@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 28 Feb 2009 11:22:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org X-SVN-Group: stable-7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189165 - stable/7/share/man/man9 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Feb 2009 11:22:11 -0000 Author: trasz Date: Sat Feb 28 11:22:09 2009 New Revision: 189165 URL: http://svn.freebsd.org/changeset/base/189165 Log: MFC r188917: Mention disk_gone() in disk(9). Approved by: rwatson (mentor) Modified: stable/7/share/man/man9/ (props changed) stable/7/share/man/man9/Makefile stable/7/share/man/man9/disk.9 Modified: stable/7/share/man/man9/Makefile ============================================================================== --- stable/7/share/man/man9/Makefile Sat Feb 28 11:20:37 2009 (r189164) +++ stable/7/share/man/man9/Makefile Sat Feb 28 11:22:09 2009 (r189165) @@ -559,7 +559,9 @@ MLINKS+=devstat.9 devicestat.9 \ devstat.9 devstat_end_transaction.9 \ devstat.9 devstat_remove_entry.9 \ devstat.9 devstat_start_transaction.9 -MLINKS+=disk.9 disk_create.9 \ +MLINKS+=disk.9 disk_alloc.9 \ + disk.9 disk_create.9 \ + disk.9 disk_gone.9 \ disk.9 disk_destroy.9 MLINKS+=domain.9 DOMAIN_SET.9 \ domain.9 net_add_domain.9 \ Modified: stable/7/share/man/man9/disk.9 ============================================================================== --- stable/7/share/man/man9/disk.9 Sat Feb 28 11:20:37 2009 (r189164) +++ stable/7/share/man/man9/disk.9 Sat Feb 28 11:22:09 2009 (r189165) @@ -40,6 +40,8 @@ .Ft void .Fn disk_create "struct disk *disk" "int version" .Ft void +.Fn disk_gone "struct disk *disk" +.Ft void .Fn disk_destroy "struct disk *disk" .Sh DESCRIPTION The disk storage API permits kernel device drivers providing access to @@ -65,6 +67,11 @@ function, fill in the fields and call .Fn disk_create when the device is ready to service requests. +.Fn disk_gone +orphans all of the providers associated with the drive, setting an error +condition of ENXIO in each one. +In addition, it prevents a re-taste on last close for writing if an error +condition has been set in the provider. After calling .Fn disk_destroy , the device driver is not allowed to access the contents of