]> git.pld-linux.org Git - packages/kernel.git/blobdiff - kernel-small_fixes.patch
- 3.18.26
[packages/kernel.git] / kernel-small_fixes.patch
index 5da7c5a9f879da3bacab3153782cd7ece6905f53..fb7f26f7a5db5bc63bc04fdda217ed0377669ae8 100644 (file)
                                exit
                        fi
                done
+From 30927520dbae297182990bb21d08762bcc35ce1d Mon Sep 17 00:00:00 2001
+From: Eric Dumazet <edumazet@google.com>
+Date: Wed, 9 Sep 2015 21:55:07 -0700
+Subject: [PATCH] tcp_cubic: better follow cubic curve after idle period
 
-diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 7a0c800..ec5ebbb 100644
---- a/drivers/net/ethernet/realtek/r8169.c
-+++ b/drivers/net/ethernet/realtek/r8169.c
-@@ -4103,6 +4103,14 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
-       /* Get MAC address */
-       for (i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = RTL_R8(MAC0 + i);
-+
-+      if (!is_valid_ether_addr(dev->dev_addr)) {
-+              /* Report it and use a random ethernet address instead */
-+              netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr);
-+              random_ether_addr(dev->dev_addr);
-+              netdev_info(dev, "Using random MAC address: %pM\n",
-+                          dev->dev_addr);
-+      }
-       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
-       SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
--- 
-1.7.7.3
+Jana Iyengar found an interesting issue on CUBIC :
 
-  
---- linux-3.4/fs/unionfs/commonfops.c.org      2012-05-29 20:40:20.756489877 +0200
-+++ linux-3.4/fs/unionfs/commonfops.c  2012-05-29 21:07:12.021252743 +0200
-@@ -766,7 +766,7 @@
-                                  unsigned int cmd, unsigned long arg)
- {
-       int err = 0;
--      fd_set branchlist;
-+      unsigned long branchlist = 0;
-       int bstart = 0, bend = 0, bindex = 0;
-       int orig_bstart, orig_bend;
-       struct dentry *dentry, *lower_dentry;
-@@ -781,14 +781,12 @@
-       bstart = dbstart(dentry);
-       bend = dbend(dentry);
--      FD_ZERO(&branchlist);
--
-       for (bindex = bstart; bindex <= bend; bindex++) {
-               lower_dentry = unionfs_lower_dentry_idx(dentry, bindex);
-               if (!lower_dentry)
-                       continue;
-               if (likely(lower_dentry->d_inode))
--                      FD_SET(bindex, &branchlist);
-+                      __set_bit(bindex, &branchlist);
-               /* purge any lower objects after partial_lookup */
-               if (bindex < orig_bstart || bindex > orig_bend) {
-                       dput(lower_dentry);
---- linux-3.4.orig/drivers/acpi/apei/apei-base.c       2012-06-08 10:02:06.000000000 +0200
-+++ linux-3.4/drivers/acpi/apei/apei-base.c    2012-06-08 10:04:16.503779775 +0200
-@@ -586,6 +586,11 @@ static int apei_check_gar(struct acpi_ge
-       }
-       *access_bit_width = 1UL << (access_size_code + 2);
+The epoch is only updated/reset initially and when experiencing losses.
+The delta "t" of now - epoch_start can be arbitrary large after app idle
+as well as the bic_target. Consequentially the slope (inverse of
+ca->cnt) would be really large, and eventually ca->cnt would be
+lower-bounded in the end to 2 to have delayed-ACK slow-start behavior.
+
+This particularly shows up when slow_start_after_idle is disabled
+as a dangerous cwnd inflation (1.5 x RTT) after few seconds of idle
+time.
+
+Jana initial fix was to reset epoch_start if app limited,
+but Neal pointed out it would ask the CUBIC algorithm to recalculate the
+curve so that we again start growing steeply upward from where cwnd is
+now (as CUBIC does just after a loss). Ideally we'd want the cwnd growth
+curve to be the same shape, just shifted later in time by the amount of
+the idle period.
+
+Reported-by: Jana Iyengar <jri@google.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Yuchung Cheng <ycheng@google.com>
+Signed-off-by: Neal Cardwell <ncardwell@google.com>
+Cc: Stephen Hemminger <stephen@networkplumber.org>
+Cc: Sangtae Ha <sangtae.ha@gmail.com>
+Cc: Lawrence Brakmo <lawrence@brakmo.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ net/ipv4/tcp_cubic.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c
+index 28011fb1..c6ded6b 100644
+--- a/net/ipv4/tcp_cubic.c
++++ b/net/ipv4/tcp_cubic.c
+@@ -151,6 +151,21 @@ static void bictcp_init(struct sock *sk)
+               tcp_sk(sk)->snd_ssthresh = initial_ssthresh;
+ }
  
-+      /* Fixup common BIOS bug */
-+      if (bit_width == 32 && bit_offset == 0 && (*paddr & 0x03) == 0 &&
-+          *access_bit_width < 32)
-+              *access_bit_width = 32;
++static void bictcp_cwnd_event(struct sock *sk, enum tcp_ca_event event)
++{
++      if (event == CA_EVENT_TX_START) {
++              s32 delta = tcp_time_stamp - tcp_sk(sk)->lsndtime;
++              struct bictcp *ca = inet_csk_ca(sk);
++
++              /* We were application limited (idle) for a while.
++               * Shift epoch_start to keep cwnd growth to cubic curve.
++               */
++              if (ca->epoch_start && delta > 0)
++                      ca->epoch_start += delta;
++              return;
++      }
++}
 +
-       if ((bit_width + bit_offset) > *access_bit_width) {
-               pr_warning(FW_BUG APEI_PFX
-                          "Invalid bit width + offset in GAR [0x%llx/%u/%u/%u/%u]\n",
+ /* calculate the cubic root of x using a table lookup followed by one
+  * Newton-Raphson iteration.
+  * Avg err ~= 0.195%
+@@ -450,6 +465,7 @@ static struct tcp_congestion_ops cubictcp __read_mostly = {
+       .cong_avoid     = bictcp_cong_avoid,
+       .set_state      = bictcp_state,
+       .undo_cwnd      = bictcp_undo_cwnd,
++      .cwnd_event     = bictcp_cwnd_event,
+       .pkts_acked     = bictcp_acked,
+       .owner          = THIS_MODULE,
+       .name           = "cubic",
This page took 0.033431 seconds and 4 git commands to generate.