kernel: bump 4.19 to 4.19.148
Remove upstreamed: - generic/pending: 607-tcp_bbr-adapt-cwnd-based-on-ack-aggregation-estimation.patch Resolve conflicted: - generic/backport: 011-kbuild-export-SUBARCH.patch Refreshed all patches. Signed-off-by: CN_SZTL <cnsztl@project-openwrt.eu.org>
This commit is contained in:
parent
86577f075d
commit
fc101d4c5f
@ -8,11 +8,11 @@ endif
|
||||
|
||||
LINUX_VERSION-4.9 = .237
|
||||
LINUX_VERSION-4.14 = .199
|
||||
LINUX_VERSION-4.19 = .145
|
||||
LINUX_VERSION-4.19 = .148
|
||||
|
||||
LINUX_KERNEL_HASH-4.9.237 = 81ec5792c0ccdc244faff9dbb3d9c97857d9df4cb1f0c1c3db6bc4031faf861f
|
||||
LINUX_KERNEL_HASH-4.14.199 = 02f3432a262b3804745501f8c3c51d735133af48a39909df8b031d0b9653d4f9
|
||||
LINUX_KERNEL_HASH-4.19.145 = 17bc834ff8f15aee45b7ca7c8b9d43b6b03111a43eb7de75c808a04f4b3ff6b7
|
||||
LINUX_KERNEL_HASH-4.19.148 = 3308c74a93ce6d4e495fde35d1351061240a895f76a288248c343713bd63555b
|
||||
|
||||
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))
|
||||
sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1)))))))
|
||||
|
||||
@ -42,7 +42,7 @@ Signed-off-by: Vinod Koul <vkoul@kernel.org>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -14075,9 +14075,11 @@ SYNOPSYS DESIGNWARE DMAC DRIVER
|
||||
@@ -14084,9 +14084,11 @@ SYNOPSYS DESIGNWARE DMAC DRIVER
|
||||
M: Viresh Kumar <vireshk@kernel.org>
|
||||
R: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
S: Maintained
|
||||
|
||||
@ -928,7 +928,7 @@ Fixes https://github.com/raspberrypi/linux/issues/2408
|
||||
USB_PORT_FEAT_C_OVER_CURRENT);
|
||||
--- a/drivers/usb/core/message.c
|
||||
+++ b/drivers/usb/core/message.c
|
||||
@@ -2000,6 +2000,85 @@ free_interfaces:
|
||||
@@ -1993,6 +1993,85 @@ free_interfaces:
|
||||
if (cp->string == NULL &&
|
||||
!(dev->quirks & USB_QUIRK_CONFIG_INTF_STRINGS))
|
||||
cp->string = usb_cache_string(dev, cp->desc.iConfiguration);
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
#define USB_VENDOR_ID_BELKIN 0x050d
|
||||
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
||||
|
||||
@@ -1209,6 +1212,9 @@
|
||||
@@ -1211,6 +1214,9 @@
|
||||
#define USB_VENDOR_ID_XAT 0x2505
|
||||
#define USB_DEVICE_ID_XAT_CSR 0x0220
|
||||
|
||||
@ -53,7 +53,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_MULTI_TOUCH), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2), HID_QUIRK_ALWAYS_POLL },
|
||||
@@ -178,6 +179,7 @@ static const struct hid_device_id hid_qu
|
||||
@@ -180,6 +181,7 @@ static const struct hid_device_id hid_qu
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD2, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD), HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
|
||||
|
||||
@ -21,7 +21,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||
|
||||
--- a/drivers/usb/host/ehci-hcd.c
|
||||
+++ b/drivers/usb/host/ehci-hcd.c
|
||||
@@ -665,6 +665,10 @@ int ehci_setup(struct usb_hcd *hcd)
|
||||
@@ -666,6 +666,10 @@ int ehci_setup(struct usb_hcd *hcd)
|
||||
|
||||
/* cache this readonly data; minimize chip reads */
|
||||
ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
|
||||
|
||||
@ -10,14 +10,14 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -432,8 +432,8 @@ KBUILD_LDFLAGS :=
|
||||
@@ -450,8 +450,8 @@ KBUILD_LDFLAGS :=
|
||||
GCC_PLUGINS_CFLAGS :=
|
||||
CLANG_FLAGS :=
|
||||
|
||||
-export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
|
||||
-export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||
+export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD
|
||||
+export CC CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||
-export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||
-export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||
+export ARCH SRCARCH SUBARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||
+export CC CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
|
||||
export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
|
||||
export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -1783,6 +1783,19 @@ int phy_set_max_speed(struct phy_device
|
||||
@@ -1784,6 +1784,19 @@ int phy_set_max_speed(struct phy_device
|
||||
}
|
||||
EXPORT_SYMBOL(phy_set_max_speed);
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -1796,6 +1796,36 @@ void phy_support_asym_pause(struct phy_d
|
||||
@@ -1797,6 +1797,36 @@ void phy_support_asym_pause(struct phy_d
|
||||
}
|
||||
EXPORT_SYMBOL(phy_support_asym_pause);
|
||||
|
||||
|
||||
@ -130,7 +130,7 @@ Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
/* Some Ethernet drivers try to connect to a PHY device before
|
||||
* calling register_netdevice() -> netdev_register_kobject() and
|
||||
* does the dev->dev.kobj initialization. Here we only check for
|
||||
@@ -1956,6 +2019,9 @@ static int phy_remove(struct device *dev
|
||||
@@ -1957,6 +2020,9 @@ static int phy_remove(struct device *dev
|
||||
phydev->state = PHY_DOWN;
|
||||
mutex_unlock(&phydev->lock);
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1240,7 +1240,6 @@ endif
|
||||
@@ -1260,7 +1260,6 @@ endif
|
||||
|
||||
PHONY += modules
|
||||
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
|
||||
@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
@$(kecho) ' Building modules, stage 2.';
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
@@ -1269,7 +1268,6 @@ _modinst_:
|
||||
@@ -1289,7 +1288,6 @@ _modinst_:
|
||||
rm -f $(MODLIB)/build ; \
|
||||
ln -s $(CURDIR) $(MODLIB)/build ; \
|
||||
fi
|
||||
|
||||
@ -33,7 +33,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
|
||||
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
|
||||
@@ -772,11 +777,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH
|
||||
@@ -792,11 +797,6 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH
|
||||
KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
|
||||
endif
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1144,6 +1144,10 @@ config SYNC_R4K
|
||||
@@ -1145,6 +1145,10 @@ config SYNC_R4K
|
||||
config MIPS_MACHINE
|
||||
def_bool n
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
--- a/drivers/net/phy/phy_device.c
|
||||
+++ b/drivers/net/phy/phy_device.c
|
||||
@@ -1583,6 +1583,9 @@ int genphy_update_link(struct phy_device
|
||||
@@ -1584,6 +1584,9 @@ int genphy_update_link(struct phy_device
|
||||
{
|
||||
int status;
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
||||
|
||||
--- a/drivers/usb/host/ehci-hcd.c
|
||||
+++ b/drivers/usb/host/ehci-hcd.c
|
||||
@@ -638,7 +638,7 @@ static int ehci_run (struct usb_hcd *hcd
|
||||
@@ -639,7 +639,7 @@ static int ehci_run (struct usb_hcd *hcd
|
||||
"USB %x.%x started, EHCI %x.%02x%s\n",
|
||||
((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f),
|
||||
temp >> 8, temp & 0xff,
|
||||
@ -28,7 +28,7 @@ Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
||||
&ehci->regs->intr_enable); /* Turn On Interrupts */
|
||||
--- a/drivers/usb/host/ehci-hub.c
|
||||
+++ b/drivers/usb/host/ehci-hub.c
|
||||
@@ -641,7 +641,7 @@ ehci_hub_status_data (struct usb_hcd *hc
|
||||
@@ -640,7 +640,7 @@ ehci_hub_status_data (struct usb_hcd *hc
|
||||
* always set, seem to clear PORT_OCC and PORT_CSC when writing to
|
||||
* PORT_POWER; that's surprising, but maybe within-spec.
|
||||
*/
|
||||
@ -37,7 +37,7 @@ Signed-off-by: Florian Fainelli <florian@openwrt.org>
|
||||
mask = PORT_CSC | PORT_PEC | PORT_OCC;
|
||||
else
|
||||
mask = PORT_CSC | PORT_PEC;
|
||||
@@ -1011,7 +1011,7 @@ int ehci_hub_control(
|
||||
@@ -1010,7 +1010,7 @@ int ehci_hub_control(
|
||||
if (temp & PORT_PEC)
|
||||
status |= USB_PORT_STAT_C_ENABLE << 16;
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -653,9 +653,9 @@ KBUILD_CFLAGS += $(call cc-disable-warni
|
||||
@@ -673,9 +673,9 @@ KBUILD_CFLAGS += $(call cc-disable-warni
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
|
||||
@ -9,7 +9,7 @@ Acked-by: Rob Landley <rob@landley.net>
|
||||
---
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1063,9 +1063,6 @@ config FW_ARC
|
||||
@@ -1064,9 +1064,6 @@ config FW_ARC
|
||||
config ARCH_MAY_HAVE_PC_FDC
|
||||
bool
|
||||
|
||||
@ -19,7 +19,7 @@ Acked-by: Rob Landley <rob@landley.net>
|
||||
config CEVT_BCM1480
|
||||
bool
|
||||
|
||||
@@ -2969,6 +2966,18 @@ choice
|
||||
@@ -2970,6 +2967,18 @@ choice
|
||||
bool "Extend builtin kernel arguments with bootloader arguments"
|
||||
endchoice
|
||||
|
||||
|
||||
@ -24,7 +24,7 @@ v2: incorporated changes suggested by Jonas Gorski
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -2893,6 +2893,20 @@ config MIPS_O32_FP64_SUPPORT
|
||||
@@ -2894,6 +2894,20 @@ config MIPS_O32_FP64_SUPPORT
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -1117,7 +1117,6 @@ config DMA_PERDEV_COHERENT
|
||||
@@ -1118,7 +1118,6 @@ config DMA_PERDEV_COHERENT
|
||||
config DMA_NONCOHERENT
|
||||
bool
|
||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
||||
@ -27,7 +27,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
select NEED_DMA_MAP_STATE
|
||||
select DMA_NONCOHERENT_MMAP
|
||||
select DMA_NONCOHERENT_CACHE_SYNC
|
||||
@@ -1898,9 +1897,11 @@ config SYS_HAS_CPU_MIPS32_R3_5
|
||||
@@ -1899,9 +1898,11 @@ config SYS_HAS_CPU_MIPS32_R3_5
|
||||
|
||||
config SYS_HAS_CPU_MIPS32_R5
|
||||
bool
|
||||
@ -39,7 +39,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
|
||||
config SYS_HAS_CPU_MIPS64_R1
|
||||
bool
|
||||
@@ -1910,6 +1911,7 @@ config SYS_HAS_CPU_MIPS64_R2
|
||||
@@ -1911,6 +1912,7 @@ config SYS_HAS_CPU_MIPS64_R2
|
||||
|
||||
config SYS_HAS_CPU_MIPS64_R6
|
||||
bool
|
||||
@ -47,7 +47,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
|
||||
config SYS_HAS_CPU_R3000
|
||||
bool
|
||||
@@ -1946,6 +1948,7 @@ config SYS_HAS_CPU_R8000
|
||||
@@ -1947,6 +1949,7 @@ config SYS_HAS_CPU_R8000
|
||||
|
||||
config SYS_HAS_CPU_R10000
|
||||
bool
|
||||
@ -55,7 +55,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
|
||||
config SYS_HAS_CPU_RM7000
|
||||
bool
|
||||
@@ -1974,6 +1977,7 @@ config SYS_HAS_CPU_BMIPS4380
|
||||
@@ -1975,6 +1978,7 @@ config SYS_HAS_CPU_BMIPS4380
|
||||
config SYS_HAS_CPU_BMIPS5000
|
||||
bool
|
||||
select SYS_HAS_CPU_BMIPS
|
||||
|
||||
@ -1264,7 +1264,7 @@
|
||||
extern struct kmem_cache *skbuff_head_cache;
|
||||
|
||||
void kfree_skb_partial(struct sk_buff *skb, bool head_stolen);
|
||||
@@ -3922,8 +3941,12 @@ static inline void __nf_copy(struct sk_b
|
||||
@@ -3923,8 +3942,12 @@ static inline void __nf_copy(struct sk_b
|
||||
dst->_nfct = src->_nfct;
|
||||
nf_conntrack_get(skb_nfct(src));
|
||||
#endif
|
||||
|
||||
@ -1,405 +0,0 @@
|
||||
From 232aa8ec3ed979d4716891540c03a806ecab0c37 Mon Sep 17 00:00:00 2001
|
||||
From: Priyaranjan Jha <priyarjha@google.com>
|
||||
Date: Wed, 23 Jan 2019 12:04:53 -0800
|
||||
Subject: tcp_bbr: refactor bbr_target_cwnd() for general inflight provisioning
|
||||
|
||||
Because bbr_target_cwnd() is really a general-purpose BBR helper for
|
||||
computing some volume of inflight data as a function of the estimated
|
||||
BDP, refactor it into following helper functions:
|
||||
- bbr_bdp()
|
||||
- bbr_quantization_budget()
|
||||
- bbr_inflight()
|
||||
|
||||
Signed-off-by: Priyaranjan Jha <priyarjha@google.com>
|
||||
Signed-off-by: Neal Cardwell <ncardwell@google.com>
|
||||
Signed-off-by: Yuchung Cheng <ycheng@google.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
--- a/include/net/inet_connection_sock.h
|
||||
+++ b/include/net/inet_connection_sock.h
|
||||
@@ -139,8 +139,8 @@ struct inet_connection_sock {
|
||||
} icsk_mtup;
|
||||
u32 icsk_user_timeout;
|
||||
|
||||
- u64 icsk_ca_priv[88 / sizeof(u64)];
|
||||
-#define ICSK_CA_PRIV_SIZE (11 * sizeof(u64))
|
||||
+ u64 icsk_ca_priv[104 / sizeof(u64)];
|
||||
+#define ICSK_CA_PRIV_SIZE (13 * sizeof(u64))
|
||||
};
|
||||
|
||||
#define ICSK_TIME_RETRANS 1 /* Retransmit timer */
|
||||
--- a/net/ipv4/tcp_bbr.c
|
||||
+++ b/net/ipv4/tcp_bbr.c
|
||||
@@ -115,6 +115,14 @@ struct bbr {
|
||||
unused_b:5;
|
||||
u32 prior_cwnd; /* prior cwnd upon entering loss recovery */
|
||||
u32 full_bw; /* recent bw, to estimate if pipe is full */
|
||||
+
|
||||
+ /* For tracking ACK aggregation: */
|
||||
+ u64 ack_epoch_mstamp; /* start of ACK sampling epoch */
|
||||
+ u16 extra_acked[2]; /* max excess data ACKed in epoch */
|
||||
+ u32 ack_epoch_acked:20, /* packets (S)ACKed in sampling epoch */
|
||||
+ extra_acked_win_rtts:5, /* age of extra_acked, in round trips */
|
||||
+ extra_acked_win_idx:1, /* current index in extra_acked array */
|
||||
+ unused_c:6;
|
||||
};
|
||||
|
||||
#define CYCLE_LEN 8 /* number of phases in a pacing gain cycle */
|
||||
@@ -174,6 +182,15 @@ static const u32 bbr_lt_bw_diff = 4000 /
|
||||
/* If we estimate we're policed, use lt_bw for this many round trips: */
|
||||
static const u32 bbr_lt_bw_max_rtts = 48;
|
||||
|
||||
+/* Gain factor for adding extra_acked to target cwnd: */
|
||||
+static const int bbr_extra_acked_gain = BBR_UNIT;
|
||||
+/* Window length of extra_acked window. */
|
||||
+static const u32 bbr_extra_acked_win_rtts = 5;
|
||||
+/* Max allowed val for ack_epoch_acked, after which sampling epoch is reset */
|
||||
+static const u32 bbr_ack_epoch_acked_reset_thresh = 1U << 20;
|
||||
+/* Time period for clamping cwnd increment due to ack aggregation */
|
||||
+static const u32 bbr_extra_acked_max_us = 100 * 1000;
|
||||
+
|
||||
static void bbr_check_probe_rtt_done(struct sock *sk);
|
||||
|
||||
/* Do we estimate that STARTUP filled the pipe? */
|
||||
@@ -200,6 +217,16 @@ static u32 bbr_bw(const struct sock *sk)
|
||||
return bbr->lt_use_bw ? bbr->lt_bw : bbr_max_bw(sk);
|
||||
}
|
||||
|
||||
+/* Return maximum extra acked in past k-2k round trips,
|
||||
+ * where k = bbr_extra_acked_win_rtts.
|
||||
+ */
|
||||
+static u16 bbr_extra_acked(const struct sock *sk)
|
||||
+{
|
||||
+ struct bbr *bbr = inet_csk_ca(sk);
|
||||
+
|
||||
+ return max(bbr->extra_acked[0], bbr->extra_acked[1]);
|
||||
+}
|
||||
+
|
||||
/* Return rate in bytes per second, optionally with a gain.
|
||||
* The order here is chosen carefully to avoid overflow of u64. This should
|
||||
* work for input rates of up to 2.9Tbit/sec and gain of 2.89x.
|
||||
@@ -305,6 +332,8 @@ static void bbr_cwnd_event(struct sock *
|
||||
|
||||
if (event == CA_EVENT_TX_START && tp->app_limited) {
|
||||
bbr->idle_restart = 1;
|
||||
+ bbr->ack_epoch_mstamp = tp->tcp_mstamp;
|
||||
+ bbr->ack_epoch_acked = 0;
|
||||
/* Avoid pointless buffer overflows: pace at est. bw if we don't
|
||||
* need more speed (we're restarting from idle and app-limited).
|
||||
*/
|
||||
@@ -315,30 +344,19 @@ static void bbr_cwnd_event(struct sock *
|
||||
}
|
||||
}
|
||||
|
||||
-/* Find target cwnd. Right-size the cwnd based on min RTT and the
|
||||
- * estimated bottleneck bandwidth:
|
||||
+/* Calculate bdp based on min RTT and the estimated bottleneck bandwidth:
|
||||
*
|
||||
- * cwnd = bw * min_rtt * gain = BDP * gain
|
||||
+ * bdp = bw * min_rtt * gain
|
||||
*
|
||||
* The key factor, gain, controls the amount of queue. While a small gain
|
||||
* builds a smaller queue, it becomes more vulnerable to noise in RTT
|
||||
* measurements (e.g., delayed ACKs or other ACK compression effects). This
|
||||
* noise may cause BBR to under-estimate the rate.
|
||||
- *
|
||||
- * To achieve full performance in high-speed paths, we budget enough cwnd to
|
||||
- * fit full-sized skbs in-flight on both end hosts to fully utilize the path:
|
||||
- * - one skb in sending host Qdisc,
|
||||
- * - one skb in sending host TSO/GSO engine
|
||||
- * - one skb being received by receiver host LRO/GRO/delayed-ACK engine
|
||||
- * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because
|
||||
- * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets,
|
||||
- * which allows 2 outstanding 2-packet sequences, to try to keep pipe
|
||||
- * full even with ACK-every-other-packet delayed ACKs.
|
||||
*/
|
||||
-static u32 bbr_target_cwnd(struct sock *sk, u32 bw, int gain)
|
||||
+static u32 bbr_bdp(struct sock *sk, u32 bw, int gain)
|
||||
{
|
||||
struct bbr *bbr = inet_csk_ca(sk);
|
||||
- u32 cwnd;
|
||||
+ u32 bdp;
|
||||
u64 w;
|
||||
|
||||
/* If we've never had a valid RTT sample, cap cwnd at the initial
|
||||
@@ -353,7 +371,24 @@ static u32 bbr_target_cwnd(struct sock *
|
||||
w = (u64)bw * bbr->min_rtt_us;
|
||||
|
||||
/* Apply a gain to the given value, then remove the BW_SCALE shift. */
|
||||
- cwnd = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT;
|
||||
+ bdp = (((w * gain) >> BBR_SCALE) + BW_UNIT - 1) / BW_UNIT;
|
||||
+
|
||||
+ return bdp;
|
||||
+}
|
||||
+
|
||||
+/* To achieve full performance in high-speed paths, we budget enough cwnd to
|
||||
+ * fit full-sized skbs in-flight on both end hosts to fully utilize the path:
|
||||
+ * - one skb in sending host Qdisc,
|
||||
+ * - one skb in sending host TSO/GSO engine
|
||||
+ * - one skb being received by receiver host LRO/GRO/delayed-ACK engine
|
||||
+ * Don't worry, at low rates (bbr_min_tso_rate) this won't bloat cwnd because
|
||||
+ * in such cases tso_segs_goal is 1. The minimum cwnd is 4 packets,
|
||||
+ * which allows 2 outstanding 2-packet sequences, to try to keep pipe
|
||||
+ * full even with ACK-every-other-packet delayed ACKs.
|
||||
+ */
|
||||
+static u32 bbr_quantization_budget(struct sock *sk, u32 cwnd)
|
||||
+{
|
||||
+ struct bbr *bbr = inet_csk_ca(sk);
|
||||
|
||||
/* Allow enough full-sized skbs in flight to utilize end systems. */
|
||||
cwnd += 3 * bbr_tso_segs_goal(sk);
|
||||
@@ -362,12 +397,39 @@ static u32 bbr_target_cwnd(struct sock *
|
||||
cwnd = (cwnd + 1) & ~1U;
|
||||
|
||||
/* Ensure gain cycling gets inflight above BDP even for small BDPs. */
|
||||
- if (bbr->mode == BBR_PROBE_BW && gain > BBR_UNIT)
|
||||
+ if (bbr->mode == BBR_PROBE_BW && bbr->cycle_idx == 0)
|
||||
cwnd += 2;
|
||||
|
||||
return cwnd;
|
||||
}
|
||||
|
||||
+/* Find inflight based on min RTT and the estimated bottleneck bandwidth. */
|
||||
+static u32 bbr_inflight(struct sock *sk, u32 bw, int gain)
|
||||
+{
|
||||
+ u32 inflight;
|
||||
+
|
||||
+ inflight = bbr_bdp(sk, bw, gain);
|
||||
+ inflight = bbr_quantization_budget(sk, inflight);
|
||||
+
|
||||
+ return inflight;
|
||||
+}
|
||||
+
|
||||
+/* Find the cwnd increment based on estimate of ack aggregation */
|
||||
+static u32 bbr_ack_aggregation_cwnd(struct sock *sk)
|
||||
+{
|
||||
+ u32 max_aggr_cwnd, aggr_cwnd = 0;
|
||||
+
|
||||
+ if (bbr_extra_acked_gain && bbr_full_bw_reached(sk)) {
|
||||
+ max_aggr_cwnd = ((u64)bbr_bw(sk) * bbr_extra_acked_max_us)
|
||||
+ / BW_UNIT;
|
||||
+ aggr_cwnd = (bbr_extra_acked_gain * bbr_extra_acked(sk))
|
||||
+ >> BBR_SCALE;
|
||||
+ aggr_cwnd = min(aggr_cwnd, max_aggr_cwnd);
|
||||
+ }
|
||||
+
|
||||
+ return aggr_cwnd;
|
||||
+}
|
||||
+
|
||||
/* An optimization in BBR to reduce losses: On the first round of recovery, we
|
||||
* follow the packet conservation principle: send P packets per P packets acked.
|
||||
* After that, we slow-start and send at most 2*P packets per P packets acked.
|
||||
@@ -428,8 +490,15 @@ static void bbr_set_cwnd(struct sock *sk
|
||||
if (bbr_set_cwnd_to_recover_or_restore(sk, rs, acked, &cwnd))
|
||||
goto done;
|
||||
|
||||
+ target_cwnd = bbr_bdp(sk, bw, gain);
|
||||
+
|
||||
+ /* Increment the cwnd to account for excess ACKed data that seems
|
||||
+ * due to aggregation (of data and/or ACKs) visible in the ACK stream.
|
||||
+ */
|
||||
+ target_cwnd += bbr_ack_aggregation_cwnd(sk);
|
||||
+ target_cwnd = bbr_quantization_budget(sk, target_cwnd);
|
||||
+
|
||||
/* If we're below target cwnd, slow start cwnd toward target cwnd. */
|
||||
- target_cwnd = bbr_target_cwnd(sk, bw, gain);
|
||||
if (bbr_full_bw_reached(sk)) /* only cut cwnd if we filled the pipe */
|
||||
cwnd = min(cwnd + acked, target_cwnd);
|
||||
else if (cwnd < target_cwnd || tp->delivered < TCP_INIT_CWND)
|
||||
@@ -470,14 +539,14 @@ static bool bbr_is_next_cycle_phase(stru
|
||||
if (bbr->pacing_gain > BBR_UNIT)
|
||||
return is_full_length &&
|
||||
(rs->losses || /* perhaps pacing_gain*BDP won't fit */
|
||||
- inflight >= bbr_target_cwnd(sk, bw, bbr->pacing_gain));
|
||||
+ inflight >= bbr_inflight(sk, bw, bbr->pacing_gain));
|
||||
|
||||
/* A pacing_gain < 1.0 tries to drain extra queue we added if bw
|
||||
* probing didn't find more bw. If inflight falls to match BDP then we
|
||||
* estimate queue is drained; persisting would underutilize the pipe.
|
||||
*/
|
||||
return is_full_length ||
|
||||
- inflight <= bbr_target_cwnd(sk, bw, BBR_UNIT);
|
||||
+ inflight <= bbr_inflight(sk, bw, BBR_UNIT);
|
||||
}
|
||||
|
||||
static void bbr_advance_cycle_phase(struct sock *sk)
|
||||
@@ -487,8 +556,6 @@ static void bbr_advance_cycle_phase(stru
|
||||
|
||||
bbr->cycle_idx = (bbr->cycle_idx + 1) & (CYCLE_LEN - 1);
|
||||
bbr->cycle_mstamp = tp->delivered_mstamp;
|
||||
- bbr->pacing_gain = bbr->lt_use_bw ? BBR_UNIT :
|
||||
- bbr_pacing_gain[bbr->cycle_idx];
|
||||
}
|
||||
|
||||
/* Gain cycling: cycle pacing gain to converge to fair share of available bw. */
|
||||
@@ -506,8 +573,6 @@ static void bbr_reset_startup_mode(struc
|
||||
struct bbr *bbr = inet_csk_ca(sk);
|
||||
|
||||
bbr->mode = BBR_STARTUP;
|
||||
- bbr->pacing_gain = bbr_high_gain;
|
||||
- bbr->cwnd_gain = bbr_high_gain;
|
||||
}
|
||||
|
||||
static void bbr_reset_probe_bw_mode(struct sock *sk)
|
||||
@@ -515,8 +580,6 @@ static void bbr_reset_probe_bw_mode(stru
|
||||
struct bbr *bbr = inet_csk_ca(sk);
|
||||
|
||||
bbr->mode = BBR_PROBE_BW;
|
||||
- bbr->pacing_gain = BBR_UNIT;
|
||||
- bbr->cwnd_gain = bbr_cwnd_gain;
|
||||
bbr->cycle_idx = CYCLE_LEN - 1 - prandom_u32_max(bbr_cycle_rand);
|
||||
bbr_advance_cycle_phase(sk); /* flip to next phase of gain cycle */
|
||||
}
|
||||
@@ -699,6 +762,67 @@ static void bbr_update_bw(struct sock *s
|
||||
}
|
||||
}
|
||||
|
||||
+/* Estimates the windowed max degree of ack aggregation.
|
||||
+ * This is used to provision extra in-flight data to keep sending during
|
||||
+ * inter-ACK silences.
|
||||
+ *
|
||||
+ * Degree of ack aggregation is estimated as extra data acked beyond expected.
|
||||
+ *
|
||||
+ * max_extra_acked = "maximum recent excess data ACKed beyond max_bw * interval"
|
||||
+ * cwnd += max_extra_acked
|
||||
+ *
|
||||
+ * Max extra_acked is clamped by cwnd and bw * bbr_extra_acked_max_us (100 ms).
|
||||
+ * Max filter is an approximate sliding window of 5-10 (packet timed) round
|
||||
+ * trips.
|
||||
+ */
|
||||
+static void bbr_update_ack_aggregation(struct sock *sk,
|
||||
+ const struct rate_sample *rs)
|
||||
+{
|
||||
+ u32 epoch_us, expected_acked, extra_acked;
|
||||
+ struct bbr *bbr = inet_csk_ca(sk);
|
||||
+ struct tcp_sock *tp = tcp_sk(sk);
|
||||
+
|
||||
+ if (!bbr_extra_acked_gain || rs->acked_sacked <= 0 ||
|
||||
+ rs->delivered < 0 || rs->interval_us <= 0)
|
||||
+ return;
|
||||
+
|
||||
+ if (bbr->round_start) {
|
||||
+ bbr->extra_acked_win_rtts = min(0x1F,
|
||||
+ bbr->extra_acked_win_rtts + 1);
|
||||
+ if (bbr->extra_acked_win_rtts >= bbr_extra_acked_win_rtts) {
|
||||
+ bbr->extra_acked_win_rtts = 0;
|
||||
+ bbr->extra_acked_win_idx = bbr->extra_acked_win_idx ?
|
||||
+ 0 : 1;
|
||||
+ bbr->extra_acked[bbr->extra_acked_win_idx] = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Compute how many packets we expected to be delivered over epoch. */
|
||||
+ epoch_us = tcp_stamp_us_delta(tp->delivered_mstamp,
|
||||
+ bbr->ack_epoch_mstamp);
|
||||
+ expected_acked = ((u64)bbr_bw(sk) * epoch_us) / BW_UNIT;
|
||||
+
|
||||
+ /* Reset the aggregation epoch if ACK rate is below expected rate or
|
||||
+ * significantly large no. of ack received since epoch (potentially
|
||||
+ * quite old epoch).
|
||||
+ */
|
||||
+ if (bbr->ack_epoch_acked <= expected_acked ||
|
||||
+ (bbr->ack_epoch_acked + rs->acked_sacked >=
|
||||
+ bbr_ack_epoch_acked_reset_thresh)) {
|
||||
+ bbr->ack_epoch_acked = 0;
|
||||
+ bbr->ack_epoch_mstamp = tp->delivered_mstamp;
|
||||
+ expected_acked = 0;
|
||||
+ }
|
||||
+
|
||||
+ /* Compute excess data delivered, beyond what was expected. */
|
||||
+ bbr->ack_epoch_acked = min_t(u32, 0xFFFFF,
|
||||
+ bbr->ack_epoch_acked + rs->acked_sacked);
|
||||
+ extra_acked = bbr->ack_epoch_acked - expected_acked;
|
||||
+ extra_acked = min(extra_acked, tp->snd_cwnd);
|
||||
+ if (extra_acked > bbr->extra_acked[bbr->extra_acked_win_idx])
|
||||
+ bbr->extra_acked[bbr->extra_acked_win_idx] = extra_acked;
|
||||
+}
|
||||
+
|
||||
/* Estimate when the pipe is full, using the change in delivery rate: BBR
|
||||
* estimates that STARTUP filled the pipe if the estimated bw hasn't changed by
|
||||
* at least bbr_full_bw_thresh (25%) after bbr_full_bw_cnt (3) non-app-limited
|
||||
@@ -733,14 +857,12 @@ static void bbr_check_drain(struct sock
|
||||
|
||||
if (bbr->mode == BBR_STARTUP && bbr_full_bw_reached(sk)) {
|
||||
bbr->mode = BBR_DRAIN; /* drain queue we created */
|
||||
- bbr->pacing_gain = bbr_drain_gain; /* pace slow to drain */
|
||||
- bbr->cwnd_gain = bbr_high_gain; /* maintain cwnd */
|
||||
tcp_sk(sk)->snd_ssthresh =
|
||||
- bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT);
|
||||
+ bbr_inflight(sk, bbr_max_bw(sk), BBR_UNIT);
|
||||
} /* fall through to check if in-flight is already small: */
|
||||
if (bbr->mode == BBR_DRAIN &&
|
||||
tcp_packets_in_flight(tcp_sk(sk)) <=
|
||||
- bbr_target_cwnd(sk, bbr_max_bw(sk), BBR_UNIT))
|
||||
+ bbr_inflight(sk, bbr_max_bw(sk), BBR_UNIT))
|
||||
bbr_reset_probe_bw_mode(sk); /* we estimate queue is drained */
|
||||
}
|
||||
|
||||
@@ -796,8 +918,6 @@ static void bbr_update_min_rtt(struct so
|
||||
if (bbr_probe_rtt_mode_ms > 0 && filter_expired &&
|
||||
!bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) {
|
||||
bbr->mode = BBR_PROBE_RTT; /* dip, drain queue */
|
||||
- bbr->pacing_gain = BBR_UNIT;
|
||||
- bbr->cwnd_gain = BBR_UNIT;
|
||||
bbr_save_cwnd(sk); /* note cwnd so we can restore it */
|
||||
bbr->probe_rtt_done_stamp = 0;
|
||||
}
|
||||
@@ -825,13 +945,44 @@ static void bbr_update_min_rtt(struct so
|
||||
bbr->idle_restart = 0;
|
||||
}
|
||||
|
||||
+static void bbr_update_gains(struct sock *sk)
|
||||
+{
|
||||
+ struct bbr *bbr = inet_csk_ca(sk);
|
||||
+
|
||||
+ switch (bbr->mode) {
|
||||
+ case BBR_STARTUP:
|
||||
+ bbr->pacing_gain = bbr_high_gain;
|
||||
+ bbr->cwnd_gain = bbr_high_gain;
|
||||
+ break;
|
||||
+ case BBR_DRAIN:
|
||||
+ bbr->pacing_gain = bbr_drain_gain; /* slow, to drain */
|
||||
+ bbr->cwnd_gain = bbr_high_gain; /* keep cwnd */
|
||||
+ break;
|
||||
+ case BBR_PROBE_BW:
|
||||
+ bbr->pacing_gain = (bbr->lt_use_bw ?
|
||||
+ BBR_UNIT :
|
||||
+ bbr_pacing_gain[bbr->cycle_idx]);
|
||||
+ bbr->cwnd_gain = bbr_cwnd_gain;
|
||||
+ break;
|
||||
+ case BBR_PROBE_RTT:
|
||||
+ bbr->pacing_gain = BBR_UNIT;
|
||||
+ bbr->cwnd_gain = BBR_UNIT;
|
||||
+ break;
|
||||
+ default:
|
||||
+ WARN_ONCE(1, "BBR bad mode: %u\n", bbr->mode);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void bbr_update_model(struct sock *sk, const struct rate_sample *rs)
|
||||
{
|
||||
bbr_update_bw(sk, rs);
|
||||
+ bbr_update_ack_aggregation(sk, rs);
|
||||
bbr_update_cycle_phase(sk, rs);
|
||||
bbr_check_full_bw_reached(sk, rs);
|
||||
bbr_check_drain(sk, rs);
|
||||
bbr_update_min_rtt(sk, rs);
|
||||
+ bbr_update_gains(sk);
|
||||
}
|
||||
|
||||
static void bbr_main(struct sock *sk, const struct rate_sample *rs)
|
||||
@@ -878,6 +1029,13 @@ static void bbr_init(struct sock *sk)
|
||||
bbr_reset_lt_bw_sampling(sk);
|
||||
bbr_reset_startup_mode(sk);
|
||||
|
||||
+ bbr->ack_epoch_mstamp = tp->tcp_mstamp;
|
||||
+ bbr->ack_epoch_acked = 0;
|
||||
+ bbr->extra_acked_win_rtts = 0;
|
||||
+ bbr->extra_acked_win_idx = 0;
|
||||
+ bbr->extra_acked[0] = 0;
|
||||
+ bbr->extra_acked[1] = 0;
|
||||
+
|
||||
cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-msm.c
|
||||
+++ b/drivers/mmc/host/sdhci-msm.c
|
||||
@@ -1694,7 +1694,7 @@ MODULE_DEVICE_TABLE(of, sdhci_msm_dt_mat
|
||||
@@ -1710,7 +1710,7 @@ MODULE_DEVICE_TABLE(of, sdhci_msm_dt_mat
|
||||
|
||||
static const struct sdhci_ops sdhci_msm_ops = {
|
||||
.reset = sdhci_reset,
|
||||
|
||||
@ -15,7 +15,7 @@ so the info might change.
|
||||
|
||||
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||
@@ -571,6 +571,34 @@
|
||||
@@ -593,6 +593,34 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
|
||||
--- a/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||
+++ b/arch/arm/boot/dts/qcom-ipq4019.dtsi
|
||||
@@ -599,6 +599,29 @@
|
||||
@@ -621,6 +621,29 @@
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||
};
|
||||
|
||||
cpus {
|
||||
@@ -622,6 +624,64 @@
|
||||
@@ -644,6 +646,64 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/arch/mips/Kconfig
|
||||
+++ b/arch/mips/Kconfig
|
||||
@@ -2318,6 +2318,12 @@ config MIPS_VPE_LOADER
|
||||
@@ -2319,6 +2319,12 @@ config MIPS_VPE_LOADER
|
||||
Includes a loader for loading an elf relocatable object
|
||||
onto another VPE and running it.
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user