Linux 6.0.12
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.0.12 kernel.
All users of the 6.0 kernel series must upgrade.
The updated 6.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.0.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
------------
Makefile | 2 arch/arm/boot/dts/at91rm9200.dtsi | 2 arch/powerpc/net/bpf_jit_comp32.c | 52 +--- arch/riscv/include/asm/asm.h | 1 arch/riscv/include/asm/efi.h | 6 arch/riscv/include/asm/pgalloc.h | 11 arch/riscv/kernel/entry.S | 13 + arch/riscv/kernel/machine_kexec.c | 35 ++ arch/riscv/kernel/setup.c | 9 arch/riscv/kernel/traps.c | 18 + arch/riscv/kernel/vdso/Makefile | 1 arch/x86/include/asm/nospec-branch.h | 2 arch/x86/kernel/cpu/bugs.c | 21 + arch/x86/kernel/process.c | 2 drivers/acpi/numa/hmat.c | 27 +- drivers/char/tpm/tpm-interface.c | 5 drivers/clk/at91/at91rm9200.c | 2 drivers/clk/qcom/gcc-sc8280xp.c | 6 drivers/clk/qcom/gdsc.c | 70 +---- drivers/clk/qcom/gdsc.h | 2 drivers/clk/samsung/clk-exynos7885.c | 4 drivers/clocksource/arm_arch_timer.c | 7 drivers/clocksource/timer-riscv.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 12 - drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 1 drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h | 3 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 60 +---- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 6 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 17 + drivers/gpu/drm/amd/amdgpu/amdgpu_job.h | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 53 +--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 14 - drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 3 drivers/gpu/drm/amd/display/Kconfig | 7 drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h | 111 ++++++--- drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h | 117 ++++++---- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 5 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 3 drivers/gpu/drm/i915/gt/intel_gt.c | 9 drivers/gpu/drm/i915/gt/intel_gt_requests.c | 2 drivers/hwmon/asus-ec-sensors.c | 2 drivers/hwmon/coretemp.c | 9 drivers/hwmon/i5500_temp.c | 2 drivers/hwmon/ibmpex.c | 1 drivers/hwmon/ina3221.c | 4 drivers/hwmon/ltc2947-core.c | 2 drivers/i2c/busses/i2c-imx.c | 6 drivers/i2c/busses/i2c-npcm7xx.c | 11 drivers/i2c/busses/i2c-qcom-geni.c | 1 drivers/i2c/i2c-core-base.c | 9 drivers/iio/health/afe4403.c | 5 drivers/iio/health/afe4404.c | 12 - drivers/iio/light/Kconfig | 2 drivers/input/touchscreen/raydium_i2c_ts.c | 4 drivers/iommu/intel/dmar.c | 1 drivers/iommu/intel/iommu.c | 4 drivers/media/common/videobuf2/frame_vector.c | 68 +---- drivers/mmc/core/core.c | 9 drivers/mmc/core/mmc_test.c | 3 drivers/mmc/host/mtk-sd.c | 6 drivers/mmc/host/sdhci-esdhc-imx.c | 2 drivers/mmc/host/sdhci-sprd.c | 4 drivers/mmc/host/sdhci.c | 61 ++++- drivers/mmc/host/sdhci.h | 2 drivers/net/can/can327.c | 4 drivers/net/can/cc770/cc770_isa.c | 10 drivers/net/can/m_can/m_can.c | 2 drivers/net/can/m_can/m_can_pci.c | 9 drivers/net/can/sja1000/sja1000_isa.c | 10 drivers/net/can/usb/etas_es58x/es58x_core.c | 5 drivers/net/dsa/lan9303-core.c | 2 drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c | 5 drivers/net/ethernet/aquantia/atlantic/aq_main.c | 4 drivers/net/ethernet/aquantia/atlantic/aq_main.h | 2 drivers/net/ethernet/intel/e100.c | 5 drivers/net/ethernet/intel/fm10k/fm10k_main.c | 10 drivers/net/ethernet/intel/i40e/i40e_main.c | 11 drivers/net/ethernet/intel/iavf/iavf_main.c | 9 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 10 drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 4 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 3 drivers/net/ethernet/mellanox/mlx5/core/eswitch.h | 8 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 7 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c | 2 drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 9 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c | 5 drivers/net/ethernet/ni/nixge.c | 29 +- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 4 drivers/net/ethernet/renesas/ravb_main.c | 1 drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 2 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 12 - drivers/net/ethernet/ti/am65-cpsw-nuss.c | 2 drivers/net/mdio/fwnode_mdio.c | 2 drivers/net/ntb_netdev.c | 9 drivers/net/phy/phy_device.c | 2 drivers/net/tun.c | 4 drivers/net/wwan/iosm/iosm_ipc_mux_codec.c | 26 +- drivers/net/wwan/iosm/iosm_ipc_protocol.h | 2 drivers/nvme/host/core.c | 2 drivers/nvme/host/multipath.c | 3 drivers/nvmem/rmem.c | 4 drivers/of/property.c | 4 drivers/pinctrl/intel/pinctrl-intel.c | 27 ++ drivers/pinctrl/pinctrl-single.c | 2 fs/afs/fs_probe.c | 4 fs/afs/server.c | 2 fs/btrfs/qgroup.c | 9 fs/ksmbd/vfs.c | 6 fs/nfsd/vfs.c | 4 fs/nilfs2/dat.c | 7 fs/read_write.c | 19 + include/linux/damon.h | 37 +-- include/linux/fs.h | 8 include/linux/mmc/mmc.h | 2 include/net/sctp/stream_sched.h | 2 ipc/sem.c | 3 kernel/bpf/bpf_local_storage.c | 2 kernel/events/core.c | 2 kernel/sysctl.c | 30 +- kernel/trace/trace_dynevent.c | 2 kernel/trace/trace_events.c | 11 kernel/trace/trace_events_hist.c | 3 kernel/trace/trace_osnoise.c | 6 lib/Kconfig.debug | 9 mm/compaction.c | 22 - mm/damon/core.c | 31 +- mm/damon/dbgfs.c | 27 +- mm/damon/lru_sort.c | 46 ++- mm/damon/reclaim.c | 23 + mm/damon/sysfs.c | 63 ++++- net/9p/trans_fd.c | 4 net/hsr/hsr_forward.c | 5 net/ipv4/fib_semantics.c | 10 net/mac80211/airtime.c | 3 net/mptcp/protocol.c | 13 - net/mptcp/subflow.c | 6 net/packet/af_packet.c | 6 net/sctp/stream.c | 25 +- net/sctp/stream_sched.c | 5 net/sctp/stream_sched_prio.c | 19 + net/sctp/stream_sched_rr.c | 5 net/tipc/crypto.c | 3 net/wireless/scan.c | 10 scripts/faddr2line | 7 sound/firewire/dice/dice-stream.c | 12 - sound/soc/codecs/tlv320adc3xxx.c | 3 sound/soc/soc-ops.c | 2 tools/lib/bpf/libbpf.c | 2 tools/lib/bpf/ringbuf.c | 12 - tools/testing/selftests/net/fib_nexthops.sh | 16 + tools/vm/slabinfo-gnuplot.sh | 4 151 files changed, 1152 insertions(+), 628 deletions(-)
Adrian Hunter (1):
mmc: sdhci: Fix voltage switch delay
Alexandre Ghiti (1):
riscv: Sync efi page table's kernel mappings before switching
Amir Goldstein (1):
vfs: fix copy_file_range() averts filesystem freeze protection
Andrew Lunn (1):
i2c: imx: Only DMA messages with I2C_M_DMA_SAFE flag set
Andy Shevchenko (1):
pinctrl: intel: Save and restore pins in "direct IRQ" mode
Björn Töpel (1):
riscv: mm: Proper page permissions after initmem free
Caleb Sander (1):
nvme: fix SRCU protection of nvme_ns_head list
ChenXiaoSong (1):
btrfs: qgroup: fix sleep from invalid context bug in btrfs_qgroup_inherit()
Chris Mi (3):
net/mlx5: E-switch, Destroy legacy fdb table when needed net/mlx5: E-switch, Fix duplicate lag creation net/mlx5: Lag, Fix for loop when checking lag
Christian König (3):
drm/amdgpu: move setting the job resources drm/amdgpu: cleanup error handling in amdgpu_cs_parser_bos drm/amdgpu: fix userptr HMM range handling v2
Christian Löhle (1):
mmc: core: Fix ambiguous TRIM and DISCARD arg
Christophe Leroy (1):
powerpc/bpf/32: Fix Oops on tail call tests
Conor Dooley (1):
Revert "clocksource/drivers/riscv: Events are stopped during CPU suspend"
Daniel Bristot de Oliveira (1):
tracing/osnoise: Fix duration type
David Ahern (1):
ipv4: Handle attempt to delete multipath route when fib_info contains an nh reference
David Howells (1):
afs: Fix fileserver probe RTT handling
David Virag (1):
clk: samsung: exynos7885: Correct "div4" clock parents
Derek Nguyen (1):
hwmon: (ltc2947) fix temperature scaling
Duoming Zhou (1):
qlcnic: fix sleep-in-atomic-context bugs caused by msleep
Gaosheng Cui (2):
hwmon: (ibmpex) Fix possible UAF when ibmpex_register_bmc() fails
mmc: mtk-sd: Fix missing clk_disable_unprepare in msdc_of_clock_parse()
Gavin Shan (1):
mm: migrate: fix THP's mapcount on isolation
Goh, Wei Sheng (1):
net: stmmac: Set MAC's flow control register to reflect current settings
Greg Kroah-Hartman (1):
Linux 6.0.12
Guo Ren (1):
riscv: kexec: Fixup irq controller broken in kexec crash path
Hou Tao (2):
bpf, perf: Use subprog name when reporting subprog ksymbol
libbpf: Handle size overflow for ringbuf mmap
Hui Tang (1):
ASoC: tlv320adc3xxx: Fix build error for implicit function declaration
Ido Schimmel (1):
ipv4: Fix route deletion when nexthop info is not specified
Izabela Bakollari (1):
aquantia: Do not purge addresses when setting the number of rings
Jan Dabros (1):
char: tpm: Protect tpm_pm_suspend with locks
Jann Horn (1):
ipc/sem: Fix dangling sem_array access in semtimedop race
Janusz Krzysztofik (2):
drm/i915: Fix negative value passed as remaining time drm/i915: Never return 0 if not all requests retired
Jerry Ray (1):
dsa: lan9303: Correct stat name
Jiasheng Jiang (1):
can: m_can: Add check for devm_clk_get
Jiri Olsa (1):
libbpf: Use correct return pointer in attach_raw_tp
Jisheng Zhang (2):
riscv: vdso: fix section overlapping under some conditions
riscv: fix race when vmap stack overflow
Joe Korty (1):
clocksource/drivers/arm_arch_timer: Fix XGene-1 TVAL register math error
Johan Hovold (1):
clk: qcom: gdsc: add missing error handling
Johannes Berg (2):
wifi: cfg80211: fix buffer overflow in elem comparison
wifi: cfg80211: don't allow multi-BSSID in S1G
Kenneth Feng (1):
drm/amd/pm: update driver-if header for smu_v13_0_10
Lee Jones (2):
Kconfig.debug: provide a little extra FRAME_WARN leeway when KASAN is enabled drm/amdgpu: temporarily disable broken Clang builds due to blown stack-frame
Leo Liu (1):
drm/amdgpu: enable Vangogh VCN indirect sram mode
Linus Torvalds (3):
v4l2: don't fall back to follow_pfn() if pin_user_pages_fast() fails
proc: avoid integer type confusion in get_proc_long
proc: proc_skip_spaces() shouldn't think it is working on C strings
Lorenzo Bianconi (1):
wifi: mac8021: fix possible oob access in ieee80211_get_rate_duration
M Chetan Kumar (4):
net: wwan: iosm: fix kernel test robot reported error
net: wwan: iosm: fix dma_alloc_coherent incompatible pointer type
net: wwan: iosm: fix crash in peek throughput test
net: wwan: iosm: fix incorrect skb length
Marc Dionne (1):
afs: Fix server->active leak in afs_put_server
Mark Brown (1):
ASoC: ops: Fix bounds check for _sx controls
Maxim Korotkov (1):
pinctrl: single: Fix potential division by zero
Menglong Dong (1):
mptcp: don't orphan ssk in mptcp_close()
Michael Grzeschik (1):
ARM: at91: rm9200: fix usb device clock id
Ninad Malwade (1):
hwmon: (ina3221) Fix shunt sum critical calculation
Paolo Abeni (1):
mptcp: fix sleep in atomic at close time
Paul Gazzillo (1):
iio: light: rpr0521: add missing Kconfig dependencies
Pawan Gupta (1):
x86/bugs: Make sure MSR_SPEC_CTRL is updated properly upon resume from S3
Phil Auld (1):
hwmon: (coretemp) Check for null before removing sysfs attrs
Ricardo Ribalda (1):
i2c: Restore initial power state if probe fails
Roi Dayan (1):
net/mlx5e: Fix use-after-free when reverting termination table
Sebastian Falbesoner (1):
mmc: sdhci-esdhc-imx: correct CQHCI exit halt state check
SeongJae Park (1):
mm/damon/sysfs: fix wrong empty schemes assumption under online tuning in damon_sysfs_set_schemes()
Shang XiaoJing (2):
ixgbevf: Fix resource leak in ixgbevf_init_module()
i40e: Fix error handling in i40e_init_module()
Shazad Hussain (1):
clk: qcom: gcc-sc8280xp: add cxo as parent for three ufs ref clks
Shigeru Yoshida (1):
net: tun: Fix use-after-free in tun_detach()
Srikar Dronamraju (1):
scripts/faddr2line: Fix regression in name resolution on ppc64le
Stephen Boyd (1):
clk: qcom: gdsc: Remove direct runtime PM calls
Steven Rostedt (Google) (3):
error-injection: Add prompt for function error injection
tracing: Fix race where histograms can be called before the event
tracing: Free buffers when a used dynamic event is removed
Takashi Sakamoto (1):
ALSA: dice: fix regression for Lexicon I-ONIX FW810S
Tiezhu Yang (1):
tools/vm/slabinfo-gnuplot: use "grep -E" instead of "egrep"
Vishal Verma (2):
ACPI: HMAT: remove unnecessary variable initialization
ACPI: HMAT: Fix initiator registration for single-initiator systems
Wang Hai (2):
e100: Fix possible use after free in e100_xmit_prepare net/9p: Fix a potential socket leak in p9_socket_open
Wang Yufen (1):
i2c: qcom-geni: fix error return code in geni_i2c_gpi_xfer
Wei Yongjun (3):
iio: health: afe4403: Fix oob read in afe4403_read_raw
iio: health: afe4404: Fix oob read in afe4404_[read|write]_raw
nvmem: rmem: Fix return value check in rmem_read()
Wenchao Chen (1):
mmc: sdhci-sprd: Fix no reset data and command after voltage switch
Willem de Bruijn (1):
packet: do not set TP_STATUS_CSUM_VALID on CHECKSUM_COMPLETE
Xin Long (1):
tipc: re-fetch skb cb after tipc_msg_validate
Xiongfeng Wang (2):
iommu/vt-d: Fix PCI device refcount leak in has_external_pci() iommu/vt-d: Fix PCI device refcount leak in dmar_dev_scope_init()
Xu Kuohai (1):
bpf: Do not copy spin lock field from user in bpf_selem_alloc
Yajun Deng (1):
mm/damon: introduce struct damos_access_pattern
Yang Wang (1):
drm/amd/pm: add smu_v13_0_10 driver if version
Yang Yingliang (5):
hwmon: (i5500_temp) fix missing pci_disable_device()
of: property: decrement node refcount in of_fwnode_get_reference_args()
net: phy: fix null-ptr-deref while probe() failed
net: mdiobus: fix unbalanced node reference count
hwmon: (coretemp) fix pci device refcount leak in nv1a_ram_new()
Ye Bin (1):
mmc: mmc_test: Fix removal of debugfs file
Yoshihiro Shimoda (1):
net: ethernet: renesas: ravb: Fix promiscuous mode after system resumed
Yuan Can (5):
fm10k: Fix error handling in fm10k_init_module()
iavf: Fix error handling in iavf_init_module()
net: net_netdev: Fix error handling in ntb_netdev_init_module()
hwmon: (asus-ec-sensors) Add checks for devm_kcalloc
i2c: npcm7xx: Fix error handling in npcm_i2c_init()
YueHaibing (3):
net/mlx5: DR, Fix uninitialized var warning net/mlx5: Fix uninitialized variable bug in outlen_write()
net: hsr: Fix potential use-after-free
Yuri Karpov (1):
net: ethernet: nixge: fix NULL dereference
Zhang Changzhong (5):
can: sja1000_isa: sja1000_isa_probe(): add missing free_sja1000dev()
can: cc770: cc770_isa_probe(): add missing free_cc770dev()
can: etas_es58x: es58x_init_netdev(): free netdev when register_candev()
can: m_can: pci: add missing m_can_class_free_dev() in probe/remove methods
net: ethernet: ti: am65-cpsw: fix error handling in am65_cpsw_nuss_probe()
Zhang Xiaoxu (1):
Input: raydium_ts_i2c - fix memory leak in raydium_i2c_send()
ZhangPeng (1):
nilfs2: fix NULL pointer dereference in nilfs_palloc_commit_free_entry()
Zhengchao Shao (1):
sctp: fix memory leak in sctp_stream_outq_migrate()
Ziyang Xuan (1):
can: can327: can327_feed_frame_to_netdev(): fix potential skb leak when netdev is down
lyndonli (1):
drm/amd/pm: update driver if header for smu_13_0_7
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 0 -SUBLEVEL = 11 +SUBLEVEL = 12 EXTRAVERSION = NAME = Hurr durr I'ma ninja sloth
arch/arm/boot/dts/at91rm9200.dtsi +1 -1
@@ -660,7 +660,7 @@ usb1: gadget@fffb0000 { compatible = "atmel,at91rm9200-udc"; reg = <0xfffb0000 0x4000>; interrupts = <11 IRQ_TYPE_LEVEL_HIGH 2>; - clocks = <&pmc PMC_TYPE_PERIPHERAL 11>, <&pmc PMC_TYPE_SYSTEM 2>; + clocks = <&pmc PMC_TYPE_PERIPHERAL 11>, <&pmc PMC_TYPE_SYSTEM 1>; clock-names = "pclk", "hclk"; status = "disabled"; };
arch/powerpc/net/bpf_jit_comp32.c +21 -31
94 lines not on this page · raw message
arch/riscv/include/asm/asm.h +1 -0
@@ -23,6 +23,7 @@#define REG_L __REG_SEL(ld, lw)#define REG_S __REG_SEL(sd, sw)#define REG_SC __REG_SEL(sc.d, sc.w) +#define REG_AMOSWAP_AQ __REG_SEL(amoswap.d.aq, amoswap.w.aq)#define REG_ASM __REG_SEL(.dword, .word)#define SZREG __REG_SEL(8, 4)#define LGREG __REG_SEL(3, 2)
arch/riscv/include/asm/efi.h +5 -1
@@ -10,6 +10,7 @@#include <asm/mmu_context.h> #include <asm/ptrace.h> #include <asm/tlbflush.h> +#include <asm/pgalloc.h> #ifdef CONFIG_EFI extern void efi_init (void );
@@ -20,7 +21,10 @@ extern void efi_init(void);int efi_create_mapping (struct mm_struct *mm,efi_memory_desc_t *md);int efi_set_mapping_permissions (struct mm_struct *mm,efi_memory_desc_t *md); -#define arch_efi_call_virt_setup () efi_virtmap_load() +#define arch_efi_call_virt_setup () ({ \ + sync_kernel_mappings(efi_mm.pgd); \ + efi_virtmap_load(); \ + })#define arch_efi_call_virt_teardown () efi_virtmap_unload()#define ARCH_EFI_IRQ_FLAGS_MASK (SR_IE | SR_SPIE)
arch/riscv/include/asm/pgalloc.h +8 -3
@@ -127,6 +127,13 @@ static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d)#define __p4d_free_tlb (tlb, p4d, addr) p4d_free((tlb)->mm, p4d)#endif /* __PAGETABLE_PMD_FOLDED */ +static inline void sync_kernel_mappings (pgd_t *pgd) +{ +memcpy (pgd +USER_PTRS_PER_PGD , + init_mm.pgd +USER_PTRS_PER_PGD , + (PTRS_PER_PGD -USER_PTRS_PER_PGD ) *sizeof (pgd_t)); +} +static inline pgd_t *pgd_alloc (struct mm_struct *mm) {pgd_t *pgd;
@@ -135,9 +142,7 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)if (likely (pgd !=NULL )) {memset (pgd,0 ,USER_PTRS_PER_PGD *sizeof (pgd_t));/* Copy kernel mappings */ -memcpy (pgd +USER_PTRS_PER_PGD , - init_mm.pgd +USER_PTRS_PER_PGD , - (PTRS_PER_PGD -USER_PTRS_PER_PGD ) *sizeof (pgd_t)); +sync_kernel_mappings (pgd); }return pgd; }
arch/riscv/kernel/entry.S +13 -0
@@ -404,6 +404,19 @@ handle_syscall_trace_exit: #ifdef CONFIG_VMAP_STACK handle_kernel_stack_overflow: + /* + * Takes the psuedo-spinlock for the shadow stack, in case multiple + * harts are concurrently overflowing their kernel stacks. We could + * store any value here, but since we're overflowing the kernel stack + * already we only have SP to use as a scratch register. So we just + * swap in the address of the spinlock, as that's definately non-zero. + * + * Pairs with a store_release in handle_bad_stack(). + */ +1: la sp, spin_shadow_stack + REG_AMOSWAP_AQ sp, sp, (sp) + bnez sp, 1b + la sp, shadow_stack addi sp, sp, SHADOW_OVERFLOW_STACK_SIZE
arch/riscv/kernel/machine_kexec.c +35 -0
@@ -15,6 +15,8 @@#include <linux/compiler.h> /* For unreachable() */ #include <linux/cpu.h> /* For cpu_down() */ #include <linux/reboot.h> +#include <linux/interrupt.h> +#include <linux/irq.h> /* * kexec_image_info - Print received image details
@@ -154,6 +156,37 @@ void crash_smp_send_stop(void) cpus_stopped =1 ; } +static void machine_kexec_mask_interrupts (void ) +{ +unsigned int i; +struct irq_desc *desc; + +for_each_irq_desc (i, desc) { +struct irq_chip *chip; +int ret; + + chip =irq_desc_get_chip (desc); +if (!chip) +continue ; + +/* +* First try to remove the active state. If this +* fails, try to EOI the interrupt. +*/ + ret =irq_set_irqchip_state (i,IRQCHIP_STATE_ACTIVE , false); + +if (ret &&irqd_irq_inprogress (&desc->irq_data) && + chip->irq_eoi) + chip->irq_eoi (&desc->irq_data); + +if (chip->irq_mask) + chip->irq_mask (&desc->irq_data); + +if (chip->irq_disable && !irqd_irq_disabled (&desc->irq_data)) + chip->irq_disable (&desc->irq_data); + } +} +/* * machine_crash_shutdown - Prepare to kexec after a kernel crash *
@@ -169,6 +202,8 @@ machine_crash_shutdown(struct pt_regs *regs)crash_smp_send_stop ();crash_save_cpu (regs,smp_processor_id ()); +machine_kexec_mask_interrupts (); +pr_info ("Starting crashdump kernel...\n" ); }
arch/riscv/kernel/setup.c +5 -4
@@ -322,10 +322,11 @@ subsys_initcall(topology_init);void free_initmem (void ) { -if (IS_ENABLED (CONFIG_STRICT_KERNEL_RWX )) -set_kernel_memory (lm_alias (__init_begin),lm_alias (__init_end), -IS_ENABLED (CONFIG_64BIT ) ? - set_memory_rw : set_memory_rw_nx); +if (IS_ENABLED (CONFIG_STRICT_KERNEL_RWX )) { +set_kernel_memory (lm_alias (__init_begin),lm_alias (__init_end), set_memory_rw_nx); +if (IS_ENABLED (CONFIG_64BIT )) +set_kernel_memory (__init_begin, __init_end, set_memory_nx); + }free_initmem_default (POISON_FREE_INITMEM ); }
arch/riscv/kernel/traps.c +18 -0
@@ -218,11 +218,29 @@ asmlinkage unsigned long get_overflow_stack(void)OVERFLOW_STACK_SIZE ; } +/* +* A pseudo spinlock to protect the shadow stack from being used by multiple +* harts concurrently. This isn't a real spinlock because the lock side must +* be taken without a valid stack and only a single register, it's only taken +* while in the process of panicing anyway so the performance and error +* checking a proper spinlock gives us doesn't matter. +*/ +unsigned long spin_shadow_stack; + asmlinkage void handle_bad_stack(struct pt_regs *regs) {unsigned long tsk_stk = (unsigned long )current->stack;unsigned long ovf_stk = (unsigned long )this_cpu_ptr (overflow_stack); +/* +* We're done with the shadow stack by this point, as we're on the +* overflow stack. Tell any other concurrent overflowing harts that +* they can proceed with panicing by releasing the pseudo-spinlock. +* +* This pairs with an amoswap.aq in handle_kernel_stack_overflow. +*/ +smp_store_release (&spin_shadow_stack,0 ); +console_verbose ();pr_emerg ("Insufficient stack space to handle exception!\n" );
arch/riscv/kernel/vdso/Makefile +1 -0
@@ -17,6 +17,7 @@ vdso-syms += flush_icache obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o ccflags-y := -fno-stack-protector +ccflags-y += -DDISABLE_BRANCH_PROFILING ifneq ($(c-gettimeofday-y),) CFLAGS_vgettimeofday.o += -fPIC -include $(c-gettimeofday-y)
arch/x86/include/asm/nospec-branch.h +1 -1
@@ -321,7 +321,7 @@ static inline void indirect_branch_prediction_barrier(void)/* The Intel SPEC CTRL MSR base value cache */ extern u64 x86_spec_ctrl_base;DECLARE_PER_CPU (u64, x86_spec_ctrl_current); -extern void write_spec_ctrl_current (u64 val,bool force); +extern void update_spec_ctrl_cond (u64 val);extern u64 spec_ctrl_current (void );/*
arch/x86/kernel/cpu/bugs.c +14 -7
@@ -60,11 +60,18 @@ EXPORT_SYMBOL_GPL(x86_spec_ctrl_current);static DEFINE_MUTEX (spec_ctrl_mutex); +/* Update SPEC_CTRL MSR and its cached copy unconditionally */ +static void update_spec_ctrl (u64 val) +{ +this_cpu_write (x86_spec_ctrl_current, val); +wrmsrl (MSR_IA32_SPEC_CTRL , val); +} +/* * Keep track of the SPEC_CTRL MSR value for the current task, which may differ * from x86_spec_ctrl_base due to STIBP/SSB in __speculation_ctrl_update(). */ -void write_spec_ctrl_current (u64 val,bool force) +void update_spec_ctrl_cond (u64 val) {if (this_cpu_read (x86_spec_ctrl_current) == val)return ;
@@ -75,7 +82,7 @@ void write_spec_ctrl_current(u64 val, bool force)* When KERNEL_IBRS this MSR is written on return-to-user, unless * forced the update can be delayed until that time. */ -if (force || !cpu_feature_enabled (X86_FEATURE_KERNEL_IBRS )) +if (!cpu_feature_enabled (X86_FEATURE_KERNEL_IBRS ))wrmsrl (MSR_IA32_SPEC_CTRL , val); }
@@ -1328,7 +1335,7 @@ static void __init spec_ctrl_disable_kernel_rrsba(void)if (ia32_cap &ARCH_CAP_RRSBA ) { x86_spec_ctrl_base |=SPEC_CTRL_RRSBA_DIS_S ; -write_spec_ctrl_current (x86_spec_ctrl_base, true); +update_spec_ctrl (x86_spec_ctrl_base); } }
@@ -1450,7 +1457,7 @@ static void __init spectre_v2_select_mitigation(void)if (spectre_v2_in_ibrs_mode (mode)) { x86_spec_ctrl_base |=SPEC_CTRL_IBRS ; -write_spec_ctrl_current (x86_spec_ctrl_base, true); +update_spec_ctrl (x86_spec_ctrl_base); }switch (mode) {
@@ -1564,7 +1571,7 @@ static void __init spectre_v2_select_mitigation(void)static void update_stibp_msr (void * __unused) {u64 val =spec_ctrl_current () | (x86_spec_ctrl_base &SPEC_CTRL_STIBP ); -write_spec_ctrl_current (val, true); +update_spec_ctrl (val); }/* Update x86_spec_ctrl_base in case SMT state changed. */
@@ -1797,7 +1804,7 @@ static enum ssb_mitigation __init __ssb_select_mitigation(void)x86_amd_ssb_disable (); }else { x86_spec_ctrl_base |=SPEC_CTRL_SSBD ; -write_spec_ctrl_current (x86_spec_ctrl_base, true); +update_spec_ctrl (x86_spec_ctrl_base); } }
@@ -2048,7 +2055,7 @@ int arch_prctl_spec_ctrl_get(struct task_struct *task, unsigned long which)void x86_spec_ctrl_setup_ap (void ) {if (boot_cpu_has (X86_FEATURE_MSR_SPEC_CTRL )) -write_spec_ctrl_current (x86_spec_ctrl_base, true); +update_spec_ctrl (x86_spec_ctrl_base);if (ssb_mode ==SPEC_STORE_BYPASS_DISABLE )x86_amd_ssb_disable ();
arch/x86/kernel/process.c +1 -1
@@ -600,7 +600,7 @@ static __always_inline void __speculation_ctrl_update(unsigned long tifp, }if (updmsr) -write_spec_ctrl_current (msr, false); +update_spec_ctrl_cond (msr); }static unsigned long speculation_ctrl_update_tif (struct task_struct *tsk)
drivers/acpi/numa/hmat.c +20 -7
@@ -563,17 +563,26 @@ static int initiator_cmp(void *priv, const struct list_head *a, {struct memory_initiator *ia;struct memory_initiator *ib; -unsigned long *p_nodes = priv; ia = list_entry(a, struct memory_initiator, node); ib = list_entry(b, struct memory_initiator, node); -set_bit (ia->processor_pxm, p_nodes); -set_bit (ib->processor_pxm, p_nodes); -return ia->processor_pxm - ib->processor_pxm; } +static int initiators_to_nodemask (unsigned long *p_nodes) +{ +struct memory_initiator *initiator; + +if (list_empty (&initiators)) +return -ENXIO ; + +list_for_each_entry (initiator, &initiators, node) +set_bit (initiator->processor_pxm, p_nodes); + +return 0 ; +} +static void hmat_register_target_initiators (struct memory_target *target) { static DECLARE_BITMAP(p_nodes, MAX_NUMNODES);
@@ -610,7 +619,10 @@ static void hmat_register_target_initiators(struct memory_target *target)* initiators. */ bitmap_zero (p_nodes,MAX_NUMNODES ); -list_sort (p_nodes, &initiators, initiator_cmp); +list_sort (NULL , &initiators, initiator_cmp); +if (initiators_to_nodemask (p_nodes) <0 ) +return ; +if (!access0done) {for (i =WRITE_LATENCY ; i <=READ_BANDWIDTH ; i++) { loc = localities_types[i];
@@ -644,8 +656,9 @@ static void hmat_register_target_initiators(struct memory_target *target)/* Access 1 ignores Generic Initiators */ bitmap_zero (p_nodes,MAX_NUMNODES ); -list_sort (p_nodes, &initiators, initiator_cmp); - best =0 ; +if (initiators_to_nodemask (p_nodes) <0 ) +return ; +for (i =WRITE_LATENCY ; i <=READ_BANDWIDTH ; i++) { loc = localities_types[i];if (!loc)
drivers/char/tpm/tpm-interface.c +3 -2
@@ -401,13 +401,14 @@ int tpm_pm_suspend(struct device *dev) !pm_suspend_via_firmware()) goto suspended; -if (!tpm_chip_start (chip)) { + rc =tpm_try_get_ops (chip); +if (!rc) {if (chip->flags &TPM_CHIP_FLAG_TPM2 )tpm2_shutdown (chip,TPM2_SU_STATE );else rc =tpm1_pm_suspend (chip, tpm_suspend_pcr); -tpm_chip_stop (chip); +tpm_put_ops (chip); } suspended:
drivers/clk/at91/at91rm9200.c +1 -1
@@ -40,7 +40,7 @@ static const struct clk_pll_characteristics rm9200_pll_characteristics = { };static const struct sck at91rm9200_systemck[] = { - { .n ="udpck" , .p ="usbck" , .id =2 }, + { .n ="udpck" , .p ="usbck" , .id =1 }, { .n ="uhpck" , .p ="usbck" , .id =4 }, { .n ="pck0" , .p ="prog0" , .id =8 }, { .n ="pck1" , .p ="prog1" , .id =9 },
drivers/clk/qcom/gcc-sc8280xp.c +6 -0
@@ -5364,6 +5364,8 @@ static struct clk_branch gcc_ufs_1_card_clkref_clk = { .enable_mask = BIT(0), .hw.init = &(const struct clk_init_data ) { .name ="gcc_ufs_1_card_clkref_clk" , + .parent_data = &gcc_parent_data_tcxo, + .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -5432,6 +5434,8 @@ static struct clk_branch gcc_ufs_card_clkref_clk = { .enable_mask = BIT(0), .hw.init = &(const struct clk_init_data ) { .name ="gcc_ufs_card_clkref_clk" , + .parent_data = &gcc_parent_data_tcxo, + .num_parents =1 , .ops = &clk_branch2_ops, }, },
@@ -5848,6 +5852,8 @@ static struct clk_branch gcc_ufs_ref_clkref_clk = { .enable_mask = BIT(0), .hw.init = &(const struct clk_init_data ) { .name ="gcc_ufs_ref_clkref_clk" , + .parent_data = &gcc_parent_data_tcxo, + .num_parents =1 , .ops = &clk_branch2_ops, }, },
drivers/clk/qcom/gdsc.c +15 -55
137 lines not on this page · raw message
drivers/clk/qcom/gdsc.h +0 -2
@@ -30,7 +30,6 @@ struct reset_controller_dev;* @resets: ids of resets associated with this gdsc * @reset_count: number of @resets * @rcdev: reset controller -* @dev: the device holding the GDSC, used for pm_runtime calls */ struct gdsc {struct generic_pm_domain pd;
@@ -69,7 +68,6 @@ struct gdsc {const char *supply;struct regulator *rsupply; -struct device *dev; };struct gdsc_desc {
drivers/clk/samsung/clk-exynos7885.c +2 -2
@@ -182,7 +182,7 @@ static const struct samsung_div_clock top_div_clks[] __initconst = { CLK_CON_DIV_PLL_SHARED0_DIV2, 0, 1),DIV (CLK_DOUT_SHARED0_DIV3 ,"dout_shared0_div3" ,"fout_shared0_pll" ,CLK_CON_DIV_PLL_SHARED0_DIV3 ,0 ,2 ), -DIV (CLK_DOUT_SHARED0_DIV4 ,"dout_shared0_div4" ,"fout_shared0_pll" , +DIV (CLK_DOUT_SHARED0_DIV4 ,"dout_shared0_div4" ,"dout_shared0_div2" ,CLK_CON_DIV_PLL_SHARED0_DIV4 ,0 ,1 ),DIV (CLK_DOUT_SHARED0_DIV5 ,"dout_shared0_div5" ,"fout_shared0_pll" , CLK_CON_DIV_PLL_SHARED0_DIV5, 0, 3),
@@ -190,7 +190,7 @@ static const struct samsung_div_clock top_div_clks[] __initconst = { CLK_CON_DIV_PLL_SHARED1_DIV2, 0, 1),DIV (CLK_DOUT_SHARED1_DIV3 ,"dout_shared1_div3" ,"fout_shared1_pll" ,CLK_CON_DIV_PLL_SHARED1_DIV3 ,0 ,2 ), -DIV (CLK_DOUT_SHARED1_DIV4 ,"dout_shared1_div4" ,"fout_shared1_pll" , +DIV (CLK_DOUT_SHARED1_DIV4 ,"dout_shared1_div4" ,"dout_shared1_div2" , CLK_CON_DIV_PLL_SHARED1_DIV4, 0, 1),/* CORE */
drivers/clocksource/arm_arch_timer.c +5 -2
@@ -806,6 +806,9 @@ static u64 __arch_timer_check_delta(void)/* * XGene-1 implements CVAL in terms of TVAL, meaning * that the maximum timer range is 32bit. Shame on them. +* +* Note that TVAL is signed, thus has only 31 of its +* 32 bits to express magnitude. */ MIDR_ALL_VERSIONS (MIDR_CPU_MODEL (ARM_CPU_IMP_APM , APM_CPU_PART_POTENZA)),
@@ -813,8 +816,8 @@ static u64 __arch_timer_check_delta(void) };if (is_midr_in_range_list (read_cpuid_id (), broken_cval_midrs)) { -pr_warn_once ("Broken CNTx_CVAL_EL1, limiting width to 32bits" ); -return CLOCKSOURCE_MASK (32 ); +pr_warn_once ("Broken CNTx_CVAL_EL1, using 31 bit TVAL instead.\n" ); +return CLOCKSOURCE_MASK (31 ); }#endif return CLOCKSOURCE_MASK (arch_counter_get_width ());
drivers/clocksource/timer-riscv.c +1 -1
@@ -51,7 +51,7 @@ static int riscv_clock_next_event(unsigned long delta,static unsigned int riscv_clock_event_irq; static DEFINE_PER_CPU(struct clock_event_device, riscv_clock_event) = { .name ="riscv_timer_clockevent" , - .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_C3STOP , + .features =CLOCK_EVT_FEAT_ONESHOT , .rating =100 , .set_next_event = riscv_clock_next_event, };
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +8 -4
@@ -985,6 +985,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,struct amdkfd_process_info *process_info = mem->process_info;struct amdgpu_bo *bo = mem->bo;struct ttm_operation_ctx ctx = { true, false }; +struct hmm_range *range;int ret =0 ;mutex_lock (&process_info->lock);
@@ -1014,7 +1015,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,return 0 ; } - ret =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages); + ret =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages, &range);if (ret) {pr_err ("%s: Failed to get user pages: %d\n" , __func__, ret); goto unregister_out;
@@ -1032,7 +1033,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,amdgpu_bo_unreserve (bo); release_out: -amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm); +amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm, range); unregister_out:if (ret)amdgpu_mn_unregister (bo);
@@ -2367,6 +2368,8 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,/* Go through userptr_inval_list and update any invalid user_pages */ list_for_each_entry (mem, &process_info->userptr_inval_list, validate_list.head) { +struct hmm_range *range; + invalid =atomic_read (&mem->invalid);if (!invalid)/* BO hasn't been invalidated since the last
@@ -2377,7 +2380,8 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info, bo = mem->bo;/* Get updated user pages */ - ret =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages); + ret =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages, + &range);if (ret) {pr_debug ("Failed %d to get user pages\n" , ret);
@@ -2396,7 +2400,7 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,* FIXME: Cannot ignore the return code, must hold * notifier_lock */ -amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm); +amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm, range); }/* Mark the BO as valid unless it was invalidated
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +1 -0
@@ -209,6 +209,7 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,list_add_tail (&e->tv.head, &bucket[priority]); e->user_pages =NULL ; + e->range =NULL ; }/* Connect the sorted buckets in the output list. */
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h +3 -0
@@ -26,6 +26,8 @@#include <drm/ttm/ttm_execbuf_util.h> #include <drm/amdgpu_drm.h> +struct hmm_range ; +struct amdgpu_device ;struct amdgpu_bo ;struct amdgpu_bo_va ;
@@ -36,6 +38,7 @@ struct amdgpu_bo_list_entry {struct amdgpu_bo_va *bo_va;uint32_t priority;struct page **user_pages; +struct hmm_range *range;bool user_invalidated; };
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +22 -38
94 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +4 -2
@@ -378,6 +378,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,struct amdgpu_device *adev =drm_to_adev (dev);struct drm_amdgpu_gem_userptr *args = data;struct drm_gem_object *gobj; +struct hmm_range *range;struct amdgpu_bo *bo;uint32_t handle;int r;
@@ -418,7 +419,8 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, goto release_object;if (args->flags &AMDGPU_GEM_USERPTR_VALIDATE ) { - r =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages); + r =amdgpu_ttm_tt_get_user_pages (bo, bo->tbo.ttm->pages, + &range);if (r) goto release_object;
@@ -441,7 +443,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, user_pages_done:if (args->flags &AMDGPU_GEM_USERPTR_VALIDATE ) -amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm); +amdgpu_ttm_tt_get_user_pages_done (bo->tbo.ttm, range); release_object:drm_gem_object_put (gobj);
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +17 -0
@@ -129,6 +129,23 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,return r; } +void amdgpu_job_set_resources (struct amdgpu_job *job,struct amdgpu_bo *gds, +struct amdgpu_bo *gws,struct amdgpu_bo *oa) +{ +if (gds) { + job->gds_base =amdgpu_bo_gpu_offset (gds) >>PAGE_SHIFT ; + job->gds_size =amdgpu_bo_size (gds) >>PAGE_SHIFT ; + } +if (gws) { + job->gws_base =amdgpu_bo_gpu_offset (gws) >>PAGE_SHIFT ; + job->gws_size =amdgpu_bo_size (gws) >>PAGE_SHIFT ; + } +if (oa) { + job->oa_base =amdgpu_bo_gpu_offset (oa) >>PAGE_SHIFT ; + job->oa_size =amdgpu_bo_size (oa) >>PAGE_SHIFT ; + } +} +void amdgpu_job_free_resources (struct amdgpu_job *job) {struct amdgpu_ring *ring =to_amdgpu_ring (job->base.sched);
drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +2 -0
@@ -76,6 +76,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, struct amdgpu_job **job, struct amdgpu_vm *vm);int amdgpu_job_alloc_with_ib (struct amdgpu_device *adev,unsigned size,enum amdgpu_ib_pool_type pool,struct amdgpu_job **job); +void amdgpu_job_set_resources (struct amdgpu_job *job,struct amdgpu_bo *gds, +struct amdgpu_bo *gws,struct amdgpu_bo *oa);void amdgpu_job_free_resources (struct amdgpu_job *job);void amdgpu_job_free (struct amdgpu_job *job); int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity,
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +15 -38
104 lines not on this page · raw message
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +10 -4
@@ -39,6 +39,8 @@#define AMDGPU_POISON 0xd0bed0be +struct hmm_range ; +struct amdgpu_gtt_mgr {struct ttm_resource_manager manager;struct drm_mm mm;
@@ -149,15 +151,19 @@ void amdgpu_ttm_recover_gart(struct ttm_buffer_object *tbo);uint64_t amdgpu_ttm_domain_start (struct amdgpu_device *adev,uint32_t type);#if IS_ENABLED (CONFIG_DRM_AMDGPU_USERPTR ) -int amdgpu_ttm_tt_get_user_pages (struct amdgpu_bo *bo,struct page **pages); -bool amdgpu_ttm_tt_get_user_pages_done (struct ttm_tt *ttm); +int amdgpu_ttm_tt_get_user_pages (struct amdgpu_bo *bo,struct page **pages, +struct hmm_range **range); +bool amdgpu_ttm_tt_get_user_pages_done (struct ttm_tt *ttm, +struct hmm_range *range);#else static inline int amdgpu_ttm_tt_get_user_pages (struct amdgpu_bo *bo, -struct page **pages) +struct page **pages, +struct hmm_range **range) {return -EPERM ; } -static inline bool amdgpu_ttm_tt_get_user_pages_done (struct ttm_tt *ttm) +static inline bool amdgpu_ttm_tt_get_user_pages_done (struct ttm_tt *ttm, +struct hmm_range *range) {return false; }
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +3 -0
@@ -156,6 +156,9 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)break ;case IP_VERSION (3 ,0 ,2 ): fw_name =FIRMWARE_VANGOGH ; +if ((adev->firmware.load_type ==AMDGPU_FW_LOAD_PSP ) && + (adev->pg_flags &AMD_PG_SUPPORT_VCN_DPG )) + adev->vcn.indirect_sram = true;break ;case IP_VERSION (3 ,0 ,16 ): fw_name =FIRMWARE_DIMGREY_CAVEFISH ;
drivers/gpu/drm/amd/display/Kconfig +7 -0
@@ -5,6 +5,7 @@ menu "Display Engine Configuration" config DRM_AMD_DC bool "AMD DC - Enable new display engine" default y + depends on BROKEN || !CC_IS_CLANG || X86_64 || SPARC64 || ARM64 select SND_HDA_COMPONENT if SND_HDA_CORE select DRM_AMD_DC_DCN if (X86 || PPC_LONG_DOUBLE_128) help
@@ -12,6 +13,12 @@ config DRM_AMD_DC support for AMDGPU. This adds required support for Vega and Raven ASICs. + calculate_bandwidth() is presently broken on all !(X86_64 || SPARC64 || ARM64) + architectures built with Clang (all released versions), whereby the stack + frame gets blown up to well over 5k. This would cause an immediate kernel + panic on most architectures. We'll revert this when the following bug report + has been resolved: https://github.com/llvm/llvm-project/issues/41896. + config DRM_AMD_DC_DCN def_bool n help
drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_0.h +81 -30
221 lines not on this page · raw message
drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu13_driver_if_v13_0_7.h +79 -38
251 lines not on this page · raw message
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h +3 -2
@@ -30,8 +30,9 @@#define SMU13_DRIVER_IF_VERSION_ALDE 0x08#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_4 0x07#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_5 0x04 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_0 0x30 -#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 0x2C +#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_10 0x32 +#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 0x35 +#define SMU13_DRIVER_IF_VERSION_SMU_V13_0_10 0x1D#define SMU13_MODE1_RESET_WAIT_TIME_IN_MS 500 //500ms
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +2 -1
@@ -288,7 +288,8 @@ int smu_v13_0_check_fw_version(struct smu_context *smu) smu->smc_driver_if_version =SMU13_DRIVER_IF_VERSION_ALDE ;break ;case IP_VERSION (13 ,0 ,0 ): - smu->smc_driver_if_version =SMU13_DRIVER_IF_VERSION_SMU_V13_0_0 ; +case IP_VERSION (13 ,0 ,10 ): + smu->smc_driver_if_version =SMU13_DRIVER_IF_VERSION_SMU_V13_0_0_10 ;break ;case IP_VERSION (13 ,0 ,7 ): smu->smc_driver_if_version =SMU13_DRIVER_IF_VERSION_SMU_V13_0_7 ;
drivers/gpu/drm/i915/gt/intel_gt.c +7 -2
@@ -616,8 +616,13 @@ int intel_gt_wait_for_idle(struct intel_gt *gt, long timeout)return -EINTR ; } -return timeout ? timeout :intel_uc_wait_for_idle (>->uc, - remaining_timeout); +if (timeout) +return timeout; + +if (remaining_timeout <0 ) + remaining_timeout =0 ; + +return intel_uc_wait_for_idle (>->uc, remaining_timeout); }int intel_gt_init (struct intel_gt *gt)
drivers/gpu/drm/i915/gt/intel_gt_requests.c +1 -1
@@ -199,7 +199,7 @@ out_active: spin_lock(&timelines->lock);if (remaining_timeout) *remaining_timeout = timeout; -return active_count ? timeout :0 ; +return active_count ? timeout ?: -ETIME :0 ; }static void retire_work_handler (struct work_struct *work)
drivers/hwmon/asus-ec-sensors.c +2 -0
@@ -938,6 +938,8 @@ static int asus_ec_probe(struct platform_device *pdev) ec_data->nr_sensors =hweight_long (ec_data->board_info->sensors); ec_data->sensors =devm_kcalloc (dev, ec_data->nr_sensors,sizeof (struct ec_sensor ),GFP_KERNEL ); +if (!ec_data->sensors) +return -ENOMEM ; status =setup_lock_data (dev);if (status) {
drivers/hwmon/coretemp.c +8 -1
@@ -242,10 +242,13 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)*/ if (host_bridge && host_bridge->vendor ==PCI_VENDOR_ID_INTEL ) {for (i =0 ; i <ARRAY_SIZE (tjmax_pci_table); i++) { -if (host_bridge->device == tjmax_pci_table[i].device) +if (host_bridge->device == tjmax_pci_table[i].device) { +pci_dev_put (host_bridge);return tjmax_pci_table[i].tjmax; + } } } +pci_dev_put (host_bridge);for (i =0 ; i <ARRAY_SIZE (tjmax_table); i++) {if (strstr (c->x86_model_id, tjmax_table[i].id))
@@ -533,6 +536,10 @@ static void coretemp_remove_core(struct platform_data *pdata, int indx) {struct temp_data *tdata = pdata->core_data[indx]; +/* if we errored on add then this is already gone */ +if (!tdata) +return ; +/* Remove the sysfs attributes */ sysfs_remove_group (&pdata->hwmon_dev->kobj, &tdata->attr_group);
drivers/hwmon/i5500_temp.c +1 -1
@@ -117,7 +117,7 @@ static int i5500_temp_probe(struct pci_dev *pdev,u32 tstimer;s8 tsfsc; - err =pci_enable_device (pdev); + err =pcim_enable_device (pdev);if (err) {dev_err (&pdev->dev,"Failed to enable device\n" );return err;
drivers/hwmon/ibmpex.c +1 -0
@@ -502,6 +502,7 @@ static void ibmpex_register_bmc(int iface, struct device *dev)return ; out_register: +list_del (&data->list);hwmon_device_unregister (data->hwmon_dev); out_user:ipmi_destroy_user (data->user);
drivers/hwmon/ina3221.c +2 -2
@@ -228,7 +228,7 @@ static int ina3221_read_value(struct ina3221_data *ina, unsigned int reg,* Shunt Voltage Sum register has 14-bit value with 1-bit shift * Other Shunt Voltage registers have 12 bits with 3-bit shift */ -if (reg ==INA3221_SHUNT_SUM ) +if (reg ==INA3221_SHUNT_SUM || reg ==INA3221_CRIT_SUM ) *val =sign_extend32 (regval >>1 ,14 );else *val =sign_extend32 (regval >>3 ,12 );
@@ -465,7 +465,7 @@ static int ina3221_write_curr(struct device *dev, u32 attr,* SHUNT_SUM: (1 / 40uV) << 1 = 1 / 20uV * SHUNT[1-3]: (1 / 40uV) << 3 = 1 / 5uV */ -if (reg ==INA3221_SHUNT_SUM ) +if (reg ==INA3221_SHUNT_SUM || reg ==INA3221_CRIT_SUM ) regval =DIV_ROUND_CLOSEST (voltage_uv,20 ) &0xfffe ;else regval =DIV_ROUND_CLOSEST (voltage_uv,5 ) &0xfff8 ;
drivers/hwmon/ltc2947-core.c +1 -1
@@ -396,7 +396,7 @@ static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,return ret;/* in milidegrees celcius, temp is given by: */ - *val = (__val *204 ) +550 ; + *val = (__val *204 ) +5500 ;return 0 ; }
drivers/i2c/busses/i2c-imx.c +4 -2
@@ -1132,7 +1132,8 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,int i, result;unsigned int temp;int block_data = msgs->flags &I2C_M_RECV_LEN ; -int use_dma = i2c_imx->dma && msgs->len >=DMA_THRESHOLD && !block_data; +int use_dma = i2c_imx->dma && msgs->flags &I2C_M_DMA_SAFE && + msgs->len >=DMA_THRESHOLD && !block_data; dev_dbg(&i2c_imx->adapter.dev, "<%s> write slave address: addr=0x%x\n",
@@ -1298,7 +1299,8 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter, result =i2c_imx_read (i2c_imx, &msgs[i], is_lastmsg, atomic); }else {if (!atomic && - i2c_imx->dma && msgs[i].len >=DMA_THRESHOLD ) + i2c_imx->dma && msgs[i].len >=DMA_THRESHOLD && + msgs[i].flags &I2C_M_DMA_SAFE ) result =i2c_imx_dma_write (i2c_imx, &msgs[i]);else result =i2c_imx_write (i2c_imx, &msgs[i], atomic);
drivers/i2c/busses/i2c-npcm7xx.c +10 -1
@@ -2393,8 +2393,17 @@ static struct platform_driver npcm_i2c_bus_driver = {static int __init npcm_i2c_init (void ) { +int ret; + npcm_i2c_debugfs_dir =debugfs_create_dir ("npcm_i2c" ,NULL ); -return platform_driver_register (&npcm_i2c_bus_driver); + + ret =platform_driver_register (&npcm_i2c_bus_driver); +if (ret) { +debugfs_remove_recursive (npcm_i2c_debugfs_dir); +return ret; + } + +return 0 ; }module_init (npcm_i2c_init);
drivers/i2c/busses/i2c-qcom-geni.c +0 -1
@@ -626,7 +626,6 @@ static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, struct i2c_msg msgs[], idev_err (gi2c->se.dev,"I2C timeout gpi flags:%d addr:0x%x\n" , gi2c->cur->flags, gi2c->cur->addr); gi2c->err = -ETIMEDOUT ; - goto err; }if (gi2c->err) {
drivers/i2c/i2c-core-base.c +5 -4
@@ -467,6 +467,7 @@ static int i2c_device_probe(struct device *dev) {struct i2c_client *client =i2c_verify_client (dev);struct i2c_driver *driver; +bool do_power_on;int status;if (!client)
@@ -541,8 +542,8 @@ static int i2c_device_probe(struct device *dev)if (status <0 ) goto err_clear_wakeup_irq; - status =dev_pm_domain_attach (&client->dev, - !i2c_acpi_waive_d0_probe (dev)); + do_power_on = !i2c_acpi_waive_d0_probe (dev); + status =dev_pm_domain_attach (&client->dev, do_power_on);if (status) goto err_clear_wakeup_irq;
@@ -581,7 +582,7 @@ static int i2c_device_probe(struct device *dev) err_release_driver_resources:devres_release_group (&client->dev, client->devres_group_id); err_detach_pm_domain: -dev_pm_domain_detach (&client->dev, !i2c_acpi_waive_d0_probe (dev)); +dev_pm_domain_detach (&client->dev, do_power_on); err_clear_wakeup_irq:dev_pm_clear_wake_irq (&client->dev);device_init_wakeup (&client->dev, false);
@@ -610,7 +611,7 @@ static void i2c_device_remove(struct device *dev)devres_release_group (&client->dev, client->devres_group_id); -dev_pm_domain_detach (&client->dev, !i2c_acpi_waive_d0_probe (dev)); +dev_pm_domain_detach (&client->dev, true);dev_pm_clear_wake_irq (&client->dev);device_init_wakeup (&client->dev, false);
drivers/iio/health/afe4403.c +3 -2
@@ -245,14 +245,14 @@ static int afe4403_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { struct afe4403_data *afe = iio_priv(indio_dev); -unsigned int reg = afe4403_channel_values[chan->address]; -unsigned int field = afe4403_channel_leds[chan->address]; +unsigned int reg, field;int ret;switch (chan->type) {case IIO_INTENSITY :switch (mask) {case IIO_CHAN_INFO_RAW : + reg = afe4403_channel_values[chan->address]; ret =afe4403_read (afe, reg, val);if (ret)return ret;
@@ -262,6 +262,7 @@ static int afe4403_read_raw(struct iio_dev *indio_dev,case IIO_CURRENT :switch (mask) {case IIO_CHAN_INFO_RAW : + field = afe4403_channel_leds[chan->address]; ret =regmap_field_read (afe->fields[field], val);if (ret)return ret;
drivers/iio/health/afe4404.c +7 -5
@@ -250,20 +250,20 @@ static int afe4404_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { struct afe4404_data *afe = iio_priv(indio_dev); -unsigned int value_reg = afe4404_channel_values[chan->address]; -unsigned int led_field = afe4404_channel_leds[chan->address]; -unsigned int offdac_field = afe4404_channel_offdacs[chan->address]; +unsigned int value_reg, led_field, offdac_field;int ret;switch (chan->type) {case IIO_INTENSITY :switch (mask) {case IIO_CHAN_INFO_RAW : + value_reg = afe4404_channel_values[chan->address]; ret =regmap_read (afe->regmap, value_reg, val);if (ret)return ret;return IIO_VAL_INT ;case IIO_CHAN_INFO_OFFSET : + offdac_field = afe4404_channel_offdacs[chan->address]; ret =regmap_field_read (afe->fields[offdac_field], val);if (ret)return ret;
@@ -273,6 +273,7 @@ static int afe4404_read_raw(struct iio_dev *indio_dev,case IIO_CURRENT :switch (mask) {case IIO_CHAN_INFO_RAW : + led_field = afe4404_channel_leds[chan->address]; ret =regmap_field_read (afe->fields[led_field], val);if (ret)return ret;
@@ -295,19 +296,20 @@ static int afe4404_write_raw(struct iio_dev *indio_dev, int val, int val2, long mask) { struct afe4404_data *afe = iio_priv(indio_dev); -unsigned int led_field = afe4404_channel_leds[chan->address]; -unsigned int offdac_field = afe4404_channel_offdacs[chan->address]; +unsigned int led_field, offdac_field;switch (chan->type) {case IIO_INTENSITY :switch (mask) {case IIO_CHAN_INFO_OFFSET : + offdac_field = afe4404_channel_offdacs[chan->address];return regmap_field_write (afe->fields[offdac_field], val); }break ;case IIO_CURRENT :switch (mask) {case IIO_CHAN_INFO_RAW : + led_field = afe4404_channel_leds[chan->address];return regmap_field_write (afe->fields[led_field], val); }break ;
drivers/iio/light/Kconfig +2 -0
@@ -293,6 +293,8 @@ config RPR0521 tristate "ROHM RPR0521 ALS and proximity sensor driver" depends on I2C select REGMAP_I2C + select IIO_BUFFER + select IIO_TRIGGERED_BUFFER help Say Y here if you want to build support for ROHM's RPR0521 ambient light and proximity sensor device.
drivers/input/touchscreen/raydium_i2c_ts.c +3 -1
@@ -211,12 +211,14 @@ static int raydium_i2c_send(struct i2c_client *client, error =raydium_i2c_xfer (client, addr, xfer,ARRAY_SIZE (xfer));if (likely (!error)) -return 0 ; + goto out;msleep (RM_RETRY_DELAY_MS ); }while (++tries <RM_MAX_RETRIES );dev_err (&client->dev,"%s failed: %d\n" , __func__, error); +out: +kfree (tx_buf);return error; }
drivers/iommu/intel/dmar.c +1 -0
@@ -820,6 +820,7 @@ int __init dmar_dev_scope_init(void) info =dmar_alloc_pci_notify_info (dev,BUS_NOTIFY_ADD_DEVICE );if (!info) { +pci_dev_put (dev);return dmar_dev_scope_status; }else {dmar_pci_bus_add_dev (info);
drivers/iommu/intel/iommu.c +3 -1
@@ -3844,8 +3844,10 @@ static inline bool has_external_pci(void)struct pci_dev *pdev =NULL ;for_each_pci_dev (pdev) -if (pdev->external_facing) +if (pdev->external_facing) { +pci_dev_put (pdev);return true; + }return false; }
drivers/media/common/videobuf2/frame_vector.c +12 -56
80 lines not on this page · raw message
drivers/mmc/core/core.c +7 -2
@@ -1484,6 +1484,11 @@ void mmc_init_erase(struct mmc_card *card) card->pref_erase =0 ; } +static bool is_trim_arg (unsigned int arg) +{ +return (arg &MMC_TRIM_OR_DISCARD_ARGS ) && arg !=MMC_DISCARD_ARG ; +} +static unsigned int mmc_mmc_erase_timeout (struct mmc_card *card,unsigned int arg,unsigned int qty) {
@@ -1766,7 +1771,7 @@ int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr, !(card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN))return -EOPNOTSUPP ; -if (mmc_card_mmc (card) && (arg &MMC_TRIM_ARGS ) && +if (mmc_card_mmc (card) &&is_trim_arg (arg) && !(card->ext_csd.sec_feature_support &EXT_CSD_SEC_GB_CL_EN ))return -EOPNOTSUPP ;
@@ -1796,7 +1801,7 @@ int mmc_erase(struct mmc_card *card, unsigned int from, unsigned int nr,* identified by the card->eg_boundary flag. */ rem = card->erase_size - (from % card->erase_size); -if ((arg &MMC_TRIM_ARGS ) && (card->eg_boundary) && (nr > rem)) { +if ((arg &MMC_TRIM_OR_DISCARD_ARGS ) && card->eg_boundary && nr > rem) { err =mmc_do_erase (card, from, from + rem -1 , arg); from += rem;if ((err) || (to <= from))
drivers/mmc/core/mmc_test.c +2 -1
@@ -3179,7 +3179,8 @@ static int __mmc_test_register_dbgfs_file(struct mmc_card *card,struct mmc_test_dbgfs_file *df;if (card->debugfs_root) -debugfs_create_file (name, mode, card->debugfs_root, card, fops); + file =debugfs_create_file (name, mode, card->debugfs_root, + card, fops); df =kmalloc (sizeof (*df),GFP_KERNEL );if (!df) {
drivers/mmc/host/mtk-sd.c +2 -4
@@ -2573,13 +2573,11 @@ static int msdc_of_clock_parse(struct platform_device *pdev,return PTR_ERR (host->src_clk_cg); } - host->sys_clk_cg =devm_clk_get_optional (&pdev->dev,"sys_cg" ); +/* If present, always enable for this clock gate */ + host->sys_clk_cg =devm_clk_get_optional_enabled (&pdev->dev,"sys_cg" );if (IS_ERR (host->sys_clk_cg)) host->sys_clk_cg =NULL ; -/* If present, always enable for this clock gate */ -clk_prepare_enable (host->sys_clk_cg); - host->bulk_clks[0 ].id ="pclk_cg" ; host->bulk_clks[1 ].id ="axi_cg" ; host->bulk_clks[2 ].id ="ahb_cg" ;
drivers/mmc/host/sdhci-esdhc-imx.c +1 -1
@@ -1512,7 +1512,7 @@ static void esdhc_cqe_enable(struct mmc_host *mmc)* system resume back. */ cqhci_writel (cq_host,0 ,CQHCI_CTL ); -if (cqhci_readl (cq_host,CQHCI_CTL ) &&CQHCI_HALT ) +if (cqhci_readl (cq_host,CQHCI_CTL ) &CQHCI_HALT )dev_err (mmc_dev (host->mmc),"failed to exit halt state when enable CQE\n" );
drivers/mmc/host/sdhci-sprd.c +3 -1
@@ -470,7 +470,7 @@ static int sdhci_sprd_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios) }if (IS_ERR (sprd_host->pinctrl)) -return 0 ; + goto reset;switch (ios->signal_voltage) {case MMC_SIGNAL_VOLTAGE_180 :
@@ -498,6 +498,8 @@ static int sdhci_sprd_voltage_switch(struct mmc_host *mmc, struct mmc_ios *ios)/* Wait for 300 ~ 500 us for pin state stable */ usleep_range (300 ,500 ); + +reset:sdhci_reset (host,SDHCI_RESET_CMD |SDHCI_RESET_DATA );return 0 ;
drivers/mmc/host/sdhci.c +54 -7
120 lines not on this page · raw message
drivers/mmc/host/sdhci.h +2 -0
@@ -526,6 +526,8 @@ struct sdhci_host {unsigned int clock;/* Current clock (MHz) */ u8 pwr;/* Current voltage */ +u8 drv_type;/* Current UHS-I driver type */ +bool reinit_uhs;/* Force UHS-related re-initialization */ bool runtime_suspended;/* Host is runtime suspended */ bool bus_on;/* Bus power prevents runtime suspend */
drivers/net/can/can327.c +3 -1
@@ -263,8 +263,10 @@ static void can327_feed_frame_to_netdev(struct can327 *elm, struct sk_buff *skb) {lockdep_assert_held (&elm->lock); -if (!netif_running (elm->dev)) +if (!netif_running (elm->dev)) { +kfree_skb (skb);return ; + }/* Queue for NAPI pickup. * rx-offload will update stats and LEDs for us.
drivers/net/can/cc770/cc770_isa.c +6 -4
@@ -264,22 +264,24 @@ static int cc770_isa_probe(struct platform_device *pdev)if (err) {dev_err (&pdev->dev,"couldn't register device (err=%d)\n" , err); - goto exit_unmap; + goto exit_free; }dev_info (&pdev->dev,"device registered (reg_base=0x%p, irq=%d)\n" , priv->reg_base, dev->irq);return 0 ; - exit_unmap: +exit_free: +free_cc770dev (dev); +exit_unmap:if (mem[idx])iounmap (base); - exit_release: +exit_release:if (mem[idx])release_mem_region (mem[idx], iosize);else release_region (port[idx], iosize); - exit: +exit:return err; }
drivers/net/can/m_can/m_can.c +1 -1
@@ -1910,7 +1910,7 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev) cdev->hclk =devm_clk_get (cdev->dev,"hclk" ); cdev->cclk =devm_clk_get (cdev->dev,"cclk" ); -if (IS_ERR (cdev->cclk)) { +if (IS_ERR (cdev->hclk) ||IS_ERR (cdev->cclk)) {dev_err (cdev->dev,"no clock found\n" ); ret = -ENODEV ; }
drivers/net/can/m_can/m_can_pci.c +6 -3
@@ -120,7 +120,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) ret =pci_alloc_irq_vectors (pci,1 ,1 ,PCI_IRQ_ALL_TYPES );if (ret <0 ) -return ret; + goto err_free_dev; mcan_class->dev = &pci->dev; mcan_class->net->irq =pci_irq_vector (pci,0 );
@@ -132,7 +132,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) ret =m_can_class_register (mcan_class);if (ret) - goto err; + goto err_free_irq;/* Enable interrupt control at CAN wrapper IP */ writel (0x1 , base +CTL_CSR_INT_CTL_OFFSET );
@@ -144,8 +144,10 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)return 0 ; -err: +err_free_irq:pci_free_irq_vectors (pci); +err_free_dev: +m_can_class_free_dev (mcan_class->net);return ret; }
@@ -161,6 +163,7 @@ static void m_can_pci_remove(struct pci_dev *pci)writel (0x0 , priv->base +CTL_CSR_INT_CTL_OFFSET );m_can_class_unregister (mcan_class); +m_can_class_free_dev (mcan_class->net);pci_free_irq_vectors (pci); }
drivers/net/can/sja1000/sja1000_isa.c +6 -4
@@ -202,22 +202,24 @@ static int sja1000_isa_probe(struct platform_device *pdev)if (err) {dev_err (&pdev->dev,"registering %s failed (err=%d)\n" ,DRV_NAME , err); - goto exit_unmap; + goto exit_free; }dev_info (&pdev->dev,"%s device registered (reg_base=0x%p, irq=%d)\n" ,DRV_NAME , priv->reg_base, dev->irq);return 0 ; - exit_unmap: +exit_free: +free_sja1000dev (dev); +exit_unmap:if (mem[idx])iounmap (base); - exit_release: +exit_release:if (mem[idx])release_mem_region (mem[idx], iosize);else release_region (port[idx], iosize); - exit: +exit:return err; }
drivers/net/can/usb/etas_es58x/es58x_core.c +4 -1
@@ -2091,8 +2091,11 @@ static int es58x_init_netdev(struct es58x_device *es58x_dev, int channel_idx) netdev->dev_port = channel_idx; ret =register_candev (netdev); -if (ret) +if (ret) { + es58x_dev->netdev[channel_idx] =NULL ; +free_candev (netdev);return ret; + }netdev_queue_set_dql_min_limit (netdev_get_tx_queue (netdev,0 ), es58x_dev->param->dql_min_limit);
drivers/net/dsa/lan9303-core.c +1 -1
@@ -959,7 +959,7 @@ static const struct lan9303_mib_desc lan9303_mib[] = { { .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", }, { .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", }, { .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", }, - { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", }, + { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "RxShort", }, { .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", }, { .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", }, { .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },
drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c +3 -2
@@ -13,6 +13,7 @@#include "aq_ptp.h" #include "aq_filters.h" #include "aq_macsec.h" +#include "aq_main.h" #include <linux/ptp_clock_kernel.h>
@@ -858,7 +859,7 @@ static int aq_set_ringparam(struct net_device *ndev,if (netif_running (ndev)) { ndev_running = true; -dev_close (ndev); +aq_ndev_close (ndev); } cfg->rxds =max (ring->rx_pending, hw_caps->rxds_min);
@@ -874,7 +875,7 @@ static int aq_set_ringparam(struct net_device *ndev, goto err_exit;if (ndev_running) - err =dev_open (ndev,NULL ); + err =aq_ndev_open (ndev); err_exit:return err;
drivers/net/ethernet/aquantia/atlantic/aq_main.c +2 -2
@@ -58,7 +58,7 @@ struct net_device *aq_ndev_alloc(void)return ndev; } -static int aq_ndev_open (struct net_device *ndev) +int aq_ndev_open (struct net_device *ndev) {struct aq_nic_s *aq_nic =netdev_priv (ndev);int err =0 ;
@@ -88,7 +88,7 @@ static int aq_ndev_open(struct net_device *ndev)return err; } -static int aq_ndev_close (struct net_device *ndev) +int aq_ndev_close (struct net_device *ndev) {struct aq_nic_s *aq_nic =netdev_priv (ndev);int err =0 ;
drivers/net/ethernet/aquantia/atlantic/aq_main.h +2 -0
@@ -16,5 +16,7 @@ DECLARE_STATIC_KEY_FALSE(aq_xdp_locking_key);void aq_ndev_schedule_work (struct work_struct *work);struct net_device *aq_ndev_alloc (void ); +int aq_ndev_open (struct net_device *ndev); +int aq_ndev_close (struct net_device *ndev);#endif /* AQ_MAIN_H */
drivers/net/ethernet/intel/e100.c +1 -4
@@ -1741,11 +1741,8 @@ static int e100_xmit_prepare(struct nic *nic, struct cb *cb, dma_addr =dma_map_single (&nic->pdev->dev, skb->data, skb->len,DMA_TO_DEVICE );/* If we can't map the skb, have the upper layer try later */ -if (dma_mapping_error (&nic->pdev->dev, dma_addr)) { -dev_kfree_skb_any (skb); - skb =NULL ; +if (dma_mapping_error (&nic->pdev->dev, dma_addr))return -ENOMEM ; - }/* * Use the last 4 bytes of the SKB payload packet as the CRC, used for
drivers/net/ethernet/intel/fm10k/fm10k_main.c +9 -1
@@ -32,6 +32,8 @@ struct workqueue_struct *fm10k_workqueue;**/ static int __init fm10k_init_module (void ) { +int ret; +pr_info ("%s\n" , fm10k_driver_string);pr_info ("%s\n" , fm10k_copyright);
@@ -43,7 +45,13 @@ static int __init fm10k_init_module(void)fm10k_dbg_init (); -return fm10k_register_pci_driver (); + ret =fm10k_register_pci_driver (); +if (ret) { +fm10k_dbg_exit (); +destroy_workqueue (fm10k_workqueue); + } + +return ret; }module_init (fm10k_init_module);
drivers/net/ethernet/intel/i40e/i40e_main.c +10 -1
@@ -16652,6 +16652,8 @@ static struct pci_driver i40e_driver = {**/ static int __init i40e_init_module (void ) { +int err; +pr_info ("%s: %s\n" , i40e_driver_name, i40e_driver_string);pr_info ("%s: %s\n" , i40e_driver_name, i40e_copyright);
@@ -16669,7 +16671,14 @@ static int __init i40e_init_module(void) }i40e_dbg_init (); -return pci_register_driver (&i40e_driver); + err =pci_register_driver (&i40e_driver); +if (err) { +destroy_workqueue (i40e_wq); +i40e_dbg_exit (); +return err; + } + +return 0 ; }module_init (i40e_init_module);
drivers/net/ethernet/intel/iavf/iavf_main.c +8 -1
@@ -5196,6 +5196,8 @@ static struct pci_driver iavf_driver = {**/ static int __init iavf_init_module (void ) { +int ret; +pr_info ("iavf: %s\n" , iavf_driver_string);pr_info ("%s\n" , iavf_copyright);
@@ -5206,7 +5208,12 @@ static int __init iavf_init_module(void)pr_err ("%s: Failed to create workqueue\n" , iavf_driver_name);return -ENOMEM ; } -return pci_register_driver (&iavf_driver); + + ret =pci_register_driver (&iavf_driver); +if (ret) +destroy_workqueue (iavf_wq); + +return ret; }module_init (iavf_init_module);
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +9 -1
@@ -4869,6 +4869,8 @@ static struct pci_driver ixgbevf_driver = {**/ static int __init ixgbevf_init_module (void ) { +int err; +pr_info ("%s\n" , ixgbevf_driver_string);pr_info ("%s\n" , ixgbevf_copyright); ixgbevf_wq =create_singlethread_workqueue (ixgbevf_driver_name);
@@ -4877,7 +4879,13 @@ static int __init ixgbevf_init_module(void)return -ENOMEM ; } -return pci_register_driver (&ixgbevf_driver); + err =pci_register_driver (&ixgbevf_driver); +if (err) { +destroy_workqueue (ixgbevf_wq); +return err; + } + +return 0 ; }module_init (ixgbevf_init_module);
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +2 -2
@@ -1497,8 +1497,8 @@ static ssize_t outlen_write(struct file *filp, const char __user *buf,return -EFAULT ; err =sscanf (outlen_str,"%d" , &outlen); -if (err <0 ) -return err; +if (err !=1 ) +return -EINVAL ; ptr =kzalloc (outlen,GFP_KERNEL );if (!ptr)
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +3 -0
@@ -1363,6 +1363,9 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw, bool clear_vf)esw_offloads_del_send_to_vport_meta_rules (esw);devl_rate_nodes_destroy (devlink); } +/* Destroy legacy fdb when disabling sriov in legacy mode. */ +if (esw->mode ==MLX5_ESWITCH_LEGACY ) +mlx5_eswitch_disable_locked (esw); esw->esw_funcs.num_vfs =0 ;
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h +8 -0
@@ -731,6 +731,14 @@ void mlx5_eswitch_offloads_destroy_single_fdb(struct mlx5_eswitch *master_esw, struct mlx5_eswitch *slave_esw);int mlx5_eswitch_reload_reps (struct mlx5_eswitch *esw); +static inline int mlx5_eswitch_num_vfs (struct mlx5_eswitch *esw) +{ +if (mlx5_esw_allowed (esw)) +return esw->esw_funcs.num_vfs; + +return 0 ; +} +#else /* CONFIG_MLX5_ESWITCH */ /* eswitch API stubs */ static inline int mlx5_eswitch_init (struct mlx5_core_dev *dev) {return 0 ; }
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +7 -0
@@ -3270,6 +3270,13 @@ static int esw_offloads_stop(struct mlx5_eswitch *esw,int err; esw->mode =MLX5_ESWITCH_LEGACY ; + +/* If changing from switchdev to legacy mode without sriov enabled, +* no need to create legacy fdb. +*/ +if (!mlx5_sriov_is_enabled (esw->dev)) +return 0 ; + err =mlx5_eswitch_enable_locked (esw,MLX5_ESWITCH_IGNORE_NUM_VFS );if (err)NL_SET_ERR_MSG_MOD (extack,"Failed setting eswitch to legacy" );
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c +2 -0
@@ -312,6 +312,8 @@ mlx5_eswitch_add_termtbl_rule(struct mlx5_eswitch *esw,for (curr_dest =0 ; curr_dest < num_vport_dests; curr_dest++) {struct mlx5_termtbl_handle *tt = attr->dests[curr_dest].termtbl; + attr->dests[curr_dest].termtbl =NULL ; +/* search for the destination associated with the * current term table */
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +6 -3
@@ -648,10 +648,13 @@ static bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)return false;#ifdef CONFIG_MLX5_ESWITCH - dev = ldev->pf[MLX5_LAG_P1 ].dev; -if ((mlx5_sriov_is_enabled (dev)) && !is_mdev_switchdev_mode (dev)) -return false; +for (i =0 ; i < ldev->ports; i++) { + dev = ldev->pf[i].dev; +if (mlx5_eswitch_num_vfs (dev->priv.eswitch) && !is_mdev_switchdev_mode (dev)) +return false; + } + dev = ldev->pf[MLX5_LAG_P1 ].dev; mode =mlx5_eswitch_mode (dev);for (i =0 ; i < ldev->ports; i++)if (mlx5_eswitch_mode (ldev->pf[i].dev) != mode)
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_table.c +4 -1
@@ -46,7 +46,7 @@ static int dr_table_set_miss_action_nic(struct mlx5dr_domain *dmn,int mlx5dr_table_set_miss_action (struct mlx5dr_table *tbl,struct mlx5dr_action *action) { -int ret; +int ret = -EOPNOTSUPP ;if (action && action->action_type !=DR_ACTION_TYP_FT )return -EOPNOTSUPP ;
@@ -67,6 +67,9 @@ int mlx5dr_table_set_miss_action(struct mlx5dr_table *tbl, goto out; } +if (ret) + goto out; +/* Release old action */ if (tbl->miss_action)refcount_dec (&tbl->miss_action->refcount);
drivers/net/ethernet/ni/nixge.c +15 -14
@@ -249,25 +249,26 @@ static void nixge_hw_dma_bd_release(struct net_device *ndev)struct sk_buff *skb;int i; -for (i =0 ; i <RX_BD_NUM ; i++) { - phys_addr =nixge_hw_dma_bd_get_addr (&priv->rx_bd_v[i], - phys); - -dma_unmap_single (ndev->dev.parent, phys_addr, -NIXGE_MAX_JUMBO_FRAME_SIZE , -DMA_FROM_DEVICE ); - - skb = (struct sk_buff *)(uintptr_t ) -nixge_hw_dma_bd_get_addr (&priv->rx_bd_v[i], - sw_id_offset); -dev_kfree_skb (skb); - } +if (priv->rx_bd_v) { +for (i =0 ; i <RX_BD_NUM ; i++) { + phys_addr =nixge_hw_dma_bd_get_addr (&priv->rx_bd_v[i], + phys); + +dma_unmap_single (ndev->dev.parent, phys_addr, +NIXGE_MAX_JUMBO_FRAME_SIZE , +DMA_FROM_DEVICE ); + + skb = (struct sk_buff *)(uintptr_t ) +nixge_hw_dma_bd_get_addr (&priv->rx_bd_v[i], + sw_id_offset); +dev_kfree_skb (skb); + } -if (priv->rx_bd_v)dma_free_coherent (ndev->dev.parent,sizeof (*priv->rx_bd_v) *RX_BD_NUM , priv->rx_bd_v, priv->rx_bd_p); + }if (priv->tx_skb)devm_kfree (ndev->dev.parent, priv->tx_skb);
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +2 -2
@@ -2991,7 +2991,7 @@ static void qlcnic_83xx_recover_driver_lock(struct qlcnic_adapter *adapter)QLCWRX (adapter->ahw,QLC_83XX_RECOVER_DRV_LOCK , val);dev_info (&adapter->pdev->dev,"%s: lock recovery initiated\n" , __func__); -msleep (QLC_83XX_DRV_LOCK_RECOVERY_DELAY ); +mdelay (QLC_83XX_DRV_LOCK_RECOVERY_DELAY ); val =QLCRDX (adapter->ahw,QLC_83XX_RECOVER_DRV_LOCK ); id = ((val >>2 ) &0xF );if (id == adapter->portnum) {
@@ -3027,7 +3027,7 @@ int qlcnic_83xx_lock_driver(struct qlcnic_adapter *adapter)if (status)break ; -msleep (QLC_83XX_DRV_LOCK_WAIT_DELAY ); +mdelay (QLC_83XX_DRV_LOCK_WAIT_DELAY ); i++;if (i ==1 )
drivers/net/ethernet/renesas/ravb_main.c +1 -0
@@ -3013,6 +3013,7 @@ static int __maybe_unused ravb_resume(struct device *dev) ret =ravb_open (ndev);if (ret <0 )return ret; +ravb_set_rx_mode (ndev);netif_device_attach (ndev); }
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +2 -0
@@ -749,6 +749,8 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,if (fc &FLOW_RX ) {pr_debug ("\tReceive Flow-Control ON\n" ); flow |=GMAC_RX_FLOW_CTRL_RFE ; + }else { +pr_debug ("\tReceive Flow-Control OFF\n" ); }writel (flow, ioaddr +GMAC_RX_FLOW_CTRL );
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +10 -2
@@ -1061,8 +1061,16 @@ static void stmmac_mac_link_up(struct phylink_config *config, ctrl |= priv->hw->link.duplex;/* Flow Control operation */ -if (tx_pause && rx_pause) -stmmac_mac_flow_ctrl (priv, duplex); +if (rx_pause && tx_pause) + priv->flow_ctrl =FLOW_AUTO ; +else if (rx_pause && !tx_pause) + priv->flow_ctrl =FLOW_RX ; +else if (!rx_pause && tx_pause) + priv->flow_ctrl =FLOW_TX ; +else + priv->flow_ctrl =FLOW_OFF ; + +stmmac_mac_flow_ctrl (priv, duplex);if (ctrl != old_ctrl)writel (ctrl, priv->ioaddr +MAC_CTRL_REG );
drivers/net/ethernet/ti/am65-cpsw-nuss.c +1 -1
@@ -2061,7 +2061,7 @@ static void am65_cpsw_nuss_cleanup_ndev(struct am65_cpsw_common *common)for (i =0 ; i < common->port_num; i++) { port = &common->ports[i]; -if (port->ndev) +if (port->ndev && port->ndev->reg_state ==NETREG_REGISTERED )unregister_netdev (port->ndev); } }
drivers/net/mdio/fwnode_mdio.c +1 -1
@@ -120,7 +120,7 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,/* Associate the fwnode with the device structure so it * can be looked up later. */ - phy->mdio.dev.fwnode = child; + phy->mdio.dev.fwnode =fwnode_handle_get (child);/* All data is now stored in the phy struct, so register it */ rc =phy_device_register (phy);
drivers/net/ntb_netdev.c +8 -1
@@ -484,7 +484,14 @@ static int __init ntb_netdev_init_module(void) rc =ntb_transport_register_client_dev (KBUILD_MODNAME );if (rc)return rc; -return ntb_transport_register_client (&ntb_netdev_client); + + rc =ntb_transport_register_client (&ntb_netdev_client); +if (rc) { +ntb_transport_unregister_client_dev (KBUILD_MODNAME ); +return rc; + } + +return 0 ; }module_init (ntb_netdev_init_module);
drivers/net/phy/phy_device.c +2 -0
@@ -216,6 +216,7 @@ static void phy_mdio_device_free(struct mdio_device *mdiodev)static void phy_device_release (struct device *dev) { +fwnode_handle_put (dev->fwnode);kfree (to_phy_device (dev)); }
@@ -1518,6 +1519,7 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, error_module_put:module_put (d->driver->owner); + d->driver =NULL ; error_put_device:put_device (d);if (ndev_owner != bus->owner)
drivers/net/tun.c +3 -1
@@ -686,7 +686,6 @@ static void __tun_detach(struct tun_file *tfile, bool clean)if (tun)xdp_rxq_info_unreg (&tfile->xdp_rxq);ptr_ring_cleanup (&tfile->tx_ring, tun_ptr_free); -sock_put (&tfile->sk); } }
@@ -702,6 +701,9 @@ static void tun_detach(struct tun_file *tfile, bool clean)if (dev)netdev_state_change (dev);rtnl_unlock (); + +if (clean) +sock_put (&tfile->sk); }static void tun_detach_all (struct net_device *dev)
drivers/net/wwan/iosm/iosm_ipc_mux_codec.c +14 -12
@@ -365,7 +365,8 @@ static void ipc_mux_dl_cmd_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb)/* Pass the DL packet to the netif layer. */ static int ipc_mux_net_receive (struct iosm_mux *ipc_mux,int if_id,struct iosm_wwan *wwan,u32 offset, -u8 service_class,struct sk_buff *skb) +u8 service_class,struct sk_buff *skb, +u32 pkt_len) {struct sk_buff *dest_skb =skb_clone (skb,GFP_ATOMIC );
@@ -373,7 +374,7 @@ static int ipc_mux_net_receive(struct iosm_mux *ipc_mux, int if_id,return -ENOMEM ;skb_pull (dest_skb, offset); -skb_set_tail_pointer (dest_skb, dest_skb->len); +skb_trim (dest_skb, pkt_len);/* Pass the packet to the netif layer. */ dest_skb->priority = service_class;
@@ -429,7 +430,7 @@ static void ipc_mux_dl_fcth_decode(struct iosm_mux *ipc_mux,static void ipc_mux_dl_adgh_decode (struct iosm_mux *ipc_mux,struct sk_buff *skb) { -u32 pad_len, packet_offset; +u32 pad_len, packet_offset, adgh_len;struct iosm_wwan *wwan;struct mux_adgh *adgh;u8 *block = skb->data;
@@ -470,10 +471,12 @@ static void ipc_mux_dl_adgh_decode(struct iosm_mux *ipc_mux, packet_offset =sizeof (*adgh) + pad_len; if_id += ipc_mux->wwan_q_offset; + adgh_len =le16_to_cpu (adgh->length);/* Pass the packet to the netif layer */ rc =ipc_mux_net_receive (ipc_mux, if_id, wwan, packet_offset, - adgh->service_class, skb); + adgh->service_class, skb, + adgh_len - packet_offset);if (rc) {dev_err (ipc_mux->dev,"mux adgh decoding error" );return ;
@@ -547,7 +550,7 @@ static int mux_dl_process_dg(struct iosm_mux *ipc_mux, struct mux_adbh *adbh, int if_id, int nr_of_dg) {u32 dl_head_pad_len = ipc_mux->session[if_id].dl_head_pad_len; -u32 packet_offset, i, rc; +u32 packet_offset, i, rc, dg_len;for (i =0 ; i < nr_of_dg; i++, dg++) { if (le32_to_cpu(dg->datagram_index)
@@ -562,11 +565,12 @@ static int mux_dl_process_dg(struct iosm_mux *ipc_mux, struct mux_adbh *adbh, packet_offset =le32_to_cpu (dg->datagram_index) + dl_head_pad_len; + dg_len =le16_to_cpu (dg->datagram_length);/* Pass the packet to the netif layer. */ rc =ipc_mux_net_receive (ipc_mux, if_id, ipc_mux->wwan, packet_offset, - dg->service_class, - skb); + dg->service_class, skb, + dg_len - dl_head_pad_len);if (rc) goto dg_error; }
@@ -1207,10 +1211,9 @@ static int mux_ul_dg_update_tbl_index(struct iosm_mux *ipc_mux, qlth_n_ql_size, ul_list);ipc_mux_ul_adb_finish (ipc_mux);if (ipc_mux_ul_adb_allocate (ipc_mux, adb, &ipc_mux->size_needed, -IOSM_AGGR_MUX_SIG_ADBH )) { -dev_kfree_skb (src_skb); +IOSM_AGGR_MUX_SIG_ADBH ))return -ENOMEM ; - } + ipc_mux->size_needed =le32_to_cpu (adb->adbh->block_length); ipc_mux->size_needed += offsetof(struct mux_adth , dg);
@@ -1471,8 +1474,7 @@ void ipc_mux_ul_encoded_process(struct iosm_mux *ipc_mux, struct sk_buff *skb) ipc_mux->ul_data_pend_bytes);/* Reset the skb settings. */ - skb->tail =0 ; - skb->len =0 ; +skb_trim (skb,0 );/* Add the consumed ADB to the free list. */ skb_queue_tail ((&ipc_mux->ul_adb.free_list), skb);
drivers/net/wwan/iosm/iosm_ipc_protocol.h +1 -1
@@ -122,7 +122,7 @@ struct iosm_protocol {struct iosm_imem *imem;struct ipc_rsp *rsp_ring[IPC_MEM_MSG_ENTRIES ];struct device *dev; -phys_addr_t phy_ap_shm; +dma_addr_t phy_ap_shm;u32 old_msg_tail; };
drivers/nvme/host/core.c +1 -1
@@ -4297,7 +4297,7 @@ static void nvme_ns_remove(struct nvme_ns *ns)mutex_unlock (&ns->ctrl->subsys->lock);/* guarantee not available in head->list */ -synchronize_rcu (); +synchronize_srcu (&ns->head->srcu);if (!nvme_ns_head_multipath (ns->head))nvme_cdev_del (&ns->cdev, &ns->cdev_device);
drivers/nvme/host/multipath.c +3 -0
@@ -174,11 +174,14 @@ void nvme_mpath_revalidate_paths(struct nvme_ns *ns)struct nvme_ns_head *head = ns->head;sector_t capacity =get_capacity (head->disk);int node; +int srcu_idx; + srcu_idx =srcu_read_lock (&head->srcu);list_for_each_entry_rcu (ns, &head->list, siblings) {if (capacity !=get_capacity (ns->disk))clear_bit (NVME_NS_READY , &ns->flags); } +srcu_read_unlock (&head->srcu, srcu_idx);for_each_node (node)rcu_assign_pointer (head->current_path[node],NULL );
drivers/nvmem/rmem.c +2 -2
@@ -37,9 +37,9 @@ static int rmem_read(void *context, unsigned int offset,* but as of Dec 2020 this isn't possible on arm64. */ addr =memremap (priv->mem->base, available,MEMREMAP_WB ); -if (IS_ERR (addr)) { +if (!addr) {dev_err (priv->dev,"Failed to remap memory region\n" ); -return PTR_ERR (addr); +return -ENOMEM ; } count =memory_read_from_buffer (val, bytes, &off, addr, available);
drivers/of/property.c +3 -1
@@ -993,8 +993,10 @@ of_fwnode_get_reference_args(const struct fwnode_handle *fwnode, nargs, index, &of_args);if (ret <0 )return ret; -if (!args) +if (!args) { +of_node_put (of_args.np);return 0 ; + } args->nargs = of_args.args_count; args->fwnode =of_fwnode_handle (of_args.np);
drivers/pinctrl/intel/pinctrl-intel.c +26 -1
@@ -436,9 +436,14 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)writel (value, padcfg0); } +static int __intel_gpio_get_gpio_mode (u32 value) +{ +return (value &PADCFG0_PMODE_MASK ) >>PADCFG0_PMODE_SHIFT ; +} +static int intel_gpio_get_gpio_mode (void __iomem *padcfg0) { -return (readl (padcfg0) &PADCFG0_PMODE_MASK ) >>PADCFG0_PMODE_SHIFT ; +return __intel_gpio_get_gpio_mode (readl (padcfg0)); }static void intel_gpio_set_gpio_mode (void __iomem *padcfg0)
@@ -1674,6 +1679,7 @@ EXPORT_SYMBOL_GPL(intel_pinctrl_get_soc_data);static bool intel_pinctrl_should_save (struct intel_pinctrl *pctrl,unsigned int pin) {const struct pin_desc *pd =pin_desc_get (pctrl->pctldev, pin); +u32 value;if (!pd || !intel_pad_usable (pctrl, pin))return false;
@@ -1688,6 +1694,25 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int gpiochip_line_is_irq(&pctrl->chip, intel_pin_to_gpio(pctrl, pin)))return true; +/* +* The firmware on some systems may configure GPIO pins to be +* an interrupt source in so called "direct IRQ" mode. In such +* cases the GPIO controller driver has no idea if those pins +* are being used or not. At the same time, there is a known bug +* in the firmwares that don't restore the pin settings correctly +* after suspend, i.e. by an unknown reason the Rx value becomes +* inverted. +* +* Hence, let's save and restore the pins that are configured +* as GPIOs in the input mode with GPIROUTIOXAPIC bit set. +* +* See https://bugzilla.kernel.org/show_bug.cgi?id=214749. +*/ + value =readl (intel_get_padcfg (pctrl, pin,PADCFG0 )); +if ((value &PADCFG0_GPIROUTIOXAPIC ) && (value &PADCFG0_GPIOTXDIS ) && + (__intel_gpio_get_gpio_mode (value) ==PADCFG0_PMODE_GPIO )) +return true; +return false; }
drivers/pinctrl/pinctrl-single.c +1 -1
@@ -727,7 +727,7 @@ static int pcs_allocate_pin_table(struct pcs_device *pcs) mux_bytes = pcs->width /BITS_PER_BYTE ; -if (pcs->bits_per_mux) { +if (pcs->bits_per_mux && pcs->fmask) { pcs->bits_per_pin =fls (pcs->fmask); nr_pins = (pcs->size *BITS_PER_BYTE ) / pcs->bits_per_pin; }else {
fs/afs/fs_probe.c +2 -2
@@ -167,8 +167,8 @@ void afs_fileserver_probe_result(struct afs_call *call)clear_bit (AFS_SERVER_FL_HAS_FS64 , &server->flags); } -if (rxrpc_kernel_get_srtt (call->net->socket, call->rxcall, &rtt_us) && - rtt_us < server->probe.rtt) { +rxrpc_kernel_get_srtt (call->net->socket, call->rxcall, &rtt_us); +if (rtt_us < server->probe.rtt) { server->probe.rtt = rtt_us; server->rtt = rtt_us; alist->preferred = index;
fs/afs/server.c +1 -1
@@ -406,7 +406,7 @@ void afs_put_server(struct afs_net *net, struct afs_server *server,if (!server)return ; - a =atomic_inc_return (&server->active); + a =atomic_read (&server->active); zero =__refcount_dec_and_test (&server->ref, &r);trace_afs_server (debug_id, r -1 , a, reason);if (unlikely (zero))
fs/btrfs/qgroup.c +1 -8
@@ -2920,14 +2920,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, dstgroup->rsv_rfer = inherit->lim.rsv_rfer; dstgroup->rsv_excl = inherit->lim.rsv_excl; - ret =update_qgroup_limit_item (trans, dstgroup); -if (ret) { - fs_info->qgroup_flags |=BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT ; -btrfs_info (fs_info, -"unable to update quota limit for %llu" , - dstgroup->qgroupid); - goto unlock; - } +qgroup_dirty (fs_info, dstgroup); }if (srcid) {
fs/ksmbd/vfs.c +3 -3
@@ -1784,9 +1784,9 @@ int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work, ret =vfs_copy_file_range (src_fp->filp, src_off, dst_fp->filp, dst_off, len,0 );if (ret == -EOPNOTSUPP || ret == -EXDEV ) - ret =generic_copy_file_range (src_fp->filp, src_off, - dst_fp->filp, dst_off, - len,0 ); + ret =vfs_copy_file_range (src_fp->filp, src_off, + dst_fp->filp, dst_off, len, +COPY_FILE_SPLICE );if (ret <0 )return ret;
fs/nfsd/vfs.c +2 -2
@@ -572,8 +572,8 @@ ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst, ret =vfs_copy_file_range (src, src_pos, dst, dst_pos, count,0 );if (ret == -EOPNOTSUPP || ret == -EXDEV ) - ret =generic_copy_file_range (src, src_pos, dst, dst_pos, - count,0 ); + ret =vfs_copy_file_range (src, src_pos, dst, dst_pos, count, +COPY_FILE_SPLICE );return ret; }
fs/nilfs2/dat.c +7 -0
@@ -111,6 +111,13 @@ static void nilfs_dat_commit_free(struct inode *dat,kunmap_atomic (kaddr);nilfs_dat_commit_entry (dat, req); + +if (unlikely (req->pr_desc_bh ==NULL || req->pr_bitmap_bh ==NULL )) { +nilfs_error (dat->i_sb, +"state inconsistency probably due to duplicate use of vblocknr = %llu" , + (unsigned long long )req->pr_entry_nr); +return ; + }nilfs_palloc_commit_free_entry (dat, req); }
fs/read_write.c +15 -4
@@ -1388,6 +1388,8 @@ ssize_t generic_copy_file_range(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags) { + lockdep_assert(sb_write_started(file_inode(file_out)->i_sb)); +return do_splice_direct (file_in, &pos_in, file_out, &pos_out, len >MAX_RW_COUNT ?MAX_RW_COUNT : len,0 ); }
@@ -1424,7 +1426,9 @@ static int generic_copy_file_checks(struct file *file_in, loff_t pos_in,* and several different sets of file_operations, but they all end up * using the same ->copy_file_range() function pointer. */ -if (file_out->f_op->copy_file_range) { +if (flags ©_FILE_SPLICE ) { +/* cross sb splice is allowed */ + }else if (file_out->f_op->copy_file_range) {if (file_in->f_op->copy_file_range != file_out->f_op->copy_file_range)return -EXDEV ;
@@ -1474,8 +1478,9 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, size_t len, unsigned int flags) { ssize_t ret; +bool splice = flags ©_FILE_SPLICE ; -if (flags !=0 ) +if (flags & ~COPY_FILE_SPLICE )return -EINVAL ; ret = generic_copy_file_checks(file_in, pos_in, file_out, pos_out, &len,
@@ -1501,14 +1506,14 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,* same sb using clone, but for filesystems where both clone and copy * are supported (e.g. nfs,cifs), we only call the copy method. */ -if (file_out->f_op->copy_file_range) { +if (!splice && file_out->f_op->copy_file_range) { ret = file_out->f_op->copy_file_range (file_in, pos_in, file_out, pos_out, len, flags); goto done; } -if (file_in->f_op->remap_file_range && +if (!splice && file_in->f_op->remap_file_range &&file_inode (file_in)->i_sb ==file_inode (file_out)->i_sb) { ret = file_in->f_op->remap_file_range(file_in, pos_in, file_out, pos_out,
@@ -1528,6 +1533,8 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,* consistent story about which filesystems support copy_file_range() * and which filesystems do not, that will allow userspace tools to * make consistent desicions w.r.t using copy_file_range(). +* +* We also get here if caller (e.g. nfsd) requested COPY_FILE_SPLICE. */ ret =generic_copy_file_range (file_in, pos_in, file_out, pos_out, len, flags);
@@ -1582,6 +1589,10 @@ SYSCALL_DEFINE6(copy_file_range, int, fd_in, loff_t __user *, off_in, pos_out = f_out.file->f_pos; } + ret = -EINVAL ; +if (flags !=0 ) + goto out; + ret =vfs_copy_file_range (f_in.file, pos_in, f_out.file, pos_out, len, flags);if (ret >0 ) {
include/linux/damon.h +20 -17
@@ -216,13 +216,26 @@ struct damos_stat { };/** -* struct damos - Represents a Data Access Monitoring-based Operation Scheme. +* struct damos_access_pattern - Target access pattern of the given scheme. * @min_sz_region: Minimum size of target regions. * @max_sz_region: Maximum size of target regions. * @min_nr_accesses: Minimum ``->nr_accesses`` of target regions. * @max_nr_accesses: Maximum ``->nr_accesses`` of target regions. * @min_age_region: Minimum age of target regions. * @max_age_region: Maximum age of target regions. +*/ +struct damos_access_pattern { +unsigned long min_sz_region; +unsigned long max_sz_region; +unsigned int min_nr_accesses; +unsigned int max_nr_accesses; +unsigned int min_age_region; +unsigned int max_age_region; +}; + +/** +* struct damos - Represents a Data Access Monitoring-based Operation Scheme. +* @pattern: Access pattern of target regions. * @action: &damo_action to be applied to the target regions. * @quota: Control the aggressiveness of this scheme. * @wmarks: Watermarks for automated (in)activation of this scheme.
@@ -230,10 +243,8 @@ struct damos_stat {* @list: List head for siblings. * * For each aggregation interval, DAMON finds regions which fit in the -* condition (&min_sz_region, &max_sz_region, &min_nr_accesses, -* &max_nr_accesses, &min_age_region, &max_age_region) and applies &action to -* those. To avoid consuming too much CPU time or IO resources for the -* &action, "a is used. +* &pattern and applies &action to those. To avoid consuming too much +* CPU time or IO resources for the &action, "a is used. * * To do the work only when needed, schemes can be activated for specific * system situations using &wmarks. If all schemes that registered to the
@@ -248,12 +259,7 @@ struct damos_stat {* &action is applied. */ struct damos { -unsigned long min_sz_region; -unsigned long max_sz_region; -unsigned int min_nr_accesses; -unsigned int max_nr_accesses; -unsigned int min_age_region; -unsigned int max_age_region; +struct damos_access_pattern pattern;enum damos_action action;struct damos_quota quota;struct damos_watermarks wmarks;
@@ -501,12 +507,9 @@ void damon_destroy_region(struct damon_region *r, struct damon_target *t);int damon_set_regions (struct damon_target *t,struct damon_addr_range *ranges,unsigned int nr_ranges); -struct damos *damon_new_scheme ( -unsigned long min_sz_region,unsigned long max_sz_region, -unsigned int min_nr_accesses,unsigned int max_nr_accesses, -unsigned int min_age_region,unsigned int max_age_region, -enum damos_action action,struct damos_quota *quota, -struct damos_watermarks *wmarks); +struct damos *damon_new_scheme (struct damos_access_pattern *pattern, +enum damos_action action,struct damos_quota *quota, +struct damos_watermarks *wmarks);void damon_add_scheme (struct damon_ctx *ctx,struct damos *s);void damon_destroy_scheme (struct damos *s);
include/linux/fs.h +8 -0
@@ -2087,6 +2087,14 @@ struct dir_context {*/ #define REMAP_FILE_ADVISORY (REMAP_FILE_CAN_SHORTEN)
Lines of this file are not shown. View the raw message.
mm/damon/lru_sort.c +28 -18
46 lines not on this page · raw message
mm/damon/sysfs.c +56 -7
63 lines not on this page · raw message
tools/testing/selftests/net/fib_nexthops.sh +16 -0
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.