Merge branch 'for-davem' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville...
authorDavid S. Miller <davem@davemloft.net>
Thu, 23 Dec 2010 18:13:30 +0000 (10:13 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Dec 2010 18:13:30 +0000 (10:13 -0800)
drivers/net/can/pch_can.c
net/ipv4/tcp_input.c
net/sched/sch_sfq.c

index 8d45fdd..c42e972 100644 (file)
@@ -1078,15 +1078,17 @@ static int pch_can_suspend(struct pci_dev *pdev, pm_message_t state)
 
        /* Save Tx buffer enable state */
        for (i = PCH_TX_OBJ_START; i <= PCH_TX_OBJ_END; i++)
-               priv->tx_enable[i] = pch_can_get_rxtx_ir(priv, i, PCH_TX_IFREG);
+               priv->tx_enable[i - 1] = pch_can_get_rxtx_ir(priv, i,
+                                                            PCH_TX_IFREG);
 
        /* Disable all Transmit buffers */
        pch_can_set_tx_all(priv, 0);
 
        /* Save Rx buffer enable state */
        for (i = PCH_RX_OBJ_START; i <= PCH_RX_OBJ_END; i++) {
-               priv->rx_enable[i] = pch_can_get_rxtx_ir(priv, i, PCH_RX_IFREG);
-               priv->rx_link[i] = pch_can_get_rx_buffer_link(priv, i);
+               priv->rx_enable[i - 1] = pch_can_get_rxtx_ir(priv, i,
+                                                            PCH_RX_IFREG);
+               priv->rx_link[i - 1] = pch_can_get_rx_buffer_link(priv, i);
        }
 
        /* Disable all Receive buffers */
@@ -1139,15 +1141,15 @@ static int pch_can_resume(struct pci_dev *pdev)
 
        /* Enabling the transmit buffer. */
        for (i = PCH_TX_OBJ_START; i <= PCH_TX_OBJ_END; i++)
-               pch_can_set_rxtx(priv, i, priv->tx_enable[i], PCH_TX_IFREG);
+               pch_can_set_rxtx(priv, i, priv->tx_enable[i - 1], PCH_TX_IFREG);
 
        /* Configuring the receive buffer and enabling them. */
        for (i = PCH_RX_OBJ_START; i <= PCH_RX_OBJ_END; i++) {
                /* Restore buffer link */
-               pch_can_set_rx_buffer_link(priv, i, priv->rx_link[i]);
+               pch_can_set_rx_buffer_link(priv, i, priv->rx_link[i - 1]);
 
                /* Restore buffer enables */
-               pch_can_set_rxtx(priv, i, priv->rx_enable[i], PCH_RX_IFREG);
+               pch_can_set_rxtx(priv, i, priv->rx_enable[i - 1], PCH_RX_IFREG);
        }
 
        /* Enable CAN Interrupts */
index 824e8c8..2549b29 100644 (file)
@@ -916,25 +916,20 @@ static void tcp_init_metrics(struct sock *sk)
                tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));
        }
        tcp_set_rto(sk);
-       if (inet_csk(sk)->icsk_rto < TCP_TIMEOUT_INIT && !tp->rx_opt.saw_tstamp)
-               goto reset;
-
-cwnd:
-       tp->snd_cwnd = tcp_init_cwnd(tp, dst);
-       tp->snd_cwnd_stamp = tcp_time_stamp;
-       return;
-
+       if (inet_csk(sk)->icsk_rto < TCP_TIMEOUT_INIT && !tp->rx_opt.saw_tstamp) {
 reset:
-       /* Play conservative. If timestamps are not
-        * supported, TCP will fail to recalculate correct
-        * rtt, if initial rto is too small. FORGET ALL AND RESET!
-        */
-       if (!tp->rx_opt.saw_tstamp && tp->srtt) {
-               tp->srtt = 0;
-               tp->mdev = tp->mdev_max = tp->rttvar = TCP_TIMEOUT_INIT;
-               inet_csk(sk)->icsk_rto = TCP_TIMEOUT_INIT;
+               /* Play conservative. If timestamps are not
+                * supported, TCP will fail to recalculate correct
+                * rtt, if initial rto is too small. FORGET ALL AND RESET!
+                */
+               if (!tp->rx_opt.saw_tstamp && tp->srtt) {
+                       tp->srtt = 0;
+                       tp->mdev = tp->mdev_max = tp->rttvar = TCP_TIMEOUT_INIT;
+                       inet_csk(sk)->icsk_rto = TCP_TIMEOUT_INIT;
+               }
        }
-       goto cwnd;
+       tp->snd_cwnd = tcp_init_cwnd(tp, dst);
+       tp->snd_cwnd_stamp = tcp_time_stamp;
 }
 
 static void tcp_update_reordering(struct sock *sk, const int metric,
index 13322e8..6a2f88f 100644 (file)
@@ -281,6 +281,7 @@ static inline struct sk_buff *slot_dequeue_tail(struct sfq_slot *slot)
        struct sk_buff *skb = slot->skblist_prev;
 
        slot->skblist_prev = skb->prev;
+       skb->prev->next = (struct sk_buff *)slot;
        skb->next = skb->prev = NULL;
        return skb;
 }
@@ -608,14 +609,19 @@ static int sfq_dump_class_stats(struct Qdisc *sch, unsigned long cl,
                                struct gnet_dump *d)
 {
        struct sfq_sched_data *q = qdisc_priv(sch);
-       const struct sfq_slot *slot = &q->slots[q->ht[cl - 1]];
-       struct gnet_stats_queue qs = { .qlen = slot->qlen };
-       struct tc_sfq_xstats xstats = { .allot = slot->allot };
+       sfq_index idx = q->ht[cl - 1];
+       struct gnet_stats_queue qs = { 0 };
+       struct tc_sfq_xstats xstats = { 0 };
        struct sk_buff *skb;
 
-       slot_queue_walk(slot, skb)
-               qs.backlog += qdisc_pkt_len(skb);
+       if (idx != SFQ_EMPTY_SLOT) {
+               const struct sfq_slot *slot = &q->slots[idx];
 
+               xstats.allot = slot->allot;
+               qs.qlen = slot->qlen;
+               slot_queue_walk(slot, skb)
+                       qs.backlog += qdisc_pkt_len(skb);
+       }
        if (gnet_stats_copy_queue(d, &qs) < 0)
                return -1;
        return gnet_stats_copy_app(d, &xstats, sizeof(xstats));