MFH@261244.
This commit is contained in:
parent
9c3c6fdae0
commit
5586616ed8
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user