6.2.13-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 6.2.13-rc1 review
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.2.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.2.13-rc1
Ekaterina Orlova <[email protected]>
ASN.1: Fix check for strdup() success
Chancel Liu <[email protected]>
ASoC: fsl_sai: Fix pins setting for i.MX8QM platform
Nikita Zhandarovich <[email protected]>
ASoC: fsl_asrc_dma: fix potential null-ptr-deref
Daniel Baluta <[email protected]>
ASoC: SOF: pm: Tear down pipelines only if DSP was active
Tetsuo Handa <[email protected]>
mm/page_alloc: fix potential deadlock on zonelist_update_seq seqlock
Alexis Lothoré <[email protected]>
fpga: bridge: properly initialize bridge device before populating children
Dan Carpenter <[email protected]>
iio: adc: at91-sama5d2_adc: fix an error code in at91_adc_allocate_trigger()
Soumya Negi <[email protected]>
Input: pegasus-notetaker - check pipe type when probing
hrdl <[email protected]>
Input: cyttsp5 - fix sensing configuration data structure
Linus Torvalds <[email protected]>
gcc: disable '-Warray-bounds' for gcc-13 too
Thomas Gleixner <[email protected]>
PCI/MSI: Remove over-zealous hardware size check in pci_msix_validate_entries()
Alyssa Ross <[email protected]>
purgatory: fix disabling debug info
Huacai Chen <[email protected]>
LoongArch: Make WriteCombine configurable for ioremap()
Huacai Chen <[email protected]>
LoongArch: Make -mstrict-align configurable
Jiaxun Yang <[email protected]>
MIPS: Define RUNTIME_DISCARD_EXIT in LD script
Dan Carpenter <[email protected]>
KVM: arm64: Fix buffer overflow in kvm_arm_set_fw_reg()
Marc Zyngier <[email protected]>
KVM: arm64: Make vcpu flag updates non-preemptible
Paulo Alcantara <[email protected]>
cifs: avoid dup prefix path in dfs_get_automount_devname()
Liam R. Howlett <[email protected]>
mm/mmap: regression fix for unmapped_area{_topdown}Mel Gorman <[email protected]>
mm: page_alloc: skip regions with hugetlbfs pages when allocating 1G pages
Alexander Potapenko <[email protected]>
mm: kmsan: handle alloc failures in kmsan_vmap_pages_range_noflush()
Alexander Potapenko <[email protected]>
mm: kmsan: handle alloc failures in kmsan_ioremap_page_range()
Naoya Horiguchi <[email protected]>
mm/huge_memory.c: warn with pr_warn_ratelimited instead of VM_WARN_ON_ONCE_FOLIO
Peter Xu <[email protected]>
mm/khugepaged: check again on anon uffd-wp during isolation
David Hildenbrand <[email protected]>
mm/userfaultfd: fix uffd-wp handling for THP migration entries
Mathieu Desnoyers <[email protected]>
mm: fix memory leak on mm_init error handling
Sascha Hauer <[email protected]>
drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume
Sascha Hauer <[email protected]>
drm/rockchip: vop2: fix suspend/resume
Dmytro Laktyushkin <[email protected]>
drm/amd/display: set dcn315 lb bpp to 48
Alan Liu <[email protected]>
drm/amdgpu: Fix desktop freezed after gpu-reset
Ville Syrjälä <[email protected]>
drm/i915: Fix fast wake AUX sync len
Bhavya Kapoor <[email protected]>
mmc: sdhci_am654: Set HIGH_SPEED_ENA for SDR12 and SDR25
Baokun Li <[email protected]>
writeback, cgroup: fix null-ptr-deref write in bdi_split_work_to_wbs
Ondrej Mosnacek <[email protected]>
kernel/sys.c: fix and improve control flow in __sys_setres[ug]id()
Greg Kroah-Hartman <[email protected]>
memstick: fix memory leak if card device is never registered
Steve Chou <[email protected]>
tools/mm/page_owner_sort.c: fix TGID output when cull=tg is used
Paolo Abeni <[email protected]>
mptcp: fix accept vs worker race
Paolo Abeni <[email protected]>
mptcp: stops worker on unaccepted sockets at listener close
Ryusuke Konishi <[email protected]>
nilfs2: initialize unused bytes in segment summary blocks
Peter Ujfalusi <[email protected]>
ASoC: SOF: ipc4-topology: Clarify bind failure caused by missing fw_module
Peng Zhang <[email protected]>
maple_tree: fix a potential memory leak, OOB access, or other unpredictable bug
Liam R. Howlett <[email protected]>
maple_tree: fix mas_empty_area() search
Liam R. Howlett <[email protected]>
maple_tree: make maple state reusable after mas_empty_area_rev()
Toke Høiland-Jørgensen <[email protected]>
wifi: ath9k: Don't mark channelmap stack variable read-only in ath9k_mci_update_wlan_channels()
Huacai Chen <[email protected]>
LoongArch: Mark 3 symbol exports as non-GPL
Huacai Chen <[email protected]>
LoongArch: Fix probing of the CRC32 feature
Tiezhu Yang <[email protected]>
LoongArch: Check unwind_error() in arch_stack_walk()
Huacai Chen <[email protected]>
LoongArch: module: set section addresses to 0x0
David Gow <[email protected]>
rust: kernel: Mark rust_fmt_argument as extern "C"
Boris Burkov <[email protected]>
btrfs: reinterpret async discard iops_limit=0 as no delay
Boris Burkov <[email protected]>
btrfs: set default discard iops_limit to 1000
Andy Chi <[email protected]>
ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook
Brian Masney <[email protected]>
iio: light: tsl2772: fix reading proximity-diodes from device tree
Liang He <[email protected]>
iio: dac: ad5755: Add missing fwnode_handle_put()
Linus Torvalds <[email protected]>
Revert "ACPICA: Events: Support fixed PCIe wake event"
Peter Xu <[email protected]>
Revert "userfaultfd: don't fail on unrecognized features"
Uwe Kleine-König <[email protected]>
pwm: Zero-initialize the pwm_state passed to driver's .get_state()
Greg Kroah-Hartman <[email protected]>
mtd: spi-nor: fix memory leak when using debugfs_lookup()
weiliang1503 <[email protected]>
platform/x86: asus-nb-wmi: Add quirk_asus_tablet_mode to other ROG Flow X13 models
Hans de Goede <[email protected]>
platform/x86: gigabyte-wmi: add support for X570S AORUS ELITE
Juergen Gross <[email protected]>
xen/netback: use same error messages for same errors
Sagi Grimberg <[email protected]>
nvme-tcp: fix a possible UAF when failing to allocate an io queue
David Gow <[email protected]>
drm: test: Fix 32-bit issue in drm_buddy_test
David Gow <[email protected]>
drm: buddy_allocator: Fix buddy allocator init on 32-bit systems
Heiko Carstens <[email protected]>
s390/ptrace: fix PTRACE_GET_LAST_BREAK error handling
Thomas Weißschuh <[email protected]>
platform/x86: gigabyte-wmi: add support for B650 AORUS ELITE AX
Álvaro Fernández Rojas <[email protected]>
net: dsa: b53: mmap: add phy ops
Damien Le Moal <[email protected]>
scsi: core: Improve scsi_vpd_inquiry() checks
Tomas Henzl <[email protected]>
scsi: megaraid_sas: Fix fw_crash_buffer_show()
Nick Desaulniers <[email protected]>
selftests: sigaltstack: fix -Wuninitialized
Frank Crawford <[email protected]>
platform/x86 (gigabyte-wmi): Add support for A320M-S2H V2
Dongliang Mu <[email protected]>
platform/x86/intel: vsec: Fix a memory leak in intel_vsec_add_aux
Douglas Raillard <[email protected]>
f2fs: Fix f2fs_truncate_partial_nodes ftrace event
Vladimir Oltean <[email protected]>
net: bridge: switchdev: don't notify FDB entries with "master dynamic"
Sebastian Basierski <[email protected]>
e1000e: Disable TSO on i219-LM card to increase speed
Vadim Fedorenko <[email protected]>
bnxt_en: fix free-runnig PHC mode
Christophe JAILLET <[email protected]>
net: dsa: microchip: ksz8795: Correctly handle huge frame configuration
Daniel Borkmann <[email protected]>
bpf: Fix incorrect verifier pruning due to missing register precision taints
Li Lanzhe <[email protected]>
spi: spi-rockchip: Fix missing unwind goto in rockchip_sfc_probe()
Ido Schimmel <[email protected]>
mlxsw: pci: Fix possible crash during initialization
Alexander Aring <[email protected]>
net: rpl: fix rpl header size calculation
Ido Schimmel <[email protected]>
bonding: Fix memory leak when changing bond type to Ethernet
Huacai Chen <[email protected]>
LoongArch: Fix build error if CONFIG_SUSPEND is not set
Nikita Zhandarovich <[email protected]>
mlxfw: fix null-ptr-deref in mlxfw_mfa2_tlv_next()
Michael Chan <[email protected]>
bnxt_en: Do not initialize PTP on older P3/P4 chips
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: tighten netlink attribute requirements for catch-all elements
Duoming Zhou <[email protected]>
cxgb4: fix use after free bugs caused by circular dependency problem
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: validate catch-all set elements
Aleksandr Loktionov <[email protected]>
i40e: fix i40e_setup_misc_vector() error handling
Aleksandr Loktionov <[email protected]>
i40e: fix accessing vsi->active_filters without holding lock
Florian Westphal <[email protected]>
netfilter: nf_tables: fix ifdef to also consider nf_tables=m
Ding Hui <[email protected]>
sfc: Fix use-after-free due to selftest_work
Xuan Zhuo <[email protected]>
virtio_net: bugfix overflow inside xdp_linearize_page()
Gwangun Jung <[email protected]>
net: sched: sch_qfq: prevent slab-out-of-bounds in qfq_activate_agg
Cristian Ciocaltea <[email protected]>
regulator: fan53555: Fix wrong TCS_SLEW_MASK
Cristian Ciocaltea <[email protected]>
regulator: fan53555: Explicitly include bits header
Patrick Blass <[email protected]>
rust: str: fix requierments->requirements typo
Chen Aotian <[email protected]>
netfilter: nf_tables: Modify nla_memdup's flag to GFP_KERNEL_ACCOUNT
Florian Westphal <[email protected]>
netfilter: br_netfilter: fix recent physdev match breakage
Peng Fan <[email protected]>
arm64: dts: imx8mp-verdin: correct off-on-delay
Peng Fan <[email protected]>
arm64: dts: imx8mm-verdin: correct off-on-delay
Peng Fan <[email protected]>
arm64: dts: imx8mm-evk: correct pmic clock source
Johan Hovold <[email protected]>
arm64: dts: qcom: sc8280xp-pmics: fix pon compatible and registers
Marc Gonzalez <[email protected]>
perf/amlogic: adjust register offsets
Marc Gonzalez <[email protected]>
arm64: dts: meson-g12-common: resolve conflict between canvas & pmu
Marc Gonzalez <[email protected]>
arm64: dts: meson-g12-common: specify full DMC range
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: ipq8074-hk10: enable QMP device, not the PHY node
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: ipq8074-hk01: enable QMP device, not the PHY node
Dan Johansen <[email protected]>
arm64: dts: rockchip: Lower sd speed on rk3566-soquartz
Jianqun Xu <[email protected]>
ARM: dts: rockchip: fix a typo error for rk3288 spdif node
-------------
Diffstat:
Documentation/admin-guide/kernel-parameters.rst | 1 + Documentation/admin-guide/kernel-parameters.txt | 6 ++ Makefile | 4 +- arch/arm/boot/dts/rk3288.dtsi | 2 +- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 15 ++-- arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi | 2 +- arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi | 4 +- .../boot/dts/freescale/imx8mp-verdin-dev.dtsi | 2 +- arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi | 4 +- arch/arm64/boot/dts/qcom/ipq8074-hk01.dts | 4 +- arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi | 4 +- arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi | 5 +- arch/arm64/boot/dts/rockchip/rk3566-soquartz.dtsi | 2 +- arch/arm64/include/asm/kvm_host.h | 19 ++++- arch/arm64/kvm/hypercalls.c | 2 + arch/loongarch/Kconfig | 35 ++++++++++ arch/loongarch/Makefile | 5 ++ arch/loongarch/include/asm/acpi.h | 3 + arch/loongarch/include/asm/cpu-features.h | 1 + arch/loongarch/include/asm/cpu.h | 40 ++++++----- arch/loongarch/include/asm/io.h | 4 +- arch/loongarch/include/asm/loongarch.h | 2 +- arch/loongarch/include/asm/module.lds.h | 8 +-- arch/loongarch/kernel/Makefile | 4 +- arch/loongarch/kernel/cpu-probe.c | 9 ++- arch/loongarch/kernel/proc.c | 1 + arch/loongarch/kernel/setup.c | 21 ++++++ arch/loongarch/kernel/stacktrace.c | 2 +- arch/loongarch/kernel/traps.c | 9 ++- arch/loongarch/kernel/unwind.c | 1 + arch/loongarch/kernel/unwind_prologue.c | 4 +- arch/loongarch/mm/init.c | 4 +- arch/mips/kernel/vmlinux.lds.S | 2 + arch/riscv/purgatory/Makefile | 4 +- arch/s390/kernel/ptrace.c | 8 +-- arch/x86/purgatory/Makefile | 3 +- drivers/acpi/acpica/evevent.c | 11 --- drivers/acpi/acpica/hwsleep.c | 14 ---- drivers/acpi/acpica/utglobal.c | 4 -- drivers/fpga/fpga-bridge.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 3 + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 17 ++++- .../gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 2 +- drivers/gpu/drm/drm_buddy.c | 4 +- drivers/gpu/drm/i915/display/intel_dp_aux.c | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 4 ++ drivers/gpu/drm/tests/drm_buddy_test.c | 3 +- drivers/iio/adc/at91-sama5d2_adc.c | 2 +- drivers/iio/dac/ad5755.c | 1 + drivers/iio/light/tsl2772.c | 1 + drivers/input/tablet/pegasus_notetaker.c | 6 ++ drivers/input/touchscreen/cyttsp5.c | 1 + drivers/memstick/core/memstick.c | 5 +- drivers/mmc/host/sdhci_am654.c | 2 - drivers/mtd/spi-nor/core.c | 14 +++- drivers/mtd/spi-nor/core.h | 2 + drivers/mtd/spi-nor/debugfs.c | 11 ++- drivers/net/bonding/bond_main.c | 7 +- drivers/net/dsa/b53/b53_mmap.c | 14 ++++ drivers/net/dsa/microchip/ksz8795.c | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 4 +- .../net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | 2 +- drivers/net/ethernet/intel/e1000e/netdev.c | 51 +++++++------- drivers/net/ethernet/intel/i40e/i40e_main.c | 9 ++- .../ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv_multi.c | 2 + drivers/net/ethernet/mellanox/mlxsw/pci_hw.h | 2 +- drivers/net/ethernet/sfc/efx.c | 1 - drivers/net/ethernet/sfc/efx_common.c | 2 + drivers/net/virtio_net.c | 8 ++- drivers/net/wireless/ath/ath9k/mci.c | 4 +- drivers/net/xen-netback/netback.c | 6 +- drivers/nvme/host/tcp.c | 46 +++++++------ drivers/pci/msi/msi.c | 9 +-- drivers/perf/amlogic/meson_g12_ddr_pmu.c | 34 ++++----- drivers/platform/x86/asus-nb-wmi.c | 3 +- drivers/platform/x86/gigabyte-wmi.c | 3 + drivers/platform/x86/intel/vsec.c | 1 + drivers/pwm/core.c | 12 +++- drivers/regulator/fan53555.c | 13 ++-- drivers/scsi/megaraid/megaraid_sas_base.c | 2 +- drivers/scsi/scsi.c | 11 ++- drivers/spi/spi-rockchip-sfc.c | 2 +- fs/btrfs/discard.c | 21 +++--- fs/cifs/cifs_dfs_ref.c | 2 - fs/cifs/dfs.h | 22 ++++-- fs/fs-writeback.c | 17 +++-- fs/nilfs2/segment.c | 20 ++++++ fs/userfaultfd.c | 6 +- include/acpi/actypes.h | 3 +- include/linux/kmsan.h | 39 ++++++----- include/linux/skbuff.h | 5 +- include/net/netfilter/nf_tables.h | 4 ++ include/trace/events/f2fs.h | 2 +- init/Kconfig | 10 +-- kernel/bpf/verifier.c | 15 ++++ kernel/fork.c | 1 + kernel/sys.c | 69 +++++++++++-------- lib/maple_tree.c | 66 +++++++++--------- mm/backing-dev.c | 12 +++- mm/huge_memory.c | 19 +++-- mm/khugepaged.c | 4 ++ mm/kmsan/hooks.c | 55 ++++++++++++--- mm/kmsan/shadow.c | 27 +++++--- mm/mmap.c | 48 +++++++++++-- mm/page_alloc.c | 19 +++++ mm/vmalloc.c | 10 ++- net/bridge/br_netfilter_hooks.c | 17 +++-- net/bridge/br_switchdev.c | 11 +++ net/ipv6/rpl.c | 3 +- net/mptcp/protocol.c | 74 +++++++++++++------- net/mptcp/protocol.h | 2 + net/mptcp/subflow.c | 80 +++++++++++++++++++++- net/netfilter/nf_tables_api.c | 69 ++++++++++++++++--- net/netfilter/nft_lookup.c | 36 ++-------- net/sched/sch_qfq.c | 13 ++-- rust/kernel/print.rs | 6 +- rust/kernel/str.rs | 2 +- scripts/asn1_compiler.c | 2 +- sound/pci/hda/patch_realtek.c | 1 + sound/soc/fsl/fsl_asrc_dma.c | 11 ++- sound/soc/fsl/fsl_sai.c | 2 +- sound/soc/sof/ipc4-topology.c | 10 +-- sound/soc/sof/pm.c | 8 ++- .../selftests/sigaltstack/current_stack_pointer.h | 23 +++++++ tools/testing/selftests/sigaltstack/sas.c | 7 +- tools/vm/page_owner_sort.c | 2 +- 126 files changed, 1017 insertions(+), 466 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/110 ARM: dts: rockchip: fix a typo error for rk3288 spdif node
From: Jianqun Xu <[email protected]>
[ Upstream commit 02c84f91adb9a64b75ec97d772675c02a3e65ed7 ]
Fix the address in the spdif node name.
--- arch/arm/boot/dts/rk3288.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/rk3288.dtsi +1 -1
@@ -942,7 +942,7 @@ status = "disabled"; }; - spdif: sound@ff88b0000 { + spdif: sound@ff8b0000 { compatible = "rockchip,rk3288-spdif", "rockchip,rk3066-spdif"; reg = <0x0 0xff8b0000 0x0 0x10000>; #sound-dai-cells = <0>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 2/110 arm64: dts: rockchip: Lower sd speed on rk3566-soquartz
In reply to Greg Kroah-HartmanFrom: Dan Johansen <[email protected]>
[ Upstream commit 5912b647bd0732ae8c78a6e5b259c82efd177d93 ]
Just like the Quartz64 Model B the previously stated speed of sdr-104 in soquartz is too high for the hardware to reliably communicate with some fast SD cards.
Especially on some carrierboards.
Lower this to sd-uhs-sdr50 to fix this.
--- arch/arm64/boot/dts/rockchip/rk3566-soquartz.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/rockchip/rk3566-soquartz.dtsi +1 -1
@@ -598,7 +598,7 @@ non-removable; pinctrl-names = "default"; pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_cmd &sdmmc1_clk>; - sd-uhs-sdr104; + sd-uhs-sdr50; vmmc-supply = <&vcc3v3_sys>; vqmmc-supply = <&vcc_1v8>; status = "okay";
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 3/110 arm64: dts: qcom: ipq8074-hk01: enable QMP device, not the PHY node
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 72630ba422b70ea0874fc90d526353cf71c72488 ]
Correct PCIe PHY enablement to refer the QMP device nodes rather than PHY device nodes. QMP nodes have 'status = "disabled"' property in the ipq8074.dtsi, while PHY nodes do not correspond to the actual device and do not have the status property.
--- arch/arm64/boot/dts/qcom/ipq8074-hk01.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/ipq8074-hk01.dts +2 -2
@@ -62,11 +62,11 @@ perst-gpios = <&tlmm 58 GPIO_ACTIVE_LOW>; }; -&pcie_phy0 { +&pcie_qmp0 { status = "okay"; }; -&pcie_phy1 { +&pcie_qmp1 { status = "okay"; };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 4/110 arm64: dts: qcom: ipq8074-hk10: enable QMP device, not the PHY node
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 1dc40551f206d20b7e46ea7dd538dcdd928451c6 ]
Correct PCIe PHY enablement to refer the QMP device nodes rather than PHY device nodes. QMP nodes have 'status = "disabled"' property in the ipq8074.dtsi, while PHY nodes do not correspond to the actual device and do not have the status property.
--- arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi +2 -2
@@ -48,11 +48,11 @@ perst-gpios = <&tlmm 61 GPIO_ACTIVE_LOW>; }; -&pcie_phy0 { +&pcie_qmp0 { status = "okay"; }; -&pcie_phy1 { +&pcie_qmp1 { status = "okay"; };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 5/110 arm64: dts: meson-g12-common: specify full DMC range
In reply to Greg Kroah-HartmanFrom: Marc Gonzalez <[email protected]>
[ Upstream commit aec4353114a408b3a831a22ba34942d05943e462 ]
According to S905X2 Datasheet - Revision 07:
DRAM Memory Controller (DMC) register area spans ff638000-ff63a000.
According to DeviceTree Specification - Release v0.4-rc1:
simple-bus nodes do not require reg property.
--- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +1 -2
@@ -1571,10 +1571,9 @@ dmc: bus@38000 { compatible = "simple-bus"; - reg = <0x0 0x38000 0x0 0x400>; #address-cells = <2>; #size-cells = <2>; - ranges = <0x0 0x0 0x0 0x38000 0x0 0x400>; + ranges = <0x0 0x0 0x0 0x38000 0x0 0x2000>; canvas: video-lut@48 { compatible = "amlogic,canvas";
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 6/110 arm64: dts: meson-g12-common: resolve conflict between canvas & pmu
In reply to Greg Kroah-HartmanFrom: Marc Gonzalez <[email protected]>
[ Upstream commit 33acea2049b5058b93d1dabb536b494f543f02a2 ]
According to S905X2 Datasheet - Revision 07:
DMC_MON area spans 0xff638080-0xff6380c0DDR_PLL area spans 0xff638c00-0xff638c34
Round DDR_PLL area size up to 0x40
--- arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +6 -6
@@ -1579,6 +1579,12 @@ compatible = "amlogic,canvas"; reg = <0x0 0x48 0x0 0x14>; }; + + pmu: pmu@80 { + reg = <0x0 0x80 0x0 0x40>, + <0x0 0xc00 0x0 0x40>; + interrupts = <GIC_SPI 52 IRQ_TYPE_EDGE_RISING>; + }; }; usb2_phy1: phy@3a000 {
@@ -1704,12 +1710,6 @@ }; }; - pmu: pmu@ff638000 { - reg = <0x0 0xff638000 0x0 0x100>, - <0x0 0xff638c00 0x0 0x100>; - interrupts = <GIC_SPI 52 IRQ_TYPE_EDGE_RISING>; - }; - aobus: bus@ff800000 { compatible = "simple-bus"; reg = <0x0 0xff800000 0x0 0x100000>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 7/110 perf/amlogic: adjust register offsets
In reply to Greg Kroah-HartmanFrom: Marc Gonzalez <[email protected]>
[ Upstream commit f9d323e7c1724270d747657051099826744e91e7 ]
Commit "perf/amlogic: resolve conflict between canvas & pmu" changed the base address.
--- drivers/perf/amlogic/meson_g12_ddr_pmu.c | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-)
drivers/perf/amlogic/meson_g12_ddr_pmu.c +17 -17
@@ -21,23 +21,23 @@#define DMC_QOS_IRQ BIT(30)/* DMC bandwidth monitor register address offset */ -#define DMC_MON_G12_CTRL0 (0x20 << 2) -#define DMC_MON_G12_CTRL1 (0x21 << 2) -#define DMC_MON_G12_CTRL2 (0x22 << 2) -#define DMC_MON_G12_CTRL3 (0x23 << 2) -#define DMC_MON_G12_CTRL4 (0x24 << 2) -#define DMC_MON_G12_CTRL5 (0x25 << 2) -#define DMC_MON_G12_CTRL6 (0x26 << 2) -#define DMC_MON_G12_CTRL7 (0x27 << 2) -#define DMC_MON_G12_CTRL8 (0x28 << 2) - -#define DMC_MON_G12_ALL_REQ_CNT (0x29 << 2) -#define DMC_MON_G12_ALL_GRANT_CNT (0x2a << 2) -#define DMC_MON_G12_ONE_GRANT_CNT (0x2b << 2) -#define DMC_MON_G12_SEC_GRANT_CNT (0x2c << 2) -#define DMC_MON_G12_THD_GRANT_CNT (0x2d << 2) -#define DMC_MON_G12_FOR_GRANT_CNT (0x2e << 2) -#define DMC_MON_G12_TIMER (0x2f << 2) +#define DMC_MON_G12_CTRL0 (0x0 << 2) +#define DMC_MON_G12_CTRL1 (0x1 << 2) +#define DMC_MON_G12_CTRL2 (0x2 << 2) +#define DMC_MON_G12_CTRL3 (0x3 << 2) +#define DMC_MON_G12_CTRL4 (0x4 << 2) +#define DMC_MON_G12_CTRL5 (0x5 << 2) +#define DMC_MON_G12_CTRL6 (0x6 << 2) +#define DMC_MON_G12_CTRL7 (0x7 << 2) +#define DMC_MON_G12_CTRL8 (0x8 << 2) + +#define DMC_MON_G12_ALL_REQ_CNT (0x9 << 2) +#define DMC_MON_G12_ALL_GRANT_CNT (0xa << 2) +#define DMC_MON_G12_ONE_GRANT_CNT (0xb << 2) +#define DMC_MON_G12_SEC_GRANT_CNT (0xc << 2) +#define DMC_MON_G12_THD_GRANT_CNT (0xd << 2) +#define DMC_MON_G12_FOR_GRANT_CNT (0xe << 2) +#define DMC_MON_G12_TIMER (0xf << 2)/* Each bit represent a axi line */ PMU_FORMAT_ATTR (event,"config:0-7" );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 8/110 arm64: dts: qcom: sc8280xp-pmics: fix pon compatible and registers
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit ad8cd35c58ca3ec5e93f52a0124899627b98efb2 ]
The pmk8280 PMIC PON peripheral is gen3 and uses two sets of registers; hlos and pbs.
This specifically fixes the following error message during boot when the pbs registers are not defined:
PON_PBS address missing, can't read HW debounce time
Note that this also enables the spurious interrupt workaround introduced by commit 0b65118e6ba3 ("Input: pm8941-pwrkey - add software key press debouncing support") (which may or may not be needed).
--- arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi +3 -2
@@ -59,8 +59,9 @@ #size-cells = <0>; pmk8280_pon: pon@1300 { - compatible = "qcom,pm8998-pon"; - reg = <0x1300>; + compatible = "qcom,pmk8350-pon"; + reg = <0x1300>, <0x800>; + reg-names = "hlos", "pbs"; pmk8280_pon_pwrkey: pwrkey { compatible = "qcom,pmk8350-pwrkey";
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 9/110 arm64: dts: imx8mm-evk: correct pmic clock source
In reply to Greg Kroah-HartmanFrom: Peng Fan <[email protected]>
[ Upstream commit 85af7ffd24da38e416a14bd6bf207154d94faa83 ]
The osc_32k supports #clock-cells as 0, using an id is wrong, drop it.
--- arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi +1 -1
@@ -194,7 +194,7 @@ rohm,reset-snvs-powered; #clock-cells = <0>; - clocks = <&osc_32k 0>; + clocks = <&osc_32k>; clock-output-names = "clk-32k-out"; regulators {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 10/110 arm64: dts: imx8mm-verdin: correct off-on-delay
In reply to Greg Kroah-HartmanFrom: Peng Fan <[email protected]>
[ Upstream commit 130c1f4306d56301216baaea68afdd909892c73f ]
The property should be off-on-delay-us, not off-on-delay
--- arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi +2 -2
@@ -95,7 +95,7 @@ compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio2 20 GPIO_ACTIVE_HIGH>; /* PMIC_EN_ETH */ - off-on-delay = <500000>; + off-on-delay-us = <500000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_reg_eth>; regulator-always-on;
@@ -135,7 +135,7 @@ enable-active-high; /* Verdin SD_1_PWR_EN (SODIMM 76) */ gpio = <&gpio3 5 GPIO_ACTIVE_HIGH>; - off-on-delay = <100000>; + off-on-delay-us = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usdhc2_pwr_en>; regulator-max-microvolt = <3300000>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 11/110 arm64: dts: imx8mp-verdin: correct off-on-delay
In reply to Greg Kroah-HartmanFrom: Peng Fan <[email protected]>
[ Upstream commit 02c447a0d79f0c966563e5095a017cbf9477ca6d ]
The property should be off-on-delay-us, not off-on-delay
--- arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi | 2 +- arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi +1 -1
@@ -12,7 +12,7 @@ compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio_expander_21 4 GPIO_ACTIVE_HIGH>; /* ETH_PWR_EN */ - off-on-delay = <500000>; + off-on-delay-us = <500000>; regulator-max-microvolt = <3300000>; regulator-min-microvolt = <3300000>; regulator-name = "+V3.3_ETH";
arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi +2 -2
@@ -87,7 +87,7 @@ compatible = "regulator-fixed"; enable-active-high; gpio = <&gpio2 20 GPIO_ACTIVE_HIGH>; /* PMIC_EN_ETH */ - off-on-delay = <500000>; + off-on-delay-us = <500000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_reg_eth>; regulator-always-on;
@@ -128,7 +128,7 @@ enable-active-high; /* Verdin SD_1_PWR_EN (SODIMM 76) */ gpio = <&gpio4 22 GPIO_ACTIVE_HIGH>; - off-on-delay = <100000>; + off-on-delay-us = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usdhc2_pwr_en>; regulator-max-microvolt = <3300000>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 12/110 netfilter: br_netfilter: fix recent physdev match breakage
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 94623f579ce338b5fa61b5acaa5beb8aa657fb9e ]
Recent attempt to ensure PREROUTING hook is executed again when a decrypted ipsec packet received on a bridge passes through the network stack a second time broke the physdev match in INPUT hook.
We can't discard the nf_bridge info strct from sabotage_in hook, as this is needed by the physdev match.
Keep the struct around and handle this with another conditional instead.
--- include/linux/skbuff.h | 1 + net/bridge/br_netfilter_hooks.c | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-)
include/linux/skbuff.h +1 -0
@@ -291,6 +291,7 @@ struct nf_bridge_info { u8 pkt_otherhost:1; u8 in_prerouting:1; u8 bridged_dnat:1; + u8 sabotage_in_done:1;__u16 frag_max_size;struct net_device *physindev;
net/bridge/br_netfilter_hooks.c +11 -6
@@ -868,12 +868,17 @@ static unsigned int ip_sabotage_in(void *priv, {struct nf_bridge_info *nf_bridge =nf_bridge_info_get (skb); -if (nf_bridge && !nf_bridge->in_prerouting && - !netif_is_l3_master (skb->dev) && - !netif_is_l3_slave (skb->dev)) { -nf_bridge_info_free (skb); - state->okfn (state->net, state->sk, skb); -return NF_STOLEN ; +if (nf_bridge) { +if (nf_bridge->sabotage_in_done) +return NF_ACCEPT ; + +if (!nf_bridge->in_prerouting && + !netif_is_l3_master (skb->dev) && + !netif_is_l3_slave (skb->dev)) { + nf_bridge->sabotage_in_done =1 ; + state->okfn (state->net, state->sk, skb); +return NF_STOLEN ; + } }return NF_ACCEPT ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 13/110 netfilter: nf_tables: Modify nla_memdups flag to GFP_KERNEL_ACCOUNT
In reply to Greg Kroah-HartmanFrom: Chen Aotian <[email protected]>
[ Upstream commit af0acf22aea359e04412237d68787401f96bb583 ]
For memory alloc that store user data from nla[NFTA_OBJ_USERDATA], use GFP_KERNEL_ACCOUNT is more suitable.
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -7028,7 +7028,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info, }if (nla[NFTA_OBJ_USERDATA ]) { - obj->udata =nla_memdup (nla[NFTA_OBJ_USERDATA ],GFP_KERNEL ); + obj->udata =nla_memdup (nla[NFTA_OBJ_USERDATA ],GFP_KERNEL_ACCOUNT );if (obj->udata ==NULL ) goto err_userdata;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 14/110 rust: str: fix requierments->requirements typo
In reply to Greg Kroah-HartmanFrom: Patrick Blass <[email protected]>
[ Upstream commit 88e8c2ec4ab84f9f05ed5af9693a3972baf386c4 ]
Fix a trivial spelling error in the rust/kernel/str.rs file.
--- rust/kernel/str.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
rust/kernel/str.rs +1 -1
@@ -408,7 +408,7 @@ impl RawFormatter {/// If `pos` is less than `end`, then the region between `pos` (inclusive) and `end` /// (exclusive) must be valid for writes for the lifetime of the returned [`RawFormatter`]. pub (crate )unsafe fn from_ptrs (pos: *mut u8 , end: *mut u8 ) ->Self { -// INVARIANT: The safety requierments guarantee the type invariants. +// INVARIANT: The safety requirements guarantee the type invariants. Self { beg: posas _ , pos: posas _ ,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 15/110 regulator: fan53555: Explicitly include bits header
In reply to Greg Kroah-HartmanFrom: Cristian Ciocaltea <[email protected]>
[ Upstream commit 4fb9a5060f73627303bc531ceaab1b19d0a24aef ]
Since commit f2a9eb975ab2 ("regulator: fan53555: Add support for FAN53526") the driver makes use of the BIT() macro, but relies on the bits header being implicitly included.
Explicitly pull the header in to avoid potential build failures in some configurations.
While here, reorder include directives alphabetically.
--- drivers/regulator/fan53555.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/regulator/fan53555.c +6 -5
@@ -8,18 +8,19 @@// Copyright (c) 2012 Marvell Technology Ltd. // Yunfan Zhang <[email protected]> +#include <linux/bits.h> +#include <linux/err.h> +#include <linux/i2c.h> #include <linux/module.h> +#include <linux/of_device.h> #include <linux/param.h> -#include <linux/err.h> #include <linux/platform_device.h> +#include <linux/regmap.h> #include <linux/regulator/driver.h> +#include <linux/regulator/fan53555.h> #include <linux/regulator/machine.h> #include <linux/regulator/of_regulator.h> -#include <linux/of_device.h> -#include <linux/i2c.h> #include <linux/slab.h> -#include <linux/regmap.h> -#include <linux/regulator/fan53555.h> /* Voltage setting */ #define FAN53555_VSEL0 0x00
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 16/110 regulator: fan53555: Fix wrong TCS_SLEW_MASK
In reply to Greg Kroah-HartmanFrom: Cristian Ciocaltea <[email protected]>
[ Upstream commit c5d5b55b3c1a314137a251efc1001dfd435c6242 ]
The support for TCS4525 regulator has been introduced with a wrong ramp-rate mask, which has been defined as a logical expression instead of a bit shift operation.
For clarity, fix it using GENMASK() macro.
--- drivers/regulator/fan53555.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/regulator/fan53555.c +1 -1
@@ -61,7 +61,7 @@#define TCS_VSEL1_MODE (1 << 6)#define TCS_SLEW_SHIFT 3 -#define TCS_SLEW_MASK (0x3 < 3) +#define TCS_SLEW_MASK GENMASK(4, 3)enum fan53555_vendor {FAN53526_VENDOR_FAIRCHILD =0 ,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 17/110 net: sched: sch_qfq: prevent slab-out-of-bounds in qfq_activate_agg
In reply to Greg Kroah-HartmanFrom: Gwangun Jung <[email protected]>
[ Upstream commit 3037933448f60f9acb705997eae62013ecb81e0d ]
If the TCA_QFQ_LMAX value is not offered through nlattr, lmax is determined by the MTU value of the network device. The MTU of the loopback device can be set up to 2^31-1.
As a result, it is possible to have an lmax value that exceeds QFQ_MIN_LMAX.
Due to the invalid lmax value, an index is generated that exceeds the QFQ_MAX_INDEX(=24) value, causing out-of-bounds read/write errors.
The following reports a oob access:
[ 84.582666] BUG: KASAN: slab-out-of-bounds in qfq_activate_agg.constprop.0 (net/sched/sch_qfq.c:1027 net/sched/sch_qfq.c:1060 net/sched/sch_qfq.c:1313) [ 84.583267] Read of size 4 at addr ffff88810f676948 by task ping/301 [ 84.583686] [ 84.583797] CPU: 3 PID: 301 Comm: ping Not tainted 6.3.0-rc5 #1 [ 84.584164] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 [ 84.584644] Call Trace: [ 84.584787] <TASK> [ 84.584906] dump_stack_lvl (lib/dump_stack.c:107 (discriminator 1)) [ 84.585108] print_report (mm/kasan/report.c:320 mm/kasan/report.c:430) [ 84.585570] kasan_report (mm/kasan/report.c:538) [ 84.585988] qfq_activate_agg.constprop.0 (net/sched/sch_qfq.c:1027 net/sched/sch_qfq.c:1060 net/sched/sch_qfq.c:1313) [ 84.586599] qfq_enqueue (net/sched/sch_qfq.c:1255) [ 84.587607] dev_qdisc_enqueue (net/core/dev.c:3776) [ 84.587749] __dev_queue_xmit (./include/net/sch_generic.h:186 net/core/dev.c:3865 net/core/dev.c:4212) [ 84.588763] ip_finish_output2 (./include/net/neighbour.h:546 net/ipv4/ip_output.c:228) [ 84.589460] ip_output (net/ipv4/ip_output.c:430) [ 84.590132] ip_push_pending_frames (./include/net/dst.h:444 net/ipv4/ip_output.c:126 net/ipv4/ip_output.c:1586 net/ipv4/ip_output.c:1606) [ 84.590285] raw_sendmsg (net/ipv4/raw.c:649) [ 84.591960] sock_sendmsg (net/socket.c:724 net/socket.c:747) [ 84.592084] __sys_sendto (net/socket.c:2142) [ 84.593306] __x64_sys_sendto (net/socket.c:2150) [ 84.593779] do_syscall_64 (arch/x86/entry/common.c:50 arch/x86/entry/common.c:80) [ 84.593902] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120) [ 84.594070] RIP: 0033:0x7fe568032066 [ 84.594192] Code: 0e 0d 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 41 89 ca 64 8b 04 25 18 00 00 00 85 c09[ 84.594796] RSP: 002b:00007ffce388b4e8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
Code starting with the faulting instruction
===========================================
[ 84.595047] RAX: ffffffffffffffda RBX: 00007ffce388cc70 RCX: 00007fe568032066 [ 84.595281] RDX: 0000000000000040 RSI: 00005605fdad6d10 RDI: 0000000000000003 [ 84.595515] RBP: 00005605fdad6d10 R08: 00007ffce388eeec R09: 0000000000000010 [ 84.595749] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000040 [ 84.595984] R13: 00007ffce388cc30 R14: 00007ffce388b4f0 R15: 0000001d00000001 [ 84.596218] </TASK> [ 84.596295] [ 84.596351] Allocated by task 291: [ 84.596467] kasan_save_stack (mm/kasan/common.c:46) [ 84.596597] kasan_set_track (mm/kasan/common.c:52) [ 84.596725] __kasan_kmalloc (mm/kasan/common.c:384) [ 84.596852] __kmalloc_node (./include/linux/kasan.h:196 mm/slab_common.c:967 mm/slab_common.c:974) [ 84.596979] qdisc_alloc (./include/linux/slab.h:610 ./include/linux/slab.h:731 net/sched/sch_generic.c:938) [ 84.597100] qdisc_create (net/sched/sch_api.c:1244) [ 84.597222] tc_modify_qdisc (net/sched/sch_api.c:1680) [ 84.597357] rtnetlink_rcv_msg (net/core/rtnetlink.c:6174) [ 84.597495] netlink_rcv_skb (net/netlink/af_netlink.c:2574) [ 84.597627] netlink_unicast (net/netlink/af_netlink.c:1340 net/netlink/af_netlink.c:1365) [ 84.597759] netlink_sendmsg (net/netlink/af_netlink.c:1942) [ 84.597891] sock_sendmsg (net/socket.c:724 net/socket.c:747) [ 84.598016] ____sys_sendmsg (net/socket.c:2501) [ 84.598147] ___sys_sendmsg (net/socket.c:2557) [ 84.598275] __sys_sendmsg (./include/linux/file.h:31 net/socket.c:2586) [ 84.598399] do_syscall_64 (arch/x86/entry/common.c:50 arch/x86/entry/common.c:80) [ 84.598520] entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120) [ 84.598688] [ 84.598744] The buggy address belongs to the object at ffff88810f674000 [ 84.598744] which belongs to the cache kmalloc-8k of size 8192 [ 84.599135] The buggy address is located 2664 bytes to the right of [ 84.599135] allocated 7904-byte region [ffff88810f674000, ffff88810f675ee0) [ 84.599544] [ 84.599598] The buggy address belongs to the physical page: [ 84.599777] page:00000000e638567f refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10f670 [ 84.600074] head:00000000e638567f order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 [ 84.600330] flags: 0x200000000010200(slab|head|node=0|zone=2) [ 84.600517] raw: 0200000000010200 ffff888100043180 dead000000000122 0000000000000000 [ 84.600764] raw: 0000000000000000 0000000080020002 00000001ffffffff 0000000000000000 [ 84.601009] page dumped because: kasan: bad access detected [ 84.601187] [ 84.601241] Memory state around the buggy address: [ 84.601396] ffff88810f676800: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 84.601620] ffff88810f676880: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 84.601845] >ffff88810f676900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 84.602069] ^ [ 84.602243] ffff88810f676980: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 84.602468] ffff88810f676a00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 84.602693] ================================================================== [ 84.602924] Disabling lock debugging due to kernel taint
--- net/sched/sch_qfq.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
net/sched/sch_qfq.c +7 -6
@@ -421,15 +421,16 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, }else weight =1 ; -if (tb[TCA_QFQ_LMAX ]) { +if (tb[TCA_QFQ_LMAX ]) lmax =nla_get_u32 (tb[TCA_QFQ_LMAX ]); -if (lmax <QFQ_MIN_LMAX || lmax > (1UL <<QFQ_MTU_SHIFT )) { -pr_notice ("qfq: invalid max length %u\n" , lmax); -return -EINVAL ; - } - }else +else lmax =psched_mtu (qdisc_dev (sch)); +if (lmax <QFQ_MIN_LMAX || lmax > (1UL <<QFQ_MTU_SHIFT )) { +pr_notice ("qfq: invalid max length %u\n" , lmax); +return -EINVAL ; + } + inv_w =ONE_FP / weight; weight =ONE_FP / inv_w;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 18/110 virtio_net: bugfix overflow inside xdp_linearize_page()
In reply to Greg Kroah-HartmanFrom: Xuan Zhuo <[email protected]>
[ Upstream commit 853618d5886bf94812f31228091cd37d308230f7 ]
Here we copy the data from the original buf to the new page. But we not check that it may be overflow.
As long as the size received(including vnethdr) is greater than 3840 (PAGE_SIZE -VIRTIO_XDP_HEADROOM). Then the memcpy will overflow.
And this is completely possible, as long as the MTU is large, such as 4096. In our test environment, this will cause crash. Since crash is caused by the written memory, it is meaningless, so I do not include it.
--- drivers/net/virtio_net.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +6 -2
@@ -728,8 +728,13 @@ static struct page *xdp_linearize_page(struct receive_queue *rq,int page_off, unsigned int *len) { - struct page *page = alloc_page(GFP_ATOMIC); + int tailroom = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); +struct page *page; +if (page_off + *len + tailroom >PAGE_SIZE ) +return NULL ; + + page =alloc_page (GFP_ATOMIC );if (!page)return NULL ;
@@ -737,7 +742,6 @@ static struct page *xdp_linearize_page(struct receive_queue *rq, page_off += *len;while (--*num_buf) { -int tailroom =SKB_DATA_ALIGN (sizeof (struct skb_shared_info ));unsigned int buflen;void *buf;int off;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 19/110 sfc: Fix use-after-free due to selftest_work
In reply to Greg Kroah-HartmanFrom: Ding Hui <[email protected]>
[ Upstream commit a80bb8e7233b2ad6ff119646b6e33fb3edcec37b ]
There is a use-after-free scenario that is:
When the NIC is down, user set mac address or vlan tag to VF, the xxx_set_vf_mac() or xxx_set_vf_vlan() will invoke efx_net_stop() and efx_net_open(), since netif_running() is false, the port will not start and keep port_enabled false, but selftest_work is scheduled in efx_net_open().
If we remove the device before selftest_work run, the efx_stop_port() will not be called since the NIC is down, and then efx is freed, we will soon get a UAF in run_timer_softirq() like this:
[ 1178.907941] ================================================================== [ 1178.907948] BUG: KASAN: use-after-free in run_timer_softirq+0xdea/0xe90 [ 1178.907950] Write of size 8 at addr ff11001f449cdc80 by task swapper/47/0 [ 1178.907950] [ 1178.907953] CPU: 47 PID: 0 Comm: swapper/47 Kdump: loaded Tainted: G O --------- -t - 4.18.0 #1 [ 1178.907954] Hardware name: SANGFOR X620G40/WI2HG-208T1061A, BIOS SPYH051032-U01 04/01/2022 [ 1178.907955] Call Trace: [ 1178.907956] <IRQ> [ 1178.907960] dump_stack+0x71/0xab [ 1178.907963] print_address_description+0x6b/0x290 [ 1178.907965] ? run_timer_softirq+0xdea/0xe90 [ 1178.907967] kasan_report+0x14a/0x2b0 [ 1178.907968] run_timer_softirq+0xdea/0xe90 [ 1178.907971] ? init_timer_key+0x170/0x170 [ 1178.907973] ? hrtimer_cancel+0x20/0x20 [ 1178.907976] ? sched_clock+0x5/0x10 [ 1178.907978] ? sched_clock_cpu+0x18/0x170 [ 1178.907981] __do_softirq+0x1c8/0x5fa [ 1178.907985] irq_exit+0x213/0x240 [ 1178.907987] smp_apic_timer_interrupt+0xd0/0x330 [ 1178.907989] apic_timer_interrupt+0xf/0x20 [ 1178.907990] </IRQ> [ 1178.907991] RIP: 0010:mwait_idle+0xae/0x370
If the NIC is not actually brought up, there is no need to schedule selftest_work, so let's move invoking efx_selftest_async_start() into efx_start_all(), and it will be canceled by broughting down.
--- drivers/net/ethernet/sfc/efx.c | 1 - drivers/net/ethernet/sfc/efx_common.c | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/sfc/efx.c +0 -1
@@ -541,7 +541,6 @@ int efx_net_open(struct net_device *net_dev)else efx->state =STATE_NET_UP ; -efx_selftest_async_start (efx);return 0 ; }
drivers/net/ethernet/sfc/efx_common.c +2 -0
@@ -544,6 +544,8 @@ void efx_start_all(struct efx_nic *efx)/* Start the hardware monitor if there is one */ efx_start_monitor (efx); +efx_selftest_async_start (efx); +/* Link state detection is normally event-driven; we have * to poll now because we could have missed a change */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 20/110 netfilter: nf_tables: fix ifdef to also consider nf_tables=m
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit c55c0e91c813589dc55bea6bf9a9fbfaa10ae41d ]
nftables can be built as a module, so fix the preprocessor conditional accordingly.
--- include/linux/skbuff.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/skbuff.h +2 -2
@@ -4688,7 +4688,7 @@ static inline void nf_reset_ct(struct sk_buff *skb)static inline void nf_reset_trace (struct sk_buff *skb) { -#if IS_ENABLED (CONFIG_NETFILTER_XT_TARGET_TRACE ) || defined(CONFIG_NF_TABLES ) +#if IS_ENABLED (CONFIG_NETFILTER_XT_TARGET_TRACE ) ||IS_ENABLED (CONFIG_NF_TABLES ) skb->nf_trace =0 ;#endif }
@@ -4708,7 +4708,7 @@ static inline void __nf_copy(struct sk_buff *dst, const struct sk_buff *src, dst->_nfct = src->_nfct;nf_conntrack_get (skb_nfct (src));#endif -#if IS_ENABLED (CONFIG_NETFILTER_XT_TARGET_TRACE ) || defined(CONFIG_NF_TABLES ) +#if IS_ENABLED (CONFIG_NETFILTER_XT_TARGET_TRACE ) ||IS_ENABLED (CONFIG_NF_TABLES )if (copy) dst->nf_trace = src->nf_trace;#endif
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 21/110 i40e: fix accessing vsi->active_filters without holding lock
In reply to Greg Kroah-HartmanFrom: Aleksandr Loktionov <[email protected]>
[ Upstream commit 8485d093b076e59baff424552e8aecfc5bd2d261 ]
Fix accessing vsi->active_filters without holding the mac_filter_hash_lock. Move vsi->active_filters = 0 inside critical section and
move clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state) after the critical section to ensure the new filters from other threads can be added only after filters cleaning in the critical section is finished.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -2
@@ -14125,15 +14125,15 @@ static int i40e_add_vsi(struct i40e_vsi *vsi) vsi->id = ctxt.vsi_number; } - vsi->active_filters =0 ; -clear_bit (__I40E_VSI_OVERFLOW_PROMISC, vsi->state);spin_lock_bh (&vsi->mac_filter_hash_lock); + vsi->active_filters =0 ;/* If macvlan filters already exist, force them to get loaded */ hash_for_each_safe (vsi->mac_filter_hash, bkt, h, f, hlist) { f->state =I40E_FILTER_NEW ; f_count++; }spin_unlock_bh (&vsi->mac_filter_hash_lock); +clear_bit (__I40E_VSI_OVERFLOW_PROMISC, vsi->state);if (f_count) { vsi->flags |=I40E_VSI_FLAG_FILTER_CHANGED ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 22/110 i40e: fix i40e_setup_misc_vector() error handling
In reply to Greg Kroah-HartmanFrom: Aleksandr Loktionov <[email protected]>
[ Upstream commit c86c00c6935505929cc9adb29ddb85e48c71f828 ]
Add error handling of i40e_setup_misc_vector() in i40e_rebuild(). In case interrupt vectors setup fails do not re-open vsi-s and do not bring up vf-s, we have no interrupts to serve a traffic anyway.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +4 -1
@@ -11059,8 +11059,11 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) pf->hw.aq.asq_last_status)); }/* reinit the misc interrupt */ -if (pf->flags &I40E_FLAG_MSIX_ENABLED ) +if (pf->flags &I40E_FLAG_MSIX_ENABLED ) { ret =i40e_setup_misc_vector (pf); +if (ret) + goto end_unlock; + }/* Add a filter to drop all Flow control frames from any VSI from being * transmitted. By doing so we stop a malicious VF from sending out
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 23/110 netfilter: nf_tables: validate catch-all set elements
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit d46fc894147cf98dd6e8210aa99ed46854191840 ]
catch-all set element might jump/goto to chain that uses expressions that require validation.
--- include/net/netfilter/nf_tables.h | 4 ++ net/netfilter/nf_tables_api.c | 64 ++++++++++++++++++++++++++++--- net/netfilter/nft_lookup.c | 36 ++--------------- 3 files changed, 66 insertions(+), 38 deletions(-)
include/net/netfilter/nf_tables.h +4 -0
@@ -1085,6 +1085,10 @@ struct nft_chain { };int nft_chain_validate (const struct nft_ctx *ctx,const struct nft_chain *chain); +int nft_setelem_validate (const struct nft_ctx *ctx,struct nft_set *set, +const struct nft_set_iter *iter, +struct nft_set_elem *elem); +int nft_set_catchall_validate (const struct nft_ctx *ctx,struct nft_set *set);enum nft_chain_types {NFT_CHAIN_T_DEFAULT =0 ,
net/netfilter/nf_tables_api.c +58 -6
76 lines not on this page · raw message
net/netfilter/nft_lookup.c +4 -32
@@ -199,37 +199,6 @@ static int nft_lookup_dump(struct sk_buff *skb,return -1 ; } -static int nft_lookup_validate_setelem (const struct nft_ctx *ctx, -struct nft_set *set, -const struct nft_set_iter *iter, -struct nft_set_elem *elem) -{ -const struct nft_set_ext *ext =nft_set_elem_ext (set, elem->priv); -struct nft_ctx *pctx = (struct nft_ctx *)ctx; -const struct nft_data *data; -int err; - -if (nft_set_ext_exists (ext,NFT_SET_EXT_FLAGS ) && - *nft_set_ext_flags (ext) &NFT_SET_ELEM_INTERVAL_END ) -return 0 ; - - data =nft_set_ext_data (ext); -switch (data->verdict.code) { -case NFT_JUMP : -case NFT_GOTO : - pctx->level++; - err =nft_chain_validate (ctx, data->verdict.chain); -if (err <0 ) -return err; - pctx->level--; -break ; -default : -break ; - } - -return 0 ; -} -static int nft_lookup_validate (const struct nft_ctx *ctx,const struct nft_expr *expr,const struct nft_data **d)
@@ -245,9 +214,12 @@ static int nft_lookup_validate(const struct nft_ctx *ctx, iter.skip =0 ; iter.count =0 ; iter.err =0 ; - iter.fn = nft_lookup_validate_setelem; + iter.fn = nft_setelem_validate; priv->set->ops->walk (ctx, priv->set, &iter); +if (!iter.err) + iter.err =nft_set_catchall_validate (ctx, priv->set); +if (iter.err <0 )return iter.err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 24/110 cxgb4: fix use after free bugs caused by circular dependency problem
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit e50b9b9e8610d47b7c22529443e45a16b1ea3a15 ]
The flower_stats_timer can schedule flower_stats_work and flower_stats_work can also arm the flower_stats_timer. The process is shown below:
----------- timer schedules work ------------ch_flower_stats_cb() //timer handler
schedule_work(&adap->flower_stats_work);
----------- work arms timer ------------ ch_flower_stats_handler() //workqueue callback function
mod_timer(&adap->flower_stats_timer, ...);
When the cxgb4 device is detaching, the timer and workqueue could still be rearmed. The process is shown below:
(cleanup routine) | (timer and workqueue routine)
remove_one() |
free_some_resources() | ch_flower_stats_cb() //timer
cxgb4_cleanup_tc_flower() | schedule_work()
del_timer_sync() |
| ch_flower_stats_handler() //workqueue
| mod_timer()
cancel_work_sync() |
kfree(adapter) //FREE | ch_flower_stats_cb() //timer
| adap->flower_stats_work //USEThis patch changes del_timer_sync() to timer_shutdown_sync(), which could prevent rearming of the timer from the workqueue.
--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c +1 -1
@@ -1135,7 +1135,7 @@ void cxgb4_cleanup_tc_flower(struct adapter *adap)return ;if (adap->flower_stats_timer.function) -del_timer_sync (&adap->flower_stats_timer); +timer_shutdown_sync (&adap->flower_stats_timer);cancel_work_sync (&adap->flower_stats_work);rhashtable_destroy (&adap->flower_tbl); adap->tc_flower_initialized = false;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 25/110 netfilter: nf_tables: tighten netlink attribute requirements for catch-all elements
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit d4eb7e39929a3b1ff30fb751b4859fc2410702a0 ]
If NFT_SET_ELEM_CATCHALL is set on, then userspace provides no set element key. Otherwise, bail out with -EINVAL.
--- net/netfilter/nf_tables_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +2 -1
@@ -6088,7 +6088,8 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,if (err <0 )return err; -if (!nla[NFTA_SET_ELEM_KEY ] && !(flags &NFT_SET_ELEM_CATCHALL )) +if (((flags &NFT_SET_ELEM_CATCHALL ) && nla[NFTA_SET_ELEM_KEY ]) || + (!(flags &NFT_SET_ELEM_CATCHALL ) && !nla[NFTA_SET_ELEM_KEY ]))return -EINVAL ;if (flags !=0 ) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 26/110 bnxt_en: Do not initialize PTP on older P3/P4 chips
In reply to Greg Kroah-HartmanFrom: Michael Chan <[email protected]>
[ Upstream commit e8b51a1a15d5a3cce231e0669f6a161dc5bb9b75 ]
The driver does not support PTP on these older chips and it is assuming that firmware on these older chips will not return the PORT_MAC_PTP_QCFG_RESP_FLAGS_HWRM_ACCESS flag in __bnxt_hwrm_ptp_qcfg(), causing the function to abort quietly.
But newer firmware now sets this flag and so __bnxt_hwrm_ptp_qcfg() will proceed further. Eventually it will fail in bnxt_ptp_init() -> bnxt_map_ptp_regs() because there is no code to support the older chips. The driver will then complain:
"PTP initialization failed.\n"
Fix it so that we abort quietly earlier without going through the unnecessary steps and alarming the user with the warning log.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
@@ -7628,7 +7628,7 @@ static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)u8 flags;int rc; -if (bp->hwrm_spec_code <0x10801 ) { +if (bp->hwrm_spec_code <0x10801 || !BNXT_CHIP_P5_THOR (bp)) { rc = -ENODEV ; goto no_ptp; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 27/110 mlxfw: fix null-ptr-deref in mlxfw_mfa2_tlv_next()
In reply to Greg Kroah-HartmanFrom: Nikita Zhandarovich <[email protected]>
[ Upstream commit c0e73276f0fcbbd3d4736ba975d7dc7a48791b0c ]
Function mlxfw_mfa2_tlv_multi_get() returns NULL if 'tlv' in question does not pass checks in mlxfw_mfa2_tlv_payload_get(). This behaviour may lead to NULL pointer dereference in 'multi->total_len'. Fix this issue by testing mlxfw_mfa2_tlv_multi_get()'s return value against NULL.
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv_multi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/mellanox/mlxfw/mlxfw_mfa2_tlv_multi.c +2 -0
@@ -31,6 +31,8 @@ mlxfw_mfa2_tlv_next(const struct mlxfw_mfa2_file *mfa2_file,if (tlv->type ==MLXFW_MFA2_TLV_MULTI_PART ) { multi =mlxfw_mfa2_tlv_multi_get (mfa2_file, tlv); +if (!multi) +return NULL ; tlv_len =NLA_ALIGN (tlv_len +be16_to_cpu (multi->total_len)); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 28/110 LoongArch: Fix build error if CONFIG_SUSPEND is not set
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
[ Upstream commit 1cf62488f5e465b1cd814d19be238a4b7ad5be38 ]
We can see the following build error on LoongArch if CONFIG_SUSPEND is not set:
ld: drivers/acpi/sleep.o: in function 'acpi_pm_prepare':
sleep.c:(.text+0x2b8): undefined reference to 'loongarch_wakeup_start'
Here is the call trace:
acpi_pm_prepare()
__acpi_pm_prepare()
acpi_sleep_prepare()
acpi_get_wakeup_address()
loongarch_wakeup_start()Root cause: loongarch_wakeup_start() is defined in arch/loongarch/power/ suspend_asm.S which is only built under CONFIG_SUSPEND. In order to fix the build error, just let acpi_get_wakeup_address() return 0 if CONFIG_ SUSPEND is not set.
--- arch/loongarch/include/asm/acpi.h | 3 +++ 1 file changed, 3 insertions(+)
arch/loongarch/include/asm/acpi.h +3 -0
@@ -41,8 +41,11 @@ extern void loongarch_suspend_enter(void);static inline unsigned long acpi_get_wakeup_address (void ) { +#ifdef CONFIG_SUSPEND extern void loongarch_wakeup_start (void );return (unsigned long )loongarch_wakeup_start; +#endif +return 0UL ; }#endif /* _ASM_LOONGARCH_ACPI_H */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 29/110 bonding: Fix memory leak when changing bond type to Ethernet
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit c484fcc058bada604d7e4e5228d4affb646ddbc2 ]
When a net device is put administratively up, its 'IFF_UP' flag is set (if not set already) and a 'NETDEV_UP' notification is emitted, which causes the 8021q driver to add VLAN ID 0 on the device. The reverse happens when a net device is put administratively down.
When changing the type of a bond to Ethernet, its 'IFF_UP' flag is incorrectly cleared, resulting in the kernel skipping the above process and VLAN ID 0 being leaked [1].
Fix by restoring the flag when changing the type to Ethernet, in a similar fashion to the restoration of the 'IFF_SLAVE' flag.
The issue can be reproduced using the script in [2], with example out before and after the fix in [3].
[1]
unreferenced object 0xffff888103479900 (size 256):
comm "ip", pid 329, jiffies 4294775225 (age 28.561s) hex dump (first 32 bytes):
00 a0 0c 15 81 88 ff ff 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff81a6051a>] kmalloc_trace+0x2a/0xe0
[<ffffffff8406426c>] vlan_vid_add+0x30c/0x790
[<ffffffff84068e21>] vlan_device_event+0x1491/0x21a0
[<ffffffff81440c8e>] notifier_call_chain+0xbe/0x1f0
[<ffffffff8372383a>] call_netdevice_notifiers_info+0xba/0x150
[<ffffffff837590f2>] __dev_notify_flags+0x132/0x2e0
[<ffffffff8375ad9f>] dev_change_flags+0x11f/0x180
[<ffffffff8379af36>] do_setlink+0xb96/0x4060
[<ffffffff837adf6a>] __rtnl_newlink+0xc0a/0x18a0
[<ffffffff837aec6c>] rtnl_newlink+0x6c/0xa0
[<ffffffff837ac64e>] rtnetlink_rcv_msg+0x43e/0xe00
[<ffffffff839a99e0>] netlink_rcv_skb+0x170/0x440
[<ffffffff839a738f>] netlink_unicast+0x53f/0x810
[<ffffffff839a7fcb>] netlink_sendmsg+0x96b/0xe90
[<ffffffff8369d12f>] ____sys_sendmsg+0x30f/0xa70
[<ffffffff836a6d7a>] ___sys_sendmsg+0x13a/0x1e0
unreferenced object 0xffff88810f6a83e0 (size 32):
comm "ip", pid 329, jiffies 4294775225 (age 28.561s)
hex dump (first 32 bytes):
a0 99 47 03 81 88 ff ff a0 99 47 03 81 88 ff ff ..G.......G.....
81 00 00 00 01 00 00 00 cc cc cc cc cc cc cc cc ................
backtrace:
[<ffffffff81a6051a>] kmalloc_trace+0x2a/0xe0
[<ffffffff84064369>] vlan_vid_add+0x409/0x790
[<ffffffff84068e21>] vlan_device_event+0x1491/0x21a0
[<ffffffff81440c8e>] notifier_call_chain+0xbe/0x1f0
[<ffffffff8372383a>] call_netdevice_notifiers_info+0xba/0x150
[<ffffffff837590f2>] __dev_notify_flags+0x132/0x2e0
[<ffffffff8375ad9f>] dev_change_flags+0x11f/0x180
[<ffffffff8379af36>] do_setlink+0xb96/0x4060
[<ffffffff837adf6a>] __rtnl_newlink+0xc0a/0x18a0
[<ffffffff837aec6c>] rtnl_newlink+0x6c/0xa0
[<ffffffff837ac64e>] rtnetlink_rcv_msg+0x43e/0xe00
[<ffffffff839a99e0>] netlink_rcv_skb+0x170/0x440
[<ffffffff839a738f>] netlink_unicast+0x53f/0x810
[<ffffffff839a7fcb>] netlink_sendmsg+0x96b/0xe90
[<ffffffff8369d12f>] ____sys_sendmsg+0x30f/0xa70
[<ffffffff836a6d7a>] ___sys_sendmsg+0x13a/0x1e0[2]
ip link add name t-nlmon type nlmon
ip link add name t-dummy type dummy
ip link add name t-bond type bond mode active-backup
ip link set dev t-bond up
ip link set dev t-nlmon master t-bond
ip link set dev t-nlmon nomaster
ip link show dev t-bond
ip link set dev t-dummy master t-bond
ip link show dev t-bond
ip link del dev t-bond
ip link del dev t-dummy
ip link del dev t-nlmon
[3]
Before:
12: t-bond: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/netlink
12: t-bond: <BROADCAST,MULTICAST,MASTER,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 46:57:39:a4:46:a2 brd ff:ff:ff:ff:ff:ff
After:
12: t-bond: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/netlink
12: t-bond: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 66:48:7b:74:b6:8a brd ff:ff:ff:ff:ff:ff
--- drivers/net/bonding/bond_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/bonding/bond_main.c +4 -3
@@ -1775,14 +1775,15 @@ void bond_lower_state_changed(struct slave *slave)/* The bonding driver uses ether_setup() to convert a master bond device * to ARPHRD_ETHER, that resets the target netdevice's flags so we always -* have to restore the IFF_MASTER flag, and only restore IFF_SLAVE if it was set +* have to restore the IFF_MASTER flag, and only restore IFF_SLAVE and IFF_UP +* if they were set */ static void bond_ether_setup (struct net_device *bond_dev) { -unsigned int slave_flag = bond_dev->flags &IFF_SLAVE ; +unsigned int flags = bond_dev->flags & (IFF_SLAVE |IFF_UP );ether_setup (bond_dev); - bond_dev->flags |=IFF_MASTER | slave_flag; + bond_dev->flags |=IFF_MASTER | flags; bond_dev->priv_flags &= ~IFF_TX_SKB_SHARING ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 30/110 net: rpl: fix rpl header size calculation
In reply to Greg Kroah-HartmanFrom: Alexander Aring <[email protected]>
[ Upstream commit 4e006c7a6dac0ead4c1bf606000aa90a372fc253 ]
This patch fixes a missing 8 byte for the header size calculation. The ipv6_rpl_srh_size() is used to check a skb_pull() on skb->data which points to skb_transport_header(). Currently we only check on the calculated addresses fields using CmprI and CmprE fields, see:
https://www.rfc-editor.org/rfc/rfc6554#section-3
there is however a missing 8 byte inside the calculation which stands for the fields before the addresses field. Those 8 bytes are represented by sizeof(struct ipv6_rpl_sr_hdr) expression.
--- net/ipv6/rpl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/rpl.c +2 -1
@@ -32,7 +32,8 @@ static void *ipv6_rpl_segdata_pos(const struct ipv6_rpl_sr_hdr *hdr, int i)size_t ipv6_rpl_srh_size (unsigned char n,unsigned char cmpri,unsigned char cmpre) { -return (n *IPV6_PFXTAIL_LEN (cmpri)) +IPV6_PFXTAIL_LEN (cmpre); +return sizeof (struct ipv6_rpl_sr_hdr ) + (n *IPV6_PFXTAIL_LEN (cmpri)) + +IPV6_PFXTAIL_LEN (cmpre); } void ipv6_rpl_srh_decompress(struct ipv6_rpl_sr_hdr *outhdr,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 31/110 mlxsw: pci: Fix possible crash during initialization
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
[ Upstream commit 1f64757ee2bb22a93ec89b4c71707297e8cca0ba ]
During initialization the driver issues a reset command via its command interface in order to remove previous configuration from the device.
After issuing the reset, the driver waits for 200ms before polling on the "system_status" register using memory-mapped IO until the device reaches a ready state (0x5E). The wait is necessary because the reset command only triggers the reset, but the reset itself happens asynchronously. If the driver starts polling too soon, the read of the "system_status" register will never return and the system will crash [1].
The issue was discovered when the device was flashed with a development firmware version where the reset routine took longer to complete. The issue was fixed in the firmware, but it exposed the fact that the current wait time is borderline.
Fix by increasing the wait time from 200ms to 400ms. With this patch and the buggy firmware version, the issue did not reproduce in 10 reboots whereas without the patch the issue is reproduced quite consistently.
[1]
mce: CPUs not responding to MCE broadcast (may include false positives): 0,4
mce: CPUs not responding to MCE broadcast (may include false positives): 0,4
Kernel panic - not syncing: Timeout: Not all CPUs entered broadcast exception handler
Shutting down cpus with NMI
Kernel Offset: 0x12000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
--- drivers/net/ethernet/mellanox/mlxsw/pci_hw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/pci_hw.h +1 -1
@@ -26,7 +26,7 @@#define MLXSW_PCI_CIR_TIMEOUT_MSECS 1000#define MLXSW_PCI_SW_RESET_TIMEOUT_MSECS 900000 -#define MLXSW_PCI_SW_RESET_WAIT_MSECS 200 +#define MLXSW_PCI_SW_RESET_WAIT_MSECS 400#define MLXSW_PCI_FW_READY 0xA1844#define MLXSW_PCI_FW_READY_MASK 0xFFFF#define MLXSW_PCI_FW_READY_MAGIC 0x5E
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 32/110 spi: spi-rockchip: Fix missing unwind goto in rockchip_sfc_probe()
In reply to Greg Kroah-HartmanFrom: Li Lanzhe <[email protected]>
[ Upstream commit 359f5b0d4e26b7a7bcc574d6148b31a17cefe47d ]
If devm_request_irq() fails, then we are directly return 'ret' without clk_disable_unprepare(sfc->clk) and clk_disable_unprepare(sfc->hclk).
Fix this by changing direct return to a goto 'err_irq'.
--- drivers/spi/spi-rockchip-sfc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-rockchip-sfc.c +1 -1
@@ -632,7 +632,7 @@ static int rockchip_sfc_probe(struct platform_device *pdev)if (ret) {dev_err (dev,"Failed to request irq\n" ); -return ret; + goto err_irq; } ret =rockchip_sfc_init (sfc);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 33/110 bpf: Fix incorrect verifier pruning due to missing register precision taints
In reply to Greg Kroah-HartmanFrom: Daniel Borkmann <[email protected]>
[ Upstream commit 71b547f561247897a0a14f3082730156c0533fed ]
Juan Jose et al reported an issue found via fuzzing where the verifier's pruning logic prematurely marks a program path as safe.
Consider the following program:
0: (b7) r6 = 1024
1: (b7) r7 = 0
2: (b7) r8 = 0
3: (b7) r9 = -2147483648
4: (97) r6 %= 1025
5: (05) goto pc+0
6: (bd) if r6 <= r9 goto pc+2
7: (97) r6 %= 1
8: (b7) r9 = 0
9: (bd) if r6 <= r9 goto pc+1
10: (b7) r6 = 0
11: (b7) r0 = 0
12: (63) *(u32 *)(r10 -4) = r0
13: (18) r4 = 0xffff888103693400 // map_ptr(ks=4,vs=48) 15: (bf) r1 = r4
16: (bf) r2 = r10
17: (07) r2 += -4
18: (85) call bpf_map_lookup_elem#1
19: (55) if r0 != 0x0 goto pc+1
20: (95) exit
21: (77) r6 >>= 10
22: (27) r6 *= 8192
23: (bf) r1 = r0
24: (0f) r0 += r6
25: (79) r3 = *(u64 *)(r0 +0)
26: (7b) *(u64 *)(r1 +0) = r3
27: (95) exit
The verifier treats this as safe, leading to oob read/write access due to an incorrect verifier conclusion:
func#0 @0
0: R1=ctx(off=0,imm=0) R10=fp0
0: (b7) r6 = 1024 ; R6_w=1024 1: (b7) r7 = 0 ; R7_w=0 2: (b7) r8 = 0 ; R8_w=0 3: (b7) r9 = -2147483648 ; R9_w=-2147483648 4: (97) r6 %= 1025 ; R6_w=scalar() 5: (05) goto pc+0 6: (bd) if r6 <= r9 goto pc+2 ; R6_w=scalar(umin=18446744071562067969,var_off=(0xffffffff00000000; 0xffffffff)) R9_w=-2147483648 7: (97) r6 %= 1 ; R6_w=scalar() 8: (b7) r9 = 0 ; R9=0 9: (bd) if r6 <= r9 goto pc+1 ; R6=scalar(umin=1) R9=0 10: (b7) r6 = 0 ; R6_w=0 11: (b7) r0 = 0 ; R0_w=0 12: (63) *(u32 *)(r10 -4) = r0 last_idx 12 first_idx 9 regs=1 stack=0 before 11: (b7) r0 = 0 13: R0_w=0 R10=fp0 fp-8=0000???? 13: (18) r4 = 0xffff8ad3886c2a00 ; R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 15: (bf) r1 = r4 ; R1_w=map_ptr(off=0,ks=4,vs=48,imm=0) R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 16: (bf) r2 = r10 ; R2_w=fp0 R10=fp0 17: (07) r2 += -4 ; R2_w=fp-4 18: (85) call bpf_map_lookup_elem#1 ; R0=map_value_or_null(id=1,off=0,ks=4,vs=48,imm=0) 19: (55) if r0 != 0x0 goto pc+1 ; R0=0
20: (95) exit
from 19 to 21: R0=map_value(off=0,ks=4,vs=48,imm=0) R6=0 R7=0 R8=0 R9=0 R10=fp0 fp-8=mmmm????
21: (77) r6 >>= 10 ; R6_w=0 22: (27) r6 *= 8192 ; R6_w=0 23: (bf) r1 = r0 ; R0=map_value(off=0,ks=4,vs=48,imm=0) R1_w=map_value(off=0,ks=4,vs=48,imm=0)
24: (0f) r0 += r6
last_idx 24 first_idx 19
regs=40 stack=0 before 23: (bf) r1 = r0
regs=40 stack=0 before 22: (27) r6 *= 8192
regs=40 stack=0 before 21: (77) r6 >>= 10
regs=40 stack=0 before 19: (55) if r0 != 0x0 goto pc+1
parent didn't have regs=40 stack=0 marks: R0_rw=map_value_or_null(id=1,off=0,ks=4,vs=48,imm=0) R6_rw=P0 R7=0 R8=0 R9=0 R10=fp0 fp-8=mmmm???? last_idx 18 first_idx 9
regs=40 stack=0 before 18: (85) call bpf_map_lookup_elem#1
regs=40 stack=0 before 17: (07) r2 += -4
regs=40 stack=0 before 16: (bf) r2 = r10
regs=40 stack=0 before 15: (bf) r1 = r4
regs=40 stack=0 before 13: (18) r4 = 0xffff8ad3886c2a00
regs=40 stack=0 before 12: (63) *(u32 *)(r10 -4) = r0
regs=40 stack=0 before 11: (b7) r0 = 0
regs=40 stack=0 before 10: (b7) r6 = 0
25: (79) r3 = *(u64 *)(r0 +0) ; R0_w=map_value(off=0,ks=4,vs=48,imm=0) R3_w=scalar()
26: (7b) *(u64 *)(r1 +0) = r3 ; R1_w=map_value(off=0,ks=4,vs=48,imm=0) R3_w=scalar()
27: (95) exit
from 9 to 11: R1=ctx(off=0,imm=0) R6=0 R7=0 R8=0 R9=0 R10=fp0
11: (b7) r0 = 0 ; R0_w=0
12: (63) *(u32 *)(r10 -4) = r0
last_idx 12 first_idx 11
regs=1 stack=0 before 11: (b7) r0 = 0
13: R0_w=0 R10=fp0 fp-8=0000????
13: (18) r4 = 0xffff8ad3886c2a00 ; R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 15: (bf) r1 = r4 ; R1_w=map_ptr(off=0,ks=4,vs=48,imm=0) R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 16: (bf) r2 = r10 ; R2_w=fp0 R10=fp0 17: (07) r2 += -4 ; R2_w=fp-4
18: (85) call bpf_map_lookup_elem#1
frame 0: propagating r6
last_idx 19 first_idx 11
regs=40 stack=0 before 18: (85) call bpf_map_lookup_elem#1
regs=40 stack=0 before 17: (07) r2 += -4
regs=40 stack=0 before 16: (bf) r2 = r10
regs=40 stack=0 before 15: (bf) r1 = r4
regs=40 stack=0 before 13: (18) r4 = 0xffff8ad3886c2a00
regs=40 stack=0 before 12: (63) *(u32 *)(r10 -4) = r0
regs=40 stack=0 before 11: (b7) r0 = 0
parent didn't have regs=40 stack=0 marks: R1=ctx(off=0,imm=0) R6_r=P0 R7=0 R8=0 R9=0 R10=fp0 last_idx 9 first_idx 9
regs=40 stack=0 before 9: (bd) if r6 <= r9 goto pc+1
parent didn't have regs=40 stack=0 marks: R1=ctx(off=0,imm=0) R6_rw=Pscalar() R7_w=0 R8_w=0 R9_rw=0 R10=fp0 last_idx 8 first_idx 0
regs=40 stack=0 before 8: (b7) r9 = 0
regs=40 stack=0 before 7: (97) r6 %= 1
regs=40 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=40 stack=0 before 5: (05) goto pc+0
regs=40 stack=0 before 4: (97) r6 %= 1025
regs=40 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
19: safe
frame 0: propagating r6
last_idx 9 first_idx 0
regs=40 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=40 stack=0 before 5: (05) goto pc+0
regs=40 stack=0 before 4: (97) r6 %= 1025
regs=40 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
from 6 to 9: safe
verification time 110 usec
stack depth 4
processed 36 insns (limit 1000000) max_states_per_insn 0 total_states 3 peak_states 3 mark_read 2
The verifier considers this program as safe by mistakenly pruning unsafe code paths. In the above func#0, code lines 0-10 are of interest. In line 0-3 registers r6 to r9 are initialized with known scalar values. In line 4 the register r6 is reset to an unknown scalar given the verifier does not track modulo operations. Due to this, the verifier can also not determine precisely which branches in line 6 and 9 are taken, therefore it needs to explore them both.
As can be seen, the verifier starts with exploring the false/fall-through paths first. The 'from 19 to 21' path has both r6=0 and r9=0 and the pointer arithmetic on r0 += r6 is therefore considered safe. Given the arithmetic, r6 is correctly marked for precision tracking where backtracking kicks in where it walks back the current path all the way where r6 was set to 0 in the fall-through branch.
Next, the pruning logics pops the path 'from 9 to 11' from the stack. Also here, the state of the registers is the same, that is, r6=0 and r9=0, so that at line 19 the path can be pruned as it is considered safe. It is interesting to note that the conditional in line 9 turned r6 into a more precise state, that is, in the fall-through path at the beginning of line 10, it is R6=scalar(umin=1), and in the branch-taken path (which is analyzed here) at the beginning of line 11, r6 turned into a known const r6=0 as r9=0 prior to that and therefore (unsigned) r6 <= 0 concludes that r6 must be 0 (**):
[...] ; R6_w=scalar()
9: (bd) if r6 <= r9 goto pc+1 ; R6=scalar(umin=1) R9=0
[...]
from 9 to 11: R1=ctx(off=0,imm=0) R6=0 R7=0 R8=0 R9=0 R10=fp0 [...]
The next path is 'from 6 to 9'. The verifier considers the old and current state equivalent, and therefore prunes the search incorrectly. Looking into the two states which are being compared by the pruning logic at line 9, the old state consists of R6_rwD=Pscalar() R9_rwD=0 R10=fp0 and the new state consists of R1=ctx(off=0,imm=0) R6_w=scalar(umax=18446744071562067968) R7_w=0 R8_w=0 R9_w=-2147483648 R10=fp0. While r6 had the reg->precise flag correctly set in the old state, r9 did not. Both r6'es are considered as equivalent given the old one is a superset of the current, more precise one, however, r9's actual values (0 vs 0x80000000) mismatch. Given the old r9 did not have reg->precise flag set, the verifier does not consider the register as contributing to the precision state of r6, and therefore it considered both r9 states as equivalent. However, for this specific pruned path (which is also the actual path taken at runtime), register r6 will be 0x400 and r9 0x80000000 when reaching line 21, thus oob-accessing the map.
The purpose of precision tracking is to initially mark registers (including spilled ones) as imprecise to help verifier's pruning logic finding equivalent states it can then prune if they don't contribute to the program's safety aspects. For example, if registers are used for pointer arithmetic or to pass constant length to a helper, then the verifier sets reg->precise flag and backtracks the BPF program instruction sequence and chain of verifier states to ensure that the given register or stack slot including their dependencies are marked as precisely tracked scalar. This also includes any other registers and slots that contribute to a tracked state of given registers/stack slot. This backtracking relies on recorded jmp_history and is able to traverse entire chain of parent states. This process ends only when all the necessary registers/slots and their transitive dependencies are marked as precise.
The backtrack_insn() is called from the current instruction up to the first instruction, and its purpose is to compute a bitmask of registers and stack slots that need precision tracking in the parent's verifier state. For example, if a current instruction is r6 = r7, then r6 needs precision after this instruction and r7 needs precision before this instruction, that is, in the parent state. Hence for the latter r7 is marked and r6 unmarked.
For the class of jmp/jmp32 instructions, backtrack_insn() today only looks at call and exit instructions and for all other conditionals the masks remain as-is. However, in the given situation register r6 has a dependency on r9 (as described above in **), so also that one needs to be marked for precision tracking. In other words, if an imprecise register influences a precise one, then the imprecise register should also be marked precise. Meaning, in the parent state both dest and src register need to be tracked for precision and therefore the marking must be more conservative by setting reg->precise flag for both. The precision propagation needs to cover both for the conditional: if the src reg was marked but not the dst reg and vice versa.
After the fix the program is correctly rejected:
func#0 @0
0: R1=ctx(off=0,imm=0) R10=fp0
0: (b7) r6 = 1024 ; R6_w=1024 1: (b7) r7 = 0 ; R7_w=0 2: (b7) r8 = 0 ; R8_w=0 3: (b7) r9 = -2147483648 ; R9_w=-2147483648 4: (97) r6 %= 1025 ; R6_w=scalar() 5: (05) goto pc+0 6: (bd) if r6 <= r9 goto pc+2 ; R6_w=scalar(umin=18446744071562067969,var_off=(0xffffffff80000000; 0x7fffffff),u32_min=-2147483648) R9_w=-2147483648 7: (97) r6 %= 1 ; R6_w=scalar() 8: (b7) r9 = 0 ; R9=0 9: (bd) if r6 <= r9 goto pc+1 ; R6=scalar(umin=1) R9=0 10: (b7) r6 = 0 ; R6_w=0 11: (b7) r0 = 0 ; R0_w=0 12: (63) *(u32 *)(r10 -4) = r0 last_idx 12 first_idx 9 regs=1 stack=0 before 11: (b7) r0 = 0 13: R0_w=0 R10=fp0 fp-8=0000???? 13: (18) r4 = 0xffff9290dc5bfe00 ; R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 15: (bf) r1 = r4 ; R1_w=map_ptr(off=0,ks=4,vs=48,imm=0) R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 16: (bf) r2 = r10 ; R2_w=fp0 R10=fp0 17: (07) r2 += -4 ; R2_w=fp-4 18: (85) call bpf_map_lookup_elem#1 ; R0=map_value_or_null(id=1,off=0,ks=4,vs=48,imm=0) 19: (55) if r0 != 0x0 goto pc+1 ; R0=0
20: (95) exit
from 19 to 21: R0=map_value(off=0,ks=4,vs=48,imm=0) R6=0 R7=0 R8=0 R9=0 R10=fp0 fp-8=mmmm????
21: (77) r6 >>= 10 ; R6_w=0 22: (27) r6 *= 8192 ; R6_w=0 23: (bf) r1 = r0 ; R0=map_value(off=0,ks=4,vs=48,imm=0) R1_w=map_value(off=0,ks=4,vs=48,imm=0)
24: (0f) r0 += r6
last_idx 24 first_idx 19
regs=40 stack=0 before 23: (bf) r1 = r0
regs=40 stack=0 before 22: (27) r6 *= 8192
regs=40 stack=0 before 21: (77) r6 >>= 10
regs=40 stack=0 before 19: (55) if r0 != 0x0 goto pc+1
parent didn't have regs=40 stack=0 marks: R0_rw=map_value_or_null(id=1,off=0,ks=4,vs=48,imm=0) R6_rw=P0 R7=0 R8=0 R9=0 R10=fp0 fp-8=mmmm???? last_idx 18 first_idx 9
regs=40 stack=0 before 18: (85) call bpf_map_lookup_elem#1
regs=40 stack=0 before 17: (07) r2 += -4
regs=40 stack=0 before 16: (bf) r2 = r10
regs=40 stack=0 before 15: (bf) r1 = r4
regs=40 stack=0 before 13: (18) r4 = 0xffff9290dc5bfe00
regs=40 stack=0 before 12: (63) *(u32 *)(r10 -4) = r0
regs=40 stack=0 before 11: (b7) r0 = 0
regs=40 stack=0 before 10: (b7) r6 = 0
25: (79) r3 = *(u64 *)(r0 +0) ; R0_w=map_value(off=0,ks=4,vs=48,imm=0) R3_w=scalar()
26: (7b) *(u64 *)(r1 +0) = r3 ; R1_w=map_value(off=0,ks=4,vs=48,imm=0) R3_w=scalar()
27: (95) exit
from 9 to 11: R1=ctx(off=0,imm=0) R6=0 R7=0 R8=0 R9=0 R10=fp0
11: (b7) r0 = 0 ; R0_w=0
12: (63) *(u32 *)(r10 -4) = r0
last_idx 12 first_idx 11
regs=1 stack=0 before 11: (b7) r0 = 0
13: R0_w=0 R10=fp0 fp-8=0000????
13: (18) r4 = 0xffff9290dc5bfe00 ; R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 15: (bf) r1 = r4 ; R1_w=map_ptr(off=0,ks=4,vs=48,imm=0) R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 16: (bf) r2 = r10 ; R2_w=fp0 R10=fp0 17: (07) r2 += -4 ; R2_w=fp-4
18: (85) call bpf_map_lookup_elem#1
frame 0: propagating r6
last_idx 19 first_idx 11
regs=40 stack=0 before 18: (85) call bpf_map_lookup_elem#1
regs=40 stack=0 before 17: (07) r2 += -4
regs=40 stack=0 before 16: (bf) r2 = r10
regs=40 stack=0 before 15: (bf) r1 = r4
regs=40 stack=0 before 13: (18) r4 = 0xffff9290dc5bfe00
regs=40 stack=0 before 12: (63) *(u32 *)(r10 -4) = r0
regs=40 stack=0 before 11: (b7) r0 = 0
parent didn't have regs=40 stack=0 marks: R1=ctx(off=0,imm=0) R6_r=P0 R7=0 R8=0 R9=0 R10=fp0 last_idx 9 first_idx 9
regs=40 stack=0 before 9: (bd) if r6 <= r9 goto pc+1
parent didn't have regs=240 stack=0 marks: R1=ctx(off=0,imm=0) R6_rw=Pscalar() R7_w=0 R8_w=0 R9_rw=P0 R10=fp0 last_idx 8 first_idx 0
regs=240 stack=0 before 8: (b7) r9 = 0
regs=40 stack=0 before 7: (97) r6 %= 1
regs=40 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=240 stack=0 before 5: (05) goto pc+0
regs=240 stack=0 before 4: (97) r6 %= 1025
regs=240 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
19: safe
from 6 to 9: R1=ctx(off=0,imm=0) R6_w=scalar(umax=18446744071562067968) R7_w=0 R8_w=0 R9_w=-2147483648 R10=fp0 9: (bd) if r6 <= r9 goto pc+1
last_idx 9 first_idx 0
regs=40 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=240 stack=0 before 5: (05) goto pc+0
regs=240 stack=0 before 4: (97) r6 %= 1025
regs=240 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
last_idx 9 first_idx 0
regs=200 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=240 stack=0 before 5: (05) goto pc+0
regs=240 stack=0 before 4: (97) r6 %= 1025
regs=240 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
11: R6=scalar(umax=18446744071562067968) R9=-2147483648
11: (b7) r0 = 0 ; R0_w=0
12: (63) *(u32 *)(r10 -4) = r0
last_idx 12 first_idx 11
regs=1 stack=0 before 11: (b7) r0 = 0
13: R0_w=0 R10=fp0 fp-8=0000????
13: (18) r4 = 0xffff9290dc5bfe00 ; R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 15: (bf) r1 = r4 ; R1_w=map_ptr(off=0,ks=4,vs=48,imm=0) R4_w=map_ptr(off=0,ks=4,vs=48,imm=0) 16: (bf) r2 = r10 ; R2_w=fp0 R10=fp0 17: (07) r2 += -4 ; R2_w=fp-4 18: (85) call bpf_map_lookup_elem#1 ; R0_w=map_value_or_null(id=3,off=0,ks=4,vs=48,imm=0) 19: (55) if r0 != 0x0 goto pc+1 ; R0_w=0
20: (95) exit
from 19 to 21: R0=map_value(off=0,ks=4,vs=48,imm=0) R6=scalar(umax=18446744071562067968) R7=0 R8=0 R9=-2147483648 R10=fp0 fp-8=mmmm????
21: (77) r6 >>= 10 ; R6_w=scalar(umax=18014398507384832,var_off=(0x0; 0x3fffffffffffff)) 22: (27) r6 *= 8192 ; R6_w=scalar(smax=9223372036854767616,umax=18446744073709543424,var_off=(0x0; 0xffffffffffffe000),s32_max=2147475456,u32_max=-8192) 23: (bf) r1 = r0 ; R0=map_value(off=0,ks=4,vs=48,imm=0) R1_w=map_value(off=0,ks=4,vs=48,imm=0)
24: (0f) r0 += r6
last_idx 24 first_idx 21
regs=40 stack=0 before 23: (bf) r1 = r0
regs=40 stack=0 before 22: (27) r6 *= 8192
regs=40 stack=0 before 21: (77) r6 >>= 10
parent didn't have regs=40 stack=0 marks: R0_rw=map_value(off=0,ks=4,vs=48,imm=0) R6_r=Pscalar(umax=18446744071562067968) R7=0 R8=0 R9=-2147483648 R10=fp0 fp-8=mmmm???? last_idx 19 first_idx 11
regs=40 stack=0 before 19: (55) if r0 != 0x0 goto pc+1
regs=40 stack=0 before 18: (85) call bpf_map_lookup_elem#1
regs=40 stack=0 before 17: (07) r2 += -4
regs=40 stack=0 before 16: (bf) r2 = r10
regs=40 stack=0 before 15: (bf) r1 = r4
regs=40 stack=0 before 13: (18) r4 = 0xffff9290dc5bfe00
regs=40 stack=0 before 12: (63) *(u32 *)(r10 -4) = r0
regs=40 stack=0 before 11: (b7) r0 = 0
parent didn't have regs=40 stack=0 marks: R1=ctx(off=0,imm=0) R6_rw=Pscalar(umax=18446744071562067968) R7_w=0 R8_w=0 R9_w=-2147483648 R10=fp0 last_idx 9 first_idx 0
regs=40 stack=0 before 9: (bd) if r6 <= r9 goto pc+1
regs=240 stack=0 before 6: (bd) if r6 <= r9 goto pc+2
regs=240 stack=0 before 5: (05) goto pc+0
regs=240 stack=0 before 4: (97) r6 %= 1025
regs=240 stack=0 before 3: (b7) r9 = -2147483648
regs=40 stack=0 before 2: (b7) r8 = 0
regs=40 stack=0 before 1: (b7) r7 = 0
regs=40 stack=0 before 0: (b7) r6 = 1024
math between map_value pointer and register with unbounded min value is not allowed
verification time 886 usec
stack depth 4
processed 49 insns (limit 1000000) max_states_per_insn 1 total_states 5 peak_states 5 mark_read 2
--- kernel/bpf/verifier.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
kernel/bpf/verifier.c +15 -0
@@ -2905,6 +2905,21 @@ static int backtrack_insn(struct bpf_verifier_env *env, int idx, } }else if (opcode ==BPF_EXIT ) {return -ENOTSUPP ; + }else if (BPF_SRC (insn->code) ==BPF_X ) { +if (!(*reg_mask & (dreg | sreg))) +return 0 ; +/* dreg <cond> sreg +* Both dreg and sreg need precision before +* this insn. If only sreg was marked precise +* before it would be equally necessary to +* propagate it to dreg. +*/ + *reg_mask |= (sreg | dreg); +/* else dreg <cond> K +* Only dreg still needs precision before +* this insn, so for the K-based conditional +* there is nothing new to be marked. +*/ } }else if (class ==BPF_LD ) {if (!(*reg_mask & dreg))
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 34/110 net: dsa: microchip: ksz8795: Correctly handle huge frame configuration
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 3d2f8f1f184c60508f7af3022536651d7ac2dd07 ]
Because of the logic in place, SW_HUGE_PACKET can never be set. (If the first condition is true, then the 2nd one is also true, but is not executed)
Change the logic and update each bit individually.
--- drivers/net/dsa/microchip/ksz8795.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/microchip/ksz8795.c +1 -1
@@ -96,7 +96,7 @@ static int ksz8795_change_mtu(struct ksz_device *dev, int frame_size)if (frame_size >KSZ8_LEGAL_PACKET_SIZE ) ctrl2 |=SW_LEGAL_PACKET_DISABLE ; -else if (frame_size >KSZ8863_NORMAL_PACKET_SIZE ) +if (frame_size >KSZ8863_NORMAL_PACKET_SIZE ) ctrl1 |=SW_HUGE_PACKET ; ret =ksz_rmw8 (dev,REG_SW_CTRL_1 ,SW_HUGE_PACKET , ctrl1);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 35/110 bnxt_en: fix free-runnig PHC mode
In reply to Greg Kroah-HartmanFrom: Vadim Fedorenko <[email protected]>
[ Upstream commit 8c154d272c3e03b100baaf1df473f22a78fa403e ]
The patch in fixes changed the way real-time mode is chosen for PHC on the NIC. Apparently there is one more use case of the check outside of ptp part of the driver which was not converted to the new macro and is making a lot of noise in free-running mode.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
@@ -2388,7 +2388,7 @@ static int bnxt_async_event_process(struct bnxt *bp,case ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE : {switch (BNXT_EVENT_PHC_EVENT_TYPE (data1)) {case ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_FLAGS_PHC_RTC_UPDATE : -if (bp->fw_cap &BNXT_FW_CAP_PTP_RTC ) { +if (BNXT_PTP_USE_RTC (bp)) {struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;u64 ns;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 36/110 e1000e: Disable TSO on i219-LM card to increase speed
In reply to Greg Kroah-HartmanFrom: Sebastian Basierski <[email protected]>
[ Upstream commit 67d47b95119ad589b0a0b16b88b1dd9a04061ced ]
While using i219-LM card currently it was only possible to achieve about 60% of maximum speed due to regression introduced in Linux 5.8. This was caused by TSO not being disabled by default despite commit f29801030ac6 ("e1000e: Disable TSO for buffer overrun workaround"). Fix that by disabling TSO during driver probe.
--- drivers/net/ethernet/intel/e1000e/netdev.c | 51 +++++++++++----------- 1 file changed, 26 insertions(+), 25 deletions(-)
drivers/net/ethernet/intel/e1000e/netdev.c +26 -25
@@ -5288,31 +5288,6 @@ static void e1000_watchdog_task(struct work_struct *work)ew32 (TARC (0 ), tarc0); } -/* disable TSO for pcie and 10/100 speeds, to avoid -* some hardware issues -*/ -if (!(adapter->flags &FLAG_TSO_FORCE )) { -switch (adapter->link_speed) { -case SPEED_10 : -case SPEED_100 : -e_info ("10/100 speed: disabling TSO\n" ); - netdev->features &= ~NETIF_F_TSO ; - netdev->features &= ~NETIF_F_TSO6 ; -break ; -case SPEED_1000 : - netdev->features |=NETIF_F_TSO ; - netdev->features |=NETIF_F_TSO6 ; -break ; -default : -/* oops */ -break ; - } -if (hw->mac.type == e1000_pch_spt) { - netdev->features &= ~NETIF_F_TSO ; - netdev->features &= ~NETIF_F_TSO6 ; - } - } -/* enable transmits in the hardware, need to do this * after setting TARC(0) */
@@ -7529,6 +7504,32 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)NETIF_F_RXCSUM | NETIF_F_HW_CSUM); +/* disable TSO for pcie and 10/100 speeds to avoid +* some hardware issues and for i219 to fix transfer +* speed being capped at 60% +*/ +if (!(adapter->flags &FLAG_TSO_FORCE )) { +switch (adapter->link_speed) { +case SPEED_10 : +case SPEED_100 : +e_info ("10/100 speed: disabling TSO\n" ); + netdev->features &= ~NETIF_F_TSO ; + netdev->features &= ~NETIF_F_TSO6 ; +break ; +case SPEED_1000 : + netdev->features |=NETIF_F_TSO ; + netdev->features |=NETIF_F_TSO6 ; +break ; +default : +/* oops */ +break ; + } +if (hw->mac.type == e1000_pch_spt) { + netdev->features &= ~NETIF_F_TSO ; + netdev->features &= ~NETIF_F_TSO6 ; + } + } +/* Set user-changeable features (subset of all device features) */ netdev->hw_features = netdev->features; netdev->hw_features |=NETIF_F_RXFCS ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 37/110 net: bridge: switchdev: dont notify FDB entries with "master dynamic"
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 927cdea5d2095287ddd5246e5aa68eb5d68db2be ]
There is a structural problem in switchdev, where the flag bits in struct switchdev_notifier_fdb_info (added_by_user, is_local etc) only represent a simplified / denatured view of what's in struct net_bridge_fdb_entry :: flags (BR_FDB_ADDED_BY_USER, BR_FDB_LOCAL etc). Each time we want to pass more information about struct net_bridge_fdb_entry :: flags to struct switchdev_notifier_fdb_info (here, BR_FDB_STATIC), we find that FDB entries were already notified to switchdev with no regard to this flag, and thus, switchdev drivers had no indication whether the notified entries were static or not.
For example, this command:
ip link add br0 type bridge && ip link set swp0 master br0 bridge fdb add dev swp0 00:01:02:03:04:05 master dynamic
has never worked as intended with switchdev. It causes a struct net_bridge_fdb_entry to be passed to br_switchdev_fdb_notify() which has a single flag set: BR_FDB_ADDED_BY_USER.
This is further passed to the switchdev notifier chain, where interested drivers have no choice but to assume this is a static (does not age) and sticky (does not migrate) FDB entry. So currently, all drivers offload it to hardware as such, as can be seen below ("offload" is set).
bridge fdb get 00:01:02:03:04:05 dev swp0 master
00:01:02:03:04:05 dev swp0 offload master br0
The software FDB entry expires $ageing_time centiseconds after the kernel last sees a packet with this MAC SA, and the bridge notifies its deletion as well, so it eventually disappears from hardware too.
This is a problem, because it is actually desirable to start offloading "master dynamic" FDB entries correctly - they should expire $ageing_time centiseconds after the *hardware* port last sees a packet with this MAC SA - and this is how the current incorrect behavior was discovered. With an offloaded data plane, it can be expected that software only sees exception path packets, so an otherwise active dynamic FDB entry would be aged out by software sooner than it should.
With the change in place, these FDB entries are no longer offloaded:
bridge fdb get 00:01:02:03:04:05 dev swp0 master
00:01:02:03:04:05 dev swp0 master br0
and this also constitutes a better way (assuming a backport to stable kernels) for user space to determine whether the kernel has the capability of doing something sane with these or not.
As opposed to "master dynamic" FDB entries, on the current behavior of which no one currently depends on (which can be deduced from the lack of kselftests), Ido Schimmel explains that entries with the "extern_learn" flag (BR_FDB_ADDED_BY_EXT_LEARN) should still be notified to switchdev, since the spectrum driver listens to them (and this is kind of okay, because although they are treated identically to "static", they are expected to not age, and to roam).
--- net/bridge/br_switchdev.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
net/bridge/br_switchdev.c +11 -0
@@ -150,6 +150,17 @@ br_switchdev_fdb_notify(struct net_bridge *br,if (test_bit (BR_FDB_LOCKED , &fdb->flags))return ; +/* Entries with these flags were created using ndm_state == NUD_REACHABLE, +* ndm_flags == NTF_MASTER( | NTF_STICKY), ext_flags == 0 by something +* equivalent to 'bridge fdb add ... master dynamic (sticky)'. +* Drivers don't know how to deal with these, so don't notify them to +* avoid confusing them. +*/ +if (test_bit (BR_FDB_ADDED_BY_USER , &fdb->flags) && + !test_bit (BR_FDB_STATIC , &fdb->flags) && + !test_bit (BR_FDB_ADDED_BY_EXT_LEARN , &fdb->flags)) +return ; +br_switchdev_fdb_populate (br, &item, fdb,NULL );switch (type) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 38/110 f2fs: Fix f2fs_truncate_partial_nodes ftrace event
In reply to Greg Kroah-HartmanFrom: Douglas Raillard <[email protected]>
[ Upstream commit 0b04d4c0542e8573a837b1d81b94209e48723b25 ]
Fix the nid_t field so that its size is correctly reported in the text format embedded in trace.dat files. As it stands, it is reported as being of size 4:
field:nid_t nid[3]; offset:24; size:4; signed:0;
Instead of 12:
field:nid_t nid[3]; offset:24; size:12; signed:0;
This also fixes the reported offset of subsequent fields so that they match with the actual struct layout.
--- include/trace/events/f2fs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/trace/events/f2fs.h +1 -1
@@ -512,7 +512,7 @@ TRACE_EVENT(f2fs_truncate_partial_nodes,TP_STRUCT__entry (__field (dev_t ,dev )__field (ino_t, ino) - __field(nid_t, nid[3]) +__array (nid_t, nid,3 )__field (int, depth)__field (int, err) ),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 39/110 platform/x86/intel: vsec: Fix a memory leak in intel_vsec_add_aux
In reply to Greg Kroah-HartmanFrom: Dongliang Mu <[email protected]>
[ Upstream commit da0ba0ccce54059d6c6b788a75099bfce95126da ]
The first error handling code in intel_vsec_add_aux misses the deallocation of intel_vsec_dev->resource.
Fix this by adding kfree(intel_vsec_dev->resource) in the error handling code.
--- drivers/platform/x86/intel/vsec.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/intel/vsec.c +1 -0
@@ -141,6 +141,7 @@ static int intel_vsec_add_aux(struct pci_dev *pdev, struct intel_vsec_device *in ret =ida_alloc (intel_vsec_dev->ida,GFP_KERNEL );if (ret <0 ) { +kfree (intel_vsec_dev->resource);kfree (intel_vsec_dev);return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 40/110 platform/x86 (gigabyte-wmi): Add support for A320M-S2H V2
In reply to Greg Kroah-HartmanFrom: Frank Crawford <[email protected]>
[ Upstream commit b7c994f8c35e916e27c60803bb21457bc1373500 ]
Add support for A320M-S2H V2. Tested using module force_load option.
--- drivers/platform/x86/gigabyte-wmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/gigabyte-wmi.c +1 -0
@@ -140,6 +140,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev) }}static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = { +DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("A320M-S2H V2-CF" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B450M DS3H-CF" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B450M DS3H WIFI-CF" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B450M S2H V2" ),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 41/110 selftests: sigaltstack: fix -Wuninitialized
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
[ Upstream commit 05107edc910135d27fe557267dc45be9630bf3dd ]
Building sigaltstack with clang via:
$ ARCH=x86 make LLVM=1 -C tools/testing/selftests/sigaltstack/
produces the following warning:
warning: variable 'sp' is uninitialized when used here [-Wuninitialized] if (sp < (unsigned long)sstack ||
^~
Clang expects these to be declared at global scope; we've fixed this in the kernel proper by using the macro current_stack_pointer. This is defined in different headers for different target architectures, so just create a new header that defines the arch-specific register names for the stack pointer register, and define it for more targets (at least the ones that support current_stack_pointer/ARCH_HAS_CURRENT_STACK_POINTER).
--- .../sigaltstack/current_stack_pointer.h | 23 +++++++++++++++++++ tools/testing/selftests/sigaltstack/sas.c | 7 +----- 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 tools/testing/selftests/sigaltstack/current_stack_pointer.h
tools/testing/selftests/sigaltstack/current_stack_pointer.h new file +23 -0
@@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#if __alpha__ +registerunsigned long sp asm("$30" ); +#elif __arm__ || __aarch64__ || __csky__ || __m68k__ || __mips__ || __riscv +registerunsigned long sp asm("sp" ); +#elif __i386__ +registerunsigned long sp asm("esp" ); +#elif __loongarch64 +registerunsigned long sp asm("$sp" ); +#elif __ppc__ +registerunsigned long sp asm("r1" ); +#elif __s390x__ +registerunsigned long sp asm("%15" ); +#elif __sh__ +registerunsigned long sp asm("r15" ); +#elif __x86_64__ +registerunsigned long sp asm("rsp" ); +#elif __XTENSA__ +registerunsigned long sp asm("a1" ); +#else +#error "implement current_stack_pointer equivalent" +#endif
tools/testing/selftests/sigaltstack/sas.c +1 -6
@@ -20,6 +20,7 @@#include <sys/auxv.h> #include "../kselftest.h" +#include "current_stack_pointer.h" #ifndef SS_AUTODISARM #define SS_AUTODISARM (1U << 31)
@@ -46,12 +47,6 @@ void my_usr1(int sig, siginfo_t *si, void *u)stack_t stk;struct stk_data *p; -#if __s390x__ - registerunsigned long sp asm("%15" ); -#else - registerunsigned long sp asm("sp" ); -#endif -if (sp < (unsigned long )sstack || sp >= (unsigned long )sstack + stack_size) {ksft_exit_fail_msg ("SP is not on sigaltstack\n" );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 42/110 scsi: megaraid_sas: Fix fw_crash_buffer_show()
In reply to Greg Kroah-HartmanFrom: Tomas Henzl <[email protected]>
[ Upstream commit 0808ed6ebbc292222ca069d339744870f6d801da ]
If crash_dump_buf is not allocated then crash dump can't be available. Replace logical 'and' with 'or'.
--- drivers/scsi/megaraid/megaraid_sas_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/megaraid/megaraid_sas_base.c +1 -1
@@ -3298,7 +3298,7 @@ fw_crash_buffer_show(struct device *cdev,spin_lock_irqsave (&instance->crashdump_lock, flags); buff_offset = instance->fw_crash_buffer_offset; -if (!instance->crash_dump_buf && +if (!instance->crash_dump_buf || !((instance->fw_crash_state ==AVAILABLE ) || (instance->fw_crash_state ==COPYING ))) { dev_err(&instance->pdev->dev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 43/110 scsi: core: Improve scsi_vpd_inquiry() checks
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
[ Upstream commit f0aa59a33d2ac2267d260fe21eaf92500df8e7b4 ]
Some USB-SATA adapters have broken behavior when an unsupported VPD page is
probed: Depending on the VPD page number, a 4-byte header with a valid VPD page number but with a 0 length is returned. Currently, scsi_vpd_inquiry() only checks that the page number is valid to determine if the page is valid, which results in receiving only the 4-byte header for the non-existent page. This error manifests itself very often with page 0xb9 for the Concurrent Positioning Ranges detection done by sd_read_cpr(), resulting in the following error message:
sd 0:0:0:0: [sda] Invalid Concurrent Positioning Ranges VPD page
Prevent such misleading error message by adding a check in scsi_vpd_inquiry() to verify that the page length is not 0.
--- drivers/scsi/scsi.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/scsi/scsi.c +9 -2
@@ -314,11 +314,18 @@ static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,if (result)return -EIO ; -/* Sanity check that we got the page back that we asked for */ +/* +* Sanity check that we got the page back that we asked for and that +* the page size is not 0. +*/ if (buffer[1 ] != page)return -EIO ; -return get_unaligned_be16 (&buffer[2 ]) +4 ; + result =get_unaligned_be16 (&buffer[2 ]); +if (!result) +return -EIO ; + +return result +4 ; }static int scsi_get_vpd_size (struct scsi_device *sdev,u8 page)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 44/110 net: dsa: b53: mmap: add phy ops
In reply to Greg Kroah-HartmanFrom: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 45977e58ce65ed0459edc9a0466d9dfea09463f5 ]
Implement phy_read16() and phy_write16() ops for B53 MMAP to avoid accessing B53_PORT_MII_PAGE registers which hangs the device.
This access should be done through the MDIO Mux bus controller.
--- drivers/net/dsa/b53/b53_mmap.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/net/dsa/b53/b53_mmap.c +14 -0
@@ -216,6 +216,18 @@ static int b53_mmap_write64(struct b53_device *dev, u8 page, u8 reg,return 0 ; } +static int b53_mmap_phy_read16 (struct b53_device *dev,int addr,int reg, +u16 *value) +{ +return -EIO ; +} + +static int b53_mmap_phy_write16 (struct b53_device *dev,int addr,int reg, +u16 value) +{ +return -EIO ; +} +static const struct b53_io_ops b53_mmap_ops = { .read8 = b53_mmap_read8, .read16 = b53_mmap_read16,
@@ -227,6 +239,8 @@ static const struct b53_io_ops b53_mmap_ops = { .write32 = b53_mmap_write32, .write48 = b53_mmap_write48, .write64 = b53_mmap_write64, + .phy_read16 = b53_mmap_phy_read16, + .phy_write16 = b53_mmap_phy_write16, }; static int b53_mmap_probe_of(struct platform_device *pdev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 45/110 platform/x86: gigabyte-wmi: add support for B650 AORUS ELITE AX
In reply to Greg Kroah-HartmanFrom: Thomas Weißschuh <[email protected]>
[ Upstream commit 441d901fbf669f6360566a4437b1e563b854de4a ]
This has been reported as working.
--- drivers/platform/x86/gigabyte-wmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/gigabyte-wmi.c +1 -0
@@ -151,6 +151,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550I AORUS PRO AX" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550M AORUS PRO-P" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B550M DS3H" ), +DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B650 AORUS ELITE AX" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B660 GAMING X DDR4" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("B660I AORUS PRO DDR4" ), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z390 I AORUS PRO WIFI-CF"),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 46/110 s390/ptrace: fix PTRACE_GET_LAST_BREAK error handling
In reply to Greg Kroah-HartmanFrom: Heiko Carstens <[email protected]>
[ Upstream commit f9bbf25e7b2b74b52b2f269216a92657774f239c ]
Return -EFAULT if put_user() for the PTRACE_GET_LAST_BREAK request fails, instead of silently ignoring it.
--- arch/s390/kernel/ptrace.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
arch/s390/kernel/ptrace.c +2 -6
@@ -474,9 +474,7 @@ long arch_ptrace(struct task_struct *child, long request, }return 0 ;case PTRACE_GET_LAST_BREAK : -put_user (child->thread.last_break, - (unsigned long __user *) data); -return 0 ; +return put_user (child->thread.last_break, (unsigned long __user *)data);case PTRACE_ENABLE_TE :if (!MACHINE_HAS_TE )return -EIO ;
@@ -824,9 +822,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, }return 0 ;case PTRACE_GET_LAST_BREAK : -put_user (child->thread.last_break, - (unsigned int __user *) data); -return 0 ; +return put_user (child->thread.last_break, (unsigned int __user *)data); }return compat_ptrace_request (child, request, addr, data); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 47/110 drm: buddy_allocator: Fix buddy allocator init on 32-bit systems
In reply to Greg Kroah-HartmanFrom: David Gow <[email protected]>
[ Upstream commit 4453545b5b4c3eff941f69a5530f916d899db025 ]
The drm buddy allocator tests were broken on 32-bit systems, as rounddown_pow_of_two() takes a long, and the buddy allocator handles 64-bit sizes even on 32-bit systems.
This can be reproduced with the drm_buddy_allocator KUnit tests on i386:
./tools/testing/kunit/kunit.py run --arch i386 \ --kunitconfig ./drivers/gpu/drm/tests drm_buddy
(It results in kernel BUG_ON() when too many blocks are created, due to the block size being too small.)
This was independently uncovered (and fixed) by Luís Mendes, whose patch added a new u64 variant of rounddown_pow_of_two(). This version instead recalculates the size based on the order.
--- drivers/gpu/drm/drm_buddy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_buddy.c +2 -2
@@ -146,8 +146,8 @@ int drm_buddy_init(struct drm_buddy *mm, u64 size, u64 chunk_size)unsigned int order;u64 root_size; - root_size =rounddown_pow_of_two (size); - order =ilog2 (root_size) -ilog2 (chunk_size); + order =ilog2 (size) -ilog2 (chunk_size); + root_size = chunk_size << order; root =drm_block_alloc (mm,NULL , order, offset);if (!root)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 48/110 drm: test: Fix 32-bit issue in drm_buddy_test
In reply to Greg Kroah-HartmanFrom: David Gow <[email protected]>
[ Upstream commit 25bbe844ef5c4fb4d7d8dcaa0080f922b7cd3a16 ]
The drm_buddy_test KUnit tests verify that returned blocks have sizes which are powers of two using is_power_of_2(). However, is_power_of_2() operations on a 'long', but the block size is a u64. So on systems where long is 32-bit, this can sometimes fail even on correctly sized blocks.
This only reproduces randomly, as the parameters passed to the buddy allocator in this test are random. The seed 0xb2e06022 reproduced it fine here.
For now, just hardcode an is_power_of_2() implementation using x & (x - 1).
--- drivers/gpu/drm/tests/drm_buddy_test.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/tests/drm_buddy_test.c +2 -1
@@ -89,7 +89,8 @@ static int check_block(struct kunit *test, struct drm_buddy *mm, err = -EINVAL ; } -if (!is_power_of_2 (block_size)) { +/* We can't use is_power_of_2() for a u64 on 32-bit systems. */ +if (block_size & (block_size -1 )) {kunit_err (test,"block size not power of two\n" ); err = -EINVAL ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 49/110 nvme-tcp: fix a possible UAF when failing to allocate an io queue
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 88eaba80328b31ef81813a1207b4056efd7006a6 ]
When we allocate a nvme-tcp queue, we set the data_ready callback before we actually need to use it. This creates the potential that if a stray controller sends us data on the socket before we connect, we can trigger the io_work and start consuming the socket.
In this case reported: we failed to allocate one of the io queues, and as we start releasing the queues that we already allocated, we get a UAF [1] from the io_work which is running before it should really.
Fix this by setting the socket ops callbacks only before we start the queue, so that we can't accidentally schedule the io_work in the initialization phase before the queue started. While we are at it, rename nvme_tcp_restore_sock_calls to pair with nvme_tcp_setup_sock_ops.
[1]:
[16802.107284] nvme nvme4: starting error recovery [16802.109166] nvme nvme4: Reconnecting in 10 seconds... [16812.173535] nvme nvme4: failed to connect socket: -111 [16812.173745] nvme nvme4: Failed reconnect attempt 1 [16812.173747] nvme nvme4: Reconnecting in 10 seconds... [16822.413555] nvme nvme4: failed to connect socket: -111 [16822.413762] nvme nvme4: Failed reconnect attempt 2 [16822.413765] nvme nvme4: Reconnecting in 10 seconds... [16832.661274] nvme nvme4: creating 32 I/O queues. [16833.919887] BUG: kernel NULL pointer dereference, address: 0000000000000088 [16833.920068] nvme nvme4: Failed reconnect attempt 3 [16833.920094] #PF: supervisor write access in kernel mode [16833.920261] nvme nvme4: Reconnecting in 10 seconds... [16833.920368] #PF: error_code(0x0002) - not-present page [16833.921086] Workqueue: nvme_tcp_wq nvme_tcp_io_work [nvme_tcp] [16833.921191] RIP: 0010:_raw_spin_lock_bh+0x17/0x30 ... [16833.923138] Call Trace: [16833.923271] <TASK> [16833.923402] lock_sock_nested+0x1e/0x50 [16833.923545] nvme_tcp_try_recv+0x40/0xa0 [nvme_tcp] [16833.923685] nvme_tcp_io_work+0x68/0xa0 [nvme_tcp] [16833.923824] process_one_work+0x1e8/0x390 [16833.923969] worker_thread+0x53/0x3d0 [16833.924104] ? process_one_work+0x390/0x390 [16833.924240] kthread+0x124/0x150 [16833.924376] ? set_kthread_struct+0x50/0x50 [16833.924518] ret_from_fork+0x1f/0x30 [16833.924655] </TASK>
--- drivers/nvme/host/tcp.c | 46 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-)
drivers/nvme/host/tcp.c +26 -20
@@ -1605,22 +1605,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid)if (ret) goto err_init_connect; - queue->rd_enabled = true;set_bit (NVME_TCP_Q_ALLOCATED , &queue->flags); -nvme_tcp_init_recv_ctx (queue); - -write_lock_bh (&queue->sock->sk->sk_callback_lock); - queue->sock->sk->sk_user_data = queue; - queue->state_change = queue->sock->sk->sk_state_change; - queue->data_ready = queue->sock->sk->sk_data_ready; - queue->write_space = queue->sock->sk->sk_write_space; - queue->sock->sk->sk_data_ready = nvme_tcp_data_ready; - queue->sock->sk->sk_state_change = nvme_tcp_state_change; - queue->sock->sk->sk_write_space = nvme_tcp_write_space; -#ifdef CONFIG_NET_RX_BUSY_POLL - queue->sock->sk->sk_ll_usec =1 ; -#endif -write_unlock_bh (&queue->sock->sk->sk_callback_lock);return 0 ;
@@ -1640,7 +1625,7 @@ static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid)return ret; } -static void nvme_tcp_restore_sock_calls (struct nvme_tcp_queue *queue) +static void nvme_tcp_restore_sock_ops (struct nvme_tcp_queue *queue) {struct socket *sock = queue->sock;
@@ -1655,7 +1640,7 @@ static void nvme_tcp_restore_sock_calls(struct nvme_tcp_queue *queue)static void __nvme_tcp_stop_queue (struct nvme_tcp_queue *queue) {kernel_sock_shutdown (queue->sock,SHUT_RDWR ); -nvme_tcp_restore_sock_calls (queue); +nvme_tcp_restore_sock_ops (queue);cancel_work_sync (&queue->io_work); }
@@ -1673,21 +1658,42 @@ static void nvme_tcp_stop_queue(struct nvme_ctrl *nctrl, int qid)mutex_unlock (&queue->queue_lock); } +static void nvme_tcp_setup_sock_ops (struct nvme_tcp_queue *queue) +{ +write_lock_bh (&queue->sock->sk->sk_callback_lock); + queue->sock->sk->sk_user_data = queue; + queue->state_change = queue->sock->sk->sk_state_change; + queue->data_ready = queue->sock->sk->sk_data_ready; + queue->write_space = queue->sock->sk->sk_write_space; + queue->sock->sk->sk_data_ready = nvme_tcp_data_ready; + queue->sock->sk->sk_state_change = nvme_tcp_state_change; + queue->sock->sk->sk_write_space = nvme_tcp_write_space; +#ifdef CONFIG_NET_RX_BUSY_POLL + queue->sock->sk->sk_ll_usec =1 ; +#endif +write_unlock_bh (&queue->sock->sk->sk_callback_lock); +} +static int nvme_tcp_start_queue (struct nvme_ctrl *nctrl,int idx) {struct nvme_tcp_ctrl *ctrl =to_tcp_ctrl (nctrl); +struct nvme_tcp_queue *queue = &ctrl->queues[idx];int ret; + queue->rd_enabled = true; +nvme_tcp_init_recv_ctx (queue); +nvme_tcp_setup_sock_ops (queue); +if (idx) ret =nvmf_connect_io_queue (nctrl, idx);else ret =nvmf_connect_admin_queue (nctrl);if (!ret) { -set_bit (NVME_TCP_Q_LIVE , &ctrl->queues[idx].flags); +set_bit (NVME_TCP_Q_LIVE , &queue->flags); }else { -if (test_bit (NVME_TCP_Q_ALLOCATED , &ctrl->queues[idx].flags)) -__nvme_tcp_stop_queue (&ctrl->queues[idx]); +if (test_bit (NVME_TCP_Q_ALLOCATED , &queue->flags)) +__nvme_tcp_stop_queue (queue);dev_err (nctrl->device,"failed to connect queue: %d ret=%d\n" , idx, ret); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 50/110 xen/netback: use same error messages for same errors
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
[ Upstream commit 2eca98e5b24d01c02b46c67be05a5f98cc9789b1 ]
Issue the same error message in case an illegal page boundary crossing has been detected in both cases where this is tested.
--- drivers/net/xen-netback/netback.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/net/xen-netback/netback.c +2 -4
@@ -996,10 +996,8 @@ static void xenvif_tx_build_gops(struct xenvif_queue *queue,/* No crossing a page as the payload mustn't fragment. */ if (unlikely ((txreq.offset + txreq.size) >XEN_PAGE_SIZE )) { -netdev_err (queue->vif->dev, -"txreq.offset: %u, size: %u, end: %lu\n" , - txreq.offset, txreq.size, - (unsigned long )(txreq.offset&~XEN_PAGE_MASK ) + txreq.size); +netdev_err (queue->vif->dev,"Cross page boundary, txreq.offset: %u, size: %u\n" , + txreq.offset, txreq.size);xenvif_fatal_tx_err (queue->vif);break ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 51/110 platform/x86: gigabyte-wmi: add support for X570S AORUS ELITE
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 52f91e51944808d83dfe2d5582601b5e84e472cc ]
Add "X570S AORUS ELITE" to known working boards
--- drivers/platform/x86/gigabyte-wmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/gigabyte-wmi.c +1 -0
@@ -161,6 +161,7 @@ static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 GAMING X" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 I AORUS PRO WIFI" ),DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570 UD" ), +DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME ("X570S AORUS ELITE" ), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("Z690M AORUS ELITE AX DDR4"), { } };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 52/110 platform/x86: asus-nb-wmi: Add quirk_asus_tablet_mode to other ROG Flow X13 models
In reply to Greg Kroah-HartmanFrom: weiliang1503 <[email protected]>
[ Upstream commit e352d685fde427a8fc9beb2ba30888f5d6f2e5e6 ]
Make quirk_asus_tablet_mode apply on other ROG Flow X13 devices, which only affects the GV301Q model before.
--- drivers/platform/x86/asus-nb-wmi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/platform/x86/asus-nb-wmi.c +2 -1
@@ -464,7 +464,8 @@ static const struct dmi_system_id asus_quirks[] = { .ident = "ASUS ROG FLOW X13", .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), - DMI_MATCH(DMI_PRODUCT_NAME, "GV301Q"), +/* Match GV301** */ + DMI_MATCH(DMI_PRODUCT_NAME, "GV301"), }, .driver_data = &quirk_asus_tablet_mode, },
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 53/110 mtd: spi-nor: fix memory leak when using debugfs_lookup()
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
[ Upstream commit ec738ca127d07ecac6afae36e2880341ec89150e ]
When calling debugfs_lookup() the result must have dput() called on it, otherwise the memory will leak over time. To solve this, remove the lookup and create the directory on the first device found, and then remove it when the module is unloaded.
--- drivers/mtd/spi-nor/core.c | 14 +++++++++++++- drivers/mtd/spi-nor/core.h | 2 ++ drivers/mtd/spi-nor/debugfs.c | 11 ++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-)
drivers/mtd/spi-nor/core.c +13 -1
@@ -3344,7 +3344,19 @@ static struct spi_mem_driver spi_nor_driver = { .remove = spi_nor_remove, .shutdown = spi_nor_shutdown, }; -module_spi_mem_driver (spi_nor_driver); + +static int __init spi_nor_module_init (void ) +{ +return spi_mem_driver_register (&spi_nor_driver); +} +module_init (spi_nor_module_init); + +static void __exit spi_nor_module_exit(void) +{ +spi_mem_driver_unregister (&spi_nor_driver); +spi_nor_debugfs_shutdown (); +} +module_exit (spi_nor_module_exit);MODULE_LICENSE ("GPL v2" );MODULE_AUTHOR ("Huang Shijie <[email protected]>" );
drivers/mtd/spi-nor/core.h +2 -0
@@ -714,8 +714,10 @@ static inline struct spi_nor *mtd_to_spi_nor(struct mtd_info *mtd)#ifdef CONFIG_DEBUG_FS void spi_nor_debugfs_register (struct spi_nor *nor); +void spi_nor_debugfs_shutdown (void );#else static inline void spi_nor_debugfs_register (struct spi_nor *nor) {} +static inline void spi_nor_debugfs_shutdown (void ) {}#endif #endif /* __LINUX_MTD_SPI_NOR_INTERNAL_H */
drivers/mtd/spi-nor/debugfs.c +8 -3
@@ -226,13 +226,13 @@ static void spi_nor_debugfs_unregister(void *data) nor->debugfs_root =NULL ; } +static struct dentry *rootdir; +void spi_nor_debugfs_register (struct spi_nor *nor) { -struct dentry *rootdir, *d; +struct dentry *d;int ret; -/* Create rootdir once. Will never be deleted again. */ - rootdir =debugfs_lookup (SPI_NOR_DEBUGFS_ROOT ,NULL );if (!rootdir) rootdir =debugfs_create_dir (SPI_NOR_DEBUGFS_ROOT ,NULL );
@@ -247,3 +247,8 @@ void spi_nor_debugfs_register(struct spi_nor *nor)debugfs_create_file ("capabilities" ,0444 , d, nor, &spi_nor_capabilities_fops); } + +void spi_nor_debugfs_shutdown (void ) +{ +debugfs_remove (rootdir); +}
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 54/110 pwm: Zero-initialize the pwm_state passed to drivers .get_state()
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
commit 1271a7b98e7989ba6bb978e14403fc84efe16e13 upstream.
This is just to ensure that .usage_power is properly initialized and doesn't contain random stack data. The other members of struct pwm_state should get a value assigned in a successful call to .get_state(). So in the absence of bugs in driver implementations, this is only a safe-guard and no fix.
--- drivers/pwm/core.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/pwm/core.c +10 -2
@@ -115,7 +115,14 @@ static int pwm_device_request(struct pwm }if (pwm->chip->ops->get_state) { -struct pwm_state state; +/* +* Zero-initialize state because most drivers are unaware of +* .usage_power. The other members of state are supposed to be +* set by lowlevel drivers. We still initialize the whole +* structure for simplicity even though this might paper over +* faulty implementations of .get_state(). +*/ +struct pwm_state state = {0 , }; err = pwm->chip->ops->get_state (pwm->chip, pwm, &state);trace_pwm_get (pwm, &state, err);
@@ -448,7 +455,7 @@ static void pwm_apply_state_debug(struct {struct pwm_state *last = &pwm->last;struct pwm_chip *chip = pwm->chip; -struct pwm_state s1, s2; +struct pwm_state s1 = {0 }, s2 = {0 };int err;if (!IS_ENABLED (CONFIG_PWM_DEBUG ))
@@ -530,6 +537,7 @@ static void pwm_apply_state_debug(structreturn ; } + *last = (struct pwm_state ){0 }; err = chip->ops->get_state (chip, pwm, last);trace_pwm_get (pwm, last, err);if (err)
Greg Kroah-Hartman
maintainerPATCH 55/110 Revert "userfaultfd: dont fail on unrecognized features"
In reply to Greg Kroah-HartmanFrom: Peter Xu <[email protected]>
commit 2ff559f31a5d50c31a3f9d849f8af90dc36c7105 upstream.
This is a proposal to revert commit 914eedcb9ba0ff53c33808.
I found this when writing a simple UFFDIO_API test to be the first unit test in this set. Two things breaks with the commit:
- UFFDIO_API check was lost and missing. According to man page, the kernel should reject ioctl(UFFDIO_API) if uffdio_api.api != 0xaa. This check is needed if the api version will be extended in the future, or user app won't be able to identify which is a new kernel.
- Feature flags checks were removed, which means UFFDIO_API with a feature that does not exist will also succeed. According to the man page, we should (and it makes sense) to reject ioctl(UFFDIO_API) if unknown features passed in.
--- fs/userfaultfd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/userfaultfd.c +4 -2
@@ -1966,8 +1966,10 @@ static int userfaultfd_api(struct userfa ret = -EFAULT ;if (copy_from_user (&uffdio_api, buf,sizeof (uffdio_api))) goto out; -/* Ignore unsupported features (userspace built against newer kernel) */ - features = uffdio_api.features &UFFD_API_FEATURES ; + features = uffdio_api.features; + ret = -EINVAL ; +if (uffdio_api.api !=UFFD_API || (features & ~UFFD_API_FEATURES )) + goto err_out; ret = -EPERM ;if ((features &UFFD_FEATURE_EVENT_FORK ) && !capable (CAP_SYS_PTRACE )) goto err_out;
Greg Kroah-Hartman
maintainerPATCH 56/110 Revert "ACPICA: Events: Support fixed PCIe wake event"
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 8e41e0a575664d26bb87e012c39435c4c3914ed9 upstream.
This reverts commit 5c62d5aab8752e5ee7bfbe75ed6060db1c787f98.
This broke wake-on-lan for multiple people, and for much too long.
--- drivers/acpi/acpica/evevent.c | 11 ----------- drivers/acpi/acpica/hwsleep.c | 14 -------------- drivers/acpi/acpica/utglobal.c | 4 ---- include/acpi/actypes.h | 3 +-- 4 files changed, 1 insertion(+), 31 deletions(-)
drivers/acpi/acpica/evevent.c +0 -11
@@ -142,9 +142,6 @@ static acpi_status acpi_ev_fixed_event_i status =acpi_write_bit_register (acpi_gbl_fixed_event_info [i].enable_register_id, - (i == -ACPI_EVENT_PCIE_WAKE ) ? -ACPI_ENABLE_EVENT :ACPI_DISABLE_EVENT );if (ACPI_FAILURE (status)) {return (status);
@@ -188,11 +185,6 @@ u32 acpi_ev_fixed_event_detect(void)return (int_status); } -if (fixed_enable &ACPI_BITMASK_PCIEXP_WAKE_DISABLE ) - fixed_enable &= ~ACPI_BITMASK_PCIEXP_WAKE_DISABLE ; -else - fixed_enable |=ACPI_BITMASK_PCIEXP_WAKE_DISABLE ; -ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS ,"Fixed Event Block: Enable %08X Status %08X\n" , fixed_enable, fixed_status));
@@ -258,9 +250,6 @@ static u32 acpi_ev_fixed_event_dispatch(if (!acpi_gbl_fixed_event_handlers[event].handler) { (void )acpi_write_bit_register (acpi_gbl_fixed_event_info[event]. enable_register_id, - (event == -ACPI_EVENT_PCIE_WAKE ) ? -ACPI_ENABLE_EVENT :ACPI_DISABLE_EVENT ); ACPI_ERROR((AE_INFO,
drivers/acpi/acpica/hwsleep.c +0 -14
@@ -311,20 +311,6 @@ acpi_status acpi_hw_legacy_wake(u8 sleep [ACPI_EVENT_SLEEP_BUTTON ]. status_register_id, ACPI_CLEAR_STATUS); -/* Enable pcie wake event if support */ -if ((acpi_gbl_FADT.flags &ACPI_FADT_PCI_EXPRESS_WAKE )) { - (void ) -acpi_write_bit_register (acpi_gbl_fixed_event_info - [ACPI_EVENT_PCIE_WAKE ]. - enable_register_id, -ACPI_DISABLE_EVENT ); - (void ) -acpi_write_bit_register (acpi_gbl_fixed_event_info - [ACPI_EVENT_PCIE_WAKE ]. - status_register_id, -ACPI_CLEAR_STATUS ); - } -acpi_hw_execute_sleep_method (METHOD_PATHNAME__SST ,ACPI_SST_WORKING );return_ACPI_STATUS (status); }
drivers/acpi/acpica/utglobal.c +0 -4
@@ -186,10 +186,6 @@ struct acpi_fixed_event_info acpi_gbl_fiACPI_BITREG_RT_CLOCK_ENABLE ,ACPI_BITMASK_RT_CLOCK_STATUS , ACPI_BITMASK_RT_CLOCK_ENABLE}, - /* ACPI_EVENT_PCIE_WAKE */ {ACPI_BITREG_PCIEXP_WAKE_STATUS, -ACPI_BITREG_PCIEXP_WAKE_DISABLE , -ACPI_BITMASK_PCIEXP_WAKE_STATUS , - ACPI_BITMASK_PCIEXP_WAKE_DISABLE}, };#endif /* !ACPI_REDUCED_HARDWARE */
include/acpi/actypes.h +1 -2
@@ -723,8 +723,7 @@ typedef u32 acpi_event_type;#define ACPI_EVENT_POWER_BUTTON 2#define ACPI_EVENT_SLEEP_BUTTON 3#define ACPI_EVENT_RTC 4 -#define ACPI_EVENT_PCIE_WAKE 5 -#define ACPI_EVENT_MAX 5 +#define ACPI_EVENT_MAX 4#define ACPI_NUM_FIXED_EVENTS ACPI_EVENT_MAX + 1/*
Greg Kroah-Hartman
maintainerPATCH 57/110 iio: dac: ad5755: Add missing fwnode_handle_put()
In reply to Greg Kroah-HartmanFrom: Liang He <[email protected]>
commit ffef73791574b8da872cfbf881d8e3e9955fc130 upstream.
In ad5755_parse_fw(), we should add fwnode_handle_put() when break out of the iteration device_for_each_child_node() as it will automatically increase and decrease the refcounter.
--- drivers/iio/dac/ad5755.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/dac/ad5755.c +1 -0
@@ -802,6 +802,7 @@ static struct ad5755_platform_data *ad57return pdata; error_out: +fwnode_handle_put (pp);devm_kfree (dev, pdata);return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 58/110 iio: light: tsl2772: fix reading proximity-diodes from device tree
In reply to Greg Kroah-HartmanFrom: Brian Masney <[email protected]>
commit b1cb00d51e361cf5af93649917d9790e1623647e upstream.
tsl2772_read_prox_diodes() will correctly parse the properties from device tree to determine which proximity diode(s) to read from, however it didn't actually set this value on the struct tsl2772_settings. Let's go ahead and fix that.
--- drivers/iio/light/tsl2772.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/light/tsl2772.c +1 -0
@@ -601,6 +601,7 @@ static int tsl2772_read_prox_diodes(strureturn -EINVAL ; } } + chip->settings.prox_diode = prox_diode_mask;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 59/110 ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook
In reply to Greg Kroah-HartmanFrom: Andy Chi <[email protected]>
commit 2ae147d643d326f74d93ba4f72a405f25f2677ea upstream.
There is a HP ProBook 455 G10 which using ALC236 codec and need the ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF quirk to make mute LED and micmute LED work.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9468,6 +9468,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x8b47 ,"HP" ,ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x8b5d ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8b5e ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), +SND_PCI_QUIRK (0x103c ,0x8b65 ,"HP ProBook 455 15.6 inch G10 Notebook PC" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8b66 ,"HP" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ),SND_PCI_QUIRK (0x103c ,0x8b7a ,"HP" ,ALC236_FIXUP_HP_GPIO_LED ), SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
Greg Kroah-Hartman
maintainerPATCH 60/110 btrfs: set default discard iops_limit to 1000
In reply to Greg Kroah-HartmanFrom: Boris Burkov <[email protected]>
commit e9f59429b87d35cf23ae9ca19629bd686a1c0304 upstream.
Previously, the default was a relatively conservative 10. This results in a 100ms delay, so with ~300 discards in a commit, it takes the full 30s till the next commit to finish the discards. On a workstation, this results in the disk never going idle, wasting power/battery, etc.
Set the default to 1000, which results in using the smallest possible delay, currently, which is 1ms. This has shown to not pathologically keep the disk busy by the original reporter.
--- fs/btrfs/discard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/discard.c +1 -1
@@ -60,7 +60,7 @@#define BTRFS_DISCARD_TARGET_MSEC (6 * 60 * 60UL * MSEC_PER_SEC)#define BTRFS_DISCARD_MIN_DELAY_MSEC (1UL)#define BTRFS_DISCARD_MAX_DELAY_MSEC (1000UL) -#define BTRFS_DISCARD_MAX_IOPS (10U) +#define BTRFS_DISCARD_MAX_IOPS (1000U)/* Monotonically decreasing minimum length filters after index 0 */ static int discard_minlen[BTRFS_NR_DISCARD_LISTS ] = {
Greg Kroah-Hartman
maintainerPATCH 61/110 btrfs: reinterpret async discard iops_limit=0 as no delay
In reply to Greg Kroah-HartmanFrom: Boris Burkov <[email protected]>
commit ef9cddfe57d86aac6b509b550136395669159b30 upstream.
Currently, a limit of 0 results in a hard coded metering over 6 hours. Since the default is a set limit, I suspect no one truly depends on this rather arbitrary setting. Repurpose it for an arguably more useful "unlimited" mode, where the delay is 0.
Note that if block groups are too new, or go fully empty, there is still a delay associated with those conditions. Those delays implement heuristics for not trimming a region we are relatively likely to fully overwrite soon.
--- fs/btrfs/discard.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
fs/btrfs/discard.c +12 -7
@@ -56,8 +56,6 @@#define BTRFS_DISCARD_DELAY (120ULL * NSEC_PER_SEC)#define BTRFS_DISCARD_UNUSED_DELAY (10ULL * NSEC_PER_SEC) -/* Target completion latency of discarding all discardable extents */ -#define BTRFS_DISCARD_TARGET_MSEC (6 * 60 * 60UL * MSEC_PER_SEC)#define BTRFS_DISCARD_MIN_DELAY_MSEC (1UL)#define BTRFS_DISCARD_MAX_DELAY_MSEC (1000UL)#define BTRFS_DISCARD_MAX_IOPS (1000U)
@@ -577,6 +575,7 @@ void btrfs_discard_calc_delay(struct btrs32 discardable_extents;s64 discardable_bytes;u32 iops_limit; +unsigned long min_delay =BTRFS_DISCARD_MIN_DELAY_MSEC ;unsigned long delay; discardable_extents =atomic_read (&discard_ctl->discardable_extents);
@@ -607,13 +606,19 @@ void btrfs_discard_calc_delay(struct btr } iops_limit =READ_ONCE (discard_ctl->iops_limit); -if (iops_limit) + +if (iops_limit) { delay =MSEC_PER_SEC / iops_limit; -else - delay =BTRFS_DISCARD_TARGET_MSEC / discardable_extents; + }else { +/* +* Unset iops_limit means go as fast as possible, so allow a +* delay of 0. +*/ + delay =0 ; + min_delay =0 ; + } - delay =clamp (delay,BTRFS_DISCARD_MIN_DELAY_MSEC , -BTRFS_DISCARD_MAX_DELAY_MSEC ); + delay =clamp (delay, min_delay,BTRFS_DISCARD_MAX_DELAY_MSEC ); discard_ctl->delay_ms = delay;spin_unlock (&discard_ctl->lock);
Greg Kroah-Hartman
maintainerPATCH 62/110 rust: kernel: Mark rust_fmt_argument as extern "C"
In reply to Greg Kroah-HartmanFrom: David Gow <[email protected]>
commit c682e4c37d2b8ba3bde1125cbbea4ee88824b4e2 upstream.
The rust_fmt_argument function is called from printk() to handle the %pA format specifier.
Since it's called from C, we should mark it extern "C" to make sure it's ABI compatible.
--- rust/kernel/print.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
rust/kernel/print.rs +5 -1
@@ -18,7 +18,11 @@ use crate::bindings;// Called from `vsprintf` with format specifier `%pA`. #[no_mangle] -unsafe fn rust_fmt_argument (buf: *mut c_char , end: *mut c_char , ptr: *const c_void ) -> *mut c_char { +unsafe extern "C" fn rust_fmt_argument ( + buf: *mut c_char , + end: *mut c_char , + ptr: *const c_void , +) -> *mut c_char {use fmt::Write ;// SAFETY: The C contract guarantees that `buf` is valid if it's less than `end`. let mut w =unsafe {RawFormatter ::from_ptrs (buf.cast (), end.cast ()) };
Greg Kroah-Hartman
maintainerPATCH 63/110 LoongArch: module: set section addresses to 0x0
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit 93eb1215ed794a18ba8753e0654f069d58838966 upstream.
These got*, plt* and .text.ftrace_trampoline sections specified for LoongArch have non-zero addressses. Non-zero section addresses in a relocatable ELF would confuse GDB when it tries to compute the section offsets and it ends up printing wrong symbol addresses. Therefore, set them to zero, which mirrors the change in commit 5d8591bc0fbaeb6ded ("arm64 module: set plt* section addresses to 0x0").
--- arch/loongarch/include/asm/module.lds.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/loongarch/include/asm/module.lds.h +4 -4
@@ -2,8 +2,8 @@/* Copyright (C) 2020-2022 Loongson Technology Corporation Limited */ SECTIONS { . = ALIGN(4); - .got : { BYTE(0) } - .plt : { BYTE(0) } - .plt.idx : { BYTE(0) } - .ftrace_trampoline : { BYTE(0) } + .got 0 : { BYTE(0) } + .plt 0 : { BYTE(0) } + .plt.idx 0 : { BYTE(0) } + .ftrace_trampoline 0 : { BYTE(0) } }
Greg Kroah-Hartman
maintainerPATCH 64/110 LoongArch: Check unwind_error() in arch_stack_walk()
In reply to Greg Kroah-HartmanFrom: Tiezhu Yang <[email protected]>
commit 370a3b8f58743eceb97c5256538d6048c26d2d03 upstream.
We can see the following messages with CONFIG_PROVE_LOCKING=y on LoongArch:
BUG: MAX_STACK_TRACE_ENTRIES too low! turning off the locking correctness validator.
This is because stack_trace_save() returns a big value after call arch_stack_walk(), here is the call trace:
save_trace()
stack_trace_save()
arch_stack_walk()
stack_trace_consume_entry()
arch_stack_walk() should return immediately if unwind_next_frame() failed, no need to do the useless loops to increase the value of c->len in stack_trace_consume_entry(), then we can fix the above problem.
--- arch/loongarch/kernel/stacktrace.c | 2 +- arch/loongarch/kernel/unwind.c | 1 + arch/loongarch/kernel/unwind_prologue.c | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-)
arch/loongarch/kernel/stacktrace.c +1 -1
@@ -30,7 +30,7 @@ void arch_stack_walk(stack_trace_consume regs->regs[1 ] =0 ;for (unwind_start (&state, task, regs); - !unwind_done (&state);unwind_next_frame (&state)) { + !unwind_done (&state) && !unwind_error (&state);unwind_next_frame (&state)) { addr =unwind_get_return_address (&state);if (!addr || !consume_entry (cookie, addr))break ;
arch/loongarch/kernel/unwind.c +1 -0
@@ -28,5 +28,6 @@ bool default_next_frame(struct unwind_st }while (!get_stack_info (state->sp, state->task, info)); + state->error = true;return false; }
arch/loongarch/kernel/unwind_prologue.c +3 -1
@@ -211,7 +211,7 @@ static bool next_frame(struct unwind_sta pc = regs->csr_era;if (user_mode (regs) || !__kernel_text_address (pc)) -return false; + goto out; state->first = true; state->pc = pc;
@@ -226,6 +226,8 @@ static bool next_frame(struct unwind_sta }while (!get_stack_info (state->sp, state->task, info)); +out: + state->error = true;return false; }
Greg Kroah-Hartman
maintainerPATCH 65/110 LoongArch: Fix probing of the CRC32 feature
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit df830336045db1246d3245d3737fee9939c5f731 upstream.
Not all LoongArch processors support CRC32 instructions. This feature is indicated by CPUCFG1.CRC32 (Bit25) but it is wrongly defined in the previous versions of the ISA manual (and so does in loongarch.h). The CRC32 feature is set unconditionally now, so fix it.
BTW, expose the CRC32 feature in /proc/cpuinfo.
--- arch/loongarch/include/asm/cpu-features.h | 1 arch/loongarch/include/asm/cpu.h | 40 +++++++++++++++--------------- arch/loongarch/include/asm/loongarch.h | 2 - arch/loongarch/kernel/cpu-probe.c | 7 ++++- arch/loongarch/kernel/proc.c | 1 5 files changed, 30 insertions(+), 21 deletions(-)
arch/loongarch/include/asm/cpu-features.h +1 -0
@@ -42,6 +42,7 @@#define cpu_has_fpu cpu_opt(LOONGARCH_CPU_FPU)#define cpu_has_lsx cpu_opt(LOONGARCH_CPU_LSX)#define cpu_has_lasx cpu_opt(LOONGARCH_CPU_LASX) +#define cpu_has_crc32 cpu_opt(LOONGARCH_CPU_CRC32)#define cpu_has_complex cpu_opt(LOONGARCH_CPU_COMPLEX)#define cpu_has_crypto cpu_opt(LOONGARCH_CPU_CRYPTO)#define cpu_has_lvz cpu_opt(LOONGARCH_CPU_LVZ)
arch/loongarch/include/asm/cpu.h +21 -19
@@ -78,25 +78,26 @@ enum cpu_type_enum {#define CPU_FEATURE_FPU 3/* CPU has FPU */ #define CPU_FEATURE_LSX 4/* CPU has LSX (128-bit SIMD) */ #define CPU_FEATURE_LASX 5/* CPU has LASX (256-bit SIMD) */ -#define CPU_FEATURE_COMPLEX 6/* CPU has Complex instructions */ -#define CPU_FEATURE_CRYPTO 7/* CPU has Crypto instructions */ -#define CPU_FEATURE_LVZ 8/* CPU has Virtualization extension */ -#define CPU_FEATURE_LBT_X86 9/* CPU has X86 Binary Translation */ -#define CPU_FEATURE_LBT_ARM 10/* CPU has ARM Binary Translation */ -#define CPU_FEATURE_LBT_MIPS 11/* CPU has MIPS Binary Translation */ -#define CPU_FEATURE_TLB 12/* CPU has TLB */ -#define CPU_FEATURE_CSR 13/* CPU has CSR */ -#define CPU_FEATURE_WATCH 14/* CPU has watchpoint registers */ -#define CPU_FEATURE_VINT 15/* CPU has vectored interrupts */ -#define CPU_FEATURE_CSRIPI 16/* CPU has CSR-IPI */ -#define CPU_FEATURE_EXTIOI 17/* CPU has EXT-IOI */ -#define CPU_FEATURE_PREFETCH 18/* CPU has prefetch instructions */ -#define CPU_FEATURE_PMP 19/* CPU has perfermance counter */ -#define CPU_FEATURE_SCALEFREQ 20/* CPU supports cpufreq scaling */ -#define CPU_FEATURE_FLATMODE 21/* CPU has flat mode */ -#define CPU_FEATURE_EIODECODE 22/* CPU has EXTIOI interrupt pin decode mode */ -#define CPU_FEATURE_GUESTID 23/* CPU has GuestID feature */ -#define CPU_FEATURE_HYPERVISOR 24/* CPU has hypervisor (running in VM) */ +#define CPU_FEATURE_CRC32 6/* CPU has CRC32 instructions */ +#define CPU_FEATURE_COMPLEX 7/* CPU has Complex instructions */ +#define CPU_FEATURE_CRYPTO 8/* CPU has Crypto instructions */ +#define CPU_FEATURE_LVZ 9/* CPU has Virtualization extension */ +#define CPU_FEATURE_LBT_X86 10/* CPU has X86 Binary Translation */ +#define CPU_FEATURE_LBT_ARM 11/* CPU has ARM Binary Translation */ +#define CPU_FEATURE_LBT_MIPS 12/* CPU has MIPS Binary Translation */ +#define CPU_FEATURE_TLB 13/* CPU has TLB */ +#define CPU_FEATURE_CSR 14/* CPU has CSR */ +#define CPU_FEATURE_WATCH 15/* CPU has watchpoint registers */ +#define CPU_FEATURE_VINT 16/* CPU has vectored interrupts */ +#define CPU_FEATURE_CSRIPI 17/* CPU has CSR-IPI */ +#define CPU_FEATURE_EXTIOI 18/* CPU has EXT-IOI */ +#define CPU_FEATURE_PREFETCH 19/* CPU has prefetch instructions */ +#define CPU_FEATURE_PMP 20/* CPU has perfermance counter */ +#define CPU_FEATURE_SCALEFREQ 21/* CPU supports cpufreq scaling */ +#define CPU_FEATURE_FLATMODE 22/* CPU has flat mode */ +#define CPU_FEATURE_EIODECODE 23/* CPU has EXTIOI interrupt pin decode mode */ +#define CPU_FEATURE_GUESTID 24/* CPU has GuestID feature */ +#define CPU_FEATURE_HYPERVISOR 25/* CPU has hypervisor (running in VM) */ #define LOONGARCH_CPU_CPUCFG BIT_ULL(CPU_FEATURE_CPUCFG)#define LOONGARCH_CPU_LAM BIT_ULL(CPU_FEATURE_LAM)
@@ -104,6 +105,7 @@ enum cpu_type_enum {#define LOONGARCH_CPU_FPU BIT_ULL(CPU_FEATURE_FPU)#define LOONGARCH_CPU_LSX BIT_ULL(CPU_FEATURE_LSX)#define LOONGARCH_CPU_LASX BIT_ULL(CPU_FEATURE_LASX) +#define LOONGARCH_CPU_CRC32 BIT_ULL(CPU_FEATURE_CRC32)#define LOONGARCH_CPU_COMPLEX BIT_ULL(CPU_FEATURE_COMPLEX)#define LOONGARCH_CPU_CRYPTO BIT_ULL(CPU_FEATURE_CRYPTO)#define LOONGARCH_CPU_LVZ BIT_ULL(CPU_FEATURE_LVZ)
arch/loongarch/include/asm/loongarch.h +1 -1
@@ -117,7 +117,7 @@ static inline u32 read_cpucfg(u32 reg)#define CPUCFG1_EP BIT(22)#define CPUCFG1_RPLV BIT(23)#define CPUCFG1_HUGEPG BIT(24) -#define CPUCFG1_IOCSRBRD BIT(25) +#define CPUCFG1_CRC32 BIT(25)#define CPUCFG1_MSGINT BIT(26)#define LOONGARCH_CPUCFG2 0x2
arch/loongarch/kernel/cpu-probe.c +6 -1
@@ -94,13 +94,18 @@ static void cpu_probe_common(struct cpui c->options =LOONGARCH_CPU_CPUCFG |LOONGARCH_CPU_CSR |LOONGARCH_CPU_TLB |LOONGARCH_CPU_VINT |LOONGARCH_CPU_WATCH ; - elf_hwcap =HWCAP_LOONGARCH_CPUCFG |HWCAP_LOONGARCH_CRC32 ; + elf_hwcap =HWCAP_LOONGARCH_CPUCFG ; config =read_cpucfg (LOONGARCH_CPUCFG1 );if (config &CPUCFG1_UAL ) { c->options |=LOONGARCH_CPU_UAL ; elf_hwcap |=HWCAP_LOONGARCH_UAL ; } +if (config &CPUCFG1_CRC32 ) { + c->options |=LOONGARCH_CPU_CRC32 ; + elf_hwcap |=HWCAP_LOONGARCH_CRC32 ; + } + config =read_cpucfg (LOONGARCH_CPUCFG2 );if (config &CPUCFG2_LAM ) {
arch/loongarch/kernel/proc.c +1 -0
@@ -76,6 +76,7 @@ static int show_cpuinfo(struct seq_fileif (cpu_has_fpu)seq_printf (m," fpu" );if (cpu_has_lsx)seq_printf (m," lsx" );if (cpu_has_lasx)seq_printf (m," lasx" ); +if (cpu_has_crc32)seq_printf (m," crc32" );if (cpu_has_complex)seq_printf (m," complex" );if (cpu_has_crypto)seq_printf (m," crypto" );if (cpu_has_lvz)seq_printf (m," lvz" );
Greg Kroah-Hartman
maintainerPATCH 66/110 LoongArch: Mark 3 symbol exports as non-GPL
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit dce5ea1d0f45fa612f5760b88614a3f32bc75e3f upstream.
vm_map_base, empty_zero_page and invalid_pmd_table could be accessed widely by some out-of-tree non-GPL but important file systems or drivers (e.g. OpenZFS). Let's use EXPORT_SYMBOL() instead of EXPORT_SYMBOL_GPL() to export them, so as to avoid build errors.
1, Details about vm_map_base:
This is a LoongArch-specific symbol and may be referenced through macros PCI_IOBASE, VMALLOC_START and VMALLOC_END.
2, Details about empty_zero_page:
As it stands today, only 3 architectures export empty_zero_page as a GPL
symbol: IA64, LoongArch and MIPS. LoongArch gets the GPL export by inheriting from MIPS, and the MIPS export was first introduced in commit 497d2adcbf50b ("[MIPS] Export empty_zero_page for sake of the ext4 module."). The IA64 export was similar: commit a7d57ecf4216e ("[IA64] Export three symbols for module use") did so for kvm.
In both IA64 and MIPS, the export of empty_zero_page was done for satisfying some in-kernel component built as module (kvm and ext4 respectively), and given its reasonably low-level nature, GPL is a reasonable choice. But looking at the bigger picture it is evident most other architectures do not regard it as GPL, so in effect the symbol probably should not be treated as such, in favor of consistency.
3, Details about invalid_pmd_table:
Keep consistency with invalid_pte_table and make it be possible by some modules.
--- arch/loongarch/kernel/cpu-probe.c | 2 +- arch/loongarch/mm/init.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/loongarch/kernel/cpu-probe.c +1 -1
@@ -60,7 +60,7 @@ static inline void set_elf_platform(int/* MAP BASE */ unsigned long vm_map_base; -EXPORT_SYMBOL_GPL (vm_map_base); +EXPORT_SYMBOL (vm_map_base);static void cpu_probe_addrbits (struct cpuinfo_loongarch *c) {
arch/loongarch/mm/init.c +2 -2
@@ -41,7 +41,7 @@* don't have to care about aliases on other CPUs. */ unsigned long empty_zero_page, zero_page_mask; -EXPORT_SYMBOL_GPL (empty_zero_page); +EXPORT_SYMBOL (empty_zero_page);EXPORT_SYMBOL (zero_page_mask);void setup_zero_pages (void )
@@ -270,7 +270,7 @@ pud_t invalid_pud_table[PTRS_PER_PUD] __#endif #ifndef __PAGETABLE_PMD_FOLDED pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned_bss; -EXPORT_SYMBOL_GPL (invalid_pmd_table); +EXPORT_SYMBOL (invalid_pmd_table);#endif pte_t invalid_pte_table[PTRS_PER_PTE] __page_aligned_bss;EXPORT_SYMBOL (invalid_pte_table);
Greg Kroah-Hartman
maintainerPATCH 67/110 wifi: ath9k: Dont mark channelmap stack variable read-only in ath9k_mci_update_wlan_channels()
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
commit 0f2a4af27b649c13ba76431552fe49c60120d0f6 upstream.
This partially reverts commit e161d4b60ae3a5356e07202e0bfedb5fad82c6aa.
Turns out the channelmap variable is not actually read-only, it's modified through the MCI_GPM_CLR_CHANNEL_BIT() macro further down in the function, so making it read-only causes page faults when that code is hit.
--- drivers/net/wireless/ath/ath9k/mci.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/ath/ath9k/mci.c +1 -3
@@ -646,9 +646,7 @@ void ath9k_mci_update_wlan_channels(struct ath_softc *sc, bool allow_all)struct ath_hw *ah = sc->sc_ah;struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;struct ath9k_channel *chan = ah->curchan; -static const u32 channelmap[] = { -0x00000000 ,0xffff0000 ,0xffffffff ,0x7fffffff - }; +u32 channelmap[] = {0x00000000 ,0xffff0000 ,0xffffffff ,0x7fffffff };int i;s16 chan_start, chan_end;u16 wlan_chan;
Signature · 1 line
2.40.0
Greg Kroah-Hartman
maintainerPATCH 68/110 maple_tree: make maple state reusable after mas_empty_area_rev()
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
commit fad8e4291da5e3243e086622df63cb952db444d8 upstream.
Stop using maple state min/max for the range by passing through pointers for those values. This will allow the maple state to be reused without resetting.
Also add some logic to fail out early on searching with invalid arguments.
--- lib/maple_tree.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-)
lib/maple_tree.c +13 -14
@@ -4973,7 +4973,8 @@ not_found:* Return: True if found in a leaf, false otherwise. * */ -static bool mas_rev_awalk (struct ma_state *mas,unsigned long size) +static bool mas_rev_awalk (struct ma_state *mas,unsigned long size, +unsigned long *gap_min,unsigned long *gap_max) {enum maple_type type =mte_node_type (mas->node);struct maple_node *node =mas_mn (mas);
@@ -5038,8 +5039,8 @@ static bool mas_rev_awalk(struct ma_statif (unlikely (ma_is_leaf (type))) { mas->offset = offset; - mas->min = min; - mas->max = min + gap -1 ; + *gap_min = min; + *gap_max = min + gap -1 ;return true; }
@@ -5315,6 +5316,9 @@ int mas_empty_area(struct ma_state *mas,unsigned long *pivots;enum maple_type mt; +if (min >= max) +return -EINVAL ; +if (mas_is_start (mas))mas_start (mas);else if (mas->offset >=2 )
@@ -5369,6 +5373,9 @@ int mas_empty_area_rev(struct ma_state * {struct maple_enode *last = mas->node; +if (min >= max) +return -EINVAL ; +if (mas_is_start (mas)) {mas_start (mas); mas->offset =mas_data_end (mas);
@@ -5388,7 +5395,7 @@ int mas_empty_area_rev(struct ma_state * mas->index = min; mas->last = max; -while (!mas_rev_awalk (mas, size)) { +while (!mas_rev_awalk (mas, size, &min, &max)) {if (last == mas->node) {if (!mas_rewind_node (mas))return -EBUSY ;
@@ -5403,17 +5410,9 @@ int mas_empty_area_rev(struct ma_state *if (unlikely (mas->offset ==MAPLE_NODE_SLOTS ))return -EBUSY ; -/* -* mas_rev_awalk() has set mas->min and mas->max to the gap values. If -* the maximum is outside the window we are searching, then use the last -* location in the search. -* mas->max and mas->min is the range of the gap. -* mas->index and mas->last are currently set to the search range. -*/ -/* Trim the upper limit to the max. */ -if (mas->max <= mas->last) - mas->last = mas->max; +if (max <= mas->last) + mas->last = max; mas->index = mas->last - size +1 ;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 69/110 maple_tree: fix mas_empty_area() search
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
commit 06e8fd999334bcd76b4d72d7b9206d4aea89764e upstream.
The internal function of mas_awalk() was incorrectly skipping the last entry in a node, which could potentially be NULL. This is only a problem for the left-most node in the tree - otherwise that NULL would not exist.
Fix mas_awalk() by using the metadata to obtain the end of the node for the loop and the logical pivot as apposed to the raw pivot value.
--- lib/maple_tree.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
lib/maple_tree.c +11 -9
@@ -5064,10 +5064,10 @@ static inline bool mas_anode_descend(str {enum maple_type type =mte_node_type (mas->node);unsigned long pivot, min, gap =0 ; -unsigned char offset; -unsigned long *gaps; -unsigned long *pivots =ma_pivots (mas_mn (mas), type); -void __rcu **slots =ma_slots (mas_mn (mas), type); +unsigned char offset, data_end; +unsigned long *gaps, *pivots; +void __rcu **slots; +struct maple_node *node;bool found = false;if (ma_is_dense (type)) {
@@ -5075,13 +5075,15 @@ static inline bool mas_anode_descend(strreturn true; } - gaps =ma_gaps (mte_to_node (mas->node), type); + node =mas_mn (mas); + pivots =ma_pivots (node, type); + slots =ma_slots (node, type); + gaps =ma_gaps (node, type); offset = mas->offset; min =mas_safe_min (mas, pivots, offset); -for (; offset < mt_slots[type]; offset++) { - pivot =mas_safe_pivot (mas, pivots, offset, type); -if (offset && !pivot) -break ; + data_end =ma_data_end (node, type, pivots, mas->max); +for (; offset <= data_end; offset++) { + pivot =mas_logical_pivot (mas, pivots, offset, type);/* Not within lower bounds */ if (mas->index > pivot)
Greg Kroah-Hartman
maintainerPATCH 70/110 maple_tree: fix a potential memory leak, OOB access, or other unpredictable bug
In reply to Greg Kroah-HartmanFrom: Peng Zhang <[email protected]>
commit 1f5f12ece722aacea1769fb644f27790ede339dc upstream.
In mas_alloc_nodes(), "node->node_count = 0" means to initialize the node_count field of the new node, but the node may not be a new node. It may be a node that existed before and node_count has a value, setting it to 0 will cause a memory leak. At this time, mas->alloc->total will be greater than the actual number of nodes in the linked list, which may cause many other errors. For example, out-of-bounds access in mas_pop_node(), and mas_pop_node() may return addresses that should not be used. Fix it by initializing node_count only for new nodes.
Also, by the way, an if-else statement was removed to simplify the code.
--- lib/maple_tree.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
lib/maple_tree.c +7 -12
@@ -1298,26 +1298,21 @@ static inline void mas_alloc_nodes(struc node = mas->alloc; node->request_count =0 ;while (requested) { - max_req =MAPLE_ALLOC_SLOTS ; -if (node->node_count) { -unsigned int offset = node->node_count; - - slots = (void **)&node->slot[offset]; - max_req -= offset; - }else { - slots = (void **)&node->slot; - } - + max_req =MAPLE_ALLOC_SLOTS - node->node_count; + slots = (void **)&node->slot[node->node_count]; max_req =min (requested, max_req); count =mt_alloc_bulk (gfp, max_req, slots);if (!count) goto nomem_bulk; +if (node->node_count ==0 ) { + node->slot[0 ]->node_count =0 ; + node->slot[0 ]->request_count =0 ; + } + node->node_count += count; allocated += count; node = node->slot[0 ]; - node->node_count =0 ; - node->request_count =0 ; requested -= count; } mas->alloc->total = allocated;
Greg Kroah-Hartman
maintainerPATCH 71/110 ASoC: SOF: ipc4-topology: Clarify bind failure caused by missing fw_module
In reply to Greg Kroah-HartmanFrom: Peter Ujfalusi <[email protected]>
commit de6aa72b265b72bca2b1897d5000c8f0147d3157 upstream.
The original patch uses a feature in lib/vsprintf.c to handle the invalid address when tring to print *_fw_module->man4_module_entry.name when the *rc_fw_module is NULL.
This case is handled by check_pointer_msg() internally and turns the invalid pointer to '(efault)' for printing but it is hiding useful information about the circumstances. Change the print to emmit the name of the widget and a note on which side's fw_module is missing.
Rule: 'Cc: [email protected]' or 'commit <sha1> upstream.'
--- sound/soc/sof/ipc4-topology.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
sound/soc/sof/ipc4-topology.c +6 -4
@@ -1687,10 +1687,12 @@ static int sof_ipc4_route_setup(struct sint ret;if (!src_fw_module || !sink_fw_module) { -/* The NULL module will print as "(efault)" */ -dev_err (sdev->dev,"source %s or sink %s widget weren't set up properly\n" , - src_fw_module->man4_module_entry.name, - sink_fw_module->man4_module_entry.name); +dev_err (sdev->dev, +"cannot bind %s -> %s, no firmware module for: %s%s\n" , + src_widget->widget->name, sink_widget->widget->name, + src_fw_module ?"" :" source" , + sink_fw_module ?"" :" sink" ); +return -ENODEV ; }
Greg Kroah-Hartman
maintainerPATCH 72/110 nilfs2: initialize unused bytes in segment summary blocks
In reply to Greg Kroah-HartmanFrom: Ryusuke Konishi <[email protected]>
commit ef832747a82dfbc22a3702219cc716f449b24e4a upstream.
Syzbot still reports uninit-value in nilfs_add_checksums_on_logs() for KMSAN enabled kernels after applying commit 7397031622e0 ("nilfs2:
initialize "struct nilfs_binfo_dat"->bi_pad field").
This is because the unused bytes at the end of each block in segment summaries are not initialized. So this fixes the issue by padding the unused bytes with null bytes.
--- fs/nilfs2/segment.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
fs/nilfs2/segment.c +20 -0
@@ -430,6 +430,23 @@ static int nilfs_segctor_reset_segment_breturn 0 ; } +/** +* nilfs_segctor_zeropad_segsum - zero pad the rest of the segment summary area +* @sci: segment constructor object +* +* nilfs_segctor_zeropad_segsum() zero-fills unallocated space at the end of +* the current segment summary block. +*/ +static void nilfs_segctor_zeropad_segsum (struct nilfs_sc_info *sci) +{ +struct nilfs_segsum_pointer *ssp; + + ssp = sci->sc_blk_cnt >0 ? &sci->sc_binfo_ptr : &sci->sc_finfo_ptr; +if (ssp->offset < ssp->bh->b_size) +memset (ssp->bh->b_data + ssp->offset,0 , + ssp->bh->b_size - ssp->offset); +} +static int nilfs_segctor_feed_segment (struct nilfs_sc_info *sci) { sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
@@ -438,6 +455,7 @@ static int nilfs_segctor_feed_segment(st* The current segment is filled up * (internal code) */ +nilfs_segctor_zeropad_segsum (sci); sci->sc_curseg =NILFS_NEXT_SEGBUF (sci->sc_curseg);return nilfs_segctor_reset_segment_buffer (sci); }
@@ -542,6 +560,7 @@ static int nilfs_segctor_add_file_block( goto retry; }if (unlikely (required)) { +nilfs_segctor_zeropad_segsum (sci); err =nilfs_segbuf_extend_segsum (segbuf);if (unlikely (err)) goto failed;
@@ -1531,6 +1550,7 @@ static int nilfs_segctor_collect(struct nadd =min_t (int, nadd <<1 ,SC_MAX_SEGDELTA ); sci->sc_stage = prev_stage; } +nilfs_segctor_zeropad_segsum (sci);nilfs_segctor_truncate_segments (sci, sci->sc_curseg, nilfs->ns_sufile);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 73/110 mptcp: stops worker on unaccepted sockets at listener close
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
commit 2a6a870e44dd88f1a6a2893c65ef756a9edfb4c7 upstream.
This is a partial revert of the blamed commit, with a relevant
change: mptcp_subflow_queue_clean() now just change the msk socket status and stop the worker, so that the UaF issue addressed by the blamed commit is not re-introduced.
The above prevents the mptcp worker from running concurrently with inet_csk_listen_stop(), as such race would trigger a warning, as reported by Christoph:
RSP: 002b:00007f784fe09cd8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
WARNING: CPU: 0 PID: 25807 at net/ipv4/inet_connection_sock.c:1387 inet_csk_listen_stop+0x664/0x870 net/ipv4/inet_connection_sock.c:1387 RAX: ffffffffffffffda RBX: 00000000006bc050 RCX: 00007f7850afd6a9 RDX: 0000000000000000 RSI: 0000000020000340 RDI: 0000000000000004 Modules linked in: RBP: 0000000000000002 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00000000006bc05c R13: fffffffffffffea8 R14: 00000000006bc050 R15: 000000000001fe40 </TASK> CPU: 0 PID: 25807 Comm: syz-executor.7 Not tainted 6.2.0-g778e54711659 #7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-2.el7 04/01/2014 RIP: 0010:inet_csk_listen_stop+0x664/0x870 net/ipv4/inet_connection_sock.c:1387 RAX: 0000000000000000 RBX: ffff888100dfbd40 RCX: 0000000000000000 RDX: ffff8881363aab80 RSI: ffffffff81c494f4 RDI: 0000000000000005 RBP: ffff888126dad080 R08: 0000000000000005 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000000 R12: ffff888100dfe040 R13: 0000000000000001 R14: 0000000000000000 R15: ffff888100dfbdd8 FS: 00007f7850a2c800(0000) GS:ffff88813bc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b32d26000 CR3: 000000012fdd8006 CR4: 0000000000770ef0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <TASK> __tcp_close+0x5b2/0x620 net/ipv4/tcp.c:2875 __mptcp_close_ssk+0x145/0x3d0 net/mptcp/protocol.c:2427 mptcp_destroy_common+0x8a/0x1c0 net/mptcp/protocol.c:3277 mptcp_destroy+0x41/0x60 net/mptcp/protocol.c:3304 __mptcp_destroy_sock+0x56/0x140 net/mptcp/protocol.c:2965 __mptcp_close+0x38f/0x4a0 net/mptcp/protocol.c:3057 mptcp_close+0x24/0xe0 net/mptcp/protocol.c:3072 inet_release+0x53/0xa0 net/ipv4/af_inet.c:429 __sock_release+0x4e/0xf0 net/socket.c:651 sock_close+0x15/0x20 net/socket.c:1393 __fput+0xff/0x420 fs/file_table.c:321 task_work_run+0x8b/0xe0 kernel/task_work.c:179 resume_user_mode_work include/linux/resume_user_mode.h:49 [inline] exit_to_user_mode_loop kernel/entry/common.c:171 [inline] exit_to_user_mode_prepare+0x113/0x120 kernel/entry/common.c:203 __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline] syscall_exit_to_user_mode+0x1d/0x40 kernel/entry/common.c:296 do_syscall_64+0x46/0x90 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x72/0xdc RIP: 0033:0x7f7850af70dc RAX: 0000000000000000 RBX: 0000000000000004 RCX: 00007f7850af70dc RDX: 00007f7850a2c800 RSI: 0000000000000002 RDI: 0000000000000003 RBP: 00000000006bd980 R08: 0000000000000000 R09: 00000000000018a0 R10: 00000000316338a4 R11: 0000000000000293 R12: 0000000000211e31 R13: 00000000006bc05c R14: 00007f785062c000 R15: 0000000000211af0
--- net/mptcp/protocol.c | 6 +++- net/mptcp/protocol.h | 1 net/mptcp/subflow.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-)
net/mptcp/protocol.c +5 -1
@@ -2366,8 +2366,12 @@ static void __mptcp_close_ssk(struct socmptcp_subflow_drop_ctx (ssk); }else {/* otherwise tcp will dispose of the ssk and subflow ctx */ -if (ssk->sk_state ==TCP_LISTEN ) +if (ssk->sk_state ==TCP_LISTEN ) { +tcp_set_state (ssk,TCP_CLOSE ); +mptcp_subflow_queue_clean (sk, ssk); +inet_csk_listen_stop (ssk);mptcp_event_pm_listener (ssk,MPTCP_EVENT_LISTENER_CLOSED ); + }__tcp_close (ssk,0 );
net/mptcp/protocol.h +1 -0
@@ -629,6 +629,7 @@ void mptcp_close_ssk(struct sock *sk, st struct mptcp_subflow_context *subflow);void __mptcp_subflow_send_ack (struct sock *ssk);void mptcp_subflow_reset (struct sock *ssk); +void mptcp_subflow_queue_clean (struct sock *sk,struct sock *ssk);void mptcp_sock_graft (struct sock *sk,struct socket *parent);struct socket *__mptcp_nmpc_socket (const struct mptcp_sock *msk);bool __mptcp_close (struct sock *sk,long timeout);
net/mptcp/subflow.c +72 -0
78 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 74/110 mptcp: fix accept vs worker race
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
commit 63740448a32eb662e05894425b47bcc5814136f4 upstream.
The mptcp worker and mptcp_accept() can race, as reported by Christoph:
refcount_t: addition on 0; use-after-free.
WARNING: CPU: 1 PID: 14351 at lib/refcount.c:25 refcount_warn_saturate+0x105/0x1b0 lib/refcount.c:25 Modules linked in: CPU: 1 PID: 14351 Comm: syz-executor.2 Not tainted 6.3.0-rc1-gde5e8fd0123c #11 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-2.el7 04/01/2014 RIP: 0010:refcount_warn_saturate+0x105/0x1b0 lib/refcount.c:25 Code: 02 31 ff 89 de e8 1b f0 a7 ff 84 db 0f 85 6e ff ff ff e8 3e f5 a7 ff 48 c7 c7 d8 c7 34 83 c6 05 6d 2d 0f 02 01 e8 cb 3d 90 ff <0f> 0b e9 4f ff ff ff e8 1f f5 a7 ff 0f b6 1d 54 2d 0f 02 31 ff 89 RSP: 0018:ffffc90000a47bf8 EFLAGS: 00010282 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: ffff88802eae98c0 RSI: ffffffff81097d4f RDI: 0000000000000001 RBP: ffff88802e712180 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000001 R11: ffff88802eaea148 R12: ffff88802e712100 R13: ffff88802e712a88 R14: ffff888005cb93a8 R15: ffff88802e712a88 FS: 0000000000000000(0000) GS:ffff88803ed00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f277fd89120 CR3: 0000000035486002 CR4: 0000000000370ee0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> __refcount_add include/linux/refcount.h:199 [inline] __refcount_inc include/linux/refcount.h:250 [inline] refcount_inc include/linux/refcount.h:267 [inline] sock_hold include/net/sock.h:775 [inline] __mptcp_close+0x4c6/0x4d0 net/mptcp/protocol.c:3051 mptcp_close+0x24/0xe0 net/mptcp/protocol.c:3072 inet_release+0x56/0xa0 net/ipv4/af_inet.c:429 __sock_release+0x51/0xf0 net/socket.c:653 sock_close+0x18/0x20 net/socket.c:1395 __fput+0x113/0x430 fs/file_table.c:321 task_work_run+0x96/0x100 kernel/task_work.c:179 exit_task_work include/linux/task_work.h:38 [inline] do_exit+0x4fc/0x10c0 kernel/exit.c:869 do_group_exit+0x51/0xf0 kernel/exit.c:1019 get_signal+0x12b0/0x1390 kernel/signal.c:2859 arch_do_signal_or_restart+0x25/0x260 arch/x86/kernel/signal.c:306 exit_to_user_mode_loop kernel/entry/common.c:168 [inline] exit_to_user_mode_prepare+0x131/0x1a0 kernel/entry/common.c:203 __syscall_exit_to_user_mode_work kernel/entry/common.c:285 [inline] syscall_exit_to_user_mode+0x19/0x40 kernel/entry/common.c:296 do_syscall_64+0x46/0x90 arch/x86/entry/common.c:86 entry_SYSCALL_64_after_hwframe+0x72/0xdc RIP: 0033:0x7fec4b4926a9 Code: Unable to access opcode bytes at 0x7fec4b49267f. RSP: 002b:00007fec49f9dd78 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca RAX: fffffffffffffe00 RBX: 00000000006bc058 RCX: 00007fec4b4926a9 RDX: 0000000000000000 RSI: 0000000000000080 RDI: 00000000006bc058 RBP: 00000000006bc050 R08: 00000000007df998 R09: 00000000007df998 R10: 0000000000000000 R11: 0000000000000246 R12: 00000000006bc05c R13: fffffffffffffea8 R14: 000000000000000b R15: 000000000001fe40 </TASK>
The root cause is that the worker can force fallback to TCP the first mptcp subflow, actually deleting the unaccepted msk socket.
We can explicitly prevent the race delaying the unaccepted msk deletion at listener shutdown time. In case the closed subflow is later accepted, just drop the mptcp context and let the user-space deal with the paired mptcp socket.
--- net/mptcp/protocol.c | 68 +++++++++++++++++++++++++++++++++------------------ net/mptcp/protocol.h | 1 net/mptcp/subflow.c | 22 +++++++++------- 3 files changed, 58 insertions(+), 33 deletions(-)
net/mptcp/protocol.c +45 -23
@@ -2316,7 +2316,26 @@ static void __mptcp_close_ssk(struct soc unsigned int flags) {struct mptcp_sock *msk =mptcp_sk (sk); -bool need_push, dispose_it; +bool dispose_it, need_push = false; + +/* If the first subflow moved to a close state before accept, e.g. due +* to an incoming reset, mptcp either: +* - if either the subflow or the msk are dead, destroy the context +* (the subflow socket is deleted by inet_child_forget) and the msk +* - otherwise do nothing at the moment and take action at accept and/or +* listener shutdown - user-space must be able to accept() the closed +* socket. +*/ +if (msk->in_accept_queue && msk->first == ssk) { +if (!sock_flag (sk,SOCK_DEAD ) && !sock_flag (ssk,SOCK_DEAD )) +return ; + +/* ensure later check in mptcp_worker() will dispose the msk */ +sock_set_flag (sk,SOCK_DEAD ); +lock_sock_nested (ssk,SINGLE_DEPTH_NESTING ); +mptcp_subflow_drop_ctx (ssk); + goto out_release; + } dispose_it = !msk->subflow || ssk != msk->subflow->sk;if (dispose_it)
@@ -2352,18 +2371,6 @@ static void __mptcp_close_ssk(struct socif (!inet_csk (ssk)->icsk_ulp_ops) {WARN_ON_ONCE (!sock_flag (ssk,SOCK_DEAD ));kfree_rcu (subflow, rcu); - }else if (msk->in_accept_queue && msk->first == ssk) { -/* if the first subflow moved to a close state, e.g. due to -* incoming reset and we reach here before inet_child_forget() -* the TCP stack could later try to close it via -* inet_csk_listen_stop(), or deliver it to the user space via -* accept(). -* We can't delete the subflow - or risk a double free - nor let -* the msk survive - or will be leaked in the non accept scenario: -* fallback and let TCP cope with the subflow cleanup. -*/ -WARN_ON_ONCE (sock_flag (ssk,SOCK_DEAD )); -mptcp_subflow_drop_ctx (ssk); }else {/* otherwise tcp will dispose of the ssk and subflow ctx */ if (ssk->sk_state ==TCP_LISTEN ) {
@@ -2378,6 +2385,8 @@ static void __mptcp_close_ssk(struct soc/* close acquired an extra ref */ __sock_put (ssk); } + +out_release:release_sock (ssk);sock_put (ssk);
@@ -2432,21 +2441,14 @@ static void __mptcp_close_subflow(structmptcp_close_ssk (sk, ssk, subflow); } -/* if the MPC subflow has been closed before the msk is accepted, -* msk will never be accept-ed, close it now -*/ -if (!msk->first && msk->in_accept_queue) { -sock_set_flag (sk,SOCK_DEAD ); -inet_sk_state_store (sk,TCP_CLOSE ); - } } -static bool mptcp_check_close_timeout (const struct sock *sk) +static bool mptcp_should_close (const struct sock *sk) {s32 delta = tcp_jiffies32 -inet_csk (sk)->icsk_mtup.probe_timestamp;struct mptcp_subflow_context *subflow; -if (delta >=TCP_TIMEWAIT_LEN ) +if (delta >=TCP_TIMEWAIT_LEN ||mptcp_sk (sk)->in_accept_queue)return true;/* if all subflows are in closed status don't bother with additional
@@ -2654,7 +2656,7 @@ static void mptcp_worker(struct work_str* even if it is orphaned and in FIN_WAIT2 state */ if (sock_flag (sk,SOCK_DEAD )) { -if (mptcp_check_close_timeout (sk)) { +if (mptcp_should_close (sk)) {inet_sk_state_store (sk,TCP_CLOSE );mptcp_do_fastclose (sk); }
@@ -2901,6 +2903,14 @@ static void __mptcp_destroy_sock(structsock_put (sk); } +void __mptcp_unaccepted_force_close (struct sock *sk) +{ +sock_set_flag (sk,SOCK_DEAD ); +inet_sk_state_store (sk,TCP_CLOSE ); +mptcp_do_fastclose (sk); +__mptcp_destroy_sock (sk); +} +static __poll_t mptcp_check_readable (struct mptcp_sock *msk) {/* Concurrent splices from sk_receive_queue into receive_queue will
@@ -3728,6 +3738,18 @@ static int mptcp_stream_accept(struct soif (!ssk->sk_socket)mptcp_sock_graft (ssk, newsock); } + +/* Do late cleanup for the first subflow as necessary. Also +* deal with bad peers not doing a complete shutdown. +*/ +if (msk->first && +unlikely (inet_sk_state_load (msk->first) ==TCP_CLOSE )) { +__mptcp_close_ssk (newsk, msk->first, +mptcp_subflow_ctx (msk->first),0 ); +if (unlikely (list_empty (&msk->conn_list))) +inet_sk_state_store (newsk,TCP_CLOSE ); + } +release_sock (newsk); }
net/mptcp/protocol.h +1 -0
@@ -634,6 +634,7 @@ void mptcp_sock_graft(struct sock *sk, sstruct socket *__mptcp_nmpc_socket (const struct mptcp_sock *msk);bool __mptcp_close (struct sock *sk,long timeout);void mptcp_cancel_work (struct sock *sk); +void __mptcp_unaccepted_force_close (struct sock *sk);void mptcp_set_owner_r (struct sk_buff *skb,struct sock *sk); bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
net/mptcp/subflow.c +12 -10
@@ -722,9 +722,12 @@ void mptcp_subflow_drop_ctx(struct sockif (!ctx)return ; -subflow_ulp_fallback (ssk, ctx); -if (ctx->conn) -sock_put (ctx->conn); +list_del (&mptcp_subflow_ctx (ssk)->node); +if (inet_csk (ssk)->icsk_ulp_ops) { +subflow_ulp_fallback (ssk, ctx); +if (ctx->conn) +sock_put (ctx->conn); + }kfree_rcu (ctx, rcu); }
@@ -1821,6 +1824,7 @@ void mptcp_subflow_queue_clean(struct sostruct request_sock_queue *queue = &inet_csk (listener_ssk)->icsk_accept_queue;struct mptcp_sock *msk, *next, *head =NULL ;struct request_sock *req; +struct sock *sk;/* build a list of all unaccepted mptcp sockets */ spin_lock_bh (&queue->rskq_lock);
@@ -1836,11 +1840,12 @@ void mptcp_subflow_queue_clean(struct socontinue ;/* skip if already in list */ - msk =mptcp_sk (subflow->conn); + sk = subflow->conn; + msk =mptcp_sk (sk);if (msk->dl_next || msk == head)continue ; -sock_hold (subflow->conn); +sock_hold (sk); msk->dl_next = head; head = msk; }
@@ -1854,16 +1859,13 @@ void mptcp_subflow_queue_clean(struct sorelease_sock (listener_ssk);for (msk = head; msk; msk = next) { -struct sock *sk = (struct sock *)msk; + sk = (struct sock *)msk;lock_sock_nested (sk,SINGLE_DEPTH_NESTING ); next = msk->dl_next; msk->dl_next =NULL ; -/* prevent the stack from later re-schedule the worker for -* this socket -*/ -inet_sk_state_store (sk,TCP_CLOSE ); +__mptcp_unaccepted_force_close (sk);release_sock (sk);/* lockdep will report a false positive ABBA deadlock
Greg Kroah-Hartman
maintainerPATCH 75/110 tools/mm/page_owner_sort.c: fix TGID output when cull=tg is used
In reply to Greg Kroah-HartmanFrom: Steve Chou <[email protected]>
commit 9235756885e865070c4be2facda75262dbd85967 upstream.
When using cull option with 'tg' flag, the fprintf is using pid instead of tgid. It should use tgid instead.
--- tools/vm/page_owner_sort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/vm/page_owner_sort.c +1 -1
@@ -847,7 +847,7 @@ int main(int argc, char **argv)if (cull &CULL_PID || filter &FILTER_PID )fprintf (fout,", PID %d" , list[i].pid);if (cull &CULL_TGID || filter &FILTER_TGID ) -fprintf (fout,", TGID %d" , list[i].pid); +fprintf (fout,", TGID %d" , list[i].tgid);if (cull &CULL_COMM || filter &FILTER_COMM )fprintf (fout,", task_comm_name: %s" , list[i].comm);if (cull &CULL_ALLOCATOR ) {
Greg Kroah-Hartman
maintainerPATCH 76/110 memstick: fix memory leak if card device is never registered
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
commit 4b6d621c9d859ff89e68cebf6178652592676013 upstream.
When calling dev_set_name() memory is allocated for the name for the struct device. Once that structure device is registered, or attempted to be registerd, with the driver core, the driver core will handle cleaning up that memory when the device is removed from the system.
Unfortunatly for the memstick code, there is an error path that causes the struct device to never be registered, and so the memory allocated in dev_set_name will be leaked. Fix that leak by manually freeing it right before the memory for the device is freed.
--- drivers/memstick/core/memstick.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/memstick/core/memstick.c +4 -1
@@ -410,6 +410,7 @@ static struct memstick_dev *memstick_allreturn card; err_out: host->card = old_card; +kfree_const (card->dev.kobj.name);kfree (card);return NULL ; }
@@ -468,8 +469,10 @@ static void memstick_check(struct work_sput_device (&card->dev); host->card =NULL ; } - }else + }else { +kfree_const (card->dev.kobj.name);kfree (card); + } } out_power_off:
Greg Kroah-Hartman
maintainerPATCH 77/110 kernel/sys.c: fix and improve control flow in __sys_setres[ug]id()
In reply to Greg Kroah-HartmanFrom: Ondrej Mosnacek <[email protected]>
commit 659c0ce1cb9efc7f58d380ca4bb2a51ae9e30553 upstream.
Linux Security Modules (LSMs) that implement the "capable" hook will usually emit an access denial message to the audit log whenever they "block" the current task from using the given capability based on their security policy.
The occurrence of a denial is used as an indication that the given task has attempted an operation that requires the given access permission, so the callers of functions that perform LSM permission checks must take care to avoid calling them too early (before it is decided if the permission is actually needed to perform the requested operation).
The __sys_setres[ug]id() functions violate this convention by first calling ns_capable_setid() and only then checking if the operation requires the capability or not. It means that any caller that has the capability granted by DAC (task's capability set) but not by MAC (LSMs) will generate a "denied" audit record, even if is doing an operation for which the capability is not required.
Fix this by reordering the checks such that ns_capable_setid() is checked last and -EPERM is returned immediately if it returns false.
While there, also do two small optimizations:
* move the capability check before prepare_creds() and
* bail out early in case of a no-op.
--- kernel/sys.c | 69 ++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 29 deletions(-)
kernel/sys.c +40 -29
@@ -664,6 +664,7 @@ long __sys_setresuid(uid_t ruid, uid_t estruct cred *new;int retval;kuid_t kruid, keuid, ksuid; +bool ruid_new, euid_new, suid_new; kruid =make_kuid (ns, ruid); keuid =make_kuid (ns, euid);
@@ -678,25 +679,29 @@ long __sys_setresuid(uid_t ruid, uid_t eif ((suid != (uid_t) -1 ) && !uid_valid (ksuid))return -EINVAL ; + old =current_cred (); + +/* check for no-op */ +if ((ruid == (uid_t) -1 ||uid_eq (kruid, old->uid)) && + (euid == (uid_t) -1 || (uid_eq (keuid, old->euid) && +uid_eq (keuid, old->fsuid))) && + (suid == (uid_t) -1 ||uid_eq (ksuid, old->suid))) +return 0 ; + + ruid_new = ruid != (uid_t) -1 && !uid_eq (kruid, old->uid) && + !uid_eq (kruid, old->euid) && !uid_eq (kruid, old->suid); + euid_new = euid != (uid_t) -1 && !uid_eq (keuid, old->uid) && + !uid_eq (keuid, old->euid) && !uid_eq (keuid, old->suid); + suid_new = suid != (uid_t) -1 && !uid_eq (ksuid, old->uid) && + !uid_eq (ksuid, old->euid) && !uid_eq (ksuid, old->suid); +if ((ruid_new || euid_new || suid_new) && + !ns_capable_setid (old->user_ns,CAP_SETUID )) +return -EPERM ; + new =prepare_creds ();if (!new)return -ENOMEM ; - old =current_cred (); - - retval = -EPERM ; -if (!ns_capable_setid (old->user_ns,CAP_SETUID )) { -if (ruid != (uid_t) -1 && !uid_eq (kruid, old->uid) && - !uid_eq (kruid, old->euid) && !uid_eq (kruid, old->suid)) - goto error; -if (euid != (uid_t) -1 && !uid_eq (keuid, old->uid) && - !uid_eq (keuid, old->euid) && !uid_eq (keuid, old->suid)) - goto error; -if (suid != (uid_t) -1 && !uid_eq (ksuid, old->uid) && - !uid_eq (ksuid, old->euid) && !uid_eq (ksuid, old->suid)) - goto error; - } -if (ruid != (uid_t) -1 ) { new->uid = kruid;if (!uid_eq (kruid, old->uid)) {
@@ -761,6 +766,7 @@ long __sys_setresgid(gid_t rgid, gid_t estruct cred *new;int retval;kgid_t krgid, kegid, ksgid; +bool rgid_new, egid_new, sgid_new; krgid =make_kgid (ns, rgid); kegid =make_kgid (ns, egid);
@@ -773,23 +779,28 @@ long __sys_setresgid(gid_t rgid, gid_t eif ((sgid != (gid_t) -1 ) && !gid_valid (ksgid))return -EINVAL ; + old =current_cred (); + +/* check for no-op */ +if ((rgid == (gid_t) -1 ||gid_eq (krgid, old->gid)) && + (egid == (gid_t) -1 || (gid_eq (kegid, old->egid) && +gid_eq (kegid, old->fsgid))) && + (sgid == (gid_t) -1 ||gid_eq (ksgid, old->sgid))) +return 0 ; + + rgid_new = rgid != (gid_t) -1 && !gid_eq (krgid, old->gid) && + !gid_eq (krgid, old->egid) && !gid_eq (krgid, old->sgid); + egid_new = egid != (gid_t) -1 && !gid_eq (kegid, old->gid) && + !gid_eq (kegid, old->egid) && !gid_eq (kegid, old->sgid); + sgid_new = sgid != (gid_t) -1 && !gid_eq (ksgid, old->gid) && + !gid_eq (ksgid, old->egid) && !gid_eq (ksgid, old->sgid); +if ((rgid_new || egid_new || sgid_new) && + !ns_capable_setid (old->user_ns,CAP_SETGID )) +return -EPERM ; + new =prepare_creds ();if (!new)return -ENOMEM ; - old =current_cred (); - - retval = -EPERM ; -if (!ns_capable_setid (old->user_ns,CAP_SETGID )) { -if (rgid != (gid_t) -1 && !gid_eq (krgid, old->gid) && - !gid_eq (krgid, old->egid) && !gid_eq (krgid, old->sgid)) - goto error; -if (egid != (gid_t) -1 && !gid_eq (kegid, old->gid) && - !gid_eq (kegid, old->egid) && !gid_eq (kegid, old->sgid)) - goto error; -if (sgid != (gid_t) -1 && !gid_eq (ksgid, old->gid) && - !gid_eq (ksgid, old->egid) && !gid_eq (ksgid, old->sgid)) - goto error; - }if (rgid != (gid_t) -1 ) new->gid = krgid;
Greg Kroah-Hartman
maintainerPATCH 78/110 writeback, cgroup: fix null-ptr-deref write in bdi_split_work_to_wbs
In reply to Greg Kroah-HartmanFrom: Baokun Li <[email protected]>
commit 1ba1199ec5747f475538c0d25a32804e5ba1dfde upstream.
KASAN report null-ptr-deref:
==================================================================
BUG: KASAN: null-ptr-deref in bdi_split_work_to_wbs+0x5c5/0x7b0 Write of size 8 at addr 0000000000000000 by task sync/943 CPU: 5 PID: 943 Comm: sync Tainted: 6.3.0-rc5-next-20230406-dirty #461 Call Trace: <TASK> dump_stack_lvl+0x7f/0xc0 print_report+0x2ba/0x340 kasan_report+0xc4/0x120 kasan_check_range+0x1b7/0x2e0 __kasan_check_write+0x24/0x40 bdi_split_work_to_wbs+0x5c5/0x7b0 sync_inodes_sb+0x195/0x630 sync_inodes_one_sb+0x3a/0x50 iterate_supers+0x106/0x1b0 ksys_sync+0x98/0x160
[...]
==================================================================
The race that causes the above issue is as follows:
cpu1 cpu2
-------------------------|------------------------- inode_switch_wbs
INIT_WORK(&isw->work, inode_switch_wbs_work_fn) queue_rcu_work(isw_wq, &isw->work)
// queue_work async
inode_switch_wbs_work_fn
wb_put_many(old_wb, nr_switched)
percpu_ref_put_many
ref->data->release(ref)
cgwb_release
queue_work(cgwb_release_wq, &wb->release_work)
// queue_work async
&wb->release_work
cgwb_release_workfn
ksys_sync
iterate_supers
sync_inodes_one_sb
sync_inodes_sb
bdi_split_work_to_wbs
kmalloc(sizeof(*work), GFP_ATOMIC)
// alloc memory failed
percpu_ref_exit
ref->data = NULL
kfree(data)
wb_get(wb)
percpu_ref_get(&wb->refcnt)
percpu_ref_get_many(ref, 1)
atomic_long_add(nr, &ref->data->count)
atomic64_add(i, v)
// trigger null-ptr-derefbdi_split_work_to_wbs() traverses &bdi->wb_list to split work into all wbs. If the allocation of new work fails, the on-stack fallback will be used and the reference count of the current wb is increased afterwards. If cgroup writeback membership switches occur before getting the reference count and the current wb is released as old_wd, then calling wb_get() or wb_put() will trigger the null pointer dereference above.
This issue was introduced in v4.3-rc7 (see fix tag1). Both sync_inodes_sb() and __writeback_inodes_sb_nr() calls to bdi_split_work_to_wbs() can trigger this issue. For scenarios called via sync_inodes_sb(), originally commit 7fc5854f8c6e ("writeback: synchronize sync(2) against cgroup writeback membership switches") reduced the possibility of the issue by adding wb_switch_rwsem, but in v5.14-rc1 (see fix tag2) removed the "inode_io_list_del_locked(inode, old_wb)" from inode_switch_wbs_work_fn() so that wb->state contains WB_has_dirty_io, thus old_wb is not skipped when traversing wbs in bdi_split_work_to_wbs(), and the issue becomes easily reproducible again.
To solve this problem, percpu_ref_exit() is called under RCU protection to avoid race between cgwb_release_workfn() and bdi_split_work_to_wbs(). Moreover, replace wb_get() with wb_tryget() in bdi_split_work_to_wbs(), and skip the current wb if wb_tryget() fails because the wb has already been shutdown.
--- fs/fs-writeback.c | 17 ++++++++++------- mm/backing-dev.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 9 deletions(-)
fs/fs-writeback.c +10 -7
@@ -976,6 +976,16 @@ restart:continue ; } +/* +* If wb_tryget fails, the wb has been shutdown, skip it. +* +* Pin @wb so that it stays on @bdi->wb_list. This allows +* continuing iteration from @wb after dropping and +* regrabbing rcu read lock. +*/ +if (!wb_tryget (wb)) +continue ; +/* alloc failed, execute synchronously using on-stack fallback */ work = &fallback_work; *work = *base_work;
@@ -984,13 +994,6 @@ restart: work->done = &fallback_work_done;wb_queue_work (wb, work); - -/* -* Pin @wb so that it stays on @bdi->wb_list. This allows -* continuing iteration from @wb after dropping and -* regrabbing rcu read lock. -*/ -wb_get (wb); last_wb = wb;rcu_read_unlock ();
mm/backing-dev.c +10 -2
@@ -507,6 +507,15 @@ static LIST_HEAD(offline_cgwbs);static void cleanup_offline_cgwbs_workfn (struct work_struct *work); static DECLARE_WORK(cleanup_offline_cgwbs_work, cleanup_offline_cgwbs_workfn); +static void cgwb_free_rcu (struct rcu_head *rcu_head) +{ +struct bdi_writeback *wb =container_of (rcu_head, + struct bdi_writeback, rcu); + +percpu_ref_exit (&wb->refcnt); +kfree (wb); +} +static void cgwb_release_workfn (struct work_struct *work) { struct bdi_writeback *wb = container_of(work, struct bdi_writeback,
@@ -529,11 +538,10 @@ static void cgwb_release_workfn(struct wlist_del (&wb->offline_node);spin_unlock_irq (&cgwb_lock); -percpu_ref_exit (&wb->refcnt);wb_exit (wb);bdi_put (bdi);WARN_ON_ONCE (!list_empty (&wb->b_attached)); -kfree_rcu (wb, rcu); +call_rcu (&wb->rcu, cgwb_free_rcu); }static void cgwb_release (struct percpu_ref *refcnt)
Greg Kroah-Hartman
maintainerPATCH 79/110 mmc: sdhci_am654: Set HIGH_SPEED_ENA for SDR12 and SDR25
In reply to Greg Kroah-HartmanFrom: Bhavya Kapoor <[email protected]>
commit 2265098fd6a6272fde3fd1be5761f2f5895bd99a upstream.
Timing Information in Datasheet assumes that HIGH_SPEED_ENA=1 should be set for SDR12 and SDR25 modes. But sdhci_am654 driver clears HIGH_SPEED_ENA register. Thus, Modify sdhci_am654 to not clear HIGH_SPEED_ENA (HOST_CONTROL[2]) bit for SDR12 and SDR25 speed modes.
--- drivers/mmc/host/sdhci_am654.c | 2 -- 1 file changed, 2 deletions(-)
drivers/mmc/host/sdhci_am654.c +0 -2
@@ -351,8 +351,6 @@ static void sdhci_am654_write_b(struct s*/ case MMC_TIMING_SD_HS :case MMC_TIMING_MMC_HS : -case MMC_TIMING_UHS_SDR12 : -case MMC_TIMING_UHS_SDR25 : val &= ~SDHCI_CTRL_HISPD ; } }
Greg Kroah-Hartman
maintainerPATCH 80/110 drm/i915: Fix fast wake AUX sync len
In reply to Greg Kroah-HartmanFrom: Ville Syrjälä <[email protected]>
commit e1c71f8f918047ce822dc19b42ab1261ed259fd1 upstream.
Fast wake should use 8 SYNC pulses for the preamble and 10-16 SYNC pulses for the precharge. Reduce our fast wake SYNC count to match the maximum value. We also use the maximum precharge length for normal AUX transactions.
--- drivers/gpu/drm/i915/display/intel_dp_aux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_dp_aux.c +1 -1
@@ -166,7 +166,7 @@ static u32 skl_get_aux_send_ctl(struct iDP_AUX_CH_CTL_TIME_OUT_MAX |DP_AUX_CH_CTL_RECEIVE_ERROR | (send_bytes <<DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT ) | -DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL (32 ) | +DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL (24 ) |DP_AUX_CH_CTL_SYNC_PULSE_SKL (32 );if (intel_tc_port_in_tbt_alt_mode (dig_port))
Greg Kroah-Hartman
maintainerPATCH 81/110 drm/amdgpu: Fix desktop freezed after gpu-reset
In reply to Greg Kroah-HartmanFrom: Alan Liu <[email protected]>
commit c8b5a95b570949536a2b75cd8fc4f1de0bc60629 upstream.
[Why]
After gpu-reset, sometimes the driver fails to enable vblank irq, causing flip_done timed out and the desktop freezed.
During gpu-reset, we disable and enable vblank irq in dm_suspend() and dm_resume(). Later on in amdgpu_irq_gpu_reset_resume_helper(), we check irqs' refcount and decide to enable or disable the irqs again.
However, we have 2 sets of API for controling vblank irq, one is dm_vblank_get/put() and another is amdgpu_irq_get/put(). Each API has its own refcount and flag to store the state of vblank irq, and they are not synchronized.
In drm we use the first API to control vblank irq but in amdgpu_irq_gpu_reset_resume_helper() we use the second set of API.
The failure happens when vblank irq was enabled by dm_vblank_get() before gpu-reset, we have vblank->enabled true. However, during gpu-reset, in amdgpu_irq_gpu_reset_resume_helper() vblank irq's state checked from amdgpu_irq_update() is DISABLED. So finally it disables vblank irq again. After gpu-reset, if there is a cursor plane commit, the driver will try to enable vblank irq by calling drm_vblank_enable(), but the vblank->enabled is still true, so it fails to turn on vblank irq and causes flip_done can't be completed in vblank irq handler and desktop become freezed.
[How]
Combining the 2 vblank control APIs by letting drm's API finally calls amdgpu_irq's API, so the irq's refcount and state of both APIs can be synchronized. Also add a check to prevent refcount from being less then 0 in amdgpu_irq_put().
v2:
- Add warning in amdgpu_irq_enable() if the irq is already disabled.
- Call dc_interrupt_set() in dm_set_vblank() to avoid refcount change if it is in gpu-reset.
v3:
- Improve commit message and code comments.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 3 +++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +3 -0
@@ -597,6 +597,9 @@ int amdgpu_irq_put(struct amdgpu_deviceif (!src->enabled_types || !src->funcs->set)return -EINVAL ; +if (WARN_ON (!amdgpu_irq_enabled (adev, src, type))) +return -EINVAL ; +if (atomic_dec_and_test (&src->enabled_types[type]))return amdgpu_irq_update (adev, src, type);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +14 -3
@@ -170,10 +170,21 @@ static inline int dm_set_vblank(struct dif (rc)return rc; - irq_source =IRQ_TYPE_VBLANK + acrtc->otg_inst; +if (amdgpu_in_reset (adev)) { + irq_source =IRQ_TYPE_VBLANK + acrtc->otg_inst; +/* During gpu-reset we disable and then enable vblank irq, so +* don't use amdgpu_irq_get/put() to avoid refcount change. +*/ +if (!dc_interrupt_set (adev->dm.dc, irq_source, enable)) + rc = -EBUSY ; + }else { + rc = (enable) + ?amdgpu_irq_get (adev, &adev->crtc_irq, acrtc->crtc_id) + :amdgpu_irq_put (adev, &adev->crtc_irq, acrtc->crtc_id); + } -if (!dc_interrupt_set (adev->dm.dc, irq_source, enable)) -return -EBUSY ; +if (rc) +return rc; skip:if (amdgpu_in_reset (adev))
Greg Kroah-Hartman
maintainerPATCH 82/110 drm/amd/display: set dcn315 lb bpp to 48
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
commit 6d9240c46f7419aa3210353b5f52cc63da5a6440 upstream.
[Why & How]
Fix a typo for dcn315 line buffer bpp.
--- drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +1 -1
@@ -222,7 +222,7 @@ struct _vcs_dpi_ip_params_st dcn3_15_ip .maximum_dsc_bits_per_component = 10, .dsc422_native_support = false, .is_line_buffer_bpp_fixed = true, - .line_buffer_fixed_bpp = 49, + .line_buffer_fixed_bpp = 48, .line_buffer_size_bits = 789504, .max_line_buffer_lines = 12, .writeback_interface_buffer_size_kbytes = 90,
Greg Kroah-Hartman
maintainerPATCH 83/110 drm/rockchip: vop2: fix suspend/resume
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
commit afa965a45e01e541cdbe5c8018226eff117610f0 upstream.
During a suspend/resume cycle the VO power domain will be disabled and the VOP2 registers will reset to their default values. After that the cached register values will be out of sync and the read/modify/write operations we do on the window registers will result in bogus values written. Fix this by re-initializing the register cache each time we enable the VOP2. With this the VOP2 will show a picture after a suspend/resume cycle whereas without this the screen stays dark.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +8 -0
@@ -216,6 +216,8 @@ struct vop2 {struct vop2_win win[]; }; +static const struct regmap_config vop2_regmap_config; +static struct vop2_video_port *to_vop2_video_port (struct drm_crtc *crtc) { return container_of(crtc, struct vop2_video_port, crtc);
@@ -840,6 +842,12 @@ static void vop2_enable(struct vop2 *vopreturn ; } + ret =regmap_reinit_cache (vop2->map, &vop2_regmap_config); +if (ret) { +drm_err (vop2->drm,"failed to reinit cache: %d\n" , ret); +return ; + } +if (vop2->data->soc_id ==3566 )vop2_writel (vop2,RK3568_OTP_WIN_EN ,1 );
Greg Kroah-Hartman
maintainerPATCH 84/110 drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
commit b63a553e8f5aa6574eeb535a551817a93c426d8c upstream.
afa965a45e01 ("drm/rockchip: vop2: fix suspend/resume") uses regmap_reinit_cache() to fix the suspend/resume issue with the VOP2 driver. During discussion it came up that we should rather use regcache_sync() instead. As the original patch is already applied fix this up in this follow-up patch.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +3 -7
@@ -216,8 +216,6 @@ struct vop2 {struct vop2_win win[]; }; -static const struct regmap_config vop2_regmap_config; -static struct vop2_video_port *to_vop2_video_port (struct drm_crtc *crtc) { return container_of(crtc, struct vop2_video_port, crtc);
@@ -842,11 +840,7 @@ static void vop2_enable(struct vop2 *vopreturn ; } - ret =regmap_reinit_cache (vop2->map, &vop2_regmap_config); -if (ret) { -drm_err (vop2->drm,"failed to reinit cache: %d\n" , ret); -return ; - } +regcache_sync (vop2->map);if (vop2->data->soc_id ==3566 )vop2_writel (vop2,RK3568_OTP_WIN_EN ,1 );
@@ -876,6 +870,8 @@ static void vop2_disable(struct vop2 *vopm_runtime_put_sync (vop2->dev); +regcache_mark_dirty (vop2->map); +clk_disable_unprepare (vop2->aclk);clk_disable_unprepare (vop2->hclk); }
Greg Kroah-Hartman
maintainerPATCH 85/110 mm: fix memory leak on mm_init error handling
In reply to Greg Kroah-HartmanFrom: Mathieu Desnoyers <[email protected]>
commit b20b0368c614c609badfe16fbd113dfb4780acd9 upstream.
commit f1a7941243c1 ("mm: convert mm's rss stats into percpu_counter") introduces a memory leak by missing a call to destroy_context() when a percpu_counter fails to allocate.
Before introducing the per-cpu counter allocations, init_new_context() was the last call that could fail in mm_init(), and thus there was no need to ever invoke destroy_context() in the error paths. Adding the following percpu counter allocations adds error paths after init_new_context(), which means its associated destroy_context() needs to be called when percpu counters fail to allocate.
--- kernel/fork.c | 1 + 1 file changed, 1 insertion(+)
kernel/fork.c +1 -0
@@ -1177,6 +1177,7 @@ static struct mm_struct *mm_init(struct fail_pcpu:while (i >0 )percpu_counter_destroy (&mm->rss_stat[--i]); +destroy_context (mm); fail_nocontext:mm_free_pgd (mm); fail_nopgd:
Greg Kroah-Hartman
maintainerPATCH 86/110 mm/userfaultfd: fix uffd-wp handling for THP migration entries
In reply to Greg Kroah-HartmanFrom: David Hildenbrand <[email protected]>
commit 24bf08c4376be417f16ceb609188b16f461b0443 upstream.
Looks like what we fixed for hugetlb in commit 44f86392bdd1 ("mm/hugetlb:
fix uffd-wp handling for migration entries in hugetlb_change_protection()") similarly applies to THP.
Setting/clearing uffd-wp on THP migration entries is not implemented properly. Further, while removing migration PMDs considers the uffd-wp bit, inserting migration PMDs does not consider the uffd-wp bit.
We have to set/clear independently of the migration entry type in change_huge_pmd() and properly copy the uffd-wp bit in set_pmd_migration_entry().
Verified using a simple reproducer that triggers migration of a THP, that the set_pmd_migration_entry() no longer loses the uffd-wp bit.
--- mm/huge_memory.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
mm/huge_memory.c +12 -2
@@ -1845,10 +1845,10 @@ int change_huge_pmd(struct mmu_gather *tif (is_swap_pmd (*pmd)) {swp_entry_t entry =pmd_to_swp_entry (*pmd);struct page *page =pfn_swap_entry_to_page (entry); +pmd_t newpmd;VM_BUG_ON (!is_pmd_migration_entry (*pmd));if (is_writable_migration_entry (entry)) { -pmd_t newpmd;/* * A protection check is difficult so * just be safe and disable write
@@ -1862,8 +1862,16 @@ int change_huge_pmd(struct mmu_gather *t newpmd =pmd_swp_mksoft_dirty (newpmd);if (pmd_swp_uffd_wp (*pmd)) newpmd = pmd_swp_mkuffd_wp(newpmd); - set_pmd_at(mm, addr, pmd, newpmd); + }else { + newpmd = *pmd; } + +if (uffd_wp) + newpmd =pmd_swp_mkuffd_wp (newpmd); +else if (uffd_wp_resolve) + newpmd =pmd_swp_clear_uffd_wp (newpmd); +if (!pmd_same (*pmd, newpmd)) +set_pmd_at (mm, addr, pmd, newpmd); goto unlock; }#endif
@@ -3252,6 +3260,8 @@ int set_pmd_migration_entry(struct page_ pmdswp =swp_entry_to_pmd (entry);if (pmd_soft_dirty (pmdval)) pmdswp =pmd_swp_mksoft_dirty (pmdswp); +if (pmd_uffd_wp (pmdval)) + pmdswp =pmd_swp_mkuffd_wp (pmdswp);set_pmd_at (mm, address, pvmw->pmd, pmdswp);page_remove_rmap (page, vma, true);put_page (page);
Greg Kroah-Hartman
maintainerPATCH 87/110 mm/khugepaged: check again on anon uffd-wp during isolation
In reply to Greg Kroah-HartmanFrom: Peter Xu <[email protected]>
commit dd47ac428c3f5f3bcabe845f36be870fe6c20784 upstream.
Khugepaged collapse an anonymous thp in two rounds of scans. The 2nd round done in __collapse_huge_page_isolate() after hpage_collapse_scan_pmd(), during which all the locks will be released temporarily. It means the pgtable can change during this phase before 2nd round starts.
It's logically possible some ptes got wr-protected during this phase, and we can errornously collapse a thp without noticing some ptes are wr-protected by userfault. e1e267c7928f wanted to avoid it but it only did that for the 1st phase, not the 2nd phase.
Since __collapse_huge_page_isolate() happens after a round of small page swapins, we don't need to worry on any !present ptes - if it existed khugepaged will already bail out. So we only need to check present ptes with uffd-wp bit set there.
This is something I found only but never had a reproducer, I thought it was one caused a bug in Muhammad's recent pagemap new ioctl work, but it turns out it's not the cause of that but an userspace bug. However this seems to still be a real bug even with a very small race window, still worth to have it fixed and copy stable.
--- mm/khugepaged.c | 4 ++++ 1 file changed, 4 insertions(+)
mm/khugepaged.c +4 -0
@@ -561,6 +561,10 @@ static int __collapse_huge_page_isolate( result =SCAN_PTE_NON_PRESENT ; goto out; } +if (pte_uffd_wp (pteval)) { + result =SCAN_PTE_UFFD_WP ; + goto out; + } page =vm_normal_page (vma, address, pteval);if (unlikely (!page) ||unlikely (is_zone_device_page (page))) { result =SCAN_PAGE_NULL ;
Greg Kroah-Hartman
maintainerPATCH 88/110 mm/huge_memory.c: warn with pr_warn_ratelimited instead of VM_WARN_ON_ONCE_FOLIO
In reply to Greg Kroah-HartmanFrom: Naoya Horiguchi <[email protected]>
commit 4737edbbdd4958ae29ca6a310a6a2fa4e0684b01 upstream.
split_huge_page_to_list() WARNs when called for huge zero pages, which sounds to me too harsh because it does not imply a kernel bug, but just notifies the event to admins. On the other hand, this is considered as critical by syzkaller and makes its testing less efficient, which seems to me harmful.
So replace the VM_WARN_ON_ONCE_FOLIO with pr_warn_ratelimited.
--- mm/huge_memory.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
mm/huge_memory.c +3 -2
@@ -2674,9 +2674,10 @@ int split_huge_page_to_list(struct pageVM_BUG_ON_FOLIO (!folio_test_large (folio), folio); is_hzp =is_huge_zero_page (&folio->page); -VM_WARN_ON_ONCE_FOLIO (is_hzp, folio); -if (is_hzp) +if (is_hzp) { +pr_warn_ratelimited ("Called split_huge_page for huge zero page\n" );return -EBUSY ; + }if (folio_test_writeback (folio))return -EBUSY ;
Greg Kroah-Hartman
maintainerPATCH 89/110 mm: kmsan: handle alloc failures in kmsan_ioremap_page_range()
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit fdea03e12aa2a44a7bb34144208be97fc25dfd90 upstream.
Similarly to kmsan_vmap_pages_range_noflush(), kmsan_ioremap_page_range() must also properly handle allocation/mapping failures. In the case of such, it must clean up the already created metadata mappings and return an error code, so that the error can be propagated to ioremap_page_range(). Without doing so, KMSAN may silently fail to bring the metadata for the page range into a consistent state, which will result in user-visible crashes when trying to access them.
--- include/linux/kmsan.h | 19 +++++++++-------- mm/kmsan/hooks.c | 55 ++++++++++++++++++++++++++++++++++++++++++-------- mm/vmalloc.c | 4 +-- 3 files changed, 59 insertions(+), 19 deletions(-)
include/linux/kmsan.h +10 -9
@@ -159,11 +159,12 @@ void kmsan_vunmap_range_noflush(unsigned* @page_shift: page_shift argument passed to vmap_range_noflush(). * * KMSAN creates new metadata pages for the physical pages mapped into the -* virtual memory. +* virtual memory. Returns 0 on success, callers must check for non-zero return +* value. */ -void kmsan_ioremap_page_range (unsigned long addr,unsigned long end, -phys_addr_t phys_addr,pgprot_t prot, -unsigned int page_shift); +int kmsan_ioremap_page_range (unsigned long addr,unsigned long end, +phys_addr_t phys_addr,pgprot_t prot, +unsigned int page_shift);/** * kmsan_iounmap_page_range() - Notify KMSAN about a iounmap_page_range() call.
@@ -294,12 +295,12 @@ static inline void kmsan_vunmap_range_no { } -static inline void kmsan_ioremap_page_range (unsigned long start, -unsigned long end, -phys_addr_t phys_addr, -pgprot_t prot, -unsigned int page_shift) +static inline int kmsan_ioremap_page_range (unsigned long start, +unsigned long end, +phys_addr_t phys_addr,pgprot_t prot, +unsigned int page_shift) { +return 0 ; } static inline void kmsan_iounmap_page_range(unsigned long start,
mm/kmsan/hooks.c +47 -8
82 lines not on this page · raw message
mm/vmalloc.c +2 -2
@@ -324,8 +324,8 @@ int ioremap_page_range(unsigned long add ioremap_max_page_shift);flush_cache_vmap (addr, end);if (!err) -kmsan_ioremap_page_range (addr, end, phys_addr, prot, - ioremap_max_page_shift); + err =kmsan_ioremap_page_range (addr, end, phys_addr, prot, + ioremap_max_page_shift);return err; }
Greg Kroah-Hartman
maintainerPATCH 90/110 mm: kmsan: handle alloc failures in kmsan_vmap_pages_range_noflush()
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit 47ebd0310e89c087f56e58c103c44b72a2f6b216 upstream.
As reported by Dipanjan Das, when KMSAN is used together with kernel fault injection (or, generally, even without the latter), calls to kcalloc() or __vmap_pages_range_noflush() may fail, leaving the metadata mappings for the virtual mapping in an inconsistent state. When these metadata mappings are accessed later, the kernel crashes.
To address the problem, we return a non-zero error code from kmsan_vmap_pages_range_noflush() in the case of any allocation/mapping failure inside it, and make vmap_pages_range_noflush() return an error if KMSAN fails to allocate the metadata.
This patch also removes KMSAN_WARN_ON() from vmap_pages_range_noflush(), as these allocation failures are not fatal anymore.
--- include/linux/kmsan.h | 20 +++++++++++--------- mm/kmsan/shadow.c | 27 ++++++++++++++++++--------- mm/vmalloc.c | 6 +++++- 3 files changed, 34 insertions(+), 19 deletions(-)
include/linux/kmsan.h +11 -9
@@ -134,11 +134,12 @@ void kmsan_kfree_large(const void *ptr);* @page_shift: page_shift passed to vmap_range_noflush(). * * KMSAN maps shadow and origin pages of @pages into contiguous ranges in -* vmalloc metadata address range. +* vmalloc metadata address range. Returns 0 on success, callers must check +* for non-zero return value. */ -void kmsan_vmap_pages_range_noflush (unsigned long start,unsigned long end, -pgprot_t prot,struct page **pages, -unsigned int page_shift); +int kmsan_vmap_pages_range_noflush (unsigned long start,unsigned long end, +pgprot_t prot,struct page **pages, +unsigned int page_shift);/** * kmsan_vunmap_kernel_range_noflush() - Notify KMSAN about a vunmap.
@@ -282,12 +283,13 @@ static inline void kmsan_kfree_large(con { } -static inline void kmsan_vmap_pages_range_noflush (unsigned long start, -unsigned long end, -pgprot_t prot, -struct page **pages, -unsigned int page_shift) +static inline int kmsan_vmap_pages_range_noflush (unsigned long start, +unsigned long end, +pgprot_t prot, +struct page **pages, +unsigned int page_shift) { +return 0 ; } static inline void kmsan_vunmap_range_noflush(unsigned long start,
mm/kmsan/shadow.c +18 -9
@@ -216,27 +216,29 @@ void kmsan_free_page(struct page *page,kmsan_leave_runtime (); } -void kmsan_vmap_pages_range_noflush (unsigned long start,unsigned long end, -pgprot_t prot,struct page **pages, -unsigned int page_shift) +int kmsan_vmap_pages_range_noflush (unsigned long start,unsigned long end, +pgprot_t prot,struct page **pages, +unsigned int page_shift) {unsigned long shadow_start, origin_start, shadow_end, origin_end;struct page **s_pages, **o_pages; -int nr, mapped; +int nr, mapped, err =0 ;if (!kmsan_enabled) -return ; +return 0 ; shadow_start =vmalloc_meta ((void *)start,KMSAN_META_SHADOW ); shadow_end =vmalloc_meta ((void *)end,KMSAN_META_SHADOW );if (!shadow_start) -return ; +return 0 ; nr = (end - start) /PAGE_SIZE ; s_pages =kcalloc (nr,sizeof (*s_pages),GFP_KERNEL ); o_pages =kcalloc (nr,sizeof (*o_pages),GFP_KERNEL ); -if (!s_pages || !o_pages) +if (!s_pages || !o_pages) { + err = -ENOMEM ; goto ret; + }for (int i =0 ; i < nr; i++) { s_pages[i] =shadow_page_for (pages[i]); o_pages[i] =origin_page_for (pages[i]);
@@ -249,10 +251,16 @@ void kmsan_vmap_pages_range_noflush(unsikmsan_enter_runtime (); mapped =__vmap_pages_range_noflush (shadow_start, shadow_end, prot, s_pages, page_shift); -KMSAN_WARN_ON (mapped); +if (mapped) { + err = mapped; + goto ret; + } mapped =__vmap_pages_range_noflush (origin_start, origin_end, prot, o_pages, page_shift); -KMSAN_WARN_ON (mapped); +if (mapped) { + err = mapped; + goto ret; + }kmsan_leave_runtime ();flush_tlb_kernel_range (shadow_start, shadow_end);flush_tlb_kernel_range (origin_start, origin_end);
@@ -262,6 +270,7 @@ void kmsan_vmap_pages_range_noflush(unsi ret:kfree (s_pages);kfree (o_pages); +return err; }/* Allocate metadata for pages allocated at boot time. */
mm/vmalloc.c +5 -1
@@ -616,7 +616,11 @@ int __vmap_pages_range_noflush(unsignedint vmap_pages_range_noflush (unsigned long addr,unsigned long end,pgprot_t prot,struct page **pages,unsigned int page_shift) { -kmsan_vmap_pages_range_noflush (addr, end, prot, pages, page_shift); +int ret =kmsan_vmap_pages_range_noflush (addr, end, prot, pages, + page_shift); + +if (ret) +return ret;return __vmap_pages_range_noflush (addr, end, prot, pages, page_shift); }
Greg Kroah-Hartman
maintainerPATCH 91/110 mm: page_alloc: skip regions with hugetlbfs pages when allocating 1G pages
In reply to Greg Kroah-HartmanFrom: Mel Gorman <[email protected]>
commit 4d73ba5fa710fe7d432e0b271e6fecd252aef66e upstream.
A bug was reported by Yuanxi Liu where allocating 1G pages at runtime is taking an excessive amount of time for large amounts of memory. Further testing allocating huge pages that the cost is linear i.e. if allocating 1G pages in batches of 10 then the time to allocate nr_hugepages from 10->20->30->etc increases linearly even though 10 pages are allocated at each step. Profiles indicated that much of the time is spent checking the validity within already existing huge pages and then attempting a migration that fails after isolating the range, draining pages and a whole lot of other useless work.
Commit eb14d4eefdc4 ("mm,page_alloc: drop unnecessary checks from pfn_range_valid_contig") removed two checks, one which ignored huge pages for contiguous allocations as huge pages can sometimes migrate. While there may be value on migrating a 2M page to satisfy a 1G allocation, it's potentially expensive if the 1G allocation fails and it's pointless to try moving a 1G page for a new 1G allocation or scan the tail pages for valid PFNs.
Reintroduce the PageHuge check and assume any contiguous region with hugetlbfs pages is unsuitable for a new 1G allocation.
The hpagealloc test allocates huge pages in batches and reports the average latency per page over time. This test happens just after boot when fragmentation is not an issue. Units are in milliseconds.
hpagealloc
6.3.0-rc6 6.3.0-rc6 6.3.0-rc6
vanilla hugeallocrevert-v1r1 hugeallocsimple-v1r2
Min Latency 26.42 ( 0.00%) 5.07 ( 80.82%) 18.94 ( 28.30%) 1st-qrtle Latency 356.61 ( 0.00%) 5.34 ( 98.50%) 19.85 ( 94.43%) 2nd-qrtle Latency 697.26 ( 0.00%) 5.47 ( 99.22%) 20.44 ( 97.07%) 3rd-qrtle Latency 972.94 ( 0.00%) 5.50 ( 99.43%) 20.81 ( 97.86%) Max-1 Latency 26.42 ( 0.00%) 5.07 ( 80.82%) 18.94 ( 28.30%) Max-5 Latency 82.14 ( 0.00%) 5.11 ( 93.78%) 19.31 ( 76.49%) Max-10 Latency 150.54 ( 0.00%) 5.20 ( 96.55%) 19.43 ( 87.09%) Max-90 Latency 1164.45 ( 0.00%) 5.53 ( 99.52%) 20.97 ( 98.20%) Max-95 Latency 1223.06 ( 0.00%) 5.55 ( 99.55%) 21.06 ( 98.28%) Max-99 Latency 1278.67 ( 0.00%) 5.57 ( 99.56%) 22.56 ( 98.24%) Max Latency 1310.90 ( 0.00%) 8.06 ( 99.39%) 26.62 ( 97.97%) Amean Latency 678.36 ( 0.00%) 5.44 * 99.20%* 20.44 * 96.99%*
6.3.0-rc6 6.3.0-rc6 6.3.0-rc6
vanilla revert-v1 hugeallocfix-v2
Duration User 0.28 0.27 0.30
Duration System 808.66 17.77 35.99
Duration Elapsed 830.87 18.08 36.33The vanilla kernel is poor, taking up to 1.3 second to allocate a huge page and almost 10 minutes in total to run the test. Reverting the problematic commit reduces it to 8ms at worst and the patch takes 26ms. This patch fixes the main issue with skipping huge pages but leaves the page_count() out because a page with an elevated count potentially can migrate.
--- mm/page_alloc.c | 3 +++ 1 file changed, 3 insertions(+)
mm/page_alloc.c +3 -0
@@ -9407,6 +9407,9 @@ static bool pfn_range_valid_contig(strucif (PageReserved (page))return false; + +if (PageHuge (page)) +return false; }return true; }
Greg Kroah-Hartman
maintainerPATCH 92/110 mm/mmap: regression fix for unmapped_area{_topdown}
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
commit 58c5d0d6d522112577c7eeb71d382ea642ed7be4 upstream.
The maple tree limits the gap returned to a window that specifically fits what was asked. This may not be optimal in the case of switching search directions or a gap that does not satisfy the requested space for other reasons. Fix the search by retrying the operation and limiting the search window in the rare occasion that a conflict occurs.
--- mm/mmap.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-)
mm/mmap.c +43 -5
@@ -1565,7 +1565,8 @@ static inline int accountable_mapping(st*/ static unsigned long unmapped_area (struct vm_unmapped_area_info *info) { -unsigned long length, gap; +unsigned long length, gap, low_limit; +struct vm_area_struct *tmp;MA_STATE (mas, ¤t->mm->mm_mt,0 ,0 );
@@ -1574,12 +1575,29 @@ static unsigned long unmapped_area(strucif (length < info->length)return -ENOMEM ; -if (mas_empty_area (&mas, info->low_limit, info->high_limit -1 , - length)) + low_limit = info->low_limit; +retry: +if (mas_empty_area (&mas, low_limit, info->high_limit -1 , length))return -ENOMEM ; gap = mas.index; gap += (info->align_offset - gap) & info->align_mask; + tmp =mas_next (&mas,ULONG_MAX ); +if (tmp && (tmp->vm_flags &VM_GROWSDOWN )) {/* Avoid prev check if possible */ +if (vm_start_gap (tmp) < gap + length -1 ) { + low_limit = tmp->vm_end; +mas_reset (&mas); + goto retry; + } + }else { + tmp =mas_prev (&mas,0 ); +if (tmp &&vm_end_gap (tmp) > gap) { + low_limit =vm_end_gap (tmp); +mas_reset (&mas); + goto retry; + } + } +return gap; }
@@ -1595,7 +1613,8 @@ static unsigned long unmapped_area(struc*/ static unsigned long unmapped_area_topdown (struct vm_unmapped_area_info *info) { -unsigned long length, gap; +unsigned long length, gap, high_limit, gap_end; +struct vm_area_struct *tmp;MA_STATE (mas, ¤t->mm->mm_mt,0 ,0 );/* Adjust search length to account for worst case alignment overhead */
@@ -1603,12 +1622,31 @@ static unsigned long unmapped_area_topdoif (length < info->length)return -ENOMEM ; -if (mas_empty_area_rev (&mas, info->low_limit, info->high_limit -1 , + high_limit = info->high_limit; +retry: +if (mas_empty_area_rev (&mas, info->low_limit, high_limit -1 , length))return -ENOMEM ; gap = mas.last +1 - info->length; gap -= (gap - info->align_offset) & info->align_mask; + gap_end = mas.last; + tmp =mas_next (&mas,ULONG_MAX ); +if (tmp && (tmp->vm_flags &VM_GROWSDOWN )) {/* Avoid prev check if possible */ +if (vm_start_gap (tmp) <= gap_end) { + high_limit =vm_start_gap (tmp); +mas_reset (&mas); + goto retry; + } + }else { + tmp =mas_prev (&mas,0 ); +if (tmp &&vm_end_gap (tmp) > gap) { + high_limit = tmp->vm_start; +mas_reset (&mas); + goto retry; + } + } +return gap; }
Greg Kroah-Hartman
maintainerPATCH 93/110 cifs: avoid dup prefix path in dfs_get_automount_devname()
In reply to Greg Kroah-HartmanFrom: Paulo Alcantara <[email protected]>
commit d5a863a153e90996ab2aef6b9e08d509f4d5662b upstream.
@server->origin_fullpath already contains the tree name + optional prefix, so avoid calling __build_path_from_dentry_optional_prefix() as it might end up duplicating prefix path from @cifs_sb->prepath into final full path.
Instead, generate DFS full path by simply merging
@server->origin_fullpath with dentry's path.
This fixes the following case
mount.cifs //root/dfs/dir /mnt/ -o ... ls /mnt/link
where cifs_dfs_do_automount() will call smb3_parse_devname() with @devname set to "//root/dfs/dir/link" instead of "//root/dfs/dir/dir/link".
--- fs/cifs/cifs_dfs_ref.c | 2 -- fs/cifs/dfs.h | 22 ++++++++++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-)
fs/cifs/cifs_dfs_ref.c +0 -2
@@ -171,8 +171,6 @@ static struct vfsmount *cifs_dfs_do_automount(struct path *path) mnt =ERR_CAST (full_path); goto out; } - -convert_delimiter (full_path,'/' );cifs_dbg (FYI ,"%s: full_path: %s\n" , __func__, full_path); tmp = *cur_ctx;
fs/cifs/dfs.h +18 -4
@@ -34,19 +34,33 @@ static inline int dfs_get_referral(struct cifs_mount_ctx *mnt_ctx, const char *p cifs_remap(cifs_sb), path, ref, tl); } +/* Return DFS full path out of a dentry set for automount */ static inline char *dfs_get_automount_devname (struct dentry *dentry,void *page) {struct cifs_sb_info *cifs_sb =CIFS_SB (dentry->d_sb);struct cifs_tcon *tcon =cifs_sb_master_tcon (cifs_sb);struct TCP_Server_Info *server = tcon->ses->server; +size_t len; +char *s;if (unlikely (!server->origin_fullpath))return ERR_PTR (-EREMOTE ); -return __build_path_from_dentry_optional_prefix (dentry, page, - server->origin_fullpath, -strlen (server->origin_fullpath), - true); + s =dentry_path_raw (dentry, page,PATH_MAX ); +if (IS_ERR (s)) +return s; +/* for root, we want "" */ +if (!s[1 ]) + s++; + + len =strlen (server->origin_fullpath); +if (s < (char *)page + len) +return ERR_PTR (-ENAMETOOLONG ); + + s -= len; +memcpy (s, server->origin_fullpath, len); +convert_delimiter (s,'/' ); +return s; }static inline void dfs_put_root_smb_sessions (struct list_head *head)
Signature · 1 line
2.40.0
Greg Kroah-Hartman
maintainerPATCH 94/110 KVM: arm64: Make vcpu flag updates non-preemptible
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 35dcb3ac663a16510afc27ba2725d70c15e012a5 upstream.
Per-vcpu flags are updated using a non-atomic RMW operation. Which means it is possible to get preempted between the read and write operations.
Another interesting thing to note is that preemption also updates flags, as we have some flag manipulation in both the load and put operations.
It is thus possible to lose information communicated by either load or put, as the preempted flag update will overwrite the flags when the thread is resumed. This is specially critical if either load or put has stored information which depends on the physical CPU the vcpu runs on.
This results in really elusive bugs, and kudos must be given to Mostafa for the long hours of debugging, and finally spotting the problem.
Fix it by disabling preemption during the RMW operation, which ensures that the state stays consistent. Also upgrade vcpu_get_flag path to use READ_ONCE() to make sure the field is always atomically accessed.
--- arch/arm64/include/asm/kvm_host.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
arch/arm64/include/asm/kvm_host.h +18 -1
@@ -533,9 +533,22 @@ struct kvm_vcpu_arch { ({ \__build_check_flag (v, flagset, f, m); \ \ - v->arch.flagset & (m); \ +READ_ONCE (v->arch.flagset) & (m); \ }) +/* +* Note that the set/clear accessors must be preempt-safe in order to +* avoid nesting them with load/put which also manipulate flags... + */ +#ifdef __KVM_NVHE_HYPERVISOR__ +/* the nVHE hypervisor is always non-preemptible */ +#define __vcpu_flags_preempt_disable () +#define __vcpu_flags_preempt_enable () +#else +#define __vcpu_flags_preempt_disable () preempt_disable() +#define __vcpu_flags_preempt_enable () preempt_enable() +#endif +#define __vcpu_set_flag (v, flagset, f, m) \ do { \ typeof(v->arch.flagset) *fset; \
@@ -543,9 +556,11 @@ struct kvm_vcpu_arch {__build_check_flag (v, flagset, f, m); \ \ fset = &v->arch.flagset; \ +__vcpu_flags_preempt_disable (); \if (HWEIGHT (m) >1 ) \ *fset &= ~(m); \ *fset |= (f); \ +__vcpu_flags_preempt_enable (); \ }while (0 ) #define __vcpu_clear_flag(v, flagset, f, m) \
@@ -555,7 +570,9 @@ struct kvm_vcpu_arch {__build_check_flag (v, flagset, f, m); \ \ fset = &v->arch.flagset; \ +__vcpu_flags_preempt_disable (); \ *fset &= ~(m); \ +__vcpu_flags_preempt_enable (); \ } while (0)#define vcpu_get_flag (v, ...) __vcpu_get_flag((v), __VA_ARGS__)
Greg Kroah-Hartman
maintainerPATCH 95/110 KVM: arm64: Fix buffer overflow in kvm_arm_set_fw_reg()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit a25bc8486f9c01c1af6b6c5657234b2eee2c39d6 upstream.
The KVM_REG_SIZE() comes from the ioctl and it can be a power of two between 0-32768 but if it is more than sizeof(long) this will corrupt memory.
--- arch/arm64/kvm/hypercalls.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kvm/hypercalls.c +2 -0
@@ -397,6 +397,8 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu *u64 val;int wa_level; +if (KVM_REG_SIZE (reg->id) !=sizeof (val)) +return -ENOENT ;if (copy_from_user (&val, uaddr,KVM_REG_SIZE (reg->id)))return -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 96/110 MIPS: Define RUNTIME_DISCARD_EXIT in LD script
In reply to Greg Kroah-HartmanFrom: Jiaxun Yang <[email protected]>
commit 6dcbd0a69c84a8ae7a442840a8cf6b1379dc8f16 upstream.
MIPS's exit sections are discarded at runtime as well.
Fixes link error:.exit.text' referenced in section __jump_table' of fs/fuse/inode.o:
defined in discarded section `.exit.text' of fs/fuse/inode.o
--- arch/mips/kernel/vmlinux.lds.S | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/kernel/vmlinux.lds.S +2 -0
@@ -15,6 +15,8 @@ #define EMITS_PT_NOTE #endif +#define RUNTIME_DISCARD_EXIT + #include <asm-generic/vmlinux.lds.h> #undef mips
Greg Kroah-Hartman
maintainerPATCH 97/110 LoongArch: Make -mstrict-align configurable
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit 41596803302d83a67a80dc1efef4e51ac46acabb upstream.
Introduce Kconfig option ARCH_STRICT_ALIGN to make -mstrict-align be configurable.
Not all LoongArch cores support h/w unaligned access, we can use the -mstrict-align build parameter to prevent unaligned accesses.
CPUs with h/w unaligned access support:
Loongson-2K2000/2K3000/3A5000/3C5000/3D5000.
CPUs without h/w unaligned access support:
Loongson-2K500/2K1000.
This option is enabled by default to make the kernel be able to run on all LoongArch systems. But you can disable it manually if you want to run kernel only on systems with h/w unaligned access support in order to optimise for performance.
--- arch/loongarch/Kconfig | 19 +++++++++++++++++++ arch/loongarch/Makefile | 5 +++++ arch/loongarch/kernel/Makefile | 4 +++- arch/loongarch/kernel/traps.c | 9 +++++++-- 4 files changed, 34 insertions(+), 3 deletions(-)
arch/loongarch/Kconfig +19 -0
@@ -94,6 +94,7 @@ config LOONGARCH select HAVE_DYNAMIC_FTRACE_WITH_ARGS select HAVE_DYNAMIC_FTRACE_WITH_REGS select HAVE_EBPF_JIT + select HAVE_EFFICIENT_UNALIGNED_ACCESS if !ARCH_STRICT_ALIGN select HAVE_EXIT_THREAD select HAVE_FAST_GUP select HAVE_FTRACE_MCOUNT_RECORD
@@ -441,6 +442,24 @@ config ARCH_IOREMAP protection support. However, you can enable LoongArch DMW-based ioremap() for better performance. +config ARCH_STRICT_ALIGN + bool "Enable -mstrict-align to prevent unaligned accesses" if EXPERT + default y + help + Not all LoongArch cores support h/w unaligned access, we can use + -mstrict-align build parameter to prevent unaligned accesses. + + CPUs with h/w unaligned access support: + Loongson-2K2000/2K3000/3A5000/3C5000/3D5000. + + CPUs without h/w unaligned access support: + Loongson-2K500/2K1000. + + This option is enabled by default to make the kernel be able to run + on all LoongArch systems. But you can disable it manually if you want + to run kernel only on systems with h/w unaligned access support in + order to optimise for performance. + config KEXEC bool "Kexec system call" select KEXEC_CORE
arch/loongarch/Makefile +5 -0
@@ -91,10 +91,15 @@ KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRES # instead of .eh_frame so we don't discard them. KBUILD_CFLAGS += -fno-asynchronous-unwind-tables +ifdef CONFIG_ARCH_STRICT_ALIGN # Don't emit unaligned accesses. # Not all LoongArch cores support unaligned access, and as kernel we can't # rely on others to provide emulation for these accesses. KBUILD_CFLAGS += $(call cc-option,-mstrict-align) +else +# Optimise for performance on hardware supports unaligned access. +KBUILD_CFLAGS += $(call cc-option,-mno-strict-align) +endif KBUILD_CFLAGS += -isystem $(shell $(CC) -print-file-name=include)
arch/loongarch/kernel/Makefile +3 -1
@@ -8,13 +8,15 @@ extra-y := vmlinux.lds obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \ elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \ - alternative.o unaligned.o unwind.o + alternative.o unwind.o obj-$(CONFIG_ACPI) += acpi.o obj-$(CONFIG_EFI) += efi.o obj-$(CONFIG_CPU_HAS_FPU) += fpu.o +obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o + ifdef CONFIG_FUNCTION_TRACER ifndef CONFIG_DYNAMIC_FTRACE obj-y += mcount.o ftrace.o
arch/loongarch/kernel/traps.c +7 -2
@@ -371,9 +371,14 @@ int no_unaligned_warning __read_mostly = asmlinkage void noinstr do_ale(struct pt_regs *regs) { -unsigned int *pc;irqentry_state_t state =irqentry_enter (regs); +#ifndef CONFIG_ARCH_STRICT_ALIGN +die_if_kernel ("Kernel ale access" , regs); +force_sig_fault (SIGBUS ,BUS_ADRALN , (void __user *)regs->csr_badvaddr); +#else +unsigned int *pc; +perf_sw_event (PERF_COUNT_SW_ALIGNMENT_FAULTS ,1 , regs, regs->csr_badvaddr);/*
@@ -397,8 +402,8 @@ asmlinkage void noinstr do_ale(struct pt sigbus:die_if_kernel ("Kernel ale access" , regs);force_sig_fault (SIGBUS ,BUS_ADRALN , (void __user *)regs->csr_badvaddr); - out: +#endif irqentry_exit (regs, state); }
Greg Kroah-Hartman
maintainerPATCH 98/110 LoongArch: Make WriteCombine configurable for ioremap()
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit 16c52e503043aed1e2a2ce38d9249de5936c1f6b upstream.
LoongArch maintains cache coherency in hardware, but when paired with LS7A chipsets the WUC attribute (Weak-ordered UnCached, which is similar to WriteCombine) is out of the scope of cache coherency machanism for PCIe devices (this is a PCIe protocol violation, which may be fixed in newer chipsets).
This means WUC can only used for write-only memory regions now, so this option is disabled by default, making WUC silently fallback to SUC for ioremap(). You can enable this option if the kernel is ensured to run on hardware without this bug.
Kernel parameter writecombine=on/off can be used to override the Kconfig option.
--- Documentation/admin-guide/kernel-parameters.rst | 1 + Documentation/admin-guide/kernel-parameters.txt | 6 ++++++ arch/loongarch/Kconfig | 16 ++++++++++++++++ arch/loongarch/include/asm/io.h | 4 +++- arch/loongarch/kernel/setup.c | 21 +++++++++++++++++++++ 5 files changed, 47 insertions(+), 1 deletion(-)
Documentation/admin-guide/kernel-parameters.rst +1 -0
@@ -128,6 +128,7 @@ parameter is applicable:: KVM Kernel Virtual Machine support is enabled. LIBATA Libata driver is enabled LP Printer support is enabled. + LOONGARCH LoongArch architecture is enabled. LOOP Loopback device support is enabled. M68k M68k architecture is enabled. These options have more detailed description inside of
Documentation/admin-guide/kernel-parameters.txt +6 -0
@@ -6874,6 +6874,12 @@ When enabled, memory and cache locality will be impacted. + writecombine= [LOONGARCH] Control the MAT (Memory Access Type) of + ioremap_wc(). + + on - Enable writecombine, use WUC for ioremap_wc() + off - Disable writecombine, use SUC for ioremap_wc() + x2apic_phys [X86-64,APIC] Use x2apic physical mode instead of default x2apic cluster mode on platforms supporting x2apic.
arch/loongarch/Kconfig +16 -0
@@ -442,6 +442,22 @@ config ARCH_IOREMAP protection support. However, you can enable LoongArch DMW-based ioremap() for better performance. +config ARCH_WRITECOMBINE + bool "Enable WriteCombine (WUC) for ioremap()" + help + LoongArch maintains cache coherency in hardware, but when paired + with LS7A chipsets the WUC attribute (Weak-ordered UnCached, which + is similar to WriteCombine) is out of the scope of cache coherency + machanism for PCIe devices (this is a PCIe protocol violation, which + may be fixed in newer chipsets). + + This means WUC can only used for write-only memory regions now, so + this option is disabled by default, making WUC silently fallback to + SUC for ioremap(). You can enable this option if the kernel is ensured + to run on hardware without this bug. + + You can override this setting via writecombine=on/off boot parameter. + config ARCH_STRICT_ALIGN bool "Enable -mstrict-align to prevent unaligned accesses" if EXPERT default y
arch/loongarch/include/asm/io.h +3 -1
@@ -54,8 +54,10 @@ static inline void __iomem *ioremap_prot* @offset: bus address of the memory * @size: size of the resource to map */ +extern pgprot_t pgprot_wc; +#define ioremap_wc (offset, size) \ - ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL_WUC)) + ioremap_prot((offset), (size), pgprot_val(pgprot_wc))#define ioremap_cache (offset, size) \ ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL))
arch/loongarch/kernel/setup.c +21 -0
@@ -160,6 +160,27 @@ static void __init smbios_parse(void)dmi_walk (find_tokens,NULL ); } +#ifdef CONFIG_ARCH_WRITECOMBINE +pgprot_t pgprot_wc =PAGE_KERNEL_WUC ; +#else +pgprot_t pgprot_wc =PAGE_KERNEL_SUC ; +#endif + +EXPORT_SYMBOL (pgprot_wc); + +static int __init setup_writecombine (char *p) +{ +if (!strcmp (p,"on" )) + pgprot_wc =PAGE_KERNEL_WUC ; +else if (!strcmp (p,"off" )) + pgprot_wc =PAGE_KERNEL_SUC ; +else +pr_warn ("Unknown writecombine setting \"%s\".\n" , p); + +return 0 ; +} +early_param ("writecombine" , setup_writecombine); +static int usermem__initdata ;static int __init early_parse_mem (char *p)
Greg Kroah-Hartman
maintainerPATCH 99/110 purgatory: fix disabling debug info
In reply to Greg Kroah-HartmanFrom: Alyssa Ross <[email protected]>
commit d83806c4c0cccc0d6d3c3581a11983a9c186a138 upstream.
Since 32ef9e5054ec, -Wa,-gdwarf-2 is no longer used in KBUILD_AFLAGS. Instead, it includes -g, the appropriate -gdwarf-* flag, and also the -Wa versions of both of those if building with Clang and GNU as. As a result, debug info was being generated for the purgatory objects, even though the intention was that it not be.
--- arch/riscv/purgatory/Makefile | 4 +--- arch/x86/purgatory/Makefile | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-)
arch/riscv/purgatory/Makefile +1 -3
@@ -74,9 +74,7 @@ CFLAGS_string.o += $(PURGATORY_CFLAGS) CFLAGS_REMOVE_ctype.o += $(PURGATORY_CFLAGS_REMOVE) CFLAGS_ctype.o += $(PURGATORY_CFLAGS) -AFLAGS_REMOVE_entry.o += -Wa,-gdwarf-2 -AFLAGS_REMOVE_memcpy.o += -Wa,-gdwarf-2 -AFLAGS_REMOVE_memset.o += -Wa,-gdwarf-2 +asflags-remove-y += $(foreach x, -g -gdwarf-4 -gdwarf-5, $(x) -Wa,$(x)) $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE $(call if_changed,ld)
arch/x86/purgatory/Makefile +1 -2
@@ -69,8 +69,7 @@ CFLAGS_sha256.o += $(PURGATORY_CFLAGS) CFLAGS_REMOVE_string.o += $(PURGATORY_CFLAGS_REMOVE) CFLAGS_string.o += $(PURGATORY_CFLAGS) -AFLAGS_REMOVE_setup-x86_$(BITS).o += -Wa,-gdwarf-2 -AFLAGS_REMOVE_entry64.o += -Wa,-gdwarf-2 +asflags-remove-y += $(foreach x, -g -gdwarf-4 -gdwarf-5, $(x) -Wa,$(x)) $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE $(call if_changed,ld)
Greg Kroah-Hartman
maintainerPATCH 100/110 PCI/MSI: Remove over-zealous hardware size check in pci_msix_validate_entries()
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
commit e3c026be4d3ca046799fde55ccbae9d0f059fb93 upstream.
pci_msix_validate_entries() validates the entries array which is handed in by the caller for a MSI-X interrupt allocation. Aside of consistency failures it also detects a failure when the size of the MSI-X hardware table in the device is smaller than the size of the entries array.
That's wrong for the case of range allocations where the caller provides the minimum and the maximum number of vectors to allocate, when the hardware size is greater or equal than the mininum, but smaller than the maximum.
Remove the hardware size check completely from that function and just ensure that the entires array up to the maximum size is consistent.
The limitation and range checking versus the hardware size happens independently of that afterwards anyway because the entries array is optional.
--- drivers/pci/msi/msi.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/pci/msi/msi.c +2 -7
@@ -750,8 +750,7 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,return ret; } -static bool pci_msix_validate_entries (struct pci_dev *dev,struct msix_entry *entries, -int nvec,int hwsize) +static bool pci_msix_validate_entries (struct pci_dev *dev,struct msix_entry *entries,int nvec) {bool nogap;int i, j;
@@ -762,10 +761,6 @@ static bool pci_msix_validate_entries(struct pci_dev *dev, struct msix_entry *en nogap =pci_msi_domain_supports (dev,MSI_FLAG_MSIX_CONTIGUOUS ,DENY_LEGACY );for (i =0 ; i < nvec; i++) { -/* Entry within hardware limit? */ -if (entries[i].entry >= hwsize) -return false; -/* Check for duplicate entries */ for (j = i +1 ; j < nvec; j++) {if (entries[i].entry == entries[j].entry)
@@ -805,7 +800,7 @@ int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, intif (hwsize <0 )return hwsize; -if (!pci_msix_validate_entries (dev, entries, nvec, hwsize)) +if (!pci_msix_validate_entries (dev, entries, nvec))return -EINVAL ;if (hwsize < nvec) {
Signature · 1 line
2.40.0
Greg Kroah-Hartman
maintainerPATCH 101/110 gcc: disable -Warray-bounds for gcc-13 too
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 0da6e5fd6c3726723e275603426e09178940dace upstream.
We started disabling '-Warray-bounds' for gcc-12 originally on s390, because it resulted in some warnings that weren't realistically fixable (commit 8b202ee21839: "s390: disable -Warray-bounds").
That s390-specific issue was then found to be less common elsewhere, but generic (see f0be87c42cbd: "gcc-12: disable '-Warray-bounds' universally for now"), and then later expanded the version check was expanded to gcc-11 (5a41237ad1d4: "gcc: disable -Warray-bounds for gcc-11 too").
And it turns out that I was much too optimistic in thinking that it's all going to go away, and here we are with gcc-13 showing all the same issues. So instead of expanding this one version at a time, let's just disable it for gcc-11+, and put an end limit to it only when we actually find a solution.
Yes, I'm sure some of this is because the kernel just does odd things (like our "container_of()" use, but also knowingly playing games with things like linker tables and array layouts).
And yes, some of the warnings are likely signs of real bugs, but when there are hundreds of false positives, that doesn't really help.
Oh well.
--- init/Kconfig | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
init/Kconfig +3 -7
@@ -894,18 +894,14 @@ config CC_IMPLICIT_FALLTHROUGH default "-Wimplicit-fallthrough=5" if CC_IS_GCC && $(cc-option,-Wimplicit-fallthrough=5) default "-Wimplicit-fallthrough" if CC_IS_CLANG && $(cc-option,-Wunreachable-code-fallthrough) -# Currently, disable gcc-11,12 array-bounds globally. -# We may want to target only particular configurations some day. +# Currently, disable gcc-11+ array-bounds globally. +# It's still broken in gcc-13, so no upper bound yet. config GCC11_NO_ARRAY_BOUNDS def_bool y -config GCC12_NO_ARRAY_BOUNDS - def_bool y - config CC_NO_ARRAY_BOUNDS bool - default y if CC_IS_GCC && GCC_VERSION >= 110000 && GCC_VERSION < 120000 && GCC11_NO_ARRAY_BOUNDS - default y if CC_IS_GCC && GCC_VERSION >= 120000 && GCC_VERSION < 130000 && GCC12_NO_ARRAY_BOUNDS + default y if CC_IS_GCC && GCC_VERSION >= 110000 && GCC11_NO_ARRAY_BOUNDS # # For architectures that know their GCC __int128 support is sound
Greg Kroah-Hartman
maintainerPATCH 102/110 Input: cyttsp5 - fix sensing configuration data structure
In reply to Greg Kroah-HartmanFrom: hrdl <[email protected]>
commit 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 upstream.
Prior to this patch, the sensing configuration data was not parsed correctly, breaking detection of max_tch. The vendor driver includes this field. This change informs the driver about the correct maximum number of simultaneous touch inputs.
Tested on a Pine64 PineNote with a modified touch screen controller firmware.
--- drivers/input/touchscreen/cyttsp5.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/touchscreen/cyttsp5.c +1 -0
@@ -111,6 +111,7 @@ struct cyttsp5_sensing_conf_data_dev {__le16 max_z;u8 origin_x;u8 origin_y; +u8 panel_id;u8 btn;u8 scan_mode;u8 max_num_of_tch_per_refresh_cycle;
Greg Kroah-Hartman
maintainerPATCH 103/110 Input: pegasus-notetaker - check pipe type when probing
In reply to Greg Kroah-HartmanFrom: Soumya Negi <[email protected]>
commit b3d80fd27a3c2d8715a40cbf876139b56195f162 upstream.
Fix WARNING in pegasus_open/usb_submit_urb
Syzbot bug: https://syzkaller.appspot.com/bug?id=bbc107584dcf3262253ce93183e51f3612aaeb13
Warning raised because pegasus_driver submits transfer request for bogus URB (pipe type does not match endpoint type). Add sanity check at probe time for pipe value extracted from endpoint descriptor. Probe will fail if sanity check fails.
--- drivers/input/tablet/pegasus_notetaker.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/input/tablet/pegasus_notetaker.c +6 -0
@@ -296,6 +296,12 @@ static int pegasus_probe(struct usb_inte pegasus->intf = intf; pipe =usb_rcvintpipe (dev, endpoint->bEndpointAddress); +/* Sanity check that pipe's type matches endpoint's type */ +if (usb_pipe_type_check (dev, pipe)) { + error = -EINVAL ; + goto err_free_mem; + } + pegasus->data_len =usb_maxpacket (dev, pipe); pegasus->data = usb_alloc_coherent(dev, pegasus->data_len, GFP_KERNEL,
Greg Kroah-Hartman
maintainerPATCH 104/110 iio: adc: at91-sama5d2_adc: fix an error code in at91_adc_allocate_trigger()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
commit 73a428b37b9b538f8f8fe61caa45e7f243bab87c upstream.
The at91_adc_allocate_trigger() function is supposed to return error pointers. Returning a NULL will cause an Oops.
--- drivers/iio/adc/at91-sama5d2_adc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/adc/at91-sama5d2_adc.c +1 -1
@@ -1409,7 +1409,7 @@ static struct iio_trigger *at91_adc_allo trig =devm_iio_trigger_alloc (&indio->dev,"%s-dev%d-%s" , indio->name,iio_device_id (indio), trigger_name);if (!trig) -return NULL ; +return ERR_PTR (-ENOMEM ); trig->dev.parent = indio->dev.parent;iio_trigger_set_drvdata (trig, indio);
Greg Kroah-Hartman
maintainerPATCH 105/110 fpga: bridge: properly initialize bridge device before populating children
In reply to Greg Kroah-HartmanFrom: Alexis Lothoré <[email protected]>
commit dc70eb868b9cd2ca01313e5a394e6ea001d513e9 upstream.
The current code path can lead to warnings because of uninitialized device, which contains, as a consequence, uninitialized kobject. The uninitialized device is passed to of_platform_populate, which will at some point, while creating child device, try to get a reference on uninitialized parent, resulting in the following warning:
kobject: '(null)' ((ptrval)): is not initialized, yet kobject_get() is being called.
The warning is observed after migrating a kernel 5.10.x to 6.1.x. Reverting commit 0d70af3c2530 ("fpga: bridge: Use standard dev_release for class driver") seems to remove the warning.
This commit aggregates device_initialize() and device_add() into device_register() but this new call is done AFTER of_platform_populate
--- drivers/fpga/fpga-bridge.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/fpga/fpga-bridge.c +2 -1
@@ -360,7 +360,6 @@ fpga_bridge_register(struct device *pare bridge->dev.parent = parent; bridge->dev.of_node = parent->of_node; bridge->dev.id = id; -of_platform_populate (bridge->dev.of_node,NULL ,NULL , &bridge->dev); ret =dev_set_name (&bridge->dev,"br%d" , id);if (ret)
@@ -372,6 +371,8 @@ fpga_bridge_register(struct device *parereturn ERR_PTR (ret); } +of_platform_populate (bridge->dev.of_node,NULL ,NULL , &bridge->dev); +return bridge; error_device:
Greg Kroah-Hartman
maintainerPATCH 106/110 mm/page_alloc: fix potential deadlock on zonelist_update_seq seqlock
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit 1007843a91909a4995ee78a538f62d8665705b66 upstream.
syzbot is reporting circular locking dependency which involves zonelist_update_seq seqlock [1], for this lock is checked by memory allocation requests which do not need to be retried.
One deadlock scenario is kmalloc(GFP_ATOMIC) from an interrupt handler.
CPU0
----
__build_all_zonelists() {
write_seqlock(&zonelist_update_seq); // makes zonelist_update_seq.seqcount odd
// e.g. timer interrupt handler runs at this moment
some_timer_func() {
kmalloc(GFP_ATOMIC) {
__alloc_pages_slowpath() {
read_seqbegin(&zonelist_update_seq) {
// spins forever because zonelist_update_seq.seqcount is odd
}
}
}
}
// e.g. timer interrupt handler finishes
write_sequnlock(&zonelist_update_seq); // makes zonelist_update_seq.seqcount even
}This deadlock scenario can be easily eliminated by not calling read_seqbegin(&zonelist_update_seq) from !__GFP_DIRECT_RECLAIM allocation requests, for retry is applicable to only __GFP_DIRECT_RECLAIM allocation requests. But Michal Hocko does not know whether we should go with this approach.
Another deadlock scenario which syzbot is reporting is a race between kmalloc(GFP_ATOMIC) from tty_insert_flip_string_and_push_buffer() with port->lock held and printk() from __build_all_zonelists() with zonelist_update_seq held.
CPU0 CPU1
---- ----
pty_write() {
tty_insert_flip_string_and_push_buffer() {
__build_all_zonelists() {
write_seqlock(&zonelist_update_seq);
build_zonelists() {
printk() {
vprintk() {
vprintk_default() {
vprintk_emit() {
console_unlock() {
console_flush_all() {
console_emit_next_record() {
con->write() = serial8250_console_write() {
spin_lock_irqsave(&port->lock, flags);
tty_insert_flip_string() {
tty_insert_flip_string_fixed_flag() {
__tty_buffer_request_room() {
tty_buffer_alloc() {
kmalloc(GFP_ATOMIC | __GFP_NOWARN) {
__alloc_pages_slowpath() {
zonelist_iter_begin() {
read_seqbegin(&zonelist_update_seq); // spins forever because zonelist_update_seq.seqcount is odd
spin_lock_irqsave(&port->lock, flags); // spins forever because port->lock is held
}
}
}
}
}
}
}
}
spin_unlock_irqrestore(&port->lock, flags);
// message is printed to console
spin_unlock_irqrestore(&port->lock, flags);
}
}
}
}
}
}
}
}
}
write_sequnlock(&zonelist_update_seq);
}
}
}This deadlock scenario can be eliminated by
preventing interrupt context from calling kmalloc(GFP_ATOMIC)
and
preventing printk() from calling console_flush_all()
while zonelist_update_seq.seqcount is odd.
Since Petr Mladek thinks that __build_all_zonelists() can become a candidate for deferring printk() [2], let's address this problem by
disabling local interrupts in order to avoid kmalloc(GFP_ATOMIC)
and
disabling synchronous printk() in order to avoid console_flush_all()
.
As a side effect of minimizing duration of zonelist_update_seq.seqcount being odd by disabling synchronous printk(), latency at read_seqbegin(&zonelist_update_seq) for both !__GFP_DIRECT_RECLAIM and __GFP_DIRECT_RECLAIM allocation requests will be reduced. Although, from lockdep perspective, not calling read_seqbegin(&zonelist_update_seq) (i.e. do not record unnecessary locking dependency) from interrupt context is still preferable, even if we don't allow calling kmalloc(GFP_ATOMIC) inside write_seqlock(&zonelist_update_seq)/write_sequnlock(&zonelist_update_seq) section...
--- mm/page_alloc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
mm/page_alloc.c +16 -0
@@ -6590,7 +6590,21 @@ static void __build_all_zonelists(void *int nid;int __maybe_unused cpu;pg_data_t *self = data; +unsigned long flags; +/* +* Explicitly disable this CPU's interrupts before taking seqlock +* to prevent any IRQ handler from calling into the page allocator +* (e.g. GFP_ATOMIC) that could hit zonelist_iter_begin and livelock. +*/ +local_irq_save (flags); +/* +* Explicitly disable this CPU's synchronous printk() before taking +* seqlock to prevent any printk() from trying to hold port->lock, for +* tty_insert_flip_string_and_push_buffer() on other CPU might be +* calling kmalloc(GFP_ATOMIC | __GFP_NOWARN) with port->lock held. +*/ +printk_deferred_enter ();write_seqlock (&zonelist_update_seq);#ifdef CONFIG_NUMA
@@ -6629,6 +6643,8 @@ static void __build_all_zonelists(void * }write_sequnlock (&zonelist_update_seq); +printk_deferred_exit (); +local_irq_restore (flags); }static noinline void__init
Greg Kroah-Hartman
maintainerPATCH 107/110 ASoC: SOF: pm: Tear down pipelines only if DSP was active
In reply to Greg Kroah-HartmanFrom: Daniel Baluta <[email protected]>
commit 0b186bb06198653d74a141902a7739e0bde20cf4 upstream.
With PCI if the device was suspended it is brought back to full power and then suspended again.
This doesn't happen when device is described via DT.
We need to make sure that we tear down pipelines only if the device was previously active (thus the pipelines were setup).
Otherwise, we can break the use_count:
[ 219.009743] sof-audio-of-imx8m 3b6e8000.dsp:
sof_ipc3_tear_down_all_pipelines: widget PIPELINE.2.SAI3.IN is still in use: count -1
and after this everything stops working.
--- sound/soc/sof/pm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/soc/sof/pm.c +7 -1
@@ -183,6 +183,7 @@ static int sof_suspend(struct device *deconst struct sof_ipc_tplg_ops *tplg_ops = sdev->ipc->ops->tplg;pm_message_t pm_state;u32 target_state =snd_sof_dsp_power_target (sdev); +u32 old_state = sdev->dsp_power_state.state;int ret;/* do nothing if dsp suspend callback is not set */
@@ -192,7 +193,12 @@ static int sof_suspend(struct device *deif (runtime_suspend && !sof_ops (sdev)->runtime_suspend)return 0 ; -if (tplg_ops && tplg_ops->tear_down_all_pipelines) +/* we need to tear down pipelines only if the DSP hardware is +* active, which happens for PCI devices. if the device is +* suspended, it is brought back to full power and then +* suspended again +*/ +if (tplg_ops && tplg_ops->tear_down_all_pipelines && (old_state ==SOF_DSP_PM_D0 )) tplg_ops->tear_down_all_pipelines (sdev, false);if (sdev->fw_state !=SOF_FW_BOOT_COMPLETE )
Greg Kroah-Hartman
maintainerPATCH 108/110 ASoC: fsl_asrc_dma: fix potential null-ptr-deref
In reply to Greg Kroah-HartmanFrom: Nikita Zhandarovich <[email protected]>
commit 86a24e99c97234f87d9f70b528a691150e145197 upstream.
dma_request_slave_channel() may return NULL which will lead to NULL pointer dereference error in 'tmp_chan->private'.
Correct this behaviour by, first, switching from deprecated function dma_request_slave_channel() to dma_request_chan(). Secondly, enable sanity check for the resuling value of dma_request_chan(). Also, fix description that follows the enacted changes and that concerns the use of dma_request_slave_channel().
--- sound/soc/fsl/fsl_asrc_dma.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
sound/soc/fsl/fsl_asrc_dma.c +8 -3
@@ -209,14 +209,19 @@ static int fsl_asrc_dma_hw_params(struct be_chan =soc_component_to_pcm (component_be)->chan[substream->stream]; tmp_chan = be_chan; } -if (!tmp_chan) - tmp_chan =dma_request_slave_channel (dev_be, tx ?"tx" :"rx" ); +if (!tmp_chan) { + tmp_chan =dma_request_chan (dev_be, tx ?"tx" :"rx" ); +if (IS_ERR (tmp_chan)) { +dev_err (dev,"failed to request DMA channel for Back-End\n" ); +return -EINVAL ; + } + }/* * An EDMA DEV_TO_DEV channel is fixed and bound with DMA event of each * peripheral, unlike SDMA channel that is allocated dynamically. So no * need to configure dma_request and dma_request2, but get dma_chan of -* Back-End device directly via dma_request_slave_channel. +* Back-End device directly via dma_request_chan. */ if (!asrc->use_edma) {/* Get DMA request of Back-End */
Greg Kroah-Hartman
maintainerPATCH 109/110 ASoC: fsl_sai: Fix pins setting for i.MX8QM platform
In reply to Greg Kroah-HartmanFrom: Chancel Liu <[email protected]>
commit 238787157d83969e5149c8e99787d5d90e85fbe5 upstream.
SAI on i.MX8QM platform supports the data lines up to 4. So the pins setting should be corrected to 4.
--- sound/soc/fsl/fsl_sai.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/fsl/fsl_sai.c +1 -1
@@ -1543,7 +1543,7 @@ static const struct fsl_sai_soc_data fsl .use_imx_pcm = true, .use_edma = true, .fifo_depth = 64, - .pins = 1, + .pins = 4, .reg_offset = 0, .mclk0_is_mclk1 = false, .flags = 0,
Greg Kroah-Hartman
maintainerPATCH 110/110 ASN.1: Fix check for strdup() success
In reply to Greg Kroah-HartmanFrom: Ekaterina Orlova <[email protected]>
commit 5a43001c01691dcbd396541e6faa2c0077378f48 upstream.
It seems there is a misprint in the check of strdup() return code that can lead to NULL pointer dereference.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- scripts/asn1_compiler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/asn1_compiler.c +1 -1
@@ -625,7 +625,7 @@ int main(int argc, char **argv) p =strrchr (argv[1 ],'/' ); p = p ? p +1 : argv[1 ]; grammar_name =strdup (p); -if (!p) { +if (!grammar_name) {perror (NULL );exit (1 ); }
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
Hi Greg
6.2.13-rc1
compiles, boots and runs here on x86_64
(AMD Ryzen 5 PRO 4650G, Slackware64-15.0)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
Build results:
total: 155 pass: 155 fail: 0 Qemu test results: total: 520 pass: 520 fail: 0
Guenter
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Successfully cross-compiled for arm64 (bcm2711_defconfig, GCC 10.2.0) and powerpc (ps3_defconfig, GCC 12.2.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Successfully cross-compiled for arm64 (bcm2711_defconfig, GCC 10.2.0) and powerpc (ps3_defconfig, GCC 12.2.0).
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Thanks,
Conor.
Hello Greg,
Quoted 10 lines
From: Greg Kroah-Hartman <[email protected]>
Sent: Monday, April 24, 2023 2:16 PMThis is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
CIP configurations built and booted with Linux 6.2.13-rc1 (9e5d20c13940):
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/pipelines/847554821/
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/commits/linux-6.2.y
Kind regards, Chris
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.2:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
130 tests: 130 pass, 0 failLinux version: 6.2.13-rc1-g9e5d20c13940
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.2:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
130 tests: 130 pass, 0 failLinux version: 6.2.13-rc1-g9e5d20c13940
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 6.2.13-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-6.2.y
* git commit: 9e5d20c139403093b3899c2aeac481792aed6826
* git describe: v6.2.9-608-g9e5d20c13940
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.2.y/build/v6.2.9-608-g9e5d20c13940
## Test Regressions (compared to v6.2.9-497-g7507bdf58f79)
## Metric Regressions (compared to v6.2.9-497-g7507bdf58f79)
## Test Fixes (compared to v6.2.9-497-g7507bdf58f79)
## Metric Fixes (compared to v6.2.9-497-g7507bdf58f79)
## Test result summary
total: 194288, pass: 162649, fail: 3944, skip: 27389, xfail: 306
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 145 total, 142 passed, 3 failed
* arm64: 54 total, 53 passed, 1 failed
* i386: 41 total, 38 passed, 3 failed
* mips: 30 total, 28 passed, 2 failed
* parisc: 8 total, 8 passed, 0 failed
* powerpc: 38 total, 36 passed, 2 failed
* riscv: 26 total, 25 passed, 1 failed
* s390: 16 total, 16 passed, 0 failed
* sh: 14 total, 12 passed, 2 failed
* sparc: 8 total, 7 passed, 1 failed
* x86_64: 46 total, 46 passed, 0 failed
## Test suites summary
* boot
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-user_events
* kselftest-vDSO
* kselftest-vm
* kselftest-watchdog
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* perf
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.2.13 release. There are 110 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 26 Apr 2023 13:11:11 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.2.13-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.2.y
and the diffstat can be found below.thanks,
greg k-h
Tested rc1 against the Fedora build system (aarch64, armv7, ppc64le, s390x, x86_64), and boot tested x86_64. No regressions noted.