]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Sun, 30 Jan 2022 03:40:47 +0000 (22:40 -0500)
committerSasha Levin <sashal@kernel.org>
Sun, 30 Jan 2022 03:40:47 +0000 (22:40 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
58 files changed:
queue-5.10/arm-9170-1-fix-panic-when-kasan-and-kprobe-are-enabl.patch-30400 [new file with mode: 0644]
queue-5.10/ata-pata_platform-fix-a-null-pointer-dereference-in-.patch-22417 [new file with mode: 0644]
queue-5.10/drm-msm-dpu-invalid-parameter-check-in-dpu_setup_dsp.patch-23932 [new file with mode: 0644]
queue-5.10/drm-msm-dsi-fix-missing-put_device-call-in-dsi_get_p.patch-11600 [new file with mode: 0644]
queue-5.10/drm-msm-dsi-invalid-parameter-check-in-msm_dsi_phy_e.patch-27026 [new file with mode: 0644]
queue-5.10/drm-msm-fix-wrong-size-calculation.patch-26799 [new file with mode: 0644]
queue-5.10/drm-msm-hdmi-fix-missing-put_device-call-in-msm_hdmi.patch-14235 [new file with mode: 0644]
queue-5.10/efi-libstub-arm64-fix-image-check-alignment-at-entry.patch-16098 [new file with mode: 0644]
queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6646-6647-664.patch-31110 [new file with mode: 0644]
queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6654.patch-31788 [new file with mode: 0644]
queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6680.patch-25015 [new file with mode: 0644]
queue-5.10/hwmon-lm90-reduce-maximum-conversion-rate-for-g781.patch-19402 [new file with mode: 0644]
queue-5.10/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch-21045 [new file with mode: 0644]
queue-5.10/i40e-fix-issue-when-maximum-queues-is-exceeded.patch-24471 [new file with mode: 0644]
queue-5.10/i40e-fix-queues-reservation-for-xdp.patch-15396 [new file with mode: 0644]
queue-5.10/i40e-fix-unsigned-stat-widths.patch-20948 [new file with mode: 0644]
queue-5.10/i40e-increase-delay-to-1-s-after-global-emp-reset.patch-13096 [new file with mode: 0644]
queue-5.10/ibmvnic-don-t-spin-in-tasklet.patch-9595 [new file with mode: 0644]
queue-5.10/ibmvnic-init-running_cap_crqs-early.patch-3045 [new file with mode: 0644]
queue-5.10/ipv4-avoid-using-shared-ip-generator-for-connected-s.patch-2008 [new file with mode: 0644]
queue-5.10/ipv4-fix-ip-option-filtering-for-locally-generated-f.patch-27601 [new file with mode: 0644]
queue-5.10/ipv4-raw-lock-the-socket-in-raw_bind.patch-1741 [new file with mode: 0644]
queue-5.10/ipv4-remove-sparse-error-in-ip_neigh_gw4.patch-3162 [new file with mode: 0644]
queue-5.10/ipv4-tcp-send-zero-ipid-in-synack-messages.patch-31729 [new file with mode: 0644]
queue-5.10/ipv6-annotate-accesses-to-fn-fn_sernum.patch-11803 [new file with mode: 0644]
queue-5.10/ipv6-correct-comments-about-fib6_node-sernum.patch-17310 [new file with mode: 0644]
queue-5.10/ipv6_tunnel-rate-limit-warning-messages.patch-10619 [new file with mode: 0644]
queue-5.10/kernel-delete-repeated-words-in-comments.patch-15671 [new file with mode: 0644]
queue-5.10/net-bridge-vlan-fix-memory-leak-in-__allowed_ingress.patch-11653 [new file with mode: 0644]
queue-5.10/net-bridge-vlan-fix-single-net-device-option-dumping.patch-32125 [new file with mode: 0644]
queue-5.10/net-cpsw-properly-initialise-struct-page_pool_params.patch-12745 [new file with mode: 0644]
queue-5.10/net-fix-information-leakage-in-proc-net-ptype.patch-15695 [new file with mode: 0644]
queue-5.10/net-hns3-handle-empty-unknown-interrupt-for-vf.patch-6323 [new file with mode: 0644]
queue-5.10/net-ipv4-fix-the-warning-for-dereference.patch-3212 [new file with mode: 0644]
queue-5.10/net-ipv4-move-ip_options_fragment-out-of-loop.patch-9656 [new file with mode: 0644]
queue-5.10/net-phy-broadcom-hook-up-soft_reset-for-bcm54616s.patch-27858 [new file with mode: 0644]
queue-5.10/net-procfs-show-net-devices-bound-packet-types.patch-14776 [new file with mode: 0644]
queue-5.10/netfilter-conntrack-don-t-increment-invalid-counter-.patch-23162 [new file with mode: 0644]
queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-15600 [new file with mode: 0644]
queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-8657 [new file with mode: 0644]
queue-5.10/nfsv4-handle-case-where-the-lookup-of-a-directory-fa.patch-15449 [new file with mode: 0644]
queue-5.10/nfsv4-nfs_atomic_open-can-race-when-looking-up-a-non.patch-27002 [new file with mode: 0644]
queue-5.10/octeontx2-pf-forward-error-codes-to-vf.patch-28837 [new file with mode: 0644]
queue-5.10/perf-fix-perf_event_read_local-time.patch-26974 [new file with mode: 0644]
queue-5.10/phylib-fix-potential-use-after-free.patch-8764 [new file with mode: 0644]
queue-5.10/ping-fix-the-sk_bound_dev_if-match-in-ping_lookup.patch-18872 [new file with mode: 0644]
queue-5.10/powerpc-perf-fix-power_pmu_disable-to-call-clear_pmi.patch-26206 [new file with mode: 0644]
queue-5.10/powerpc64-bpf-limit-ldbrx-to-processors-compliant-wi.patch-12659 [new file with mode: 0644]
queue-5.10/revert-ipv6-honor-all-ipv6-pio-valid-lifetime-values.patch-17485 [new file with mode: 0644]
queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ctr.patch-7720 [new file with mode: 0644]
queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ept.patch-26480 [new file with mode: 0644]
queue-5.10/rxrpc-adjust-retransmission-backoff.patch-30293 [new file with mode: 0644]
queue-5.10/sched-pelt-relax-the-sync-of-util_sum-with-util_avg.patch-4811 [new file with mode: 0644]
queue-5.10/scsi-bnx2fc-flush-destroy_work-queue-before-calling-.patch-1575 [new file with mode: 0644]
queue-5.10/series
queue-5.10/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch-6053 [new file with mode: 0644]
queue-5.10/video-hyperv_fb-fix-validation-of-screen-resolution.patch-11533 [new file with mode: 0644]
queue-5.10/yam-fix-a-memory-leak-in-yam_siocdevprivate.patch-10148 [new file with mode: 0644]

diff --git a/queue-5.10/arm-9170-1-fix-panic-when-kasan-and-kprobe-are-enabl.patch-30400 b/queue-5.10/arm-9170-1-fix-panic-when-kasan-and-kprobe-are-enabl.patch-30400
new file mode 100644 (file)
index 0000000..bb6cd24
--- /dev/null
@@ -0,0 +1,119 @@
+From 39bc21f81ebc63b0fc01a81e9a6d627f6c775470 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Dec 2021 10:08:23 +0100
+Subject: ARM: 9170/1: fix panic when kasan and kprobe are enabled
+
+From: sparkhuang <huangshaobo6@huawei.com>
+
+[ Upstream commit 8b59b0a53c840921b625378f137e88adfa87647e ]
+
+arm32 uses software to simulate the instruction replaced
+by kprobe. some instructions may be simulated by constructing
+assembly functions. therefore, before executing instruction
+simulation, it is necessary to construct assembly function
+execution environment in C language through binding registers.
+after kasan is enabled, the register binding relationship will
+be destroyed, resulting in instruction simulation errors and
+causing kernel panic.
+
+the kprobe emulate instruction function is distributed in three
+files: actions-common.c actions-arm.c actions-thumb.c, so disable
+KASAN when compiling these files.
+
+for example, use kprobe insert on cap_capable+20 after kasan
+enabled, the cap_capable assembly code is as follows:
+<cap_capable>:
+e92d47f0       push    {r4, r5, r6, r7, r8, r9, sl, lr}
+e1a05000       mov     r5, r0
+e280006c       add     r0, r0, #108    ; 0x6c
+e1a04001       mov     r4, r1
+e1a06002       mov     r6, r2
+e59fa090       ldr     sl, [pc, #144]  ;
+ebfc7bf8       bl      c03aa4b4 <__asan_load4>
+e595706c       ldr     r7, [r5, #108]  ; 0x6c
+e2859014       add     r9, r5, #20
+......
+The emulate_ldr assembly code after enabling kasan is as follows:
+c06f1384 <emulate_ldr>:
+e92d47f0       push    {r4, r5, r6, r7, r8, r9, sl, lr}
+e282803c       add     r8, r2, #60     ; 0x3c
+e1a05000       mov     r5, r0
+e7e37855       ubfx    r7, r5, #16, #4
+e1a00008       mov     r0, r8
+e1a09001       mov     r9, r1
+e1a04002       mov     r4, r2
+ebf35462       bl      c03c6530 <__asan_load4>
+e357000f       cmp     r7, #15
+e7e36655       ubfx    r6, r5, #12, #4
+e205a00f       and     sl, r5, #15
+0a000001       beq     c06f13bc <emulate_ldr+0x38>
+e0840107       add     r0, r4, r7, lsl #2
+ebf3545c       bl      c03c6530 <__asan_load4>
+e084010a       add     r0, r4, sl, lsl #2
+ebf3545a       bl      c03c6530 <__asan_load4>
+e2890010       add     r0, r9, #16
+ebf35458       bl      c03c6530 <__asan_load4>
+e5990010       ldr     r0, [r9, #16]
+e12fff30       blx     r0
+e356000f       cm      r6, #15
+1a000014       bne     c06f1430 <emulate_ldr+0xac>
+e1a06000       mov     r6, r0
+e2840040       add     r0, r4, #64     ; 0x40
+......
+
+when running in emulate_ldr to simulate the ldr instruction, panic
+occurred, and the log is as follows:
+Unable to handle kernel NULL pointer dereference at virtual address
+00000090
+pgd = ecb46400
+[00000090] *pgd=2e0fa003, *pmd=00000000
+Internal error: Oops: 206 [#1] SMP ARM
+PC is at cap_capable+0x14/0xb0
+LR is at emulate_ldr+0x50/0xc0
+psr: 600d0293 sp : ecd63af8  ip : 00000004  fp : c0a7c30c
+r10: 00000000  r9 : c30897f4  r8 : ecd63cd4
+r7 : 0000000f  r6 : 0000000a  r5 : e59fa090  r4 : ecd63c98
+r3 : c06ae294  r2 : 00000000  r1 : b7611300  r0 : bf4ec008
+Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
+Control: 32c5387d  Table: 2d546400  DAC: 55555555
+Process bash (pid: 1643, stack limit = 0xecd60190)
+(cap_capable) from (kprobe_handler+0x218/0x340)
+(kprobe_handler) from (kprobe_trap_handler+0x24/0x48)
+(kprobe_trap_handler) from (do_undefinstr+0x13c/0x364)
+(do_undefinstr) from (__und_svc_finish+0x0/0x30)
+(__und_svc_finish) from (cap_capable+0x18/0xb0)
+(cap_capable) from (cap_vm_enough_memory+0x38/0x48)
+(cap_vm_enough_memory) from
+(security_vm_enough_memory_mm+0x48/0x6c)
+(security_vm_enough_memory_mm) from
+(copy_process.constprop.5+0x16b4/0x25c8)
+(copy_process.constprop.5) from (_do_fork+0xe8/0x55c)
+(_do_fork) from (SyS_clone+0x1c/0x24)
+(SyS_clone) from (__sys_trace_return+0x0/0x10)
+Code: 0050a0e1 6c0080e2 0140a0e1 0260a0e1 (f801f0e7)
+
+Fixes: 35aa1df43283 ("ARM kprobes: instruction single-stepping support")
+Fixes: 421015713b30 ("ARM: 9017/2: Enable KASan for ARM")
+Signed-off-by: huangshaobo <huangshaobo6@huawei.com>
+Acked-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/probes/kprobes/Makefile | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/arm/probes/kprobes/Makefile b/arch/arm/probes/kprobes/Makefile
+index 14db56f49f0a3..6159010dac4a6 100644
+--- a/arch/arm/probes/kprobes/Makefile
++++ b/arch/arm/probes/kprobes/Makefile
+@@ -1,4 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
++KASAN_SANITIZE_actions-common.o := n
++KASAN_SANITIZE_actions-arm.o := n
++KASAN_SANITIZE_actions-thumb.o := n
+ obj-$(CONFIG_KPROBES)         += core.o actions-common.o checkers-common.o
+ obj-$(CONFIG_ARM_KPROBES_TEST)        += test-kprobes.o
+ test-kprobes-objs             := test-core.o
+-- 
+2.34.1
+
diff --git a/queue-5.10/ata-pata_platform-fix-a-null-pointer-dereference-in-.patch-22417 b/queue-5.10/ata-pata_platform-fix-a-null-pointer-dereference-in-.patch-22417
new file mode 100644 (file)
index 0000000..070799e
--- /dev/null
@@ -0,0 +1,46 @@
+From 88fe25462a0e8852afedf05f6673494e4fa7c49a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 00:45:25 +0800
+Subject: ata: pata_platform: Fix a NULL pointer dereference in
+ __pata_platform_probe()
+
+From: Zhou Qingyang <zhou1615@umn.edu>
+
+[ Upstream commit 9b6d90e2085ca2ce72ef9ea78658bf270855e62e ]
+
+In __pata_platform_probe(), devm_kzalloc() is assigned to ap->ops and
+there is a dereference of it right after that, which could introduce a
+NULL pointer dereference bug.
+
+Fix this by adding a NULL check of ap->ops.
+
+This bug was found by a static analyzer.
+
+Builds with 'make allyesconfig' show no new warnings,
+and our static analyzer no longer warns about this code.
+
+Fixes: f3d5e4f18dba ("ata: pata_of_platform: Allow to use 16-bit wide data transfer")
+Signed-off-by: Zhou Qingyang <zhou1615@umn.edu>
+Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
+Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ata/pata_platform.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c
+index 5aba691f09af5..3ab05145caaf9 100644
+--- a/drivers/ata/pata_platform.c
++++ b/drivers/ata/pata_platform.c
+@@ -126,6 +126,8 @@ int __pata_platform_probe(struct device *dev, struct resource *io_res,
+       ap = host->ports[0];
+       ap->ops = devm_kzalloc(dev, sizeof(*ap->ops), GFP_KERNEL);
++      if (!ap->ops)
++              return -ENOMEM;
+       ap->ops->inherits = &ata_sff_port_ops;
+       ap->ops->cable_detect = ata_cable_unknown;
+       ap->ops->set_mode = pata_platform_set_mode;
+-- 
+2.34.1
+
diff --git a/queue-5.10/drm-msm-dpu-invalid-parameter-check-in-dpu_setup_dsp.patch-23932 b/queue-5.10/drm-msm-dpu-invalid-parameter-check-in-dpu_setup_dsp.patch-23932
new file mode 100644 (file)
index 0000000..ac85902
--- /dev/null
@@ -0,0 +1,54 @@
+From 2dedc00854dfbddbc995b33c83e891ae2c00d5e7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 9 Jan 2022 20:24:31 +0100
+Subject: drm/msm/dpu: invalid parameter check in dpu_setup_dspp_pcc
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: José Expósito <jose.exposito89@gmail.com>
+
+[ Upstream commit 170b22234d5495f5e0844246e23f004639ee89ba ]
+
+The function performs a check on the "ctx" input parameter, however, it
+is used before the check.
+
+Initialize the "base" variable after the sanity check to avoid a
+possible NULL pointer dereference.
+
+Fixes: 4259ff7ae509e ("drm/msm/dpu: add support for pcc color block in dpu driver")
+Addresses-Coverity-ID: 1493866 ("Null pointer dereference")
+Signed-off-by: José Expósito <jose.exposito89@gmail.com>
+Link: https://lore.kernel.org/r/20220109192431.135949-1-jose.exposito89@gmail.com
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
+index a7a24539921f3..a6efc11eba93f 100644
+--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c
+@@ -26,9 +26,16 @@ static void dpu_setup_dspp_pcc(struct dpu_hw_dspp *ctx,
+               struct dpu_hw_pcc_cfg *cfg)
+ {
+-      u32 base = ctx->cap->sblk->pcc.base;
++      u32 base;
+-      if (!ctx || !base) {
++      if (!ctx) {
++              DRM_ERROR("invalid ctx %pK\n", ctx);
++              return;
++      }
++
++      base = ctx->cap->sblk->pcc.base;
++
++      if (!base) {
+               DRM_ERROR("invalid ctx %pK pcc base 0x%x\n", ctx, base);
+               return;
+       }
+-- 
+2.34.1
+
diff --git a/queue-5.10/drm-msm-dsi-fix-missing-put_device-call-in-dsi_get_p.patch-11600 b/queue-5.10/drm-msm-dsi-fix-missing-put_device-call-in-dsi_get_p.patch-11600
new file mode 100644 (file)
index 0000000..e668fb3
--- /dev/null
@@ -0,0 +1,44 @@
+From bcbb984327fbfee9e5a085379a87fe29434da088 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Dec 2021 07:09:40 +0000
+Subject: drm/msm/dsi: Fix missing put_device() call in dsi_get_phy
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ Upstream commit c04c3148ca12227d92f91b355b4538cc333c9922 ]
+
+If of_find_device_by_node() succeeds, dsi_get_phy() doesn't
+a corresponding put_device(). Thus add put_device() to fix the exception
+handling.
+
+Fixes: ec31abf ("drm/msm/dsi: Separate PHY to another platform device")
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20211230070943.18116-1-linmq006@gmail.com
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/dsi/dsi.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
+index 1adead764feed..f845333593daa 100644
+--- a/drivers/gpu/drm/msm/dsi/dsi.c
++++ b/drivers/gpu/drm/msm/dsi/dsi.c
+@@ -33,7 +33,12 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
+       of_node_put(phy_node);
+-      if (!phy_pdev || !msm_dsi->phy) {
++      if (!phy_pdev) {
++              DRM_DEV_ERROR(&pdev->dev, "%s: phy driver is not ready\n", __func__);
++              return -EPROBE_DEFER;
++      }
++      if (!msm_dsi->phy) {
++              put_device(&phy_pdev->dev);
+               DRM_DEV_ERROR(&pdev->dev, "%s: phy driver is not ready\n", __func__);
+               return -EPROBE_DEFER;
+       }
+-- 
+2.34.1
+
diff --git a/queue-5.10/drm-msm-dsi-invalid-parameter-check-in-msm_dsi_phy_e.patch-27026 b/queue-5.10/drm-msm-dsi-invalid-parameter-check-in-msm_dsi_phy_e.patch-27026
new file mode 100644 (file)
index 0000000..d997405
--- /dev/null
@@ -0,0 +1,52 @@
+From 68dd88ae64fc7ec453470200a802d5c02ded3da8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jan 2022 19:18:44 +0100
+Subject: drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: José Expósito <jose.exposito89@gmail.com>
+
+[ Upstream commit 5e761a2287234bc402ba7ef07129f5103bcd775c ]
+
+The function performs a check on the "phy" input parameter, however, it
+is used before the check.
+
+Initialize the "dev" variable after the sanity check to avoid a possible
+NULL pointer dereference.
+
+Fixes: 5c8290284402b ("drm/msm/dsi: Split PHY drivers to separate files")
+Addresses-Coverity-ID: 1493860 ("Null pointer dereference")
+Signed-off-by: José Expósito <jose.exposito89@gmail.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20220116181844.7400-1-jose.exposito89@gmail.com
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
+index e8c1a727179cc..e07986ab52c22 100644
+--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
++++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
+@@ -769,12 +769,14 @@ void __exit msm_dsi_phy_driver_unregister(void)
+ int msm_dsi_phy_enable(struct msm_dsi_phy *phy, int src_pll_id,
+                       struct msm_dsi_phy_clk_request *clk_req)
+ {
+-      struct device *dev = &phy->pdev->dev;
++      struct device *dev;
+       int ret;
+       if (!phy || !phy->cfg->ops.enable)
+               return -EINVAL;
++      dev = &phy->pdev->dev;
++
+       ret = dsi_phy_enable_resource(phy);
+       if (ret) {
+               DRM_DEV_ERROR(dev, "%s: resource enable failed, %d\n",
+-- 
+2.34.1
+
diff --git a/queue-5.10/drm-msm-fix-wrong-size-calculation.patch-26799 b/queue-5.10/drm-msm-fix-wrong-size-calculation.patch-26799
new file mode 100644 (file)
index 0000000..580d15d
--- /dev/null
@@ -0,0 +1,46 @@
+From 9a786093dac5154fa3e09fd2410a1358f270c5a1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 12 Jan 2022 20:33:34 +0800
+Subject: drm/msm: Fix wrong size calculation
+
+From: Xianting Tian <xianting.tian@linux.alibaba.com>
+
+[ Upstream commit 0a727b459ee39bd4c5ced19d6024258ac87b6b2e ]
+
+For example, memory-region in .dts as below,
+       reg = <0x0 0x50000000 0x0 0x20000000>
+
+We can get below values,
+struct resource r;
+r.start = 0x50000000;
+r.end  = 0x6fffffff;
+
+So the size should be:
+size = r.end - r.start + 1 = 0x20000000
+
+Signed-off-by: Xianting Tian <xianting.tian@linux.alibaba.com>
+Fixes: 072f1f9168ed ("drm/msm: add support for "stolen" mem")
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20220112123334.749776-1-xianting.tian@linux.alibaba.com
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/msm_drv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
+index 33e42b2f9cfcb..e37e5afc680a2 100644
+--- a/drivers/gpu/drm/msm/msm_drv.c
++++ b/drivers/gpu/drm/msm/msm_drv.c
+@@ -350,7 +350,7 @@ static int msm_init_vram(struct drm_device *dev)
+               of_node_put(node);
+               if (ret)
+                       return ret;
+-              size = r.end - r.start;
++              size = r.end - r.start + 1;
+               DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);
+               /* if we have no IOMMU, then we need to use carveout allocator.
+-- 
+2.34.1
+
diff --git a/queue-5.10/drm-msm-hdmi-fix-missing-put_device-call-in-msm_hdmi.patch-14235 b/queue-5.10/drm-msm-hdmi-fix-missing-put_device-call-in-msm_hdmi.patch-14235
new file mode 100644 (file)
index 0000000..7758e69
--- /dev/null
@@ -0,0 +1,47 @@
+From 9b2430e6c1911cd4669af52a4a9d2b942bf1ecf3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 08:50:22 +0000
+Subject: drm/msm/hdmi: Fix missing put_device() call in msm_hdmi_get_phy
+
+From: Miaoqian Lin <linmq006@gmail.com>
+
+[ Upstream commit 774fe0cd838d1b1419d41ab4ea0613c80d4ecbd7 ]
+
+The reference taken by 'of_find_device_by_node()' must be released when
+not needed anymore.
+Add the corresponding 'put_device()' in the error handling path.
+
+Fixes: e00012b256d4 ("drm/msm/hdmi: Make HDMI core get its PHY")
+Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20220107085026.23831-1-linmq006@gmail.com
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/hdmi/hdmi.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
+index 737453b6e5966..94f948ef279d1 100644
+--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
++++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
+@@ -97,10 +97,15 @@ static int msm_hdmi_get_phy(struct hdmi *hdmi)
+       of_node_put(phy_node);
+-      if (!phy_pdev || !hdmi->phy) {
++      if (!phy_pdev) {
+               DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n");
+               return -EPROBE_DEFER;
+       }
++      if (!hdmi->phy) {
++              DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n");
++              put_device(&phy_pdev->dev);
++              return -EPROBE_DEFER;
++      }
+       hdmi->phy_dev = get_device(&phy_pdev->dev);
+-- 
+2.34.1
+
diff --git a/queue-5.10/efi-libstub-arm64-fix-image-check-alignment-at-entry.patch-16098 b/queue-5.10/efi-libstub-arm64-fix-image-check-alignment-at-entry.patch-16098
new file mode 100644 (file)
index 0000000..0a7b007
--- /dev/null
@@ -0,0 +1,49 @@
+From 8f38d6564f7fbb6cf1fee8f776439b682cd0569b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jan 2022 18:14:27 +0200
+Subject: efi/libstub: arm64: Fix image check alignment at entry
+
+From: Mihai Carabas <mihai.carabas@oracle.com>
+
+[ Upstream commit e9b7c3a4263bdcfd31bc3d03d48ce0ded7a94635 ]
+
+The kernel is aligned at SEGMENT_SIZE and this is the size populated in the PE
+headers:
+
+arch/arm64/kernel/efi-header.S: .long   SEGMENT_ALIGN // SectionAlignment
+
+EFI_KIMG_ALIGN is defined as: (SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN :
+THREAD_ALIGN)
+
+So it depends on THREAD_ALIGN. On newer builds this message started to appear
+even though the loader is taking into account the PE header (which is stating
+SEGMENT_ALIGN).
+
+Fixes: c32ac11da3f8 ("efi/libstub: arm64: Double check image alignment at entry")
+Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/efi/libstub/arm64-stub.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/firmware/efi/libstub/arm64-stub.c b/drivers/firmware/efi/libstub/arm64-stub.c
+index c1b57dfb12776..415a971e76947 100644
+--- a/drivers/firmware/efi/libstub/arm64-stub.c
++++ b/drivers/firmware/efi/libstub/arm64-stub.c
+@@ -119,9 +119,9 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
+       if (image->image_base != _text)
+               efi_err("FIRMWARE BUG: efi_loaded_image_t::image_base has bogus value\n");
+-      if (!IS_ALIGNED((u64)_text, EFI_KIMG_ALIGN))
+-              efi_err("FIRMWARE BUG: kernel image not aligned on %ldk boundary\n",
+-                      EFI_KIMG_ALIGN >> 10);
++      if (!IS_ALIGNED((u64)_text, SEGMENT_ALIGN))
++              efi_err("FIRMWARE BUG: kernel image not aligned on %dk boundary\n",
++                      SEGMENT_ALIGN >> 10);
+       kernel_size = _edata - _text;
+       kernel_memsize = kernel_size + (_end - _edata);
+-- 
+2.34.1
+
diff --git a/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6646-6647-664.patch-31110 b/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6646-6647-664.patch-31110
new file mode 100644 (file)
index 0000000..d6f2e73
--- /dev/null
@@ -0,0 +1,36 @@
+From 6e31625367381564a932a98672037663929075c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 12:36:41 -0800
+Subject: hwmon: (lm90) Mark alert as broken for MAX6646/6647/6649
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit f614629f9c1080dcc844a8430e3fb4c37ebbf05d ]
+
+Experiments with MAX6646 and MAX6648 show that the alert function of those
+chips is broken, similar to other chips supported by the lm90 driver.
+Mark it accordingly.
+
+Fixes: 4667bcb8d8fc ("hwmon: (lm90) Introduce chip parameter structure")
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/lm90.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
+index 54140340c54aa..a7142c32889c0 100644
+--- a/drivers/hwmon/lm90.c
++++ b/drivers/hwmon/lm90.c
+@@ -394,7 +394,7 @@ static const struct lm90_params lm90_params[] = {
+               .max_convrate = 9,
+       },
+       [max6646] = {
+-              .flags = LM90_HAVE_CRIT,
++              .flags = LM90_HAVE_CRIT | LM90_HAVE_BROKEN_ALERT,
+               .alert_alarms = 0x7c,
+               .max_convrate = 6,
+               .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
+-- 
+2.34.1
+
diff --git a/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6654.patch-31788 b/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6654.patch-31788
new file mode 100644 (file)
index 0000000..2f3e199
--- /dev/null
@@ -0,0 +1,35 @@
+From 5026bca57bd6dfd6f88b36766a3755fe87c9dafd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 11:05:23 -0800
+Subject: hwmon: (lm90) Mark alert as broken for MAX6654
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit a53fff96f35763d132a36c620b183fdf11022d7a ]
+
+Experiments with MAX6654 show that its alert function is broken,
+similar to other chips supported by the lm90 driver. Mark it accordingly.
+
+Fixes: 229d495d8189 ("hwmon: (lm90) Add max6654 support to lm90 driver")
+Cc: Josh Lehan <krellan@google.com>
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/lm90.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
+index fef02bcfedbcf..6841d0401bbd4 100644
+--- a/drivers/hwmon/lm90.c
++++ b/drivers/hwmon/lm90.c
+@@ -400,6 +400,7 @@ static const struct lm90_params lm90_params[] = {
+               .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
+       },
+       [max6654] = {
++              .flags = LM90_HAVE_BROKEN_ALERT,
+               .alert_alarms = 0x7c,
+               .max_convrate = 7,
+               .reg_local_ext = MAX6657_REG_R_LOCAL_TEMPL,
+-- 
+2.34.1
+
diff --git a/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6680.patch-25015 b/queue-5.10/hwmon-lm90-mark-alert-as-broken-for-max6680.patch-25015
new file mode 100644 (file)
index 0000000..96885d0
--- /dev/null
@@ -0,0 +1,36 @@
+From cfa9fa9d56bd90e6ea5c3d7facf93802cf9b6fbf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jan 2022 11:11:00 -0800
+Subject: hwmon: (lm90) Mark alert as broken for MAX6680
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit 94746b0ba479743355e0d3cc1cb9cfe3011fb8be ]
+
+Experiments with MAX6680 and MAX6681 show that the alert function of those
+chips is broken, similar to other chips supported by the lm90 driver.
+Mark it accordingly.
+
+Fixes: 4667bcb8d8fc ("hwmon: (lm90) Introduce chip parameter structure")
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/lm90.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
+index 6841d0401bbd4..54140340c54aa 100644
+--- a/drivers/hwmon/lm90.c
++++ b/drivers/hwmon/lm90.c
+@@ -419,7 +419,7 @@ static const struct lm90_params lm90_params[] = {
+       },
+       [max6680] = {
+               .flags = LM90_HAVE_OFFSET | LM90_HAVE_CRIT
+-                | LM90_HAVE_CRIT_ALRM_SWP,
++                | LM90_HAVE_CRIT_ALRM_SWP | LM90_HAVE_BROKEN_ALERT,
+               .alert_alarms = 0x7c,
+               .max_convrate = 7,
+       },
+-- 
+2.34.1
+
diff --git a/queue-5.10/hwmon-lm90-reduce-maximum-conversion-rate-for-g781.patch-19402 b/queue-5.10/hwmon-lm90-reduce-maximum-conversion-rate-for-g781.patch-19402
new file mode 100644 (file)
index 0000000..4a39d40
--- /dev/null
@@ -0,0 +1,44 @@
+From cb388cc8af400a1f7b17822694e3116766d29c92 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jan 2022 11:48:52 -0800
+Subject: hwmon: (lm90) Reduce maximum conversion rate for G781
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit a66c5ed539277b9f2363bbace0dba88b85b36c26 ]
+
+According to its datasheet, G781 supports a maximum conversion rate value
+of 8 (62.5 ms). However, chips labeled G781 and G780 were found to only
+support a maximum conversion rate value of 7 (125 ms). On the other side,
+chips labeled G781-1 and G784 were found to support a conversion rate value
+of 8. There is no known means to distinguish G780 from G781 or G784; all
+chips report the same manufacturer ID and chip revision.
+Setting the conversion rate register value to 8 on chips not supporting
+it causes unexpected behavior since the real conversion rate is set to 0
+(16 seconds) if a value of 8 is written into the conversion rate register.
+Limit the conversion rate register value to 7 for all G78x chips to avoid
+the problem.
+
+Fixes: ae544f64cc7b ("hwmon: (lm90) Add support for GMT G781")
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/lm90.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
+index 959446b0137bc..fef02bcfedbcf 100644
+--- a/drivers/hwmon/lm90.c
++++ b/drivers/hwmon/lm90.c
+@@ -373,7 +373,7 @@ static const struct lm90_params lm90_params[] = {
+               .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
+                 | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_CRIT,
+               .alert_alarms = 0x7c,
+-              .max_convrate = 8,
++              .max_convrate = 7,
+       },
+       [lm86] = {
+               .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT
+-- 
+2.34.1
+
diff --git a/queue-5.10/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch-21045 b/queue-5.10/i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch-21045
new file mode 100644 (file)
index 0000000..8e5dbaa
--- /dev/null
@@ -0,0 +1,129 @@
+From f27405fc6f79c4888a1455ab9b0cfcf9b7b90316 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 2 Dec 2021 12:52:01 +0100
+Subject: i40e: Fix for failed to init adminq while VF reset
+
+From: Karen Sornek <karen.sornek@intel.com>
+
+[ Upstream commit 0f344c8129a5337dae50e31b817dd50a60ff238c ]
+
+Fix for failed to init adminq: -53 while VF is resetting via MAC
+address changing procedure.
+Added sync module to avoid reading deadbeef value in reinit adminq
+during software reset.
+Without this patch it is possible to trigger VF reset procedure
+during reinit adminq. This resulted in an incorrect reading of
+value from the AQP registers and generated the -53 error.
+
+Fixes: 5c3c48ac6bf5 ("i40e: implement virtual device interface")
+Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
+Signed-off-by: Karen Sornek <karen.sornek@intel.com>
+Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../net/ethernet/intel/i40e/i40e_register.h   |  3 ++
+ .../ethernet/intel/i40e/i40e_virtchnl_pf.c    | 44 ++++++++++++++++++-
+ .../ethernet/intel/i40e/i40e_virtchnl_pf.h    |  1 +
+ 3 files changed, 46 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_register.h b/drivers/net/ethernet/intel/i40e/i40e_register.h
+index 564df22f3f463..8335f151ceefc 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_register.h
++++ b/drivers/net/ethernet/intel/i40e/i40e_register.h
+@@ -279,6 +279,9 @@
+ #define I40E_VFINT_DYN_CTLN(_INTVF) (0x00024800 + ((_INTVF) * 4)) /* _i=0...511 */ /* Reset: VFR */
+ #define I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT 1
+ #define I40E_VFINT_DYN_CTLN_CLEARPBA_MASK I40E_MASK(0x1, I40E_VFINT_DYN_CTLN_CLEARPBA_SHIFT)
++#define I40E_VFINT_ICR0_ADMINQ_SHIFT 30
++#define I40E_VFINT_ICR0_ADMINQ_MASK I40E_MASK(0x1, I40E_VFINT_ICR0_ADMINQ_SHIFT)
++#define I40E_VFINT_ICR0_ENA(_VF) (0x0002C000 + ((_VF) * 4)) /* _i=0...127 */ /* Reset: CORER */
+ #define I40E_VPINT_AEQCTL(_VF) (0x0002B800 + ((_VF) * 4)) /* _i=0...127 */ /* Reset: CORER */
+ #define I40E_VPINT_AEQCTL_MSIX_INDX_SHIFT 0
+ #define I40E_VPINT_AEQCTL_ITR_INDX_SHIFT 11
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+index c51701ab189d8..f71b7334e2955 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -1323,6 +1323,32 @@ static i40e_status i40e_config_vf_promiscuous_mode(struct i40e_vf *vf,
+       return aq_ret;
+ }
++/**
++ * i40e_sync_vfr_reset
++ * @hw: pointer to hw struct
++ * @vf_id: VF identifier
++ *
++ * Before trigger hardware reset, we need to know if no other process has
++ * reserved the hardware for any reset operations. This check is done by
++ * examining the status of the RSTAT1 register used to signal the reset.
++ **/
++static int i40e_sync_vfr_reset(struct i40e_hw *hw, int vf_id)
++{
++      u32 reg;
++      int i;
++
++      for (i = 0; i < I40E_VFR_WAIT_COUNT; i++) {
++              reg = rd32(hw, I40E_VFINT_ICR0_ENA(vf_id)) &
++                         I40E_VFINT_ICR0_ADMINQ_MASK;
++              if (reg)
++                      return 0;
++
++              usleep_range(100, 200);
++      }
++
++      return -EAGAIN;
++}
++
+ /**
+  * i40e_trigger_vf_reset
+  * @vf: pointer to the VF structure
+@@ -1337,9 +1363,11 @@ static void i40e_trigger_vf_reset(struct i40e_vf *vf, bool flr)
+       struct i40e_pf *pf = vf->pf;
+       struct i40e_hw *hw = &pf->hw;
+       u32 reg, reg_idx, bit_idx;
++      bool vf_active;
++      u32 radq;
+       /* warn the VF */
+-      clear_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states);
++      vf_active = test_and_clear_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states);
+       /* Disable VF's configuration API during reset. The flag is re-enabled
+        * in i40e_alloc_vf_res(), when it's safe again to access VF's VSI.
+@@ -1353,7 +1381,19 @@ static void i40e_trigger_vf_reset(struct i40e_vf *vf, bool flr)
+        * just need to clean up, so don't hit the VFRTRIG register.
+        */
+       if (!flr) {
+-              /* reset VF using VPGEN_VFRTRIG reg */
++              /* Sync VFR reset before trigger next one */
++              radq = rd32(hw, I40E_VFINT_ICR0_ENA(vf->vf_id)) &
++                          I40E_VFINT_ICR0_ADMINQ_MASK;
++              if (vf_active && !radq)
++                      /* waiting for finish reset by virtual driver */
++                      if (i40e_sync_vfr_reset(hw, vf->vf_id))
++                              dev_info(&pf->pdev->dev,
++                                       "Reset VF %d never finished\n",
++                              vf->vf_id);
++
++              /* Reset VF using VPGEN_VFRTRIG reg. It is also setting
++               * in progress state in rstat1 register.
++               */
+               reg = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_id));
+               reg |= I40E_VPGEN_VFRTRIG_VFSWR_MASK;
+               wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_id), reg);
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
+index 49575a640a84c..03c42fd0fea19 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h
+@@ -19,6 +19,7 @@
+ #define I40E_MAX_VF_PROMISC_FLAGS     3
+ #define I40E_VF_STATE_WAIT_COUNT      20
++#define I40E_VFR_WAIT_COUNT           100
+ /* Various queue ctrls */
+ enum i40e_queue_ctrl {
+-- 
+2.34.1
+
diff --git a/queue-5.10/i40e-fix-issue-when-maximum-queues-is-exceeded.patch-24471 b/queue-5.10/i40e-fix-issue-when-maximum-queues-is-exceeded.patch-24471
new file mode 100644 (file)
index 0000000..ccd59a8
--- /dev/null
@@ -0,0 +1,204 @@
+From 465c5aa15278981b69eb320e9fdb094c46cd88ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Nov 2021 11:17:00 +0000
+Subject: i40e: Fix issue when maximum queues is exceeded
+
+From: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+
+[ Upstream commit d701658a50a471591094b3eb3961b4926cc8f104 ]
+
+Before this patch VF interface vanished when
+maximum queue number was exceeded. Driver tried
+to add next queues even if there was not enough
+space. PF sent incorrect number of queues to
+the VF when there were not enough of them.
+
+Add an additional condition introduced to check
+available space in 'qp_pile' before proceeding.
+This condition makes it impossible to add queues
+if they number is greater than the number resulting
+from available space.
+Also add the search for free space in PF queue
+pair piles.
+
+Without this patch VF interfaces are not seen
+when available space for queues has been
+exceeded and following logs appears permanently
+in dmesg:
+"Unable to get VF config (-32)".
+"VF 62 failed opcode 3, retval: -5"
+"Unable to get VF config due to PF error condition, not retrying"
+
+Fixes: 7daa6bf3294e ("i40e: driver core headers")
+Fixes: 41c445ff0f48 ("i40e: main driver core")
+Signed-off-by: Jaroslaw Gawin <jaroslawx.gawin@intel.com>
+Signed-off-by: Slawomir Laba <slawomirx.laba@intel.com>
+Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/i40e/i40e.h        |  1 -
+ drivers/net/ethernet/intel/i40e/i40e_main.c   | 14 +----
+ .../ethernet/intel/i40e/i40e_virtchnl_pf.c    | 59 +++++++++++++++++++
+ 3 files changed, 61 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
+index 5b83d1bc0e74d..67b0f72f97a24 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e.h
++++ b/drivers/net/ethernet/intel/i40e/i40e.h
+@@ -172,7 +172,6 @@ enum i40e_interrupt_policy {
+ struct i40e_lump_tracking {
+       u16 num_entries;
+-      u16 search_hint;
+       u16 list[0];
+ #define I40E_PILE_VALID_BIT  0x8000
+ #define I40E_IWARP_IRQ_PILE_ID  (I40E_PILE_VALID_BIT - 2)
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index eb26cd1f55713..9614ddc1f5490 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -195,10 +195,6 @@ int i40e_free_virt_mem_d(struct i40e_hw *hw, struct i40e_virt_mem *mem)
+  * @id: an owner id to stick on the items assigned
+  *
+  * Returns the base item index of the lump, or negative for error
+- *
+- * The search_hint trick and lack of advanced fit-finding only work
+- * because we're highly likely to have all the same size lump requests.
+- * Linear search time and any fragmentation should be minimal.
+  **/
+ static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile,
+                        u16 needed, u16 id)
+@@ -213,8 +209,7 @@ static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile,
+               return -EINVAL;
+       }
+-      /* start the linear search with an imperfect hint */
+-      i = pile->search_hint;
++      i = 0;
+       while (i < pile->num_entries) {
+               /* skip already allocated entries */
+               if (pile->list[i] & I40E_PILE_VALID_BIT) {
+@@ -233,7 +228,6 @@ static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile,
+                       for (j = 0; j < needed; j++)
+                               pile->list[i+j] = id | I40E_PILE_VALID_BIT;
+                       ret = i;
+-                      pile->search_hint = i + j;
+                       break;
+               }
+@@ -256,7 +250,7 @@ static int i40e_put_lump(struct i40e_lump_tracking *pile, u16 index, u16 id)
+ {
+       int valid_id = (id | I40E_PILE_VALID_BIT);
+       int count = 0;
+-      int i;
++      u16 i;
+       if (!pile || index >= pile->num_entries)
+               return -EINVAL;
+@@ -268,8 +262,6 @@ static int i40e_put_lump(struct i40e_lump_tracking *pile, u16 index, u16 id)
+               count++;
+       }
+-      if (count && index < pile->search_hint)
+-              pile->search_hint = index;
+       return count;
+ }
+@@ -11321,7 +11313,6 @@ static int i40e_init_interrupt_scheme(struct i40e_pf *pf)
+               return -ENOMEM;
+       pf->irq_pile->num_entries = vectors;
+-      pf->irq_pile->search_hint = 0;
+       /* track first vector for misc interrupts, ignore return */
+       (void)i40e_get_lump(pf, pf->irq_pile, 1, I40E_PILE_VALID_BIT - 1);
+@@ -12124,7 +12115,6 @@ static int i40e_sw_init(struct i40e_pf *pf)
+               goto sw_init_done;
+       }
+       pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp;
+-      pf->qp_pile->search_hint = 0;
+       pf->tx_timeout_recovery_level = 1;
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+index 65c4c4fd359fa..c51701ab189d8 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -2563,6 +2563,59 @@ error_param:
+                                      aq_ret);
+ }
++/**
++ * i40e_check_enough_queue - find big enough queue number
++ * @vf: pointer to the VF info
++ * @needed: the number of items needed
++ *
++ * Returns the base item index of the queue, or negative for error
++ **/
++static int i40e_check_enough_queue(struct i40e_vf *vf, u16 needed)
++{
++      unsigned int  i, cur_queues, more, pool_size;
++      struct i40e_lump_tracking *pile;
++      struct i40e_pf *pf = vf->pf;
++      struct i40e_vsi *vsi;
++
++      vsi = pf->vsi[vf->lan_vsi_idx];
++      cur_queues = vsi->alloc_queue_pairs;
++
++      /* if current allocated queues are enough for need */
++      if (cur_queues >= needed)
++              return vsi->base_queue;
++
++      pile = pf->qp_pile;
++      if (cur_queues > 0) {
++              /* if the allocated queues are not zero
++               * just check if there are enough queues for more
++               * behind the allocated queues.
++               */
++              more = needed - cur_queues;
++              for (i = vsi->base_queue + cur_queues;
++                      i < pile->num_entries; i++) {
++                      if (pile->list[i] & I40E_PILE_VALID_BIT)
++                              break;
++
++                      if (more-- == 1)
++                              /* there is enough */
++                              return vsi->base_queue;
++              }
++      }
++
++      pool_size = 0;
++      for (i = 0; i < pile->num_entries; i++) {
++              if (pile->list[i] & I40E_PILE_VALID_BIT) {
++                      pool_size = 0;
++                      continue;
++              }
++              if (needed <= ++pool_size)
++                      /* there is enough */
++                      return i;
++      }
++
++      return -ENOMEM;
++}
++
+ /**
+  * i40e_vc_request_queues_msg
+  * @vf: pointer to the VF info
+@@ -2597,6 +2650,12 @@ static int i40e_vc_request_queues_msg(struct i40e_vf *vf, u8 *msg)
+                        req_pairs - cur_pairs,
+                        pf->queues_left);
+               vfres->num_queue_pairs = pf->queues_left + cur_pairs;
++      } else if (i40e_check_enough_queue(vf, req_pairs) < 0) {
++              dev_warn(&pf->pdev->dev,
++                       "VF %d requested %d more queues, but there is not enough for it.\n",
++                       vf->vf_id,
++                       req_pairs - cur_pairs);
++              vfres->num_queue_pairs = cur_pairs;
+       } else {
+               /* successful request */
+               vf->num_req_queues = req_pairs;
+-- 
+2.34.1
+
diff --git a/queue-5.10/i40e-fix-queues-reservation-for-xdp.patch-15396 b/queue-5.10/i40e-fix-queues-reservation-for-xdp.patch-15396
new file mode 100644 (file)
index 0000000..4bcef32
--- /dev/null
@@ -0,0 +1,94 @@
+From 7c978979b99dbc14db645d49237b8c48856b22ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 26 Nov 2021 11:11:22 +0100
+Subject: i40e: Fix queues reservation for XDP
+
+From: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
+
+[ Upstream commit 92947844b8beee988c0ce17082b705c2f75f0742 ]
+
+When XDP was configured on a system with large number of CPUs
+and X722 NIC there was a call trace with NULL pointer dereference.
+
+i40e 0000:87:00.0: failed to get tracking for 256 queues for VSI 0 err -12
+i40e 0000:87:00.0: setup of MAIN VSI failed
+
+BUG: kernel NULL pointer dereference, address: 0000000000000000
+RIP: 0010:i40e_xdp+0xea/0x1b0 [i40e]
+Call Trace:
+? i40e_reconfig_rss_queues+0x130/0x130 [i40e]
+dev_xdp_install+0x61/0xe0
+dev_xdp_attach+0x18a/0x4c0
+dev_change_xdp_fd+0x1e6/0x220
+do_setlink+0x616/0x1030
+? ahci_port_stop+0x80/0x80
+? ata_qc_issue+0x107/0x1e0
+? lock_timer_base+0x61/0x80
+? __mod_timer+0x202/0x380
+rtnl_setlink+0xe5/0x170
+? bpf_lsm_binder_transaction+0x10/0x10
+? security_capable+0x36/0x50
+rtnetlink_rcv_msg+0x121/0x350
+? rtnl_calcit.isra.0+0x100/0x100
+netlink_rcv_skb+0x50/0xf0
+netlink_unicast+0x1d3/0x2a0
+netlink_sendmsg+0x22a/0x440
+sock_sendmsg+0x5e/0x60
+__sys_sendto+0xf0/0x160
+? __sys_getsockname+0x7e/0xc0
+? _copy_from_user+0x3c/0x80
+? __sys_setsockopt+0xc8/0x1a0
+__x64_sys_sendto+0x20/0x30
+do_syscall_64+0x33/0x40
+entry_SYSCALL_64_after_hwframe+0x44/0xae
+RIP: 0033:0x7f83fa7a39e0
+
+This was caused by PF queue pile fragmentation due to
+flow director VSI queue being placed right after main VSI.
+Because of this main VSI was not able to resize its
+queue allocation for XDP resulting in no queues allocated
+for main VSI when XDP was turned on.
+
+Fix this by always allocating last queue in PF queue pile
+for a flow director VSI.
+
+Fixes: 41c445ff0f48 ("i40e: main driver core")
+Fixes: 74608d17fe29 ("i40e: add support for XDP_TX action")
+Signed-off-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
+Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
+Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
+Tested-by: Kiran Bhandare <kiranx.bhandare@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/i40e/i40e_main.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index 9614ddc1f5490..500f067d0afcc 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -209,6 +209,20 @@ static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile,
+               return -EINVAL;
+       }
++      /* Allocate last queue in the pile for FDIR VSI queue
++       * so it doesn't fragment the qp_pile
++       */
++      if (pile == pf->qp_pile && pf->vsi[id]->type == I40E_VSI_FDIR) {
++              if (pile->list[pile->num_entries - 1] & I40E_PILE_VALID_BIT) {
++                      dev_err(&pf->pdev->dev,
++                              "Cannot allocate queue %d for I40E_VSI_FDIR\n",
++                              pile->num_entries - 1);
++                      return -ENOMEM;
++              }
++              pile->list[pile->num_entries - 1] = id | I40E_PILE_VALID_BIT;
++              return pile->num_entries - 1;
++      }
++
+       i = 0;
+       while (i < pile->num_entries) {
+               /* skip already allocated entries */
+-- 
+2.34.1
+
diff --git a/queue-5.10/i40e-fix-unsigned-stat-widths.patch-20948 b/queue-5.10/i40e-fix-unsigned-stat-widths.patch-20948
new file mode 100644 (file)
index 0000000..9f36984
--- /dev/null
@@ -0,0 +1,79 @@
+From fe5ec497673a952dffb4c30409113f08d167a3fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Dec 2021 17:56:33 -0800
+Subject: i40e: fix unsigned stat widths
+
+From: Joe Damato <jdamato@fastly.com>
+
+[ Upstream commit 3b8428b84539c78fdc8006c17ebd25afd4722d51 ]
+
+Change i40e_update_vsi_stats and struct i40e_vsi to use u64 fields to match
+the width of the stats counters in struct i40e_rx_queue_stats.
+
+Update debugfs code to use the correct format specifier for u64.
+
+Fixes: 41c445ff0f48 ("i40e: main driver core")
+Signed-off-by: Joe Damato <jdamato@fastly.com>
+Reported-by: kernel test robot <lkp@intel.com>
+Tested-by: Gurucharan G <gurucharanx.g@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/i40e/i40e.h         | 8 ++++----
+ drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +-
+ drivers/net/ethernet/intel/i40e/i40e_main.c    | 4 ++--
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
+index 67b0f72f97a24..effdc3361266f 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e.h
++++ b/drivers/net/ethernet/intel/i40e/i40e.h
+@@ -754,12 +754,12 @@ struct i40e_vsi {
+       struct rtnl_link_stats64 net_stats_offsets;
+       struct i40e_eth_stats eth_stats;
+       struct i40e_eth_stats eth_stats_offsets;
+-      u32 tx_restart;
+-      u32 tx_busy;
++      u64 tx_restart;
++      u64 tx_busy;
+       u64 tx_linearize;
+       u64 tx_force_wb;
+-      u32 rx_buf_failed;
+-      u32 rx_page_failed;
++      u64 rx_buf_failed;
++      u64 rx_page_failed;
+       /* These are containers of ring pointers, allocated at run-time */
+       struct i40e_ring **rx_rings;
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+index 714b578b2b49c..1114a15a9ce3c 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+@@ -240,7 +240,7 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
+                (unsigned long int)vsi->net_stats_offsets.rx_compressed,
+                (unsigned long int)vsi->net_stats_offsets.tx_compressed);
+       dev_info(&pf->pdev->dev,
+-               "    tx_restart = %d, tx_busy = %d, rx_buf_failed = %d, rx_page_failed = %d\n",
++               "    tx_restart = %llu, tx_busy = %llu, rx_buf_failed = %llu, rx_page_failed = %llu\n",
+                vsi->tx_restart, vsi->tx_busy,
+                vsi->rx_buf_failed, vsi->rx_page_failed);
+       rcu_read_lock();
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index 500f067d0afcc..bd18a780a0008 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -777,9 +777,9 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
+       struct rtnl_link_stats64 *ns;   /* netdev stats */
+       struct i40e_eth_stats *oes;
+       struct i40e_eth_stats *es;     /* device's eth stats */
+-      u32 tx_restart, tx_busy;
++      u64 tx_restart, tx_busy;
+       struct i40e_ring *p;
+-      u32 rx_page, rx_buf;
++      u64 rx_page, rx_buf;
+       u64 bytes, packets;
+       unsigned int start;
+       u64 tx_linearize;
+-- 
+2.34.1
+
diff --git a/queue-5.10/i40e-increase-delay-to-1-s-after-global-emp-reset.patch-13096 b/queue-5.10/i40e-increase-delay-to-1-s-after-global-emp-reset.patch-13096
new file mode 100644 (file)
index 0000000..84f005f
--- /dev/null
@@ -0,0 +1,52 @@
+From e2bd35a0eca46df801b07a771e6b625c614dd299 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 28 Oct 2021 13:51:14 +0000
+Subject: i40e: Increase delay to 1 s after global EMP reset
+
+From: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+
+[ Upstream commit 9b13bd53134c9ddd544a790125199fdbdb505e67 ]
+
+Recently simplified i40e_rebuild causes that FW sometimes
+is not ready after NVM update, the ping does not return.
+
+Increase the delay in case of EMP reset.
+Old delay of 300 ms was introduced for specific cards for 710 series.
+Now it works for all the cards and delay was increased.
+
+Fixes: 1fa51a650e1d ("i40e: Add delay after EMP reset for firmware to recover")
+Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
+Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
+Tested-by: Gurucharan G <gurucharanx.g@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/i40e/i40e_main.c | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
+index f888a443a067b..eb26cd1f55713 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
+@@ -10130,15 +10130,9 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
+       }
+       i40e_get_oem_version(&pf->hw);
+-      if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) &&
+-          ((hw->aq.fw_maj_ver == 4 && hw->aq.fw_min_ver <= 33) ||
+-           hw->aq.fw_maj_ver < 4) && hw->mac.type == I40E_MAC_XL710) {
+-              /* The following delay is necessary for 4.33 firmware and older
+-               * to recover after EMP reset. 200 ms should suffice but we
+-               * put here 300 ms to be sure that FW is ready to operate
+-               * after reset.
+-               */
+-              mdelay(300);
++      if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) {
++              /* The following delay is necessary for firmware update. */
++              mdelay(1000);
+       }
+       /* re-verify the eeprom if we just had an EMP reset */
+-- 
+2.34.1
+
diff --git a/queue-5.10/ibmvnic-don-t-spin-in-tasklet.patch-9595 b/queue-5.10/ibmvnic-don-t-spin-in-tasklet.patch-9595
new file mode 100644 (file)
index 0000000..0bd4fb0
--- /dev/null
@@ -0,0 +1,47 @@
+From d313c14ae3039f53c038d9cf5196bdc9c94ac02b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 18:59:20 -0800
+Subject: ibmvnic: don't spin in tasklet
+
+From: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
+
+[ Upstream commit 48079e7fdd0269d66b1d7d66ae88bd03162464ad ]
+
+ibmvnic_tasklet() continuously spins waiting for responses to all
+capability requests. It does this to avoid encountering an error
+during initialization of the vnic. However if there is a bug in the
+VIOS and we do not receive a response to one or more queries the
+tasklet ends up spinning continuously leading to hard lock ups.
+
+If we fail to receive a message from the VIOS it is reasonable to
+timeout the login attempt rather than spin indefinitely in the tasklet.
+
+Fixes: 249168ad07cd ("ibmvnic: Make CRQ interrupt tasklet wait for all capabilities crqs")
+Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
+Reviewed-by: Dany Madden <drt@linux.ibm.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/ibm/ibmvnic.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
+index 232c68af4c60a..c7be7ab131b19 100644
+--- a/drivers/net/ethernet/ibm/ibmvnic.c
++++ b/drivers/net/ethernet/ibm/ibmvnic.c
+@@ -5075,12 +5075,6 @@ static void ibmvnic_tasklet(struct tasklet_struct *t)
+                       ibmvnic_handle_crq(crq, adapter);
+                       crq->generic.first = 0;
+               }
+-
+-              /* remain in tasklet until all
+-               * capabilities responses are received
+-               */
+-              if (!adapter->wait_capability)
+-                      done = true;
+       }
+       /* if capabilities CRQ's were sent in this tasklet, the following
+        * tasklet must wait until all responses are received
+-- 
+2.34.1
+
diff --git a/queue-5.10/ibmvnic-init-running_cap_crqs-early.patch-3045 b/queue-5.10/ibmvnic-init-running_cap_crqs-early.patch-3045
new file mode 100644 (file)
index 0000000..4ca5591
--- /dev/null
@@ -0,0 +1,327 @@
+From 1ba1554235c46fd5b4af8d1ed191b83df2fe6f61 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 18:59:19 -0800
+Subject: ibmvnic: init ->running_cap_crqs early
+
+From: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
+
+[ Upstream commit 151b6a5c06b678687f64f2d9a99fd04d5cd32b72 ]
+
+We use ->running_cap_crqs to determine when the ibmvnic_tasklet() should
+send out the next protocol message type. i.e when we get back responses
+to all our QUERY_CAPABILITY CRQs we send out REQUEST_CAPABILITY crqs.
+Similiary, when we get responses to all the REQUEST_CAPABILITY crqs, we
+send out the QUERY_IP_OFFLOAD CRQ.
+
+We currently increment ->running_cap_crqs as we send out each CRQ and
+have the ibmvnic_tasklet() send out the next message type, when this
+running_cap_crqs count drops to 0.
+
+This assumes that all the CRQs of the current type were sent out before
+the count drops to 0. However it is possible that we send out say 6 CRQs,
+get preempted and receive all the 6 responses before we send out the
+remaining CRQs. This can result in ->running_cap_crqs count dropping to
+zero before all messages of the current type were sent and we end up
+sending the next protocol message too early.
+
+Instead initialize the ->running_cap_crqs upfront so the tasklet will
+only send the next protocol message after all responses are received.
+
+Use the cap_reqs local variable to also detect any discrepancy (either
+now or in future) in the number of capability requests we actually send.
+
+Currently only send_query_cap() is affected by this behavior (of sending
+next message early) since it is called from the worker thread (during
+reset) and from application thread (during ->ndo_open()) and they can be
+preempted. send_request_cap() is only called from the tasklet  which
+processes CRQ responses sequentially, is not be affected.  But to
+maintain the existing symmtery with send_query_capability() we update
+send_request_capability() also.
+
+Fixes: 249168ad07cd ("ibmvnic: Make CRQ interrupt tasklet wait for all capabilities crqs")
+Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
+Reviewed-by: Dany Madden <drt@linux.ibm.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/ibm/ibmvnic.c | 106 +++++++++++++++++++----------
+ 1 file changed, 71 insertions(+), 35 deletions(-)
+
+diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
+index 4f99d97638248..232c68af4c60a 100644
+--- a/drivers/net/ethernet/ibm/ibmvnic.c
++++ b/drivers/net/ethernet/ibm/ibmvnic.c
+@@ -3401,11 +3401,25 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
+       struct device *dev = &adapter->vdev->dev;
+       union ibmvnic_crq crq;
+       int max_entries;
++      int cap_reqs;
++
++      /* We send out 6 or 7 REQUEST_CAPABILITY CRQs below (depending on
++       * the PROMISC flag). Initialize this count upfront. When the tasklet
++       * receives a response to all of these, it will send the next protocol
++       * message (QUERY_IP_OFFLOAD).
++       */
++      if (!(adapter->netdev->flags & IFF_PROMISC) ||
++          adapter->promisc_supported)
++              cap_reqs = 7;
++      else
++              cap_reqs = 6;
+       if (!retry) {
+               /* Sub-CRQ entries are 32 byte long */
+               int entries_page = 4 * PAGE_SIZE / (sizeof(u64) * 4);
++              atomic_set(&adapter->running_cap_crqs, cap_reqs);
++
+               if (adapter->min_tx_entries_per_subcrq > entries_page ||
+                   adapter->min_rx_add_entries_per_subcrq > entries_page) {
+                       dev_err(dev, "Fatal, invalid entries per sub-crq\n");
+@@ -3466,44 +3480,45 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
+                                       adapter->opt_rx_comp_queues;
+               adapter->req_rx_add_queues = adapter->max_rx_add_queues;
++      } else {
++              atomic_add(cap_reqs, &adapter->running_cap_crqs);
+       }
+-
+       memset(&crq, 0, sizeof(crq));
+       crq.request_capability.first = IBMVNIC_CRQ_CMD;
+       crq.request_capability.cmd = REQUEST_CAPABILITY;
+       crq.request_capability.capability = cpu_to_be16(REQ_TX_QUEUES);
+       crq.request_capability.number = cpu_to_be64(adapter->req_tx_queues);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       crq.request_capability.capability = cpu_to_be16(REQ_RX_QUEUES);
+       crq.request_capability.number = cpu_to_be64(adapter->req_rx_queues);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       crq.request_capability.capability = cpu_to_be16(REQ_RX_ADD_QUEUES);
+       crq.request_capability.number = cpu_to_be64(adapter->req_rx_add_queues);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       crq.request_capability.capability =
+           cpu_to_be16(REQ_TX_ENTRIES_PER_SUBCRQ);
+       crq.request_capability.number =
+           cpu_to_be64(adapter->req_tx_entries_per_subcrq);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       crq.request_capability.capability =
+           cpu_to_be16(REQ_RX_ADD_ENTRIES_PER_SUBCRQ);
+       crq.request_capability.number =
+           cpu_to_be64(adapter->req_rx_add_entries_per_subcrq);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       crq.request_capability.capability = cpu_to_be16(REQ_MTU);
+       crq.request_capability.number = cpu_to_be64(adapter->req_mtu);
+-      atomic_inc(&adapter->running_cap_crqs);
++      cap_reqs--;
+       ibmvnic_send_crq(adapter, &crq);
+       if (adapter->netdev->flags & IFF_PROMISC) {
+@@ -3511,16 +3526,21 @@ static void send_request_cap(struct ibmvnic_adapter *adapter, int retry)
+                       crq.request_capability.capability =
+                           cpu_to_be16(PROMISC_REQUESTED);
+                       crq.request_capability.number = cpu_to_be64(1);
+-                      atomic_inc(&adapter->running_cap_crqs);
++                      cap_reqs--;
+                       ibmvnic_send_crq(adapter, &crq);
+               }
+       } else {
+               crq.request_capability.capability =
+                   cpu_to_be16(PROMISC_REQUESTED);
+               crq.request_capability.number = cpu_to_be64(0);
+-              atomic_inc(&adapter->running_cap_crqs);
++              cap_reqs--;
+               ibmvnic_send_crq(adapter, &crq);
+       }
++
++      /* Keep at end to catch any discrepancy between expected and actual
++       * CRQs sent.
++       */
++      WARN_ON(cap_reqs != 0);
+ }
+ static int pending_scrq(struct ibmvnic_adapter *adapter,
+@@ -3953,118 +3973,132 @@ static void send_query_map(struct ibmvnic_adapter *adapter)
+ static void send_query_cap(struct ibmvnic_adapter *adapter)
+ {
+       union ibmvnic_crq crq;
++      int cap_reqs;
++
++      /* We send out 25 QUERY_CAPABILITY CRQs below.  Initialize this count
++       * upfront. When the tasklet receives a response to all of these, it
++       * can send out the next protocol messaage (REQUEST_CAPABILITY).
++       */
++      cap_reqs = 25;
++
++      atomic_set(&adapter->running_cap_crqs, cap_reqs);
+-      atomic_set(&adapter->running_cap_crqs, 0);
+       memset(&crq, 0, sizeof(crq));
+       crq.query_capability.first = IBMVNIC_CRQ_CMD;
+       crq.query_capability.cmd = QUERY_CAPABILITY;
+       crq.query_capability.capability = cpu_to_be16(MIN_TX_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MIN_RX_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MIN_RX_ADD_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_TX_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_RX_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_RX_ADD_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+           cpu_to_be16(MIN_TX_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+           cpu_to_be16(MIN_RX_ADD_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+           cpu_to_be16(MAX_TX_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+           cpu_to_be16(MAX_RX_ADD_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(TCP_IP_OFFLOAD);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(PROMISC_SUPPORTED);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MIN_MTU);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_MTU);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_MULTICAST_FILTERS);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(VLAN_HEADER_INSERTION);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(RX_VLAN_HEADER_INSERTION);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(MAX_TX_SG_ENTRIES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(RX_SG_SUPPORTED);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(OPT_TX_COMP_SUB_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(OPT_RX_COMP_QUEUES);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+                       cpu_to_be16(OPT_RX_BUFADD_Q_PER_RX_COMP_Q);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+                       cpu_to_be16(OPT_TX_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability =
+                       cpu_to_be16(OPT_RXBA_ENTRIES_PER_SUBCRQ);
+-      atomic_inc(&adapter->running_cap_crqs);
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
+       crq.query_capability.capability = cpu_to_be16(TX_RX_DESC_REQ);
+-      atomic_inc(&adapter->running_cap_crqs);
++
+       ibmvnic_send_crq(adapter, &crq);
++      cap_reqs--;
++
++      /* Keep at end to catch any discrepancy between expected and actual
++       * CRQs sent.
++       */
++      WARN_ON(cap_reqs != 0);
+ }
+ static void send_query_ip_offload(struct ibmvnic_adapter *adapter)
+@@ -4369,6 +4403,8 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
+       char *name;
+       atomic_dec(&adapter->running_cap_crqs);
++      netdev_dbg(adapter->netdev, "Outstanding request-caps: %d\n",
++                 atomic_read(&adapter->running_cap_crqs));
+       switch (be16_to_cpu(crq->request_capability_rsp.capability)) {
+       case REQ_TX_QUEUES:
+               req_value = &adapter->req_tx_queues;
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv4-avoid-using-shared-ip-generator-for-connected-s.patch-2008 b/queue-5.10/ipv4-avoid-using-shared-ip-generator-for-connected-s.patch-2008
new file mode 100644 (file)
index 0000000..00ebee8
--- /dev/null
@@ -0,0 +1,70 @@
+From 46819fba426881103c855ef797b36dd104761a2b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 17:10:22 -0800
+Subject: ipv4: avoid using shared IP generator for connected sockets
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 23f57406b82de51809d5812afd96f210f8b627f3 ]
+
+ip_select_ident_segs() has been very conservative about using
+the connected socket private generator only for packets with IP_DF
+set, claiming it was needed for some VJ compression implementations.
+
+As mentioned in this referenced document, this can be abused.
+(Ref: Off-Path TCP Exploits of the Mixed IPID Assignment)
+
+Before switching to pure random IPID generation and possibly hurt
+some workloads, lets use the private inet socket generator.
+
+Not only this will remove one vulnerability, this will also
+improve performance of TCP flows using pmtudisc==IP_PMTUDISC_DONT
+
+Fixes: 73f156a6e8c1 ("inetpeer: get rid of ip_id_count")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Reported-by: Ray Che <xijiache@gmail.com>
+Cc: Willy Tarreau <w@1wt.eu>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/ip.h | 21 ++++++++++-----------
+ 1 file changed, 10 insertions(+), 11 deletions(-)
+
+diff --git a/include/net/ip.h b/include/net/ip.h
+index 5538e54d4620c..de2dc22a78f93 100644
+--- a/include/net/ip.h
++++ b/include/net/ip.h
+@@ -506,19 +506,18 @@ static inline void ip_select_ident_segs(struct net *net, struct sk_buff *skb,
+ {
+       struct iphdr *iph = ip_hdr(skb);
++      /* We had many attacks based on IPID, use the private
++       * generator as much as we can.
++       */
++      if (sk && inet_sk(sk)->inet_daddr) {
++              iph->id = htons(inet_sk(sk)->inet_id);
++              inet_sk(sk)->inet_id += segs;
++              return;
++      }
+       if ((iph->frag_off & htons(IP_DF)) && !skb->ignore_df) {
+-              /* This is only to work around buggy Windows95/2000
+-               * VJ compression implementations.  If the ID field
+-               * does not change, they drop every other packet in
+-               * a TCP stream using header compression.
+-               */
+-              if (sk && inet_sk(sk)->inet_daddr) {
+-                      iph->id = htons(inet_sk(sk)->inet_id);
+-                      inet_sk(sk)->inet_id += segs;
+-              } else {
+-                      iph->id = 0;
+-              }
++              iph->id = 0;
+       } else {
++              /* Unfortunately we need the big hammer to get a suitable IPID */
+               __ip_select_ident(net, iph, segs);
+       }
+ }
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv4-fix-ip-option-filtering-for-locally-generated-f.patch-27601 b/queue-5.10/ipv4-fix-ip-option-filtering-for-locally-generated-f.patch-27601
new file mode 100644 (file)
index 0000000..1f26d9a
--- /dev/null
@@ -0,0 +1,111 @@
+From 6f44a803728e82326c3f3776c1d8f4b1d2162094 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 16:57:31 -0800
+Subject: ipv4: fix ip option filtering for locally generated fragments
+
+From: Jakub Kicinski <kuba@kernel.org>
+
+[ Upstream commit 27a8caa59babb96c5890569e131bc0eb6d45daee ]
+
+During IP fragmentation we sanitize IP options. This means overwriting
+options which should not be copied with NOPs. Only the first fragment
+has the original, full options.
+
+ip_fraglist_prepare() copies the IP header and options from previous
+fragment to the next one. Commit 19c3401a917b ("net: ipv4: place control
+buffer handling away from fragmentation iterators") moved sanitizing
+options before ip_fraglist_prepare() which means options are sanitized
+and then overwritten again with the old values.
+
+Fixing this is not enough, however, nor did the sanitization work
+prior to aforementioned commit.
+
+ip_options_fragment() (which does the sanitization) uses ipcb->opt.optlen
+for the length of the options. ipcb->opt of fragments is not populated
+(it's 0), only the head skb has the state properly built. So even when
+called at the right time ip_options_fragment() does nothing. This seems
+to date back all the way to v2.5.44 when the fast path for pre-fragmented
+skbs had been introduced. Prior to that ip_options_build() would have been
+called for every fragment (in fact ever since v2.5.44 the fragmentation
+handing in ip_options_build() has been dead code, I'll clean it up in
+-next).
+
+In the original patch (see Link) caixf mentions fixing the handling
+for fragments other than the second one, but I'm not sure how _any_
+fragment could have had their options sanitized with the code
+as it stood.
+
+Tested with python (MTU on lo lowered to 1000 to force fragmentation):
+
+  import socket
+  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+  s.setsockopt(socket.IPPROTO_IP, socket.IP_OPTIONS,
+               bytearray([7,4,5,192, 20|0x80,4,1,0]))
+  s.sendto(b'1'*2000, ('127.0.0.1', 1234))
+
+Before:
+
+IP (tos 0x0, ttl 64, id 1053, offset 0, flags [+], proto UDP (17), length 996, options (RR [bad length 4] [bad ptr 5] 192.148.4.1,,RA value 256))
+    localhost.36500 > localhost.search-agent: UDP, length 2000
+IP (tos 0x0, ttl 64, id 1053, offset 968, flags [+], proto UDP (17), length 996, options (RR [bad length 4] [bad ptr 5] 192.148.4.1,,RA value 256))
+    localhost > localhost: udp
+IP (tos 0x0, ttl 64, id 1053, offset 1936, flags [none], proto UDP (17), length 100, options (RR [bad length 4] [bad ptr 5] 192.148.4.1,,RA value 256))
+    localhost > localhost: udp
+
+After:
+
+IP (tos 0x0, ttl 96, id 42549, offset 0, flags [+], proto UDP (17), length 996, options (RR [bad length 4] [bad ptr 5] 192.148.4.1,,RA value 256))
+    localhost.51607 > localhost.search-agent: UDP, bad length 2000 > 960
+IP (tos 0x0, ttl 96, id 42549, offset 968, flags [+], proto UDP (17), length 996, options (NOP,NOP,NOP,NOP,RA value 256))
+    localhost > localhost: udp
+IP (tos 0x0, ttl 96, id 42549, offset 1936, flags [none], proto UDP (17), length 100, options (NOP,NOP,NOP,NOP,RA value 256))
+    localhost > localhost: udp
+
+RA (20 | 0x80) is now copied as expected, RR (7) is "NOPed out".
+
+Link: https://lore.kernel.org/netdev/20220107080559.122713-1-ooppublic@163.com/
+Fixes: 19c3401a917b ("net: ipv4: place control buffer handling away from fragmentation iterators")
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: caixf <ooppublic@163.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ip_output.c | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index e77afaecc9818..4f76e8183f403 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -834,15 +834,24 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
+               /* Everything is OK. Generate! */
+               ip_fraglist_init(skb, iph, hlen, &iter);
+-              if (iter.frag)
+-                      ip_options_fragment(iter.frag);
+-
+               for (;;) {
+                       /* Prepare header of the next frame,
+                        * before previous one went down. */
+                       if (iter.frag) {
++                              bool first_frag = (iter.offset == 0);
++
+                               IPCB(iter.frag)->flags = IPCB(skb)->flags;
+                               ip_fraglist_prepare(skb, &iter);
++                              if (first_frag && IPCB(skb)->opt.optlen) {
++                                      /* ipcb->opt is not populated for frags
++                                       * coming from __ip_make_skb(),
++                                       * ip_options_fragment() needs optlen
++                                       */
++                                      IPCB(iter.frag)->opt.optlen =
++                                              IPCB(skb)->opt.optlen;
++                                      ip_options_fragment(iter.frag);
++                                      ip_send_check(iter.iph);
++                              }
+                       }
+                       skb->tstamp = tstamp;
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv4-raw-lock-the-socket-in-raw_bind.patch-1741 b/queue-5.10/ipv4-raw-lock-the-socket-in-raw_bind.patch-1741
new file mode 100644 (file)
index 0000000..a0acfcc
--- /dev/null
@@ -0,0 +1,78 @@
+From 8e52bfb939b9f52c4b0df81cd7b91da230cdd079 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 16:51:16 -0800
+Subject: ipv4: raw: lock the socket in raw_bind()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 153a0d187e767c68733b8e9f46218eb1f41ab902 ]
+
+For some reason, raw_bind() forgot to lock the socket.
+
+BUG: KCSAN: data-race in __ip4_datagram_connect / raw_bind
+
+write to 0xffff8881170d4308 of 4 bytes by task 5466 on cpu 0:
+ raw_bind+0x1b0/0x250 net/ipv4/raw.c:739
+ inet_bind+0x56/0xa0 net/ipv4/af_inet.c:443
+ __sys_bind+0x14b/0x1b0 net/socket.c:1697
+ __do_sys_bind net/socket.c:1708 [inline]
+ __se_sys_bind net/socket.c:1706 [inline]
+ __x64_sys_bind+0x3d/0x50 net/socket.c:1706
+ do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+ do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80
+ entry_SYSCALL_64_after_hwframe+0x44/0xae
+
+read to 0xffff8881170d4308 of 4 bytes by task 5468 on cpu 1:
+ __ip4_datagram_connect+0xb7/0x7b0 net/ipv4/datagram.c:39
+ ip4_datagram_connect+0x2a/0x40 net/ipv4/datagram.c:89
+ inet_dgram_connect+0x107/0x190 net/ipv4/af_inet.c:576
+ __sys_connect_file net/socket.c:1900 [inline]
+ __sys_connect+0x197/0x1b0 net/socket.c:1917
+ __do_sys_connect net/socket.c:1927 [inline]
+ __se_sys_connect net/socket.c:1924 [inline]
+ __x64_sys_connect+0x3d/0x50 net/socket.c:1924
+ do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+ do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80
+ entry_SYSCALL_64_after_hwframe+0x44/0xae
+
+value changed: 0x00000000 -> 0x0003007f
+
+Reported by Kernel Concurrency Sanitizer on:
+CPU: 1 PID: 5468 Comm: syz-executor.5 Not tainted 5.17.0-rc1-syzkaller #0
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/raw.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
+index 7d26e0f8bdaeb..5d95f80314f95 100644
+--- a/net/ipv4/raw.c
++++ b/net/ipv4/raw.c
+@@ -721,6 +721,7 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+       int ret = -EINVAL;
+       int chk_addr_ret;
++      lock_sock(sk);
+       if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_in))
+               goto out;
+@@ -740,7 +741,9 @@ static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+               inet->inet_saddr = 0;  /* Use device */
+       sk_dst_reset(sk);
+       ret = 0;
+-out:  return ret;
++out:
++      release_sock(sk);
++      return ret;
+ }
+ /*
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv4-remove-sparse-error-in-ip_neigh_gw4.patch-3162 b/queue-5.10/ipv4-remove-sparse-error-in-ip_neigh_gw4.patch-3162
new file mode 100644 (file)
index 0000000..c1e4869
--- /dev/null
@@ -0,0 +1,39 @@
+From de35b38d24d28cc867bddde6524465fc4876e066 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 17:34:04 -0800
+Subject: ipv4: remove sparse error in ip_neigh_gw4()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 3c42b2019863b327caa233072c50739d4144dd16 ]
+
+./include/net/route.h:373:48: warning: incorrect type in argument 2 (different base types)
+./include/net/route.h:373:48:    expected unsigned int [usertype] key
+./include/net/route.h:373:48:    got restricted __be32 [usertype] daddr
+
+Fixes: 5c9f7c1dfc2e ("ipv4: Add helpers for neigh lookup for nexthop")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Link: https://lore.kernel.org/r/20220127013404.1279313-1-eric.dumazet@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/route.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/net/route.h b/include/net/route.h
+index ff021cab657e5..a07c277cd33e8 100644
+--- a/include/net/route.h
++++ b/include/net/route.h
+@@ -369,7 +369,7 @@ static inline struct neighbour *ip_neigh_gw4(struct net_device *dev,
+ {
+       struct neighbour *neigh;
+-      neigh = __ipv4_neigh_lookup_noref(dev, daddr);
++      neigh = __ipv4_neigh_lookup_noref(dev, (__force u32)daddr);
+       if (unlikely(!neigh))
+               neigh = __neigh_create(&arp_tbl, &daddr, dev, false);
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv4-tcp-send-zero-ipid-in-synack-messages.patch-31729 b/queue-5.10/ipv4-tcp-send-zero-ipid-in-synack-messages.patch-31729
new file mode 100644 (file)
index 0000000..80992c1
--- /dev/null
@@ -0,0 +1,77 @@
+From b1513dbb3b54c34e5ff511436716175058e424ad Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 17:10:21 -0800
+Subject: ipv4: tcp: send zero IPID in SYNACK messages
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 970a5a3ea86da637471d3cd04d513a0755aba4bf ]
+
+In commit 431280eebed9 ("ipv4: tcp: send zero IPID for RST and
+ACK sent in SYN-RECV and TIME-WAIT state") we took care of some
+ctl packets sent by TCP.
+
+It turns out we need to use a similar strategy for SYNACK packets.
+
+By default, they carry IP_DF and IPID==0, but there are ways
+to ask them to use the hashed IP ident generator and thus
+be used to build off-path attacks.
+(Ref: Off-Path TCP Exploits of the Mixed IPID Assignment)
+
+One of this way is to force (before listener is started)
+echo 1 >/proc/sys/net/ipv4/ip_no_pmtu_disc
+
+Another way is using forged ICMP ICMP_FRAG_NEEDED
+with a very small MTU (like 68) to force a false return from
+ip_dont_fragment()
+
+In this patch, ip_build_and_send_pkt() uses the following
+heuristics.
+
+1) Most SYNACK packets are smaller than IPV4_MIN_MTU and therefore
+can use IP_DF regardless of the listener or route pmtu setting.
+
+2) In case the SYNACK packet is bigger than IPV4_MIN_MTU,
+we use prandom_u32() generator instead of the IPv4 hashed ident one.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reported-by: Ray Che <xijiache@gmail.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Cc: Geoff Alexander <alexandg@cs.unm.edu>
+Cc: Willy Tarreau <w@1wt.eu>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ip_output.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index 4f76e8183f403..5e48b3d3a00db 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -162,12 +162,19 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
+       iph->daddr    = (opt && opt->opt.srr ? opt->opt.faddr : daddr);
+       iph->saddr    = saddr;
+       iph->protocol = sk->sk_protocol;
+-      if (ip_dont_fragment(sk, &rt->dst)) {
++      /* Do not bother generating IPID for small packets (eg SYNACK) */
++      if (skb->len <= IPV4_MIN_MTU || ip_dont_fragment(sk, &rt->dst)) {
+               iph->frag_off = htons(IP_DF);
+               iph->id = 0;
+       } else {
+               iph->frag_off = 0;
+-              __ip_select_ident(net, iph, 1);
++              /* TCP packets here are SYNACK with fat IPv4/TCP options.
++               * Avoid using the hashed IP ident generator.
++               */
++              if (sk->sk_protocol == IPPROTO_TCP)
++                      iph->id = (__force __be16)prandom_u32();
++              else
++                      __ip_select_ident(net, iph, 1);
+       }
+       if (opt && opt->opt.optlen) {
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv6-annotate-accesses-to-fn-fn_sernum.patch-11803 b/queue-5.10/ipv6-annotate-accesses-to-fn-fn_sernum.patch-11803
new file mode 100644 (file)
index 0000000..bb41896
--- /dev/null
@@ -0,0 +1,197 @@
+From bf426655155df0ade3570a4e0a74c84e6dca6121 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jan 2022 09:41:12 -0800
+Subject: ipv6: annotate accesses to fn->fn_sernum
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit aafc2e3285c2d7a79b7ee15221c19fbeca7b1509 ]
+
+struct fib6_node's fn_sernum field can be
+read while other threads change it.
+
+Add READ_ONCE()/WRITE_ONCE() annotations.
+
+Do not change existing smp barriers in fib6_get_cookie_safe()
+and __fib6_update_sernum_upto_root()
+
+syzbot reported:
+
+BUG: KCSAN: data-race in fib6_clean_node / inet6_csk_route_socket
+
+write to 0xffff88813df62e2c of 4 bytes by task 1920 on cpu 1:
+ fib6_clean_node+0xc2/0x260 net/ipv6/ip6_fib.c:2178
+ fib6_walk_continue+0x38e/0x430 net/ipv6/ip6_fib.c:2112
+ fib6_walk net/ipv6/ip6_fib.c:2160 [inline]
+ fib6_clean_tree net/ipv6/ip6_fib.c:2240 [inline]
+ __fib6_clean_all+0x1a9/0x2e0 net/ipv6/ip6_fib.c:2256
+ fib6_flush_trees+0x6c/0x80 net/ipv6/ip6_fib.c:2281
+ rt_genid_bump_ipv6 include/net/net_namespace.h:488 [inline]
+ addrconf_dad_completed+0x57f/0x870 net/ipv6/addrconf.c:4230
+ addrconf_dad_work+0x908/0x1170
+ process_one_work+0x3f6/0x960 kernel/workqueue.c:2307
+ worker_thread+0x616/0xa70 kernel/workqueue.c:2454
+ kthread+0x1bf/0x1e0 kernel/kthread.c:359
+ ret_from_fork+0x1f/0x30
+
+read to 0xffff88813df62e2c of 4 bytes by task 15701 on cpu 0:
+ fib6_get_cookie_safe include/net/ip6_fib.h:285 [inline]
+ rt6_get_cookie include/net/ip6_fib.h:306 [inline]
+ ip6_dst_store include/net/ip6_route.h:234 [inline]
+ inet6_csk_route_socket+0x352/0x3c0 net/ipv6/inet6_connection_sock.c:109
+ inet6_csk_xmit+0x91/0x1e0 net/ipv6/inet6_connection_sock.c:121
+ __tcp_transmit_skb+0x1323/0x1840 net/ipv4/tcp_output.c:1402
+ tcp_transmit_skb net/ipv4/tcp_output.c:1420 [inline]
+ tcp_write_xmit+0x1450/0x4460 net/ipv4/tcp_output.c:2680
+ __tcp_push_pending_frames+0x68/0x1c0 net/ipv4/tcp_output.c:2864
+ tcp_push+0x2d9/0x2f0 net/ipv4/tcp.c:725
+ mptcp_push_release net/mptcp/protocol.c:1491 [inline]
+ __mptcp_push_pending+0x46c/0x490 net/mptcp/protocol.c:1578
+ mptcp_sendmsg+0x9ec/0xa50 net/mptcp/protocol.c:1764
+ inet6_sendmsg+0x5f/0x80 net/ipv6/af_inet6.c:643
+ sock_sendmsg_nosec net/socket.c:705 [inline]
+ sock_sendmsg net/socket.c:725 [inline]
+ kernel_sendmsg+0x97/0xd0 net/socket.c:745
+ sock_no_sendpage+0x84/0xb0 net/core/sock.c:3086
+ inet_sendpage+0x9d/0xc0 net/ipv4/af_inet.c:834
+ kernel_sendpage+0x187/0x200 net/socket.c:3492
+ sock_sendpage+0x5a/0x70 net/socket.c:1007
+ pipe_to_sendpage+0x128/0x160 fs/splice.c:364
+ splice_from_pipe_feed fs/splice.c:418 [inline]
+ __splice_from_pipe+0x207/0x500 fs/splice.c:562
+ splice_from_pipe fs/splice.c:597 [inline]
+ generic_splice_sendpage+0x94/0xd0 fs/splice.c:746
+ do_splice_from fs/splice.c:767 [inline]
+ direct_splice_actor+0x80/0xa0 fs/splice.c:936
+ splice_direct_to_actor+0x345/0x650 fs/splice.c:891
+ do_splice_direct+0x106/0x190 fs/splice.c:979
+ do_sendfile+0x675/0xc40 fs/read_write.c:1245
+ __do_sys_sendfile64 fs/read_write.c:1310 [inline]
+ __se_sys_sendfile64 fs/read_write.c:1296 [inline]
+ __x64_sys_sendfile64+0x102/0x140 fs/read_write.c:1296
+ do_syscall_x64 arch/x86/entry/common.c:50 [inline]
+ do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80
+ entry_SYSCALL_64_after_hwframe+0x44/0xae
+
+value changed: 0x0000026f -> 0x00000271
+
+Reported by Kernel Concurrency Sanitizer on:
+CPU: 0 PID: 15701 Comm: syz-executor.2 Not tainted 5.16.0-syzkaller #0
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+
+The Fixes tag I chose is probably arbitrary, I do not think
+we need to backport this patch to older kernels.
+
+Fixes: c5cff8561d2d ("ipv6: add rcu grace period before freeing fib6_node")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Reported-by: syzbot <syzkaller@googlegroups.com>
+Link: https://lore.kernel.org/r/20220120174112.1126644-1-eric.dumazet@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/ip6_fib.h |  2 +-
+ net/ipv6/ip6_fib.c    | 23 +++++++++++++----------
+ net/ipv6/route.c      |  2 +-
+ 3 files changed, 15 insertions(+), 12 deletions(-)
+
+diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
+index 399394327fc35..82bb51e3bcef1 100644
+--- a/include/net/ip6_fib.h
++++ b/include/net/ip6_fib.h
+@@ -280,7 +280,7 @@ static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
+       fn = rcu_dereference(f6i->fib6_node);
+       if (fn) {
+-              *cookie = fn->fn_sernum;
++              *cookie = READ_ONCE(fn->fn_sernum);
+               /* pairs with smp_wmb() in __fib6_update_sernum_upto_root() */
+               smp_rmb();
+               status = true;
+diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
+index 355e7734bd5d7..78f56f8d86102 100644
+--- a/net/ipv6/ip6_fib.c
++++ b/net/ipv6/ip6_fib.c
+@@ -110,7 +110,7 @@ void fib6_update_sernum(struct net *net, struct fib6_info *f6i)
+       fn = rcu_dereference_protected(f6i->fib6_node,
+                       lockdep_is_held(&f6i->fib6_table->tb6_lock));
+       if (fn)
+-              fn->fn_sernum = fib6_new_sernum(net);
++              WRITE_ONCE(fn->fn_sernum, fib6_new_sernum(net));
+ }
+ /*
+@@ -587,12 +587,13 @@ static int fib6_dump_table(struct fib6_table *table, struct sk_buff *skb,
+               spin_unlock_bh(&table->tb6_lock);
+               if (res > 0) {
+                       cb->args[4] = 1;
+-                      cb->args[5] = w->root->fn_sernum;
++                      cb->args[5] = READ_ONCE(w->root->fn_sernum);
+               }
+       } else {
+-              if (cb->args[5] != w->root->fn_sernum) {
++              int sernum = READ_ONCE(w->root->fn_sernum);
++              if (cb->args[5] != sernum) {
+                       /* Begin at the root if the tree changed */
+-                      cb->args[5] = w->root->fn_sernum;
++                      cb->args[5] = sernum;
+                       w->state = FWS_INIT;
+                       w->node = w->root;
+                       w->skip = w->count;
+@@ -1342,7 +1343,7 @@ static void __fib6_update_sernum_upto_root(struct fib6_info *rt,
+       /* paired with smp_rmb() in fib6_get_cookie_safe() */
+       smp_wmb();
+       while (fn) {
+-              fn->fn_sernum = sernum;
++              WRITE_ONCE(fn->fn_sernum, sernum);
+               fn = rcu_dereference_protected(fn->parent,
+                               lockdep_is_held(&rt->fib6_table->tb6_lock));
+       }
+@@ -2171,8 +2172,8 @@ static int fib6_clean_node(struct fib6_walker *w)
+       };
+       if (c->sernum != FIB6_NO_SERNUM_CHANGE &&
+-          w->node->fn_sernum != c->sernum)
+-              w->node->fn_sernum = c->sernum;
++          READ_ONCE(w->node->fn_sernum) != c->sernum)
++              WRITE_ONCE(w->node->fn_sernum, c->sernum);
+       if (!c->func) {
+               WARN_ON_ONCE(c->sernum == FIB6_NO_SERNUM_CHANGE);
+@@ -2536,7 +2537,7 @@ static void ipv6_route_seq_setup_walk(struct ipv6_route_iter *iter,
+       iter->w.state = FWS_INIT;
+       iter->w.node = iter->w.root;
+       iter->w.args = iter;
+-      iter->sernum = iter->w.root->fn_sernum;
++      iter->sernum = READ_ONCE(iter->w.root->fn_sernum);
+       INIT_LIST_HEAD(&iter->w.lh);
+       fib6_walker_link(net, &iter->w);
+ }
+@@ -2564,8 +2565,10 @@ static struct fib6_table *ipv6_route_seq_next_table(struct fib6_table *tbl,
+ static void ipv6_route_check_sernum(struct ipv6_route_iter *iter)
+ {
+-      if (iter->sernum != iter->w.root->fn_sernum) {
+-              iter->sernum = iter->w.root->fn_sernum;
++      int sernum = READ_ONCE(iter->w.root->fn_sernum);
++
++      if (iter->sernum != sernum) {
++              iter->sernum = sernum;
+               iter->w.state = FWS_INIT;
+               iter->w.node = iter->w.root;
+               WARN_ON(iter->w.skip);
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 654bf4ca61260..352e645c546eb 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -2674,7 +2674,7 @@ static void ip6_link_failure(struct sk_buff *skb)
+                       if (from) {
+                               fn = rcu_dereference(from->fib6_node);
+                               if (fn && (rt->rt6i_flags & RTF_DEFAULT))
+-                                      fn->fn_sernum = -1;
++                                      WRITE_ONCE(fn->fn_sernum, -1);
+                       }
+               }
+               rcu_read_unlock();
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv6-correct-comments-about-fib6_node-sernum.patch-17310 b/queue-5.10/ipv6-correct-comments-about-fib6_node-sernum.patch-17310
new file mode 100644 (file)
index 0000000..64d2a7b
--- /dev/null
@@ -0,0 +1,58 @@
+From 443a8c6a918f36bd8be485c591de30c8b93743f4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 Aug 2021 11:49:00 +0800
+Subject: ipv6: correct comments about fib6_node sernum
+
+From: zhang kai <zhangkaiheb@126.com>
+
+[ Upstream commit 446e7f218b7662c912c610aae99069543aa88a40 ]
+
+correct comments in set and get fn_sernum
+
+Signed-off-by: zhang kai <zhangkaiheb@126.com>
+Reviewed-by: David Ahern <dsahern@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/ip6_fib.h | 4 ++--
+ net/ipv6/ip6_fib.c    | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
+index 88bc66b8d02b0..399394327fc35 100644
+--- a/include/net/ip6_fib.h
++++ b/include/net/ip6_fib.h
+@@ -266,7 +266,7 @@ static inline bool fib6_check_expired(const struct fib6_info *f6i)
+       return false;
+ }
+-/* Function to safely get fn->sernum for passed in rt
++/* Function to safely get fn->fn_sernum for passed in rt
+  * and store result in passed in cookie.
+  * Return true if we can get cookie safely
+  * Return false if not
+@@ -281,7 +281,7 @@ static inline bool fib6_get_cookie_safe(const struct fib6_info *f6i,
+       if (fn) {
+               *cookie = fn->fn_sernum;
+-              /* pairs with smp_wmb() in fib6_update_sernum_upto_root() */
++              /* pairs with smp_wmb() in __fib6_update_sernum_upto_root() */
+               smp_rmb();
+               status = true;
+       }
+diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
+index e43f1fbac28b6..355e7734bd5d7 100644
+--- a/net/ipv6/ip6_fib.c
++++ b/net/ipv6/ip6_fib.c
+@@ -1339,7 +1339,7 @@ static void __fib6_update_sernum_upto_root(struct fib6_info *rt,
+       struct fib6_node *fn = rcu_dereference_protected(rt->fib6_node,
+                               lockdep_is_held(&rt->fib6_table->tb6_lock));
+-      /* paired with smp_rmb() in rt6_get_cookie_safe() */
++      /* paired with smp_rmb() in fib6_get_cookie_safe() */
+       smp_wmb();
+       while (fn) {
+               fn->fn_sernum = sernum;
+-- 
+2.34.1
+
diff --git a/queue-5.10/ipv6_tunnel-rate-limit-warning-messages.patch-10619 b/queue-5.10/ipv6_tunnel-rate-limit-warning-messages.patch-10619
new file mode 100644 (file)
index 0000000..7de06d0
--- /dev/null
@@ -0,0 +1,51 @@
+From 77f4ef8ba29efd5d820572fbdf87a0e3e2e1226b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jan 2022 10:05:46 +0200
+Subject: ipv6_tunnel: Rate limit warning messages
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit 6cee105e7f2ced596373951d9ea08dacc3883c68 ]
+
+The warning messages can be invoked from the data path for every packet
+transmitted through an ip6gre netdev, leading to high CPU utilization.
+
+Fix that by rate limiting the messages.
+
+Fixes: 09c6bbf090ec ("[IPV6]: Do mandatory IPv6 tunnel endpoint checks in realtime")
+Reported-by: Maksym Yaremchuk <maksymy@nvidia.com>
+Tested-by: Maksym Yaremchuk <maksymy@nvidia.com>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Amit Cohen <amcohen@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv6/ip6_tunnel.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
+index 08441f06afd48..3a2741569b847 100644
+--- a/net/ipv6/ip6_tunnel.c
++++ b/net/ipv6/ip6_tunnel.c
+@@ -1066,14 +1066,14 @@ int ip6_tnl_xmit_ctl(struct ip6_tnl *t,
+               if (unlikely(!ipv6_chk_addr_and_flags(net, laddr, ldev, false,
+                                                     0, IFA_F_TENTATIVE)))
+-                      pr_warn("%s xmit: Local address not yet configured!\n",
+-                              p->name);
++                      pr_warn_ratelimited("%s xmit: Local address not yet configured!\n",
++                                          p->name);
+               else if (!(p->flags & IP6_TNL_F_ALLOW_LOCAL_REMOTE) &&
+                        !ipv6_addr_is_multicast(raddr) &&
+                        unlikely(ipv6_chk_addr_and_flags(net, raddr, ldev,
+                                                         true, 0, IFA_F_TENTATIVE)))
+-                      pr_warn("%s xmit: Routing loop! Remote address found on this node!\n",
+-                              p->name);
++                      pr_warn_ratelimited("%s xmit: Routing loop! Remote address found on this node!\n",
++                                          p->name);
+               else
+                       ret = 1;
+               rcu_read_unlock();
+-- 
+2.34.1
+
diff --git a/queue-5.10/kernel-delete-repeated-words-in-comments.patch-15671 b/queue-5.10/kernel-delete-repeated-words-in-comments.patch-15671
new file mode 100644 (file)
index 0000000..e06f3b5
--- /dev/null
@@ -0,0 +1,172 @@
+From 05476184f92efef19ac58d574c0767c45fff9bc7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 25 Feb 2021 17:21:10 -0800
+Subject: kernel: delete repeated words in comments
+
+From: Randy Dunlap <rdunlap@infradead.org>
+
+[ Upstream commit c034f48e99907d5be147ac8f0f3e630a9307c2be ]
+
+Drop repeated words in kernel/events/.
+{if, the, that, with, time}
+
+Drop repeated words in kernel/locking/.
+{it, no, the}
+
+Drop repeated words in kernel/sched/.
+{in, not}
+
+Link: https://lkml.kernel.org/r/20210127023412.26292-1-rdunlap@infradead.org
+Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
+Acked-by: Will Deacon <will@kernel.org>        [kernel/locking/]
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
+Cc: Will Deacon <will@kernel.org>
+Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+Cc: "Paul E. McKenney" <paulmck@kernel.org>
+Cc: Juri Lelli <juri.lelli@redhat.com>
+Cc: Vincent Guittot <vincent.guittot@linaro.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/core.c       | 8 ++++----
+ kernel/events/uprobes.c    | 2 +-
+ kernel/locking/rtmutex.c   | 4 ++--
+ kernel/locking/rwsem.c     | 2 +-
+ kernel/locking/semaphore.c | 2 +-
+ kernel/sched/fair.c        | 2 +-
+ kernel/sched/membarrier.c  | 2 +-
+ 7 files changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index e2d774cc470ee..8dc7c4d12b789 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -266,7 +266,7 @@ static void event_function_call(struct perf_event *event, event_f func, void *da
+       if (!event->parent) {
+               /*
+                * If this is a !child event, we must hold ctx::mutex to
+-               * stabilize the the event->ctx relation. See
++               * stabilize the event->ctx relation. See
+                * perf_event_ctx_lock().
+                */
+               lockdep_assert_held(&ctx->mutex);
+@@ -1300,7 +1300,7 @@ static void put_ctx(struct perf_event_context *ctx)
+  * life-time rules separate them. That is an exiting task cannot fork, and a
+  * spawning task cannot (yet) exit.
+  *
+- * But remember that that these are parent<->child context relations, and
++ * But remember that these are parent<->child context relations, and
+  * migration does not affect children, therefore these two orderings should not
+  * interact.
+  *
+@@ -1439,7 +1439,7 @@ static u64 primary_event_id(struct perf_event *event)
+ /*
+  * Get the perf_event_context for a task and lock it.
+  *
+- * This has to cope with with the fact that until it is locked,
++ * This has to cope with the fact that until it is locked,
+  * the context could get moved to another task.
+  */
+ static struct perf_event_context *
+@@ -2492,7 +2492,7 @@ static void perf_set_shadow_time(struct perf_event *event,
+        * But this is a bit hairy.
+        *
+        * So instead, we have an explicit cgroup call to remain
+-       * within the time time source all along. We believe it
++       * within the time source all along. We believe it
+        * is cleaner and simpler to understand.
+        */
+       if (is_cgroup_event(event))
+diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
+index 00b0358739ab3..e1bbb3b92921d 100644
+--- a/kernel/events/uprobes.c
++++ b/kernel/events/uprobes.c
+@@ -1735,7 +1735,7 @@ void uprobe_free_utask(struct task_struct *t)
+ }
+ /*
+- * Allocate a uprobe_task object for the task if if necessary.
++ * Allocate a uprobe_task object for the task if necessary.
+  * Called when the thread hits a breakpoint.
+  *
+  * Returns:
+diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
+index 2f8cd616d3b29..f00dd928fc711 100644
+--- a/kernel/locking/rtmutex.c
++++ b/kernel/locking/rtmutex.c
+@@ -1438,7 +1438,7 @@ rt_mutex_fasttrylock(struct rt_mutex *lock,
+ }
+ /*
+- * Performs the wakeup of the the top-waiter and re-enables preemption.
++ * Performs the wakeup of the top-waiter and re-enables preemption.
+  */
+ void rt_mutex_postunlock(struct wake_q_head *wake_q)
+ {
+@@ -1832,7 +1832,7 @@ struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock)
+  *                    been started.
+  * @waiter:           the pre-initialized rt_mutex_waiter
+  *
+- * Wait for the the lock acquisition started on our behalf by
++ * Wait for the lock acquisition started on our behalf by
+  * rt_mutex_start_proxy_lock(). Upon failure, the caller must call
+  * rt_mutex_cleanup_proxy_lock().
+  *
+diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
+index a163542d178ee..cc5cc889b5b7f 100644
+--- a/kernel/locking/rwsem.c
++++ b/kernel/locking/rwsem.c
+@@ -1177,7 +1177,7 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, int state)
+               /*
+                * If there were already threads queued before us and:
+-               *  1) there are no no active locks, wake the front
++               *  1) there are no active locks, wake the front
+                *     queued process(es) as the handoff bit might be set.
+                *  2) there are no active writers and some readers, the lock
+                *     must be read owned; so we try to wake any read lock
+diff --git a/kernel/locking/semaphore.c b/kernel/locking/semaphore.c
+index d9dd94defc0a9..9aa855a96c4ae 100644
+--- a/kernel/locking/semaphore.c
++++ b/kernel/locking/semaphore.c
+@@ -119,7 +119,7 @@ EXPORT_SYMBOL(down_killable);
+  * @sem: the semaphore to be acquired
+  *
+  * Try to acquire the semaphore atomically.  Returns 0 if the semaphore has
+- * been acquired successfully or 1 if it it cannot be acquired.
++ * been acquired successfully or 1 if it cannot be acquired.
+  *
+  * NOTE: This return value is inverted from both spin_trylock and
+  * mutex_trylock!  Be careful about this when converting code.
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index 2a33cb5a10e59..8d2f238fdd2ac 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -5149,7 +5149,7 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b)
+ /*
+  * When a group wakes up we want to make sure that its quota is not already
+  * expired/exceeded, otherwise it may be allowed to steal additional ticks of
+- * runtime as update_curr() throttling can not not trigger until it's on-rq.
++ * runtime as update_curr() throttling can not trigger until it's on-rq.
+  */
+ static void check_enqueue_throttle(struct cfs_rq *cfs_rq)
+ {
+diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c
+index 16f57e71f9c44..b02f04336a085 100644
+--- a/kernel/sched/membarrier.c
++++ b/kernel/sched/membarrier.c
+@@ -315,7 +315,7 @@ static int sync_runqueues_membarrier_state(struct mm_struct *mm)
+       /*
+        * For each cpu runqueue, if the task's mm match @mm, ensure that all
+-       * @mm's membarrier state set bits are also set in in the runqueue's
++       * @mm's membarrier state set bits are also set in the runqueue's
+        * membarrier state. This ensures that a runqueue scheduling
+        * between threads which are users of @mm has its membarrier state
+        * updated.
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-bridge-vlan-fix-memory-leak-in-__allowed_ingress.patch-11653 b/queue-5.10/net-bridge-vlan-fix-memory-leak-in-__allowed_ingress.patch-11653
new file mode 100644 (file)
index 0000000..c1da88c
--- /dev/null
@@ -0,0 +1,47 @@
+From 9fb4f82d4219c356e93cccdf63a364de9908c9c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jan 2022 15:49:53 +0800
+Subject: net: bridge: vlan: fix memory leak in __allowed_ingress
+
+From: Tim Yi <tim.yi@pica8.com>
+
+[ Upstream commit fd20d9738395cf8e27d0a17eba34169699fccdff ]
+
+When using per-vlan state, if vlan snooping and stats are disabled,
+untagged or priority-tagged ingress frame will go to check pvid state.
+If the port state is forwarding and the pvid state is not
+learning/forwarding, untagged or priority-tagged frame will be dropped
+but skb memory is not freed.
+Should free skb when __allowed_ingress returns false.
+
+Fixes: a580c76d534c ("net: bridge: vlan: add per-vlan state")
+Signed-off-by: Tim Yi <tim.yi@pica8.com>
+Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
+Link: https://lore.kernel.org/r/20220127074953.12632-1-tim.yi@pica8.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bridge/br_vlan.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
+index 1f508d998fb2d..852f4b54e8811 100644
+--- a/net/bridge/br_vlan.c
++++ b/net/bridge/br_vlan.c
+@@ -543,10 +543,10 @@ static bool __allowed_ingress(const struct net_bridge *br,
+               if (!br_opt_get(br, BROPT_VLAN_STATS_ENABLED)) {
+                       if (*state == BR_STATE_FORWARDING) {
+                               *state = br_vlan_get_pvid_state(vg);
+-                              return br_vlan_state_allowed(*state, true);
+-                      } else {
+-                              return true;
++                              if (!br_vlan_state_allowed(*state, true))
++                                      goto drop;
+                       }
++                      return true;
+               }
+       }
+       v = br_vlan_find(vg, *vid);
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-bridge-vlan-fix-single-net-device-option-dumping.patch-32125 b/queue-5.10/net-bridge-vlan-fix-single-net-device-option-dumping.patch-32125
new file mode 100644 (file)
index 0000000..a94e9e2
--- /dev/null
@@ -0,0 +1,42 @@
+From 92db2ef0cc9436e2c2f705cf5289c0c62dfc2c30 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 15:10:25 +0200
+Subject: net: bridge: vlan: fix single net device option dumping
+
+From: Nikolay Aleksandrov <nikolay@nvidia.com>
+
+[ Upstream commit dcb2c5c6ca9b9177f04abaf76e5a983d177c9414 ]
+
+When dumping vlan options for a single net device we send the same
+entries infinitely because user-space expects a 0 return at the end but
+we keep returning skb->len and restarting the dump on retry. Fix it by
+returning the value from br_vlan_dump_dev() if it completed or there was
+an error. The only case that must return skb->len is when the dump was
+incomplete and needs to continue (-EMSGSIZE).
+
+Reported-by: Benjamin Poirier <bpoirier@nvidia.com>
+Fixes: 8dcea187088b ("net: bridge: vlan: add rtm definitions and dump support")
+Signed-off-by: Nikolay Aleksandrov <nikolay@nvidia.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bridge/br_vlan.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c
+index 08c77418c687b..1f508d998fb2d 100644
+--- a/net/bridge/br_vlan.c
++++ b/net/bridge/br_vlan.c
+@@ -1873,7 +1873,8 @@ static int br_vlan_rtm_dump(struct sk_buff *skb, struct netlink_callback *cb)
+                       goto out_err;
+               }
+               err = br_vlan_dump_dev(dev, skb, cb, dump_flags);
+-              if (err && err != -EMSGSIZE)
++              /* if the dump completed without an error we return 0 here */
++              if (err != -EMSGSIZE)
+                       goto out_err;
+       } else {
+               for_each_netdev_rcu(net, dev) {
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-cpsw-properly-initialise-struct-page_pool_params.patch-12745 b/queue-5.10/net-cpsw-properly-initialise-struct-page_pool_params.patch-12745
new file mode 100644 (file)
index 0000000..cdef16e
--- /dev/null
@@ -0,0 +1,48 @@
+From 3c38e8577c1699a2f037ffdcef2f449f81ff066c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jan 2022 15:35:29 +0100
+Subject: net: cpsw: Properly initialise struct page_pool_params
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Toke Høiland-Jørgensen <toke@redhat.com>
+
+[ Upstream commit c63003e3d99761afb280add3b30de1cf30fa522b ]
+
+The cpsw driver didn't properly initialise the struct page_pool_params
+before calling page_pool_create(), which leads to crashes after the struct
+has been expanded with new parameters.
+
+The second Fixes tag below is where the buggy code was introduced, but
+because the code was moved around this patch will only apply on top of the
+commit in the first Fixes tag.
+
+Fixes: c5013ac1dd0e ("net: ethernet: ti: cpsw: move set of common functions in cpsw_priv")
+Fixes: 9ed4050c0d75 ("net: ethernet: ti: cpsw: add XDP support")
+Reported-by: Colin Foster <colin.foster@in-advantage.com>
+Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
+Tested-by: Colin Foster <colin.foster@in-advantage.com>
+Acked-by: Jesper Dangaard Brouer <brouer@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/ti/cpsw_priv.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c
+index 424e644724e46..e74f2e95a46eb 100644
+--- a/drivers/net/ethernet/ti/cpsw_priv.c
++++ b/drivers/net/ethernet/ti/cpsw_priv.c
+@@ -1144,7 +1144,7 @@ int cpsw_fill_rx_channels(struct cpsw_priv *priv)
+ static struct page_pool *cpsw_create_page_pool(struct cpsw_common *cpsw,
+                                              int size)
+ {
+-      struct page_pool_params pp_params;
++      struct page_pool_params pp_params = {};
+       struct page_pool *pool;
+       pp_params.order = 0;
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-fix-information-leakage-in-proc-net-ptype.patch-15695 b/queue-5.10/net-fix-information-leakage-in-proc-net-ptype.patch-15695
new file mode 100644 (file)
index 0000000..b9e8366
--- /dev/null
@@ -0,0 +1,78 @@
+From 4d97d82d94b218488b2e5d68d3b0e1ae60bd1891 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jan 2022 14:20:13 -0500
+Subject: net: fix information leakage in /proc/net/ptype
+
+From: Congyu Liu <liu3101@purdue.edu>
+
+[ Upstream commit 47934e06b65637c88a762d9c98329ae6e3238888 ]
+
+In one net namespace, after creating a packet socket without binding
+it to a device, users in other net namespaces can observe the new
+`packet_type` added by this packet socket by reading `/proc/net/ptype`
+file. This is minor information leakage as packet socket is
+namespace aware.
+
+Add a net pointer in `packet_type` to keep the net namespace of
+of corresponding packet socket. In `ptype_seq_show`, this net pointer
+must be checked when it is not NULL.
+
+Fixes: 2feb27dbe00c ("[NETNS]: Minor information leak via /proc/net/ptype file.")
+Signed-off-by: Congyu Liu <liu3101@purdue.edu>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/netdevice.h | 1 +
+ net/core/net-procfs.c     | 3 ++-
+ net/packet/af_packet.c    | 2 ++
+ 3 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 3476d20b75d49..fe3155736d635 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -2543,6 +2543,7 @@ struct packet_type {
+                                             struct net_device *);
+       bool                    (*id_match)(struct packet_type *ptype,
+                                           struct sock *sk);
++      struct net              *af_packet_net;
+       void                    *af_packet_priv;
+       struct list_head        list;
+ };
+diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
+index c714e6a9dad4c..e12c67f9492ba 100644
+--- a/net/core/net-procfs.c
++++ b/net/core/net-procfs.c
+@@ -263,7 +263,8 @@ static int ptype_seq_show(struct seq_file *seq, void *v)
+       if (v == SEQ_START_TOKEN)
+               seq_puts(seq, "Type Device      Function\n");
+-      else if (pt->dev == NULL || dev_net(pt->dev) == seq_file_net(seq)) {
++      else if ((!pt->af_packet_net || net_eq(pt->af_packet_net, seq_file_net(seq))) &&
++               (!pt->dev || net_eq(dev_net(pt->dev), seq_file_net(seq)))) {
+               if (pt->type == htons(ETH_P_ALL))
+                       seq_puts(seq, "ALL ");
+               else
+diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
+index f78097aa403a8..6ef035494f30d 100644
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -1735,6 +1735,7 @@ static int fanout_add(struct sock *sk, struct fanout_args *args)
+               match->prot_hook.dev = po->prot_hook.dev;
+               match->prot_hook.func = packet_rcv_fanout;
+               match->prot_hook.af_packet_priv = match;
++              match->prot_hook.af_packet_net = read_pnet(&match->net);
+               match->prot_hook.id_match = match_fanout_group;
+               match->max_num_members = args->max_num_members;
+               list_add(&match->list, &fanout_list);
+@@ -3323,6 +3324,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
+               po->prot_hook.func = packet_rcv_spkt;
+       po->prot_hook.af_packet_priv = sk;
++      po->prot_hook.af_packet_net = sock_net(sk);
+       if (proto) {
+               po->prot_hook.type = proto;
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-hns3-handle-empty-unknown-interrupt-for-vf.patch-6323 b/queue-5.10/net-hns3-handle-empty-unknown-interrupt-for-vf.patch-6323
new file mode 100644 (file)
index 0000000..45c4d61
--- /dev/null
@@ -0,0 +1,41 @@
+From bbf7cc6743efc929d1b111a22ed42825379223b5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jan 2022 15:03:12 +0800
+Subject: net: hns3: handle empty unknown interrupt for VF
+
+From: Yufeng Mo <moyufeng@huawei.com>
+
+[ Upstream commit 2f61353cd2f789a4229b6f5c1c24a40a613357bb ]
+
+Since some interrupt states may be cleared by hardware, the driver
+may receive an empty interrupt. Currently, the VF driver directly
+disables the vector0 interrupt in this case. As a result, the VF
+is unavailable. Therefore, the vector0 interrupt should be enabled
+in this case.
+
+Fixes: b90fcc5bd904 ("net: hns3: add reset handling for VF when doing Core/Global/IMP reset")
+Signed-off-by: Yufeng Mo <moyufeng@huawei.com>
+Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+index 6e7da1dc2e8c3..d6580e942724d 100644
+--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
+@@ -2382,8 +2382,7 @@ static irqreturn_t hclgevf_misc_irq_handle(int irq, void *data)
+               break;
+       }
+-      if (event_cause != HCLGEVF_VECTOR0_EVENT_OTHER)
+-              hclgevf_enable_vector(&hdev->misc_vector, true);
++      hclgevf_enable_vector(&hdev->misc_vector, true);
+       return IRQ_HANDLED;
+ }
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-ipv4-fix-the-warning-for-dereference.patch-3212 b/queue-5.10/net-ipv4-fix-the-warning-for-dereference.patch-3212
new file mode 100644 (file)
index 0000000..408d379
--- /dev/null
@@ -0,0 +1,46 @@
+From b240adf93f16b55cc86905b2530e399eb246263f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 30 Aug 2021 17:16:40 +0800
+Subject: net: ipv4: Fix the warning for dereference
+
+From: Yajun Deng <yajun.deng@linux.dev>
+
+[ Upstream commit 1b9fbe813016b08e08b22ddba4ddbf9cb1b04b00 ]
+
+Add a if statements to avoid the warning.
+
+Dan Carpenter report:
+The patch faf482ca196a: "net: ipv4: Move ip_options_fragment() out of
+loop" from Aug 23, 2021, leads to the following Smatch complaint:
+
+    net/ipv4/ip_output.c:833 ip_do_fragment()
+    warn: variable dereferenced before check 'iter.frag' (see line 828)
+
+Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
+Fixes: faf482ca196a ("net: ipv4: Move ip_options_fragment() out of loop")
+Link: https://lore.kernel.org/netdev/20210830073802.GR7722@kadam/T/#t
+Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ip_output.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index fb91a466b2d34..e77afaecc9818 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -833,7 +833,9 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
+               /* Everything is OK. Generate! */
+               ip_fraglist_init(skb, iph, hlen, &iter);
+-              ip_options_fragment(iter.frag);
++
++              if (iter.frag)
++                      ip_options_fragment(iter.frag);
+               for (;;) {
+                       /* Prepare header of the next frame,
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-ipv4-move-ip_options_fragment-out-of-loop.patch-9656 b/queue-5.10/net-ipv4-move-ip_options_fragment-out-of-loop.patch-9656
new file mode 100644 (file)
index 0000000..53b1b01
--- /dev/null
@@ -0,0 +1,79 @@
+From 06e855befb7001de669475477eed297a350947a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 23 Aug 2021 11:17:59 +0800
+Subject: net: ipv4: Move ip_options_fragment() out of loop
+
+From: Yajun Deng <yajun.deng@linux.dev>
+
+[ Upstream commit faf482ca196a5b16007190529b3b2dd32ab3f761 ]
+
+The ip_options_fragment() only called when iter->offset is equal to zero,
+so move it out of loop, and inline 'Copy the flags to each fragment.'
+As also, remove the unused parameter in ip_frag_ipcb().
+
+Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ip_output.c | 19 ++++---------------
+ 1 file changed, 4 insertions(+), 15 deletions(-)
+
+diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
+index 10d4cde31c6bf..fb91a466b2d34 100644
+--- a/net/ipv4/ip_output.c
++++ b/net/ipv4/ip_output.c
+@@ -614,18 +614,6 @@ void ip_fraglist_init(struct sk_buff *skb, struct iphdr *iph,
+ }
+ EXPORT_SYMBOL(ip_fraglist_init);
+-static void ip_fraglist_ipcb_prepare(struct sk_buff *skb,
+-                                   struct ip_fraglist_iter *iter)
+-{
+-      struct sk_buff *to = iter->frag;
+-
+-      /* Copy the flags to each fragment. */
+-      IPCB(to)->flags = IPCB(skb)->flags;
+-
+-      if (iter->offset == 0)
+-              ip_options_fragment(to);
+-}
+-
+ void ip_fraglist_prepare(struct sk_buff *skb, struct ip_fraglist_iter *iter)
+ {
+       unsigned int hlen = iter->hlen;
+@@ -671,7 +659,7 @@ void ip_frag_init(struct sk_buff *skb, unsigned int hlen,
+ EXPORT_SYMBOL(ip_frag_init);
+ static void ip_frag_ipcb(struct sk_buff *from, struct sk_buff *to,
+-                       bool first_frag, struct ip_frag_state *state)
++                       bool first_frag)
+ {
+       /* Copy the flags to each fragment. */
+       IPCB(to)->flags = IPCB(from)->flags;
+@@ -845,12 +833,13 @@ int ip_do_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
+               /* Everything is OK. Generate! */
+               ip_fraglist_init(skb, iph, hlen, &iter);
++              ip_options_fragment(iter.frag);
+               for (;;) {
+                       /* Prepare header of the next frame,
+                        * before previous one went down. */
+                       if (iter.frag) {
+-                              ip_fraglist_ipcb_prepare(skb, &iter);
++                              IPCB(iter.frag)->flags = IPCB(skb)->flags;
+                               ip_fraglist_prepare(skb, &iter);
+                       }
+@@ -905,7 +894,7 @@ slow_path:
+                       err = PTR_ERR(skb2);
+                       goto fail;
+               }
+-              ip_frag_ipcb(skb, skb2, first_frag, &state);
++              ip_frag_ipcb(skb, skb2, first_frag);
+               /*
+                *      Put this fragment into the sending queue.
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-phy-broadcom-hook-up-soft_reset-for-bcm54616s.patch-27858 b/queue-5.10/net-phy-broadcom-hook-up-soft_reset-for-bcm54616s.patch-27858
new file mode 100644 (file)
index 0000000..2dfed64
--- /dev/null
@@ -0,0 +1,61 @@
+From 760c92a722269d6634c197cd1875be760cba041a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jan 2022 15:52:43 -0600
+Subject: net: phy: broadcom: hook up soft_reset for BCM54616S
+
+From: Robert Hancock <robert.hancock@calian.com>
+
+[ Upstream commit d15c7e875d44367005370e6a82e8f3a382a04f9b ]
+
+A problem was encountered with the Bel-Fuse 1GBT-SFP05 SFP module (which
+is a 1 Gbps copper module operating in SGMII mode with an internal
+BCM54616S PHY device) using the Xilinx AXI Ethernet MAC core, where the
+module would work properly on the initial insertion or boot of the
+device, but after the device was rebooted, the link would either only
+come up at 100 Mbps speeds or go up and down erratically.
+
+I found no meaningful changes in the PHY configuration registers between
+the working and non-working boots, but the status registers seemed to
+have a lot of error indications set on the SERDES side of the device on
+the non-working boot. I suspect the problem is that whatever happens on
+the SGMII link when the device is rebooted and the FPGA logic gets
+reloaded ends up putting the module's onboard PHY into a bad state.
+
+Since commit 6e2d85ec0559 ("net: phy: Stop with excessive soft reset")
+the genphy_soft_reset call is not made automatically by the PHY core
+unless the callback is explicitly specified in the driver structure. For
+most of these Broadcom devices, there is probably a hardware reset that
+gets asserted to reset the PHY during boot, however for SFP modules
+(where the BCM54616S is commonly found) no such reset line exists, so if
+the board keeps the SFP cage powered up across a reboot, it will end up
+with no reset occurring during reboots.
+
+Hook up the genphy_soft_reset callback for BCM54616S to ensure that a
+PHY reset is performed before the device is initialized. This appears to
+fix the issue with erratic operation after a reboot with this SFP
+module.
+
+Fixes: 6e2d85ec0559 ("net: phy: Stop with excessive soft reset")
+Signed-off-by: Robert Hancock <robert.hancock@calian.com>
+Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/broadcom.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
+index dbed15dc0fe77..644861366d544 100644
+--- a/drivers/net/phy/broadcom.c
++++ b/drivers/net/phy/broadcom.c
+@@ -789,6 +789,7 @@ static struct phy_driver broadcom_drivers[] = {
+       .phy_id_mask    = 0xfffffff0,
+       .name           = "Broadcom BCM54616S",
+       /* PHY_GBIT_FEATURES */
++      .soft_reset     = genphy_soft_reset,
+       .config_init    = bcm54xx_config_init,
+       .config_aneg    = bcm54616s_config_aneg,
+       .ack_interrupt  = bcm_phy_ack_intr,
+-- 
+2.34.1
+
diff --git a/queue-5.10/net-procfs-show-net-devices-bound-packet-types.patch-14776 b/queue-5.10/net-procfs-show-net-devices-bound-packet-types.patch-14776
new file mode 100644 (file)
index 0000000..33f4915
--- /dev/null
@@ -0,0 +1,117 @@
+From 373d87a41f08746873bd4517db26fb94442db7ab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 17:15:31 +0800
+Subject: net-procfs: show net devices bound packet types
+
+From: Jianguo Wu <wujianguo@chinatelecom.cn>
+
+[ Upstream commit 1d10f8a1f40b965d449e8f2d5ed7b96a7c138b77 ]
+
+After commit:7866a621043f ("dev: add per net_device packet type chains"),
+we can not get packet types that are bound to a specified net device by
+/proc/net/ptype, this patch fix the regression.
+
+Run "tcpdump -i ens192 udp -nns0" Before and after apply this patch:
+
+Before:
+  [root@localhost ~]# cat /proc/net/ptype
+  Type Device      Function
+  0800          ip_rcv
+  0806          arp_rcv
+  86dd          ipv6_rcv
+
+After:
+  [root@localhost ~]# cat /proc/net/ptype
+  Type Device      Function
+  ALL  ens192   tpacket_rcv
+  0800          ip_rcv
+  0806          arp_rcv
+  86dd          ipv6_rcv
+
+v1 -> v2:
+  - fix the regression rather than adding new /proc API as
+    suggested by Stephen Hemminger.
+
+Fixes: 7866a621043f ("dev: add per net_device packet type chains")
+Signed-off-by: Jianguo Wu <wujianguo@chinatelecom.cn>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/net-procfs.c | 35 ++++++++++++++++++++++++++++++++---
+ 1 file changed, 32 insertions(+), 3 deletions(-)
+
+diff --git a/net/core/net-procfs.c b/net/core/net-procfs.c
+index e12c67f9492ba..eadb696360b48 100644
+--- a/net/core/net-procfs.c
++++ b/net/core/net-procfs.c
+@@ -193,12 +193,23 @@ static const struct seq_operations softnet_seq_ops = {
+       .show  = softnet_seq_show,
+ };
+-static void *ptype_get_idx(loff_t pos)
++static void *ptype_get_idx(struct seq_file *seq, loff_t pos)
+ {
++      struct list_head *ptype_list = NULL;
+       struct packet_type *pt = NULL;
++      struct net_device *dev;
+       loff_t i = 0;
+       int t;
++      for_each_netdev_rcu(seq_file_net(seq), dev) {
++              ptype_list = &dev->ptype_all;
++              list_for_each_entry_rcu(pt, ptype_list, list) {
++                      if (i == pos)
++                              return pt;
++                      ++i;
++              }
++      }
++
+       list_for_each_entry_rcu(pt, &ptype_all, list) {
+               if (i == pos)
+                       return pt;
+@@ -219,22 +230,40 @@ static void *ptype_seq_start(struct seq_file *seq, loff_t *pos)
+       __acquires(RCU)
+ {
+       rcu_read_lock();
+-      return *pos ? ptype_get_idx(*pos - 1) : SEQ_START_TOKEN;
++      return *pos ? ptype_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
+ }
+ static void *ptype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+ {
++      struct net_device *dev;
+       struct packet_type *pt;
+       struct list_head *nxt;
+       int hash;
+       ++*pos;
+       if (v == SEQ_START_TOKEN)
+-              return ptype_get_idx(0);
++              return ptype_get_idx(seq, 0);
+       pt = v;
+       nxt = pt->list.next;
++      if (pt->dev) {
++              if (nxt != &pt->dev->ptype_all)
++                      goto found;
++
++              dev = pt->dev;
++              for_each_netdev_continue_rcu(seq_file_net(seq), dev) {
++                      if (!list_empty(&dev->ptype_all)) {
++                              nxt = dev->ptype_all.next;
++                              goto found;
++                      }
++              }
++
++              nxt = ptype_all.next;
++              goto ptype_all;
++      }
++
+       if (pt->type == htons(ETH_P_ALL)) {
++ptype_all:
+               if (nxt != &ptype_all)
+                       goto found;
+               hash = 0;
+-- 
+2.34.1
+
diff --git a/queue-5.10/netfilter-conntrack-don-t-increment-invalid-counter-.patch-23162 b/queue-5.10/netfilter-conntrack-don-t-increment-invalid-counter-.patch-23162
new file mode 100644 (file)
index 0000000..89f287a
--- /dev/null
@@ -0,0 +1,51 @@
+From 275b23b8b6de09c1687ae29de9b893edd55756b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jan 2022 21:37:58 +0100
+Subject: netfilter: conntrack: don't increment invalid counter on NF_REPEAT
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit 830af2eba40327abec64325a5b08b1e85c37a2e0 ]
+
+The packet isn't invalid, REPEAT means we're trying again after cleaning
+out a stale connection, e.g. via tcp tracker.
+
+This caused increases of invalid stat counter in a test case involving
+frequent connection reuse, even though no packet is actually invalid.
+
+Fixes: 56a62e2218f5 ("netfilter: conntrack: fix NF_REPEAT handling")
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_conntrack_core.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
+index f4cf26b606f92..8369af0c50eab 100644
+--- a/net/netfilter/nf_conntrack_core.c
++++ b/net/netfilter/nf_conntrack_core.c
+@@ -1832,15 +1832,17 @@ repeat:
+               pr_debug("nf_conntrack_in: Can't track with proto module\n");
+               nf_conntrack_put(&ct->ct_general);
+               skb->_nfct = 0;
+-              NF_CT_STAT_INC_ATOMIC(state->net, invalid);
+-              if (ret == -NF_DROP)
+-                      NF_CT_STAT_INC_ATOMIC(state->net, drop);
+               /* Special case: TCP tracker reports an attempt to reopen a
+                * closed/aborted connection. We have to go back and create a
+                * fresh conntrack.
+                */
+               if (ret == -NF_REPEAT)
+                       goto repeat;
++
++              NF_CT_STAT_INC_ATOMIC(state->net, invalid);
++              if (ret == -NF_DROP)
++                      NF_CT_STAT_INC_ATOMIC(state->net, drop);
++
+               ret = -ret;
+               goto out;
+       }
+-- 
+2.34.1
+
diff --git a/queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-15600 b/queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-15600
new file mode 100644 (file)
index 0000000..eefe5cd
--- /dev/null
@@ -0,0 +1,37 @@
+From 532d017a99c55d257a1de01f1fbf63f5f8bec971 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Dec 2021 16:38:15 -0500
+Subject: NFS: Ensure the server has an up to date ctime before hardlinking
+
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+[ Upstream commit 204975036b34f55237bc44c8a302a88468ef21b5 ]
+
+Creating a hard link is required by POSIX to update the file ctime, so
+ensure that the file data is synced to disk so that we don't clobber the
+updated ctime by writing back after creating the hard link.
+
+Fixes: 9f7682728728 ("NFS: Move the delegation return down into nfs4_proc_link()")
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/dir.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 8b963c72dd3b1..3db80236020f9 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -2174,6 +2174,8 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
+       trace_nfs_link_enter(inode, dir, dentry);
+       d_drop(dentry);
++      if (S_ISREG(inode->i_mode))
++              nfs_sync_inode(inode);
+       error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
+       if (error == 0) {
+               ihold(inode);
+-- 
+2.34.1
+
diff --git a/queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-8657 b/queue-5.10/nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-8657
new file mode 100644 (file)
index 0000000..d55b5ab
--- /dev/null
@@ -0,0 +1,37 @@
+From f3682bc090771b53947502640ba9ba1240d6a5f0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Dec 2021 16:38:16 -0500
+Subject: NFS: Ensure the server has an up to date ctime before renaming
+
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+[ Upstream commit 6ff9d99bb88faebf134ca668842349d9718e5464 ]
+
+Renaming a file is required by POSIX to update the file ctime, so
+ensure that the file data is synced to disk so that we don't clobber the
+updated ctime by writing back after creating the hard link.
+
+Fixes: f2c2c552f119 ("NFS: Move delegation recall into the NFSv4 callback for rename_setup()")
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/dir.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 3db80236020f9..7d7fab95b74bb 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -2264,6 +2264,8 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+               }
+       }
++      if (S_ISREG(old_inode->i_mode))
++              nfs_sync_inode(old_inode);
+       task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL);
+       if (IS_ERR(task)) {
+               error = PTR_ERR(task);
+-- 
+2.34.1
+
diff --git a/queue-5.10/nfsv4-handle-case-where-the-lookup-of-a-directory-fa.patch-15449 b/queue-5.10/nfsv4-handle-case-where-the-lookup-of-a-directory-fa.patch-15449
new file mode 100644 (file)
index 0000000..7ff879e
--- /dev/null
@@ -0,0 +1,52 @@
+From c3673ede6efc1d933efec034c81d8520ff60e1ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jan 2022 18:24:02 -0500
+Subject: NFSv4: Handle case where the lookup of a directory fails
+
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+[ Upstream commit ac795161c93699d600db16c1a8cc23a65a1eceaf ]
+
+If the application sets the O_DIRECTORY flag, and tries to open a
+regular file, nfs_atomic_open() will punt to doing a regular lookup.
+If the server then returns a regular file, we will happily return a
+file descriptor with uninitialised open state.
+
+The fix is to return the expected ENOTDIR error in these cases.
+
+Reported-by: Lyu Tao <tao.lyu@epfl.ch>
+Fixes: 0dd2b474d0b6 ("nfs: implement i_op->atomic_open()")
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/dir.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 7d7fab95b74bb..4ef392c42ec8a 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1777,6 +1777,19 @@ out:
+ no_open:
+       res = nfs_lookup(dir, dentry, lookup_flags);
++      if (!res) {
++              inode = d_inode(dentry);
++              if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
++                  !S_ISDIR(inode->i_mode))
++                      res = ERR_PTR(-ENOTDIR);
++      } else if (!IS_ERR(res)) {
++              inode = d_inode(res);
++              if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
++                  !S_ISDIR(inode->i_mode)) {
++                      dput(res);
++                      res = ERR_PTR(-ENOTDIR);
++              }
++      }
+       if (switched) {
+               d_lookup_done(dentry);
+               if (!res)
+-- 
+2.34.1
+
diff --git a/queue-5.10/nfsv4-nfs_atomic_open-can-race-when-looking-up-a-non.patch-27002 b/queue-5.10/nfsv4-nfs_atomic_open-can-race-when-looking-up-a-non.patch-27002
new file mode 100644 (file)
index 0000000..91f1ef9
--- /dev/null
@@ -0,0 +1,45 @@
+From b5f93faf85c022030412ee6bfb928b60025634dd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jan 2022 18:24:03 -0500
+Subject: NFSv4: nfs_atomic_open() can race when looking up a non-regular file
+
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+[ Upstream commit 1751fc1db36f6f411709e143d5393f92d12137a9 ]
+
+If the file type changes back to being a regular file on the server
+between the failed OPEN and our LOOKUP, then we need to re-run the OPEN.
+
+Fixes: 0dd2b474d0b6 ("nfs: implement i_op->atomic_open()")
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/dir.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 4ef392c42ec8a..a23b7a5dec9ee 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1782,12 +1782,17 @@ no_open:
+               if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
+                   !S_ISDIR(inode->i_mode))
+                       res = ERR_PTR(-ENOTDIR);
++              else if (inode && S_ISREG(inode->i_mode))
++                      res = ERR_PTR(-EOPENSTALE);
+       } else if (!IS_ERR(res)) {
+               inode = d_inode(res);
+               if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
+                   !S_ISDIR(inode->i_mode)) {
+                       dput(res);
+                       res = ERR_PTR(-ENOTDIR);
++              } else if (inode && S_ISREG(inode->i_mode)) {
++                      dput(res);
++                      res = ERR_PTR(-EOPENSTALE);
+               }
+       }
+       if (switched) {
+-- 
+2.34.1
+
diff --git a/queue-5.10/octeontx2-pf-forward-error-codes-to-vf.patch-28837 b/queue-5.10/octeontx2-pf-forward-error-codes-to-vf.patch-28837
new file mode 100644 (file)
index 0000000..1204c29
--- /dev/null
@@ -0,0 +1,48 @@
+From 6c5b84850ce3bcedc4ed138445f67f16fca1f2eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 12:04:46 +0530
+Subject: octeontx2-pf: Forward error codes to VF
+
+From: Subbaraya Sundeep <sbhatta@marvell.com>
+
+[ Upstream commit a8db854be28622a2477cb21cdf7f829adbb2c42d ]
+
+PF forwards its VF messages to AF and corresponding
+replies from AF to VF. AF sets proper error code in the
+replies after processing message requests. Currently PF
+checks the error codes in replies and sends invalid
+message to VF. This way VF lacks the information of
+error code set by AF for its messages. This patch
+changes that such that PF simply forwards AF replies
+so that VF can handle error codes.
+
+Fixes: d424b6c02415 ("octeontx2-pf: Enable SRIOV and added VF mbox handling")
+Signed-off-by: Subbaraya Sundeep <sbhatta@marvell.com>
+Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+index 044a5b1196acb..161174be51c31 100644
+--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
++++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c
+@@ -386,7 +386,12 @@ static int otx2_forward_vf_mbox_msgs(struct otx2_nic *pf,
+               dst_mdev->msg_size = mbox_hdr->msg_size;
+               dst_mdev->num_msgs = num_msgs;
+               err = otx2_sync_mbox_msg(dst_mbox);
+-              if (err) {
++              /* Error code -EIO indicate there is a communication failure
++               * to the AF. Rest of the error codes indicate that AF processed
++               * VF messages and set the error codes in response messages
++               * (if any) so simply forward responses to VF.
++               */
++              if (err == -EIO) {
+                       dev_warn(pf->dev,
+                                "AF not responding to VF%d messages\n", vf);
+                       /* restore PF mbase and exit */
+-- 
+2.34.1
+
diff --git a/queue-5.10/perf-fix-perf_event_read_local-time.patch-26974 b/queue-5.10/perf-fix-perf_event_read_local-time.patch-26974
new file mode 100644 (file)
index 0000000..204871a
--- /dev/null
@@ -0,0 +1,575 @@
+From c8666f0b22c9cb634d82b3f049c7ed4be9176f58 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Dec 2021 13:19:52 +0100
+Subject: perf: Fix perf_event_read_local() time
+
+From: Peter Zijlstra <peterz@infradead.org>
+
+[ Upstream commit 09f5e7dc7ad705289e1b1ec065439aa3c42951c4 ]
+
+Time readers that cannot take locks (due to NMI etc..) currently make
+use of perf_event::shadow_ctx_time, which, for that event gives:
+
+  time' = now + (time - timestamp)
+
+or, alternatively arranged:
+
+  time' = time + (now - timestamp)
+
+IOW, the progression of time since the last time the shadow_ctx_time
+was updated.
+
+There's problems with this:
+
+ A) the shadow_ctx_time is per-event, even though the ctx_time it
+    reflects is obviously per context. The direct concequence of this
+    is that the context needs to iterate all events all the time to
+    keep the shadow_ctx_time in sync.
+
+ B) even with the prior point, the context itself might not be active
+    meaning its time should not advance to begin with.
+
+ C) shadow_ctx_time isn't consistently updated when ctx_time is
+
+There are 3 users of this stuff, that suffer differently from this:
+
+ - calc_timer_values()
+   - perf_output_read()
+   - perf_event_update_userpage()      /* A */
+
+ - perf_event_read_local()             /* A,B */
+
+In particular, perf_output_read() doesn't suffer at all, because it's
+sample driven and hence only relevant when the event is actually
+running.
+
+This same was supposed to be true for perf_event_update_userpage(),
+after all self-monitoring implies the context is active *HOWEVER*, as
+per commit f79256532682 ("perf/core: fix userpage->time_enabled of
+inactive events") this goes wrong when combined with counter
+overcommit, in that case those events that do not get scheduled when
+the context becomes active (task events typically) miss out on the
+EVENT_TIME update and ENABLED time is inflated (for a little while)
+with the time the context was inactive. Once the event gets rotated
+in, this gets corrected, leading to a non-monotonic timeflow.
+
+perf_event_read_local() made things even worse, it can request time at
+any point, suffering all the problems perf_event_update_userpage()
+does and more. Because while perf_event_update_userpage() is limited
+by the context being active, perf_event_read_local() users have no
+such constraint.
+
+Therefore, completely overhaul things and do away with
+perf_event::shadow_ctx_time. Instead have regular context time updates
+keep track of this offset directly and provide perf_event_time_now()
+to complement perf_event_time().
+
+perf_event_time_now() will, in adition to being context wide, also
+take into account if the context is active. For inactive context, it
+will not advance time.
+
+This latter property means the cgroup perf_cgroup_info context needs
+to grow addition state to track this.
+
+Additionally, since all this is strictly per-cpu, we can use barrier()
+to order context activity vs context time.
+
+Fixes: 7d9285e82db5 ("perf/bpf: Extend the perf_event_read_local() interface, a.k.a. "bpf: perf event change needed for subsequent bpf helpers"")
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Tested-by: Song Liu <song@kernel.org>
+Tested-by: Namhyung Kim <namhyung@kernel.org>
+Link: https://lkml.kernel.org/r/YcB06DasOBtU0b00@hirez.programming.kicks-ass.net
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/perf_event.h |  15 +--
+ kernel/events/core.c       | 246 ++++++++++++++++++++++---------------
+ 2 files changed, 149 insertions(+), 112 deletions(-)
+
+diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
+index c94551091dad3..67a50c78232fe 100644
+--- a/include/linux/perf_event.h
++++ b/include/linux/perf_event.h
+@@ -678,18 +678,6 @@ struct perf_event {
+       u64                             total_time_running;
+       u64                             tstamp;
+-      /*
+-       * timestamp shadows the actual context timing but it can
+-       * be safely used in NMI interrupt context. It reflects the
+-       * context time as it was when the event was last scheduled in,
+-       * or when ctx_sched_in failed to schedule the event because we
+-       * run out of PMC.
+-       *
+-       * ctx_time already accounts for ctx->timestamp. Therefore to
+-       * compute ctx_time for a sample, simply add perf_clock().
+-       */
+-      u64                             shadow_ctx_time;
+-
+       struct perf_event_attr          attr;
+       u16                             header_size;
+       u16                             id_header_size;
+@@ -834,6 +822,7 @@ struct perf_event_context {
+        */
+       u64                             time;
+       u64                             timestamp;
++      u64                             timeoffset;
+       /*
+        * These fields let us detect when two contexts have both
+@@ -916,6 +905,8 @@ struct bpf_perf_event_data_kern {
+ struct perf_cgroup_info {
+       u64                             time;
+       u64                             timestamp;
++      u64                             timeoffset;
++      int                             active;
+ };
+ struct perf_cgroup {
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index 8dc7c4d12b789..c6493f7e02359 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -673,6 +673,23 @@ perf_event_set_state(struct perf_event *event, enum perf_event_state state)
+       WRITE_ONCE(event->state, state);
+ }
++/*
++ * UP store-release, load-acquire
++ */
++
++#define __store_release(ptr, val)                                     \
++do {                                                                  \
++      barrier();                                                      \
++      WRITE_ONCE(*(ptr), (val));                                      \
++} while (0)
++
++#define __load_acquire(ptr)                                           \
++({                                                                    \
++      __unqual_scalar_typeof(*(ptr)) ___p = READ_ONCE(*(ptr));        \
++      barrier();                                                      \
++      ___p;                                                           \
++})
++
+ #ifdef CONFIG_CGROUP_PERF
+ static inline bool
+@@ -718,34 +735,51 @@ static inline u64 perf_cgroup_event_time(struct perf_event *event)
+       return t->time;
+ }
+-static inline void __update_cgrp_time(struct perf_cgroup *cgrp)
++static inline u64 perf_cgroup_event_time_now(struct perf_event *event, u64 now)
+ {
+-      struct perf_cgroup_info *info;
+-      u64 now;
+-
+-      now = perf_clock();
++      struct perf_cgroup_info *t;
+-      info = this_cpu_ptr(cgrp->info);
++      t = per_cpu_ptr(event->cgrp->info, event->cpu);
++      if (!__load_acquire(&t->active))
++              return t->time;
++      now += READ_ONCE(t->timeoffset);
++      return now;
++}
+-      info->time += now - info->timestamp;
++static inline void __update_cgrp_time(struct perf_cgroup_info *info, u64 now, bool adv)
++{
++      if (adv)
++              info->time += now - info->timestamp;
+       info->timestamp = now;
++      /*
++       * see update_context_time()
++       */
++      WRITE_ONCE(info->timeoffset, info->time - info->timestamp);
+ }
+-static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx)
++static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx, bool final)
+ {
+       struct perf_cgroup *cgrp = cpuctx->cgrp;
+       struct cgroup_subsys_state *css;
++      struct perf_cgroup_info *info;
+       if (cgrp) {
++              u64 now = perf_clock();
++
+               for (css = &cgrp->css; css; css = css->parent) {
+                       cgrp = container_of(css, struct perf_cgroup, css);
+-                      __update_cgrp_time(cgrp);
++                      info = this_cpu_ptr(cgrp->info);
++
++                      __update_cgrp_time(info, now, true);
++                      if (final)
++                              __store_release(&info->active, 0);
+               }
+       }
+ }
+ static inline void update_cgrp_time_from_event(struct perf_event *event)
+ {
++      struct perf_cgroup_info *info;
+       struct perf_cgroup *cgrp;
+       /*
+@@ -759,8 +793,10 @@ static inline void update_cgrp_time_from_event(struct perf_event *event)
+       /*
+        * Do not update time when cgroup is not active
+        */
+-      if (cgroup_is_descendant(cgrp->css.cgroup, event->cgrp->css.cgroup))
+-              __update_cgrp_time(event->cgrp);
++      if (cgroup_is_descendant(cgrp->css.cgroup, event->cgrp->css.cgroup)) {
++              info = this_cpu_ptr(event->cgrp->info);
++              __update_cgrp_time(info, perf_clock(), true);
++      }
+ }
+ static inline void
+@@ -784,7 +820,8 @@ perf_cgroup_set_timestamp(struct task_struct *task,
+       for (css = &cgrp->css; css; css = css->parent) {
+               cgrp = container_of(css, struct perf_cgroup, css);
+               info = this_cpu_ptr(cgrp->info);
+-              info->timestamp = ctx->timestamp;
++              __update_cgrp_time(info, ctx->timestamp, false);
++              __store_release(&info->active, 1);
+       }
+ }
+@@ -980,14 +1017,6 @@ out:
+       return ret;
+ }
+-static inline void
+-perf_cgroup_set_shadow_time(struct perf_event *event, u64 now)
+-{
+-      struct perf_cgroup_info *t;
+-      t = per_cpu_ptr(event->cgrp->info, event->cpu);
+-      event->shadow_ctx_time = now - t->timestamp;
+-}
+-
+ static inline void
+ perf_cgroup_event_enable(struct perf_event *event, struct perf_event_context *ctx)
+ {
+@@ -1065,7 +1094,8 @@ static inline void update_cgrp_time_from_event(struct perf_event *event)
+ {
+ }
+-static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx)
++static inline void update_cgrp_time_from_cpuctx(struct perf_cpu_context *cpuctx,
++                                              bool final)
+ {
+ }
+@@ -1097,12 +1127,12 @@ perf_cgroup_switch(struct task_struct *task, struct task_struct *next)
+ {
+ }
+-static inline void
+-perf_cgroup_set_shadow_time(struct perf_event *event, u64 now)
++static inline u64 perf_cgroup_event_time(struct perf_event *event)
+ {
++      return 0;
+ }
+-static inline u64 perf_cgroup_event_time(struct perf_event *event)
++static inline u64 perf_cgroup_event_time_now(struct perf_event *event, u64 now)
+ {
+       return 0;
+ }
+@@ -1524,22 +1554,59 @@ static void perf_unpin_context(struct perf_event_context *ctx)
+ /*
+  * Update the record of the current time in a context.
+  */
+-static void update_context_time(struct perf_event_context *ctx)
++static void __update_context_time(struct perf_event_context *ctx, bool adv)
+ {
+       u64 now = perf_clock();
+-      ctx->time += now - ctx->timestamp;
++      if (adv)
++              ctx->time += now - ctx->timestamp;
+       ctx->timestamp = now;
++
++      /*
++       * The above: time' = time + (now - timestamp), can be re-arranged
++       * into: time` = now + (time - timestamp), which gives a single value
++       * offset to compute future time without locks on.
++       *
++       * See perf_event_time_now(), which can be used from NMI context where
++       * it's (obviously) not possible to acquire ctx->lock in order to read
++       * both the above values in a consistent manner.
++       */
++      WRITE_ONCE(ctx->timeoffset, ctx->time - ctx->timestamp);
++}
++
++static void update_context_time(struct perf_event_context *ctx)
++{
++      __update_context_time(ctx, true);
+ }
+ static u64 perf_event_time(struct perf_event *event)
+ {
+       struct perf_event_context *ctx = event->ctx;
++      if (unlikely(!ctx))
++              return 0;
++
+       if (is_cgroup_event(event))
+               return perf_cgroup_event_time(event);
+-      return ctx ? ctx->time : 0;
++      return ctx->time;
++}
++
++static u64 perf_event_time_now(struct perf_event *event, u64 now)
++{
++      struct perf_event_context *ctx = event->ctx;
++
++      if (unlikely(!ctx))
++              return 0;
++
++      if (is_cgroup_event(event))
++              return perf_cgroup_event_time_now(event, now);
++
++      if (!(__load_acquire(&ctx->is_active) & EVENT_TIME))
++              return ctx->time;
++
++      now += READ_ONCE(ctx->timeoffset);
++      return now;
+ }
+ static enum event_type_t get_event_type(struct perf_event *event)
+@@ -2333,7 +2400,7 @@ __perf_remove_from_context(struct perf_event *event,
+       if (ctx->is_active & EVENT_TIME) {
+               update_context_time(ctx);
+-              update_cgrp_time_from_cpuctx(cpuctx);
++              update_cgrp_time_from_cpuctx(cpuctx, false);
+       }
+       event_sched_out(event, cpuctx, ctx);
+@@ -2342,6 +2409,9 @@ __perf_remove_from_context(struct perf_event *event,
+       list_del_event(event, ctx);
+       if (!ctx->nr_events && ctx->is_active) {
++              if (ctx == &cpuctx->ctx)
++                      update_cgrp_time_from_cpuctx(cpuctx, true);
++
+               ctx->is_active = 0;
+               ctx->rotate_necessary = 0;
+               if (ctx->task) {
+@@ -2467,40 +2537,6 @@ void perf_event_disable_inatomic(struct perf_event *event)
+       irq_work_queue(&event->pending);
+ }
+-static void perf_set_shadow_time(struct perf_event *event,
+-                               struct perf_event_context *ctx)
+-{
+-      /*
+-       * use the correct time source for the time snapshot
+-       *
+-       * We could get by without this by leveraging the
+-       * fact that to get to this function, the caller
+-       * has most likely already called update_context_time()
+-       * and update_cgrp_time_xx() and thus both timestamp
+-       * are identical (or very close). Given that tstamp is,
+-       * already adjusted for cgroup, we could say that:
+-       *    tstamp - ctx->timestamp
+-       * is equivalent to
+-       *    tstamp - cgrp->timestamp.
+-       *
+-       * Then, in perf_output_read(), the calculation would
+-       * work with no changes because:
+-       * - event is guaranteed scheduled in
+-       * - no scheduled out in between
+-       * - thus the timestamp would be the same
+-       *
+-       * But this is a bit hairy.
+-       *
+-       * So instead, we have an explicit cgroup call to remain
+-       * within the time source all along. We believe it
+-       * is cleaner and simpler to understand.
+-       */
+-      if (is_cgroup_event(event))
+-              perf_cgroup_set_shadow_time(event, event->tstamp);
+-      else
+-              event->shadow_ctx_time = event->tstamp - ctx->timestamp;
+-}
+-
+ #define MAX_INTERRUPTS (~0ULL)
+ static void perf_log_throttle(struct perf_event *event, int enable);
+@@ -2541,8 +2577,6 @@ event_sched_in(struct perf_event *event,
+       perf_pmu_disable(event->pmu);
+-      perf_set_shadow_time(event, ctx);
+-
+       perf_log_itrace_start(event);
+       if (event->pmu->add(event, PERF_EF_START)) {
+@@ -3216,16 +3250,6 @@ static void ctx_sched_out(struct perf_event_context *ctx,
+               return;
+       }
+-      ctx->is_active &= ~event_type;
+-      if (!(ctx->is_active & EVENT_ALL))
+-              ctx->is_active = 0;
+-
+-      if (ctx->task) {
+-              WARN_ON_ONCE(cpuctx->task_ctx != ctx);
+-              if (!ctx->is_active)
+-                      cpuctx->task_ctx = NULL;
+-      }
+-
+       /*
+        * Always update time if it was set; not only when it changes.
+        * Otherwise we can 'forget' to update time for any but the last
+@@ -3239,7 +3263,22 @@ static void ctx_sched_out(struct perf_event_context *ctx,
+       if (is_active & EVENT_TIME) {
+               /* update (and stop) ctx time */
+               update_context_time(ctx);
+-              update_cgrp_time_from_cpuctx(cpuctx);
++              update_cgrp_time_from_cpuctx(cpuctx, ctx == &cpuctx->ctx);
++              /*
++               * CPU-release for the below ->is_active store,
++               * see __load_acquire() in perf_event_time_now()
++               */
++              barrier();
++      }
++
++      ctx->is_active &= ~event_type;
++      if (!(ctx->is_active & EVENT_ALL))
++              ctx->is_active = 0;
++
++      if (ctx->task) {
++              WARN_ON_ONCE(cpuctx->task_ctx != ctx);
++              if (!ctx->is_active)
++                      cpuctx->task_ctx = NULL;
+       }
+       is_active ^= ctx->is_active; /* changed bits */
+@@ -3676,13 +3715,19 @@ static noinline int visit_groups_merge(struct perf_cpu_context *cpuctx,
+       return 0;
+ }
++/*
++ * Because the userpage is strictly per-event (there is no concept of context,
++ * so there cannot be a context indirection), every userpage must be updated
++ * when context time starts :-(
++ *
++ * IOW, we must not miss EVENT_TIME edges.
++ */
+ static inline bool event_update_userpage(struct perf_event *event)
+ {
+       if (likely(!atomic_read(&event->mmap_count)))
+               return false;
+       perf_event_update_time(event);
+-      perf_set_shadow_time(event, event->ctx);
+       perf_event_update_userpage(event);
+       return true;
+@@ -3766,13 +3811,23 @@ ctx_sched_in(struct perf_event_context *ctx,
+            struct task_struct *task)
+ {
+       int is_active = ctx->is_active;
+-      u64 now;
+       lockdep_assert_held(&ctx->lock);
+       if (likely(!ctx->nr_events))
+               return;
++      if (is_active ^ EVENT_TIME) {
++              /* start ctx time */
++              __update_context_time(ctx, false);
++              perf_cgroup_set_timestamp(task, ctx);
++              /*
++               * CPU-release for the below ->is_active store,
++               * see __load_acquire() in perf_event_time_now()
++               */
++              barrier();
++      }
++
+       ctx->is_active |= (event_type | EVENT_TIME);
+       if (ctx->task) {
+               if (!is_active)
+@@ -3783,13 +3838,6 @@ ctx_sched_in(struct perf_event_context *ctx,
+       is_active ^= ctx->is_active; /* changed bits */
+-      if (is_active & EVENT_TIME) {
+-              /* start ctx time */
+-              now = perf_clock();
+-              ctx->timestamp = now;
+-              perf_cgroup_set_timestamp(task, ctx);
+-      }
+-
+       /*
+        * First go through the list and put on any pinned groups
+        * in order to give them the best chance of going on.
+@@ -4325,6 +4373,18 @@ static inline u64 perf_event_count(struct perf_event *event)
+       return local64_read(&event->count) + atomic64_read(&event->child_count);
+ }
++static void calc_timer_values(struct perf_event *event,
++                              u64 *now,
++                              u64 *enabled,
++                              u64 *running)
++{
++      u64 ctx_time;
++
++      *now = perf_clock();
++      ctx_time = perf_event_time_now(event, *now);
++      __perf_update_times(event, ctx_time, enabled, running);
++}
++
+ /*
+  * NMI-safe method to read a local event, that is an event that
+  * is:
+@@ -4384,10 +4444,9 @@ int perf_event_read_local(struct perf_event *event, u64 *value,
+       *value = local64_read(&event->count);
+       if (enabled || running) {
+-              u64 now = event->shadow_ctx_time + perf_clock();
+-              u64 __enabled, __running;
++              u64 __enabled, __running, __now;;
+-              __perf_update_times(event, now, &__enabled, &__running);
++              calc_timer_values(event, &__now, &__enabled, &__running);
+               if (enabled)
+                       *enabled = __enabled;
+               if (running)
+@@ -5694,18 +5753,6 @@ static int perf_event_index(struct perf_event *event)
+       return event->pmu->event_idx(event);
+ }
+-static void calc_timer_values(struct perf_event *event,
+-                              u64 *now,
+-                              u64 *enabled,
+-                              u64 *running)
+-{
+-      u64 ctx_time;
+-
+-      *now = perf_clock();
+-      ctx_time = event->shadow_ctx_time + *now;
+-      __perf_update_times(event, ctx_time, enabled, running);
+-}
+-
+ static void perf_event_init_userpage(struct perf_event *event)
+ {
+       struct perf_event_mmap_page *userpg;
+@@ -6245,7 +6292,6 @@ accounting:
+               ring_buffer_attach(event, rb);
+               perf_event_update_time(event);
+-              perf_set_shadow_time(event, event->ctx);
+               perf_event_init_userpage(event);
+               perf_event_update_userpage(event);
+       } else {
+-- 
+2.34.1
+
diff --git a/queue-5.10/phylib-fix-potential-use-after-free.patch-8764 b/queue-5.10/phylib-fix-potential-use-after-free.patch-8764
new file mode 100644 (file)
index 0000000..9268074
--- /dev/null
@@ -0,0 +1,58 @@
+From 998d7b539d4cd3286967471855d9e1b456310e37 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jan 2022 17:27:48 +0100
+Subject: phylib: fix potential use-after-free
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <kabel@kernel.org>
+
+[ Upstream commit cbda1b16687580d5beee38273f6241ae3725960c ]
+
+Commit bafbdd527d56 ("phylib: Add device reset GPIO support") added call
+to phy_device_reset(phydev) after the put_device() call in phy_detach().
+
+The comment before the put_device() call says that the phydev might go
+away with put_device().
+
+Fix potential use-after-free by calling phy_device_reset() before
+put_device().
+
+Fixes: bafbdd527d56 ("phylib: Add device reset GPIO support")
+Signed-off-by: Marek Behún <kabel@kernel.org>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/20220119162748.32418-1-kabel@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/phy_device.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
+index 85f3cde5ffd09..d2f6d8107595a 100644
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -1682,6 +1682,9 @@ void phy_detach(struct phy_device *phydev)
+           phy_driver_is_genphy_10g(phydev))
+               device_release_driver(&phydev->mdio.dev);
++      /* Assert the reset signal */
++      phy_device_reset(phydev, 1);
++
+       /*
+        * The phydev might go away on the put_device() below, so avoid
+        * a use-after-free bug by reading the underlying bus first.
+@@ -1693,9 +1696,6 @@ void phy_detach(struct phy_device *phydev)
+               ndev_owner = dev->dev.parent->driver->owner;
+       if (ndev_owner != bus->owner)
+               module_put(bus->owner);
+-
+-      /* Assert the reset signal */
+-      phy_device_reset(phydev, 1);
+ }
+ EXPORT_SYMBOL(phy_detach);
+-- 
+2.34.1
+
diff --git a/queue-5.10/ping-fix-the-sk_bound_dev_if-match-in-ping_lookup.patch-18872 b/queue-5.10/ping-fix-the-sk_bound_dev_if-match-in-ping_lookup.patch-18872
new file mode 100644 (file)
index 0000000..62a14e8
--- /dev/null
@@ -0,0 +1,51 @@
+From 12eb0b3ad704529822739802c388d79731d32b4c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Jan 2022 06:40:56 -0500
+Subject: ping: fix the sk_bound_dev_if match in ping_lookup
+
+From: Xin Long <lucien.xin@gmail.com>
+
+[ Upstream commit 2afc3b5a31f9edf3ef0f374f5d70610c79c93a42 ]
+
+When 'ping' changes to use PING socket instead of RAW socket by:
+
+   # sysctl -w net.ipv4.ping_group_range="0 100"
+
+the selftests 'router_broadcast.sh' will fail, as such command
+
+  # ip vrf exec vrf-h1 ping -I veth0 198.51.100.255 -b
+
+can't receive the response skb by the PING socket. It's caused by mismatch
+of sk_bound_dev_if and dif in ping_rcv() when looking up the PING socket,
+as dif is vrf-h1 if dif's master was set to vrf-h1.
+
+This patch is to fix this regression by also checking the sk_bound_dev_if
+against sdif so that the packets can stil be received even if the socket
+is not bound to the vrf device but to the real iif.
+
+Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind")
+Reported-by: Hangbin Liu <liuhangbin@gmail.com>
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/ping.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
+index 8ce8b7300b9d3..a5722905456c2 100644
+--- a/net/ipv4/ping.c
++++ b/net/ipv4/ping.c
+@@ -220,7 +220,8 @@ static struct sock *ping_lookup(struct net *net, struct sk_buff *skb, u16 ident)
+                       continue;
+               }
+-              if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)
++              if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif &&
++                  sk->sk_bound_dev_if != inet_sdif(skb))
+                       continue;
+               sock_hold(sk);
+-- 
+2.34.1
+
diff --git a/queue-5.10/powerpc-perf-fix-power_pmu_disable-to-call-clear_pmi.patch-26206 b/queue-5.10/powerpc-perf-fix-power_pmu_disable-to-call-clear_pmi.patch-26206
new file mode 100644 (file)
index 0000000..6a1548e
--- /dev/null
@@ -0,0 +1,95 @@
+From 2a948d3006111935a336f67ff0b8fb560063fb98 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Jan 2022 09:04:29 +0530
+Subject: powerpc/perf: Fix power_pmu_disable to call clear_pmi_irq_pending
+ only if PMI is pending
+
+From: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
+
+[ Upstream commit fb6433b48a178d4672cb26632454ee0b21056eaa ]
+
+Running selftest with CONFIG_PPC_IRQ_SOFT_MASK_DEBUG enabled in kernel
+triggered below warning:
+
+[  172.851380] ------------[ cut here ]------------
+[  172.851391] WARNING: CPU: 8 PID: 2901 at arch/powerpc/include/asm/hw_irq.h:246 power_pmu_disable+0x270/0x280
+[  172.851402] Modules linked in: dm_mod bonding nft_ct nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set nf_tables rfkill nfnetlink sunrpc xfs libcrc32c pseries_rng xts vmx_crypto uio_pdrv_genirq uio sch_fq_codel ip_tables ext4 mbcache jbd2 sd_mod t10_pi sg ibmvscsi ibmveth scsi_transport_srp fuse
+[  172.851442] CPU: 8 PID: 2901 Comm: lost_exception_ Not tainted 5.16.0-rc5-03218-g798527287598 #2
+[  172.851451] NIP:  c00000000013d600 LR: c00000000013d5a4 CTR: c00000000013b180
+[  172.851458] REGS: c000000017687860 TRAP: 0700   Not tainted  (5.16.0-rc5-03218-g798527287598)
+[  172.851465] MSR:  8000000000029033 <SF,EE,ME,IR,DR,RI,LE>  CR: 48004884  XER: 20040000
+[  172.851482] CFAR: c00000000013d5b4 IRQMASK: 1
+[  172.851482] GPR00: c00000000013d5a4 c000000017687b00 c000000002a10600 0000000000000004
+[  172.851482] GPR04: 0000000082004000 c0000008ba08f0a8 0000000000000000 00000008b7ed0000
+[  172.851482] GPR08: 00000000446194f6 0000000000008000 c00000000013b118 c000000000d58e68
+[  172.851482] GPR12: c00000000013d390 c00000001ec54a80 0000000000000000 0000000000000000
+[  172.851482] GPR16: 0000000000000000 0000000000000000 c000000015d5c708 c0000000025396d0
+[  172.851482] GPR20: 0000000000000000 0000000000000000 c00000000a3bbf40 0000000000000003
+[  172.851482] GPR24: 0000000000000000 c0000008ba097400 c0000000161e0d00 c00000000a3bb600
+[  172.851482] GPR28: c000000015d5c700 0000000000000001 0000000082384090 c0000008ba0020d8
+[  172.851549] NIP [c00000000013d600] power_pmu_disable+0x270/0x280
+[  172.851557] LR [c00000000013d5a4] power_pmu_disable+0x214/0x280
+[  172.851565] Call Trace:
+[  172.851568] [c000000017687b00] [c00000000013d5a4] power_pmu_disable+0x214/0x280 (unreliable)
+[  172.851579] [c000000017687b40] [c0000000003403ac] perf_pmu_disable+0x4c/0x60
+[  172.851588] [c000000017687b60] [c0000000003445e4] __perf_event_task_sched_out+0x1d4/0x660
+[  172.851596] [c000000017687c50] [c000000000d1175c] __schedule+0xbcc/0x12a0
+[  172.851602] [c000000017687d60] [c000000000d11ea8] schedule+0x78/0x140
+[  172.851608] [c000000017687d90] [c0000000001a8080] sys_sched_yield+0x20/0x40
+[  172.851615] [c000000017687db0] [c0000000000334dc] system_call_exception+0x18c/0x380
+[  172.851622] [c000000017687e10] [c00000000000c74c] system_call_common+0xec/0x268
+
+The warning indicates that MSR_EE being set(interrupt enabled) when
+there was an overflown PMC detected. This could happen in
+power_pmu_disable since it runs under interrupt soft disable
+condition ( local_irq_save ) and not with interrupts hard disabled.
+commit 2c9ac51b850d ("powerpc/perf: Fix PMU callbacks to clear
+pending PMI before resetting an overflown PMC") intended to clear
+PMI pending bit in Paca when disabling the PMU. It could happen
+that PMC gets overflown while code is in power_pmu_disable
+callback function. Hence add a check to see if PMI pending bit
+is set in Paca before clearing it via clear_pmi_pending.
+
+Fixes: 2c9ac51b850d ("powerpc/perf: Fix PMU callbacks to clear pending PMI before resetting an overflown PMC")
+Reported-by: Sachin Sant <sachinp@linux.ibm.com>
+Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
+Tested-by: Sachin Sant <sachinp@linux.ibm.com>
+Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/20220122033429.25395-1-atrajeev@linux.vnet.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/perf/core-book3s.c | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
+index bd34e062bd290..e49aa8fc6a491 100644
+--- a/arch/powerpc/perf/core-book3s.c
++++ b/arch/powerpc/perf/core-book3s.c
+@@ -1273,9 +1273,20 @@ static void power_pmu_disable(struct pmu *pmu)
+                * Otherwise provide a warning if there is PMI pending, but
+                * no counter is found overflown.
+                */
+-              if (any_pmc_overflown(cpuhw))
+-                      clear_pmi_irq_pending();
+-              else
++              if (any_pmc_overflown(cpuhw)) {
++                      /*
++                       * Since power_pmu_disable runs under local_irq_save, it
++                       * could happen that code hits a PMC overflow without PMI
++                       * pending in paca. Hence only clear PMI pending if it was
++                       * set.
++                       *
++                       * If a PMI is pending, then MSR[EE] must be disabled (because
++                       * the masked PMI handler disabling EE). So it is safe to
++                       * call clear_pmi_irq_pending().
++                       */
++                      if (pmi_irq_pending())
++                              clear_pmi_irq_pending();
++              } else
+                       WARN_ON(pmi_irq_pending());
+               val = mmcra = cpuhw->mmcr.mmcra;
+-- 
+2.34.1
+
diff --git a/queue-5.10/powerpc64-bpf-limit-ldbrx-to-processors-compliant-wi.patch-12659 b/queue-5.10/powerpc64-bpf-limit-ldbrx-to-processors-compliant-wi.patch-12659
new file mode 100644 (file)
index 0000000..cb73dd4
--- /dev/null
@@ -0,0 +1,104 @@
+From 12ee0241ae1f2c7f1d456ed91bf6a198a2400d3a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jan 2022 17:15:12 +0530
+Subject: powerpc64/bpf: Limit 'ldbrx' to processors compliant with ISA v2.06
+
+From: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
+
+[ Upstream commit 3f5f766d5f7f95a69a630da3544a1a0cee1cdddf ]
+
+Johan reported the below crash with test_bpf on ppc64 e5500:
+
+  test_bpf: #296 ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301 jited:1
+  Oops: Exception in kernel mode, sig: 4 [#1]
+  BE PAGE_SIZE=4K SMP NR_CPUS=24 QEMU e500
+  Modules linked in: test_bpf(+)
+  CPU: 0 PID: 76 Comm: insmod Not tainted 5.14.0-03771-g98c2059e008a-dirty #1
+  NIP:  8000000000061c3c LR: 80000000006dea64 CTR: 8000000000061c18
+  REGS: c0000000032d3420 TRAP: 0700   Not tainted (5.14.0-03771-g98c2059e008a-dirty)
+  MSR:  0000000080089000 <EE,ME>  CR: 88002822  XER: 20000000 IRQMASK: 0
+  <...>
+  NIP [8000000000061c3c] 0x8000000000061c3c
+  LR [80000000006dea64] .__run_one+0x104/0x17c [test_bpf]
+  Call Trace:
+   .__run_one+0x60/0x17c [test_bpf] (unreliable)
+   .test_bpf_init+0x6a8/0xdc8 [test_bpf]
+   .do_one_initcall+0x6c/0x28c
+   .do_init_module+0x68/0x28c
+   .load_module+0x2460/0x2abc
+   .__do_sys_init_module+0x120/0x18c
+   .system_call_exception+0x110/0x1b8
+   system_call_common+0xf0/0x210
+  --- interrupt: c00 at 0x101d0acc
+  <...>
+  ---[ end trace 47b2bf19090bb3d0 ]---
+
+  Illegal instruction
+
+The illegal instruction turned out to be 'ldbrx' emitted for
+BPF_FROM_[L|B]E, which was only introduced in ISA v2.06. Guard use of
+the same and implement an alternative approach for older processors.
+
+Fixes: 156d0e290e969c ("powerpc/ebpf/jit: Implement JIT compiler for extended BPF")
+Reported-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
+Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
+Tested-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
+Acked-by: Johan Almbladh <johan.almbladh@anyfinetworks.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://lore.kernel.org/r/d1e51c6fdf572062cf3009a751c3406bda01b832.1641468127.git.naveen.n.rao@linux.vnet.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/include/asm/ppc-opcode.h |  1 +
+ arch/powerpc/net/bpf_jit_comp64.c     | 22 +++++++++++++---------
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
+index a6e3700c4566a..f0c0816f57270 100644
+--- a/arch/powerpc/include/asm/ppc-opcode.h
++++ b/arch/powerpc/include/asm/ppc-opcode.h
+@@ -449,6 +449,7 @@
+ #define PPC_RAW_LDX(r, base, b)               (0x7c00002a | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))
+ #define PPC_RAW_LHZ(r, base, i)               (0xa0000000 | ___PPC_RT(r) | ___PPC_RA(base) | IMM_L(i))
+ #define PPC_RAW_LHBRX(r, base, b)     (0x7c00062c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))
++#define PPC_RAW_LWBRX(r, base, b)     (0x7c00042c | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))
+ #define PPC_RAW_LDBRX(r, base, b)     (0x7c000428 | ___PPC_RT(r) | ___PPC_RA(base) | ___PPC_RB(b))
+ #define PPC_RAW_STWCX(s, a, b)                (0x7c00012d | ___PPC_RS(s) | ___PPC_RA(a) | ___PPC_RB(b))
+ #define PPC_RAW_CMPWI(a, i)           (0x2c000000 | ___PPC_RA(a) | IMM_L(i))
+diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c
+index 8936090acb579..0d47514e8870d 100644
+--- a/arch/powerpc/net/bpf_jit_comp64.c
++++ b/arch/powerpc/net/bpf_jit_comp64.c
+@@ -651,17 +651,21 @@ bpf_alu32_trunc:
+                               EMIT(PPC_RAW_MR(dst_reg, b2p[TMP_REG_1]));
+                               break;
+                       case 64:
+-                              /*
+-                               * Way easier and faster(?) to store the value
+-                               * into stack and then use ldbrx
+-                               *
+-                               * ctx->seen will be reliable in pass2, but
+-                               * the instructions generated will remain the
+-                               * same across all passes
+-                               */
++                              /* Store the value to stack and then use byte-reverse loads */
+                               PPC_BPF_STL(dst_reg, 1, bpf_jit_stack_local(ctx));
+                               EMIT(PPC_RAW_ADDI(b2p[TMP_REG_1], 1, bpf_jit_stack_local(ctx)));
+-                              EMIT(PPC_RAW_LDBRX(dst_reg, 0, b2p[TMP_REG_1]));
++                              if (cpu_has_feature(CPU_FTR_ARCH_206)) {
++                                      EMIT(PPC_RAW_LDBRX(dst_reg, 0, b2p[TMP_REG_1]));
++                              } else {
++                                      EMIT(PPC_RAW_LWBRX(dst_reg, 0, b2p[TMP_REG_1]));
++                                      if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN))
++                                              EMIT(PPC_RAW_SLDI(dst_reg, dst_reg, 32));
++                                      EMIT(PPC_RAW_LI(b2p[TMP_REG_2], 4));
++                                      EMIT(PPC_RAW_LWBRX(b2p[TMP_REG_2], b2p[TMP_REG_2], b2p[TMP_REG_1]));
++                                      if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
++                                              EMIT(PPC_RAW_SLDI(b2p[TMP_REG_2], b2p[TMP_REG_2], 32));
++                                      EMIT(PPC_RAW_OR(dst_reg, dst_reg, b2p[TMP_REG_2]));
++                              }
+                               break;
+                       }
+                       break;
+-- 
+2.34.1
+
diff --git a/queue-5.10/revert-ipv6-honor-all-ipv6-pio-valid-lifetime-values.patch-17485 b/queue-5.10/revert-ipv6-honor-all-ipv6-pio-valid-lifetime-values.patch-17485
new file mode 100644 (file)
index 0000000..b68906b
--- /dev/null
@@ -0,0 +1,96 @@
+From 5c2a36fb9ec5480a35a2f0522819d9540f1d43eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jan 2022 16:38:52 +0100
+Subject: Revert "ipv6: Honor all IPv6 PIO Valid Lifetime values"
+
+From: Guillaume Nault <gnault@redhat.com>
+
+[ Upstream commit 36268983e90316b37000a005642af42234dabb36 ]
+
+This reverts commit b75326c201242de9495ff98e5d5cff41d7fc0d9d.
+
+This commit breaks Linux compatibility with USGv6 tests. The RFC this
+commit was based on is actually an expired draft: no published RFC
+currently allows the new behaviour it introduced.
+
+Without full IETF endorsement, the flash renumbering scenario this
+patch was supposed to enable is never going to work, as other IPv6
+equipements on the same LAN will keep the 2 hours limit.
+
+Fixes: b75326c20124 ("ipv6: Honor all IPv6 PIO Valid Lifetime values")
+Signed-off-by: Guillaume Nault <gnault@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/addrconf.h |  2 ++
+ net/ipv6/addrconf.c    | 27 ++++++++++++++++++++-------
+ 2 files changed, 22 insertions(+), 7 deletions(-)
+
+diff --git a/include/net/addrconf.h b/include/net/addrconf.h
+index 78ea3e332688f..e7ce719838b5e 100644
+--- a/include/net/addrconf.h
++++ b/include/net/addrconf.h
+@@ -6,6 +6,8 @@
+ #define RTR_SOLICITATION_INTERVAL     (4*HZ)
+ #define RTR_SOLICITATION_MAX_INTERVAL (3600*HZ)       /* 1 hour */
++#define MIN_VALID_LIFETIME            (2*3600)        /* 2 hours */
++
+ #define TEMP_VALID_LIFETIME           (7*86400)
+ #define TEMP_PREFERRED_LIFETIME               (86400)
+ #define REGEN_MAX_RETRY                       (3)
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index 29526937077b3..4dde49e628fab 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2577,7 +2577,7 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
+                                __u32 valid_lft, u32 prefered_lft)
+ {
+       struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1);
+-      int create = 0;
++      int create = 0, update_lft = 0;
+       if (!ifp && valid_lft) {
+               int max_addresses = in6_dev->cnf.max_addresses;
+@@ -2621,19 +2621,32 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
+               unsigned long now;
+               u32 stored_lft;
+-              /* Update lifetime (RFC4862 5.5.3 e)
+-               * We deviate from RFC4862 by honoring all Valid Lifetimes to
+-               * improve the reaction of SLAAC to renumbering events
+-               * (draft-gont-6man-slaac-renum-06, Section 4.2)
+-               */
++              /* update lifetime (RFC2462 5.5.3 e) */
+               spin_lock_bh(&ifp->lock);
+               now = jiffies;
+               if (ifp->valid_lft > (now - ifp->tstamp) / HZ)
+                       stored_lft = ifp->valid_lft - (now - ifp->tstamp) / HZ;
+               else
+                       stored_lft = 0;
+-
+               if (!create && stored_lft) {
++                      const u32 minimum_lft = min_t(u32,
++                              stored_lft, MIN_VALID_LIFETIME);
++                      valid_lft = max(valid_lft, minimum_lft);
++
++                      /* RFC4862 Section 5.5.3e:
++                       * "Note that the preferred lifetime of the
++                       *  corresponding address is always reset to
++                       *  the Preferred Lifetime in the received
++                       *  Prefix Information option, regardless of
++                       *  whether the valid lifetime is also reset or
++                       *  ignored."
++                       *
++                       * So we should always update prefered_lft here.
++                       */
++                      update_lft = 1;
++              }
++
++              if (update_lft) {
+                       ifp->valid_lft = valid_lft;
+                       ifp->prefered_lft = prefered_lft;
+                       ifp->tstamp = now;
+-- 
+2.34.1
+
diff --git a/queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ctr.patch-7720 b/queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ctr.patch-7720
new file mode 100644 (file)
index 0000000..cfd0b41
--- /dev/null
@@ -0,0 +1,117 @@
+From d06dac9b92008f32107071c7f2c16693002973ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Jan 2022 10:47:36 -0800
+Subject: rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev
+
+From: Sujit Kautkar <sujitka@chromium.org>
+
+[ Upstream commit b7fb2dad571d1e21173c06cef0bced77b323990a ]
+
+struct rpmsg_ctrldev contains a struct cdev. The current code frees
+the rpmsg_ctrldev struct in rpmsg_ctrldev_release_device(), but the
+cdev is a managed object, therefore its release is not predictable
+and the rpmsg_ctrldev could be freed before the cdev is entirely
+released, as in the backtrace below.
+
+[   93.625603] ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x7c
+[   93.636115] WARNING: CPU: 0 PID: 12 at lib/debugobjects.c:488 debug_print_object+0x13c/0x1b0
+[   93.644799] Modules linked in: veth xt_cgroup xt_MASQUERADE rfcomm algif_hash algif_skcipher af_alg uinput ip6table_nat fuse uvcvideo videobuf2_vmalloc venus_enc venus_dec videobuf2_dma_contig hci_uart btandroid btqca snd_soc_rt5682_i2c bluetooth qcom_spmi_temp_alarm snd_soc_rt5682v
+[   93.715175] CPU: 0 PID: 12 Comm: kworker/0:1 Tainted: G    B             5.4.163-lockdep #26
+[   93.723855] Hardware name: Google Lazor (rev3 - 8) with LTE (DT)
+[   93.730055] Workqueue: events kobject_delayed_cleanup
+[   93.735271] pstate: 60c00009 (nZCv daif +PAN +UAO)
+[   93.740216] pc : debug_print_object+0x13c/0x1b0
+[   93.744890] lr : debug_print_object+0x13c/0x1b0
+[   93.749555] sp : ffffffacf5bc7940
+[   93.752978] x29: ffffffacf5bc7940 x28: dfffffd000000000
+[   93.758448] x27: ffffffacdb11a800 x26: dfffffd000000000
+[   93.763916] x25: ffffffd0734f856c x24: dfffffd000000000
+[   93.769389] x23: 0000000000000000 x22: ffffffd0733c35b0
+[   93.774860] x21: ffffffd0751994a0 x20: ffffffd075ec27c0
+[   93.780338] x19: ffffffd075199100 x18: 00000000000276e0
+[   93.785814] x17: 0000000000000000 x16: dfffffd000000000
+[   93.791291] x15: ffffffffffffffff x14: 6e6968207473696c
+[   93.796768] x13: 0000000000000000 x12: ffffffd075e2b000
+[   93.802244] x11: 0000000000000001 x10: 0000000000000000
+[   93.807723] x9 : d13400dff1921900 x8 : d13400dff1921900
+[   93.813200] x7 : 0000000000000000 x6 : 0000000000000000
+[   93.818676] x5 : 0000000000000080 x4 : 0000000000000000
+[   93.824152] x3 : ffffffd0732a0fa4 x2 : 0000000000000001
+[   93.829628] x1 : ffffffacf5bc7580 x0 : 0000000000000061
+[   93.835104] Call trace:
+[   93.837644]  debug_print_object+0x13c/0x1b0
+[   93.841963]  __debug_check_no_obj_freed+0x25c/0x3c0
+[   93.846987]  debug_check_no_obj_freed+0x18/0x20
+[   93.851669]  slab_free_freelist_hook+0xbc/0x1e4
+[   93.856346]  kfree+0xfc/0x2f4
+[   93.859416]  rpmsg_ctrldev_release_device+0x78/0xb8
+[   93.864445]  device_release+0x84/0x168
+[   93.868310]  kobject_cleanup+0x12c/0x298
+[   93.872356]  kobject_delayed_cleanup+0x10/0x18
+[   93.876948]  process_one_work+0x578/0x92c
+[   93.881086]  worker_thread+0x804/0xcf8
+[   93.884963]  kthread+0x2a8/0x314
+[   93.888303]  ret_from_fork+0x10/0x18
+
+The cdev_device_add/del() API was created to address this issue (see
+commit '233ed09d7fda ("chardev: add helper function to register char
+devs with a struct device")'), use it instead of cdev add/del().
+
+Fixes: c0cdc19f84a4 ("rpmsg: Driver for user space endpoint interface")
+Signed-off-by: Sujit Kautkar <sujitka@chromium.org>
+Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Reviewed-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220110104706.v6.1.Iaac908f3e3149a89190ce006ba166e2d3fd247a3@changeid
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rpmsg/rpmsg_char.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
+index 4bbbacdbf3bb7..8816b1923cdbc 100644
+--- a/drivers/rpmsg/rpmsg_char.c
++++ b/drivers/rpmsg/rpmsg_char.c
+@@ -458,7 +458,6 @@ static void rpmsg_ctrldev_release_device(struct device *dev)
+       ida_simple_remove(&rpmsg_ctrl_ida, dev->id);
+       ida_simple_remove(&rpmsg_minor_ida, MINOR(dev->devt));
+-      cdev_del(&ctrldev->cdev);
+       kfree(ctrldev);
+ }
+@@ -493,19 +492,13 @@ static int rpmsg_chrdev_probe(struct rpmsg_device *rpdev)
+       dev->id = ret;
+       dev_set_name(&ctrldev->dev, "rpmsg_ctrl%d", ret);
+-      ret = cdev_add(&ctrldev->cdev, dev->devt, 1);
++      ret = cdev_device_add(&ctrldev->cdev, &ctrldev->dev);
+       if (ret)
+               goto free_ctrl_ida;
+       /* We can now rely on the release function for cleanup */
+       dev->release = rpmsg_ctrldev_release_device;
+-      ret = device_add(dev);
+-      if (ret) {
+-              dev_err(&rpdev->dev, "device_add failed: %d\n", ret);
+-              put_device(dev);
+-      }
+-
+       dev_set_drvdata(&rpdev->dev, ctrldev);
+       return ret;
+@@ -531,7 +524,7 @@ static void rpmsg_chrdev_remove(struct rpmsg_device *rpdev)
+       if (ret)
+               dev_warn(&rpdev->dev, "failed to nuke endpoints: %d\n", ret);
+-      device_del(&ctrldev->dev);
++      cdev_device_del(&ctrldev->cdev, &ctrldev->dev);
+       put_device(&ctrldev->dev);
+ }
+-- 
+2.34.1
+
diff --git a/queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ept.patch-26480 b/queue-5.10/rpmsg-char-fix-race-between-the-release-of-rpmsg_ept.patch-26480
new file mode 100644 (file)
index 0000000..475064c
--- /dev/null
@@ -0,0 +1,76 @@
+From 00f8f94636b1bf9b4b480eae7f2884dc7a6d8383 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Jan 2022 10:47:37 -0800
+Subject: rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev
+
+From: Matthias Kaehlcke <mka@chromium.org>
+
+[ Upstream commit 7a534ae89e34e9b51acb5a63dd0f88308178b46a ]
+
+struct rpmsg_eptdev contains a struct cdev. The current code frees
+the rpmsg_eptdev struct in rpmsg_eptdev_destroy(), but the cdev is
+a managed object, therefore its release is not predictable and the
+rpmsg_eptdev could be freed before the cdev is entirely released.
+
+The cdev_device_add/del() API was created to address this issue
+(see commit '233ed09d7fda ("chardev: add helper function to register
+char devs with a struct device")'), use it instead of cdev add/del().
+
+Fixes: c0cdc19f84a4 ("rpmsg: Driver for user space endpoint interface")
+Suggested-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Reviewed-by: Stephen Boyd <swboyd@chromium.org>
+Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
+Link: https://lore.kernel.org/r/20220110104706.v6.2.Idde68b05b88d4a2e6e54766c653f3a6d9e419ce6@changeid
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rpmsg/rpmsg_char.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/rpmsg/rpmsg_char.c b/drivers/rpmsg/rpmsg_char.c
+index 8816b1923cdbc..be90d77c5168d 100644
+--- a/drivers/rpmsg/rpmsg_char.c
++++ b/drivers/rpmsg/rpmsg_char.c
+@@ -92,7 +92,7 @@ static int rpmsg_eptdev_destroy(struct device *dev, void *data)
+       /* wake up any blocked readers */
+       wake_up_interruptible(&eptdev->readq);
+-      device_del(&eptdev->dev);
++      cdev_device_del(&eptdev->cdev, &eptdev->dev);
+       put_device(&eptdev->dev);
+       return 0;
+@@ -332,7 +332,6 @@ static void rpmsg_eptdev_release_device(struct device *dev)
+       ida_simple_remove(&rpmsg_ept_ida, dev->id);
+       ida_simple_remove(&rpmsg_minor_ida, MINOR(eptdev->dev.devt));
+-      cdev_del(&eptdev->cdev);
+       kfree(eptdev);
+ }
+@@ -377,19 +376,13 @@ static int rpmsg_eptdev_create(struct rpmsg_ctrldev *ctrldev,
+       dev->id = ret;
+       dev_set_name(dev, "rpmsg%d", ret);
+-      ret = cdev_add(&eptdev->cdev, dev->devt, 1);
++      ret = cdev_device_add(&eptdev->cdev, &eptdev->dev);
+       if (ret)
+               goto free_ept_ida;
+       /* We can now rely on the release function for cleanup */
+       dev->release = rpmsg_eptdev_release_device;
+-      ret = device_add(dev);
+-      if (ret) {
+-              dev_err(dev, "device_add failed: %d\n", ret);
+-              put_device(dev);
+-      }
+-
+       return ret;
+ free_ept_ida:
+-- 
+2.34.1
+
diff --git a/queue-5.10/rxrpc-adjust-retransmission-backoff.patch-30293 b/queue-5.10/rxrpc-adjust-retransmission-backoff.patch-30293
new file mode 100644 (file)
index 0000000..c29a49e
--- /dev/null
@@ -0,0 +1,93 @@
+From 730447b0dff59a7a30068b40f7970d381117d2f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jan 2022 23:12:58 +0000
+Subject: rxrpc: Adjust retransmission backoff
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 2c13c05c5ff4b9fc907b07f7311821910ebaaf8a ]
+
+Improve retransmission backoff by only backing off when we retransmit data
+packets rather than when we set the lost ack timer.
+
+To this end:
+
+ (1) In rxrpc_resend(), use rxrpc_get_rto_backoff() when setting the
+     retransmission timer and only tell it that we are retransmitting if we
+     actually have things to retransmit.
+
+     Note that it's possible for the retransmission algorithm to race with
+     the processing of a received ACK, so we may see no packets needing
+     retransmission.
+
+ (2) In rxrpc_send_data_packet(), don't bump the backoff when setting the
+     ack_lost_at timer, as it may then get bumped twice.
+
+With this, when looking at one particular packet, the retransmission
+intervals were seen to be 1.5ms, 2ms, 3ms, 5ms, 9ms, 17ms, 33ms, 71ms,
+136ms, 264ms, 544ms, 1.088s, 2.1s, 4.2s and 8.3s.
+
+Fixes: c410bf01933e ("rxrpc: Fix the excessive initial retransmission timeout")
+Suggested-by: Marc Dionne <marc.dionne@auristor.com>
+Signed-off-by: David Howells <dhowells@redhat.com>
+Reviewed-by: Marc Dionne <marc.dionne@auristor.com>
+Tested-by: Marc Dionne <marc.dionne@auristor.com>
+cc: linux-afs@lists.infradead.org
+Link: https://lore.kernel.org/r/164138117069.2023386.17446904856843997127.stgit@warthog.procyon.org.uk/
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/rxrpc/call_event.c | 8 +++-----
+ net/rxrpc/output.c     | 2 +-
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c
+index 6be2672a65eab..df864e6922679 100644
+--- a/net/rxrpc/call_event.c
++++ b/net/rxrpc/call_event.c
+@@ -157,7 +157,7 @@ static void rxrpc_congestion_timeout(struct rxrpc_call *call)
+ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
+ {
+       struct sk_buff *skb;
+-      unsigned long resend_at, rto_j;
++      unsigned long resend_at;
+       rxrpc_seq_t cursor, seq, top;
+       ktime_t now, max_age, oldest, ack_ts;
+       int ix;
+@@ -165,10 +165,8 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
+       _enter("{%d,%d}", call->tx_hard_ack, call->tx_top);
+-      rto_j = call->peer->rto_j;
+-
+       now = ktime_get_real();
+-      max_age = ktime_sub(now, jiffies_to_usecs(rto_j));
++      max_age = ktime_sub(now, jiffies_to_usecs(call->peer->rto_j));
+       spin_lock_bh(&call->lock);
+@@ -213,7 +211,7 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)
+       }
+       resend_at = nsecs_to_jiffies(ktime_to_ns(ktime_sub(now, oldest)));
+-      resend_at += jiffies + rto_j;
++      resend_at += jiffies + rxrpc_get_rto_backoff(call->peer, retrans);
+       WRITE_ONCE(call->resend_at, resend_at);
+       if (unacked)
+diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c
+index 10f2bf2e9068a..a45c83f22236e 100644
+--- a/net/rxrpc/output.c
++++ b/net/rxrpc/output.c
+@@ -468,7 +468,7 @@ done:
+                       if (call->peer->rtt_count > 1) {
+                               unsigned long nowj = jiffies, ack_lost_at;
+-                              ack_lost_at = rxrpc_get_rto_backoff(call->peer, retrans);
++                              ack_lost_at = rxrpc_get_rto_backoff(call->peer, false);
+                               ack_lost_at += nowj;
+                               WRITE_ONCE(call->ack_lost_at, ack_lost_at);
+                               rxrpc_reduce_call_timer(call, ack_lost_at, nowj,
+-- 
+2.34.1
+
diff --git a/queue-5.10/sched-pelt-relax-the-sync-of-util_sum-with-util_avg.patch-4811 b/queue-5.10/sched-pelt-relax-the-sync-of-util_sum-with-util_avg.patch-4811
new file mode 100644 (file)
index 0000000..64d26ca
--- /dev/null
@@ -0,0 +1,105 @@
+From b0dae8e1a110bd653caa27f5d7dd21da2213b5b6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jan 2022 14:46:56 +0100
+Subject: sched/pelt: Relax the sync of util_sum with util_avg
+
+From: Vincent Guittot <vincent.guittot@linaro.org>
+
+[ Upstream commit 98b0d890220d45418cfbc5157b3382e6da5a12ab ]
+
+Rick reported performance regressions in bugzilla because of cpu frequency
+being lower than before:
+    https://bugzilla.kernel.org/show_bug.cgi?id=215045
+
+He bisected the problem to:
+commit 1c35b07e6d39 ("sched/fair: Ensure _sum and _avg values stay consistent")
+
+This commit forces util_sum to be synced with the new util_avg after
+removing the contribution of a task and before the next periodic sync. By
+doing so util_sum is rounded to its lower bound and might lost up to
+LOAD_AVG_MAX-1 of accumulated contribution which has not yet been
+reflected in util_avg.
+
+Instead of always setting util_sum to the low bound of util_avg, which can
+significantly lower the utilization of root cfs_rq after propagating the
+change down into the hierarchy, we revert the change of util_sum and
+propagate the difference.
+
+In addition, we also check that cfs's util_sum always stays above the
+lower bound for a given util_avg as it has been observed that
+sched_entity's util_sum is sometimes above cfs one.
+
+Fixes: 1c35b07e6d39 ("sched/fair: Ensure _sum and _avg values stay consistent")
+Reported-by: Rick Yiu <rickyiu@google.com>
+Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
+Tested-by: Sachin Sant <sachinp@linux.ibm.com>
+Link: https://lkml.kernel.org/r/20220111134659.24961-2-vincent.guittot@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/sched/fair.c | 16 +++++++++++++---
+ kernel/sched/pelt.h |  4 +++-
+ 2 files changed, 16 insertions(+), 4 deletions(-)
+
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index 8d2f238fdd2ac..acd9833b8ec22 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -3379,7 +3379,6 @@ void set_task_rq_fair(struct sched_entity *se,
+       se->avg.last_update_time = n_last_update_time;
+ }
+-
+ /*
+  * When on migration a sched_entity joins/leaves the PELT hierarchy, we need to
+  * propagate its contribution. The key to this propagation is the invariant
+@@ -3447,7 +3446,6 @@ void set_task_rq_fair(struct sched_entity *se,
+  * XXX: only do this for the part of runnable > running ?
+  *
+  */
+-
+ static inline void
+ update_tg_cfs_util(struct cfs_rq *cfs_rq, struct sched_entity *se, struct cfs_rq *gcfs_rq)
+ {
+@@ -3676,7 +3674,19 @@ update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
+               r = removed_util;
+               sub_positive(&sa->util_avg, r);
+-              sa->util_sum = sa->util_avg * divider;
++              sub_positive(&sa->util_sum, r * divider);
++              /*
++               * Because of rounding, se->util_sum might ends up being +1 more than
++               * cfs->util_sum. Although this is not a problem by itself, detaching
++               * a lot of tasks with the rounding problem between 2 updates of
++               * util_avg (~1ms) can make cfs->util_sum becoming null whereas
++               * cfs_util_avg is not.
++               * Check that util_sum is still above its lower bound for the new
++               * util_avg. Given that period_contrib might have moved since the last
++               * sync, we are only sure that util_sum must be above or equal to
++               *    util_avg * minimum possible divider
++               */
++              sa->util_sum = max_t(u32, sa->util_sum, sa->util_avg * PELT_MIN_DIVIDER);
+               r = removed_runnable;
+               sub_positive(&sa->runnable_avg, r);
+diff --git a/kernel/sched/pelt.h b/kernel/sched/pelt.h
+index 0b9aeebb9c325..45bf08e22207c 100644
+--- a/kernel/sched/pelt.h
++++ b/kernel/sched/pelt.h
+@@ -37,9 +37,11 @@ update_irq_load_avg(struct rq *rq, u64 running)
+ }
+ #endif
++#define PELT_MIN_DIVIDER      (LOAD_AVG_MAX - 1024)
++
+ static inline u32 get_pelt_divider(struct sched_avg *avg)
+ {
+-      return LOAD_AVG_MAX - 1024 + avg->period_contrib;
++      return PELT_MIN_DIVIDER + avg->period_contrib;
+ }
+ static inline void cfs_se_util_change(struct sched_avg *avg)
+-- 
+2.34.1
+
diff --git a/queue-5.10/scsi-bnx2fc-flush-destroy_work-queue-before-calling-.patch-1575 b/queue-5.10/scsi-bnx2fc-flush-destroy_work-queue-before-calling-.patch-1575
new file mode 100644 (file)
index 0000000..a423531
--- /dev/null
@@ -0,0 +1,152 @@
+From 0e9b082ee4984d84e83f27029d4747e9d6defdcf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jan 2022 23:00:44 -0500
+Subject: scsi: bnx2fc: Flush destroy_work queue before calling
+ bnx2fc_interface_put()
+
+From: John Meneghini <jmeneghi@redhat.com>
+
+[ Upstream commit 847f9ea4c5186fdb7b84297e3eeed9e340e83fce ]
+
+The bnx2fc_destroy() functions are removing the interface before calling
+destroy_work. This results multiple WARNings from sysfs_remove_group() as
+the controller rport device attributes are removed too early.
+
+Replace the fcoe_port's destroy_work queue. It's not needed.
+
+The problem is easily reproducible with the following steps.
+
+Example:
+
+  $ dmesg -w &
+  $ systemctl enable --now fcoe
+  $ fipvlan -s -c ens2f1
+  $ fcoeadm -d ens2f1.802
+  [  583.464488] host2: libfc: Link down on port (7500a1)
+  [  583.472651] bnx2fc: 7500a1 - rport not created Yet!!
+  [  583.490468] ------------[ cut here ]------------
+  [  583.538725] sysfs group 'power' not found for kobject 'rport-2:0-0'
+  [  583.568814] WARNING: CPU: 3 PID: 192 at fs/sysfs/group.c:279 sysfs_remove_group+0x6f/0x80
+  [  583.607130] Modules linked in: dm_service_time 8021q garp mrp stp llc bnx2fc cnic uio rpcsec_gss_krb5 auth_rpcgss nfsv4 ...
+  [  583.942994] CPU: 3 PID: 192 Comm: kworker/3:2 Kdump: loaded Not tainted 5.14.0-39.el9.x86_64 #1
+  [  583.984105] Hardware name: HP ProLiant DL120 G7, BIOS J01 07/01/2013
+  [  584.016535] Workqueue: fc_wq_2 fc_rport_final_delete [scsi_transport_fc]
+  [  584.050691] RIP: 0010:sysfs_remove_group+0x6f/0x80
+  [  584.074725] Code: ff 5b 48 89 ef 5d 41 5c e9 ee c0 ff ff 48 89 ef e8 f6 b8 ff ff eb d1 49 8b 14 24 48 8b 33 48 c7 c7 ...
+  [  584.162586] RSP: 0018:ffffb567c15afdc0 EFLAGS: 00010282
+  [  584.188225] RAX: 0000000000000000 RBX: ffffffff8eec4220 RCX: 0000000000000000
+  [  584.221053] RDX: ffff8c1586ce84c0 RSI: ffff8c1586cd7cc0 RDI: ffff8c1586cd7cc0
+  [  584.255089] RBP: 0000000000000000 R08: 0000000000000000 R09: ffffb567c15afc00
+  [  584.287954] R10: ffffb567c15afbf8 R11: ffffffff8fbe7f28 R12: ffff8c1486326400
+  [  584.322356] R13: ffff8c1486326480 R14: ffff8c1483a4a000 R15: 0000000000000004
+  [  584.355379] FS:  0000000000000000(0000) GS:ffff8c1586cc0000(0000) knlGS:0000000000000000
+  [  584.394419] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+  [  584.421123] CR2: 00007fe95a6f7840 CR3: 0000000107674002 CR4: 00000000000606e0
+  [  584.454888] Call Trace:
+  [  584.466108]  device_del+0xb2/0x3e0
+  [  584.481701]  device_unregister+0x13/0x60
+  [  584.501306]  bsg_unregister_queue+0x5b/0x80
+  [  584.522029]  bsg_remove_queue+0x1c/0x40
+  [  584.541884]  fc_rport_final_delete+0xf3/0x1d0 [scsi_transport_fc]
+  [  584.573823]  process_one_work+0x1e3/0x3b0
+  [  584.592396]  worker_thread+0x50/0x3b0
+  [  584.609256]  ? rescuer_thread+0x370/0x370
+  [  584.628877]  kthread+0x149/0x170
+  [  584.643673]  ? set_kthread_struct+0x40/0x40
+  [  584.662909]  ret_from_fork+0x22/0x30
+  [  584.680002] ---[ end trace 53575ecefa942ece ]---
+
+Link: https://lore.kernel.org/r/20220115040044.1013475-1-jmeneghi@redhat.com
+Fixes: 0cbf32e1681d ("[SCSI] bnx2fc: Avoid calling bnx2fc_if_destroy with unnecessary locks")
+Tested-by: Guangwu Zhang <guazhang@redhat.com>
+Co-developed-by: Maurizio Lombardi <mlombard@redhat.com>
+Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
+Signed-off-by: John Meneghini <jmeneghi@redhat.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 20 +++++---------------
+ 1 file changed, 5 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+index 6890bbe04a8c1..052e7879704a5 100644
+--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
++++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+@@ -80,7 +80,7 @@ static int bnx2fc_bind_pcidev(struct bnx2fc_hba *hba);
+ static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba);
+ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
+                                 struct device *parent, int npiv);
+-static void bnx2fc_destroy_work(struct work_struct *work);
++static void bnx2fc_port_destroy(struct fcoe_port *port);
+ static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device *phys_dev);
+ static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
+@@ -905,9 +905,6 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event,
+                               __bnx2fc_destroy(interface);
+               }
+               mutex_unlock(&bnx2fc_dev_lock);
+-
+-              /* Ensure ALL destroy work has been completed before return */
+-              flush_workqueue(bnx2fc_wq);
+               return;
+       default:
+@@ -1213,8 +1210,8 @@ static int bnx2fc_vport_destroy(struct fc_vport *vport)
+       mutex_unlock(&n_port->lp_mutex);
+       bnx2fc_free_vport(interface->hba, port->lport);
+       bnx2fc_port_shutdown(port->lport);
++      bnx2fc_port_destroy(port);
+       bnx2fc_interface_put(interface);
+-      queue_work(bnx2fc_wq, &port->destroy_work);
+       return 0;
+ }
+@@ -1523,7 +1520,6 @@ static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
+       port->lport = lport;
+       port->priv = interface;
+       port->get_netdev = bnx2fc_netdev;
+-      INIT_WORK(&port->destroy_work, bnx2fc_destroy_work);
+       /* Configure fcoe_port */
+       rc = bnx2fc_lport_config(lport);
+@@ -1651,8 +1647,8 @@ static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
+       bnx2fc_interface_cleanup(interface);
+       bnx2fc_stop(interface);
+       list_del(&interface->list);
++      bnx2fc_port_destroy(port);
+       bnx2fc_interface_put(interface);
+-      queue_work(bnx2fc_wq, &port->destroy_work);
+ }
+ /**
+@@ -1692,15 +1688,12 @@ netdev_err:
+       return rc;
+ }
+-static void bnx2fc_destroy_work(struct work_struct *work)
++static void bnx2fc_port_destroy(struct fcoe_port *port)
+ {
+-      struct fcoe_port *port;
+       struct fc_lport *lport;
+-      port = container_of(work, struct fcoe_port, destroy_work);
+       lport = port->lport;
+-
+-      BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
++      BNX2FC_HBA_DBG(lport, "Entered %s, destroying lport %p\n", __func__, lport);
+       bnx2fc_if_destroy(lport);
+ }
+@@ -2554,9 +2547,6 @@ static void bnx2fc_ulp_exit(struct cnic_dev *dev)
+                       __bnx2fc_destroy(interface);
+       mutex_unlock(&bnx2fc_dev_lock);
+-      /* Ensure ALL destroy work has been completed before return */
+-      flush_workqueue(bnx2fc_wq);
+-
+       bnx2fc_ulp_stop(hba);
+       /* unregister cnic device */
+       if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic))
+-- 
+2.34.1
+
index 69946a0b2d3223da78534a47a5ecadf658f674eb..970d6b42c745e5ac71278b7bf6c1430295f7de8a 100644 (file)
@@ -32,3 +32,117 @@ usb-gadget-f_sourcesink-fix-isoc-transfer-for-usb_speed_super_plus.patch
 usb-core-fix-hang-in-usb_kill_urb-by-adding-memory-barriers.patch
 usb-typec-tcpm-do-not-disconnect-while-receiving-vbus-off.patch
 ucsi_ccg-check-dev_int-bit-only-when-starting-ccg4.patch
+nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch
+nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-26251
+nfsv4-handle-case-where-the-lookup-of-a-directory-fa.patch
+nfsv4-nfs_atomic_open-can-race-when-looking-up-a-non.patch
+powerpc64-bpf-limit-ldbrx-to-processors-compliant-wi.patch
+netfilter-conntrack-don-t-increment-invalid-counter-.patch
+rpmsg-char-fix-race-between-the-release-of-rpmsg_ctr.patch
+rpmsg-char-fix-race-between-the-release-of-rpmsg_ept.patch
+kernel-delete-repeated-words-in-comments.patch
+perf-fix-perf_event_read_local-time.patch
+sched-pelt-relax-the-sync-of-util_sum-with-util_avg.patch
+arm-9170-1-fix-panic-when-kasan-and-kprobe-are-enabl.patch
+net-fix-information-leakage-in-proc-net-ptype.patch
+net-phy-broadcom-hook-up-soft_reset-for-bcm54616s.patch
+ipv6_tunnel-rate-limit-warning-messages.patch
+i40e-increase-delay-to-1-s-after-global-emp-reset.patch
+i40e-fix-issue-when-maximum-queues-is-exceeded.patch
+i40e-fix-queues-reservation-for-xdp.patch
+i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch
+i40e-fix-unsigned-stat-widths.patch
+phylib-fix-potential-use-after-free.patch
+ipv6-correct-comments-about-fib6_node-sernum.patch
+ipv6-annotate-accesses-to-fn-fn_sernum.patch
+octeontx2-pf-forward-error-codes-to-vf.patch
+rxrpc-adjust-retransmission-backoff.patch
+efi-libstub-arm64-fix-image-check-alignment-at-entry.patch
+hwmon-lm90-reduce-maximum-conversion-rate-for-g781.patch
+hwmon-lm90-mark-alert-as-broken-for-max6654.patch
+hwmon-lm90-mark-alert-as-broken-for-max6680.patch
+hwmon-lm90-mark-alert-as-broken-for-max6646-6647-664.patch
+powerpc-perf-fix-power_pmu_disable-to-call-clear_pmi.patch
+net-procfs-show-net-devices-bound-packet-types.patch
+net-ipv4-move-ip_options_fragment-out-of-loop.patch
+net-ipv4-fix-the-warning-for-dereference.patch
+ipv4-fix-ip-option-filtering-for-locally-generated-f.patch
+ibmvnic-init-running_cap_crqs-early.patch
+ibmvnic-don-t-spin-in-tasklet.patch
+ping-fix-the-sk_bound_dev_if-match-in-ping_lookup.patch
+video-hyperv_fb-fix-validation-of-screen-resolution.patch
+drm-msm-dsi-fix-missing-put_device-call-in-dsi_get_p.patch
+drm-msm-hdmi-fix-missing-put_device-call-in-msm_hdmi.patch
+drm-msm-dpu-invalid-parameter-check-in-dpu_setup_dsp.patch
+drm-msm-fix-wrong-size-calculation.patch
+drm-msm-dsi-invalid-parameter-check-in-msm_dsi_phy_e.patch
+scsi-bnx2fc-flush-destroy_work-queue-before-calling-.patch
+yam-fix-a-memory-leak-in-yam_siocdevprivate.patch
+net-cpsw-properly-initialise-struct-page_pool_params.patch
+net-hns3-handle-empty-unknown-interrupt-for-vf.patch
+usb-roles-fix-include-linux-usb-role.h-compile-issue.patch
+ata-pata_platform-fix-a-null-pointer-dereference-in-.patch
+revert-ipv6-honor-all-ipv6-pio-valid-lifetime-values.patch
+net-bridge-vlan-fix-single-net-device-option-dumping.patch
+ipv4-raw-lock-the-socket-in-raw_bind.patch
+ipv4-tcp-send-zero-ipid-in-synack-messages.patch
+ipv4-avoid-using-shared-ip-generator-for-connected-s.patch
+ipv4-remove-sparse-error-in-ip_neigh_gw4.patch
+net-bridge-vlan-fix-memory-leak-in-__allowed_ingress.patch
+nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-15600
+nfs-ensure-the-server-has-an-up-to-date-ctime-before.patch-8657
+nfsv4-handle-case-where-the-lookup-of-a-directory-fa.patch-15449
+nfsv4-nfs_atomic_open-can-race-when-looking-up-a-non.patch-27002
+powerpc64-bpf-limit-ldbrx-to-processors-compliant-wi.patch-12659
+netfilter-conntrack-don-t-increment-invalid-counter-.patch-23162
+rpmsg-char-fix-race-between-the-release-of-rpmsg_ctr.patch-7720
+rpmsg-char-fix-race-between-the-release-of-rpmsg_ept.patch-26480
+kernel-delete-repeated-words-in-comments.patch-15671
+perf-fix-perf_event_read_local-time.patch-26974
+sched-pelt-relax-the-sync-of-util_sum-with-util_avg.patch-4811
+arm-9170-1-fix-panic-when-kasan-and-kprobe-are-enabl.patch-30400
+net-fix-information-leakage-in-proc-net-ptype.patch-15695
+net-phy-broadcom-hook-up-soft_reset-for-bcm54616s.patch-27858
+ipv6_tunnel-rate-limit-warning-messages.patch-10619
+i40e-increase-delay-to-1-s-after-global-emp-reset.patch-13096
+i40e-fix-issue-when-maximum-queues-is-exceeded.patch-24471
+i40e-fix-queues-reservation-for-xdp.patch-15396
+i40e-fix-for-failed-to-init-adminq-while-vf-reset.patch-21045
+i40e-fix-unsigned-stat-widths.patch-20948
+phylib-fix-potential-use-after-free.patch-8764
+ipv6-correct-comments-about-fib6_node-sernum.patch-17310
+ipv6-annotate-accesses-to-fn-fn_sernum.patch-11803
+octeontx2-pf-forward-error-codes-to-vf.patch-28837
+rxrpc-adjust-retransmission-backoff.patch-30293
+efi-libstub-arm64-fix-image-check-alignment-at-entry.patch-16098
+hwmon-lm90-reduce-maximum-conversion-rate-for-g781.patch-19402
+hwmon-lm90-mark-alert-as-broken-for-max6654.patch-31788
+hwmon-lm90-mark-alert-as-broken-for-max6680.patch-25015
+hwmon-lm90-mark-alert-as-broken-for-max6646-6647-664.patch-31110
+powerpc-perf-fix-power_pmu_disable-to-call-clear_pmi.patch-26206
+net-procfs-show-net-devices-bound-packet-types.patch-14776
+net-ipv4-move-ip_options_fragment-out-of-loop.patch-9656
+net-ipv4-fix-the-warning-for-dereference.patch-3212
+ipv4-fix-ip-option-filtering-for-locally-generated-f.patch-27601
+ibmvnic-init-running_cap_crqs-early.patch-3045
+ibmvnic-don-t-spin-in-tasklet.patch-9595
+ping-fix-the-sk_bound_dev_if-match-in-ping_lookup.patch-18872
+video-hyperv_fb-fix-validation-of-screen-resolution.patch-11533
+drm-msm-dsi-fix-missing-put_device-call-in-dsi_get_p.patch-11600
+drm-msm-hdmi-fix-missing-put_device-call-in-msm_hdmi.patch-14235
+drm-msm-dpu-invalid-parameter-check-in-dpu_setup_dsp.patch-23932
+drm-msm-fix-wrong-size-calculation.patch-26799
+drm-msm-dsi-invalid-parameter-check-in-msm_dsi_phy_e.patch-27026
+scsi-bnx2fc-flush-destroy_work-queue-before-calling-.patch-1575
+yam-fix-a-memory-leak-in-yam_siocdevprivate.patch-10148
+net-cpsw-properly-initialise-struct-page_pool_params.patch-12745
+net-hns3-handle-empty-unknown-interrupt-for-vf.patch-6323
+usb-roles-fix-include-linux-usb-role.h-compile-issue.patch-6053
+ata-pata_platform-fix-a-null-pointer-dereference-in-.patch-22417
+revert-ipv6-honor-all-ipv6-pio-valid-lifetime-values.patch-17485
+net-bridge-vlan-fix-single-net-device-option-dumping.patch-32125
+ipv4-raw-lock-the-socket-in-raw_bind.patch-1741
+ipv4-tcp-send-zero-ipid-in-synack-messages.patch-31729
+ipv4-avoid-using-shared-ip-generator-for-connected-s.patch-2008
+ipv4-remove-sparse-error-in-ip_neigh_gw4.patch-3162
+net-bridge-vlan-fix-memory-leak-in-__allowed_ingress.patch-11653
diff --git a/queue-5.10/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch-6053 b/queue-5.10/usb-roles-fix-include-linux-usb-role.h-compile-issue.patch-6053
new file mode 100644 (file)
index 0000000..43a02ef
--- /dev/null
@@ -0,0 +1,41 @@
+From 7a4da28ae2b14f1dc673f9b6b60f70499f27f119 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Jan 2022 20:43:28 +0800
+Subject: usb: roles: fix include/linux/usb/role.h compile issue
+
+From: Linyu Yuan <quic_linyyuan@quicinc.com>
+
+[ Upstream commit 945c37ed564770c78dfe6b9f08bed57a1b4e60ef ]
+
+when CONFIG_USB_ROLE_SWITCH is not defined,
+add usb_role_switch_find_by_fwnode() definition which return NULL.
+
+Fixes: c6919d5e0cd1 ("usb: roles: Add usb_role_switch_find_by_fwnode()")
+Signed-off-by: Linyu Yuan <quic_linyyuan@quicinc.com>
+Link: https://lore.kernel.org/r/1641818608-25039-1-git-send-email-quic_linyyuan@quicinc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/usb/role.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h
+index 0164fed31b06c..b9ccaeb8a4aef 100644
+--- a/include/linux/usb/role.h
++++ b/include/linux/usb/role.h
+@@ -90,6 +90,12 @@ fwnode_usb_role_switch_get(struct fwnode_handle *node)
+ static inline void usb_role_switch_put(struct usb_role_switch *sw) { }
++static inline struct usb_role_switch *
++usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode)
++{
++      return NULL;
++}
++
+ static inline struct usb_role_switch *
+ usb_role_switch_register(struct device *parent,
+                        const struct usb_role_switch_desc *desc)
+-- 
+2.34.1
+
diff --git a/queue-5.10/video-hyperv_fb-fix-validation-of-screen-resolution.patch-11533 b/queue-5.10/video-hyperv_fb-fix-validation-of-screen-resolution.patch-11533
new file mode 100644 (file)
index 0000000..42f5ba8
--- /dev/null
@@ -0,0 +1,99 @@
+From ee44596bd54c0d93cdb3e29c0d1a4a12d3286344 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jan 2022 11:18:31 -0800
+Subject: video: hyperv_fb: Fix validation of screen resolution
+
+From: Michael Kelley <mikelley@microsoft.com>
+
+[ Upstream commit 9ff5549b1d1d3c3a9d71220d44bd246586160f1d ]
+
+In the WIN10 version of the Synthetic Video protocol with Hyper-V,
+Hyper-V reports a list of supported resolutions as part of the protocol
+negotiation. The driver calculates the maximum width and height from
+the list of resolutions, and uses those maximums to validate any screen
+resolution specified in the video= option on the kernel boot line.
+
+This method of validation is incorrect. For example, the list of
+supported resolutions could contain 1600x1200 and 1920x1080, both of
+which fit in an 8 Mbyte frame buffer.  But calculating the max width
+and height yields 1920 and 1200, and 1920x1200 resolution does not fit
+in an 8 Mbyte frame buffer.  Unfortunately, this resolution is accepted,
+causing a kernel fault when the driver accesses memory outside the
+frame buffer.
+
+Instead, validate the specified screen resolution by calculating
+its size, and comparing against the frame buffer size.  Delete the
+code for calculating the max width and height from the list of
+resolutions, since these max values have no use.  Also add the
+frame buffer size to the info message to aid in understanding why
+a resolution might be rejected.
+
+Fixes: 67e7cdb4829d ("video: hyperv: hyperv_fb: Obtain screen resolution from Hyper-V host")
+Signed-off-by: Michael Kelley <mikelley@microsoft.com>
+Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
+Acked-by: Helge Deller <deller@gmx.de>
+Link: https://lore.kernel.org/r/1642360711-2335-1-git-send-email-mikelley@microsoft.com
+Signed-off-by: Wei Liu <wei.liu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/video/fbdev/hyperv_fb.c | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
+index 4dc9077dd2ac0..3c309ab208874 100644
+--- a/drivers/video/fbdev/hyperv_fb.c
++++ b/drivers/video/fbdev/hyperv_fb.c
+@@ -286,8 +286,6 @@ struct hvfb_par {
+ static uint screen_width = HVFB_WIDTH;
+ static uint screen_height = HVFB_HEIGHT;
+-static uint screen_width_max = HVFB_WIDTH;
+-static uint screen_height_max = HVFB_HEIGHT;
+ static uint screen_depth;
+ static uint screen_fb_size;
+ static uint dio_fb_size; /* FB size for deferred IO */
+@@ -581,7 +579,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev)
+       int ret = 0;
+       unsigned long t;
+       u8 index;
+-      int i;
+       memset(msg, 0, sizeof(struct synthvid_msg));
+       msg->vid_hdr.type = SYNTHVID_RESOLUTION_REQUEST;
+@@ -612,13 +609,6 @@ static int synthvid_get_supported_resolution(struct hv_device *hdev)
+               goto out;
+       }
+-      for (i = 0; i < msg->resolution_resp.resolution_count; i++) {
+-              screen_width_max = max_t(unsigned int, screen_width_max,
+-                  msg->resolution_resp.supported_resolution[i].width);
+-              screen_height_max = max_t(unsigned int, screen_height_max,
+-                  msg->resolution_resp.supported_resolution[i].height);
+-      }
+-
+       screen_width =
+               msg->resolution_resp.supported_resolution[index].width;
+       screen_height =
+@@ -940,7 +930,7 @@ static void hvfb_get_option(struct fb_info *info)
+       if (x < HVFB_WIDTH_MIN || y < HVFB_HEIGHT_MIN ||
+           (synthvid_ver_ge(par->synthvid_version, SYNTHVID_VERSION_WIN10) &&
+-          (x > screen_width_max || y > screen_height_max)) ||
++          (x * y * screen_depth / 8 > screen_fb_size)) ||
+           (par->synthvid_version == SYNTHVID_VERSION_WIN8 &&
+            x * y * screen_depth / 8 > SYNTHVID_FB_SIZE_WIN8) ||
+           (par->synthvid_version == SYNTHVID_VERSION_WIN7 &&
+@@ -1193,8 +1183,8 @@ static int hvfb_probe(struct hv_device *hdev,
+       }
+       hvfb_get_option(info);
+-      pr_info("Screen resolution: %dx%d, Color depth: %d\n",
+-              screen_width, screen_height, screen_depth);
++      pr_info("Screen resolution: %dx%d, Color depth: %d, Frame buffer size: %d\n",
++              screen_width, screen_height, screen_depth, screen_fb_size);
+       ret = hvfb_getmem(hdev, info);
+       if (ret) {
+-- 
+2.34.1
+
diff --git a/queue-5.10/yam-fix-a-memory-leak-in-yam_siocdevprivate.patch-10148 b/queue-5.10/yam-fix-a-memory-leak-in-yam_siocdevprivate.patch-10148
new file mode 100644 (file)
index 0000000..95c7d72
--- /dev/null
@@ -0,0 +1,37 @@
+From 2e163ecb17ea8ee900cef2bb20cb4c1f1d062d1d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jan 2022 11:29:54 +0800
+Subject: yam: fix a memory leak in yam_siocdevprivate()
+
+From: Hangyu Hua <hbh25y@gmail.com>
+
+[ Upstream commit 29eb31542787e1019208a2e1047bb7c76c069536 ]
+
+ym needs to be free when ym->cmd != SIOCYAMSMCS.
+
+Fixes: 0781168e23a2 ("yam: fix a missing-check bug")
+Signed-off-by: Hangyu Hua <hbh25y@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/hamradio/yam.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c
+index 5ab53e9942f30..5d30b3e1806ab 100644
+--- a/drivers/net/hamradio/yam.c
++++ b/drivers/net/hamradio/yam.c
+@@ -951,9 +951,7 @@ static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+                                sizeof(struct yamdrv_ioctl_mcs));
+               if (IS_ERR(ym))
+                       return PTR_ERR(ym);
+-              if (ym->cmd != SIOCYAMSMCS)
+-                      return -EINVAL;
+-              if (ym->bitrate > YAM_MAXBITRATE) {
++              if (ym->cmd != SIOCYAMSMCS || ym->bitrate > YAM_MAXBITRATE) {
+                       kfree(ym);
+                       return -EINVAL;
+               }
+-- 
+2.34.1
+