From owner-svn-src-user@FreeBSD.ORG Sun Jul 5 01:36:24 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D99FC1065673; Sun, 5 Jul 2009 01:36:24 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C85298FC0C; Sun, 5 Jul 2009 01:36:24 +0000 (UTC) (envelope-from kmacy@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 n651aOCS029253; Sun, 5 Jul 2009 01:36:24 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n651aOU2029251; Sun, 5 Jul 2009 01:36:24 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907050136.n651aOU2029251@svn.freebsd.org> From: Kip Macy Date: Sun, 5 Jul 2009 01:36:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195345 - user/kmacy/releng_7_2_fcs/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 05 Jul 2009 01:36:25 -0000 Author: kmacy Date: Sun Jul 5 01:36:24 2009 New Revision: 195345 URL: http://svn.freebsd.org/changeset/base/195345 Log: set m to NULL so that we don't try to unlock if m doesn't get set Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Sat Jul 4 16:21:44 2009 (r195344) +++ user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c Sun Jul 5 01:36:24 2009 (r195345) @@ -2519,7 +2519,7 @@ static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, vm_page_t *free) { pt_entry_t *pte; - vm_page_t m; + vm_page_t m = NULL; PMAP_LOCK_ASSERT(pmap, MA_OWNED); if ((*pde & PG_V) == 0) From owner-svn-src-user@FreeBSD.ORG Thu Jul 9 00:39:56 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9B3F81065670; Thu, 9 Jul 2009 00:39:56 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 899658FC1C; Thu, 9 Jul 2009 00:39:56 +0000 (UTC) (envelope-from kmacy@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 n690duXP066901; Thu, 9 Jul 2009 00:39:56 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n690duOi066899; Thu, 9 Jul 2009 00:39:56 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907090039.n690duOi066899@svn.freebsd.org> From: Kip Macy Date: Thu, 9 Jul 2009 00:39:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195483 - user/kmacy/releng_7_2_fcs/sys/boot/i386 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Jul 2009 00:39:56 -0000 Author: kmacy Date: Thu Jul 9 00:39:56 2009 New Revision: 195483 URL: http://svn.freebsd.org/changeset/base/195483 Log: comment out zfsboot build until btxld issue is resolved Modified: user/kmacy/releng_7_2_fcs/sys/boot/i386/Makefile Modified: user/kmacy/releng_7_2_fcs/sys/boot/i386/Makefile ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/boot/i386/Makefile Thu Jul 9 00:04:24 2009 (r195482) +++ user/kmacy/releng_7_2_fcs/sys/boot/i386/Makefile Thu Jul 9 00:39:56 2009 (r195483) @@ -1,8 +1,10 @@ # $FreeBSD$ -SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot zfsboot \ +SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot \ kgzldr libi386 libfirewire loader +# SUBDIR+= zfsboot + # special boot programs, 'self-extracting boot2+loader' SUBDIR+= pxeldr From owner-svn-src-user@FreeBSD.ORG Thu Jul 9 15:41:17 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A485E10656A7; Thu, 9 Jul 2009 15:41:17 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 93D618FC08; Thu, 9 Jul 2009 15:41:17 +0000 (UTC) (envelope-from des@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 n69FfHFi089548; Thu, 9 Jul 2009 15:41:17 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n69FfHLL089546; Thu, 9 Jul 2009 15:41:17 GMT (envelope-from des@svn.freebsd.org) Message-Id: <200907091541.n69FfHLL089546@svn.freebsd.org> From: Dag-Erling Smorgrav Date: Thu, 9 Jul 2009 15:41:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195500 - user/des/sizes X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Jul 2009 15:41:17 -0000 Author: des Date: Thu Jul 9 15:41:17 2009 New Revision: 195500 URL: http://svn.freebsd.org/changeset/base/195500 Log: I've been using this for a long time to check the size and alignment of various standard types (both C and POSIX). Added: user/des/sizes/ user/des/sizes/Makefile (contents, props changed) user/des/sizes/sizes.c (contents, props changed) Added: user/des/sizes/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/des/sizes/Makefile Thu Jul 9 15:41:17 2009 (r195500) @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG = sizes +WARNS ?= 6 +MAN = # none + +.include "../Makefile.inc" +.include Added: user/des/sizes/sizes.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/des/sizes/sizes.c Thu Jul 9 15:41:17 2009 (r195500) @@ -0,0 +1,118 @@ +/*- + * Copyright (c) 2009 Dag-Erling Coïdan Smørgrav + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +/* + * Determine and display the byte order, signedness of char, and size and + * alignment of various scalar types. Assumes two's complement and + * eight-bit bytes. + */ + +static void +assumptions(void) +{ + assert(CHAR_BIT == 8); + /* + * (unsigned char)-1 is + * 10000001 (0x81) on sign-and-magnitude + * 11111110 (0xfe) on one's complement + * 11111111 (0xff) on two's complement + */ + assert((unsigned char)-1 == 0xff); +} + +static void +byte_order(void) +{ + uint32_t e_int = 0x30303030 | 0x04030201; + const char *e_char = (const char *)&e_int; + printf("%-16s %.4s\n", "byte order", e_char); +} + +static void +signedness(void) +{ + unsigned char uc = 0x80; + char *c = (char *)&uc; + printf("%-16s %ssigned\n", "char is", (*c > 0) ? "un" : ""); +} + +typedef void *void_ptr; +typedef void (*func_ptr)(void); + +#define describe(type) \ + do { \ + struct s_##t { char bump; type t; }; \ + printf("%-12s %12zd %12zd\n", #type, \ + sizeof(type) * 8, \ + offsetof(struct s_##t, t) * 8); \ + } while (0) + +static void +sizes(void) +{ + printf("type size alignment\n"); + printf("--------------------------------------\n"); + describe(char); + describe(short); + describe(int); + describe(long); + describe(long long); + describe(float); + describe(double); + describe(long double); + describe(size_t); + describe(ptrdiff_t); + describe(off_t); + describe(time_t); + describe(void_ptr); + describe(func_ptr); + describe(wchar_t); + describe(sig_atomic_t); +} + +int +main(void) +{ + assumptions(); + byte_order(); + signedness(); + printf("\n"); + sizes(); + return (0); +} From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 19:31:05 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CE8E0106566C; Fri, 10 Jul 2009 19:31:05 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A39E48FC14; Fri, 10 Jul 2009 19:31:05 +0000 (UTC) (envelope-from kmacy@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 n6AJV558029969; Fri, 10 Jul 2009 19:31:05 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6AJV51L029968; Fri, 10 Jul 2009 19:31:05 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907101931.n6AJV51L029968@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 19:31:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195585 - user/kmacy/releng_7_2_fcs_1 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 19:31:06 -0000 Author: kmacy Date: Fri Jul 10 19:31:05 2009 New Revision: 195585 URL: http://svn.freebsd.org/changeset/base/195585 Log: create new fcs branch for further development work Added: user/kmacy/releng_7_2_fcs_1/ - copied from r195584, user/kmacy/releng_7_2_fcs/ From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 21:36:40 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id C3152106566B; Fri, 10 Jul 2009 21:36:40 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id A84BA8FC27; Fri, 10 Jul 2009 21:36:40 +0000 (UTC) (envelope-from kmacy@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 n6ALaeTp032807; Fri, 10 Jul 2009 21:36:40 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ALaeQN032802; Fri, 10 Jul 2009 21:36:40 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102136.n6ALaeQN032802@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 21:36:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195590 - in user/kmacy/releng_7_2_fcs_1/sys: sys vm X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 21:36:41 -0000 Author: kmacy Date: Fri Jul 10 21:36:40 2009 New Revision: 195590 URL: http://svn.freebsd.org/changeset/base/195590 Log: add *_NODUMP flags to uma and malloc to enable caller to specify excluding memory from the dump Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/malloc.h user/kmacy/releng_7_2_fcs_1/sys/vm/uma.h user/kmacy/releng_7_2_fcs_1/sys/vm/uma_core.c user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c Modified: user/kmacy/releng_7_2_fcs_1/sys/sys/malloc.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/sys/malloc.h Fri Jul 10 21:28:39 2009 (r195589) +++ user/kmacy/releng_7_2_fcs_1/sys/sys/malloc.h Fri Jul 10 21:36:40 2009 (r195590) @@ -50,6 +50,7 @@ #define M_ZERO 0x0100 /* bzero the allocation */ #define M_NOVM 0x0200 /* don't ask VM for pages */ #define M_USE_RESERVE 0x0400 /* can alloc out of reserve memory */ +#define M_NODUMP 0x0800 /* don't dump pages in this allocation */ #define M_MAGIC 877983977 /* time when first defined :-) */ Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/uma.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/uma.h Fri Jul 10 21:28:39 2009 (r195589) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/uma.h Fri Jul 10 21:36:40 2009 (r195590) @@ -246,6 +246,9 @@ int uma_zsecond_add(uma_zone_t zone, uma * backend pages and can fail early. */ #define UMA_ZONE_VTOSLAB 0x2000 /* Zone uses vtoslab for lookup. */ +#define UMA_ZONE_NODUMP 0x4000 /* Zone's pages will not be included in + * mini-dumps + */ /* * These flags are shared between the keg and zone. In zones wishing to add Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/uma_core.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/uma_core.c Fri Jul 10 21:28:39 2009 (r195589) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/uma_core.c Fri Jul 10 21:36:40 2009 (r195590) @@ -839,6 +839,9 @@ keg_alloc_slab(uma_keg_t keg, uma_zone_t else wait &= ~M_ZERO; + if (keg->uk_flags & UMA_ZONE_NODUMP) + wait |= M_NODUMP; + /* zone is passed for legacy reasons. */ mem = allocf(zone, keg->uk_ppera * UMA_SLAB_SIZE, &flags, wait); if (mem == NULL) { Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c Fri Jul 10 21:28:39 2009 (r195589) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c Fri Jul 10 21:36:40 2009 (r195590) @@ -84,6 +84,10 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef VM_MD_MINIDUMP +#include +#endif + vm_map_t kernel_map=0; vm_map_t kmem_map=0; vm_map_t exec_map=0; @@ -206,8 +210,15 @@ kmem_free(map, addr, size) vm_offset_t addr; vm_size_t size; { - - (void) vm_map_remove(map, trunc_page(addr), round_page(addr + size)); + vm_offset_t start = trunc_page(addr); + vm_offset_t end = round_page(addr + size); +#ifdef VM_MD_MINIDUMP + vm_offset_t temp = start; + + for (; temp < end; temp += PAGE_SIZE) + dump_add_page(pmap_kextract(temp)); +#endif + (void) vm_map_remove(map, start, end); } /* @@ -363,6 +374,10 @@ retry: } if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) pmap_zero_page(m); +#ifdef VM_MD_MINIDUMP + if (flags & M_NODUMP) + dump_drop_page(VM_PAGE_TO_PHYS(m)); +#endif m->valid = VM_PAGE_BITS_ALL; KASSERT((m->flags & PG_UNMANAGED) != 0, ("kmem_malloc: page %p is managed", m)); From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 21:38:06 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3A053106566B; Fri, 10 Jul 2009 21:38:06 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 28E128FC0A; Fri, 10 Jul 2009 21:38:06 +0000 (UTC) (envelope-from kmacy@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 n6ALc6wM032877; Fri, 10 Jul 2009 21:38:06 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ALc6wL032873; Fri, 10 Jul 2009 21:38:06 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102138.n6ALc6wL032873@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 21:38:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195591 - in user/kmacy/releng_7_2_fcs_1/sys/amd64: amd64 include X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 21:38:06 -0000 Author: kmacy Date: Fri Jul 10 21:38:05 2009 New Revision: 195591 URL: http://svn.freebsd.org/changeset/base/195591 Log: ignore kernel mapped pages that have the dump bit cleared Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 21:38:05 2009 (r195591) @@ -69,12 +69,18 @@ static size_t counter, progress; CTASSERT(sizeof(*vm_page_dump) == 8); static int -is_dumpable(vm_paddr_t pa) +is_dumpable(vm_paddr_t pa, int ignorebit) { - int i; + int i, idx, bit, isdata; + uint64_t pfn = pa; + + pfn >>= PAGE_SHIFT; + idx = pfn >> 6; /* 2^6 = 64 */ + bit = pfn & 63; + isdata = (ignorebit == TRUE) ? 1 : vm_page_dump[idx] & (1ul << bit); for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { - if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) + if (pa >= dump_avail[i] && pa < dump_avail[i + 1] && isdata) return (1); } return (0); @@ -195,7 +201,7 @@ minidumpsys(struct dumperinfo *di) int error; uint64_t bits; uint64_t *pdp, *pd, *pt, pa; - int i, j, k, bit; + int i, j, k, bit, pages_written; struct minidumphdr mdhdr; counter = 0; @@ -218,7 +224,7 @@ minidumpsys(struct dumperinfo *di) /* This is an entire 2M page. */ pa = pd[j] & PG_PS_FRAME; for (k = 0; k < NPTEPG; k++) { - if (is_dumpable(pa)) + if (is_dumpable(pa, TRUE)) dump_add_page(pa); pa += PAGE_SIZE; } @@ -230,7 +236,7 @@ minidumpsys(struct dumperinfo *di) for (k = 0; k < NPTEPG; k++) { if ((pt[k] & PG_V) == PG_V) { pa = pt[k] & PG_FRAME; - if (is_dumpable(pa)) + if (is_dumpable(pa, TRUE)) dump_add_page(pa); } } @@ -243,22 +249,26 @@ minidumpsys(struct dumperinfo *di) dumpsize = ptesize; dumpsize += round_page(msgbufp->msg_size); dumpsize += round_page(vm_page_dump_size); + printf("dumpsize: "); for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i]; while (bits) { bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; /* Clear out undumpable pages now if needed */ - if (is_dumpable(pa)) { + if (is_dumpable(pa, FALSE)) { dumpsize += PAGE_SIZE; } else { dump_drop_page(pa); } bits &= ~(1ul << bit); + if (dumpsize % (1<<29)) + printf("%dMB ", (dumpsize>>20)); } } dumpsize += PAGE_SIZE; + printf("\n"); /* Determine dump offset on device. */ if (di->mediasize < SIZEOF_METADATA + dumpsize + sizeof(kdh) * 2) { error = ENOSPC; @@ -307,6 +317,7 @@ minidumpsys(struct dumperinfo *di) if (error) goto fail; + printf("\nDump kernel page table pages\n"); /* Dump kernel page table pages */ pdp = (uint64_t *)PHYS_TO_DMAP(KPDPphys); for (va = VM_MIN_KERNEL_ADDRESS; va < MAX(KERNBASE + NKPT * NBPDR, @@ -360,18 +371,23 @@ minidumpsys(struct dumperinfo *di) /* Dump memory chunks */ /* XXX cluster it up and use blk_dump() */ - for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { + printf("\nclustering memory chunks\n"); + for (pages_written = i = 0; + i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i]; while (bits) { bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; + pages_written++; + if (pages_written && (pages_written % 1024) == 0) + printf("%dMB ", pages_written*PAGE_SIZE); error = blk_write(di, 0, pa, PAGE_SIZE); if (error) goto fail; bits &= ~(1ul << bit); } } - + printf("\n"); error = blk_flush(di); if (error) goto fail; @@ -382,6 +398,7 @@ minidumpsys(struct dumperinfo *di) goto fail; dumplo += sizeof(kdh); + printf("\nstarting dump\n"); /* Signal completion, signoff and exit stage left. */ dump_write(di, NULL, 0, 0, 0); printf("\nDump complete\n"); Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/uma_machdep.c Fri Jul 10 21:38:05 2009 (r195591) @@ -66,7 +66,8 @@ uma_small_alloc(uma_zone_t zone, int byt break; } pa = m->phys_addr; - dump_add_page(pa); + if ((wait & M_NODUMP) == 0) + dump_add_page(pa); va = (void *)PHYS_TO_DMAP(pa); if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0) pagezero(va); Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Fri Jul 10 21:36:40 2009 (r195590) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/include/vmparam.h Fri Jul 10 21:38:05 2009 (r195591) @@ -88,6 +88,11 @@ #define UMA_MD_SMALL_ALLOC /* + * We machine specific sparse kernel dump + */ +#define VM_MD_MINIDUMP + +/* * The physical address space is densely populated. */ #define VM_PHYSSEG_DENSE From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 21:42:38 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 726301065702; Fri, 10 Jul 2009 21:42:38 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 609428FC0C; Fri, 10 Jul 2009 21:42:38 +0000 (UTC) (envelope-from kmacy@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 n6ALgc3N033092; Fri, 10 Jul 2009 21:42:38 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ALgc1B033089; Fri, 10 Jul 2009 21:42:38 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102142.n6ALgc1B033089@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 21:42:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195594 - in user/kmacy/releng_7_2_fcs_1/sys/cddl: compat/opensolaris/sys contrib/opensolaris/uts/common/fs/zfs X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 21:42:38 -0000 Author: kmacy Date: Fri Jul 10 21:42:38 2009 New Revision: 195594 URL: http://svn.freebsd.org/changeset/base/195594 Log: exclude ZFS data buffers from kernel core dumps Modified: user/kmacy/releng_7_2_fcs_1/sys/cddl/compat/opensolaris/sys/kmem.h user/kmacy/releng_7_2_fcs_1/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Modified: user/kmacy/releng_7_2_fcs_1/sys/cddl/compat/opensolaris/sys/kmem.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/cddl/compat/opensolaris/sys/kmem.h Fri Jul 10 21:42:23 2009 (r195593) +++ user/kmacy/releng_7_2_fcs_1/sys/cddl/compat/opensolaris/sys/kmem.h Fri Jul 10 21:42:38 2009 (r195594) @@ -41,7 +41,8 @@ #define KM_PUSHPAGE M_WAITOK #define KM_NOSLEEP M_NOWAIT #define KM_ZERO M_ZERO -#define KMC_NODEBUG 0 +#define KMC_NODEBUG UMA_ZONE_NODUMP +#define KM_NODEBUG M_NODUMP typedef struct kmem_cache { char kc_name[32]; Modified: user/kmacy/releng_7_2_fcs_1/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Fri Jul 10 21:42:23 2009 (r195593) +++ user/kmacy/releng_7_2_fcs_1/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c Fri Jul 10 21:42:38 2009 (r195594) @@ -124,7 +124,7 @@ zio_init(void) char name[36]; (void) sprintf(name, "zio_buf_%lu", (ulong_t)size); zio_buf_cache[c] = kmem_cache_create(name, size, - align, NULL, NULL, NULL, NULL, NULL, KMC_NODEBUG); + align, NULL, NULL, NULL, NULL, NULL, 0); (void) sprintf(name, "zio_data_buf_%lu", (ulong_t)size); zio_data_buf_cache[c] = kmem_cache_create(name, size, @@ -217,7 +217,7 @@ zio_data_buf_alloc(size_t size) return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE)); #else - return (kmem_alloc(size, KM_SLEEP)); + return (kmem_alloc(size, KM_SLEEP|KM_NODEBUG)); #endif } From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 22:19:37 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 32254106564A; Fri, 10 Jul 2009 22:19:37 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2180F8FC25; Fri, 10 Jul 2009 22:19:37 +0000 (UTC) (envelope-from kmacy@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 n6AMJbNY033942; Fri, 10 Jul 2009 22:19:37 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6AMJbDk033940; Fri, 10 Jul 2009 22:19:37 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102219.n6AMJbDk033940@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 22:19:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195597 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 22:19:37 -0000 Author: kmacy Date: Fri Jul 10 22:19:36 2009 New Revision: 195597 URL: http://svn.freebsd.org/changeset/base/195597 Log: only print out every 512MB Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 21:54:09 2009 (r195596) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 22:19:36 2009 (r195597) @@ -262,7 +262,7 @@ minidumpsys(struct dumperinfo *di) dump_drop_page(pa); } bits &= ~(1ul << bit); - if (dumpsize % (1<<29)) + if ((dumpsize % (1<<29)) == 0) printf("%dMB ", (dumpsize>>20)); } } From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 23:51:23 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 82459106566C; Fri, 10 Jul 2009 23:51:23 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3BB5D8FC08; Fri, 10 Jul 2009 23:51:23 +0000 (UTC) (envelope-from kmacy@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 n6ANpMeq035746; Fri, 10 Jul 2009 23:51:22 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ANpMbf035744; Fri, 10 Jul 2009 23:51:22 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102351.n6ANpMbf035744@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 23:51:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195598 - user/kmacy/releng_7_2_fcs_1/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 23:51:23 -0000 Author: kmacy Date: Fri Jul 10 23:51:22 2009 New Revision: 195598 URL: http://svn.freebsd.org/changeset/base/195598 Log: exclude clusters from core dumps Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/kern_mbuf.c Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/kern_mbuf.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/kern_mbuf.c Fri Jul 10 22:19:36 2009 (r195597) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/kern_mbuf.c Fri Jul 10 23:51:22 2009 (r195598) @@ -263,7 +263,7 @@ mbuf_init(void *dummy) #else NULL, NULL, NULL, NULL, #endif - UMA_ALIGN_PTR, UMA_ZONE_MAXBUCKET); + UMA_ALIGN_PTR, UMA_ZONE_MAXBUCKET|UMA_ZONE_NODUMP); if (nmbclusters > 0) uma_zone_set_max(zone_clust, nmbclusters); @@ -282,7 +282,7 @@ mbuf_init(void *dummy) #else NULL, NULL, NULL, NULL, #endif - UMA_ALIGN_PTR, 0); + UMA_ALIGN_PTR, UMA_ZONE_NODUMP); if (nmbjumbop > 0) uma_zone_set_max(zone_jumbop, nmbjumbop); @@ -292,7 +292,7 @@ mbuf_init(void *dummy) #else NULL, NULL, NULL, NULL, #endif - UMA_ALIGN_PTR, 0); + UMA_ALIGN_PTR, UMA_ZONE_NODUMP); if (nmbjumbo9 > 0) uma_zone_set_max(zone_jumbo9, nmbjumbo9); uma_zone_set_allocf(zone_jumbo9, mbuf_jumbo_alloc); @@ -304,7 +304,7 @@ mbuf_init(void *dummy) #else NULL, NULL, NULL, NULL, #endif - UMA_ALIGN_PTR, 0); + UMA_ALIGN_PTR, UMA_ZONE_NODUMP); if (nmbjumbo16 > 0) uma_zone_set_max(zone_jumbo16, nmbjumbo16); uma_zone_set_allocf(zone_jumbo16, mbuf_jumbo_alloc); From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 23:51:57 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 08189106564A; Fri, 10 Jul 2009 23:51:57 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EAEC28FC18; Fri, 10 Jul 2009 23:51:56 +0000 (UTC) (envelope-from kmacy@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 n6ANpu5w035795; Fri, 10 Jul 2009 23:51:56 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ANpuu3035792; Fri, 10 Jul 2009 23:51:56 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102351.n6ANpuu3035792@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 23:51:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195599 - in user/kmacy/releng_7_2_fcs_1/sys/amd64: amd64 include X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 23:51:57 -0000 Author: kmacy Date: Fri Jul 10 23:51:56 2009 New Revision: 195599 URL: http://svn.freebsd.org/changeset/base/195599 Log: add page exclusion to the API Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c user/kmacy/releng_7_2_fcs_1/sys/amd64/include/md_var.h Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 23:51:22 2009 (r195598) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Fri Jul 10 23:51:56 2009 (r195599) @@ -56,6 +56,7 @@ CTASSERT(sizeof(struct kerneldumpheader) extern uint64_t KPDPphys; uint64_t *vm_page_dump; +uint64_t *vm_page_dump_exclude; int vm_page_dump_size; static struct kerneldumpheader kdh; @@ -69,7 +70,7 @@ static size_t counter, progress; CTASSERT(sizeof(*vm_page_dump) == 8); static int -is_dumpable(vm_paddr_t pa, int ignorebit) +is_dumpable(vm_paddr_t pa) { int i, idx, bit, isdata; uint64_t pfn = pa; @@ -77,7 +78,7 @@ is_dumpable(vm_paddr_t pa, int ignorebit pfn >>= PAGE_SHIFT; idx = pfn >> 6; /* 2^6 = 64 */ bit = pfn & 63; - isdata = (ignorebit == TRUE) ? 1 : vm_page_dump[idx] & (1ul << bit); + isdata = ((vm_page_dump_exclude[idx] & (1ul << bit)) == 0); for (i = 0; dump_avail[i] != 0 || dump_avail[i + 1] != 0; i += 2) { if (pa >= dump_avail[i] && pa < dump_avail[i + 1] && isdata) @@ -224,7 +225,7 @@ minidumpsys(struct dumperinfo *di) /* This is an entire 2M page. */ pa = pd[j] & PG_PS_FRAME; for (k = 0; k < NPTEPG; k++) { - if (is_dumpable(pa, TRUE)) + if (is_dumpable(pa)) dump_add_page(pa); pa += PAGE_SIZE; } @@ -236,7 +237,7 @@ minidumpsys(struct dumperinfo *di) for (k = 0; k < NPTEPG; k++) { if ((pt[k] & PG_V) == PG_V) { pa = pt[k] & PG_FRAME; - if (is_dumpable(pa, TRUE)) + if (is_dumpable(pa)) dump_add_page(pa); } } @@ -256,7 +257,7 @@ minidumpsys(struct dumperinfo *di) bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; /* Clear out undumpable pages now if needed */ - if (is_dumpable(pa, FALSE)) { + if (is_dumpable(pa)) { dumpsize += PAGE_SIZE; } else { dump_drop_page(pa); @@ -437,3 +438,25 @@ dump_drop_page(vm_paddr_t pa) bit = pa & 63; atomic_clear_long(&vm_page_dump[idx], 1ul << bit); } + +void +dump_exclude_page(vm_paddr_t pa) +{ + int idx, bit; + + pa >>= PAGE_SHIFT; + idx = pa >> 6; /* 2^6 = 64 */ + bit = pa & 63; + atomic_set_long(&vm_page_dump_exclude[idx], 1ul << bit); +} + +void +dump_unexclude_page(vm_paddr_t pa) +{ + int idx, bit; + + pa >>= PAGE_SHIFT; + idx = pa >> 6; /* 2^6 = 64 */ + bit = pa & 63; + atomic_clear_long(&vm_page_dump_exclude[idx], 1ul << bit); +} Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/include/md_var.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/include/md_var.h Fri Jul 10 23:51:22 2009 (r195598) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/include/md_var.h Fri Jul 10 23:51:56 2009 (r195599) @@ -57,6 +57,7 @@ extern char kstack[]; extern char sigcode[]; extern int szsigcode; extern uint64_t *vm_page_dump; +extern uint64_t *vm_page_dump_exclude; extern int vm_page_dump_size; typedef void alias_for_inthand_t(u_int cs, u_int ef, u_int esp, u_int ss); @@ -72,6 +73,8 @@ void doreti_iret(void) __asm(__STRING(do void doreti_iret_fault(void) __asm(__STRING(doreti_iret_fault)); void dump_add_page(vm_paddr_t); void dump_drop_page(vm_paddr_t); +void dump_exclude_page(vm_paddr_t); +void dump_unexclude_page(vm_paddr_t); void initializecpu(void); void fillw(int /*u_short*/ pat, void *base, size_t cnt); void fpstate_drop(struct thread *td); From owner-svn-src-user@FreeBSD.ORG Fri Jul 10 23:52:56 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 971DA106566C; Fri, 10 Jul 2009 23:52:56 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6BF038FC08; Fri, 10 Jul 2009 23:52:56 +0000 (UTC) (envelope-from kmacy@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 n6ANquPv035851; Fri, 10 Jul 2009 23:52:56 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6ANquDv035847; Fri, 10 Jul 2009 23:52:56 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907102352.n6ANquDv035847@svn.freebsd.org> From: Kip Macy Date: Fri, 10 Jul 2009 23:52:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195600 - user/kmacy/releng_7_2_fcs_1/sys/vm X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jul 2009 23:52:56 -0000 Author: kmacy Date: Fri Jul 10 23:52:56 2009 New Revision: 195600 URL: http://svn.freebsd.org/changeset/base/195600 Log: conditionally exclude mapped pages from core dumps Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_contig.c user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c user/kmacy/releng_7_2_fcs_1/sys/vm/vm_page.c Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_contig.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm_contig.c Fri Jul 10 23:51:56 2009 (r195599) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm_contig.c Fri Jul 10 23:52:56 2009 (r195600) @@ -87,6 +87,10 @@ __FBSDID("$FreeBSD$"); #include #include +#ifdef VM_MD_MINIDUMP +#include +#endif + static int vm_contig_launder_page(vm_page_t m, vm_page_t *next) { @@ -229,6 +233,10 @@ contigmapping(vm_page_t m, vm_pindex_t n if ((flags & M_ZERO) && !(m[i].flags & PG_ZERO)) pmap_zero_page(&m[i]); tmp_addr += PAGE_SIZE; +#ifdef VM_MD_MINIDUMP + if (flags & M_NODUMP) + dump_exclude_page(VM_PAGE_TO_PHYS(&m[i])); +#endif } VM_OBJECT_UNLOCK(object); vm_map_wire(map, addr, addr + (npages << PAGE_SHIFT), Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c Fri Jul 10 23:51:56 2009 (r195599) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm_kern.c Fri Jul 10 23:52:56 2009 (r195600) @@ -216,7 +216,7 @@ kmem_free(map, addr, size) vm_offset_t temp = start; for (; temp < end; temp += PAGE_SIZE) - dump_add_page(pmap_kextract(temp)); + dump_unexclude_page(pmap_kextract(temp)); #endif (void) vm_map_remove(map, start, end); } @@ -376,7 +376,7 @@ retry: pmap_zero_page(m); #ifdef VM_MD_MINIDUMP if (flags & M_NODUMP) - dump_drop_page(VM_PAGE_TO_PHYS(m)); + dump_exclude_page(VM_PAGE_TO_PHYS(m)); #endif m->valid = VM_PAGE_BITS_ALL; KASSERT((m->flags & PG_UNMANAGED) != 0, Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_page.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm_page.c Fri Jul 10 23:51:56 2009 (r195599) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm_page.c Fri Jul 10 23:52:56 2009 (r195600) @@ -301,6 +301,10 @@ vm_page_startup(vm_offset_t vaddr) vm_page_dump = (void *)(uintptr_t)pmap_map(&vaddr, new_end, new_end + vm_page_dump_size, VM_PROT_READ | VM_PROT_WRITE); bzero((void *)vm_page_dump, vm_page_dump_size); + new_end -= vm_page_dump_size; + vm_page_dump_exclude = (void *)(uintptr_t)pmap_map(&vaddr, new_end, + new_end + vm_page_dump_size, VM_PROT_READ | VM_PROT_WRITE); + bzero((void *)vm_page_dump, vm_page_dump_size); #endif /* * Compute the number of pages of memory that will be available for From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 01:47:34 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D6A07106564A; Sat, 11 Jul 2009 01:47:34 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C534E8FC0A; Sat, 11 Jul 2009 01:47:34 +0000 (UTC) (envelope-from kmacy@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 n6B1lYQq038378; Sat, 11 Jul 2009 01:47:34 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B1lYGN038376; Sat, 11 Jul 2009 01:47:34 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110147.n6B1lYGN038376@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 01:47:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195602 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 01:47:35 -0000 Author: kmacy Date: Sat Jul 11 01:47:34 2009 New Revision: 195602 URL: http://svn.freebsd.org/changeset/base/195602 Log: - mask out excluded pages - shift page count such that MB are printed Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 00:32:26 2009 (r195601) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 01:47:34 2009 (r195602) @@ -375,13 +375,13 @@ minidumpsys(struct dumperinfo *di) printf("\nclustering memory chunks\n"); for (pages_written = i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { - bits = vm_page_dump[i]; + bits = vm_page_dump[i] & ~(vm_page_dump_exclude[i]); while (bits) { bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; pages_written++; if (pages_written && (pages_written % 1024) == 0) - printf("%dMB ", pages_written*PAGE_SIZE); + printf("%dMB ", (pages_written >> 8)); error = blk_write(di, 0, pa, PAGE_SIZE); if (error) goto fail; From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 02:58:10 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 31428106566B; Sat, 11 Jul 2009 02:58:10 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1FD308FC0A; Sat, 11 Jul 2009 02:58:10 +0000 (UTC) (envelope-from kmacy@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 n6B2w9E1039748; Sat, 11 Jul 2009 02:58:09 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B2w9cq039745; Sat, 11 Jul 2009 02:58:09 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110258.n6B2w9cq039745@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 02:58:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195603 - user/kmacy/releng_7_2_fcs_1/sys/vm X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 02:58:10 -0000 Author: kmacy Date: Sat Jul 11 02:58:09 2009 New Revision: 195603 URL: http://svn.freebsd.org/changeset/base/195603 Log: - add VM_PROT_EXCLUDE to exclude a mapping from dumps - add pmap_qenter_prot to allow specifying of protections for a kernel mapping Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/pmap.h user/kmacy/releng_7_2_fcs_1/sys/vm/vm.h Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/pmap.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/pmap.h Sat Jul 11 01:47:34 2009 (r195602) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/pmap.h Sat Jul 11 02:58:09 2009 (r195603) @@ -120,6 +120,7 @@ int pmap_pinit(pmap_t); void pmap_pinit0(pmap_t); void pmap_protect(pmap_t, vm_offset_t, vm_offset_t, vm_prot_t); void pmap_qenter(vm_offset_t, vm_page_t *, int); +void pmap_qenter_prot(vm_offset_t, vm_page_t *, int, vm_prot_t); void pmap_qremove(vm_offset_t, int); void pmap_release(pmap_t); void pmap_remove(pmap_t, vm_offset_t, vm_offset_t); Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm.h ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm.h Sat Jul 11 01:47:34 2009 (r195602) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm.h Sat Jul 11 02:58:09 2009 (r195603) @@ -75,6 +75,7 @@ typedef u_char vm_prot_t; /* protection #define VM_PROT_WRITE ((vm_prot_t) 0x02) #define VM_PROT_EXECUTE ((vm_prot_t) 0x04) #define VM_PROT_OVERRIDE_WRITE ((vm_prot_t) 0x08) /* copy-on-write */ +#define VM_PROT_EXCLUDE ((vm_prot_t) 0x10) /* don't include in core-dump */ #define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) #define VM_PROT_RW (VM_PROT_READ|VM_PROT_WRITE) From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 02:58:36 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 62CF8106566B; Sat, 11 Jul 2009 02:58:36 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 51A198FC12; Sat, 11 Jul 2009 02:58:36 +0000 (UTC) (envelope-from kmacy@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 n6B2waWU039791; Sat, 11 Jul 2009 02:58:36 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B2waTL039789; Sat, 11 Jul 2009 02:58:36 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110258.n6B2waTL039789@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 02:58:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195604 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 02:58:36 -0000 Author: kmacy Date: Sat Jul 11 02:58:36 2009 New Revision: 195604 URL: http://svn.freebsd.org/changeset/base/195604 Log: implement pmap_qenter_prot for "amd64" Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c Sat Jul 11 02:58:09 2009 (r195603) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/pmap.c Sat Jul 11 02:58:36 2009 (r195604) @@ -1204,16 +1204,24 @@ pmap_map(vm_offset_t *virt, vm_paddr_t s * Note: SMP coherent. Uses a ranged shootdown IPI. */ void -pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count) +pmap_qenter_prot(vm_offset_t sva, vm_page_t *ma, int count, vm_prot_t prot) { pt_entry_t *endpte, oldpte, *pte; + uint64_t flags = PG_V; + if (prot & VM_PROT_WRITE) + flags |= PG_RW; + if ((prot & VM_PROT_EXECUTE) == 0) + flags |= PG_NX; + oldpte = 0; pte = vtopte(sva); endpte = pte + count; while (pte < endpte) { oldpte |= *pte; - pte_store(pte, VM_PAGE_TO_PHYS(*ma) | PG_G | PG_RW | PG_V); + pte_store(pte, VM_PAGE_TO_PHYS(*ma) | PG_G | flags); + if (prot & VM_PROT_EXCLUDE) + dump_exclude_page(VM_PAGE_TO_PHYS(*ma)); pte++; ma++; } @@ -1222,6 +1230,16 @@ pmap_qenter(vm_offset_t sva, vm_page_t * PAGE_SIZE); } +void +pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count) +{ + + pmap_qenter_prot(sva, ma, count, + VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE); + +} + + /* * This routine tears out page mappings from the * kernel -- it is meant only for temporary mappings. @@ -1234,6 +1252,7 @@ pmap_qremove(vm_offset_t sva, int count) va = sva; while (count-- > 0) { + dump_unexclude_page(pmap_kextract(va)); pmap_kremove(va); va += PAGE_SIZE; } From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 03:00:37 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 5EC761065670; Sat, 11 Jul 2009 03:00:37 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4DD158FC0A; Sat, 11 Jul 2009 03:00:37 +0000 (UTC) (envelope-from kmacy@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 n6B30bcA039892; Sat, 11 Jul 2009 03:00:37 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B30b72039889; Sat, 11 Jul 2009 03:00:37 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110300.n6B30b72039889@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 03:00:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195605 - user/kmacy/releng_7_2_fcs_1/sys/vm X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 03:00:37 -0000 Author: kmacy Date: Sat Jul 11 03:00:37 2009 New Revision: 195605 URL: http://svn.freebsd.org/changeset/base/195605 Log: - don't map kernel thread stacks executable - exclude vnode pager buffers from core dumps Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_glue.c user/kmacy/releng_7_2_fcs_1/sys/vm/vnode_pager.c Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vm_glue.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vm_glue.c Sat Jul 11 02:58:36 2009 (r195604) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vm_glue.c Sat Jul 11 03:00:37 2009 (r195605) @@ -372,7 +372,8 @@ vm_thread_new(struct thread *td, int pag m->valid = VM_PAGE_BITS_ALL; } VM_OBJECT_UNLOCK(ksobj); - pmap_qenter(ks, ma, pages); + pmap_qenter_prot(ks, ma, pages, + (VM_PROT_READ|VM_PROT_WRITE)); return (1); } @@ -464,7 +465,8 @@ vm_thread_swapin(struct thread *td) vm_page_wakeup(m); } VM_OBJECT_UNLOCK(ksobj); - pmap_qenter(td->td_kstack, ma, pages); + pmap_qenter_prot(td->td_kstack, ma, pages, + (VM_PROT_READ|VM_PROT_WRITE)); cpu_thread_swapin(td); } Modified: user/kmacy/releng_7_2_fcs_1/sys/vm/vnode_pager.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/vm/vnode_pager.c Sat Jul 11 02:58:36 2009 (r195604) +++ user/kmacy/releng_7_2_fcs_1/sys/vm/vnode_pager.c Sat Jul 11 03:00:37 2009 (r195605) @@ -900,7 +900,8 @@ vnode_pager_generic_getpages(vp, m, byte /* * and map the pages to be read into the kva */ - pmap_qenter(kva, m, count); + pmap_qenter_prot(kva, m, count, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE)); /* build a minimal buffer header */ bp->b_iocmd = BIO_READ; From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 03:08:35 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0A6B6106564A; Sat, 11 Jul 2009 03:08:34 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id ADCC68FC14; Sat, 11 Jul 2009 03:08:34 +0000 (UTC) (envelope-from kmacy@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 n6B38YN9040172; Sat, 11 Jul 2009 03:08:34 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B38Yin040170; Sat, 11 Jul 2009 03:08:34 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110308.n6B38Yin040170@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 03:08:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195606 - user/kmacy/releng_7_2_fcs_1/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 03:08:35 -0000 Author: kmacy Date: Sat Jul 11 03:08:34 2009 New Revision: 195606 URL: http://svn.freebsd.org/changeset/base/195606 Log: - exclude buffers from execution and coredump Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/vfs_bio.c Modified: user/kmacy/releng_7_2_fcs_1/sys/kern/vfs_bio.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/kern/vfs_bio.c Sat Jul 11 03:00:37 2009 (r195605) +++ user/kmacy/releng_7_2_fcs_1/sys/kern/vfs_bio.c Sat Jul 11 03:08:34 2009 (r195606) @@ -1308,9 +1308,12 @@ brelse(struct buf *bp) } if ((bp->b_flags & B_INVAL) == 0) { - pmap_qenter( - trunc_page((vm_offset_t)bp->b_data), - bp->b_pages, bp->b_npages); + pmap_qenter_prot( + trunc_page((vm_offset_t)bp->b_data), + bp->b_pages, + bp->b_npages, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE) + ); } m = bp->b_pages[i]; } @@ -2988,12 +2991,13 @@ allocbuf(struct buf *bp, int size) bp->b_data = (caddr_t) trunc_page((vm_offset_t)bp->b_data); - pmap_qenter( - (vm_offset_t)bp->b_data, - bp->b_pages, - bp->b_npages - ); - + pmap_qenter_prot( + (vm_offset_t)bp->b_data, + bp->b_pages, + bp->b_npages, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE) + ); + bp->b_data = (caddr_t)((vm_offset_t)bp->b_data | (vm_offset_t)(bp->b_offset & PAGE_MASK)); } @@ -3257,8 +3261,12 @@ bufdone_finish(struct buf *bp) if (m == NULL) panic("biodone: page disappeared!"); bp->b_pages[i] = m; - pmap_qenter(trunc_page((vm_offset_t)bp->b_data), - bp->b_pages, bp->b_npages); + pmap_qenter_prot( + trunc_page((vm_offset_t)bp->b_data), + bp->b_pages, + bp->b_npages, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE) + ); } #if defined(VFS_BIO_DEBUG) if (OFF_TO_IDX(foff) != m->pindex) { @@ -3353,8 +3361,12 @@ vfs_unbusy_pages(struct buf *bp) if (!m) panic("vfs_unbusy_pages: page missing\n"); bp->b_pages[i] = m; - pmap_qenter(trunc_page((vm_offset_t)bp->b_data), - bp->b_pages, bp->b_npages); + pmap_qenter_prot( + trunc_page((vm_offset_t)bp->b_data), + bp->b_pages, + bp->b_npages, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE) + ); } vm_object_pip_subtract(obj, 1); vm_page_io_finish(m); @@ -3477,8 +3489,12 @@ retry: } VM_OBJECT_UNLOCK(obj); if (bogus) - pmap_qenter(trunc_page((vm_offset_t)bp->b_data), - bp->b_pages, bp->b_npages); + pmap_qenter_prot( + trunc_page((vm_offset_t)bp->b_data), + bp->b_pages, + bp->b_npages, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE) + ); } /* @@ -3665,7 +3681,8 @@ tryagain: goto tryagain; } p->valid = VM_PAGE_BITS_ALL; - pmap_qenter(pg, &p, 1); + pmap_qenter_prot(pg, &p, 1, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE)); bp->b_pages[index] = p; } VM_OBJECT_UNLOCK(kernel_object); @@ -3764,7 +3781,8 @@ retry: } if (pidx > btoc(MAXPHYS)) panic("vmapbuf: mapped more than MAXPHYS"); - pmap_qenter((vm_offset_t)bp->b_saveaddr, bp->b_pages, pidx); + pmap_qenter_prot((vm_offset_t)bp->b_saveaddr, bp->b_pages, pidx, + (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXCLUDE)); kva = bp->b_saveaddr; bp->b_npages = pidx; From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 03:35:08 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0A2BE106564A; Sat, 11 Jul 2009 03:35:08 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id ED5D18FC13; Sat, 11 Jul 2009 03:35:07 +0000 (UTC) (envelope-from kmacy@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 n6B3Z7QN040876; Sat, 11 Jul 2009 03:35:07 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B3Z7RH040874; Sat, 11 Jul 2009 03:35:07 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110335.n6B3Z7RH040874@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 03:35:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195607 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 03:35:08 -0000 Author: kmacy Date: Sat Jul 11 03:35:07 2009 New Revision: 195607 URL: http://svn.freebsd.org/changeset/base/195607 Log: reduce debug noise during coredump Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 03:08:34 2009 (r195606) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 03:35:07 2009 (r195607) @@ -202,7 +202,7 @@ minidumpsys(struct dumperinfo *di) int error; uint64_t bits; uint64_t *pdp, *pd, *pt, pa; - int i, j, k, bit, pages_written; + int i, j, k, bit; struct minidumphdr mdhdr; counter = 0; @@ -373,22 +373,18 @@ minidumpsys(struct dumperinfo *di) /* Dump memory chunks */ /* XXX cluster it up and use blk_dump() */ printf("\nclustering memory chunks\n"); - for (pages_written = i = 0; + for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) { bits = vm_page_dump[i] & ~(vm_page_dump_exclude[i]); while (bits) { bit = bsfq(bits); pa = (((uint64_t)i * sizeof(*vm_page_dump) * NBBY) + bit) * PAGE_SIZE; - pages_written++; - if (pages_written && (pages_written % 1024) == 0) - printf("%dMB ", (pages_written >> 8)); error = blk_write(di, 0, pa, PAGE_SIZE); if (error) goto fail; bits &= ~(1ul << bit); } } - printf("\n"); error = blk_flush(di); if (error) goto fail; From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 04:08:00 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7CF26106566B; Sat, 11 Jul 2009 04:08:00 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6BC578FC1C; Sat, 11 Jul 2009 04:08:00 +0000 (UTC) (envelope-from kmacy@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 n6B480eG041466; Sat, 11 Jul 2009 04:08:00 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6B480x8041464; Sat, 11 Jul 2009 04:08:00 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907110408.n6B480x8041464@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 04:08:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195608 - user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64 X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 04:08:00 -0000 Author: kmacy Date: Sat Jul 11 04:08:00 2009 New Revision: 195608 URL: http://svn.freebsd.org/changeset/base/195608 Log: add some diagnostic printfs Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Modified: user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 03:35:07 2009 (r195607) +++ user/kmacy/releng_7_2_fcs_1/sys/amd64/amd64/minidump_machdep.c Sat Jul 11 04:08:00 2009 (r195608) @@ -301,6 +301,7 @@ minidumpsys(struct dumperinfo *di) goto fail; dumplo += sizeof(kdh); + printf("write header\n"); /* Dump my header */ bzero(&fakept, sizeof(fakept)); bcopy(&mdhdr, &fakept, sizeof(mdhdr)); @@ -308,11 +309,13 @@ minidumpsys(struct dumperinfo *di) if (error) goto fail; + printf("write msgbuf\n"); /* Dump msgbuf up front */ error = blk_write(di, (char *)msgbufp->msg_ptr, 0, round_page(msgbufp->msg_size)); if (error) goto fail; + printf("write bitmap\n"); /* Dump bitmap */ error = blk_write(di, (char *)vm_page_dump, 0, round_page(vm_page_dump_size)); if (error) From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 21:46:21 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0518D106566B; Sat, 11 Jul 2009 21:46:21 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E6B1D8FC18; Sat, 11 Jul 2009 21:46:20 +0000 (UTC) (envelope-from kmacy@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 n6BLkK33064064; Sat, 11 Jul 2009 21:46:20 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6BLkK8f064060; Sat, 11 Jul 2009 21:46:20 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907112146.n6BLkK8f064060@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 21:46:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195623 - in user/kmacy/head_ppacket/sys: net netinet X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 21:46:21 -0000 Author: kmacy Date: Sat Jul 11 21:46:20 2009 New Revision: 195623 URL: http://svn.freebsd.org/changeset/base/195623 Log: - provide reference counting for gre_softc - serialize access to gre_softc - take first pass at decoupling ip_gre from if_gre Modified: user/kmacy/head_ppacket/sys/net/if_gre.c user/kmacy/head_ppacket/sys/net/if_gre.h user/kmacy/head_ppacket/sys/netinet/ip_gre.c Modified: user/kmacy/head_ppacket/sys/net/if_gre.c ============================================================================== --- user/kmacy/head_ppacket/sys/net/if_gre.c Sat Jul 11 17:36:59 2009 (r195622) +++ user/kmacy/head_ppacket/sys/net/if_gre.c Sat Jul 11 21:46:20 2009 (r195623) @@ -86,9 +86,44 @@ #endif #include - #include +struct gre_softc { + struct mtx gre_mtx; + int gre_unit; + /* + * refcount counts total references, not list external + * like rtentry as that has proven to be error-prone + */ + int gre_refcnt; + u_int gre_fibnum; /* use this fib for envelopes */ + struct route route; /* routing entry that determines, where a + encapsulated packet should go */ + const struct encaptab *encap; /* encapsulation cookie */ + + int called; /* infinite recursion preventer */ + + uint32_t key; /* key included in outgoing GRE packets */ + /* zero means none */ + +#define MTX_BUF_SIZE 32 + char sc_mtx_buf[MTX_BUF_SIZE]; + LIST_ENTRY(gre_softc) sc_list; + struct gre_softc_external gre_ext; +}; +#define gre_src gre_ext.g_src +#define gre_dst gre_ext.g_dst +#define gre_proto gre_ext.g_proto +#define gre_wccp_ver gre_ext.g_wccp_ver +LIST_HEAD(gre_softc_head, gre_softc); + +#define GRE_LOCK(sc) mtx_lock(&(sc)->gre_mtx); +#define GRE_UNLOCK(sc) mtx_unlock(&(sc)->gre_mtx); +#define GRE_ADDREF(sc) do { \ + GRE_LOCK(sc); \ + (sc)->gre_refcnt++; \ + GRE_UNLOCK(sc); \ + } while (0) /* * It is not easy to calculate the right value for a GRE MTU. * We leave this task to the admin and use the same default that @@ -188,6 +223,9 @@ gre_clone_create(ifc, unit, params) free(sc, M_GRE); return (ENOSPC); } + snprintf(sc->sc_mtx_buf, MTX_BUF_SIZE, "%s%d_mtx", ifc->ifc_name, unit); + mtx_init(&sc->gre_mtx, sc->sc_mtx_buf, NULL, MTX_DEF); + sc->gre_refcnt = 1; GRE2IFP(sc)->if_softc = sc; if_initname(GRE2IFP(sc), ifc->ifc_name, unit); @@ -199,13 +237,13 @@ gre_clone_create(ifc, unit, params) GRE2IFP(sc)->if_flags = IFF_POINTOPOINT|IFF_MULTICAST; GRE2IFP(sc)->if_output = gre_output; GRE2IFP(sc)->if_ioctl = gre_ioctl; - sc->g_dst.s_addr = sc->g_src.s_addr = INADDR_ANY; - sc->g_proto = IPPROTO_GRE; + sc->gre_dst.s_addr = sc->gre_src.s_addr = INADDR_ANY; + sc->gre_proto = IPPROTO_GRE; GRE2IFP(sc)->if_flags |= IFF_LINK0; sc->encap = NULL; sc->called = 0; sc->gre_fibnum = curthread->td_proc->p_fibnum; - sc->wccp_ver = WCCP_V1; + sc->gre_wccp_ver = WCCP_V1; sc->key = 0; if_attach(GRE2IFP(sc)); bpfattach(GRE2IFP(sc), DLT_NULL, sizeof(u_int32_t)); @@ -215,29 +253,43 @@ gre_clone_create(ifc, unit, params) return (0); } -static void -gre_clone_destroy(ifp) - struct ifnet *ifp; +void +gre_free(struct gre_softc *sc) { - struct gre_softc *sc = ifp->if_softc; + struct ifnet *ifp; - mtx_lock(&gre_mtx); - LIST_REMOVE(sc, sc_list); - mtx_unlock(&gre_mtx); + GRE_LOCK(sc); + (sc)->gre_refcnt--; + if ((sc)->gre_refcnt > 0) { + GRE_UNLOCK((sc)); + return; + } #ifdef INET if (sc->encap != NULL) encap_detach(sc->encap); #endif + ifp = GRE2IFP(sc); bpfdetach(ifp); if_detach(ifp); if_free(ifp); free(sc, M_GRE); } +static void +gre_clone_destroy(struct ifnet *ifp) +{ + struct gre_softc *sc = ifp->if_softc; + + mtx_lock(&gre_mtx); + LIST_REMOVE(sc, sc_list); + mtx_unlock(&gre_mtx); + gre_free(sc); +} + /* * The output routine. Takes a packet and encapsulates it in the protocol - * given by sc->g_proto. See also RFC 1701 and RFC 2004 + * given by sc->gre_proto. See also RFC 1701 and RFC 2004 */ static int gre_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, @@ -256,7 +308,8 @@ gre_output(struct ifnet *ifp, struct mbu struct mobile_h mob_h; u_int32_t af; int extra = 0; - + + GRE_LOCK(sc); /* * gre may cause infinite recursion calls when misconfigured. * We'll prevent this by introducing upper limit. @@ -271,7 +324,7 @@ gre_output(struct ifnet *ifp, struct mbu if (!((ifp->if_flags & IFF_UP) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) || - sc->g_src.s_addr == INADDR_ANY || sc->g_dst.s_addr == INADDR_ANY) { + sc->gre_src.s_addr == INADDR_ANY || sc->gre_dst.s_addr == INADDR_ANY) { m_freem(m); error = ENETDOWN; goto end; @@ -293,7 +346,7 @@ gre_output(struct ifnet *ifp, struct mbu m->m_flags &= ~(M_BCAST|M_MCAST); - if (sc->g_proto == IPPROTO_MOBILE) { + if (sc->gre_proto == IPPROTO_MOBILE) { if (dst->sa_family == AF_INET) { struct mbuf *m0; int msiz; @@ -313,19 +366,19 @@ gre_output(struct ifnet *ifp, struct mbu memset(&mob_h, 0, MOB_H_SIZ_L); mob_h.proto = (ip->ip_p) << 8; mob_h.odst = ip->ip_dst.s_addr; - ip->ip_dst.s_addr = sc->g_dst.s_addr; + ip->ip_dst.s_addr = sc->gre_dst.s_addr; /* * If the packet comes from our host, we only change * the destination address in the IP header. * Else we also need to save and change the source */ - if (in_hosteq(ip->ip_src, sc->g_src)) { + if (in_hosteq(ip->ip_src, sc->gre_src)) { msiz = MOB_H_SIZ_S; } else { mob_h.proto |= MOB_H_SBIT; mob_h.osrc = ip->ip_src.s_addr; - ip->ip_src.s_addr = sc->g_src.s_addr; + ip->ip_src.s_addr = sc->gre_src.s_addr; msiz = MOB_H_SIZ_L; } mob_h.proto = htons(mob_h.proto); @@ -365,13 +418,13 @@ gre_output(struct ifnet *ifp, struct mbu error = EINVAL; goto end; } - } else if (sc->g_proto == IPPROTO_GRE) { + } else if (sc->gre_proto == IPPROTO_GRE) { switch (dst->sa_family) { case AF_INET: ip = mtod(m, struct ip *); gre_ip_tos = ip->ip_tos; gre_ip_id = ip->ip_id; - if (sc->wccp_ver == WCCP_V2) { + if (sc->gre_wccp_ver == WCCP_V2) { extra = sizeof(uint32_t); etype = WCCP_PROTOCOL_TYPE; } else { @@ -417,7 +470,7 @@ gre_output(struct ifnet *ifp, struct mbu M_SETFIB(m, sc->gre_fibnum); /* The envelope may use a different FIB */ gh = mtod(m, struct greip *); - if (sc->g_proto == IPPROTO_GRE) { + if (sc->gre_proto == IPPROTO_GRE) { uint32_t *options = gh->gi_options; memset((void *)gh, 0, sizeof(struct greip) + extra); @@ -432,10 +485,10 @@ gre_output(struct ifnet *ifp, struct mbu } } - gh->gi_pr = sc->g_proto; - if (sc->g_proto != IPPROTO_MOBILE) { - gh->gi_src = sc->g_src; - gh->gi_dst = sc->g_dst; + gh->gi_pr = sc->gre_proto; + if (sc->gre_proto != IPPROTO_MOBILE) { + gh->gi_src = sc->gre_src; + gh->gi_dst = sc->gre_dst; ((struct ip*)gh)->ip_v = IPPROTO_IPV4; ((struct ip*)gh)->ip_hl = (sizeof(struct ip)) >> 2; ((struct ip*)gh)->ip_ttl = GRE_TTL; @@ -454,6 +507,7 @@ gre_output(struct ifnet *ifp, struct mbu error = ip_output(m, NULL, &sc->route, IP_FORWARDING, (struct ip_moptions *)NULL, (struct inpcb *)NULL); end: + GRE_UNLOCK(sc); sc->called = 0; if (error) ifp->if_oerrors++; @@ -467,7 +521,6 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, struct if_laddrreq *lifr = (struct if_laddrreq *)data; struct in_aliasreq *aifr = (struct in_aliasreq *)data; struct gre_softc *sc = ifp->if_softc; - int s; struct sockaddr_in si; struct sockaddr *sa = NULL; int error, adj; @@ -477,7 +530,7 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, error = 0; adj = 0; - s = splnet(); + GRE_LOCK(sc); switch (cmd) { case SIOCSIFADDR: ifp->if_flags |= IFF_UP; @@ -492,13 +545,13 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, if ((error = priv_check(curthread, PRIV_NET_SETIFFLAGS)) != 0) break; if ((ifr->ifr_flags & IFF_LINK0) != 0) - sc->g_proto = IPPROTO_GRE; + sc->gre_proto = IPPROTO_GRE; else - sc->g_proto = IPPROTO_MOBILE; + sc->gre_proto = IPPROTO_MOBILE; if ((ifr->ifr_flags & IFF_LINK2) != 0) - sc->wccp_ver = WCCP_V2; + sc->gre_wccp_ver = WCCP_V2; else - sc->wccp_ver = WCCP_V1; + sc->gre_wccp_ver = WCCP_V1; goto recompute; case SIOCSIFMTU: /* @@ -573,8 +626,8 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, */ if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) break; - sc->g_proto = ifr->ifr_flags; - switch (sc->g_proto) { + sc->gre_proto = ifr->ifr_flags; + switch (sc->gre_proto) { case IPPROTO_GRE: ifp->if_flags |= IFF_LINK0; break; @@ -587,7 +640,7 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, } goto recompute; case GREGPROTO: - ifr->ifr_flags = sc->g_proto; + ifr->ifr_flags = sc->gre_proto; break; case GRESADDRS: case GRESADDRD: @@ -600,9 +653,9 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, */ sa = &ifr->ifr_addr; if (cmd == GRESADDRS) - sc->g_src = (satosin(sa))->sin_addr; + sc->gre_src = (satosin(sa))->sin_addr; if (cmd == GRESADDRD) - sc->g_dst = (satosin(sa))->sin_addr; + sc->gre_dst = (satosin(sa))->sin_addr; recompute: #ifdef INET if (sc->encap != NULL) { @@ -610,8 +663,8 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, sc->encap = NULL; } #endif - if ((sc->g_src.s_addr != INADDR_ANY) && - (sc->g_dst.s_addr != INADDR_ANY)) { + if ((sc->gre_src.s_addr != INADDR_ANY) && + (sc->gre_dst.s_addr != INADDR_ANY)) { bzero(&sp, sizeof(sp)); bzero(&sm, sizeof(sm)); bzero(&dp, sizeof(dp)); @@ -620,14 +673,14 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, sizeof(struct sockaddr_in); sp.sin_family = sm.sin_family = dp.sin_family = dm.sin_family = AF_INET; - sp.sin_addr = sc->g_src; - dp.sin_addr = sc->g_dst; + sp.sin_addr = sc->gre_src; + dp.sin_addr = sc->gre_dst; sm.sin_addr.s_addr = dm.sin_addr.s_addr = INADDR_BROADCAST; #ifdef INET - sc->encap = encap_attach(AF_INET, sc->g_proto, + sc->encap = encap_attach(AF_INET, sc->gre_proto, sintosa(&sp), sintosa(&sm), sintosa(&dp), - sintosa(&dm), (sc->g_proto == IPPROTO_GRE) ? + sintosa(&dm), (sc->gre_proto == IPPROTO_GRE) ? &in_gre_protosw : &in_mobile_protosw, sc); if (sc->encap == NULL) printf("%s: unable to attach encap\n", @@ -645,7 +698,7 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, memset(&si, 0, sizeof(si)); si.sin_family = AF_INET; si.sin_len = sizeof(struct sockaddr_in); - si.sin_addr.s_addr = sc->g_src.s_addr; + si.sin_addr.s_addr = sc->gre_src.s_addr; sa = sintosa(&si); ifr->ifr_addr = *sa; break; @@ -653,7 +706,7 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, memset(&si, 0, sizeof(si)); si.sin_family = AF_INET; si.sin_len = sizeof(struct sockaddr_in); - si.sin_addr.s_addr = sc->g_dst.s_addr; + si.sin_addr.s_addr = sc->gre_dst.s_addr; sa = sintosa(&si); ifr->ifr_addr = *sa; break; @@ -674,8 +727,8 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, error = EINVAL; break; } - sc->g_src = aifr->ifra_addr.sin_addr; - sc->g_dst = aifr->ifra_dstaddr.sin_addr; + sc->gre_src = aifr->ifra_addr.sin_addr; + sc->gre_dst = aifr->ifra_dstaddr.sin_addr; goto recompute; case SIOCSLIFPHYADDR: /* @@ -694,8 +747,8 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, error = EINVAL; break; } - sc->g_src = (satosin(&lifr->addr))->sin_addr; - sc->g_dst = + sc->gre_src = (satosin(&lifr->addr))->sin_addr; + sc->gre_dst = (satosin(&lifr->dstaddr))->sin_addr; goto recompute; case SIOCDIFPHYADDR: @@ -705,49 +758,49 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, */ if ((error = priv_check(curthread, PRIV_NET_SETIFPHYS)) != 0) break; - sc->g_src.s_addr = INADDR_ANY; - sc->g_dst.s_addr = INADDR_ANY; + sc->gre_src.s_addr = INADDR_ANY; + sc->gre_dst.s_addr = INADDR_ANY; goto recompute; case SIOCGLIFPHYADDR: - if (sc->g_src.s_addr == INADDR_ANY || - sc->g_dst.s_addr == INADDR_ANY) { + if (sc->gre_src.s_addr == INADDR_ANY || + sc->gre_dst.s_addr == INADDR_ANY) { error = EADDRNOTAVAIL; break; } memset(&si, 0, sizeof(si)); si.sin_family = AF_INET; si.sin_len = sizeof(struct sockaddr_in); - si.sin_addr.s_addr = sc->g_src.s_addr; + si.sin_addr.s_addr = sc->gre_src.s_addr; memcpy(&lifr->addr, &si, sizeof(si)); - si.sin_addr.s_addr = sc->g_dst.s_addr; + si.sin_addr.s_addr = sc->gre_dst.s_addr; memcpy(&lifr->dstaddr, &si, sizeof(si)); break; case SIOCGIFPSRCADDR: #ifdef INET6 case SIOCGIFPSRCADDR_IN6: #endif - if (sc->g_src.s_addr == INADDR_ANY) { + if (sc->gre_src.s_addr == INADDR_ANY) { error = EADDRNOTAVAIL; break; } memset(&si, 0, sizeof(si)); si.sin_family = AF_INET; si.sin_len = sizeof(struct sockaddr_in); - si.sin_addr.s_addr = sc->g_src.s_addr; + si.sin_addr.s_addr = sc->gre_src.s_addr; bcopy(&si, &ifr->ifr_addr, sizeof(ifr->ifr_addr)); break; case SIOCGIFPDSTADDR: #ifdef INET6 case SIOCGIFPDSTADDR_IN6: #endif - if (sc->g_dst.s_addr == INADDR_ANY) { + if (sc->gre_dst.s_addr == INADDR_ANY) { error = EADDRNOTAVAIL; break; } memset(&si, 0, sizeof(si)); si.sin_family = AF_INET; si.sin_len = sizeof(struct sockaddr_in); - si.sin_addr.s_addr = sc->g_dst.s_addr; + si.sin_addr.s_addr = sc->gre_dst.s_addr; bcopy(&si, &ifr->ifr_addr, sizeof(ifr->ifr_addr)); break; case GRESKEY: @@ -779,7 +832,7 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, break; } - splx(s); + GRE_UNLOCK(sc); return (error); } @@ -802,7 +855,7 @@ gre_compute_route(struct gre_softc *sc) ro = &sc->route; memset(ro, 0, sizeof(struct route)); - ((struct sockaddr_in *)&ro->ro_dst)->sin_addr = sc->g_dst; + ((struct sockaddr_in *)&ro->ro_dst)->sin_addr = sc->gre_dst; ro->ro_dst.sa_family = AF_INET; ro->ro_dst.sa_len = sizeof(ro->ro_dst); @@ -843,7 +896,7 @@ gre_compute_route(struct gre_softc *sc) * the route and search one to this interface ... */ if ((GRE2IFP(sc)->if_flags & IFF_LINK1) == 0) - ((struct sockaddr_in *)&ro->ro_dst)->sin_addr = sc->g_dst; + ((struct sockaddr_in *)&ro->ro_dst)->sin_addr = sc->gre_dst; #ifdef DIAGNOSTIC printf(", choosing %s with gateway %s", if_name(ro->ro_rt->rt_ifp), @@ -883,6 +936,31 @@ gre_in_cksum(u_int16_t *p, u_int len) return (~sum); } +/* + * Find the gre interface associated with our src/dst/proto set. + * + */ +struct gre_softc * +gre_lookup(struct mbuf *m, u_char proto, + int (*func)(struct gre_softc_external *, struct mbuf *, u_char)) +{ + struct gre_softc *sc; + + mtx_lock(&gre_mtx); + for (sc = LIST_FIRST(&gre_softc_list); sc != NULL; + sc = LIST_NEXT(sc, sc_list)) { + if (func(&sc->gre_ext, m, proto) && + ((GRE2IFP(sc)->if_flags & IFF_UP) != 0)) { + GRE_ADDREF(sc); + mtx_unlock(&gre_mtx); + return (sc); + } + } + mtx_unlock(&gre_mtx); + + return (NULL); +} + static int gremodevent(module_t mod, int type, void *data) { Modified: user/kmacy/head_ppacket/sys/net/if_gre.h ============================================================================== --- user/kmacy/head_ppacket/sys/net/if_gre.h Sat Jul 11 17:36:59 2009 (r195622) +++ user/kmacy/head_ppacket/sys/net/if_gre.h Sat Jul 11 21:46:20 2009 (r195623) @@ -54,30 +54,19 @@ typedef enum { WCCP_V2 } wccp_ver_t; -struct gre_softc { - struct ifnet *sc_ifp; - LIST_ENTRY(gre_softc) sc_list; - int gre_unit; - int gre_flags; - u_int gre_fibnum; /* use this fib for envelopes */ +/* + * The binary contract is to have the ifp at the front of the softc + * + */ +#define GRE2IFP(sc) (*(struct ifnet **)(&sc)) +struct gre_softc_external { + struct ifnet *gre_ifp; struct in_addr g_src; /* source address of gre packets */ struct in_addr g_dst; /* destination address of gre packets */ - struct route route; /* routing entry that determines, where a - encapsulated packet should go */ u_char g_proto; /* protocol of encapsulator */ - - const struct encaptab *encap; /* encapsulation cookie */ - - int called; /* infinite recursion preventer */ - - uint32_t key; /* key included in outgoing GRE packets */ - /* zero means none */ - - wccp_ver_t wccp_ver; /* version of the WCCP */ + wccp_ver_t g_wccp_ver; /* version of the WCCP */ }; -#define GRE2IFP(sc) ((sc)->sc_ifp) - - + struct gre_h { u_int16_t flags; /* GRE flags */ u_int16_t ptype; /* protocol type of payload typically @@ -184,11 +173,11 @@ struct mobip_h { #define GRESKEY _IOW('i', 108, struct ifreq) #ifdef _KERNEL -LIST_HEAD(gre_softc_head, gre_softc); -extern struct mtx gre_mtx; -extern struct gre_softc_head gre_softc_list; - +struct gre_softc; u_int16_t gre_in_cksum(u_int16_t *, u_int); +struct gre_softc *gre_lookup(struct mbuf *m, u_char proto, + int (*func)(struct gre_softc_external *, struct mbuf *, u_char)); +void gre_free(struct gre_softc *sc); #endif /* _KERNEL */ #endif Modified: user/kmacy/head_ppacket/sys/netinet/ip_gre.c ============================================================================== --- user/kmacy/head_ppacket/sys/netinet/ip_gre.c Sat Jul 11 17:36:59 2009 (r195622) +++ user/kmacy/head_ppacket/sys/netinet/ip_gre.c Sat Jul 11 21:46:20 2009 (r195623) @@ -91,35 +91,14 @@ __FBSDID("$FreeBSD$"); #include -#if 1 -void gre_inet_ntoa(struct in_addr in); /* XXX */ -#endif - -static struct gre_softc *gre_lookup(struct mbuf *, u_int8_t); - -static struct mbuf *gre_input2(struct mbuf *, int, u_char); - -/* - * De-encapsulate a packet and feed it back through ip input (this - * routine is called whenever IP gets a packet with proto type - * IPPROTO_GRE and a local destination address). - * This really is simple - */ -void -gre_input(struct mbuf *m, int off) +static int +gre_input_lookup_func(struct gre_softc_external *sc, struct mbuf *m, u_char proto) { - int proto; - - proto = (mtod(m, struct ip *))->ip_p; - - m = gre_input2(m, off, proto); + struct ip *ip = mtod(m, struct ip *); - /* - * If no matching tunnel that is up is found. We inject - * the mbuf to raw ip socket to see if anyone picks it up. - */ - if (m != NULL) - rip_input(m, off); + return ((sc->g_dst.s_addr == ip->ip_src.s_addr) && + (sc->g_src.s_addr == ip->ip_dst.s_addr) && + (sc->g_proto == proto)); } /* @@ -137,15 +116,15 @@ gre_input2(struct mbuf *m ,int hlen, u_c u_int16_t flags; u_int32_t af; - if ((sc = gre_lookup(m, proto)) == NULL) { + if ((sc = gre_lookup(m, proto, gre_input_lookup_func)) == NULL) { /* No matching tunnel or tunnel is down. */ return (m); } if (m->m_len < sizeof(*gip)) { m = m_pullup(m, sizeof(*gip)); - if (m == NULL) - return (NULL); + if (m == NULL) + goto done; } gip = mtod(m, struct greip *); @@ -164,7 +143,7 @@ gre_input2(struct mbuf *m ,int hlen, u_c hlen += 4; /* We don't support routing fields (variable length) */ if (flags & GRE_RP) - return (m); + goto done; if (flags & GRE_KP) hlen += 4; if (flags & GRE_SP) @@ -172,7 +151,7 @@ gre_input2(struct mbuf *m ,int hlen, u_c switch (ntohs(gip->gi_ptype)) { /* ethertypes */ case WCCP_PROTOCOL_TYPE: - if (sc->wccp_ver == WCCP_V2) + if (((struct gre_softc_external *)sc)->g_wccp_ver == WCCP_V2) hlen += 4; /* FALLTHROUGH */ case ETHERTYPE_IP: /* shouldn't need a schednetisr(), */ @@ -193,17 +172,18 @@ gre_input2(struct mbuf *m ,int hlen, u_c #endif default: /* Others not yet supported. */ - return (m); + goto done; } break; default: /* Others not yet supported. */ - return (m); + goto done; } if (hlen > m->m_pkthdr.len) { m_freem(m); - return (NULL); + m = NULL; + goto done; } /* Unlike NetBSD, in FreeBSD m_adj() adjusts m->m_pkthdr.len as well */ m_adj(m, hlen); @@ -213,11 +193,37 @@ gre_input2(struct mbuf *m ,int hlen, u_c } m->m_pkthdr.rcvif = GRE2IFP(sc); - + gre_free(sc); netisr_queue(isr, m); /* Packet is done, no further processing needed. */ return (NULL); +done: + gre_free(sc); + return (m); +} + +/* + * De-encapsulate a packet and feed it back through ip input (this + * routine is called whenever IP gets a packet with proto type + * IPPROTO_GRE and a local destination address). + * This really is simple + */ +void +gre_input(struct mbuf *m, int off) +{ + int proto; + + proto = (mtod(m, struct ip *))->ip_p; + + m = gre_input2(m, off, proto); + + /* + * If no matching tunnel that is up is found. We inject + * the mbuf to raw ip socket to see if anyone picks it up. + */ + if (m != NULL) + rip_input(m, off); } /* @@ -226,7 +232,6 @@ gre_input2(struct mbuf *m ,int hlen, u_c * encapsulating header was not prepended, but instead inserted * between IP header and payload */ - void gre_mobile_input(struct mbuf *m, int hlen) { @@ -235,7 +240,7 @@ gre_mobile_input(struct mbuf *m, int hle struct gre_softc *sc; int msiz; - if ((sc = gre_lookup(m, IPPROTO_MOBILE)) == NULL) { + if ((sc = gre_lookup(m, IPPROTO_MOBILE, gre_input_lookup_func)) == NULL) { /* No matching tunnel or tunnel is down. */ m_freem(m); return; @@ -244,7 +249,7 @@ gre_mobile_input(struct mbuf *m, int hle if (m->m_len < sizeof(*mip)) { m = m_pullup(m, sizeof(*mip)); if (m == NULL) - return; + goto done; } ip = mtod(m, struct ip *); mip = mtod(m, struct mobip_h *); @@ -261,7 +266,7 @@ gre_mobile_input(struct mbuf *m, int hle if (m->m_len < (ip->ip_hl << 2) + msiz) { m = m_pullup(m, (ip->ip_hl << 2) + msiz); if (m == NULL) - return; + goto done; ip = mtod(m, struct ip *); mip = mtod(m, struct mobip_h *); } @@ -271,7 +276,7 @@ gre_mobile_input(struct mbuf *m, int hle if (gre_in_cksum((u_int16_t *)&mip->mh, msiz) != 0) { m_freem(m); - return; + goto done; } bcopy((caddr_t)(ip) + (ip->ip_hl << 2) + msiz, (caddr_t)(ip) + @@ -297,38 +302,8 @@ gre_mobile_input(struct mbuf *m, int hle } m->m_pkthdr.rcvif = GRE2IFP(sc); - netisr_queue(NETISR_IP, m); -} - -/* - * Find the gre interface associated with our src/dst/proto set. - * - * XXXRW: Need some sort of drain/refcount mechanism so that the softc - * reference remains valid after it's returned from gre_lookup(). Right - * now, I'm thinking it should be reference-counted with a gre_dropref() - * when the caller is done with the softc. This is complicated by how - * to handle destroying the gre softc; probably using a gre_drain() in - * in_gre.c during destroy. - */ -static struct gre_softc * -gre_lookup(struct mbuf *m, u_int8_t proto) -{ - struct ip *ip = mtod(m, struct ip *); - struct gre_softc *sc; - mtx_lock(&gre_mtx); - for (sc = LIST_FIRST(&gre_softc_list); sc != NULL; - sc = LIST_NEXT(sc, sc_list)) { - if ((sc->g_dst.s_addr == ip->ip_src.s_addr) && - (sc->g_src.s_addr == ip->ip_dst.s_addr) && - (sc->g_proto == proto) && - ((GRE2IFP(sc)->if_flags & IFF_UP) != 0)) { - mtx_unlock(&gre_mtx); - return (sc); - } - } - mtx_unlock(&gre_mtx); - - return (NULL); +done: + gre_free(sc); } From owner-svn-src-user@FreeBSD.ORG Sat Jul 11 22:57:03 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 43150106564A; Sat, 11 Jul 2009 22:57:03 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 314A68FC19; Sat, 11 Jul 2009 22:57:03 +0000 (UTC) (envelope-from kmacy@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 n6BMv3Cx065728; Sat, 11 Jul 2009 22:57:03 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n6BMv3Vm065726; Sat, 11 Jul 2009 22:57:03 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200907112257.n6BMv3Vm065726@svn.freebsd.org> From: Kip Macy Date: Sat, 11 Jul 2009 22:57:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r195628 - user/kmacy/head_ppacket/sys/net X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Jul 2009 22:57:03 -0000 Author: kmacy Date: Sat Jul 11 22:57:02 2009 New Revision: 195628 URL: http://svn.freebsd.org/changeset/base/195628 Log: - remove tun_pid - TUN_OPEN is used to avoid multiple users - add tun_rwait_cv to avoid TUN_RWAIT setting sleep / wakeup dance - serialize access to softc structures every place they're touched - make teardown of the ifaddr list SMP / PREEMPTION safe - remove spl in all places where the tun lock now protects state Modified: user/kmacy/head_ppacket/sys/net/if_tun.c Modified: user/kmacy/head_ppacket/sys/net/if_tun.c ============================================================================== --- user/kmacy/head_ppacket/sys/net/if_tun.c Sat Jul 11 22:43:20 2009 (r195627) +++ user/kmacy/head_ppacket/sys/net/if_tun.c Sat Jul 11 22:57:02 2009 (r195628) @@ -76,25 +76,18 @@ struct tun_softc { #define TUN_IASET 0x0008 #define TUN_DSTADDR 0x0010 #define TUN_LMODE 0x0020 -#define TUN_RWAIT 0x0040 + #define TUN_ASYNC 0x0080 #define TUN_IFHEAD 0x0100 #define TUN_READY (TUN_OPEN | TUN_INITED) - /* - * XXXRW: tun_pid is used to exclusively lock /dev/tun. Is this - * actually needed? Can we just return EBUSY if already open? - * Problem is that this involved inherent races when a tun device - * is handed off from one process to another, as opposed to just - * being slightly stale informationally. - */ - pid_t tun_pid; /* owning pid */ struct ifnet *tun_ifp; /* the interface */ struct sigio *tun_sigio; /* information for async I/O */ struct selinfo tun_rsel; /* read select */ struct mtx tun_mtx; /* protect mutable softc fields */ struct cv tun_cv; /* protect against ref'd dev destroy */ + struct cv tun_rwait_cv; /* rwait wakeup */ }; #define TUN2IFP(sc) ((sc)->tun_ifp) @@ -347,10 +340,7 @@ tunstart(struct ifnet *ifp) } mtx_lock(&tp->tun_mtx); - if (tp->tun_flags & TUN_RWAIT) { - tp->tun_flags &= ~TUN_RWAIT; - wakeup(tp); - } + cv_broadcast(&tp->tun_rwait_cv); if (tp->tun_flags & TUN_ASYNC && tp->tun_sigio) { mtx_unlock(&tp->tun_mtx); pgsigio(&tp->tun_sigio, SIGIO, 0); @@ -371,7 +361,8 @@ tuncreate(const char *name, struct cdev sc = malloc(sizeof(*sc), M_TUN, M_WAITOK | M_ZERO); mtx_init(&sc->tun_mtx, "tun_mtx", NULL, MTX_DEF); - cv_init(&sc->tun_cv, "tun_condvar"); + cv_init(&sc->tun_cv, "tun_ref_cv"); + cv_init(&sc->tun_rwait_cv, "tun_rwait_cv"); sc->tun_flags = TUN_INITED; sc->tun_dev = dev; mtx_lock(&tunmtx); @@ -417,18 +408,11 @@ tunopen(struct cdev *dev, int flag, int tp = dev->si_drv1; } - /* - * XXXRW: This use of tun_pid is subject to error due to the - * fact that a reference to the tunnel can live beyond the - * death of the process that created it. Can we replace this - * with a simple busy flag? - */ mtx_lock(&tp->tun_mtx); - if (tp->tun_pid != 0 && tp->tun_pid != td->td_proc->p_pid) { + if (tp->tun_flags & TUN_OPEN) { mtx_unlock(&tp->tun_mtx); return (EBUSY); } - tp->tun_pid = td->td_proc->p_pid; tp->tun_flags |= TUN_OPEN; mtx_unlock(&tp->tun_mtx); @@ -448,36 +432,37 @@ tunclose(struct cdev *dev, int foo, int { struct tun_softc *tp; struct ifnet *ifp; - int s; - + struct ifaddrhead head; + tp = dev->si_drv1; ifp = TUN2IFP(tp); - + + TAILQ_INIT(&head); mtx_lock(&tp->tun_mtx); tp->tun_flags &= ~TUN_OPEN; - tp->tun_pid = 0; mtx_unlock(&tp->tun_mtx); /* * junk all pending output */ CURVNET_SET(ifp->if_vnet); - s = splimp(); IFQ_PURGE(&ifp->if_snd); - splx(s); if (ifp->if_flags & IFF_UP) { - s = splimp(); + mtx_lock(&tp->tun_mtx); if_down(ifp); - splx(s); + mtx_unlock(&tp->tun_mtx); } /* Delete all addresses and routes which reference this interface. */ if (ifp->if_drv_flags & IFF_DRV_RUNNING) { struct ifaddr *ifa; - s = splimp(); - TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { + while (!TAILQ_EMPTY(&ifp->if_addrhead)) { + IF_ADDR_LOCK(ifp); + ifa = TAILQ_FIRST(&ifp->if_addrhead); + TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); + IF_ADDR_UNLOCK(ifp); /* deal w/IPv4 PtP destination; unlocked read */ if (ifa->ifa_addr->sa_family == AF_INET) { rtinit(ifa, (int)RTM_DELETE, @@ -486,9 +471,13 @@ tunclose(struct cdev *dev, int foo, int rtinit(ifa, (int)RTM_DELETE, 0); } } + IF_ADDR_LOCK(ifp); + TAILQ_CONCAT(&ifp->if_addrhead, &head, ifa_link); if_purgeaddrs(ifp); + IF_ADDR_UNLOCK(ifp); + mtx_lock(&tp->tun_mtx); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - splx(s); + mtx_unlock(&tp->tun_mtx); } if_link_state_change(ifp, LINK_STATE_DOWN); CURVNET_RESTORE(); @@ -507,12 +496,13 @@ tunclose(struct cdev *dev, int foo, int static int tuninit(struct ifnet *ifp) { + int error = 0; #ifdef INET struct tun_softc *tp = ifp->if_softc; struct ifaddr *ifa; + + mtx_assert(&tp->tun_mtx, MA_OWNED); #endif - int error = 0; - TUNDEBUG(ifp, "tuninit\n"); ifp->if_flags |= IFF_UP; @@ -526,14 +516,12 @@ tuninit(struct ifnet *ifp) struct sockaddr_in *si; si = (struct sockaddr_in *)ifa->ifa_addr; - mtx_lock(&tp->tun_mtx); if (si->sin_addr.s_addr) tp->tun_flags |= TUN_IASET; si = (struct sockaddr_in *)ifa->ifa_dstaddr; if (si && si->sin_addr.s_addr) tp->tun_flags |= TUN_DSTADDR; - mtx_unlock(&tp->tun_mtx); } } if_addr_runlock(ifp); @@ -550,17 +538,12 @@ tunifioctl(struct ifnet *ifp, u_long cmd struct ifreq *ifr = (struct ifreq *)data; struct tun_softc *tp = ifp->if_softc; struct ifstat *ifs; - int error = 0, s; + int error = 0; - s = splimp(); + mtx_lock(&tp->tun_mtx); switch(cmd) { case SIOCGIFSTATUS: ifs = (struct ifstat *)data; - mtx_lock(&tp->tun_mtx); - if (tp->tun_pid) - sprintf(ifs->ascii + strlen(ifs->ascii), - "\tOpened by PID %d\n", tp->tun_pid); - mtx_unlock(&tp->tun_mtx); break; case SIOCSIFADDR: error = tuninit(ifp); @@ -581,7 +564,7 @@ tunifioctl(struct ifnet *ifp, u_long cmd default: error = EINVAL; } - splx(s); + mtx_unlock(&tp->tun_mtx); return (error); } @@ -687,7 +670,6 @@ tunoutput( static int tunioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td) { - int s; int error; struct tun_softc *tp = dev->si_drv1; struct tuninfo *tunp; @@ -758,11 +740,6 @@ tunioctl(struct cdev *dev, u_long cmd, c return(EINVAL); } break; - case TUNSIFPID: - mtx_lock(&tp->tun_mtx); - tp->tun_pid = curthread->td_proc->p_pid; - mtx_unlock(&tp->tun_mtx); - break; case FIONBIO: break; case FIOASYNC: @@ -774,7 +751,6 @@ tunioctl(struct cdev *dev, u_long cmd, c mtx_unlock(&tp->tun_mtx); break; case FIONREAD: - s = splimp(); if (!IFQ_IS_EMPTY(&TUN2IFP(tp)->if_snd)) { struct mbuf *mb; IFQ_LOCK(&TUN2IFP(tp)->if_snd); @@ -784,7 +760,6 @@ tunioctl(struct cdev *dev, u_long cmd, c IFQ_UNLOCK(&TUN2IFP(tp)->if_snd); } else *(int *)data = 0; - splx(s); break; case FIOSETOWN: return (fsetown(*(int *)data, &tp->tun_sigio)); @@ -818,7 +793,7 @@ tunread(struct cdev *dev, struct uio *ui struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = TUN2IFP(tp); struct mbuf *m; - int error=0, len, s; + int error=0, len; TUNDEBUG (ifp, "read\n"); mtx_lock(&tp->tun_mtx); @@ -827,29 +802,21 @@ tunread(struct cdev *dev, struct uio *ui TUNDEBUG (ifp, "not ready 0%o\n", tp->tun_flags); return (EHOSTDOWN); } - - tp->tun_flags &= ~TUN_RWAIT; mtx_unlock(&tp->tun_mtx); - s = splimp(); do { IFQ_DEQUEUE(&ifp->if_snd, m); if (m == NULL) { if (flag & O_NONBLOCK) { - splx(s); return (EWOULDBLOCK); } mtx_lock(&tp->tun_mtx); - tp->tun_flags |= TUN_RWAIT; + error = cv_wait_sig(&tp->tun_rwait_cv, &tp->tun_mtx); mtx_unlock(&tp->tun_mtx); - if ((error = tsleep(tp, PCATCH | (PZERO + 1), - "tunread", 0)) != 0) { - splx(s); + if (error) return (error); - } } } while (m == NULL); - splx(s); while (m && uio->uio_resid > 0 && error == 0) { len = min(uio->uio_resid, m->m_len); @@ -962,13 +929,11 @@ tunwrite(struct cdev *dev, struct uio *u static int tunpoll(struct cdev *dev, int events, struct thread *td) { - int s; struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = TUN2IFP(tp); int revents = 0; struct mbuf *m; - s = splimp(); TUNDEBUG(ifp, "tunpoll\n"); if (events & (POLLIN | POLLRDNORM)) { @@ -986,7 +951,6 @@ tunpoll(struct cdev *dev, int events, st if (events & (POLLOUT | POLLWRNORM)) revents |= events & (POLLOUT | POLLWRNORM); - splx(s); return (revents); } @@ -1034,12 +998,11 @@ tunkqfilter(struct cdev *dev, struct kno static int tunkqread(struct knote *kn, long hint) { - int ret, s; + int ret; struct cdev *dev = (struct cdev *)(kn->kn_hook); struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = TUN2IFP(tp); - s = splimp(); if ((kn->kn_data = ifp->if_snd.ifq_len) > 0) { TUNDEBUG(ifp, "%s have data in the queue. Len = %d, minor = %#x\n", @@ -1051,7 +1014,6 @@ tunkqread(struct knote *kn, long hint) dev2unit(dev)); ret = 0; } - splx(s); return (ret); } @@ -1062,13 +1024,12 @@ tunkqread(struct knote *kn, long hint) static int tunkqwrite(struct knote *kn, long hint) { - int s; struct tun_softc *tp = ((struct cdev *)kn->kn_hook)->si_drv1; struct ifnet *ifp = TUN2IFP(tp); - s = splimp(); + mtx_lock(&tp->tun_mtx); kn->kn_data = ifp->if_mtu; - splx(s); + mtx_unlock(&tp->tun_mtx); return (1); }