MFH@261244.

This commit is contained in:
kaiw 2014-01-28 21:30:05 +00:00
parent 9c3c6fdae0
commit 5586616ed8
4 changed files with 32 additions and 42 deletions

View File

@ -1190,12 +1190,28 @@ acpi_set_resource(device_t dev, device_t child, int type, int rid,
struct acpi_softc *sc = device_get_softc(dev);
struct acpi_device *ad = device_get_ivars(child);
struct resource_list *rl = &ad->ad_rl;
ACPI_DEVICE_INFO *devinfo;
u_long end;
/* Ignore IRQ resources for PCI link devices. */
if (type == SYS_RES_IRQ && ACPI_ID_PROBE(dev, child, pcilink_ids) != NULL)
return (0);
/*
* Ignore memory resources for PCI root bridges. Some BIOSes
* incorrectly enumerate the memory ranges they decode as plain
* memory resources instead of as a ResourceProducer range.
*/
if (type == SYS_RES_MEMORY) {
if (ACPI_SUCCESS(AcpiGetObjectInfo(ad->ad_handle, &devinfo))) {
if ((devinfo->Flags & ACPI_PCI_ROOT_BRIDGE) != 0) {
AcpiOsFree(devinfo);
return (0);
}
AcpiOsFree(devinfo);
}
}
/* If the resource is already allocated, fail. */
if (resource_list_busy(rl, type, rid))
return (EBUSY);

View File

@ -2429,8 +2429,19 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
hhook_run_tcp_est_in(tp, th, &to);
if (SEQ_LEQ(th->th_ack, tp->snd_una)) {
if (tlen == 0 && tiwin == tp->snd_wnd &&
!(thflags & TH_FIN)) {
if (tlen == 0 && tiwin == tp->snd_wnd) {
/*
* If this is the first time we've seen a
* FIN from the remote, this is not a
* duplicate and it needs to be processed
* normally. This happens during a
* simultaneous close.
*/
if ((thflags & TH_FIN) &&
(TCPS_HAVERCVDFIN(tp->t_state) == 0)) {
tp->t_dupacks = 0;
break;
}
TCPSTAT_INC(tcps_rcvdupack);
/*
* If we have outstanding data (other than
@ -2485,16 +2496,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
}
} else
tp->snd_cwnd += tp->t_maxseg;
if ((thflags & TH_FIN) &&
(TCPS_HAVERCVDFIN(tp->t_state) == 0)) {
/*
* If its a fin we need to process
* it to avoid a race where both
* sides enter FIN-WAIT and send FIN|ACK
* at the same time.
*/
break;
}
(void) tcp_output(tp);
goto drop;
} else if (tp->t_dupacks == tcprexmtthresh) {
@ -2534,16 +2535,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
}
tp->snd_nxt = th->th_ack;
tp->snd_cwnd = tp->t_maxseg;
if ((thflags & TH_FIN) &&
(TCPS_HAVERCVDFIN(tp->t_state) == 0)) {
/*
* If its a fin we need to process
* it to avoid a race where both
* sides enter FIN-WAIT and send FIN|ACK
* at the same time.
*/
break;
}
(void) tcp_output(tp);
KASSERT(tp->snd_limited <= 2,
("%s: tp->snd_limited too big",
@ -2571,16 +2562,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
(tp->snd_nxt - tp->snd_una) +
(tp->t_dupacks - tp->snd_limited) *
tp->t_maxseg;
if ((thflags & TH_FIN) &&
(TCPS_HAVERCVDFIN(tp->t_state) == 0)) {
/*
* If its a fin we need to process
* it to avoid a race where both
* sides enter FIN-WAIT and send FIN|ACK
* at the same time.
*/
break;
}
/*
* Only call tcp_output when there
* is new data available to be sent.

View File

@ -682,7 +682,7 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
* connection when the SYN arrived. If we can't create
* the connection, abort it.
*/
so = sonewconn(lso, SS_ISCONNECTED);
so = sonewconn(lso, 0);
if (so == NULL) {
/*
* Drop the connection; we will either send a RST or
@ -922,6 +922,8 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
INP_WUNLOCK(inp);
soisconnected(so);
TCPSTAT_INC(tcps_accepts);
return (so);

View File

@ -610,13 +610,6 @@ tcp_usr_disconnect(struct socket *so)
/*
* Accept a connection. Essentially all the work is done at higher levels;
* just return the address of the peer, storing through addr.
*
* The rationale for acquiring the tcbinfo lock here is somewhat complicated,
* and is described in detail in the commit log entry for r175612. Acquiring
* it delays an accept(2) racing with sonewconn(), which inserts the socket
* before the inpcb address/port fields are initialized. A better fix would
* prevent the socket from being placed in the listen queue until all fields
* are fully initialized.
*/
static int
tcp_usr_accept(struct socket *so, struct sockaddr **nam)
@ -633,7 +626,6 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_accept: inp == NULL"));
INP_INFO_RLOCK(&V_tcbinfo);
INP_WLOCK(inp);
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNABORTED;
@ -653,7 +645,6 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
out:
TCPDEBUG2(PRU_ACCEPT);
INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&V_tcbinfo);
if (error == 0)
*nam = in_sockaddr(port, &addr);
return error;