Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Aug 2004 20:40:45 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 59018 for review
Message-ID:  <200408062040.i76KejKt028980@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=59018

Change 59018 by rwatson@rwatson_paprika on 2004/08/06 20:40:30

	Integrate netperf_socket from rwatson_netperf:
	
	More /dev/mem fixage.
	ACPI PCI interrupt routing foo. 
	Loop back of entropy harvesting KTR additions to ithread_schedule().
	Colin's modifications to callouts so that callout reset doesn't
	  recurse the callout mutex.
	Loop back of in6_pcbnotify() inpcb/pcbinfo locking fixes from
	  rwatson_netperf.

Affected files ...

.. //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#13 integrate
.. //depot/projects/netperf_socket/sys/amd64/amd64/mp_machdep.c#8 integrate
.. //depot/projects/netperf_socket/sys/boot/common/help.common#4 integrate
.. //depot/projects/netperf_socket/sys/boot/forth/loader.conf#11 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pci_link.c#7 integrate
.. //depot/projects/netperf_socket/sys/dev/fb/splash_bmp.c#1 branch
.. //depot/projects/netperf_socket/sys/dev/fb/splash_pcx.c#1 branch
.. //depot/projects/netperf_socket/sys/dev/uart/uart_dev_ns8250.c#6 integrate
.. //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.c#6 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_intr.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_switch.c#8 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_timeout.c#6 integrate
.. //depot/projects/netperf_socket/sys/net/if.c#15 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_subr.c#15 integrate
.. //depot/projects/netperf_socket/sys/netinet/udp_usrreq.c#10 integrate
.. //depot/projects/netperf_socket/sys/netinet6/in6_pcb.c#8 integrate
.. //depot/projects/netperf_socket/sys/netinet6/in6_pcb.h#5 integrate
.. //depot/projects/netperf_socket/sys/netinet6/raw_ip6.c#6 integrate
.. //depot/projects/netperf_socket/sys/netinet6/udp6_usrreq.c#7 integrate
.. //depot/projects/netperf_socket/sys/pci/if_xl.c#11 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/amd64/amd64/machdep.c#13 (text+ko) ====

@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.615 2004/07/31 14:02:29 davidxu Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/machdep.c,v 1.616 2004/08/06 07:20:32 markm Exp $");
 
 #include "opt_atalk.h"
 #include "opt_atpic.h"
@@ -65,6 +65,7 @@
 #include <sys/linker.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
+#include <sys/memrange.h>
 #include <sys/mutex.h>
 #include <sys/pcpu.h>
 #include <sys/proc.h>
@@ -164,6 +165,8 @@
 
 struct mtx icu_lock;
 
+struct mem_range_softc mem_range_softc;
+
 static void
 cpu_startup(dummy)
 	void *dummy;

==== //depot/projects/netperf_socket/sys/amd64/amd64/mp_machdep.c#8 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.240 2004/08/04 18:30:31 markm Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/mp_machdep.c,v 1.241 2004/08/06 07:22:36 markm Exp $");
 
 #include "opt_cpu.h"
 #include "opt_kstack_pages.h"
@@ -142,8 +142,6 @@
 static struct	sysctl_ctx_list logical_cpu_clist;
 static u_int	bootMP_size;
 
-struct mem_range_softc mem_range_softc;
-
 static void
 mem_range_AP_init(void)
 {

==== //depot/projects/netperf_socket/sys/boot/common/help.common#4 (text+ko) ====

@@ -205,7 +205,8 @@
 
 	Sets the list of directories which will be searched in for modules
 	named in a load command or implicitly required by a dependency. The
-	default module_path is "/boot/kernel;/boot/modules".
+	default module_path is "/boot/modules" with the kernel directory
+	prepended.
 
 ################################################################################
 # Tset Sprompt DSet the command prompt

==== //depot/projects/netperf_socket/sys/boot/forth/loader.conf#11 (text+ko) ====

@@ -6,7 +6,7 @@
 #
 # All arguments must be in double quotes.
 #
-# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.84 2004/07/29 20:08:40 ceri Exp $
+# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.85 2004/08/06 15:06:06 jmg Exp $
 
 ##############################################################
 ###  Basic configuration options  ############################
@@ -49,7 +49,7 @@
 #beastie_disable="NO"		# Turn the beastie boot menu on and off
 #console="vidconsole"		# Set the current console
 #currdev="disk1s1a"		# Set the current device
-module_path="/boot/kernel;/boot/modules"	# Set the module search path
+module_path="/boot/modules"	# Set the module search path
 #prompt="\\${interpret}"	# Set the command prompt
 #root_disk_unit="0"		# Force the root disk unit number
 #rootdev="disk1s1a"		# Set the root filesystem

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_pci_link.c#7 (text+ko) ====

@@ -28,7 +28,7 @@
 /* #define ACPI_OLD_PCI_LINK 1 */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.17 2004/08/05 06:54:16 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci_link.c,v 1.18 2004/08/06 04:50:56 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -76,13 +76,6 @@
 
 static int	irq_penalty[MAX_ACPI_INTERRUPTS];
 
-#ifdef ACPI_OLD_PCI_LINK
-#define ACPI_STA_PRESENT	0x00000001
-#define ACPI_STA_ENABLE		0x00000002
-#define ACPI_STA_SHOWINUI	0x00000004
-#define ACPI_STA_FUNCTIONAL	0x00000008
-#endif /* ACPI_OLD_PCI_LINK */
-
 /*
  * PCI link object management
  */
@@ -176,7 +169,6 @@
 	    (int)entry->prt.Pin);
 }
 
-#ifdef ACPI_OLD_PCI_LINK
 static ACPI_STATUS
 acpi_pci_link_get_object_status(ACPI_HANDLE handle, UINT32 *sta)
 {
@@ -221,7 +213,6 @@
 	AcpiOsFree(buf.Pointer);
 	return_ACPI_STATUS (AE_OK);
 }
-#endif /* ACPI_OLD_PCI_LINK */
 
 static ACPI_STATUS
 acpi_pci_link_get_irq_resources(ACPI_RESOURCE *resources,
@@ -446,9 +437,7 @@
 {
 	ACPI_HANDLE		handle;
 	ACPI_STATUS		error;
-#ifdef ACPI_OLD_PCI_LINK
 	UINT32			sta;
-#endif
 	struct acpi_prt_entry	*entry;
 
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
@@ -466,11 +455,6 @@
 		return_ACPI_STATUS (error);
 	}
 
-	/*
-	 * PCI link status (_STA) is unreliable.  Many systems return
-	 * erroneous values so we ignore it.
-	 */
-#ifdef ACPI_OLD_PCI_LINK
 	error = acpi_pci_link_get_object_status(handle, &sta);
 	if (ACPI_FAILURE(error)) {
 		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
@@ -479,13 +463,21 @@
 		return_ACPI_STATUS (error);
 	}
 
+	/*
+	 * PCI link status (_STA) is unreliable.  Many systems return
+	 * erroneous values so we ignore it.
+	 */
 	if ((sta & (ACPI_STA_PRESENT | ACPI_STA_FUNCTIONAL)) == 0) {
+#ifndef ACPI_OLD_PCI_LINK
+		device_printf(pcidev, "acpi PRT ignoring status for %s\n",
+		    acpi_name(handle));
+#else
 		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
 		    "interrupt link is not functional - %s\n",
 		    acpi_name(handle)));
 		return_ACPI_STATUS (AE_ERROR);
+#endif /* !ACPI_OLD_PCI_LINK */
 	}
-#endif /* ACPI_OLD_PCI_LINK */
 
 	TAILQ_FOREACH(entry, &acpi_prt_entries, links) {
 		if (entry->busno == busno &&
@@ -534,18 +526,31 @@
 	UINT8			i;
 
 	if (irq == 0)
-		return (0);
+		return (FALSE);
 
+#ifndef ACPI_OLD_PCI_LINK
+	/*
+	 * Look up the given interrupt in the list of possible settings for
+	 * this link.  We don't special-case the initial link setting.  Some
+	 * systems return current settings that are outside the list of valid
+	 * settings so only allow choices explicitly specified in _PRS.
+	 */
+#endif
 	for (i = 0; i < link->number_of_interrupts; i++) {
 		if (link->interrupts[i] == irq)
-			return (1);
+			return (TRUE);
 	}
 
 	/* allow initial IRQ as valid one. */
 	if (link->initial_irq == irq)
-		return (1);
+#ifndef ACPI_OLD_PCI_LINK
+		printf("acpi link check: %d initial irq, %d irq to route\n",
+		    link->initial_irq, irq);
+#else
+		return (TRUE);
+#endif
 
-	return (0);
+	return (FALSE);
 }
 
 static ACPI_STATUS
@@ -554,9 +559,7 @@
 	ACPI_STATUS		error;
 	ACPI_RESOURCE		resbuf;
 	ACPI_BUFFER		crsbuf;
-#ifdef ACPI_OLD_PCI_LINK
 	UINT32			sta;
-#endif
 
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -637,7 +640,6 @@
 	 * PCI link status (_STA) is unreliable.  Many systems return
 	 * erroneous values so we ignore it.
 	 */
-#ifdef ACPI_OLD_PCI_LINK
 	error = acpi_pci_link_get_object_status(link->handle, &sta);
 	if (ACPI_FAILURE(error)) {
 		ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -646,20 +648,23 @@
 		return_ACPI_STATUS (error);
 	}
 
-	if ((sta & ACPI_STA_ENABLE) == 0) {
+	if ((sta & ACPI_STA_ENABLED) == 0) {
+#ifndef ACPI_OLD_PCI_LINK
+		printf("acpi link set: ignoring status for %s\n",
+		    acpi_name(link->handle));
+#else
 		ACPI_DEBUG_PRINT((ACPI_DB_WARN,
 		    "interrupt link %s is disabled\n",
 		    acpi_name(link->handle)));
 		return_ACPI_STATUS (AE_ERROR);
+#endif /* !ACPI_OLD_PCI_LINK */
 	}
-#endif /* ACPI_OLD_PCI_LINK */
 
 	/*
 	 * Many systems always return invalid values for current settings
 	 * (_CRS).  Since we can't trust the value returned, we have to
 	 * assume we were successful.
 	 */
-#ifdef ACPI_OLD_PCI_LINK
 	error = acpi_pci_link_get_current_irq(link, &link->current_irq);
 	if (ACPI_FAILURE(error)) {
 		ACPI_DEBUG_PRINT((ACPI_DB_WARN,
@@ -671,13 +676,19 @@
 	if (link->current_irq == irq) {
 		error = AE_OK;
 	} else {
+#ifndef ACPI_OLD_PCI_LINK
+		printf("acpi link set: curr irq %d != %d for %s (ignoring)\n",
+		    link->current_irq, irq, acpi_name(link->handle));
+		link->current_irq = irq;
+		error = AE_OK;
+#else
 		ACPI_DEBUG_PRINT((ACPI_DB_WARN,
 		    "couldn't set IRQ %d to PCI interrupt link %d - %s\n",
 		    irq, link->current_irq, acpi_name(link->handle)));
 		link->current_irq = 0;
 		error = AE_ERROR;
+#endif /* !ACPI_OLD_PCI_LINK */
 	}
-#endif /* ACPI_OLD_PCI_LINK */
 
 	return_ACPI_STATUS (error);
 }

==== //depot/projects/netperf_socket/sys/dev/uart/uart_dev_ns8250.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.9 2004/07/26 03:54:40 marcel Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.10 2004/08/06 15:51:31 marcel Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -700,11 +700,19 @@
 	 */
 	sc->sc_txfifosz = 16;
 
+#if 0
+	/*
+	 * XXX there are some issues related to hardware flow control and
+	 * it's likely that uart(4) is the cause. This basicly needs more
+	 * investigation, but we avoid using for hardware flow control
+	 * until then.
+	 */
 	/* 16650s or higher have automatic flow control. */
 	if (sc->sc_rxfifosz > 16) {
 		sc->sc_hwiflow = 1;
 		sc->sc_hwoflow = 1;
 	}
+#endif
 
 	return (0);
 }

==== //depot/projects/netperf_socket/sys/geom/stripe/g_stripe.c#6 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/stripe/g_stripe.c,v 1.8 2004/07/26 17:14:47 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/stripe/g_stripe.c,v 1.11 2004/08/06 10:19:34 pjd Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -89,6 +89,9 @@
 TUNABLE_INT("kern.geom.stripe.maxmem", &g_stripe_maxmem);
 SYSCTL_UINT(_kern_geom_stripe, OID_AUTO, maxmem, CTLFLAG_RD, &g_stripe_maxmem,
     0, "Maximum memory that can be allocated in \"fast\" mode (in bytes)");
+static u_int g_stripe_fast_failed = 0;
+SYSCTL_UINT(_kern_geom_stripe, OID_AUTO, fast_failed, CTLFLAG_RD,
+    &g_stripe_fast_failed, 0, "How many times \"fast\" mode failed");
 
 /*
  * Greatest Common Divisor.
@@ -287,17 +290,17 @@
 	if (pbp->bio_error == 0)
 		pbp->bio_error = bp->bio_error;
 	pbp->bio_completed += bp->bio_completed;
-	if (bp->bio_cmd == BIO_READ && bp->bio_driver1 != NULL) {
-		g_stripe_copy(sc, bp->bio_data, bp->bio_driver1, bp->bio_offset,
+	if (bp->bio_cmd == BIO_READ && bp->bio_caller1 != NULL) {
+		g_stripe_copy(sc, bp->bio_data, bp->bio_caller1, bp->bio_offset,
 		    bp->bio_length, 1);
-		bp->bio_data = bp->bio_driver1;
-		bp->bio_driver1 = NULL;
+		bp->bio_data = bp->bio_caller1;
+		bp->bio_caller1 = NULL;
 	}
 	g_destroy_bio(bp);
 	pbp->bio_inbed++;
 	if (pbp->bio_children == pbp->bio_inbed) {
-		if (pbp->bio_caller1 != NULL)
-			uma_zfree(g_stripe_zone, pbp->bio_caller1);
+		if (pbp->bio_driver1 != NULL)
+			uma_zfree(g_stripe_zone, pbp->bio_driver1);
 		g_io_deliver(pbp, pbp->bio_error);
 	}
 }
@@ -330,9 +333,9 @@
 	cbp->bio_done = g_stripe_done;
 	cbp->bio_offset = offset;
 	cbp->bio_data = addr;
-	cbp->bio_driver1 = NULL;
+	cbp->bio_caller1 = NULL;
 	cbp->bio_length = length;
-	cbp->bio_driver2 = sc->sc_disks[no];
+	cbp->bio_caller2 = sc->sc_disks[no];
 
 	/* offset -= offset % stripesize; */
 	offset -= offset & (stripesize - 1);
@@ -356,8 +359,8 @@
 			 * (bp->bio_length % sc->sc_stripesize) != 0.
 			 */
 			cbp->bio_length += MIN(stripesize, length);
-			if (cbp->bio_driver1 == NULL) {
-				cbp->bio_driver1 = cbp->bio_data;
+			if (cbp->bio_caller1 == NULL) {
+				cbp->bio_caller1 = cbp->bio_data;
 				cbp->bio_data = NULL;
 				if (data == NULL) {
 					data = uma_zalloc(g_stripe_zone,
@@ -382,13 +385,13 @@
 			cbp->bio_done = g_stripe_done;
 			cbp->bio_offset = offset;
 			cbp->bio_data = addr;
-			cbp->bio_driver1 = NULL;
+			cbp->bio_caller1 = NULL;
 			/*
 			 * MIN() is in case when
 			 * (bp->bio_length % sc->sc_stripesize) != 0.
 			 */
 			cbp->bio_length = MIN(stripesize, length);
-			cbp->bio_driver2 = sc->sc_disks[no];
+			cbp->bio_caller2 = sc->sc_disks[no];
 		}
 	}
 	if (data != NULL)
@@ -400,13 +403,13 @@
 		struct g_consumer *cp;
 
 		TAILQ_REMOVE(&queue, cbp, bio_queue);
-		cp = cbp->bio_driver2;
-		cbp->bio_driver2 = NULL;
+		cp = cbp->bio_caller2;
+		cbp->bio_caller2 = NULL;
 		cbp->bio_to = cp->provider;
-		if (cbp->bio_driver1 != NULL) {
+		if (cbp->bio_caller1 != NULL) {
 			cbp->bio_data = data;
 			if (bp->bio_cmd == BIO_WRITE) {
-				g_stripe_copy(sc, cbp->bio_driver1, data,
+				g_stripe_copy(sc, cbp->bio_caller1, data,
 				    cbp->bio_offset, cbp->bio_length, 0);
 			}
 			data += cbp->bio_length;
@@ -420,10 +423,11 @@
 		uma_zfree(g_stripe_zone, data);
 	while ((cbp = TAILQ_FIRST(&queue)) != NULL) {
 		TAILQ_REMOVE(&queue, cbp, bio_queue);
-		if (cbp->bio_driver1 != NULL) {
-			cbp->bio_data = cbp->bio_driver1;
-			cbp->bio_driver1 = NULL;
+		if (cbp->bio_caller1 != NULL) {
+			cbp->bio_data = cbp->bio_caller1;
+			cbp->bio_caller1 = NULL;
 		}
+		bp->bio_children--;
 		g_destroy_bio(cbp);
 	}
 	return (error);
@@ -457,7 +461,7 @@
 	cbp->bio_offset = offset;
 	cbp->bio_data = addr;
 	cbp->bio_length = length;
-	cbp->bio_driver2 = sc->sc_disks[no];
+	cbp->bio_caller2 = sc->sc_disks[no];
 
 	/* offset -= offset % stripesize; */
 	offset -= offset & (stripesize - 1);
@@ -487,7 +491,7 @@
 		 */
 		cbp->bio_length = MIN(stripesize, length);
 
-		cbp->bio_driver2 = sc->sc_disks[no];
+		cbp->bio_caller2 = sc->sc_disks[no];
 	}
 	/*
 	 * Fire off all allocated requests!
@@ -496,8 +500,8 @@
 		struct g_consumer *cp;
 
 		TAILQ_REMOVE(&queue, cbp, bio_queue);
-		cp = cbp->bio_driver2;
-		cbp->bio_driver2 = NULL;
+		cp = cbp->bio_caller2;
+		cbp->bio_caller2 = NULL;
 		cbp->bio_to = cp->provider;
 		G_STRIPE_LOGREQ(cbp, "Sending request.");
 		g_io_request(cbp, cp);
@@ -506,6 +510,7 @@
 failure:
 	while ((cbp = TAILQ_FIRST(&queue)) != NULL) {
 		TAILQ_REMOVE(&queue, cbp, bio_queue);
+		bp->bio_children--;
 		g_destroy_bio(cbp);
 	}
 	return (error);
@@ -581,8 +586,11 @@
 		fast = 1;
 	}
 	error = 0;
-	if (fast)
+	if (fast) {
 		error = g_stripe_start_fast(bp, no, offset, length);
+		if (error != 0)
+			g_stripe_fast_failed++;
+	}
 	/*
 	 * Do use "economic" when:
 	 * 1. "Economic" mode is ON.

==== //depot/projects/netperf_socket/sys/kern/kern_intr.c#8 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_intr.c,v 1.111 2004/07/02 20:21:43 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_intr.c,v 1.112 2004/08/06 03:39:28 rwatson Exp $");
 
 #include "opt_ddb.h"
 
@@ -379,19 +379,21 @@
 		return (EINVAL);
 
 	ctd = curthread;
+	td = ithread->it_td;
+	p = td->td_proc;
 	/*
 	 * If any of the handlers for this ithread claim to be good
 	 * sources of entropy, then gather some.
 	 */
 	if (harvest.interrupt && ithread->it_flags & IT_ENTROPY) {
+		CTR3(KTR_INTR, "%s: pid %d (%s) gathering entropy", __func__,
+		    p->p_pid, p->p_comm);
 		entropy.vector = ithread->it_vector;
 		entropy.proc = ctd->td_proc;
 		random_harvest(&entropy, sizeof(entropy), 2, 0,
 		    RANDOM_INTERRUPT);
 	}
 
-	td = ithread->it_td;
-	p = td->td_proc;
 	KASSERT(p != NULL, ("ithread %s has no process", ithread->it_name));
 	CTR4(KTR_INTR, "%s: pid %d: (%s) need = %d",
 	    __func__, p->p_pid, p->p_comm, ithread->it_need);

==== //depot/projects/netperf_socket/sys/kern/kern_switch.c#8 (text+ko) ====

@@ -86,7 +86,7 @@
 ***/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.74 2004/07/27 16:41:01 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.75 2004/08/06 15:49:44 jhb Exp $");
 
 #include "opt_full_preemption.h"
 
@@ -537,6 +537,7 @@
 #endif
 }
 
+#if 0
 #ifndef PREEMPTION
 /* XXX: There should be a non-static version of this. */
 static void
@@ -549,6 +550,7 @@
 SYSINIT(preempt_warning, SI_SUB_COPYRIGHT, SI_ORDER_ANY, printf_caddr_t,
     preempt_warning)
 #endif
+#endif
 
 /************************************************************************
  * SYSTEM RUN QUEUE manipulations and tests				*

==== //depot/projects/netperf_socket/sys/kern/kern_timeout.c#6 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_timeout.c,v 1.89 2004/04/25 04:10:17 hmp Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_timeout.c,v 1.90 2004/08/06 02:44:58 cperciva Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -401,8 +401,22 @@
 		mtx_unlock_spin(&callout_lock);
 		return;
 	}
-	if (c->c_flags & CALLOUT_PENDING)
-		callout_stop(c);
+	if (c->c_flags & CALLOUT_PENDING) {
+		if (nextsoftcheck == c) {
+			nextsoftcheck = TAILQ_NEXT(c, c_links.tqe);
+		}
+		TAILQ_REMOVE(&callwheel[c->c_time & callwheelmask], c,
+		    c_links.tqe);
+
+		/*
+		 * Part of the normal "stop a pending callout" process
+		 * is to clear the CALLOUT_ACTIVE and CALLOUT_PENDING
+		 * flags.  We're not going to bother doing that here,
+		 * because we're going to be setting those flags ten lines
+		 * after this point, and we're holding callout_lock
+		 * between now and then.
+		 */
+	}
 
 	/*
 	 * We could unlock callout_lock here and lock it again before the

==== //depot/projects/netperf_socket/sys/net/if.c#15 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)if.c	8.5 (Berkeley) 1/9/95
- * $FreeBSD: src/sys/net/if.c,v 1.197 2004/07/27 23:20:44 rwatson Exp $
+ * $FreeBSD: src/sys/net/if.c,v 1.198 2004/08/06 09:08:33 roam Exp $
  */
 
 #include "opt_compat.h"
@@ -518,6 +518,8 @@
 	int s;
 	int i;
 	struct domain *dp;
+ 	struct ifnet *iter;
+ 	int found;
 
 	EVENTHANDLER_INVOKE(ifnet_departure_event, ifp);
 	/*
@@ -584,9 +586,11 @@
 
 
 	/* We can now free link ifaddr. */
-	ifa = TAILQ_FIRST(&ifp->if_addrhead);
-	TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
-	IFAFREE(ifa);
+	if (!TAILQ_EMPTY(&ifp->if_addrhead)) {
+		ifa = TAILQ_FIRST(&ifp->if_addrhead);
+		TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
+		IFAFREE(ifa);
+	}
 
 	/*
 	 * Delete all remaining routes using this interface
@@ -618,7 +622,14 @@
 #endif /* MAC */
 	KNOTE(&ifp->if_klist, NOTE_EXIT);
 	IFNET_WLOCK();
-	TAILQ_REMOVE(&ifnet, ifp, if_link);
+ 	found = 0;
+ 	TAILQ_FOREACH(iter, &ifnet, if_link)
+ 		if (iter == ifp) {
+ 			found = 1;
+ 			break;
+ 		}
+ 	if (found)
+ 		TAILQ_REMOVE(&ifnet, ifp, if_link);
 	IFNET_WUNLOCK();
 	mtx_destroy(&ifp->if_snd.ifq_mtx);
 	IF_AFDATA_DESTROY(ifp);

==== //depot/projects/netperf_socket/sys/netinet/tcp_subr.c#15 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)tcp_subr.c	8.2 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.196 2004/08/03 13:54:11 andre Exp $
+ * $FreeBSD: src/sys/netinet/tcp_subr.c,v 1.197 2004/08/06 03:45:45 rwatson Exp $
  */
 
 #include "opt_compat.h"
@@ -1236,7 +1236,7 @@
 		bzero(&th, sizeof(th));
 		m_copydata(m, off, sizeof(*thp), (caddr_t)&th);
 
-		in6_pcbnotify(&tcb, sa, th.th_dport,
+		in6_pcbnotify(&tcbinfo, sa, th.th_dport,
 		    (struct sockaddr *)ip6cp->ip6c_src,
 		    th.th_sport, cmd, NULL, notify);
 
@@ -1247,7 +1247,7 @@
 		inc.inc_isipv6 = 1;
 		syncache_unreach(&inc, &th);
 	} else
-		in6_pcbnotify(&tcb, sa, 0, (const struct sockaddr *)sa6_src,
+		in6_pcbnotify(&tcbinfo, sa, 0, (const struct sockaddr *)sa6_src,
 			      0, cmd, NULL, notify);
 }
 #endif /* INET6 */

==== //depot/projects/netperf_socket/sys/netinet/udp_usrreq.c#10 (text+ko) ====

@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)udp_usrreq.c	8.6 (Berkeley) 5/23/95
- * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.157 2004/07/26 07:24:03 cperciva Exp $
+ * $FreeBSD: src/sys/netinet/udp_usrreq.c,v 1.158 2004/08/06 02:08:31 rwatson Exp $
  */
 
 #include "opt_ipsec.h"
@@ -287,26 +287,23 @@
 		 */
 		last = NULL;
 		LIST_FOREACH(inp, &udb, inp_list) {
-			INP_LOCK(inp);
-			if (inp->inp_lport != uh->uh_dport) {
-		docontinue:
-				INP_UNLOCK(inp);
+			if (inp->inp_lport != uh->uh_dport)
 				continue;
-			}
 #ifdef INET6
 			if ((inp->inp_vflag & INP_IPV4) == 0)
-				goto docontinue;
+				continue;
 #endif
 			if (inp->inp_laddr.s_addr != INADDR_ANY) {
 				if (inp->inp_laddr.s_addr != ip->ip_dst.s_addr)
-					goto docontinue;
+					continue;
 			}
 			if (inp->inp_faddr.s_addr != INADDR_ANY) {
 				if (inp->inp_faddr.s_addr !=
 				    ip->ip_src.s_addr ||
 				    inp->inp_fport != uh->uh_sport)
-					goto docontinue;
+					continue;
 			}
+			INP_LOCK(inp);
 
 			/*
 			 * Check multicast packets to make sure they are only
@@ -327,8 +324,10 @@
 						break;
 					}
 				}
-				if (foundmship == 0)
-					goto docontinue;
+				if (foundmship == 0) {
+					INP_UNLOCK(inp);
+					continue;
+				}
 			}
 #undef NMSHIPS
 #undef MSHIP

==== //depot/projects/netperf_socket/sys/netinet6/in6_pcb.c#8 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_pcb.c,v 1.57 2004/07/28 13:03:07 yar Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_pcb.c,v 1.58 2004/08/06 03:45:45 rwatson Exp $	*/
 /*	$KAME: in6_pcb.c,v 1.31 2001/05/21 05:45:10 jinmei Exp $	*/
   
 /*
@@ -610,8 +610,8 @@
  * Must be called at splnet.
  */
 void
-in6_pcbnotify(head, dst, fport_arg, src, lport_arg, cmd, cmdarg, notify)
-	struct inpcbhead *head;
+in6_pcbnotify(pcbinfo, dst, fport_arg, src, lport_arg, cmd, cmdarg, notify)
+	struct inpcbinfo *pcbinfo;
 	struct sockaddr *dst;
 	const struct sockaddr *src;
 	u_int fport_arg, lport_arg;
@@ -619,6 +619,7 @@
 	void *cmdarg;
 	struct inpcb *(*notify) __P((struct inpcb *, int));
 {
+	struct inpcbhead *head;
 	struct inpcb *inp, *ninp;
 	struct sockaddr_in6 sa6_src, *sa6_dst;
 	u_short	fport = fport_arg, lport = lport_arg;
@@ -656,11 +657,16 @@
 	}
 	errno = inet6ctlerrmap[cmd];
 	s = splnet();
+	head = pcbinfo->listhead;
+	INP_INFO_WLOCK(pcbinfo);
  	for (inp = LIST_FIRST(head); inp != NULL; inp = ninp) {
+		INP_LOCK(inp);
  		ninp = LIST_NEXT(inp, inp_list);
 
- 		if ((inp->inp_vflag & INP_IPV6) == 0)
+ 		if ((inp->inp_vflag & INP_IPV6) == 0) {
+			INP_UNLOCK(inp);
 			continue;
+		}
 
 		/*
 		 * If the error designates a new path MTU for a destination
@@ -698,13 +704,17 @@
 			 (!IN6_IS_ADDR_UNSPECIFIED(&sa6_src.sin6_addr) &&
 			  !IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr,
 					      &sa6_src.sin6_addr)) ||
-			 (fport && inp->inp_fport != fport))
+			 (fport && inp->inp_fport != fport)) {
+			INP_UNLOCK(inp);
 			continue;
+		}
 
 	  do_notify:
 		if (notify)
 			(*notify)(inp, errno);
+		INP_UNLOCK(inp);
 	}
+	INP_INFO_WUNLOCK(pcbinfo);
 	splx(s);
 }
 

==== //depot/projects/netperf_socket/sys/netinet6/in6_pcb.h#5 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/in6_pcb.h,v 1.14 2004/04/07 20:46:15 imp Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/in6_pcb.h,v 1.15 2004/08/06 03:45:45 rwatson Exp $	*/
 /*	$KAME: in6_pcb.h,v 1.13 2001/02/06 09:16:53 itojun Exp $	*/
 
 /*
@@ -85,7 +85,7 @@
 	in6_pcblookup_hash __P((struct inpcbinfo *,
 				struct in6_addr *, u_int, struct in6_addr *,
 				u_int, int, struct ifnet *));
-void	in6_pcbnotify __P((struct inpcbhead *, struct sockaddr *,
+void	in6_pcbnotify __P((struct inpcbinfo *, struct sockaddr *,
 			   u_int, const struct sockaddr *, u_int, int, void *,
 			   struct inpcb *(*)(struct inpcb *, int)));
 struct inpcb *

==== //depot/projects/netperf_socket/sys/netinet6/raw_ip6.c#6 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/netinet6/raw_ip6.c,v 1.43 2004/07/27 23:45:19 rwatson Exp $
+ * $FreeBSD: src/sys/netinet6/raw_ip6.c,v 1.44 2004/08/06 03:45:45 rwatson Exp $
  */
 
 /*
@@ -298,7 +298,8 @@
 		sa6_src = &sa6_any;
 	}
 
-	(void) in6_pcbnotify(&ripcb, sa, 0, (const struct sockaddr *)sa6_src,
+	(void) in6_pcbnotify(&ripcbinfo, sa, 0,
+			     (const struct sockaddr *)sa6_src,
 			     0, cmd, cmdarg, notify);
 }
 

==== //depot/projects/netperf_socket/sys/netinet6/udp6_usrreq.c#7 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/netinet6/udp6_usrreq.c,v 1.50 2004/07/27 23:45:19 rwatson Exp $	*/
+/*	$FreeBSD: src/sys/netinet6/udp6_usrreq.c,v 1.51 2004/08/06 03:45:45 rwatson Exp $	*/
 /*	$KAME: udp6_usrreq.c,v 1.27 2001/05/21 05:45:10 jinmei Exp $	*/
 
 /*
@@ -444,11 +444,11 @@
 		bzero(&uh, sizeof(uh));
 		m_copydata(m, off, sizeof(*uhp), (caddr_t)&uh);
 
-		(void) in6_pcbnotify(&udb, sa, uh.uh_dport,
+		(void) in6_pcbnotify(&udbinfo, sa, uh.uh_dport,
 				     (struct sockaddr *)ip6cp->ip6c_src,
 				     uh.uh_sport, cmd, cmdarg, notify);
 	} else
-		(void) in6_pcbnotify(&udb, sa, 0,
+		(void) in6_pcbnotify(&udbinfo, sa, 0,
 				     (const struct sockaddr *)sa6_src,
 				     0, cmd, cmdarg, notify);
 }

==== //depot/projects/netperf_socket/sys/pci/if_xl.c#11 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/pci/if_xl.c,v 1.178 2004/07/09 02:28:23 bms Exp $");
+__FBSDID("$FreeBSD: src/sys/pci/if_xl.c,v 1.179 2004/08/06 09:08:33 roam Exp $");
 
 /*
  * 3Com 3c90x Etherlink XL PCI NIC driver
@@ -3169,7 +3169,8 @@
 			sc->xl_cdata.xl_rx_chain[i].xl_mbuf = NULL;
 		}
 	}
-	bzero(sc->xl_ldata.xl_rx_list, XL_RX_LIST_SZ);
+	if (sc->xl_ldata.xl_rx_list != NULL)
+		bzero(sc->xl_ldata.xl_rx_list, XL_RX_LIST_SZ);
 	/*
 	 * Free the TX list buffers.
 	 */
@@ -3183,7 +3184,8 @@
 			sc->xl_cdata.xl_tx_chain[i].xl_mbuf = NULL;
 		}
 	}
-	bzero(sc->xl_ldata.xl_tx_list, XL_TX_LIST_SZ);
+	if (sc->xl_ldata.xl_tx_list != NULL)
+		bzero(sc->xl_ldata.xl_tx_list, XL_TX_LIST_SZ);
 
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200408062040.i76KejKt028980>