From owner-svn-src-user@FreeBSD.ORG  Sun Jul  5 01:36:24 2009
Return-Path: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <des@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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 <bsd.prog.mk>

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 <sys/types.h>
+
+#include <assert.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+
+/*
+ * 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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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 <vm/vm_extern.h>
 #include <vm/uma.h>
 
+#ifdef	VM_MD_MINIDUMP
+#include <machine/md_var.h>
+#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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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 <vm/vm_phys.h>
 #include <vm/vm_extern.h>
 
+#ifdef VM_MD_MINIDUMP
+#include <machine/md_var.h>
+#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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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 <net/bpf.h>
-
 #include <net/if_gre.h>
 
+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 <machine/stdarg.h>
 
-#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: <owner-svn-src-user@FreeBSD.ORG>
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 <kmacy@FreeBSD.org>
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 &quot; user&quot;
	src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-user>,
	<mailto:svn-src-user-request@freebsd.org?subject=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);
 }