Linux 6.2.13
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.2.13 kernel.
All users of the 6.2 kernel series must upgrade.
The updated 6.2.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.2.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/admin-guide/kernel-parameters.rst | 1 Documentation/admin-guide/kernel-parameters.txt | 6 Makefile | 2 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 arch/arm64/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 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 17 ++ drivers/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 drivers/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 - drivers/net/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 + tools/testing/selftests/sigaltstack/current_stack_pointer.h | 23 +++ tools/testing/selftests/sigaltstack/sas.c | 7 - tools/vm/page_owner_sort.c | 2 126 files changed, 1016 insertions(+), 465 deletions(-)
Alan Liu (1):
drm/amdgpu: Fix desktop freezed after gpu-reset
Aleksandr Loktionov (2):
i40e: fix accessing vsi->active_filters without holding lock
i40e: fix i40e_setup_misc_vector() error handling
Alexander Aring (1):
net: rpl: fix rpl header size calculation
Alexander Potapenko (2):
mm: kmsan: handle alloc failures in kmsan_ioremap_page_range()
mm: kmsan: handle alloc failures in kmsan_vmap_pages_range_noflush()
Alexis Lothoré (1):
fpga: bridge: properly initialize bridge device before populating children
Alyssa Ross (1):
purgatory: fix disabling debug info
Andy Chi (1):
ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook
Baokun Li (1):
writeback, cgroup: fix null-ptr-deref write in bdi_split_work_to_wbs
Bhavya Kapoor (1):
mmc: sdhci_am654: Set HIGH_SPEED_ENA for SDR12 and SDR25
Boris Burkov (2):
btrfs: set default discard iops_limit to 1000
btrfs: reinterpret async discard iops_limit=0 as no delay
Brian Masney (1):
iio: light: tsl2772: fix reading proximity-diodes from device tree
Chancel Liu (1):
ASoC: fsl_sai: Fix pins setting for i.MX8QM platform
Chen Aotian (1):
netfilter: nf_tables: Modify nla_memdup's flag to GFP_KERNEL_ACCOUNT
Christophe JAILLET (1):
net: dsa: microchip: ksz8795: Correctly handle huge frame configuration
Cristian Ciocaltea (2):
regulator: fan53555: Explicitly include bits header
regulator: fan53555: Fix wrong TCS_SLEW_MASK
Damien Le Moal (1):
scsi: core: Improve scsi_vpd_inquiry() checks
Dan Carpenter (2):
KVM: arm64: Fix buffer overflow in kvm_arm_set_fw_reg()
iio: adc: at91-sama5d2_adc: fix an error code in at91_adc_allocate_trigger()
Dan Johansen (1):
arm64: dts: rockchip: Lower sd speed on rk3566-soquartz
Daniel Baluta (1):
ASoC: SOF: pm: Tear down pipelines only if DSP was active
Daniel Borkmann (1):
bpf: Fix incorrect verifier pruning due to missing register precision taints
David Gow (3):
drm: buddy_allocator: Fix buddy allocator init on 32-bit systems
drm: test: Fix 32-bit issue in drm_buddy_test
rust: kernel: Mark rust_fmt_argument as extern "C"
David Hildenbrand (1):
mm/userfaultfd: fix uffd-wp handling for THP migration entries
Ding Hui (1):
sfc: Fix use-after-free due to selftest_work
Dmitry Baryshkov (2):
arm64: dts: qcom: ipq8074-hk01: enable QMP device, not the PHY node
arm64: dts: qcom: ipq8074-hk10: enable QMP device, not the PHY node
Dmytro Laktyushkin (1):
drm/amd/display: set dcn315 lb bpp to 48
Dongliang Mu (1):
platform/x86/intel: vsec: Fix a memory leak in intel_vsec_add_aux
Douglas Raillard (1):
f2fs: Fix f2fs_truncate_partial_nodes ftrace event
Duoming Zhou (1):
cxgb4: fix use after free bugs caused by circular dependency problem
Ekaterina Orlova (1):
ASN.1: Fix check for strdup() success
Florian Westphal (2):
netfilter: br_netfilter: fix recent physdev match breakage
netfilter: nf_tables: fix ifdef to also consider nf_tables=m
Frank Crawford (1):
platform/x86 (gigabyte-wmi): Add support for A320M-S2H V2
Greg Kroah-Hartman (3):
mtd: spi-nor: fix memory leak when using debugfs_lookup()
memstick: fix memory leak if card device is never registered Linux 6.2.13
Gwangun Jung (1):
net: sched: sch_qfq: prevent slab-out-of-bounds in qfq_activate_agg
Hans de Goede (1):
platform/x86: gigabyte-wmi: add support for X570S AORUS ELITE
Heiko Carstens (1):
s390/ptrace: fix PTRACE_GET_LAST_BREAK error handling
Huacai Chen (6):
LoongArch: Fix build error if CONFIG_SUSPEND is not set
LoongArch: module: set section addresses to 0x0
LoongArch: Fix probing of the CRC32 feature
LoongArch: Mark 3 symbol exports as non-GPL
LoongArch: Make -mstrict-align configurable
LoongArch: Make WriteCombine configurable for ioremap()
Ido Schimmel (2):
bonding: Fix memory leak when changing bond type to Ethernet
mlxsw: pci: Fix possible crash during initialization
Jianqun Xu (1):
ARM: dts: rockchip: fix a typo error for rk3288 spdif node
Jiaxun Yang (1):
MIPS: Define RUNTIME_DISCARD_EXIT in LD script
Johan Hovold (1):
arm64: dts: qcom: sc8280xp-pmics: fix pon compatible and registers
Juergen Gross (1):
xen/netback: use same error messages for same errors
Li Lanzhe (1):
spi: spi-rockchip: Fix missing unwind goto in rockchip_sfc_probe()
Liam R. Howlett (3):
maple_tree: make maple state reusable after mas_empty_area_rev()
maple_tree: fix mas_empty_area() search
mm/mmap: regression fix for unmapped_area{_topdown}
Liang He (1):
iio: dac: ad5755: Add missing fwnode_handle_put()
Linus Torvalds (2):
Revert "ACPICA: Events: Support fixed PCIe wake event"
gcc: disable '-Warray-bounds' for gcc-13 too
Marc Gonzalez (3):
arm64: dts: meson-g12-common: specify full DMC range
arm64: dts: meson-g12-common: resolve conflict between canvas & pmu perf/amlogic: adjust register offsets
Marc Zyngier (1):
KVM: arm64: Make vcpu flag updates non-preemptible
Mathieu Desnoyers (1):
mm: fix memory leak on mm_init error handling
Mel Gorman (1):
mm: page_alloc: skip regions with hugetlbfs pages when allocating 1G pages
Michael Chan (1):
bnxt_en: Do not initialize PTP on older P3/P4 chips
Naoya Horiguchi (1):
mm/huge_memory.c: warn with pr_warn_ratelimited instead of VM_WARN_ON_ONCE_FOLIO
Nick Desaulniers (1):
selftests: sigaltstack: fix -Wuninitialized
Nikita Zhandarovich (2):
mlxfw: fix null-ptr-deref in mlxfw_mfa2_tlv_next()
ASoC: fsl_asrc_dma: fix potential null-ptr-deref
Ondrej Mosnacek (1):
kernel/sys.c: fix and improve control flow in __sys_setres[ug]id()
Pablo Neira Ayuso (2):
netfilter: nf_tables: validate catch-all set elements
netfilter: nf_tables: tighten netlink attribute requirements for catch-all elements
Paolo Abeni (2):
mptcp: stops worker on unaccepted sockets at listener close
mptcp: fix accept vs worker race
Patrick Blass (1):
rust: str: fix requierments->requirements typo
Paulo Alcantara (1):
cifs: avoid dup prefix path in dfs_get_automount_devname()
Peng Fan (3):
arm64: dts: imx8mm-evk: correct pmic clock source
arm64: dts: imx8mm-verdin: correct off-on-delay
arm64: dts: imx8mp-verdin: correct off-on-delay
Peng Zhang (1):
maple_tree: fix a potential memory leak, OOB access, or other unpredictable bug
Peter Ujfalusi (1):
ASoC: SOF: ipc4-topology: Clarify bind failure caused by missing fw_module
Peter Xu (2):
Revert "userfaultfd: don't fail on unrecognized features" mm/khugepaged: check again on anon uffd-wp during isolation
Ryusuke Konishi (1):
nilfs2: initialize unused bytes in segment summary blocks
Sagi Grimberg (1):
nvme-tcp: fix a possible UAF when failing to allocate an io queue
Sascha Hauer (2):
drm/rockchip: vop2: fix suspend/resume drm/rockchip: vop2: Use regcache_sync() to fix suspend/resume
Sebastian Basierski (1):
e1000e: Disable TSO on i219-LM card to increase speed
Soumya Negi (1):
Input: pegasus-notetaker - check pipe type when probing
Steve Chou (1):
tools/mm/page_owner_sort.c: fix TGID output when cull=tg is used
Tetsuo Handa (1):
mm/page_alloc: fix potential deadlock on zonelist_update_seq seqlock
Thomas Gleixner (1):
PCI/MSI: Remove over-zealous hardware size check in pci_msix_validate_entries()
Thomas Weißschuh (1):
platform/x86: gigabyte-wmi: add support for B650 AORUS ELITE AX
Tiezhu Yang (1):
LoongArch: Check unwind_error() in arch_stack_walk()
Toke Høiland-Jørgensen (1):
wifi: ath9k: Don't mark channelmap stack variable read-only in ath9k_mci_update_wlan_channels()
Tomas Henzl (1):
scsi: megaraid_sas: Fix fw_crash_buffer_show()
Uwe Kleine-König (1):
pwm: Zero-initialize the pwm_state passed to driver's .get_state()
Vadim Fedorenko (1):
bnxt_en: fix free-runnig PHC mode
Ville Syrjälä (1):
drm/i915: Fix fast wake AUX sync len
Vladimir Oltean (1):
net: bridge: switchdev: don't notify FDB entries with "master dynamic"
Xuan Zhuo (1):
virtio_net: bugfix overflow inside xdp_linearize_page()
hrdl (1):
Input: cyttsp5 - fix sensing configuration data structure
weiliang1503 (1):
platform/x86: asus-nb-wmi: Add quirk_asus_tablet_mode to other ROG Flow X13 models
Álvaro Fernández Rojas (1):
net: dsa: b53: mmap: add phy ops
Greg Kroah-Hartman
maintainerDocumentation/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.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 2 -SUBLEVEL = 12 +SUBLEVEL = 13 EXTRAVERSION = NAME = Hurr durr I'ma ninja sloth
arch/arm/boot/dts/rk3288.dtsi +1 -1
@@ -942,7 +942,7 @@ wdt: watchdog@ff800000 { status = "disabled"; }; - spdif: sound@ff88b0000 { + spdif: sound@ff8b0000 { compatible = "rockchip,rk3288-spdif", "rockchip,rk3066-spdif"; reg = <0x0 0xff8b0000 0x0 0x10000>; #sound-dai-cells = <0>;
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi +7 -8
@@ -1571,15 +1571,20 @@ usb2_phy0: phy@36000 { 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"; 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 {
@@ -1705,12 +1710,6 @@ internal_ephy: ethernet-phy@8 { }; }; - 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>;
arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi +1 -1
@@ -194,7 +194,7 @@ pmic@4b { rohm,reset-snvs-powered; #clock-cells = <0>; - clocks = <&osc_32k 0>; + clocks = <&osc_32k>; clock-output-names = "clk-32k-out"; regulators {
arch/arm64/boot/dts/freescale/imx8mm-verdin.dtsi +2 -2
@@ -95,7 +95,7 @@ reg_ethphy: regulator-ethphy { 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 @@ reg_usdhc2_vmmc: regulator-usdhc2 { 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>;
arch/arm64/boot/dts/freescale/imx8mp-verdin-dev.dtsi +1 -1
@@ -12,7 +12,7 @@ reg_eth2phy: regulator-eth2phy { 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 @@ reg_module_eth1phy: regulator-module-eth1phy { 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 @@ reg_usdhc2_vmmc: regulator-usdhc2 { 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>;
arch/arm64/boot/dts/qcom/ipq8074-hk01.dts +2 -2
@@ -62,11 +62,11 @@ &pcie1 { perst-gpios = <&tlmm 58 GPIO_ACTIVE_LOW>; }; -&pcie_phy0 { +&pcie_qmp0 { status = "okay"; }; -&pcie_phy1 { +&pcie_qmp1 { status = "okay"; };
arch/arm64/boot/dts/qcom/ipq8074-hk10.dtsi +2 -2
@@ -48,11 +48,11 @@ &pcie1 { perst-gpios = <&tlmm 61 GPIO_ACTIVE_LOW>; }; -&pcie_phy0 { +&pcie_qmp0 { status = "okay"; }; -&pcie_phy1 { +&pcie_qmp1 { status = "okay"; };
arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi +3 -2
@@ -59,8 +59,9 @@ pmk8280: pmic@0 { #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";
arch/arm64/boot/dts/rockchip/rk3566-soquartz.dtsi +1 -1
@@ -598,7 +598,7 @@ &sdmmc1 { 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";
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__)
arch/arm64/kvm/hypercalls.c +2 -0
@@ -397,6 +397,8 @@ int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)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 ;
arch/loongarch/Kconfig +35 -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,40 @@ 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 + 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_ADDRESS=$(load-y) # 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/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 */
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/io.h +3 -1
@@ -54,8 +54,10 @@ static inline void __iomem *ioremap_prot(phys_addr_t offset, unsigned long size,* @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/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/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) } }
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/cpu-probe.c +7 -2
@@ -60,7 +60,7 @@ static inline void set_elf_platform(int cpu, const char *plat)/* 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) {
@@ -94,13 +94,18 @@ static void cpu_probe_common(struct cpuinfo_loongarch *c) 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_file *m, void *v)if (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" );
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)
arch/loongarch/kernel/stacktrace.c +1 -1
@@ -30,7 +30,7 @@ void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie, 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/traps.c +7 -2
@@ -371,9 +371,14 @@ int no_unaligned_warning __read_mostly = 1; /* Only 1 warning by default */ 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_regs *regs) 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); }
arch/loongarch/kernel/unwind.c +1 -0
@@ -28,5 +28,6 @@ bool default_next_frame(struct unwind_state *state) }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_state *state) 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_state *state) }while (!get_stack_info (state->sp, state->task, info)); +out: + state->error = true;return false; }
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] __page_aligned_bss;#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);
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
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/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); }
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)
drivers/acpi/acpica/evevent.c +0 -11
@@ -142,9 +142,6 @@ static acpi_status acpi_ev_fixed_event_initialize(void) 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(u32 event)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_state) [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_fixed_event_info[ACPI_NUM_FIXED_EVENTS] =ACPI_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 */
drivers/fpga/fpga-bridge.c +2 -1
@@ -360,7 +360,6 @@ fpga_bridge_register(struct device *parent, const char *name, 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 *parent, const char *name,return ERR_PTR (ret); } +of_platform_populate (bridge->dev.of_node,NULL ,NULL , &bridge->dev); +return bridge; error_device:
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +3 -0
@@ -597,6 +597,9 @@ int amdgpu_irq_put(struct amdgpu_device *adev, struct amdgpu_irq_src *src,if (!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 drm_crtc *crtc, bool enable)if (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))
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,
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)
drivers/gpu/drm/i915/display/intel_dp_aux.c +1 -1
@@ -166,7 +166,7 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,DP_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))
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +4 -0
@@ -840,6 +840,8 @@ static void vop2_enable(struct vop2 *vop2)return ; } +regcache_sync (vop2->map); +if (vop2->data->soc_id ==3566 )vop2_writel (vop2,RK3568_OTP_WIN_EN ,1 );
@@ -868,6 +870,8 @@ static void vop2_disable(struct vop2 *vop2)pm_runtime_put_sync (vop2->dev); +regcache_mark_dirty (vop2->map); +clk_disable_unprepare (vop2->aclk);clk_disable_unprepare (vop2->hclk); }
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 ; }
drivers/iio/adc/at91-sama5d2_adc.c +1 -1
@@ -1409,7 +1409,7 @@ static struct iio_trigger *at91_adc_allocate_trigger(struct iio_dev *indio, 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);
drivers/iio/dac/ad5755.c +1 -0
@@ -802,6 +802,7 @@ static struct ad5755_platform_data *ad5755_parse_fw(struct device *dev)return pdata; error_out: +fwnode_handle_put (pp);devm_kfree (dev, pdata);return NULL ; }
drivers/iio/light/tsl2772.c +1 -0
@@ -601,6 +601,7 @@ static int tsl2772_read_prox_diodes(struct tsl2772_chip *chip)return -EINVAL ; } } + chip->settings.prox_diode = prox_diode_mask;return 0 ; }
drivers/input/tablet/pegasus_notetaker.c +6 -0
@@ -296,6 +296,12 @@ static int pegasus_probe(struct usb_interface *intf, 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,
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;
drivers/memstick/core/memstick.c +4 -1
@@ -410,6 +410,7 @@ static struct memstick_dev *memstick_alloc_card(struct memstick_host *host)return 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_struct *work)put_device (&card->dev); host->card =NULL ; } - }else + }else { +kfree_const (card->dev.kobj.name);kfree (card); + } } out_power_off:
drivers/mmc/host/sdhci_am654.c +0 -2
@@ -351,8 +351,6 @@ static void sdhci_am654_write_b(struct sdhci_host *host, u8 val, int reg)*/ case MMC_TIMING_SD_HS :case MMC_TIMING_MMC_HS : -case MMC_TIMING_UHS_SDR12 : -case MMC_TIMING_UHS_SDR25 : val &= ~SDHCI_CTRL_HISPD ; } }
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); +}
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 ; }
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,
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);
drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 -2
@@ -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;
@@ -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; }
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;
drivers/net/ethernet/intel/e1000e/netdev.c +26 -25
63 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_main.c +6 -3
@@ -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
@@ -14125,15 +14128,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 ;
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)); }
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
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 */
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;
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;
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 ; }
drivers/nvme/host/tcp.c +26 -20
83 lines not on this page · raw message
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) {
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" );
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, },
drivers/platform/x86/gigabyte-wmi.c +3 -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" ),
@@ -150,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"),
@@ -159,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"), { } };
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; }
drivers/pwm/core.c +10 -2
@@ -115,7 +115,14 @@ static int pwm_device_request(struct pwm_device *pwm, const char *label) }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 pwm_device *pwm, {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(struct pwm_device *pwm,return ; } + *last = (struct pwm_state ){0 }; err = chip->ops->get_state (chip, pwm, last);trace_pwm_get (pwm, last, err);if (err)
drivers/regulator/fan53555.c +7 -6
@@ -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
@@ -60,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 ,
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,
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)
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);
fs/btrfs/discard.c +13 -8
@@ -56,11 +56,9 @@#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 (10U) +#define BTRFS_DISCARD_MAX_IOPS (1000U)/* Monotonically decreasing minimum length filters after index 0 */ static int discard_minlen[BTRFS_NR_DISCARD_LISTS ] = {
@@ -577,6 +575,7 @@ void btrfs_discard_calc_delay(struct btrfs_discard_ctl *discard_ctl)s32 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 btrfs_discard_ctl *discard_ctl) } 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);
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)
fs/fs-writeback.c +10 -7
@@ -976,6 +976,16 @@ static void bdi_split_work_to_wbs(struct backing_dev_info *bdi,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 @@ static void bdi_split_work_to_wbs(struct backing_dev_info *bdi, 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 ();
fs/nilfs2/segment.c +20 -0
@@ -430,6 +430,23 @@ static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)return 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(struct nilfs_sc_info *sci)* 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(struct nilfs_sc_info *sci, 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 nilfs_sc_info *sci, 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 ;
fs/userfaultfd.c +4 -2
@@ -1966,8 +1966,10 @@ static int userfaultfd_api(struct userfaultfd_ctx *ctx, 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;
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/*
include/linux/kmsan.h +21 -18
@@ -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.
@@ -159,11 +160,12 @@ void kmsan_vunmap_range_noflush(unsigned long start, unsigned long end);* @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.
@@ -281,12 +283,13 @@ static inline void kmsan_kfree_large(const void *ptr) { } -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,
@@ -294,12 +297,12 @@ static inline void kmsan_vunmap_range_noflush(unsigned long start, { } -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,
include/linux/skbuff.h +3 -2
@@ -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;
@@ -4687,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 }
@@ -4707,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
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 ,
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) ),
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
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))
kernel/fork.c +1 -0
@@ -1177,6 +1177,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p, fail_pcpu:while (i >0 )percpu_counter_destroy (&mm->rss_stat[--i]); +destroy_context (mm); fail_nocontext:mm_free_pgd (mm); fail_nopgd:
kernel/sys.c +40 -29
100 lines not on this page · raw message
lib/maple_tree.c +31 -35
131 lines not on this page · raw message
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 work_struct *work)list_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)
mm/huge_memory.c +15 -4
@@ -1845,10 +1845,10 @@ int change_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,if (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 *tlb, struct vm_area_struct *vma, 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
@@ -2666,9 +2674,10 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)VM_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 ;
@@ -3252,6 +3261,8 @@ int set_pmd_migration_entry(struct page_vma_mapped_walk *pvmw, 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);
mm/khugepaged.c +4 -0
@@ -561,6 +561,10 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, 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 ;
mm/kmsan/hooks.c +47 -8
82 lines not on this page · raw message
mm/kmsan/shadow.c +18 -9
@@ -216,27 +216,29 @@ void kmsan_free_page(struct page *page, unsigned int order)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(unsigned long start, unsigned long end,kmsan_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(unsigned long start, unsigned long end, ret:kfree (s_pages);kfree (o_pages); +return err; }/* Allocate metadata for pages allocated at boot time. */
mm/mmap.c +43 -5
81 lines not on this page · raw message
mm/page_alloc.c +19 -0
@@ -6590,7 +6590,21 @@ static void __build_all_zonelists(void *data)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 *data) }write_sequnlock (&zonelist_update_seq); +printk_deferred_exit (); +local_irq_restore (flags); }static noinline void__init
@@ -9407,6 +9423,9 @@ static bool pfn_range_valid_contig(struct zone *z, unsigned long start_pfn,if (PageReserved (page))return false; + +if (PageHuge (page)) +return false; }return true; }
mm/vmalloc.c +7 -3
@@ -324,8 +324,8 @@ int ioremap_page_range(unsigned long addr, unsigned long end, 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; }
@@ -616,7 +616,11 @@ int __vmap_pages_range_noflush(unsigned long addr, unsigned long end,int 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); }
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 ;
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) {
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,
net/mptcp/protocol.c +50 -24
125 lines not on this page · raw message
net/mptcp/protocol.h +2 -0
@@ -629,10 +629,12 @@ void mptcp_close_ssk(struct sock *sk, struct sock *ssk, 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);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 +77 -3
92 lines not on this page · raw message
net/netfilter/nf_tables_api.c +61 -8
93 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;
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;
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 ()) };
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 _ ,
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 ); }
sound/pci/hda/patch_realtek.c +1 -0
@@ -9468,6 +9468,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_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),
sound/soc/fsl/fsl_asrc_dma.c +8 -3
@@ -209,14 +209,19 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component, 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 */
sound/soc/fsl/fsl_sai.c +1 -1
@@ -1543,7 +1543,7 @@ static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = { .use_imx_pcm = true, .use_edma = true, .fifo_depth = 64, - .pins = 1, + .pins = 4, .reg_offset = 0, .mclk0_is_mclk1 = false, .flags = 0,
sound/soc/sof/ipc4-topology.c +6 -4
@@ -1687,10 +1687,12 @@ static int sof_ipc4_route_setup(struct snd_sof_dev *sdev, struct snd_sof_route *int 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 ; }
sound/soc/sof/pm.c +7 -1
@@ -183,6 +183,7 @@ static int sof_suspend(struct device *dev, bool runtime_suspend)const 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 *dev, bool runtime_suspend)if (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 )
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" );
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 ) {