From: Sasha Levin Date: Sun, 31 Jul 2022 02:41:30 +0000 (-0400) Subject: Fixes for 4.19 X-Git-Tag: v5.4.209~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9cc61e1750fe75a3b56224aa5bf3a594707c8bf2;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/documentation-fix-sctp_wmem-in-ip-sysctl.rst.patch b/queue-4.19/documentation-fix-sctp_wmem-in-ip-sysctl.rst.patch new file mode 100644 index 00000000000..5664f259fb2 --- /dev/null +++ b/queue-4.19/documentation-fix-sctp_wmem-in-ip-sysctl.rst.patch @@ -0,0 +1,49 @@ +From 4d4fe325cd8680d596b0a713cd94cfb05cb9d83c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jul 2022 10:35:46 -0400 +Subject: Documentation: fix sctp_wmem in ip-sysctl.rst + +From: Xin Long + +[ Upstream commit aa709da0e032cee7c202047ecd75f437bb0126ed ] + +Since commit 1033990ac5b2 ("sctp: implement memory accounting on tx path"), +SCTP has supported memory accounting on tx path where 'sctp_wmem' is used +by sk_wmem_schedule(). So we should fix the description for this option in +ip-sysctl.rst accordingly. + +v1->v2: + - Improve the description as Marcelo suggested. + +Fixes: 1033990ac5b2 ("sctp: implement memory accounting on tx path") +Signed-off-by: Xin Long +Acked-by: Marcelo Ricardo Leitner +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + Documentation/networking/ip-sysctl.txt | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt +index e315e6052b9f..eb24b8137226 100644 +--- a/Documentation/networking/ip-sysctl.txt ++++ b/Documentation/networking/ip-sysctl.txt +@@ -2170,7 +2170,14 @@ sctp_rmem - vector of 3 INTEGERs: min, default, max + Default: 4K + + sctp_wmem - vector of 3 INTEGERs: min, default, max +- Currently this tunable has no effect. ++ Only the first value ("min") is used, "default" and "max" are ++ ignored. ++ ++ min: Minimum size of send buffer that can be used by SCTP sockets. ++ It is guaranteed to each SCTP socket (but not association) even ++ under moderate memory pressure. ++ ++ Default: 4K + + addr_scope_policy - INTEGER + Control IPv4 address scoping - draft-stewart-tsvwg-sctp-ipv4-00 +-- +2.35.1 + diff --git a/queue-4.19/i40e-fix-interface-init-with-msi-interrupts-no-msi-x.patch b/queue-4.19/i40e-fix-interface-init-with-msi-interrupts-no-msi-x.patch new file mode 100644 index 00000000000..d6f3bd29812 --- /dev/null +++ b/queue-4.19/i40e-fix-interface-init-with-msi-interrupts-no-msi-x.patch @@ -0,0 +1,49 @@ +From fea9c5d1cd8575e6acfec5f4e7f98279939bc2ac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 10:54:01 -0700 +Subject: i40e: Fix interface init with MSI interrupts (no MSI-X) + +From: Michal Maloszewski + +[ Upstream commit 5fcbb711024aac6d4db385623e6f2fdf019f7782 ] + +Fix the inability to bring an interface up on a setup with +only MSI interrupts enabled (no MSI-X). +Solution is to add a default number of QPs = 1. This is enough, +since without MSI-X support driver enables only a basic feature set. + +Fixes: bc6d33c8d93f ("i40e: Fix the number of queues available to be mapped for use") +Signed-off-by: Dawid Lukwinski +Signed-off-by: Michal Maloszewski +Tested-by: Dave Switzer +Signed-off-by: Tony Nguyen +Link: https://lore.kernel.org/r/20220722175401.112572-1-anthony.l.nguyen@intel.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 3615c6533cf4..2f3b393e5506 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -1808,11 +1808,15 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, + * non-zero req_queue_pairs says that user requested a new + * queue count via ethtool's set_channels, so use this + * value for queues distribution across traffic classes ++ * We need at least one queue pair for the interface ++ * to be usable as we see in else statement. + */ + if (vsi->req_queue_pairs > 0) + vsi->num_queue_pairs = vsi->req_queue_pairs; + else if (pf->flags & I40E_FLAG_MSIX_ENABLED) + vsi->num_queue_pairs = pf->num_lan_msix; ++ else ++ vsi->num_queue_pairs = 1; + } + + /* Number of queues per enabled TC */ +-- +2.35.1 + diff --git a/queue-4.19/igmp-fix-data-races-around-sysctl_igmp_qrv.patch b/queue-4.19/igmp-fix-data-races-around-sysctl_igmp_qrv.patch new file mode 100644 index 00000000000..db8db9a1826 --- /dev/null +++ b/queue-4.19/igmp-fix-data-races-around-sysctl_igmp_qrv.patch @@ -0,0 +1,127 @@ +From 7d2a6656756feb65f56573d54edfa70f14f954f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jul 2022 10:17:44 -0700 +Subject: igmp: Fix data-races around sysctl_igmp_qrv. + +From: Kuniyuki Iwashima + +[ Upstream commit 8ebcc62c738f68688ee7c6fec2efe5bc6d3d7e60 ] + +While reading sysctl_igmp_qrv, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its readers. + +This test can be packed into a helper, so such changes will be in the +follow-up series after net is merged into net-next. + + qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + +Fixes: a9fe8e29945d ("ipv4: implement igmp_qrv sysctl to tune igmp robustness variable") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/igmp.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c +index b831825f234f..a08acb54b6b0 100644 +--- a/net/ipv4/igmp.c ++++ b/net/ipv4/igmp.c +@@ -831,7 +831,7 @@ static void igmp_ifc_event(struct in_device *in_dev) + struct net *net = dev_net(in_dev->dev); + if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) + return; +- WRITE_ONCE(in_dev->mr_ifc_count, in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv); ++ WRITE_ONCE(in_dev->mr_ifc_count, in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv)); + igmp_ifc_start_timer(in_dev, 1); + } + +@@ -1013,7 +1013,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb, + * received value was zero, use the default or statically + * configured value. + */ +- in_dev->mr_qrv = ih3->qrv ?: net->ipv4.sysctl_igmp_qrv; ++ in_dev->mr_qrv = ih3->qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + in_dev->mr_qi = IGMPV3_QQIC(ih3->qqic)*HZ ?: IGMP_QUERY_INTERVAL; + + /* RFC3376, 8.3. Query Response Interval: +@@ -1192,7 +1192,7 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im) + pmc->interface = im->interface; + in_dev_hold(in_dev); + pmc->multiaddr = im->multiaddr; +- pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + pmc->sfmode = im->sfmode; + if (pmc->sfmode == MCAST_INCLUDE) { + struct ip_sf_list *psf; +@@ -1243,9 +1243,11 @@ static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) + swap(im->tomb, pmc->tomb); + swap(im->sources, pmc->sources); + for (psf = im->sources; psf; psf = psf->sf_next) +- psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ psf->sf_crcount = in_dev->mr_qrv ?: ++ READ_ONCE(net->ipv4.sysctl_igmp_qrv); + } else { +- im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ im->crcount = in_dev->mr_qrv ?: ++ READ_ONCE(net->ipv4.sysctl_igmp_qrv); + } + in_dev_put(pmc->interface); + kfree_pmc(pmc); +@@ -1347,7 +1349,7 @@ static void igmp_group_added(struct ip_mc_list *im) + if (in_dev->dead) + return; + +- im->unsolicit_count = net->ipv4.sysctl_igmp_qrv; ++ im->unsolicit_count = READ_ONCE(net->ipv4.sysctl_igmp_qrv); + if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) { + spin_lock_bh(&im->lock); + igmp_start_timer(im, IGMP_INITIAL_REPORT_DELAY); +@@ -1361,7 +1363,7 @@ static void igmp_group_added(struct ip_mc_list *im) + * IN() to IN(A). + */ + if (im->sfmode == MCAST_EXCLUDE) +- im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ im->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + + igmp_ifc_event(in_dev); + #endif +@@ -1769,7 +1771,7 @@ static void ip_mc_reset(struct in_device *in_dev) + + in_dev->mr_qi = IGMP_QUERY_INTERVAL; + in_dev->mr_qri = IGMP_QUERY_RESPONSE_INTERVAL; +- in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv; ++ in_dev->mr_qrv = READ_ONCE(net->ipv4.sysctl_igmp_qrv); + } + #else + static void ip_mc_reset(struct in_device *in_dev) +@@ -1903,7 +1905,7 @@ static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode, + #ifdef CONFIG_IP_MULTICAST + if (psf->sf_oldin && + !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) { +- psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ psf->sf_crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + psf->sf_next = pmc->tomb; + pmc->tomb = psf; + rv = 1; +@@ -1967,7 +1969,7 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode, + /* filter mode change */ + pmc->sfmode = MCAST_INCLUDE; + #ifdef CONFIG_IP_MULTICAST +- pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount); + for (psf = pmc->sources; psf; psf = psf->sf_next) + psf->sf_crcount = 0; +@@ -2146,7 +2148,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, + #ifdef CONFIG_IP_MULTICAST + /* else no filters; keep old mode for reports */ + +- pmc->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; ++ pmc->crcount = in_dev->mr_qrv ?: READ_ONCE(net->ipv4.sysctl_igmp_qrv); + WRITE_ONCE(in_dev->mr_ifc_count, pmc->crcount); + for (psf = pmc->sources; psf; psf = psf->sf_next) + psf->sf_crcount = 0; +-- +2.35.1 + diff --git a/queue-4.19/net-sungem_phy-add-of_node_put-for-reference-returne.patch b/queue-4.19/net-sungem_phy-add-of_node_put-for-reference-returne.patch new file mode 100644 index 00000000000..be8ebbe1e89 --- /dev/null +++ b/queue-4.19/net-sungem_phy-add-of_node_put-for-reference-returne.patch @@ -0,0 +1,37 @@ +From 48b2aa7f06f6181dac844e3dc465822a24201cd8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 21:10:03 +0800 +Subject: net: sungem_phy: Add of_node_put() for reference returned by + of_get_parent() + +From: Liang He + +[ Upstream commit ebbbe23fdf6070e31509638df3321688358cc211 ] + +In bcm5421_init(), we should call of_node_put() for the reference +returned by of_get_parent() which has increased the refcount. + +Fixes: 3c326fe9cb7a ("[PATCH] ppc64: Add new PHY to sungem") +Signed-off-by: Liang He +Link: https://lore.kernel.org/r/20220720131003.1287426-1-windhl@126.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/sungem_phy.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/sungem_phy.c b/drivers/net/sungem_phy.c +index 63a8ff816e59..e556b00dfed2 100644 +--- a/drivers/net/sungem_phy.c ++++ b/drivers/net/sungem_phy.c +@@ -453,6 +453,7 @@ static int bcm5421_init(struct mii_phy* phy) + int can_low_power = 1; + if (np == NULL || of_get_property(np, "no-autolowpower", NULL)) + can_low_power = 0; ++ of_node_put(np); + if (can_low_power) { + /* Enable automatic low-power */ + sungem_phy_write(phy, 0x1c, 0x9002); +-- +2.35.1 + diff --git a/queue-4.19/netfilter-nf_queue-do-not-allow-packet-truncation-be.patch b/queue-4.19/netfilter-nf_queue-do-not-allow-packet-truncation-be.patch new file mode 100644 index 00000000000..ac0c03d2604 --- /dev/null +++ b/queue-4.19/netfilter-nf_queue-do-not-allow-packet-truncation-be.patch @@ -0,0 +1,53 @@ +From f14c55a6b039e195de5c9abb8bf7f8c9ffe67e75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jul 2022 12:42:06 +0200 +Subject: netfilter: nf_queue: do not allow packet truncation below transport + header offset + +From: Florian Westphal + +[ Upstream commit 99a63d36cb3ed5ca3aa6fcb64cffbeaf3b0fb164 ] + +Domingo Dirutigliano and Nicola Guerrera report kernel panic when +sending nf_queue verdict with 1-byte nfta_payload attribute. + +The IP/IPv6 stack pulls the IP(v6) header from the packet after the +input hook. + +If user truncates the packet below the header size, this skb_pull() will +result in a malformed skb (skb->len < 0). + +Fixes: 7af4cc3fa158 ("[NETFILTER]: Add "nfnetlink_queue" netfilter queue handler over nfnetlink") +Reported-by: Domingo Dirutigliano +Signed-off-by: Florian Westphal +Reviewed-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nfnetlink_queue.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c +index a5aff2834bd6..cd496b074a71 100644 +--- a/net/netfilter/nfnetlink_queue.c ++++ b/net/netfilter/nfnetlink_queue.c +@@ -850,11 +850,16 @@ nfqnl_enqueue_packet(struct nf_queue_entry *entry, unsigned int queuenum) + } + + static int +-nfqnl_mangle(void *data, int data_len, struct nf_queue_entry *e, int diff) ++nfqnl_mangle(void *data, unsigned int data_len, struct nf_queue_entry *e, int diff) + { + struct sk_buff *nskb; + + if (diff < 0) { ++ unsigned int min_len = skb_transport_offset(e->skb); ++ ++ if (data_len < min_len) ++ return -EINVAL; ++ + if (pskb_trim(e->skb, data_len)) + return -ENOMEM; + } else if (diff > 0) { +-- +2.35.1 + diff --git a/queue-4.19/perf-symbol-correct-address-for-bss-symbols.patch b/queue-4.19/perf-symbol-correct-address-for-bss-symbols.patch new file mode 100644 index 00000000000..fb30acd1ffb --- /dev/null +++ b/queue-4.19/perf-symbol-correct-address-for-bss-symbols.patch @@ -0,0 +1,182 @@ +From 5912671ed38ff5a8dabcdf46974a55ae17ff3f92 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Jul 2022 14:00:12 +0800 +Subject: perf symbol: Correct address for bss symbols + +From: Leo Yan + +[ Upstream commit 2d86612aacb7805f72873691a2644d7279ed0630 ] + +When using 'perf mem' and 'perf c2c', an issue is observed that tool +reports the wrong offset for global data symbols. This is a common +issue on both x86 and Arm64 platforms. + +Let's see an example, for a test program, below is the disassembly for +its .bss section which is dumped with objdump: + + ... + + Disassembly of section .bss: + + 0000000000004040 : + ... + + 0000000000004080 : + ... + + 00000000000040c0 : + ... + + 0000000000004100 : + ... + +First we used 'perf mem record' to run the test program and then used +'perf --debug verbose=4 mem report' to observe what's the symbol info +for 'buf1' and 'buf2' structures. + + # ./perf mem record -e ldlat-loads,ldlat-stores -- false_sharing.exe 8 + # ./perf --debug verbose=4 mem report + ... + dso__load_sym_internal: adjusting symbol: st_value: 0x40c0 sh_addr: 0x4040 sh_offset: 0x3028 + symbol__new: buf2 0x30a8-0x30e8 + ... + dso__load_sym_internal: adjusting symbol: st_value: 0x4080 sh_addr: 0x4040 sh_offset: 0x3028 + symbol__new: buf1 0x3068-0x30a8 + ... + +The perf tool relies on libelf to parse symbols, in executable and +shared object files, 'st_value' holds a virtual address; 'sh_addr' is +the address at which section's first byte should reside in memory, and +'sh_offset' is the byte offset from the beginning of the file to the +first byte in the section. The perf tool uses below formula to convert +a symbol's memory address to a file address: + + file_address = st_value - sh_addr + sh_offset + ^ + ` Memory address + +We can see the final adjusted address ranges for buf1 and buf2 are +[0x30a8-0x30e8) and [0x3068-0x30a8) respectively, apparently this is +incorrect, in the code, the structure for 'buf1' and 'buf2' specifies +compiler attribute with 64-byte alignment. + +The problem happens for 'sh_offset', libelf returns it as 0x3028 which +is not 64-byte aligned, combining with disassembly, it's likely libelf +doesn't respect the alignment for .bss section, therefore, it doesn't +return the aligned value for 'sh_offset'. + +Suggested by Fangrui Song, ELF file contains program header which +contains PT_LOAD segments, the fields p_vaddr and p_offset in PT_LOAD +segments contain the execution info. A better choice for converting +memory address to file address is using the formula: + + file_address = st_value - p_vaddr + p_offset + +This patch introduces elf_read_program_header() which returns the +program header based on the passed 'st_value', then it uses the formula +above to calculate the symbol file address; and the debugging log is +updated respectively. + +After applying the change: + + # ./perf --debug verbose=4 mem report + ... + dso__load_sym_internal: adjusting symbol: st_value: 0x40c0 p_vaddr: 0x3d28 p_offset: 0x2d28 + symbol__new: buf2 0x30c0-0x3100 + ... + dso__load_sym_internal: adjusting symbol: st_value: 0x4080 p_vaddr: 0x3d28 p_offset: 0x2d28 + symbol__new: buf1 0x3080-0x30c0 + ... + +Fixes: f17e04afaff84b5c ("perf report: Fix ELF symbol parsing") +Reported-by: Chang Rui +Suggested-by: Fangrui Song +Signed-off-by: Leo Yan +Acked-by: Namhyung Kim +Cc: Alexander Shishkin +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20220724060013.171050-2-leo.yan@linaro.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol-elf.c | 45 ++++++++++++++++++++++++++++++++---- + 1 file changed, 41 insertions(+), 4 deletions(-) + +diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c +index 166c621e0223..bd33d6613929 100644 +--- a/tools/perf/util/symbol-elf.c ++++ b/tools/perf/util/symbol-elf.c +@@ -201,6 +201,33 @@ Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, + return NULL; + } + ++static int elf_read_program_header(Elf *elf, u64 vaddr, GElf_Phdr *phdr) ++{ ++ size_t i, phdrnum; ++ u64 sz; ++ ++ if (elf_getphdrnum(elf, &phdrnum)) ++ return -1; ++ ++ for (i = 0; i < phdrnum; i++) { ++ if (gelf_getphdr(elf, i, phdr) == NULL) ++ return -1; ++ ++ if (phdr->p_type != PT_LOAD) ++ continue; ++ ++ sz = max(phdr->p_memsz, phdr->p_filesz); ++ if (!sz) ++ continue; ++ ++ if (vaddr >= phdr->p_vaddr && (vaddr < phdr->p_vaddr + sz)) ++ return 0; ++ } ++ ++ /* Not found any valid program header */ ++ return -1; ++} ++ + static bool want_demangle(bool is_kernel_sym) + { + return is_kernel_sym ? symbol_conf.demangle_kernel : symbol_conf.demangle; +@@ -1063,6 +1090,7 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, + sym.st_value); + used_opd = true; + } ++ + /* + * When loading symbols in a data mapping, ABS symbols (which + * has a value of SHN_ABS in its st_shndx) failed at +@@ -1099,11 +1127,20 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss, + goto out_elf_end; + } else if ((used_opd && runtime_ss->adjust_symbols) || + (!used_opd && syms_ss->adjust_symbols)) { ++ GElf_Phdr phdr; ++ ++ if (elf_read_program_header(syms_ss->elf, ++ (u64)sym.st_value, &phdr)) { ++ pr_warning("%s: failed to find program header for " ++ "symbol: %s st_value: %#" PRIx64 "\n", ++ __func__, elf_name, (u64)sym.st_value); ++ continue; ++ } + pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " " +- "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__, +- (u64)sym.st_value, (u64)shdr.sh_addr, +- (u64)shdr.sh_offset); +- sym.st_value -= shdr.sh_addr - shdr.sh_offset; ++ "p_vaddr: %#" PRIx64 " p_offset: %#" PRIx64 "\n", ++ __func__, (u64)sym.st_value, (u64)phdr.p_vaddr, ++ (u64)phdr.p_offset); ++ sym.st_value -= phdr.p_vaddr - phdr.p_offset; + } + + demangled = demangle_sym(dso, kmodule, elf_name); +-- +2.35.1 + diff --git a/queue-4.19/sctp-fix-sleep-in-atomic-context-bug-in-timer-handle.patch b/queue-4.19/sctp-fix-sleep-in-atomic-context-bug-in-timer-handle.patch new file mode 100644 index 00000000000..c545bf1dd95 --- /dev/null +++ b/queue-4.19/sctp-fix-sleep-in-atomic-context-bug-in-timer-handle.patch @@ -0,0 +1,61 @@ +From 0a89b0d48a5670c7b1ad83536469539f8b6453e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Jul 2022 09:58:09 +0800 +Subject: sctp: fix sleep in atomic context bug in timer handlers + +From: Duoming Zhou + +[ Upstream commit b89fc26f741d9f9efb51cba3e9b241cf1380ec5a ] + +There are sleep in atomic context bugs in timer handlers of sctp +such as sctp_generate_t3_rtx_event(), sctp_generate_probe_event(), +sctp_generate_t1_init_event(), sctp_generate_timeout_event(), +sctp_generate_t3_rtx_event() and so on. + +The root cause is sctp_sched_prio_init_sid() with GFP_KERNEL parameter +that may sleep could be called by different timer handlers which is in +interrupt context. + +One of the call paths that could trigger bug is shown below: + + (interrupt context) +sctp_generate_probe_event + sctp_do_sm + sctp_side_effects + sctp_cmd_interpreter + sctp_outq_teardown + sctp_outq_init + sctp_sched_set_sched + n->init_sid(..,GFP_KERNEL) + sctp_sched_prio_init_sid //may sleep + +This patch changes gfp_t parameter of init_sid in sctp_sched_set_sched() +from GFP_KERNEL to GFP_ATOMIC in order to prevent sleep in atomic +context bugs. + +Fixes: 5bbbbe32a431 ("sctp: introduce stream scheduler foundations") +Signed-off-by: Duoming Zhou +Acked-by: Marcelo Ricardo Leitner +Link: https://lore.kernel.org/r/20220723015809.11553-1-duoming@zju.edu.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + net/sctp/stream_sched.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/sctp/stream_sched.c b/net/sctp/stream_sched.c +index a6c04a94b08f..3a5c0d00e96c 100644 +--- a/net/sctp/stream_sched.c ++++ b/net/sctp/stream_sched.c +@@ -178,7 +178,7 @@ int sctp_sched_set_sched(struct sctp_association *asoc, + if (!SCTP_SO(&asoc->stream, i)->ext) + continue; + +- ret = n->init_sid(&asoc->stream, i, GFP_KERNEL); ++ ret = n->init_sid(&asoc->stream, i, GFP_ATOMIC); + if (ret) + goto err; + } +-- +2.35.1 + diff --git a/queue-4.19/series b/queue-4.19/series index f6fbf461cf2..d098e4c553e 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -9,3 +9,16 @@ tcp-fix-a-data-race-around-sysctl_tcp_nometrics_save.patch scsi-ufs-host-hold-reference-returned-by-of_parse_phandle.patch tcp-fix-a-data-race-around-sysctl_tcp_challenge_ack_limit.patch net-ping6-fix-memleak-in-ipv6_renew_options.patch +igmp-fix-data-races-around-sysctl_igmp_qrv.patch +net-sungem_phy-add-of_node_put-for-reference-returne.patch +tcp-fix-a-data-race-around-sysctl_tcp_min_tso_segs.patch +tcp-fix-a-data-race-around-sysctl_tcp_min_rtt_wlen.patch +tcp-fix-a-data-race-around-sysctl_tcp_autocorking.patch +tcp-fix-a-data-race-around-sysctl_tcp_invalid_rateli.patch +documentation-fix-sctp_wmem-in-ip-sysctl.rst.patch +tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_dela.patch +tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_nr.patch +i40e-fix-interface-init-with-msi-interrupts-no-msi-x.patch +sctp-fix-sleep-in-atomic-context-bug-in-timer-handle.patch +netfilter-nf_queue-do-not-allow-packet-truncation-be.patch +perf-symbol-correct-address-for-bss-symbols.patch diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_autocorking.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_autocorking.patch new file mode 100644 index 00000000000..f107df2de9f --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_autocorking.patch @@ -0,0 +1,36 @@ +From b5f05fd014e0de25765497861ac2b298ad6f7e5c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 09:50:25 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_autocorking. + +From: Kuniyuki Iwashima + +[ Upstream commit 85225e6f0a76e6745bc841c9f25169c509b573d8 ] + +While reading sysctl_tcp_autocorking, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its reader. + +Fixes: f54b311142a9 ("tcp: auto corking") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 7acc0d07f148..768a7daab559 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -706,7 +706,7 @@ static bool tcp_should_autocork(struct sock *sk, struct sk_buff *skb, + int size_goal) + { + return skb->len < size_goal && +- sock_net(sk)->ipv4.sysctl_tcp_autocorking && ++ READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_autocorking) && + !tcp_rtx_queue_empty(sk) && + refcount_read(&sk->sk_wmem_alloc) > skb->truesize; + } +-- +2.35.1 + diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_dela.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_dela.patch new file mode 100644 index 00000000000..f78abdb33a9 --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_dela.patch @@ -0,0 +1,37 @@ +From c49e789b7d79b86dd80db24d79c0ba77a513ead5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 11:22:01 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_comp_sack_delay_ns. + +From: Kuniyuki Iwashima + +[ Upstream commit 4866b2b0f7672b6d760c4b8ece6fb56f965dcc8a ] + +While reading sysctl_tcp_comp_sack_delay_ns, it can be changed +concurrently. Thus, we need to add READ_ONCE() to its reader. + +Fixes: 6d82aa242092 ("tcp: add tcp_comp_sack_delay_ns sysctl") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_input.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 38412d93400a..b71866aba426 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -5262,7 +5262,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) + if (tp->srtt_us && tp->srtt_us < rtt) + rtt = tp->srtt_us; + +- delay = min_t(unsigned long, sock_net(sk)->ipv4.sysctl_tcp_comp_sack_delay_ns, ++ delay = min_t(unsigned long, ++ READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_comp_sack_delay_ns), + rtt * (NSEC_PER_USEC >> 3)/20); + sock_hold(sk); + hrtimer_start(&tp->compressed_ack_timer, ns_to_ktime(delay), +-- +2.35.1 + diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_nr.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_nr.patch new file mode 100644 index 00000000000..c851a5e4e35 --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_comp_sack_nr.patch @@ -0,0 +1,36 @@ +From 75b97c52f2924b2070dd124273d2eca10079d907 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jul 2022 11:22:03 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_comp_sack_nr. + +From: Kuniyuki Iwashima + +[ Upstream commit 79f55473bfc8ac51bd6572929a679eeb4da22251 ] + +While reading sysctl_tcp_comp_sack_nr, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its reader. + +Fixes: 9c21d2fc41c0 ("tcp: add tcp_comp_sack_nr sysctl") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_input.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index b71866aba426..e1d065ea5a15 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -5239,7 +5239,7 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) + } + + if (!tcp_is_sack(tp) || +- tp->compressed_ack >= sock_net(sk)->ipv4.sysctl_tcp_comp_sack_nr) ++ tp->compressed_ack >= READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_comp_sack_nr)) + goto send_now; + + if (tp->compressed_ack_rcv_nxt != tp->rcv_nxt) { +-- +2.35.1 + diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_invalid_rateli.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_invalid_rateli.patch new file mode 100644 index 00000000000..582f4192912 --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_invalid_rateli.patch @@ -0,0 +1,37 @@ +From 67a114439496316dcbf344a5e13f28ed70e1b6de Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 09:50:26 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_invalid_ratelimit. + +From: Kuniyuki Iwashima + +[ Upstream commit 2afdbe7b8de84c28e219073a6661080e1b3ded48 ] + +While reading sysctl_tcp_invalid_ratelimit, it can be changed +concurrently. Thus, we need to add READ_ONCE() to its reader. + +Fixes: 032ee4236954 ("tcp: helpers to mitigate ACK loops by rate-limiting out-of-window dupacks") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_input.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index 04788bd5e82c..38412d93400a 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -3420,7 +3420,8 @@ static bool __tcp_oow_rate_limited(struct net *net, int mib_idx, + if (*last_oow_ack_time) { + s32 elapsed = (s32)(tcp_jiffies32 - *last_oow_ack_time); + +- if (0 <= elapsed && elapsed < net->ipv4.sysctl_tcp_invalid_ratelimit) { ++ if (0 <= elapsed && ++ elapsed < READ_ONCE(net->ipv4.sysctl_tcp_invalid_ratelimit)) { + NET_INC_STATS(net, mib_idx); + return true; /* rate-limited: don't send yet! */ + } +-- +2.35.1 + diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_rtt_wlen.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_rtt_wlen.patch new file mode 100644 index 00000000000..54840c27fac --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_rtt_wlen.patch @@ -0,0 +1,36 @@ +From 2a1ba880dd59a6b949044741a1eac4fff7b914da Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 09:50:24 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_min_rtt_wlen. + +From: Kuniyuki Iwashima + +[ Upstream commit 1330ffacd05fc9ac4159d19286ce119e22450ed2 ] + +While reading sysctl_tcp_min_rtt_wlen, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its reader. + +Fixes: f672258391b4 ("tcp: track min RTT using windowed min-filter") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_input.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c +index f2dac14caeb3..04788bd5e82c 100644 +--- a/net/ipv4/tcp_input.c ++++ b/net/ipv4/tcp_input.c +@@ -2903,7 +2903,7 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una, + + static void tcp_update_rtt_min(struct sock *sk, u32 rtt_us, const int flag) + { +- u32 wlen = sock_net(sk)->ipv4.sysctl_tcp_min_rtt_wlen * HZ; ++ u32 wlen = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_min_rtt_wlen) * HZ; + struct tcp_sock *tp = tcp_sk(sk); + + if ((flag & FLAG_ACK_MAYBE_DELAYED) && rtt_us > tcp_min_rtt(tp)) { +-- +2.35.1 + diff --git a/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_tso_segs.patch b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_tso_segs.patch new file mode 100644 index 00000000000..80344110e7e --- /dev/null +++ b/queue-4.19/tcp-fix-a-data-race-around-sysctl_tcp_min_tso_segs.patch @@ -0,0 +1,36 @@ +From 2709d28d266e25da6534a938aec0dc3749f27e75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jul 2022 09:50:22 -0700 +Subject: tcp: Fix a data-race around sysctl_tcp_min_tso_segs. + +From: Kuniyuki Iwashima + +[ Upstream commit e0bb4ab9dfddd872622239f49fb2bd403b70853b ] + +While reading sysctl_tcp_min_tso_segs, it can be changed concurrently. +Thus, we need to add READ_ONCE() to its reader. + +Fixes: 95bd09eb2750 ("tcp: TSO packets automatic sizing") +Signed-off-by: Kuniyuki Iwashima +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + net/ipv4/tcp_output.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c +index 13d9e8570ce5..3090b61e4edd 100644 +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -1745,7 +1745,7 @@ static u32 tcp_tso_segs(struct sock *sk, unsigned int mss_now) + + min_tso = ca_ops->min_tso_segs ? + ca_ops->min_tso_segs(sk) : +- sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs; ++ READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs); + + tso_segs = tcp_tso_autosize(sk, mss_now, min_tso); + return min_t(u32, tso_segs, sk->sk_gso_max_segs); +-- +2.35.1 +