Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
commit
c337ffb68e
|
@ -2561,15 +2561,12 @@ enslaved.
|
||||||
The latest version of the bonding driver can be found in the latest
|
The latest version of the bonding driver can be found in the latest
|
||||||
version of the linux kernel, found on http://kernel.org
|
version of the linux kernel, found on http://kernel.org
|
||||||
|
|
||||||
The latest version of this document can be found in either the latest
|
The latest version of this document can be found in the latest kernel
|
||||||
kernel source (named Documentation/networking/bonding.txt), or on the
|
source (named Documentation/networking/bonding.txt).
|
||||||
bonding sourceforge site:
|
|
||||||
|
|
||||||
http://www.sourceforge.net/projects/bonding
|
Discussions regarding the usage of the bonding driver take place on the
|
||||||
|
bonding-devel mailing list, hosted at sourceforge.net. If you have questions or
|
||||||
Discussions regarding the bonding driver take place primarily on the
|
problems, post them to the list. The list address is:
|
||||||
bonding-devel mailing list, hosted at sourceforge.net. If you have
|
|
||||||
questions or problems, post them to the list. The list address is:
|
|
||||||
|
|
||||||
bonding-devel@lists.sourceforge.net
|
bonding-devel@lists.sourceforge.net
|
||||||
|
|
||||||
|
@ -2578,6 +2575,17 @@ be found at:
|
||||||
|
|
||||||
https://lists.sourceforge.net/lists/listinfo/bonding-devel
|
https://lists.sourceforge.net/lists/listinfo/bonding-devel
|
||||||
|
|
||||||
|
Discussions regarding the developpement of the bonding driver take place
|
||||||
|
on the main Linux network mailing list, hosted at vger.kernel.org. The list
|
||||||
|
address is:
|
||||||
|
|
||||||
|
netdev@vger.kernel.org
|
||||||
|
|
||||||
|
The administrative interface (to subscribe or unsubscribe) can
|
||||||
|
be found at:
|
||||||
|
|
||||||
|
http://vger.kernel.org/vger-lists.html#netdev
|
||||||
|
|
||||||
Donald Becker's Ethernet Drivers and diag programs may be found at :
|
Donald Becker's Ethernet Drivers and diag programs may be found at :
|
||||||
- http://web.archive.org/web/*/http://www.scyld.com/network/
|
- http://web.archive.org/web/*/http://www.scyld.com/network/
|
||||||
|
|
||||||
|
|
|
@ -425,11 +425,6 @@ static irqreturn_t ariadne_interrupt(int irq, void *data)
|
||||||
int csr0, boguscnt;
|
int csr0, boguscnt;
|
||||||
int handled = 0;
|
int handled = 0;
|
||||||
|
|
||||||
if (dev == NULL) {
|
|
||||||
printk(KERN_WARNING "ariadne_interrupt(): irq for unknown device.\n");
|
|
||||||
return IRQ_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
lance->RAP = CSR0; /* PCnet-ISA Controller Status */
|
lance->RAP = CSR0; /* PCnet-ISA Controller Status */
|
||||||
|
|
||||||
if (!(lance->RDP & INTR)) /* Check if any interrupt has been */
|
if (!(lance->RDP & INTR)) /* Check if any interrupt has been */
|
||||||
|
|
|
@ -4229,7 +4229,7 @@ void bnx2x_update_coalesce(struct bnx2x *bp)
|
||||||
|
|
||||||
for_each_eth_queue(bp, i)
|
for_each_eth_queue(bp, i)
|
||||||
bnx2x_update_coalesce_sb(bp, bp->fp[i].fw_sb_id,
|
bnx2x_update_coalesce_sb(bp, bp->fp[i].fw_sb_id,
|
||||||
bp->rx_ticks, bp->tx_ticks);
|
bp->tx_ticks, bp->rx_ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bnx2x_init_sp_ring(struct bnx2x *bp)
|
static void bnx2x_init_sp_ring(struct bnx2x *bp)
|
||||||
|
|
|
@ -659,7 +659,7 @@ failed:
|
||||||
static void unlink_all_urbs(struct esd_usb2 *dev)
|
static void unlink_all_urbs(struct esd_usb2 *dev)
|
||||||
{
|
{
|
||||||
struct esd_usb2_net_priv *priv;
|
struct esd_usb2_net_priv *priv;
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
usb_kill_anchored_urbs(&dev->rx_submitted);
|
usb_kill_anchored_urbs(&dev->rx_submitted);
|
||||||
for (i = 0; i < dev->net_count; i++) {
|
for (i = 0; i < dev->net_count; i++) {
|
||||||
|
@ -668,8 +668,8 @@ static void unlink_all_urbs(struct esd_usb2 *dev)
|
||||||
usb_kill_anchored_urbs(&priv->tx_submitted);
|
usb_kill_anchored_urbs(&priv->tx_submitted);
|
||||||
atomic_set(&priv->active_tx_jobs, 0);
|
atomic_set(&priv->active_tx_jobs, 0);
|
||||||
|
|
||||||
for (i = 0; i < MAX_TX_URBS; i++)
|
for (j = 0; j < MAX_TX_URBS; j++)
|
||||||
priv->tx_contexts[i].echo_index = MAX_TX_URBS;
|
priv->tx_contexts[j].echo_index = MAX_TX_URBS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1730,7 +1730,7 @@ static struct net_device_stats *emac_dev_getnetstats(struct net_device *ndev)
|
||||||
emac_read(EMAC_TXCARRIERSENSE);
|
emac_read(EMAC_TXCARRIERSENSE);
|
||||||
emac_write(EMAC_TXCARRIERSENSE, stats_clear_mask);
|
emac_write(EMAC_TXCARRIERSENSE, stats_clear_mask);
|
||||||
|
|
||||||
ndev->stats.tx_fifo_errors = emac_read(EMAC_TXUNDERRUN);
|
ndev->stats.tx_fifo_errors += emac_read(EMAC_TXUNDERRUN);
|
||||||
emac_write(EMAC_TXUNDERRUN, stats_clear_mask);
|
emac_write(EMAC_TXUNDERRUN, stats_clear_mask);
|
||||||
|
|
||||||
return &ndev->stats;
|
return &ndev->stats;
|
||||||
|
|
|
@ -219,9 +219,11 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
const struct macvlan_dev *vlan = netdev_priv(dev);
|
const struct macvlan_dev *vlan = netdev_priv(dev);
|
||||||
const struct macvlan_port *port = vlan->port;
|
const struct macvlan_port *port = vlan->port;
|
||||||
const struct macvlan_dev *dest;
|
const struct macvlan_dev *dest;
|
||||||
|
__u8 ip_summed = skb->ip_summed;
|
||||||
|
|
||||||
if (vlan->mode == MACVLAN_MODE_BRIDGE) {
|
if (vlan->mode == MACVLAN_MODE_BRIDGE) {
|
||||||
const struct ethhdr *eth = (void *)skb->data;
|
const struct ethhdr *eth = (void *)skb->data;
|
||||||
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
|
|
||||||
/* send to other bridge ports directly */
|
/* send to other bridge ports directly */
|
||||||
if (is_multicast_ether_addr(eth->h_dest)) {
|
if (is_multicast_ether_addr(eth->h_dest)) {
|
||||||
|
@ -241,6 +243,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
xmit_world:
|
xmit_world:
|
||||||
|
skb->ip_summed = ip_summed;
|
||||||
skb_set_dev(skb, vlan->lowerdev);
|
skb_set_dev(skb, vlan->lowerdev);
|
||||||
return dev_queue_xmit(skb);
|
return dev_queue_xmit(skb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -791,8 +791,8 @@ static int smsc911x_mii_probe(struct net_device *dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMSC_TRACE(PROBE, "PHY %d: addr %d, phy_id 0x%08X",
|
SMSC_TRACE(PROBE, "PHY: addr %d, phy_id 0x%08X",
|
||||||
phy_addr, phydev->addr, phydev->phy_id);
|
phydev->addr, phydev->phy_id);
|
||||||
|
|
||||||
ret = phy_connect_direct(dev, phydev,
|
ret = phy_connect_direct(dev, phydev,
|
||||||
&smsc911x_phy_adjust_link, 0,
|
&smsc911x_phy_adjust_link, 0,
|
||||||
|
|
|
@ -328,13 +328,13 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
static const char ifname[] = "usbpn%d";
|
static const char ifname[] = "usbpn%d";
|
||||||
const struct usb_cdc_union_desc *union_header = NULL;
|
const struct usb_cdc_union_desc *union_header = NULL;
|
||||||
const struct usb_cdc_header_desc *phonet_header = NULL;
|
|
||||||
const struct usb_host_interface *data_desc;
|
const struct usb_host_interface *data_desc;
|
||||||
struct usb_interface *data_intf;
|
struct usb_interface *data_intf;
|
||||||
struct usb_device *usbdev = interface_to_usbdev(intf);
|
struct usb_device *usbdev = interface_to_usbdev(intf);
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
struct usbpn_dev *pnd;
|
struct usbpn_dev *pnd;
|
||||||
u8 *data;
|
u8 *data;
|
||||||
|
int phonet = 0;
|
||||||
int len, err;
|
int len, err;
|
||||||
|
|
||||||
data = intf->altsetting->extra;
|
data = intf->altsetting->extra;
|
||||||
|
@ -355,10 +355,7 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
(struct usb_cdc_union_desc *)data;
|
(struct usb_cdc_union_desc *)data;
|
||||||
break;
|
break;
|
||||||
case 0xAB:
|
case 0xAB:
|
||||||
if (phonet_header || dlen < 5)
|
phonet = 1;
|
||||||
break;
|
|
||||||
phonet_header =
|
|
||||||
(struct usb_cdc_header_desc *)data;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -366,7 +363,7 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
len -= dlen;
|
len -= dlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!union_header || !phonet_header)
|
if (!union_header || !phonet)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
data_intf = usb_ifnum_to_if(usbdev, union_header->bSlaveInterface0);
|
data_intf = usb_ifnum_to_if(usbdev, union_header->bSlaveInterface0);
|
||||||
|
@ -392,7 +389,6 @@ int usbpn_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||||
|
|
||||||
pnd = netdev_priv(dev);
|
pnd = netdev_priv(dev);
|
||||||
SET_NETDEV_DEV(dev, &intf->dev);
|
SET_NETDEV_DEV(dev, &intf->dev);
|
||||||
netif_stop_queue(dev);
|
|
||||||
|
|
||||||
pnd->dev = dev;
|
pnd->dev = dev;
|
||||||
pnd->usb = usb_get_dev(usbdev);
|
pnd->usb = usb_get_dev(usbdev);
|
||||||
|
|
|
@ -122,7 +122,7 @@ struct netfront_info {
|
||||||
struct mmu_update rx_mmu[NET_RX_RING_SIZE];
|
struct mmu_update rx_mmu[NET_RX_RING_SIZE];
|
||||||
|
|
||||||
/* Statistics */
|
/* Statistics */
|
||||||
int rx_gso_checksum_fixup;
|
unsigned long rx_gso_checksum_fixup;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct netfront_rx_info {
|
struct netfront_rx_info {
|
||||||
|
@ -1692,7 +1692,7 @@ static void xennet_get_ethtool_stats(struct net_device *dev,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(xennet_stats); i++)
|
for (i = 0; i < ARRAY_SIZE(xennet_stats); i++)
|
||||||
data[i] = *(int *)(np + xennet_stats[i].offset);
|
data[i] = *(unsigned long *)(np + xennet_stats[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xennet_get_strings(struct net_device *dev, u32 stringset, u8 * data)
|
static void xennet_get_strings(struct net_device *dev, u32 stringset, u8 * data)
|
||||||
|
|
|
@ -375,12 +375,12 @@ static void br_make_forwarding(struct net_bridge_port *p)
|
||||||
if (p->state != BR_STATE_BLOCKING)
|
if (p->state != BR_STATE_BLOCKING)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (br->forward_delay == 0) {
|
if (br->stp_enabled == BR_NO_STP || br->forward_delay == 0) {
|
||||||
p->state = BR_STATE_FORWARDING;
|
p->state = BR_STATE_FORWARDING;
|
||||||
br_topology_change_detection(br);
|
br_topology_change_detection(br);
|
||||||
del_timer(&p->forward_delay_timer);
|
del_timer(&p->forward_delay_timer);
|
||||||
}
|
}
|
||||||
else if (p->br->stp_enabled == BR_KERNEL_STP)
|
else if (br->stp_enabled == BR_KERNEL_STP)
|
||||||
p->state = BR_STATE_LISTENING;
|
p->state = BR_STATE_LISTENING;
|
||||||
else
|
else
|
||||||
p->state = BR_STATE_LEARNING;
|
p->state = BR_STATE_LEARNING;
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
/* Number of delay samples for detecting the increase of delay */
|
/* Number of delay samples for detecting the increase of delay */
|
||||||
#define HYSTART_MIN_SAMPLES 8
|
#define HYSTART_MIN_SAMPLES 8
|
||||||
#define HYSTART_DELAY_MIN (2U<<3)
|
#define HYSTART_DELAY_MIN (4U<<3)
|
||||||
#define HYSTART_DELAY_MAX (16U<<3)
|
#define HYSTART_DELAY_MAX (16U<<3)
|
||||||
#define HYSTART_DELAY_THRESH(x) clamp(x, HYSTART_DELAY_MIN, HYSTART_DELAY_MAX)
|
#define HYSTART_DELAY_THRESH(x) clamp(x, HYSTART_DELAY_MIN, HYSTART_DELAY_MAX)
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ static int tcp_friendliness __read_mostly = 1;
|
||||||
static int hystart __read_mostly = 1;
|
static int hystart __read_mostly = 1;
|
||||||
static int hystart_detect __read_mostly = HYSTART_ACK_TRAIN | HYSTART_DELAY;
|
static int hystart_detect __read_mostly = HYSTART_ACK_TRAIN | HYSTART_DELAY;
|
||||||
static int hystart_low_window __read_mostly = 16;
|
static int hystart_low_window __read_mostly = 16;
|
||||||
|
static int hystart_ack_delta __read_mostly = 2;
|
||||||
|
|
||||||
static u32 cube_rtt_scale __read_mostly;
|
static u32 cube_rtt_scale __read_mostly;
|
||||||
static u32 beta_scale __read_mostly;
|
static u32 beta_scale __read_mostly;
|
||||||
|
@ -75,6 +76,8 @@ MODULE_PARM_DESC(hystart_detect, "hyrbrid slow start detection mechanisms"
|
||||||
" 1: packet-train 2: delay 3: both packet-train and delay");
|
" 1: packet-train 2: delay 3: both packet-train and delay");
|
||||||
module_param(hystart_low_window, int, 0644);
|
module_param(hystart_low_window, int, 0644);
|
||||||
MODULE_PARM_DESC(hystart_low_window, "lower bound cwnd for hybrid slow start");
|
MODULE_PARM_DESC(hystart_low_window, "lower bound cwnd for hybrid slow start");
|
||||||
|
module_param(hystart_ack_delta, int, 0644);
|
||||||
|
MODULE_PARM_DESC(hystart_ack_delta, "spacing between ack's indicating train (msecs)");
|
||||||
|
|
||||||
/* BIC TCP Parameters */
|
/* BIC TCP Parameters */
|
||||||
struct bictcp {
|
struct bictcp {
|
||||||
|
@ -85,7 +88,7 @@ struct bictcp {
|
||||||
u32 last_time; /* time when updated last_cwnd */
|
u32 last_time; /* time when updated last_cwnd */
|
||||||
u32 bic_origin_point;/* origin point of bic function */
|
u32 bic_origin_point;/* origin point of bic function */
|
||||||
u32 bic_K; /* time to origin point from the beginning of the current epoch */
|
u32 bic_K; /* time to origin point from the beginning of the current epoch */
|
||||||
u32 delay_min; /* min delay */
|
u32 delay_min; /* min delay (msec << 3) */
|
||||||
u32 epoch_start; /* beginning of an epoch */
|
u32 epoch_start; /* beginning of an epoch */
|
||||||
u32 ack_cnt; /* number of acks */
|
u32 ack_cnt; /* number of acks */
|
||||||
u32 tcp_cwnd; /* estimated tcp cwnd */
|
u32 tcp_cwnd; /* estimated tcp cwnd */
|
||||||
|
@ -95,7 +98,7 @@ struct bictcp {
|
||||||
u8 found; /* the exit point is found? */
|
u8 found; /* the exit point is found? */
|
||||||
u32 round_start; /* beginning of each round */
|
u32 round_start; /* beginning of each round */
|
||||||
u32 end_seq; /* end_seq of the round */
|
u32 end_seq; /* end_seq of the round */
|
||||||
u32 last_jiffies; /* last time when the ACK spacing is close */
|
u32 last_ack; /* last time when the ACK spacing is close */
|
||||||
u32 curr_rtt; /* the minimum rtt of current round */
|
u32 curr_rtt; /* the minimum rtt of current round */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -116,12 +119,21 @@ static inline void bictcp_reset(struct bictcp *ca)
|
||||||
ca->found = 0;
|
ca->found = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline u32 bictcp_clock(void)
|
||||||
|
{
|
||||||
|
#if HZ < 1000
|
||||||
|
return ktime_to_ms(ktime_get_real());
|
||||||
|
#else
|
||||||
|
return jiffies_to_msecs(jiffies);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline void bictcp_hystart_reset(struct sock *sk)
|
static inline void bictcp_hystart_reset(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct tcp_sock *tp = tcp_sk(sk);
|
struct tcp_sock *tp = tcp_sk(sk);
|
||||||
struct bictcp *ca = inet_csk_ca(sk);
|
struct bictcp *ca = inet_csk_ca(sk);
|
||||||
|
|
||||||
ca->round_start = ca->last_jiffies = jiffies;
|
ca->round_start = ca->last_ack = bictcp_clock();
|
||||||
ca->end_seq = tp->snd_nxt;
|
ca->end_seq = tp->snd_nxt;
|
||||||
ca->curr_rtt = 0;
|
ca->curr_rtt = 0;
|
||||||
ca->sample_cnt = 0;
|
ca->sample_cnt = 0;
|
||||||
|
@ -236,8 +248,8 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* change the unit from HZ to bictcp_HZ */
|
/* change the unit from HZ to bictcp_HZ */
|
||||||
t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start)
|
t = ((tcp_time_stamp + msecs_to_jiffies(ca->delay_min>>3)
|
||||||
<< BICTCP_HZ) / HZ;
|
- ca->epoch_start) << BICTCP_HZ) / HZ;
|
||||||
|
|
||||||
if (t < ca->bic_K) /* t - K */
|
if (t < ca->bic_K) /* t - K */
|
||||||
offs = ca->bic_K - t;
|
offs = ca->bic_K - t;
|
||||||
|
@ -258,6 +270,13 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
|
||||||
ca->cnt = 100 * cwnd; /* very small increment*/
|
ca->cnt = 100 * cwnd; /* very small increment*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial growth of cubic function may be too conservative
|
||||||
|
* when the available bandwidth is still unknown.
|
||||||
|
*/
|
||||||
|
if (ca->loss_cwnd == 0 && ca->cnt > 20)
|
||||||
|
ca->cnt = 20; /* increase cwnd 5% per RTT */
|
||||||
|
|
||||||
/* TCP Friendly */
|
/* TCP Friendly */
|
||||||
if (tcp_friendliness) {
|
if (tcp_friendliness) {
|
||||||
u32 scale = beta_scale;
|
u32 scale = beta_scale;
|
||||||
|
@ -339,12 +358,12 @@ static void hystart_update(struct sock *sk, u32 delay)
|
||||||
struct bictcp *ca = inet_csk_ca(sk);
|
struct bictcp *ca = inet_csk_ca(sk);
|
||||||
|
|
||||||
if (!(ca->found & hystart_detect)) {
|
if (!(ca->found & hystart_detect)) {
|
||||||
u32 curr_jiffies = jiffies;
|
u32 now = bictcp_clock();
|
||||||
|
|
||||||
/* first detection parameter - ack-train detection */
|
/* first detection parameter - ack-train detection */
|
||||||
if (curr_jiffies - ca->last_jiffies <= msecs_to_jiffies(2)) {
|
if ((s32)(now - ca->last_ack) <= hystart_ack_delta) {
|
||||||
ca->last_jiffies = curr_jiffies;
|
ca->last_ack = now;
|
||||||
if (curr_jiffies - ca->round_start >= ca->delay_min>>4)
|
if ((s32)(now - ca->round_start) > ca->delay_min >> 4)
|
||||||
ca->found |= HYSTART_ACK_TRAIN;
|
ca->found |= HYSTART_ACK_TRAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,7 +410,7 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us)
|
||||||
if ((s32)(tcp_time_stamp - ca->epoch_start) < HZ)
|
if ((s32)(tcp_time_stamp - ca->epoch_start) < HZ)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
delay = usecs_to_jiffies(rtt_us) << 3;
|
delay = (rtt_us << 3) / USEC_PER_MSEC;
|
||||||
if (delay == 0)
|
if (delay == 0)
|
||||||
delay = 1;
|
delay = 1;
|
||||||
|
|
||||||
|
@ -447,6 +466,10 @@ static int __init cubictcp_register(void)
|
||||||
/* divide by bic_scale and by constant Srtt (100ms) */
|
/* divide by bic_scale and by constant Srtt (100ms) */
|
||||||
do_div(cube_factor, bic_scale * 10);
|
do_div(cube_factor, bic_scale * 10);
|
||||||
|
|
||||||
|
/* hystart needs ms clock resolution */
|
||||||
|
if (hystart && HZ < 1000)
|
||||||
|
cubictcp.flags |= TCP_CONG_RTT_STAMP;
|
||||||
|
|
||||||
return tcp_register_congestion_control(&cubictcp);
|
return tcp_register_congestion_control(&cubictcp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3350,7 +3350,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
|
||||||
net_invalid_timestamp()))
|
net_invalid_timestamp()))
|
||||||
rtt_us = ktime_us_delta(ktime_get_real(),
|
rtt_us = ktime_us_delta(ktime_get_real(),
|
||||||
last_ackt);
|
last_ackt);
|
||||||
else if (ca_seq_rtt > 0)
|
else if (ca_seq_rtt >= 0)
|
||||||
rtt_us = jiffies_to_usecs(ca_seq_rtt);
|
rtt_us = jiffies_to_usecs(ca_seq_rtt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1124,7 +1124,7 @@ restart:
|
||||||
|
|
||||||
/* Latch our state.
|
/* Latch our state.
|
||||||
|
|
||||||
It is tricky place. We need to grab write lock and cannot
|
It is tricky place. We need to grab our state lock and cannot
|
||||||
drop lock on peer. It is dangerous because deadlock is
|
drop lock on peer. It is dangerous because deadlock is
|
||||||
possible. Connect to self case and simultaneous
|
possible. Connect to self case and simultaneous
|
||||||
attempt to connect are eliminated by checking socket
|
attempt to connect are eliminated by checking socket
|
||||||
|
|
Loading…
Reference in New Issue