PERFORCE change 167397 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Aug 16 10:17:22 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167397
Change 167397 by trasz at trasz_anger on 2009/08/16 10:16:36
IFC.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/share/man/man4/mfi.4#2 integrate
.. //depot/projects/soc2009/trasz_limits/share/man/man4/mpt.4#2 integrate
.. //depot/projects/soc2009/trasz_limits/share/man/man4/polling.4#2 integrate
.. //depot/projects/soc2009/trasz_limits/sys/arm/at91/uart_dev_at91usart.c#2 integrate
.. //depot/projects/soc2009/trasz_limits/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c#3 integrate
.. //depot/projects/soc2009/trasz_limits/sys/i386/xen/mp_machdep.c#7 integrate
.. //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/genassym.c#2 integrate
.. //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/machdep.c#4 integrate
.. //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/mp_machdep.c#4 integrate
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_poll.c#8 integrate
.. //depot/projects/soc2009/trasz_limits/sys/net/if_var.h#8 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_indata.c#4 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_input.c#3 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_output.c#3 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_pcb.c#3 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_timer.c#2 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctputil.c#4 integrate
.. //depot/projects/soc2009/trasz_limits/sys/netinet/sctputil.h#3 integrate
.. //depot/projects/soc2009/trasz_limits/usr.bin/calendar/calendars/calendar.freebsd#3 integrate
.. //depot/projects/soc2009/trasz_limits/usr.sbin/iostat/iostat.c#3 integrate
.. //depot/projects/soc2009/trasz_limits/usr.sbin/pstat/pstat.c#3 integrate
Differences ...
==== //depot/projects/soc2009/trasz_limits/share/man/man4/mfi.4#2 (text) ====
@@ -22,9 +22,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/share/man/man4/mfi.4,v 1.7 2008/01/17 19:36:13 ambrisko Exp $
+.\" $FreeBSD: src/share/man/man4/mfi.4,v 1.8 2009/08/15 11:47:05 trasz Exp $
.\"
-.Dd January 17, 2008
+.Dd August 15, 2009
.Dt MFI 4
.Os
.Sh NAME
@@ -102,6 +102,7 @@
An attempt was made to remove a mounted volume.
.El
.Sh SEE ALSO
+.Xr mfiutil 1 ,
.Xr amr 4 ,
.Xr pci 4
.Sh HISTORY
==== //depot/projects/soc2009/trasz_limits/share/man/man4/mpt.4#2 (text+ko) ====
@@ -33,9 +33,9 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/share/man/man4/mpt.4,v 1.16 2009/05/05 13:48:53 trasz Exp $
+.\" $FreeBSD: src/share/man/man4/mpt.4,v 1.17 2009/08/15 11:47:05 trasz Exp $
.\"
-.Dd April 6, 2007
+.Dd August 15, 2009
.Dt MPT 4
.Os
.Sh NAME
@@ -155,6 +155,7 @@
.Xr sa 4 ,
.Xr scsi 4 ,
.Xr targ 4 ,
+.Xr mptutil 8 ,
.Xr gmultipath 8
.Rs
.%T "LSI Logic Website"
==== //depot/projects/soc2009/trasz_limits/share/man/man4/polling.4#2 (text+ko) ====
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/share/man/man4/polling.4,v 1.27 2007/04/06 14:25:14 brueffer Exp $
+.\" $FreeBSD: src/share/man/man4/polling.4,v 1.28 2009/08/15 23:07:43 rwatson Exp $
.\"
.Dd April 6, 2007
.Dt POLLING 4
@@ -87,6 +87,16 @@
It is turned on and off with help of
.Xr ifconfig 8
command.
+.Pp
+The historic
+.Va kern.polling.enable ,
+which enabled polling for all interfaces, can be replaced with the following
+code:
+.Bd -literal
+for i in `ifconfig -l` ;
+ do ifconfig $i polling; # use -polling to disable
+done
+.Ed
.Ss MIB Variables
The operation of
.Nm
@@ -156,15 +166,6 @@
How many active devices have registered for
.Nm .
.Pp
-.It Va kern.polling.enable
-Legacy MIB, that was used to enable or disable polling globally.
-Currently if set to 1,
-.Nm
-is enabled on all capable interfaces.
-If set to 0,
-.Nm
-is disabled on all interfaces.
-.Pp
.It Va kern.polling.short_ticks
.It Va kern.polling.lost_polls
.It Va kern.polling.pending_polls
==== //depot/projects/soc2009/trasz_limits/sys/arm/at91/uart_dev_at91usart.c#2 (text) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.19 2009/01/22 21:56:41 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.20 2009/08/15 15:15:20 stas Exp $");
#include "opt_comconsole.h"
@@ -307,6 +307,10 @@
int
at91_usart_bus_probe(struct uart_softc *sc)
{
+
+ sc->sc_txfifosz = USART_BUFFER_SIZE;
+ sc->sc_rxfifosz = USART_BUFFER_SIZE;
+ sc->sc_hwiflow = 0;
return (0);
}
@@ -344,10 +348,6 @@
atsc->flags |= HAS_TIMEOUT;
WR4(&sc->sc_bas, USART_IDR, 0xffffffff);
- sc->sc_txfifosz = USART_BUFFER_SIZE;
- sc->sc_rxfifosz = USART_BUFFER_SIZE;
- sc->sc_hwiflow = 0;
-
#ifndef SKYEYE_WORKAROUNDS
/*
* Allocate DMA tags and maps
==== //depot/projects/soc2009/trasz_limits/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c#3 (text+ko) ====
@@ -2523,14 +2523,15 @@
{
if (nvs->nvs_op == NVS_OP_ENCODE) {
nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
- nvlist_t *packed = (void *)
+ char *packed = (void *)
(native->n_curr - nvp->nvp_size + NVP_VALOFF(nvp));
/*
* Null out the pointer that is meaningless in the packed
* structure. The address may not be aligned, so we have
* to use bzero.
*/
- bzero(&packed->nvl_priv, sizeof (packed->nvl_priv));
+ bzero(packed + offsetof(nvlist_t, nvl_priv),
+ sizeof(((nvlist_t *)NULL)->nvl_priv));
}
return (nvs_embedded(nvs, EMBEDDED_NVL(nvp)));
==== //depot/projects/soc2009/trasz_limits/sys/i386/xen/mp_machdep.c#7 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/xen/mp_machdep.c,v 1.22 2009/08/13 17:09:45 attilio Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/xen/mp_machdep.c,v 1.23 2009/08/15 18:37:06 attilio Exp $");
#include "opt_apic.h"
#include "opt_cpu.h"
@@ -118,6 +118,7 @@
typedef void call_data_func_t(uintptr_t , uintptr_t);
static u_int logical_cpus;
+static volatile cpumask_t ipi_nmi_pending;
/* used to hold the AP's until we are ready to release them */
static struct mtx ap_boot_mtx;
@@ -1109,6 +1110,14 @@
ipi = IPI_BITMAP_VECTOR;
}
+ /*
+ * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
+ * of help in order to understand what is the source.
+ * Set the mask of receiving CPUs for this purpose.
+ */
+ if (ipi == IPI_STOP_HARD)
+ atomic_set_int(&ipi_nmi_pending, cpus);
+
CTR3(KTR_SMP, "%s: cpus: %x ipi: %x", __func__, cpus, ipi);
while ((cpu = ffs(cpus)) != 0) {
cpu--;
@@ -1140,10 +1149,39 @@
void
ipi_all_but_self(u_int ipi)
{
+
+ /*
+ * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
+ * of help in order to understand what is the source.
+ * Set the mask of receiving CPUs for this purpose.
+ */
+ if (ipi == IPI_STOP_HARD)
+ atomic_set_int(&ipi_nmi_pending, PCPU_GET(other_cpus));
+
CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
ipi_selected(PCPU_GET(other_cpus), ipi);
}
+int
+ipi_nmi_handler()
+{
+ cpumask_t cpumask;
+
+ /*
+ * As long as there is not a simple way to know about a NMI's
+ * source, if the bitmask for the current CPU is present in
+ * the global pending bitword an IPI_STOP_HARD has been issued
+ * and should be handled.
+ */
+ cpumask = PCPU_GET(cpumask);
+ if ((ipi_nmi_pending & cpumask) == 0)
+ return (1);
+
+ atomic_clear_int(&ipi_nmi_pending, cpumask);
+ cpustop_handler();
+ return (0);
+}
+
/*
* Handle an IPI_STOP by saving our current context and spinning until we
* are resumed.
==== //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/genassym.c#2 (text+ko) ====
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/ia64/ia64/genassym.c,v 1.44 2006/11/18 21:48:13 marcel Exp $
+ * $FreeBSD: src/sys/ia64/ia64/genassym.c,v 1.45 2009/08/16 01:43:08 marcel Exp $
*/
#include "opt_compat.h"
@@ -91,7 +91,6 @@
ASSYM(PAGE_SHIFT, PAGE_SHIFT);
ASSYM(PAGE_SIZE, PAGE_SIZE);
-ASSYM(PC_CPUID, offsetof(struct pcpu, pc_cpuid));
ASSYM(PC_CURRENT_PMAP, offsetof(struct pcpu, pc_current_pmap));
ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
ASSYM(PC_IDLETHREAD, offsetof(struct pcpu, pc_idlethread));
==== //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/machdep.c#4 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.245 2009/06/23 22:42:39 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/machdep.c,v 1.246 2009/08/16 01:43:08 marcel Exp $");
#include "opt_compat.h"
#include "opt_ddb.h"
@@ -424,7 +424,11 @@
cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
{
- pcpu->pc_acpi_id = cpuid;
+ /*
+ * Set pc_acpi_id to "uninitialized".
+ * See sys/dev/acpica/acpi_cpu.c
+ */
+ pcpu->pc_acpi_id = 0xffffffff;
}
void
==== //depot/projects/soc2009/trasz_limits/sys/ia64/ia64/mp_machdep.c#4 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.74 2009/06/23 22:42:39 jeff Exp $");
+__FBSDID("$FreeBSD: src/sys/ia64/ia64/mp_machdep.c,v 1.75 2009/08/16 01:43:08 marcel Exp $");
#include "opt_kstack_pages.h"
@@ -208,31 +208,25 @@
struct pcpu *pc;
u_int64_t lid;
void *dpcpu;
+ u_int cpuid;
- /* Ignore any processor numbers outside our range */
- if (acpiid > mp_maxid)
- return;
+ lid = LID_SAPIC_SET(apicid, apiceid);
+ cpuid = ((ia64_get_lid() & LID_SAPIC_MASK) == lid) ? 0 : smp_cpus++;
- KASSERT((all_cpus & (1UL << acpiid)) == 0,
+ KASSERT((all_cpus & (1UL << cpuid)) == 0,
("%s: cpu%d already in CPU map", __func__, acpiid));
- lid = LID_SAPIC_SET(apicid, apiceid);
-
- if ((ia64_get_lid() & LID_SAPIC_MASK) == lid) {
- KASSERT(acpiid == 0,
- ("%s: the BSP must be cpu0", __func__));
- }
-
- if (acpiid != 0) {
+ if (cpuid != 0) {
pc = (struct pcpu *)malloc(sizeof(*pc), M_SMP, M_WAITOK);
+ pcpu_init(pc, cpuid, sizeof(*pc));
dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE);
- pcpu_init(pc, acpiid, sizeof(*pc));
- dpcpu_init(dpcpu, acpiid);
+ dpcpu_init(dpcpu, cpuid);
} else
pc = pcpup;
+ pc->pc_acpi_id = acpiid;
pc->pc_lid = lid;
- all_cpus |= (1UL << acpiid);
+ all_cpus |= (1UL << cpuid);
}
void
@@ -244,8 +238,8 @@
for (i = 0; i <= mp_maxid; i++) {
pc = pcpu_find(i);
if (pc != NULL) {
- printf("cpu%d: SAPIC Id=%x, SAPIC Eid=%x", i,
- LID_SAPIC_ID(pc->pc_lid),
+ printf("cpu%d: ACPI Id=%x, SAPIC Id=%x, SAPIC Eid=%x",
+ i, pc->pc_acpi_id, LID_SAPIC_ID(pc->pc_lid),
LID_SAPIC_EID(pc->pc_lid));
if (i == 0)
printf(" (BSP)\n");
@@ -305,7 +299,9 @@
SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
cpus++;
if (pc->pc_awake) {
- kproc_create(ia64_store_mca_state, (void*)((uintptr_t)pc->pc_cpuid), NULL, 0, 0, "mca %u", pc->pc_cpuid);
+ kproc_create(ia64_store_mca_state,
+ (void*)((uintptr_t)pc->pc_cpuid), NULL, 0, 0,
+ "mca %u", pc->pc_cpuid);
smp_cpus++;
}
}
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_poll.c#8 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_poll.c,v 1.45 2009/08/01 19:26:27 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_poll.c,v 1.46 2009/08/15 23:07:43 rwatson Exp $");
#include "opt_device_polling.h"
@@ -46,8 +46,6 @@
#include <net/netisr.h> /* for NETISR_POLL */
#include <net/vnet.h>
-static int poll_switch(SYSCTL_HANDLER_ARGS);
-
void hardclock_device_poll(void); /* hook from hardclock */
static struct mtx poll_mtx;
@@ -230,10 +228,6 @@
SYSCTL_UINT(_kern_polling, OID_AUTO, handlers, CTLFLAG_RD,
&poll_handlers, 0, "Number of registered poll handlers");
-static int polling = 0;
-SYSCTL_PROC(_kern_polling, OID_AUTO, enable, CTLTYPE_UINT | CTLFLAG_RW,
- 0, sizeof(int), poll_switch, "I", "Switch polling for all interfaces");
-
static uint32_t phase;
SYSCTL_UINT(_kern_polling, OID_AUTO, phase, CTLFLAG_RD,
&phase, 0, "Polling phase");
@@ -538,49 +532,6 @@
return (0);
}
-/*
- * Legacy interface for turning polling on all interfaces at one time.
- */
-static int
-poll_switch(SYSCTL_HANDLER_ARGS)
-{
- struct ifnet *ifp;
- int error;
- int val = polling;
-
- error = sysctl_handle_int(oidp, &val, 0, req);
- if (error || !req->newptr )
- return (error);
-
- if (val == polling)
- return (0);
-
- if (val < 0 || val > 1)
- return (EINVAL);
-
- polling = val;
-
- IFNET_RLOCK();
- TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
- if (ifp->if_capabilities & IFCAP_POLLING) {
- struct ifreq ifr;
-
- if (val == 1)
- ifr.ifr_reqcap =
- ifp->if_capenable | IFCAP_POLLING;
- else
- ifr.ifr_reqcap =
- ifp->if_capenable & ~IFCAP_POLLING;
- (void) (*ifp->if_ioctl)(ifp, SIOCSIFCAP, (caddr_t)&ifr);
- }
- }
- IFNET_RUNLOCK();
-
- log(LOG_ERR, "kern.polling.enable is deprecated. Use ifconfig(8)");
-
- return (0);
-}
-
static void
poll_idle(void)
{
==== //depot/projects/soc2009/trasz_limits/sys/net/if_var.h#8 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* From: @(#)if.h 8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/net/if_var.h,v 1.152 2009/07/27 17:08:06 qingli Exp $
+ * $FreeBSD: src/sys/net/if_var.h,v 1.153 2009/08/15 22:26:26 rwatson Exp $
*/
#ifndef _NET_IF_VAR_H_
@@ -235,7 +235,6 @@
#define if_iqdrops if_data.ifi_iqdrops
#define if_noproto if_data.ifi_noproto
#define if_lastchange if_data.ifi_lastchange
-#define if_rawoutput(if, m, sa) if_output(if, m, sa, (struct rtentry *)NULL)
/* for compatibility with other BSDs */
#define if_addrlist if_addrhead
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_indata.c#4 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctp_indata.c,v 1.36 2005/03/06 16:04:17 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctp_indata.c,v 1.64 2009/07/28 14:09:06 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_indata.c,v 1.65 2009/08/15 21:10:52 tuexen Exp $");
#include <netinet/sctp_os.h>
#include <netinet/sctp_var.h>
@@ -900,7 +900,7 @@
{
struct sctp_tmit_chunk *chk;
uint16_t nxt_todel;
- uint32_t tsize;
+ uint32_t tsize, pd_point;
doit_again:
chk = TAILQ_FIRST(&asoc->reasmqueue);
@@ -920,8 +920,13 @@
* Yep the first one is here and its ok to deliver
* but should we?
*/
- if ((sctp_is_all_msg_on_reasm(asoc, &tsize) ||
- (tsize >= stcb->sctp_ep->partial_delivery_point))) {
+ if (stcb->sctp_socket) {
+ pd_point = min(SCTP_SB_LIMIT_RCV(stcb->sctp_socket) >> SCTP_PARTIAL_DELIVERY_SHIFT,
+ stcb->sctp_ep->partial_delivery_point);
+ } else {
+ pd_point = stcb->sctp_ep->partial_delivery_point;
+ }
+ if (sctp_is_all_msg_on_reasm(asoc, &tsize) || (tsize >= pd_point)) {
/*
* Yes, we setup to start reception, by
@@ -2824,7 +2829,7 @@
sctp_service_queues(struct sctp_tcb *stcb, struct sctp_association *asoc)
{
struct sctp_tmit_chunk *chk;
- uint32_t tsize;
+ uint32_t tsize, pd_point;
uint16_t nxt_todel;
if (asoc->fragmented_delivery_inprogress) {
@@ -2860,8 +2865,13 @@
* be here or 1/4 the socket buffer max or nothing on the
* delivery queue and something can be delivered.
*/
- if ((sctp_is_all_msg_on_reasm(asoc, &tsize) ||
- (tsize >= stcb->sctp_ep->partial_delivery_point))) {
+ if (stcb->sctp_socket) {
+ pd_point = min(SCTP_SB_LIMIT_RCV(stcb->sctp_socket) >> SCTP_PARTIAL_DELIVERY_SHIFT,
+ stcb->sctp_ep->partial_delivery_point);
+ } else {
+ pd_point = stcb->sctp_ep->partial_delivery_point;
+ }
+ if (sctp_is_all_msg_on_reasm(asoc, &tsize) || (tsize >= pd_point)) {
asoc->fragmented_delivery_inprogress = 1;
asoc->tsn_last_delivered = chk->rec.data.TSN_seq - 1;
asoc->str_of_pdapi = chk->rec.data.stream_number;
@@ -5192,7 +5202,7 @@
/* sa_ignore NO_NULL_CHK */
sctp_free_bufspace(stcb, asoc, tp1, 1);
sctp_m_freem(tp1->data);
- if (PR_SCTP_BUF_ENABLED(tp1->flags)) {
+ if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(tp1->flags)) {
asoc->sent_queue_cnt_removeable--;
}
}
@@ -6289,10 +6299,11 @@
ctl->pdapi_aborted = 1;
sv = stcb->asoc.control_pdapi;
stcb->asoc.control_pdapi = ctl;
- sctp_notify_partial_delivery_indication(stcb,
+ sctp_ulp_notify(SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION,
+ stcb,
SCTP_PARTIAL_DELIVERY_ABORTED,
- SCTP_HOLDS_LOCK,
- str_seq);
+ (void *)&str_seq,
+ SCTP_SO_NOT_LOCKED);
stcb->asoc.control_pdapi = sv;
break;
} else if ((ctl->sinfo_stream == stseq->stream) &&
@@ -7786,7 +7797,7 @@
/* sa_ignore NO_NULL_CHK */
sctp_free_bufspace(stcb, asoc, tp1, 1);
sctp_m_freem(tp1->data);
- if (PR_SCTP_BUF_ENABLED(tp1->flags)) {
+ if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(tp1->flags)) {
asoc->sent_queue_cnt_removeable--;
}
}
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_input.c#3 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctp_input.c,v 1.27 2005/03/06 16:04:17 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctp_input.c,v 1.82 2009/06/17 12:34:56 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_input.c,v 1.83 2009/08/15 21:10:52 tuexen Exp $");
#include <netinet/sctp_os.h>
#include <netinet/sctp_var.h>
@@ -278,18 +278,38 @@
unsigned int newcnt;
struct sctp_stream_out *outs;
struct sctp_stream_queue_pending *sp;
+ struct sctp_tmit_chunk *chk, *chk_next;
- /* cut back on number of streams */
+ /* abandon the upper streams */
newcnt = ntohs(init->num_inbound_streams);
- /* This if is probably not needed but I am cautious */
+ if (!TAILQ_EMPTY(&asoc->send_queue)) {
+ chk = TAILQ_FIRST(&asoc->send_queue);
+ while (chk) {
+ chk_next = TAILQ_NEXT(chk, sctp_next);
+ if (chk->rec.data.stream_number >= newcnt) {
+ TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next);
+ asoc->send_queue_cnt--;
+ if (chk->data != NULL) {
+ sctp_free_bufspace(stcb, asoc, chk, 1);
+ sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb,
+ SCTP_NOTIFY_DATAGRAM_UNSENT, chk, SCTP_SO_NOT_LOCKED);
+ if (chk->data) {
+ sctp_m_freem(chk->data);
+ chk->data = NULL;
+ }
+ }
+ sctp_free_a_chunk(stcb, chk);
+ /* sa_ignore FREED_MEMORY */
+ }
+ chk = chk_next;
+ }
+ }
if (asoc->strmout) {
- /* First make sure no data chunks are trapped */
for (i = newcnt; i < asoc->pre_open_streams; i++) {
outs = &asoc->strmout[i];
sp = TAILQ_FIRST(&outs->outqueue);
while (sp) {
- TAILQ_REMOVE(&outs->outqueue, sp,
- next);
+ TAILQ_REMOVE(&outs->outqueue, sp, next);
asoc->stream_queue_cnt--;
sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL,
stcb, SCTP_NOTIFY_DATAGRAM_UNSENT,
@@ -301,16 +321,13 @@
sctp_free_remote_addr(sp->net);
sp->net = NULL;
/* Free the chunk */
- SCTP_PRINTF("sp:%p tcb:%p weird free case\n",
- sp, stcb);
-
sctp_free_a_strmoq(stcb, sp);
/* sa_ignore FREED_MEMORY */
sp = TAILQ_FIRST(&outs->outqueue);
}
}
}
- /* cut back the count and abandon the upper streams */
+ /* cut back the count */
asoc->pre_open_streams = newcnt;
}
SCTP_TCB_SEND_UNLOCK(stcb);
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_output.c#3 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctp_output.c,v 1.46 2005/03/06 16:04:17 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctp_output.c,v 1.88 2009/06/17 12:34:56 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_output.c,v 1.89 2009/08/15 21:10:52 tuexen Exp $");
#include <netinet/sctp_os.h>
#include <sys/proc.h>
@@ -4200,7 +4200,7 @@
/* place in my tag */
init->init.initiate_tag = htonl(stcb->asoc.my_vtag);
/* set up some of the credits. */
- init->init.a_rwnd = htonl(max(SCTP_SB_LIMIT_RCV(inp->sctp_socket),
+ init->init.a_rwnd = htonl(max(inp->sctp_socket ? SCTP_SB_LIMIT_RCV(inp->sctp_socket) : 0,
SCTP_MINIMAL_RWND));
init->init.num_outbound_streams = htons(stcb->asoc.pre_open_streams);
@@ -4411,7 +4411,6 @@
net->port, so_locked, NULL);
SCTPDBG(SCTP_DEBUG_OUTPUT4, "lowlevel_output - %d\n", ret);
SCTP_STAT_INCR_COUNTER64(sctps_outcontrolchunks);
- sctp_timer_start(SCTP_TIMER_TYPE_INIT, inp, stcb, net);
(void)SCTP_GETTIME_TIMEVAL(&net->last_sent_time);
}
@@ -5786,61 +5785,58 @@
}
static void
-sctp_set_prsctp_policy(struct sctp_tcb *stcb,
- struct sctp_stream_queue_pending *sp)
+sctp_set_prsctp_policy(struct sctp_stream_queue_pending *sp)
{
sp->pr_sctp_on = 0;
- if (stcb->asoc.peer_supports_prsctp) {
+ /*
+ * We assume that the user wants PR_SCTP_TTL if the user provides a
+ * positive lifetime but does not specify any PR_SCTP policy. This
+ * is a BAD assumption and causes problems at least with the
+ * U-Vancovers MPI folks. I will change this to be no policy means
+ * NO PR-SCTP.
+ */
+ if (PR_SCTP_ENABLED(sp->sinfo_flags)) {
+ sp->act_flags |= PR_SCTP_POLICY(sp->sinfo_flags);
+ sp->pr_sctp_on = 1;
+ } else {
+ return;
+ }
+ switch (PR_SCTP_POLICY(sp->sinfo_flags)) {
+ case CHUNK_FLAGS_PR_SCTP_BUF:
/*
- * We assume that the user wants PR_SCTP_TTL if the user
- * provides a positive lifetime but does not specify any
- * PR_SCTP policy. This is a BAD assumption and causes
- * problems at least with the U-Vancovers MPI folks. I will
- * change this to be no policy means NO PR-SCTP.
+ * Time to live is a priority stored in tv_sec when doing
+ * the buffer drop thing.
*/
- if (PR_SCTP_ENABLED(sp->sinfo_flags)) {
- sp->act_flags |= PR_SCTP_POLICY(sp->sinfo_flags);
- sp->pr_sctp_on = 1;
- } else {
- return;
- }
- switch (PR_SCTP_POLICY(sp->sinfo_flags)) {
- case CHUNK_FLAGS_PR_SCTP_BUF:
- /*
- * Time to live is a priority stored in tv_sec when
- * doing the buffer drop thing.
- */
- sp->ts.tv_sec = sp->timetolive;
- sp->ts.tv_usec = 0;
- break;
- case CHUNK_FLAGS_PR_SCTP_TTL:
- {
- struct timeval tv;
+ sp->ts.tv_sec = sp->timetolive;
+ sp->ts.tv_usec = 0;
+ break;
+ case CHUNK_FLAGS_PR_SCTP_TTL:
+ {
+ struct timeval tv;
- (void)SCTP_GETTIME_TIMEVAL(&sp->ts);
- tv.tv_sec = sp->timetolive / 1000;
- tv.tv_usec = (sp->timetolive * 1000) % 1000000;
- /*
- * TODO sctp_constants.h needs alternative
- * time macros when _KERNEL is undefined.
- */
- timevaladd(&sp->ts, &tv);
- }
- break;
- case CHUNK_FLAGS_PR_SCTP_RTX:
+ (void)SCTP_GETTIME_TIMEVAL(&sp->ts);
+ tv.tv_sec = sp->timetolive / 1000;
+ tv.tv_usec = (sp->timetolive * 1000) % 1000000;
/*
- * Time to live is a the number or retransmissions
- * stored in tv_sec.
+ * TODO sctp_constants.h needs alternative time
+ * macros when _KERNEL is undefined.
*/
- sp->ts.tv_sec = sp->timetolive;
- sp->ts.tv_usec = 0;
- break;
- default:
- SCTPDBG(SCTP_DEBUG_USRREQ1,
- "Unknown PR_SCTP policy %u.\n",
- PR_SCTP_POLICY(sp->sinfo_flags));
- break;
+ timevaladd(&sp->ts, &tv);
}
+ break;
+ case CHUNK_FLAGS_PR_SCTP_RTX:
+ /*
+ * Time to live is a the number or retransmissions stored in
+ * tv_sec.
+ */
+ sp->ts.tv_sec = sp->timetolive;
+ sp->ts.tv_usec = 0;
+ break;
+ default:
+ SCTPDBG(SCTP_DEBUG_USRREQ1,
+ "Unknown PR_SCTP policy %u.\n",
+ PR_SCTP_POLICY(sp->sinfo_flags));
+ break;
}
}
@@ -5911,7 +5907,7 @@
sp->tail_mbuf = NULL;
sp->length = 0;
at = m;
- sctp_set_prsctp_policy(stcb, sp);
+ sctp_set_prsctp_policy(sp);
/*
* We could in theory (for sendall) sifa the length in, but we would
* still have to hunt through the chain since we need to setup the
@@ -7138,7 +7134,7 @@
}
/* We only re-set the policy if it is on */
if (sp->pr_sctp_on) {
- sctp_set_prsctp_policy(stcb, sp);
+ sctp_set_prsctp_policy(sp);
asoc->pr_sctp_cnt++;
chk->pr_sctp_on = 1;
} else {
@@ -12285,7 +12281,7 @@
sp->addr_over = 0;
}
atomic_add_int(&sp->net->ref_count, 1);
- sctp_set_prsctp_policy(stcb, sp);
+ sctp_set_prsctp_policy(sp);
}
out_now:
return (sp);
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_pcb.c#3 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctp_pcb.c,v 1.38 2005/03/06 16:04:18 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctp_pcb.c,v 1.85 2009/05/30 11:14:41 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_pcb.c,v 1.86 2009/08/15 21:10:52 tuexen Exp $");
#include <netinet/sctp_os.h>
#include <sys/proc.h>
@@ -4547,8 +4547,11 @@
stcb->asoc.control_pdapi = sq;
strseq = (sq->sinfo_stream << 16) | sq->sinfo_ssn;
- sctp_notify_partial_delivery_indication(stcb,
- SCTP_PARTIAL_DELIVERY_ABORTED, 1, strseq);
+ sctp_ulp_notify(SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION,
+ stcb,
+ SCTP_PARTIAL_DELIVERY_ABORTED,
+ (void *)&strseq,
+ SCTP_SO_LOCKED);
stcb->asoc.control_pdapi = NULL;
}
}
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctp_timer.c#2 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctp_timer.c,v 1.29 2005/03/06 16:04:18 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctp_timer.c,v 1.43 2009/03/14 13:42:13 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_timer.c,v 1.44 2009/08/15 21:10:52 tuexen Exp $");
#define _IP_VHL
#include <netinet/sctp_os.h>
@@ -588,7 +588,7 @@
/* sa_ignore NO_NULL_CHK */
sctp_free_bufspace(stcb, asoc, chk, 1);
sctp_m_freem(chk->data);
- if (PR_SCTP_BUF_ENABLED(chk->flags)) {
+ if (asoc->peer_supports_prsctp && PR_SCTP_BUF_ENABLED(chk->flags)) {
asoc->sent_queue_cnt_removeable--;
}
}
@@ -757,7 +757,7 @@
continue;
}
}
- if (PR_SCTP_TTL_ENABLED(chk->flags)) {
+ if (stcb->asoc.peer_supports_prsctp && PR_SCTP_TTL_ENABLED(chk->flags)) {
/* Is it expired? */
if ((now.tv_sec > chk->rec.data.timetodrop.tv_sec) ||
((chk->rec.data.timetodrop.tv_sec == now.tv_sec) &&
@@ -772,7 +772,7 @@
continue;
}
}
- if (PR_SCTP_RTX_ENABLED(chk->flags)) {
+ if (stcb->asoc.peer_supports_prsctp && PR_SCTP_RTX_ENABLED(chk->flags)) {
/* Has it been retransmitted tv_sec times? */
if (chk->snd_count > chk->rec.data.timetodrop.tv_sec) {
if (chk->data) {
==== //depot/projects/soc2009/trasz_limits/sys/netinet/sctputil.c#4 (text+ko) ====
@@ -31,7 +31,7 @@
/* $KAME: sctputil.c,v 1.37 2005/03/07 23:26:09 itojun Exp $ */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/sctputil.c,v 1.93 2009/07/28 14:09:06 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/sctputil.c,v 1.94 2009/08/15 21:10:52 tuexen Exp $");
#include <netinet/sctp_os.h>
#include <netinet/sctp_pcb.h>
@@ -1484,6 +1484,7 @@
SCTP_INP_INCR_REF(inp);
if ((inp->sctp_socket == 0) &&
((tmr->type != SCTP_TIMER_TYPE_INPKILL) &&
+ (tmr->type != SCTP_TIMER_TYPE_INIT) &&
(tmr->type != SCTP_TIMER_TYPE_SEND) &&
(tmr->type != SCTP_TIMER_TYPE_RECV) &&
(tmr->type != SCTP_TIMER_TYPE_HEARTBEAT) &&
@@ -2984,8 +2985,6 @@
ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb);
ssf->ssf_assoc_id = sctp_get_associd(stcb);
- SCTP_BUF_NEXT(m_notify) = chk->data;
- SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed);
if (chk->data) {
/*
* trim off the sctp chunk header(it should be there)
@@ -2996,6 +2995,8 @@
chk->send_size -= sizeof(struct sctp_data_chunk);
}
}
+ SCTP_BUF_NEXT(m_notify) = chk->data;
+ SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_send_failed);
/* Steal off the mbuf */
chk->data = NULL;
/*
@@ -3146,9 +3147,13 @@
}
/* This always must be called with the read-queue LOCKED in the INP */
-void
+static void
sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error,
- int nolock, uint32_t val)
+ uint32_t val, int so_locked
+#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING)
+ SCTP_UNUSED
+#endif
+)
{
struct mbuf *m_notify;
struct sctp_pdapi_event *pdapi;
@@ -3189,9 +3194,6 @@
control->tail_mbuf = m_notify;
control->held_length = 0;
control->length = 0;
- if (nolock == 0) {
- SCTP_INP_READ_LOCK(stcb->sctp_ep);
- }
sb = &stcb->sctp_socket->so_rcv;
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m_notify));
@@ -3208,12 +3210,30 @@
/* we really should not see this case */
TAILQ_INSERT_TAIL(&stcb->sctp_ep->read_queue, control, next);
}
- if (nolock == 0) {
- SCTP_INP_READ_UNLOCK(stcb->sctp_ep);
- }
if (stcb->sctp_ep && stcb->sctp_socket) {
/* This should always be the case */
+#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+ struct socket *so;
+
+ so = SCTP_INP_SO(stcb->sctp_ep);
+ if (!so_locked) {
+ atomic_add_int(&stcb->asoc.refcnt, 1);
+ SCTP_TCB_UNLOCK(stcb);
+ SCTP_SOCKET_LOCK(so, 1);
+ SCTP_TCB_LOCK(stcb);
+ atomic_subtract_int(&stcb->asoc.refcnt, 1);
+ if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
+ SCTP_SOCKET_UNLOCK(so, 1);
+ return;
+ }
+ }
+#endif
sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket);
+#if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
+ if (!so_locked) {
+ SCTP_SOCKET_UNLOCK(so, 1);
+ }
+#endif
}
}
@@ -3540,9 +3560,9 @@
val = *((uint32_t *) data);
- sctp_notify_partial_delivery_indication(stcb, error, 0, val);
+ sctp_notify_partial_delivery_indication(stcb, error, val, so_locked);
+ break;
}
- break;
case SCTP_NOTIFY_STRDATA_ERR:
break;
case SCTP_NOTIFY_ASSOC_ABORTED:
@@ -3585,11 +3605,9 @@
case SCTP_NOTIFY_STR_RESET_FAILED_OUT:
sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), (SCTP_STRRESET_OUTBOUND_STR | SCTP_STRRESET_FAILED));
break;
-
case SCTP_NOTIFY_STR_RESET_FAILED_IN:
sctp_notify_stream_reset(stcb, error, ((uint16_t *) data), (SCTP_STRRESET_INBOUND_STR | SCTP_STRRESET_FAILED));
break;
-
case SCTP_NOTIFY_ASCONF_ADD_IP:
sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data,
error);
@@ -3671,8 +3689,10 @@
sctp_free_bufspace(stcb, asoc, chk, 1);
sctp_ulp_notify(SCTP_NOTIFY_DG_FAIL, stcb,
SCTP_NOTIFY_DATAGRAM_SENT, chk, so_locked);
- sctp_m_freem(chk->data);
- chk->data = NULL;
+ if (chk->data) {
+ sctp_m_freem(chk->data);
+ chk->data = NULL;
+ }
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list