Linux 6.16.9
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.16.9 kernel.
All users of the 6.16 kernel series must upgrade.
The updated 6.16.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.16.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/devicetree/bindings/serial/8250.yaml | 77 +++-- Documentation/netlink/specs/conntrack.yaml | 9 Documentation/netlink/specs/mptcp_pm.yaml | 4 Makefile | 2 arch/loongarch/Kconfig | 12 arch/loongarch/Makefile | 15 arch/loongarch/include/asm/acenv.h | 7 arch/loongarch/include/asm/kvm_mmu.h | 20 + arch/loongarch/kernel/env.c | 2 arch/loongarch/kernel/stacktrace.c | 3 arch/loongarch/kernel/vdso.c | 3 arch/loongarch/kvm/intc/eiointc.c | 87 +++-- arch/loongarch/kvm/intc/pch_pic.c | 21 - arch/loongarch/kvm/mmu.c | 8 arch/s390/include/asm/pci_insn.h | 10 arch/um/drivers/virtio_uml.c | 6 arch/um/os-Linux/file.c | 2 arch/x86/include/asm/sev.h | 38 +- arch/x86/kvm/svm/svm.c | 3 crypto/af_alg.c | 10 drivers/block/zram/zram_drv.c | 8 drivers/clk/sunxi-ng/ccu_mp.c | 2 drivers/crypto/ccp/sev-dev.c | 2 drivers/dpll/dpll_netlink.c | 4 drivers/gpio/gpiolib-acpi-core.c | 4 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 16 - drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 12 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 24 - drivers/gpu/drm/amd/amdkfd/kfd_device.c | 36 ++ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 39 ++ drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 2 drivers/gpu/drm/bridge/analogix/anx7625.c | 6 drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 6 drivers/gpu/drm/xe/abi/guc_actions_abi.h | 5 drivers/gpu/drm/xe/abi/guc_klvs_abi.h | 40 ++ drivers/gpu/drm/xe/xe_exec_queue.c | 22 - drivers/gpu/drm/xe/xe_exec_queue_types.h | 8 drivers/gpu/drm/xe/xe_execlist.c | 25 + drivers/gpu/drm/xe/xe_execlist_types.h | 2 drivers/gpu/drm/xe/xe_gt.c | 3 drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 1 drivers/gpu/drm/xe/xe_guc.c | 62 +++- drivers/gpu/drm/xe/xe_guc.h | 1 drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 4 drivers/gpu/drm/xe/xe_guc_submit.c | 139 +++++++-- drivers/gpu/drm/xe/xe_guc_submit.h | 2 drivers/gpu/drm/xe/xe_tile_sysfs.c | 12 drivers/gpu/drm/xe/xe_uc.c | 4 drivers/gpu/drm/xe/xe_vm.c | 4 drivers/iommu/amd/amd_iommu_types.h | 1 drivers/iommu/amd/init.c | 9 drivers/iommu/amd/io_pgtable.c | 25 + drivers/iommu/intel/iommu.c | 7 drivers/iommu/s390-iommu.c | 29 + drivers/md/dm-raid.c | 6 drivers/md/dm-stripe.c | 10 drivers/mmc/host/mvsdio.c | 2 drivers/mmc/host/sdhci-pci-gli.c | 68 ++++ drivers/mmc/host/sdhci-uhs2.c | 3 drivers/mmc/host/sdhci.c | 34 +- drivers/net/bonding/bond_main.c | 2 drivers/net/ethernet/broadcom/cnic.c | 3 drivers/net/ethernet/cavium/liquidio/request_manager.c | 2 drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c | 2 drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 drivers/net/ethernet/intel/ice/ice_txrx.c | 80 ++--- drivers/net/ethernet/intel/ice/ice_txrx.h | 1 drivers/net/ethernet/intel/igc/igc.h | 1 drivers/net/ethernet/intel/igc/igc_main.c | 12 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 22 - drivers/net/ethernet/marvell/octeon_ep/octep_main.c | 16 + drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c | 3 drivers/net/ethernet/marvell/octeontx2/nic/otx2_ptp.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | 1 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h | 1 drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c | 3 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 27 + drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c | 1 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 4 drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h | 15 drivers/net/ethernet/mellanox/mlx5/core/port.c | 6 drivers/net/ethernet/natsemi/ns83820.c | 13 drivers/net/ethernet/qlogic/qed/qed_debug.c | 7 drivers/net/wireless/mediatek/mt76/mac80211.c | 2 drivers/net/wireless/microchip/wilc1000/wlan_cfg.c | 37 +- drivers/net/wireless/microchip/wilc1000/wlan_cfg.h | 5 drivers/nvme/host/core.c | 18 - drivers/pcmcia/omap_cf.c | 8 drivers/platform/x86/asus-nb-wmi.c | 25 + drivers/platform/x86/asus-wmi.h | 3 drivers/power/supply/bq27xxx_battery.c | 4 fs/btrfs/delayed-inode.c | 3 fs/btrfs/inode.c | 11 fs/btrfs/tree-checker.c | 4 fs/btrfs/tree-log.c | 2 fs/btrfs/zoned.c | 2 fs/nilfs2/sysfs.c | 4 fs/nilfs2/sysfs.h | 8 fs/smb/client/cifsproto.h | 4 fs/smb/client/inode.c | 23 + fs/smb/client/misc.c | 38 +- fs/smb/client/smbdirect.c | 132 +++++--- fs/smb/client/smbdirect.h | 23 - fs/smb/common/smbdirect/smbdirect_socket.h | 29 + fs/smb/server/transport_rdma.c | 183 ++++++++---- include/crypto/if_alg.h | 10 include/linux/io_uring_types.h | 3 include/linux/mlx5/driver.h | 1 include/linux/swap.h | 10 include/net/dst_metadata.h | 11 include/net/sock.h | 5 include/sound/sdca.h | 1 include/uapi/linux/mptcp.h | 2 include/uapi/linux/mptcp_pm.h | 4 io_uring/io-wq.c | 6 io_uring/io_uring.c | 10 io_uring/io_uring.h | 4 io_uring/msg_ring.c | 24 - io_uring/notif.c | 2 io_uring/poll.c | 2 io_uring/timeout.c | 2 io_uring/uring_cmd.c | 2 kernel/cgroup/cgroup.c | 43 ++ kernel/sched/ext.c | 6 mm/gup.c | 52 ++- mm/mlock.c | 6 mm/swap.c | 50 +-- mm/vmscan.c | 2 net/ipv4/tcp.c | 5 net/ipv4/tcp_ao.c | 4 net/mac80211/driver-ops.h | 2 net/mac80211/main.c | 7 net/mptcp/options.c | 6 net/mptcp/pm_netlink.c | 7 net/mptcp/protocol.c | 16 + net/mptcp/subflow.c | 4 net/rds/ib_frmr.c | 20 - net/rfkill/rfkill-gpio.c | 4 net/rxrpc/rxgk.c | 18 - net/rxrpc/rxgk_app.c | 29 + net/rxrpc/rxgk_common.h | 14 net/tls/tls.h | 1 net/tls/tls_strp.c | 14 net/tls/tls_sw.c | 3 samples/damon/mtier.c | 25 - samples/damon/prcl.c | 31 +- samples/damon/wsse.c | 22 - sound/firewire/motu/motu-hwdep.c | 2 sound/pci/hda/patch_realtek.c | 1 sound/soc/amd/acp/acp-i2s.c | 11 sound/soc/codecs/sma1307.c | 7 sound/soc/codecs/wm8940.c | 9 sound/soc/codecs/wm8974.c | 8 sound/soc/intel/catpt/pcm.c | 23 + sound/soc/qcom/qdsp6/audioreach.c | 1 sound/soc/qcom/qdsp6/q6apm-lpass-dais.c | 7 sound/soc/sdca/sdca_device.c | 20 + sound/soc/sdca/sdca_functions.c | 13 sound/soc/sdca/sdca_regmap.c | 2 sound/soc/sof/intel/hda-stream.c | 2 sound/usb/qcom/qc_audio_offload.c | 92 +++--- tools/arch/loongarch/include/asm/inst.h | 12 tools/objtool/arch/loongarch/decode.c | 33 +- tools/perf/util/maps.c | 9 tools/testing/selftests/net/mptcp/mptcp_connect.c | 11 tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 16 - tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 7 tools/testing/selftests/net/mptcp/userspace_pm.sh | 14 169 files changed, 1794 insertions(+), 821 deletions(-)
[email protected] (1):
wifi: wilc1000: avoid buffer overflow in WID string configuration
Alex Deucher (2):
drm/amdkfd: add proper handling for S0ix drm/amdgpu: suspend KFD and KGD user queues for S0ix
Alex Elder (1):
dt-bindings: serial: 8250: move a constraint
Alexey Nepomnyashih (1):
net: liquidio: fix overflow in octeon_init_instr_queue()
Amadeusz Sławiński (1):
ASoC: Intel: catpt: Expose correct bit depth to userspace
Anderson Nascimento (1):
net/tcp: Fix a NULL pointer dereference when using TCP-AO with TCP_REPAIR
Andrea Righi (1):
Revert "sched_ext: Skip per-CPU tasks in scx_bpf_reenqueue_local()"
Antheas Kapenekakis (2):
platform/x86: asus-wmi: Fix ROG button mapping, tablet mode on ASUS ROG Z13 platform/x86: asus-wmi: Re-add extra keys to ignore_key_wlan quirk
Ben Chuang (3):
mmc: sdhci: Move the code related to setting the clock from sdhci_set_ios_common() into sdhci_set_ios()
mmc: sdhci-pci-gli: GL9767: Fix initializing the UHS-II interface during a power-on
mmc: sdhci-uhs2: Fix calling incorrect sdhci_set_clock() function
Bibo Mao (5):
LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_ctrl_access()
LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_regs_access()
LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_eiointc_sw_status_access()
LoongArch: KVM: Avoid copy_*_user() with lock hold in kvm_pch_pic_regs_access()
LoongArch: KVM: Fix VM migration failure with PTW enabled
Borislav Petkov (AMD) (1):
crypto: ccp - Always pass in an error pointer to __sev_platform_shutdown_locked()
Charles Keepax (4):
ASoC: wm8940: Correct PLL rate rounding
ASoC: wm8940: Correct typo in control name
ASoC: wm8974: Correct PLL rate rounding
ASoC: SDCA: Fix return value in sdca_regmap_mbq_size()
Chen Ridong (1):
cgroup: split cgroup_destroy_wq into 3 workqueues
Chen-Yu Tsai (1):
clk: sunxi-ng: mp: Fix dual-divider clock rate readback
Christoph Hellwig (1):
nvme: fix PI insert on write
Colin Ian King (1):
ASoC: SOF: Intel: hda-stream: Fix incorrect variable used in error message
Dan Carpenter (2):
ASoC: codec: sma1307: Fix memory corruption in sma1307_setting_loaded() drm/xe: Fix a NULL vs IS_ERR() in xe_vm_add_compute_exec_queue()
Daniele Ceraolo Spurio (3):
drm/xe: Fix error handling if PXP fails to start drm/xe/guc: Enable extended CAT error reporting drm/xe/guc: Set RCS/CCS yield policy
David Howells (2):
rxrpc: Fix unhandled errors in rxgk_verify_packet_integrity()
rxrpc: Fix untrusted unsigned subtract
Duoming Zhou (2):
cnic: Fix use-after-free bugs in cnic_delete_task
octeontx2-pf: Fix use-after-free bugs in otx2_sync_tstamp()
Eric Dumazet (1):
net: clear sk->sk_ino in sk_set_socket(sk, NULL)
Eugene Koira (1):
iommu/vt-d: Fix __domain_mapping()'s usage of switch_to_super_page()
Felix Fietkau (1):
wifi: mt76: do not add non-sta wcid entries to the poll list
Filipe Manana (1):
btrfs: fix invalid extref key setup when replaying dentry
Frank Li (1):
dt-bindings: serial: 8250: allow clock 'uartclk' and 'reg' for nxp,lpc1850-uart
Geert Uytterhoeven (1):
pcmcia: omap_cf: Mark driver struct with __refdata to prevent section mismatch
Geliang Tang (1):
selftests: mptcp: sockopt: fix error messages
Greg Kroah-Hartman (1):
Linux 6.16.9
Guangshuo Li (1):
LoongArch: vDSO: Check kcalloc() result in init_vdso()
H. Nikolaus Schaller (2):
power: supply: bq27xxx: fix error return in case of no bq27000 hdq battery
power: supply: bq27xxx: restrict no-battery detection to bq27000
Hangbin Liu (2):
bonding: set random address only when slaves already exist
bonding: don't set oif to bond dev when getting NS target destination
Hans de Goede (1):
net: rfkill: gpio: Fix crash due to dereferencering uninitialized pointer
Herbert Xu (2):
crypto: af_alg - Disallow concurrent writes in af_alg_sendmsg
crypto: af_alg - Set merge to zero early in af_alg_sendmsg
Honggyu Kim (1):
samples/damon: change enable parameters to enabled
Huacai Chen (1):
LoongArch: Align ACPI structures if ARCH_STRICT_ALIGN enabled
Hugh Dickins (5):
mm/gup: check ref_count instead of lru before migration
mm: revert "mm/gup: clear the LRU flag of a page before adding to LRU batch" mm/gup: local lru_add_drain() to avoid lru_add_drain_all()
mm: revert "mm: vmscan.c: fix OOM on swap stress test"
mm: folio_may_be_lru_cached() unless folio_test_large()
Håkon Bugge (1):
rds: ib: Increment i_fastreg_wrs before bailing out
Ian Rogers (1):
perf maps: Ensure kmap is set up for all inserts
Ilya Maximets (1):
net: dst_metadata: fix IP_DF bit not extracted from tunnel headers
Ioana Ciornei (1):
dpaa2-switch: fix buffer pool seeding for control traffic
Ivan Lipski (1):
drm/amd/display: Allow RX6xxx & RX7700 to invoke amdgpu_irq_get/put
Ivan Vecera (1):
dpll: fix clock quality level reporting
Jacob Keller (1):
ice: fix Rx page leak on multi-buffer frames
Jakub Kicinski (1):
tls: make sure to abort the stream if headers are bogus
Jamie Bainbridge (1):
qed: Don't collect too many protection override GRC elements
Jedrzej Jagielski (2):
ixgbe: initialize aci.lock before it's used
ixgbe: destroy aci.lock later within ixgbe_remove path
Jens Axboe (2):
io_uring: include dying ring in task_work "should cancel" state io_uring/msg_ring: kill alloc_cache for io_kiocb allocations
Jianbo Liu (1):
net/mlx5e: Harden uplink netdev access against device unbind
Johannes Thumshirn (1):
btrfs: zoned: fix incorrect ASSERT in btrfs_zoned_reserve_data_reloc_bg()
Kamal Heib (1):
octeon_ep: Validate the VF ID
Kohei Enju (1):
igc: don't fail igc_probe() on LED setup error
Krzysztof Kozlowski (1):
ASoC: qcom: q6apm-lpass-dais: Fix NULL pointer dereference if source graph failed
Kuniyuki Iwashima (1):
tcp: Clear tcp_sk(sk)->fastopen_rsk in tcp_disconnect().
Lachlan Hodges (1):
wifi: mac80211: increase scan_ies_len for S1G
Lama Kayal (1):
net/mlx5e: Add a miss level for ipsec crypto offload
Li Tian (1):
net/mlx5: Not returning mlx5_link_info table when speed is unknown
Li Zhe (1):
gup: optimize longterm pin_user_pages() for large folio
Liao Yuanhong (1):
wifi: mac80211: fix incorrect type for ret
Loic Poulain (1):
drm: bridge: anx7625: Fix NULL pointer dereference with early IRQ
Maciej Fijalkowski (1):
i40e: remove redundant memory barrier when cleaning Tx descs
Maciej S. Szmigiero (1):
KVM: SVM: Sync TPR from LAPIC into VMCB::V_TPR even if AVIC is active
Maciej Strozek (1):
ASoC: SDCA: Add quirk for incorrect function types for 3 systems
Mario Limonciello (1):
drm/amd: Only restore cached manual clock settings in restore if OD enabled
Matthew Rosato (1):
iommu/s390: Fix memory corruption when using identity domain
Matthieu Baerts (NGI0) (7):
mptcp: set remote_deny_join_id0 on SYN recv
selftests: mptcp: userspace pm: validate deny-join-id0 flag
mptcp: tfo: record 'deny join id0' info
mptcp: propagate shutdown to subflows when possible
selftests: mptcp: connect: catch IO errors on listen side
selftests: mptcp: avoid spurious errors on TCP disconnect
mptcp: pm: nl: announce deny-join-id0 flag
Max Kellermann (1):
io_uring/io-wq: fix max_workers breakage and nr_workers underflow
Miaoqian Lin (1):
um: virtio_uml: Fix use-after-free after put_device in probe
Michal Wajdeczko (1):
drm/xe/pf: Drop rounddown_pow_of_two fair LMEM limitation
Mikulas Patocka (2):
dm-raid: don't set io_min and io_opt for raid1
dm-stripe: fix a possible integer overflow
Mohammad Rafi Shaik (2):
ASoC: qcom: audioreach: Fix lpaif_type configuration for the I2S interface
ASoC: qcom: q6apm-lpass-dais: Fix missing set_fmt DAI op for I2S
Namjae Jeon (1):
ksmbd: smbdirect: validate data_offset and data_length field of smb_direct_data_transfer
Nathan Chancellor (1):
nilfs2: fix CFI failure when accessing /sys/fs/nilfs2/features/*
Niklas Schnelle (1):
iommu/s390: Make attach succeed when the device was surprise removed
Paulo Alcantara (2):
smb: client: fix filename matching of deferred files
smb: client: fix file open check in __cifs_unlink()
Praful Adiga (1):
ALSA: hda/realtek: Fix mute led for HP Laptop 15-dw4xx
Qi Xi (1):
drm: bridge: cdns-mhdp8546: Fix missing mutex unlock on error path
Qu Wenruo (1):
btrfs: tree-checker: fix the incorrect inode ref size check
Remy D. Farley (1):
doc/netlink: Fix typos in operation attributes
Sathesh B Edara (1):
octeon_ep: fix VF MAC address lifecycle handling
SeongJae Park (3):
samples/damon/prcl: fix boot time enable crash samples/damon/mtier: avoid starting DAMON before initialization samples/damon/prcl: avoid starting DAMON before initialization
Sergey Senozhatsky (1):
zram: fix slot write race condition
Shuicheng Lin (1):
drm/xe/tile: Release kobject for the failure path
Stefan Metzmacher (10):
smb: server: let smb_direct_writev() respect SMB_DIRECT_MAX_SEND_SGES
ksmbd: smbdirect: verify remaining_data_length respects max_fragmented_recv_size
smb: smbdirect: introduce smbdirect_socket.recv_io.expected
smb: client: make use of smbdirect_socket->recv_io.expected
smb: smbdirect: introduce struct smbdirect_recv_io
smb: client: make use of struct smbdirect_recv_io
smb: client: let recv_done verify data_offset, data_length and remaining_data_length
smb: client: use disable[_delayed]_work_sync in smbdirect.c
smb: client: let smbd_destroy() call disable_work_sync(&info->post_send_credits_work)
smb: client: fix smbdirect_recv_io leak in smbd_negotiate() error path
Sébastien Szymanski (1):
gpiolib: acpi: initialize acpi_gpio_info struct
Takashi Iwai (1):
ALSA: usb: qcom: Fix false-positive address space check
Takashi Sakamoto (1):
ALSA: firewire-motu: drop EPOLLOUT from poll return values as write is not supported
Tao Cui (1):
LoongArch: Check the return value when creating kobj
Tariq Toukan (1):
Revert "net/mlx5e: Update and set Xon/Xoff upon port speed set"
Thomas Fourier (1):
mmc: mvsdio: Fix dma_unmap_sg() nents value
Tiezhu Yang (6):
LoongArch: Update help info of ARCH_STRICT_ALIGN objtool/LoongArch: Mark types based on break immediate code objtool/LoongArch: Mark special atomic instruction as INSN_BUG type
LoongArch: Fix unreliable stack for live patching
LoongArch: Make LTO case independent in Makefile
LoongArch: Handle jump tables options for RUST
Tiwei Bie (1):
um: Fix FD copy size in os_rcv_fd_msg()
Tom Lendacky (1):
x86/sev: Guard sev_evict_cache() with CONFIG_AMD_MEM_ENCRYPT
Vasant Hegde (2):
iommu/amd/pgtbl: Fix possible race while increase page table level iommu/amd: Fix alias device DTE setting
Venkata Prasad Potturu (1):
ASoC: amd: acp: Fix incorrect retrival of acp_chip_info
Yang Xiuwei (1):
io_uring: fix incorrect io_kiocb reference in io_link_skb
Yeounsu Moon (1):
net: natsemi: fix rx_dropped double accounting on netif_rx() failure
Yixun Lan (1):
dt-bindings: serial: 8250: spacemit: set clocks property as required
Zhen Ni (1):
iommu/amd: Fix ivrs_base memleak in early_amd_iommu_init()
austinchang (1):
btrfs: initialize inode::file_extent_tree after i_mode has been set
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/serial/8250.yaml +55 -22
@@ -48,6 +48,45 @@ allOf: oneOf: - required: [ clock-frequency ] - required: [ clocks ] + - if: + properties: + compatible: + contains: + const: nxp,lpc1850-uart + then: + properties: + clock-names: + items: + - const: uartclk + - const: reg + else: + properties: + clock-names: + items: + - const: core + - const: bus + - if: + properties: + compatible: + contains: + enum: + - spacemit,k1-uart + - nxp,lpc1850-uart + then: + required: + - clocks + - clock-names + properties: + clocks: + minItems: 2 + clock-names: + minItems: 2 + else: + properties: + clocks: + maxItems: 1 + clock-names: + maxItems: 1 properties: compatible:
@@ -142,9 +181,22 @@ properties: clock-names: minItems: 1 - items: - - const: core - - const: bus + maxItems: 2 + oneOf: + - items: + - const: core + - const: bus + - items: + - const: uartclk + - const: reg + + dmas: + minItems: 1 + maxItems: 4 + + dma-names: + minItems: 1 + maxItems: 4 resets: maxItems: 1
@@ -233,25 +285,6 @@ required: - reg - interrupts -if: - properties: - compatible: - contains: - const: spacemit,k1-uart -then: - required: [clock-names] - properties: - clocks: - minItems: 2 - clock-names: - minItems: 2 -else: - properties: - clocks: - maxItems: 1 - clock-names: - maxItems: 1 - unevaluatedProperties: false examples:
Documentation/netlink/specs/conntrack.yaml +4 -5
@@ -575,8 +575,8 @@ operations: - nat-dst - timeout - mark - - counter-orig - - counter-reply + - counters-orig + - counters-reply - use - id - nat-dst
@@ -591,7 +591,6 @@ operations: request: value: 0x101 attributes: - - nfgen-family - mark - filter - status
@@ -608,8 +607,8 @@ operations: - nat-dst - timeout - mark - - counter-orig - - counter-reply + - counters-orig + - counters-reply - use - id - nat-dst
Documentation/netlink/specs/mptcp_pm.yaml +2 -2
@@ -28,13 +28,13 @@ definitions: traffic-patterns it can take a long time until the MPTCP_EVENT_ESTABLISHED is sent. Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, - dport, server-side. + dport, server-side, [flags]. - name: established doc: >- A MPTCP connection is established (can start new subflows). Attributes: token, family, saddr4 | saddr6, daddr4 | daddr6, sport, - dport, server-side. + dport, server-side, [flags]. - name: closed doc: >-
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 16 -SUBLEVEL = 8 +SUBLEVEL = 9 EXTRAVERSION = NAME = Baby Opossum Posse
arch/loongarch/Kconfig +10 -2
@@ -301,6 +301,10 @@ config AS_HAS_LVZ_EXTENSION config CC_HAS_ANNOTATE_TABLEJUMP def_bool $(cc-option,-mannotate-tablejump) +config RUSTC_HAS_ANNOTATE_TABLEJUMP + depends on RUST + def_bool $(rustc-option,-Cllvm-args=--loongarch-annotate-tablejump) + menu "Kernel type and options" source "kernel/Kconfig.hz"
@@ -566,10 +570,14 @@ config ARCH_STRICT_ALIGN -mstrict-align build parameter to prevent unaligned accesses. CPUs with h/w unaligned access support: - Loongson-2K2000/2K3000/3A5000/3C5000/3D5000. + Loongson-2K2000/2K3000 and all of Loongson-3 series processors + based on LoongArch. CPUs without h/w unaligned access support: - Loongson-2K500/2K1000. + Loongson-2K0300/2K0500/2K1000. + + If you want to make sure whether to support unaligned memory access + on your hardware, please read the bit 20 (UAL) of CPUCFG1 register. 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
arch/loongarch/Makefile +10 -5
@@ -102,16 +102,21 @@ KBUILD_CFLAGS += $(call cc-option,-mthin-add-sub) $(call cc-option,-Wa$(comma) ifdef CONFIG_OBJTOOL ifdef CONFIG_CC_HAS_ANNOTATE_TABLEJUMP +KBUILD_CFLAGS += -mannotate-tablejump +else +KBUILD_CFLAGS += -fno-jump-tables # keep compatibility with older compilers +endif +ifdef CONFIG_RUSTC_HAS_ANNOTATE_TABLEJUMP +KBUILD_RUSTFLAGS += -Cllvm-args=--loongarch-annotate-tablejump +else +KBUILD_RUSTFLAGS += -Zno-jump-tables # keep compatibility with older compilers +endif +ifdef CONFIG_LTO_CLANG # The annotate-tablejump option can not be passed to LLVM backend when LTO is enabled. # Ensure it is aware of linker with LTO, '--loongarch-annotate-tablejump' also needs to # be passed via '-mllvm' to ld.lld. -KBUILD_CFLAGS += -mannotate-tablejump -ifdef CONFIG_LTO_CLANG KBUILD_LDFLAGS += -mllvm --loongarch-annotate-tablejump endif -else -KBUILD_CFLAGS += -fno-jump-tables # keep compatibility with older compilers -endif endif KBUILD_RUSTFLAGS += --target=loongarch64-unknown-none-softfloat -Ccode-model=small
arch/loongarch/include/asm/acenv.h +3 -4
@@ -10,9 +10,8 @@#ifndef _ASM_LOONGARCH_ACENV_H#define _ASM_LOONGARCH_ACENV_H -/* -* This header is required by ACPI core, but we have nothing to fill in -* right now. Will be updated later when needed. -*/ +#ifdef CONFIG_ARCH_STRICT_ALIGN +#define ACPI_MISALIGNMENT_NOT_SUPPORTED +#endif /* CONFIG_ARCH_STRICT_ALIGN */ #endif /* _ASM_LOONGARCH_ACENV_H */
arch/loongarch/include/asm/kvm_mmu.h +16 -4
@@ -16,6 +16,13 @@*/ #define KVM_MMU_CACHE_MIN_PAGES (CONFIG_PGTABLE_LEVELS - 1) +/* +* _PAGE_MODIFIED is a SW pte bit, it records page ever written on host +* kernel, on secondary MMU it records the page writeable attribute, in +* order for fast path handling. +*/ +#define KVM_PAGE_WRITEABLE _PAGE_MODIFIED +#define _KVM_FLUSH_PGTABLE 0x1#define _KVM_HAS_PGMASK 0x2#define kvm_pfn_pte (pfn, prot) (((pfn) << PFN_PTE_SHIFT) | pgprot_val(prot))
@@ -52,10 +59,10 @@ static inline void kvm_set_pte(kvm_pte_t *ptep, kvm_pte_t val)WRITE_ONCE (*ptep, val); } -static inline int kvm_pte_write (kvm_pte_t pte) {return pte & _PAGE_WRITE; } -static inline int kvm_pte_dirty (kvm_pte_t pte) {return pte & _PAGE_DIRTY; }static inline int kvm_pte_young (kvm_pte_t pte) {return pte & _PAGE_ACCESSED; }static inline int kvm_pte_huge (kvm_pte_t pte) {return pte & _PAGE_HUGE; } +static inline int kvm_pte_dirty (kvm_pte_t pte) {return pte & __WRITEABLE; } +static inline int kvm_pte_writeable (kvm_pte_t pte) {return pte &KVM_PAGE_WRITEABLE ; }static inline kvm_pte_t kvm_pte_mkyoung (kvm_pte_t pte) {
@@ -69,12 +76,12 @@ static inline kvm_pte_t kvm_pte_mkold(kvm_pte_t pte)static inline kvm_pte_t kvm_pte_mkdirty (kvm_pte_t pte) { -return pte | _PAGE_DIRTY; +return pte | __WRITEABLE; }static inline kvm_pte_t kvm_pte_mkclean (kvm_pte_t pte) { -return pte & ~_PAGE_DIRTY; +return pte & ~__WRITEABLE; }static inline kvm_pte_t kvm_pte_mkhuge (kvm_pte_t pte)
@@ -87,6 +94,11 @@ static inline kvm_pte_t kvm_pte_mksmall(kvm_pte_t pte)return pte & ~_PAGE_HUGE; } +static inline kvm_pte_t kvm_pte_mkwriteable (kvm_pte_t pte) +{ +return pte |KVM_PAGE_WRITEABLE ; +} +static inline int kvm_need_flush (kvm_ptw_ctx *ctx) {return ctx->flag & _KVM_FLUSH_PGTABLE;
arch/loongarch/kernel/env.c +2 -0
@@ -109,6 +109,8 @@ static int __init boardinfo_init(void)struct kobject *loongson_kobj; loongson_kobj =kobject_create_and_add ("loongson" , firmware_kobj); +if (!loongson_kobj) +return -ENOMEM ;return sysfs_create_file (loongson_kobj, &boardinfo_attr.attr); }
arch/loongarch/kernel/stacktrace.c +2 -1
@@ -51,12 +51,13 @@ int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry,if (task == current) { regs->regs[3 ] = (unsigned long )__builtin_frame_address (0 ); regs->csr_era = (unsigned long )__builtin_return_address (0 ); + regs->regs[22 ] =0 ; }else { regs->regs[3 ] =thread_saved_fp (task); regs->csr_era =thread_saved_ra (task); + regs->regs[22 ] = task->thread.reg22; } regs->regs[1 ] =0 ; - regs->regs[22 ] =0 ;for (unwind_start (&state, task, regs); !unwind_done (&state) && !unwind_error (&state);unwind_next_frame (&state)) {
arch/loongarch/kernel/vdso.c +3 -0
@@ -54,6 +54,9 @@ static int __init init_vdso(void) vdso_info.code_mapping.pages =kcalloc (vdso_info.size /PAGE_SIZE ,sizeof (struct page *),GFP_KERNEL ); +if (!vdso_info.code_mapping.pages) +return -ENOMEM ; + pfn =__phys_to_pfn (__pa_symbol (vdso_info.vdso));for (i =0 ; i < vdso_info.size /PAGE_SIZE ; i++) vdso_info.code_mapping.pages[i] =pfn_to_page (pfn + i);
arch/loongarch/kvm/intc/eiointc.c +53 -34
162 lines not on this page · raw message
arch/loongarch/kvm/intc/pch_pic.c +14 -7
@@ -348,6 +348,7 @@ static int kvm_pch_pic_regs_access(struct kvm_device *dev,struct kvm_device_attr *attr, bool is_write) { + char buf[8];int addr, offset, len =8 , ret =0 ;void __user *data;void *p =NULL ;
@@ -397,17 +398,23 @@ static int kvm_pch_pic_regs_access(struct kvm_device *dev,return -EINVAL ; } -spin_lock (&s->lock); -/* write or read value according to is_write */ if (is_write) { -if (copy_from_user (p, data, len)) - ret = -EFAULT ; - }else { -if (copy_to_user (data, p, len)) - ret = -EFAULT ; +if (copy_from_user (buf, data, len)) +return -EFAULT ; } + +spin_lock (&s->lock); +if (is_write) +memcpy (p, buf, len); +else +memcpy (buf, p, len);spin_unlock (&s->lock); +if (!is_write) { +if (copy_to_user (data, buf, len)) +return -EFAULT ; + } +return ret; }
arch/loongarch/kvm/mmu.c +4 -4
@@ -569,7 +569,7 @@ static int kvm_map_page_fast(struct kvm_vcpu *vcpu, unsigned long gpa, bool writ/* Track access to pages marked old */ new =kvm_pte_mkyoung (*ptep);if (write && !kvm_pte_dirty (new)) { -if (!kvm_pte_write (new)) { +if (!kvm_pte_writeable (new)) { ret = -EFAULT ; goto out; }
@@ -856,9 +856,9 @@ static int kvm_map_page(struct kvm_vcpu *vcpu, unsigned long gpa, bool write) prot_bits |= _CACHE_SUC;if (writeable) { - prot_bits |= _PAGE_WRITE; + prot_bits =kvm_pte_mkwriteable (prot_bits);if (write) - prot_bits |= __WRITEABLE; + prot_bits =kvm_pte_mkdirty (prot_bits); }/* Disable dirty logging on HugePages */
@@ -904,7 +904,7 @@ static int kvm_map_page(struct kvm_vcpu *vcpu, unsigned long gpa, bool write)kvm_release_faultin_page (kvm, page, false, writeable);spin_unlock (&kvm->mmu_lock); -if (prot_bits & _PAGE_DIRTY) +if (kvm_pte_dirty (prot_bits))mark_page_dirty_in_slot (kvm, memslot, gfn); out:
arch/s390/include/asm/pci_insn.h +5 -5
@@ -16,11 +16,11 @@#define ZPCI_PCI_ST_FUNC_NOT_AVAIL 40#define ZPCI_PCI_ST_ALREADY_IN_RQ_STATE 44 -/* Load/Store return codes */ -#define ZPCI_PCI_LS_OK 0 -#define ZPCI_PCI_LS_ERR 1 -#define ZPCI_PCI_LS_BUSY 2 -#define ZPCI_PCI_LS_INVAL_HANDLE 3 +/* PCI instruction condition codes */ +#define ZPCI_CC_OK 0 +#define ZPCI_CC_ERR 1 +#define ZPCI_CC_BUSY 2 +#define ZPCI_CC_INVAL_HANDLE 3/* Load/Store address space identifiers */ #define ZPCI_PCIAS_MEMIO_0 0
arch/um/drivers/virtio_uml.c +4 -2
@@ -1250,10 +1250,12 @@ static int virtio_uml_probe(struct platform_device *pdev)device_set_wakeup_capable (&vu_dev->vdev.dev, true); rc =register_virtio_device (&vu_dev->vdev); -if (rc) +if (rc) {put_device (&vu_dev->vdev.dev); +return rc; + } vu_dev->registered =1 ; -return rc; +return 0 ; error_init:os_close_file (vu_dev->sock);
arch/um/os-Linux/file.c +1 -1
@@ -535,7 +535,7 @@ ssize_t os_rcv_fd_msg(int fd, int *fds, unsigned int n_fds, cmsg->cmsg_type != SCM_RIGHTS)return n; -memcpy (fds,CMSG_DATA (cmsg), cmsg->cmsg_len); +memcpy (fds,CMSG_DATA (cmsg), cmsg->cmsg_len -CMSG_LEN (0 ));return n; }
arch/x86/include/asm/sev.h +19 -19
@@ -564,6 +564,24 @@ enum es_result sev_es_ghcb_hv_call(struct ghcb *ghcb,extern struct ghcb *boot_ghcb; +static inline void sev_evict_cache (void *va,int npages) +{ +volatile u8 val__always_unused ; +u8 *bytes = va; +int page_idx; + +/* +* For SEV guests, a read from the first/last cache-lines of a 4K page +* using the guest key is sufficient to cause a flush of all cache-lines +* associated with that 4K page without incurring all the overhead of a +* full CLFLUSH sequence. +*/ +for (page_idx =0 ; page_idx < npages; page_idx++) { + val = bytes[page_idx *PAGE_SIZE ]; + val = bytes[page_idx *PAGE_SIZE +PAGE_SIZE -1 ]; + } +} +#else /* !CONFIG_AMD_MEM_ENCRYPT */ #define snp_vmpl 0
@@ -607,6 +625,7 @@ static inline int snp_send_guest_request(struct snp_msg_desc *mdesc, struct snp_static inline int snp_svsm_vtpm_send_command (u8 *buffer) {return -ENODEV ; }static inline void __init snp_secure_tsc_prepare (void ) { }static inline void __init snp_secure_tsc_init (void ) { } +static inline void sev_evict_cache (void *va,int npages) {}#endif /* CONFIG_AMD_MEM_ENCRYPT */
@@ -621,24 +640,6 @@ int rmp_make_shared(u64 pfn, enum pg_level level);void snp_leak_pages (u64 pfn,unsigned int npages);void kdump_sev_callback (void );void snp_fixup_e820_tables (void ); - -static inline void sev_evict_cache (void *va,int npages) -{ -volatile u8 val__always_unused ; -u8 *bytes = va; -int page_idx; - -/* -* For SEV guests, a read from the first/last cache-lines of a 4K page -* using the guest key is sufficient to cause a flush of all cache-lines -* associated with that 4K page without incurring all the overhead of a -* full CLFLUSH sequence. -*/ -for (page_idx =0 ; page_idx < npages; page_idx++) { - val = bytes[page_idx *PAGE_SIZE ]; - val = bytes[page_idx *PAGE_SIZE +PAGE_SIZE -1 ]; - } -}#else static inline bool snp_probe_rmptable_info (void ) {return false; }static inline int snp_rmptable_init (void ) {return -ENOSYS ; }
@@ -654,7 +655,6 @@ static inline int rmp_make_shared(u64 pfn, enum pg_level level) { return -ENODEVstatic inline void snp_leak_pages (u64 pfn,unsigned int npages) {}static inline void kdump_sev_callback (void ) { }static inline void snp_fixup_e820_tables (void ) {} -static inline void sev_evict_cache (void *va,int npages) {}#endif #endif
arch/x86/kvm/svm/svm.c +1 -2
@@ -4204,8 +4204,7 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu)struct vcpu_svm *svm =to_svm (vcpu);u64 cr8; -if (nested_svm_virtualize_tpr (vcpu) || -kvm_vcpu_apicv_active (vcpu)) +if (nested_svm_virtualize_tpr (vcpu))return ; cr8 =kvm_get_cr8 (vcpu);
crypto/af_alg.c +9 -1
@@ -970,6 +970,12 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, }lock_sock (sk); +if (ctx->write) { +release_sock (sk); +return -EBUSY ; + } + ctx->write = true; +if (ctx->init && !ctx->more) {if (ctx->used) { err = -EINVAL ;
@@ -1019,6 +1025,8 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,continue ; } + ctx->merge =0 ; +if (!af_alg_writable (sk)) { err =af_alg_wait_for_wmem (sk, msg->msg_flags);if (err)
@@ -1058,7 +1066,6 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, ctx->used += plen; copied += plen; size -= plen; - ctx->merge =0 ; }else { do { struct page *pg;
@@ -1104,6 +1111,7 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size, unlock:af_alg_data_wakeup (sk); + ctx->write = false;release_sock (sk);return copied ?: err;
drivers/block/zram/zram_drv.c +3 -5
@@ -1794,6 +1794,7 @@ static int write_same_filled_page(struct zram *zram, unsigned long fill, u32 index) {zram_slot_lock (zram, index); +zram_free_page (zram, index);zram_set_flag (zram, index,ZRAM_SAME );zram_set_handle (zram, index, fill);zram_slot_unlock (zram, index);
@@ -1831,6 +1832,7 @@ static int write_incompressible_page(struct zram *zram, struct page *page,kunmap_local (src);zram_slot_lock (zram, index); +zram_free_page (zram, index);zram_set_flag (zram, index,ZRAM_HUGE );zram_set_handle (zram, index, handle);zram_set_obj_size (zram, index,PAGE_SIZE );
@@ -1854,11 +1856,6 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index)unsigned long element;bool same_filled; -/* First, free memory allocated to this slot (if any) */ -zram_slot_lock (zram, index); -zram_free_page (zram, index); -zram_slot_unlock (zram, index); - mem =kmap_local_page (page); same_filled =page_same_filled (mem, &element);kunmap_local (mem);
@@ -1900,6 +1897,7 @@ static int zram_write_page(struct zram *zram, struct page *page, u32 index)zcomp_stream_put (zstrm);zram_slot_lock (zram, index); +zram_free_page (zram, index);zram_set_handle (zram, index, handle);zram_set_obj_size (zram, index, comp_len);zram_slot_unlock (zram, index);
drivers/clk/sunxi-ng/ccu_mp.c +1 -1
@@ -185,7 +185,7 @@ static unsigned long ccu_mp_recalc_rate(struct clk_hw *hw, p &= (1 << cmp->p.width) -1 ;if (cmp->common.features &CCU_FEATURE_DUAL_DIV ) - rate = (parent_rate / p) / m; + rate = (parent_rate / (p + cmp->p.offset)) / m;else rate = (parent_rate >> p) / m;
drivers/crypto/ccp/sev-dev.c +1 -1
@@ -2430,7 +2430,7 @@ static void __sev_firmware_shutdown(struct sev_device *sev, bool panic) {int error; -__sev_platform_shutdown_locked (NULL ); +__sev_platform_shutdown_locked (&error);if (sev_es_tmr) {/*
drivers/dpll/dpll_netlink.c +2 -2
@@ -173,8 +173,8 @@ static int dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll, struct netlink_ext_ack *extack) { + DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX + 1) = { 0 };const struct dpll_device_ops *ops =dpll_device_ops (dpll); - DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 };enum dpll_clock_quality_level ql;int ret;
@@ -183,7 +183,7 @@ dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll, ret = ops->clock_quality_level_get (dpll,dpll_priv (dpll), qls, extack);if (ret)return ret; -for_each_set_bit (ql, qls,DPLL_CLOCK_QUALITY_LEVEL_MAX ) +for_each_set_bit (ql, qls,DPLL_CLOCK_QUALITY_LEVEL_MAX +1 )if (nla_put_u32 (msg,DPLL_A_CLOCK_QUALITY_LEVEL , ql))return -EMSGSIZE ;
drivers/gpio/gpiolib-acpi-core.c +2 -2
@@ -942,7 +942,7 @@ struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode, {struct acpi_device *adev =to_acpi_device_node (fwnode);bool can_fallback =acpi_can_fallback_to_crs (adev, con_id); -struct acpi_gpio_info info; +struct acpi_gpio_info info = {};struct gpio_desc *desc; desc =__acpi_find_gpio (fwnode, con_id, idx, can_fallback, &info);
@@ -992,7 +992,7 @@ int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id,int ret;for (i =0 , idx =0 ; idx <= index; i++) { -struct acpi_gpio_info info; +struct acpi_gpio_info info = {};struct gpio_desc *desc;/* Ignore -EPROBE_DEFER, it only matters if idx matches */
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +12 -4
@@ -250,16 +250,24 @@ void amdgpu_amdkfd_interrupt(struct amdgpu_device *adev,void amdgpu_amdkfd_suspend (struct amdgpu_device *adev,bool suspend_proc) { -if (adev->kfd.dev) -kgd2kfd_suspend (adev->kfd.dev, suspend_proc); +if (adev->kfd.dev) { +if (adev->in_s0ix) +kgd2kfd_stop_sched_all_nodes (adev->kfd.dev); +else +kgd2kfd_suspend (adev->kfd.dev, suspend_proc); + } }int amdgpu_amdkfd_resume (struct amdgpu_device *adev,bool resume_proc) {int r =0 ; -if (adev->kfd.dev) - r =kgd2kfd_resume (adev->kfd.dev, resume_proc); +if (adev->kfd.dev) { +if (adev->in_s0ix) + r =kgd2kfd_start_sched_all_nodes (adev->kfd.dev); +else + r =kgd2kfd_resume (adev->kfd.dev, resume_proc); + }return r; }
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +12 -0
@@ -426,7 +426,9 @@ void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask);int kgd2kfd_check_and_lock_kfd (void );void kgd2kfd_unlock_kfd (void );int kgd2kfd_start_sched (struct kfd_dev *kfd,uint32_t node_id); +int kgd2kfd_start_sched_all_nodes (struct kfd_dev *kfd);int kgd2kfd_stop_sched (struct kfd_dev *kfd,uint32_t node_id); +int kgd2kfd_stop_sched_all_nodes (struct kfd_dev *kfd);bool kgd2kfd_compute_active (struct kfd_dev *kfd,uint32_t node_id);bool kgd2kfd_vmfault_fast_path (struct amdgpu_device *adev,struct amdgpu_iv_entry *entry,bool retry_fault);
@@ -516,11 +518,21 @@ static inline int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id)return 0 ; } +static inline int kgd2kfd_start_sched_all_nodes (struct kfd_dev *kfd) +{ +return 0 ; +} +static inline int kgd2kfd_stop_sched (struct kfd_dev *kfd,uint32_t node_id) {return 0 ; } +static inline int kgd2kfd_stop_sched_all_nodes (struct kfd_dev *kfd) +{ +return 0 ; +} +static inline bool kgd2kfd_compute_active (struct kfd_dev *kfd,uint32_t node_id) {return false;
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +10 -14
@@ -5055,7 +5055,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool notify_clients) adev->in_suspend = true;if (amdgpu_sriov_vf (adev)) { -if (!adev->in_s0ix && !adev->in_runpm) +if (!adev->in_runpm)amdgpu_amdkfd_suspend_process (adev);amdgpu_virt_fini_data_exchange (adev); r =amdgpu_virt_request_full_gpu (adev, false);
@@ -5075,10 +5075,8 @@ int amdgpu_device_suspend(struct drm_device *dev, bool notify_clients)amdgpu_device_ip_suspend_phase1 (adev); -if (!adev->in_s0ix) { -amdgpu_amdkfd_suspend (adev, !amdgpu_sriov_vf (adev) && !adev->in_runpm); -amdgpu_userq_suspend (adev); - } +amdgpu_amdkfd_suspend (adev, !amdgpu_sriov_vf (adev) && !adev->in_runpm); +amdgpu_userq_suspend (adev); r =amdgpu_device_evict_resources (adev);if (r)
@@ -5141,15 +5139,13 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients) goto exit; } -if (!adev->in_s0ix) { - r =amdgpu_amdkfd_resume (adev, !amdgpu_sriov_vf (adev) && !adev->in_runpm); -if (r) - goto exit; + r =amdgpu_amdkfd_resume (adev, !amdgpu_sriov_vf (adev) && !adev->in_runpm); +if (r) + goto exit; - r =amdgpu_userq_resume (adev); -if (r) - goto exit; - } + r =amdgpu_userq_resume (adev); +if (r) + goto exit; r =amdgpu_device_ip_late_init (adev);if (r)
@@ -5162,7 +5158,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool notify_clients)amdgpu_virt_init_data_exchange (adev);amdgpu_virt_release_full_gpu (adev, true); -if (!adev->in_s0ix && !r && !adev->in_runpm) +if (!r && !adev->in_runpm) r =amdgpu_amdkfd_resume_process (adev); }
drivers/gpu/drm/amd/amdkfd/kfd_device.c +36 -0
@@ -1501,6 +1501,25 @@ int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id)return ret; } +int kgd2kfd_start_sched_all_nodes (struct kfd_dev *kfd) +{ +struct kfd_node *node; +int i, r; + +if (!kfd->init_complete) +return 0 ; + +for (i =0 ; i < kfd->num_nodes; i++) { + node = kfd->nodes[i]; + r = node->dqm->ops.unhalt (node->dqm); +if (r) { +dev_err (kfd_device,"Error in starting scheduler\n" ); +return r; + } + } +return 0 ; +} +int kgd2kfd_stop_sched (struct kfd_dev *kfd,uint32_t node_id) {struct kfd_node *node;
@@ -1518,6 +1537,23 @@ int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)return node->dqm->ops.halt (node->dqm); } +int kgd2kfd_stop_sched_all_nodes (struct kfd_dev *kfd) +{ +struct kfd_node *node; +int i, r; + +if (!kfd->init_complete) +return 0 ; + +for (i =0 ; i < kfd->num_nodes; i++) { + node = kfd->nodes[i]; + r = node->dqm->ops.halt (node->dqm); +if (r) +return r; + } +return 0 ; +} +bool kgd2kfd_compute_active (struct kfd_dev *kfd,uint32_t node_id) {struct kfd_node *node;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +38 -1
@@ -8689,7 +8689,16 @@ static int amdgpu_dm_encoder_init(struct drm_device *dev,static void manage_dm_interrupts (struct amdgpu_device *adev,struct amdgpu_crtc *acrtc,struct dm_crtc_state *acrtc_state) -{ +{/* +* We cannot be sure that the frontend index maps to the same +* backend index - some even map to more than one. +* So we have to go through the CRTC to find the right IRQ. +*/ +int irq_type =amdgpu_display_crtc_idx_to_irq_type ( + adev, + acrtc->crtc_id); +struct drm_device *dev =adev_to_drm (adev); +struct drm_vblank_crtc_config config = {0 };struct dc_crtc_timing *timing;int offdelay;
@@ -8742,7 +8751,35 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,drm_crtc_vblank_on_config (&acrtc->base, &config); +/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_get.*/ +switch (amdgpu_ip_version (adev,DCE_HWIP ,0 )) { +case IP_VERSION (3 ,0 ,0 ): +case IP_VERSION (3 ,0 ,2 ): +case IP_VERSION (3 ,0 ,3 ): +case IP_VERSION (3 ,2 ,0 ): +if (amdgpu_irq_get (adev, &adev->pageflip_irq, irq_type)) +drm_err (dev,"DM_IRQ: Cannot get pageflip irq!\n" ); +#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY ) +if (amdgpu_irq_get (adev, &adev->vline0_irq, irq_type)) +drm_err (dev,"DM_IRQ: Cannot get vline0 irq!\n" ); +#endif + } + }else { +/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_put.*/ +switch (amdgpu_ip_version (adev,DCE_HWIP ,0 )) { +case IP_VERSION (3 ,0 ,0 ): +case IP_VERSION (3 ,0 ,2 ): +case IP_VERSION (3 ,0 ,3 ): +case IP_VERSION (3 ,2 ,0 ): +#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY ) +if (amdgpu_irq_put (adev, &adev->vline0_irq, irq_type)) +drm_err (dev,"DM_IRQ: Cannot put vline0 irq!\n" ); +#endif +if (amdgpu_irq_put (adev, &adev->pageflip_irq, irq_type)) +drm_err (dev,"DM_IRQ: Cannot put pageflip irq!\n" ); + } +drm_crtc_vblank_off (&acrtc->base); } }
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c +1 -1
@@ -2185,7 +2185,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)return ret; } -if (smu_dpm_ctx->dpm_level ==AMD_DPM_FORCED_LEVEL_MANUAL ) { +if (smu_dpm_ctx->dpm_level ==AMD_DPM_FORCED_LEVEL_MANUAL && smu->od_enabled) { ret =smu_od_edit_dpm_table (smu,PP_OD_COMMIT_DPM_TABLE ,NULL ,0 );if (ret)return ret;
drivers/gpu/drm/bridge/analogix/anx7625.c +4 -2
@@ -2678,7 +2678,7 @@ static int anx7625_i2c_probe(struct i2c_client *client) ret =devm_request_threaded_irq (dev, platform->pdata.intp_irq,NULL , anx7625_intr_hpd_isr,IRQF_TRIGGER_FALLING | -IRQF_ONESHOT , +IRQF_ONESHOT |IRQF_NO_AUTOEN ,"anx7625-intp" , platform);if (ret) {DRM_DEV_ERROR (dev,"fail to request irq\n" );
@@ -2747,8 +2747,10 @@ static int anx7625_i2c_probe(struct i2c_client *client) }/* Add work function */ -if (platform->pdata.intp_irq) +if (platform->pdata.intp_irq) { +enable_irq (platform->pdata.intp_irq);queue_work (platform->workqueue, &platform->work); + }if (platform->pdata.audio_en)anx7625_register_audio (dev, platform);
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +4 -2
@@ -1984,8 +1984,10 @@ static void cdns_mhdp_atomic_enable(struct drm_bridge *bridge, mhdp_state =to_cdns_mhdp_bridge_state (new_state); mhdp_state->current_mode =drm_mode_duplicate (bridge->dev, mode); -if (!mhdp_state->current_mode) -return ; +if (!mhdp_state->current_mode) { + ret = -EINVAL ; + goto out; + }drm_mode_set_name (mhdp_state->current_mode);
drivers/gpu/drm/xe/abi/guc_actions_abi.h +5 -0
@@ -117,6 +117,7 @@ enum xe_guc_action {XE_GUC_ACTION_ENTER_S_STATE =0x501 ,XE_GUC_ACTION_EXIT_S_STATE =0x502 ,XE_GUC_ACTION_GLOBAL_SCHED_POLICY_CHANGE =0x506 , +XE_GUC_ACTION_UPDATE_SCHEDULING_POLICIES_KLV =0x509 ,XE_GUC_ACTION_SCHED_CONTEXT =0x1000 ,XE_GUC_ACTION_SCHED_CONTEXT_MODE_SET =0x1001 , XE_GUC_ACTION_SCHED_CONTEXT_MODE_DONE = 0x1002,
@@ -142,6 +143,7 @@ enum xe_guc_action {XE_GUC_ACTION_SET_ENG_UTIL_BUFF =0x550A ,XE_GUC_ACTION_SET_DEVICE_ENGINE_ACTIVITY_BUFFER =0x550C ,XE_GUC_ACTION_SET_FUNCTION_ENGINE_ACTIVITY_BUFFER =0x550D , +XE_GUC_ACTION_OPT_IN_FEATURE_KLV =0x550E ,XE_GUC_ACTION_NOTIFY_MEMORY_CAT_ERROR =0x6000 ,XE_GUC_ACTION_REPORT_PAGE_FAULT_REQ_DESC =0x6002 , XE_GUC_ACTION_PAGE_FAULT_RES_DESC = 0x6003,
@@ -240,4 +242,7 @@ enum xe_guc_g2g_type {#define XE_G2G_DEREGISTER_TILE REG_GENMASK(15, 12)#define XE_G2G_DEREGISTER_TYPE REG_GENMASK(11, 8) +/* invalid type for XE_GUC_ACTION_NOTIFY_MEMORY_CAT_ERROR */ +#define XE_GUC_CAT_ERR_TYPE_INVALID 0xdeadbeef +#endif
drivers/gpu/drm/xe/abi/guc_klvs_abi.h +40 -0
@@ -16,6 +16,8 @@* +===+=======+==============================================================+ * | 0 | 31:16 | **KEY** - KLV key identifier | * | | | - `GuC Self Config KLVs`_ | +* | | | - `GuC Opt In Feature KLVs`_ | +* | | | - `GuC Scheduling Policies KLVs`_ | * | | | - `GuC VGT Policy KLVs`_ | * | | | - `GuC VF Configuration KLVs`_ | * | | | |
@@ -124,6 +126,44 @@ enum { GUC_CONTEXT_POLICIES_KLV_NUM_IDS = 5, }; +/** +* DOC: GuC Opt In Feature KLVs +* +* `GuC KLV`_ keys available for use with OPT_IN_FEATURE_KLV +* +* _`GUC_KLV_OPT_IN_FEATURE_EXT_CAT_ERR_TYPE` : 0x4001 +* Adds an extra dword to the XE_GUC_ACTION_NOTIFY_MEMORY_CAT_ERROR G2H +* containing the type of the CAT error. On HW that does not support +* reporting the CAT error type, the extra dword is set to 0xdeadbeef. +*/ + +#define GUC_KLV_OPT_IN_FEATURE_EXT_CAT_ERR_TYPE_KEY 0x4001 +#define GUC_KLV_OPT_IN_FEATURE_EXT_CAT_ERR_TYPE_LEN 0u + +/** +* DOC: GuC Scheduling Policies KLVs +* +* `GuC KLV`_ keys available for use with UPDATE_SCHEDULING_POLICIES_KLV. +* +* _`GUC_KLV_SCHEDULING_POLICIES_RENDER_COMPUTE_YIELD` : 0x1001 +* Some platforms do not allow concurrent execution of RCS and CCS +* workloads from different address spaces. By default, the GuC prioritizes +* RCS submissions over CCS ones, which can lead to CCS workloads being +* significantly (or completely) starved of execution time. This KLV allows +* the driver to specify a quantum (in ms) and a ratio (percentage value +* between 0 and 100), and the GuC will prioritize the CCS for that +* percentage of each quantum. For example, specifying 100ms and 30% will +* make the GuC prioritize the CCS for 30ms of every 100ms. +* Note that this does not necessarly mean that RCS and CCS engines will +* only be active for their percentage of the quantum, as the restriction +* only kicks in if both classes are fully busy with non-compatible address +* spaces; i.e., if one engine is idle or running the same address space, +* a pending job on the other engine will still be submitted to the HW no +* matter what the ratio is +*/ +#define GUC_KLV_SCHEDULING_POLICIES_RENDER_COMPUTE_YIELD_KEY 0x1001 +#define GUC_KLV_SCHEDULING_POLICIES_RENDER_COMPUTE_YIELD_LEN 2u +/** * DOC: GuC VGT Policy KLVs *
drivers/gpu/drm/xe/xe_exec_queue.c +15 -7
@@ -151,6 +151,16 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)return err; } +static void __xe_exec_queue_fini (struct xe_exec_queue *q) +{ +int i; + + q->ops->fini (q); + +for (i =0 ; i < q->width; ++i) +xe_lrc_put (q->lrc[i]); +} + struct xe_exec_queue *xe_exec_queue_create(struct xe_device *xe, struct xe_vm *vm, u32 logical_mask, u16 width, struct xe_hw_engine *hwe, u32 flags,
@@ -181,11 +191,13 @@ struct xe_exec_queue *xe_exec_queue_create(struct xe_device *xe, struct xe_vm *vif (xe_exec_queue_uses_pxp (q)) { err =xe_pxp_exec_queue_add (xe->pxp, q);if (err) - goto err_post_alloc; + goto err_post_init; }return q; +err_post_init: +__xe_exec_queue_fini (q); err_post_alloc:__xe_exec_queue_free (q);return ERR_PTR (err);
@@ -283,13 +295,11 @@ void xe_exec_queue_destroy(struct kref *ref)xe_exec_queue_put (eq); } - q->ops->fini (q); + q->ops->destroy (q); }void xe_exec_queue_fini (struct xe_exec_queue *q) { -int i; -/* * Before releasing our ref to lrc and xef, accumulate our run ticks * and wakeup any waiters.
@@ -298,9 +308,7 @@ void xe_exec_queue_fini(struct xe_exec_queue *q)if (q->xef &&atomic_dec_and_test (&q->xef->exec_queue.pending_removal))wake_up_var (&q->xef->exec_queue.pending_removal); -for (i =0 ; i < q->width; ++i) -xe_lrc_put (q->lrc[i]); - +__xe_exec_queue_fini (q);__xe_exec_queue_free (q); }
drivers/gpu/drm/xe/xe_exec_queue_types.h +7 -1
@@ -166,8 +166,14 @@ struct xe_exec_queue_ops {int (*init)(struct xe_exec_queue *q);/** @kill: Kill inflight submissions for backend */ void (*kill)(struct xe_exec_queue *q); -/** @fini: Fini exec queue for submission backend */ +/** @fini: Undoes the init() for submission backend */ void (*fini)(struct xe_exec_queue *q); +/** +* @destroy: Destroy exec queue for submission backend. The backend +* function must call xe_exec_queue_fini() (which will in turn call the +* fini() backend function) to ensure the queue is properly cleaned up. +*/ +void (*destroy)(struct xe_exec_queue *q);/** @set_priority: Set priority for exec queue */ int (*set_priority)(struct xe_exec_queue *q,enum xe_exec_queue_priority priority);
drivers/gpu/drm/xe/xe_execlist.c +16 -9
@@ -385,10 +385,20 @@ static int execlist_exec_queue_init(struct xe_exec_queue *q)return err; } -static void execlist_exec_queue_fini_async (struct work_struct *w) +static void execlist_exec_queue_fini (struct xe_exec_queue *q) +{ +struct xe_execlist_exec_queue *exl = q->execlist; + +drm_sched_entity_fini (&exl->entity); +drm_sched_fini (&exl->sched); + +kfree (exl); +} + +static void execlist_exec_queue_destroy_async (struct work_struct *w) {struct xe_execlist_exec_queue *ee = - container_of(w, struct xe_execlist_exec_queue, fini_async); + container_of(w, struct xe_execlist_exec_queue, destroy_async);struct xe_exec_queue *q = ee->q;struct xe_execlist_exec_queue *exl = q->execlist;struct xe_device *xe =gt_to_xe (q->gt);
@@ -401,10 +411,6 @@ static void execlist_exec_queue_fini_async(struct work_struct *w)list_del (&exl->active_link);spin_unlock_irqrestore (&exl->port->lock, flags); -drm_sched_entity_fini (&exl->entity); -drm_sched_fini (&exl->sched); -kfree (exl); -xe_exec_queue_fini (q); }
@@ -413,10 +419,10 @@ static void execlist_exec_queue_kill(struct xe_exec_queue *q)/* NIY */ } -static void execlist_exec_queue_fini (struct xe_exec_queue *q) +static void execlist_exec_queue_destroy (struct xe_exec_queue *q) { -INIT_WORK (&q->execlist->fini_async, execlist_exec_queue_fini_async); -queue_work (system_unbound_wq, &q->execlist->fini_async); +INIT_WORK (&q->execlist->destroy_async, execlist_exec_queue_destroy_async); +queue_work (system_unbound_wq, &q->execlist->destroy_async); } static int execlist_exec_queue_set_priority(struct xe_exec_queue *q,
@@ -467,6 +473,7 @@ static const struct xe_exec_queue_ops execlist_exec_queue_ops = { .init = execlist_exec_queue_init, .kill = execlist_exec_queue_kill, .fini = execlist_exec_queue_fini, + .destroy = execlist_exec_queue_destroy, .set_priority = execlist_exec_queue_set_priority, .set_timeslice = execlist_exec_queue_set_timeslice, .set_preempt_timeout = execlist_exec_queue_set_preempt_timeout,
drivers/gpu/drm/xe/xe_execlist_types.h +1 -1
@@ -42,7 +42,7 @@ struct xe_execlist_exec_queue {bool has_run; -struct work_struct fini_async; +struct work_struct destroy_async;enum xe_exec_queue_priority active_priority;struct list_head active_link;
drivers/gpu/drm/xe/xe_gt.c +2 -1
@@ -41,6 +41,7 @@#include "xe_gt_topology.h" #include "xe_guc_exec_queue_types.h" #include "xe_guc_pc.h" +#include "xe_guc_submit.h" #include "xe_hw_fence.h" #include "xe_hw_engine_class_sysfs.h" #include "xe_irq.h"
@@ -97,7 +98,7 @@ void xe_gt_sanitize(struct xe_gt *gt)* FIXME: if xe_uc_sanitize is called here, on TGL driver will not * reload */ - gt->uc.guc.submission_state.enabled = false; +xe_guc_submit_disable (>->uc.guc); }static void xe_gt_enable_host_l2_vram (struct xe_gt *gt)
drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c +0 -1
@@ -1600,7 +1600,6 @@ static u64 pf_estimate_fair_lmem(struct xe_gt *gt, unsigned int num_vfs)u64 fair; fair =div_u64 (available, num_vfs); - fair =rounddown_pow_of_two (fair);/* XXX: ttm_vram_mgr & drm_buddy limitation */ fair =ALIGN_DOWN (fair, alignment);#ifdef MAX_FAIR_LMEM fair =min_t (u64,MAX_FAIR_LMEM , fair);
drivers/gpu/drm/xe/xe_guc.c +58 -4
92 lines not on this page · raw message
drivers/gpu/drm/xe/xe_guc.h +1 -0
@@ -33,6 +33,7 @@ int xe_guc_reset(struct xe_guc *guc);int xe_guc_upload (struct xe_guc *guc);int xe_guc_min_load_for_hwconfig (struct xe_guc *guc);int xe_guc_enable_communication (struct xe_guc *guc); +int xe_guc_opt_in_features_enable (struct xe_guc *guc);int xe_guc_suspend (struct xe_guc *guc);void xe_guc_notify (struct xe_guc *guc);int xe_guc_auth_huc (struct xe_guc *guc,u32 rsa_addr);
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h +2 -2
@@ -35,8 +35,8 @@ struct xe_guc_exec_queue {struct xe_sched_msg static_msgs[MAX_STATIC_MSG_TYPE ];/** @lr_tdr: long running TDR worker */ struct work_struct lr_tdr; -/** @fini_async: do final fini async from this worker */ -struct work_struct fini_async; +/** @destroy_async: do final destroy async from this worker */ +struct work_struct destroy_async;/** @resume_time: time of last resume */ u64 resume_time;/** @state: GuC specific state for this xe_exec_queue */
drivers/gpu/drm/xe/xe_guc_submit.c +115 -24
243 lines not on this page · raw message
drivers/gpu/drm/xe/xe_guc_submit.h +2 -0
@@ -13,6 +13,8 @@ struct xe_exec_queue;struct xe_guc ;int xe_guc_submit_init (struct xe_guc *guc,unsigned int num_ids); +int xe_guc_submit_enable (struct xe_guc *guc); +void xe_guc_submit_disable (struct xe_guc *guc);int xe_guc_submit_reset_prepare (struct xe_guc *guc);void xe_guc_submit_reset_wait (struct xe_guc *guc);
drivers/gpu/drm/xe/xe_tile_sysfs.c +7 -5
@@ -44,16 +44,18 @@ int xe_tile_sysfs_init(struct xe_tile *tile) kt->tile = tile; err =kobject_add (&kt->base, &dev->kobj,"tile%d" , tile->id); -if (err) { -kobject_put (&kt->base); -return err; - } +if (err) + goto err_object; tile->sysfs = &kt->base; err =xe_vram_freq_sysfs_init (tile);if (err) -return err; + goto err_object;return devm_add_action_or_reset (xe->drm.dev, tile_sysfs_fini, tile); + +err_object: +kobject_put (&kt->base); +return err; }
drivers/gpu/drm/xe/xe_uc.c +4 -0
@@ -165,6 +165,10 @@ static int vf_uc_init_hw(struct xe_uc *uc) uc->guc.submission_state.enabled = true; + err =xe_guc_opt_in_features_enable (&uc->guc); +if (err) +return err; + err =xe_gt_record_default_lrcs (uc_to_gt (uc));if (err)return err;
drivers/gpu/drm/xe/xe_vm.c +2 -2
@@ -240,8 +240,8 @@ int xe_vm_add_compute_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) pfence =xe_preempt_fence_create (q, q->lr.context, ++q->lr.seqno); -if (!pfence) { - err = -ENOMEM ; +if (IS_ERR (pfence)) { + err =PTR_ERR (pfence); goto out_fini; }
drivers/iommu/amd/amd_iommu_types.h +1 -0
@@ -551,6 +551,7 @@ struct gcr3_tbl_info { };struct amd_io_pgtable { +seqcount_t seqcount;/* Protects root/mode update */ struct io_pgtable pgtbl;int mode;u64 *root;
drivers/iommu/amd/init.c +5 -4
@@ -1450,12 +1450,12 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu, PCI_FUNC(e->devid)); devid = e->devid; -for (dev_i = devid_start; dev_i <= devid; ++dev_i) { -if (alias) +if (alias) { +for (dev_i = devid_start; dev_i <= devid; ++dev_i) pci_seg->alias_table[dev_i] = devid_to; +set_dev_entry_from_acpi (iommu, devid_to, flags, ext_flags); }set_dev_entry_from_acpi_range (iommu, devid_start, devid, flags, ext_flags); -set_dev_entry_from_acpi (iommu, devid_to, flags, ext_flags);break ;case IVHD_DEV_SPECIAL : {u8 handle, type;
@@ -3048,7 +3048,8 @@ static int __init early_amd_iommu_init(void)if (!boot_cpu_has (X86_FEATURE_CX16 )) {pr_err ("Failed to initialize. The CMPXCHG16B feature is required.\n" ); -return -EINVAL ; + ret = -EINVAL ; + goto out; }/*
drivers/iommu/amd/io_pgtable.c +21 -4
@@ -17,6 +17,7 @@#include <linux/slab.h> #include <linux/types.h> #include <linux/dma-mapping.h> +#include <linux/seqlock.h> #include <asm/barrier.h>
@@ -130,8 +131,11 @@ static bool increase_address_space(struct amd_io_pgtable *pgtable, *pte =PM_LEVEL_PDE (pgtable->mode,iommu_virt_to_phys (pgtable->root)); +write_seqcount_begin (&pgtable->seqcount); pgtable->root = pte; pgtable->mode +=1 ; +write_seqcount_end (&pgtable->seqcount); +amd_iommu_update_and_flush_device_table (domain); pte =NULL ;
@@ -153,6 +157,7 @@ static u64 *alloc_pte(struct amd_io_pgtable *pgtable, {unsigned long last_addr = address + (page_size -1 );struct io_pgtable_cfg *cfg = &pgtable->pgtbl.cfg; +unsigned int seqcount;int level, end_lvl;u64 *pte, *page;
@@ -170,8 +175,14 @@ static u64 *alloc_pte(struct amd_io_pgtable *pgtable, } - level = pgtable->mode -1 ; - pte = &pgtable->root[PM_LEVEL_INDEX (level, address)]; +do { + seqcount =read_seqcount_begin (&pgtable->seqcount); + + level = pgtable->mode -1 ; + pte = &pgtable->root[PM_LEVEL_INDEX (level, address)]; + }while (read_seqcount_retry (&pgtable->seqcount, seqcount)); + + address =PAGE_SIZE_ALIGN (address, page_size); end_lvl =PAGE_SIZE_LEVEL (page_size);
@@ -249,6 +260,7 @@ static u64 *fetch_pte(struct amd_io_pgtable *pgtable, unsigned long *page_size) {int level; +unsigned int seqcount;u64 *pte; *page_size =0 ;
@@ -256,8 +268,12 @@ static u64 *fetch_pte(struct amd_io_pgtable *pgtable,if (address >PM_LEVEL_SIZE (pgtable->mode))return NULL ; - level = pgtable->mode -1 ; - pte = &pgtable->root[PM_LEVEL_INDEX (level, address)]; +do { + seqcount =read_seqcount_begin (&pgtable->seqcount); + level = pgtable->mode -1 ; + pte = &pgtable->root[PM_LEVEL_INDEX (level, address)]; + }while (read_seqcount_retry (&pgtable->seqcount, seqcount)); + *page_size =PTE_LEVEL_PAGE_SIZE (level);while (level >0 ) {
@@ -541,6 +557,7 @@ static struct io_pgtable *v1_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cooif (!pgtable->root)return NULL ; pgtable->mode =PAGE_MODE_3_LEVEL ; +seqcount_init (&pgtable->seqcount); cfg->pgsize_bitmap = amd_iommu_pgsize_bitmap; cfg->ias =IOMMU_IN_ADDR_BIT_SIZE ;
drivers/iommu/intel/iommu.c +6 -1
@@ -1592,6 +1592,10 @@ static void switch_to_super_page(struct dmar_domain *domain,unsigned long lvl_pages =lvl_to_nr_pages (level);struct dma_pte *pte =NULL ; +if (WARN_ON (!IS_ALIGNED (start_pfn, lvl_pages) || + !IS_ALIGNED (end_pfn +1 , lvl_pages))) +return ; +while (start_pfn <= end_pfn) {if (!pte) pte = pfn_to_dma_pte(domain, start_pfn, &level,
@@ -1667,7 +1671,8 @@ __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,unsigned long pages_to_remove; pteval |=DMA_PTE_LARGE_PAGE ; - pages_to_remove = min_t(unsigned long, nr_pages, + pages_to_remove = min_t(unsigned long, +round_down (nr_pages, lvl_pages),nr_pte_to_next_page (pte) * lvl_pages); end_pfn = iov_pfn + pages_to_remove -1 ;switch_to_super_page (domain, iov_pfn, end_pfn, largepage_lvl);
drivers/iommu/s390-iommu.c +21 -8
@@ -611,6 +611,23 @@ static u64 get_iota_region_flag(struct s390_domain *domain) } } +static bool reg_ioat_propagate_error (int cc,u8 status) +{ +/* +* If the device is in the error state the reset routine +* will register the IOAT of the newly set domain on re-enable +*/ +if (cc ==ZPCI_CC_ERR && status ==ZPCI_PCI_ST_FUNC_NOT_AVAIL ) +return false; +/* +* If the device was removed treat registration as success +* and let the subsequent error event trigger tear down. +*/ +if (cc ==ZPCI_CC_INVAL_HANDLE ) +return false; +return cc !=ZPCI_CC_OK ; +} +static int s390_iommu_domain_reg_ioat (struct zpci_dev *zdev,struct iommu_domain *domain,u8 *status) {
@@ -695,7 +712,7 @@ static int s390_iommu_attach_device(struct iommu_domain *domain,/* If we fail now DMA remains blocked via blocking domain */ cc =s390_iommu_domain_reg_ioat (zdev, domain, &status); -if (cc && status !=ZPCI_PCI_ST_FUNC_NOT_AVAIL ) +if (reg_ioat_propagate_error (cc, status))return -EIO ; zdev->dma_table = s390_domain->dma_table;zdev_s390_domain_update (zdev, domain);
@@ -1031,7 +1048,8 @@ struct zpci_iommu_ctrs *zpci_get_iommu_ctrs(struct zpci_dev *zdev)lockdep_assert_held (&zdev->dom_lock); -if (zdev->s390_domain->type ==IOMMU_DOMAIN_BLOCKED ) +if (zdev->s390_domain->type ==IOMMU_DOMAIN_BLOCKED || + zdev->s390_domain->type ==IOMMU_DOMAIN_IDENTITY )return NULL ; s390_domain =to_s390_domain (zdev->s390_domain);
@@ -1122,12 +1140,7 @@ static int s390_attach_dev_identity(struct iommu_domain *domain,/* If we fail now DMA remains blocked via blocking domain */ cc =s390_iommu_domain_reg_ioat (zdev, domain, &status); - -/* -* If the device is undergoing error recovery the reset code -* will re-establish the new domain. -*/ -if (cc && status !=ZPCI_PCI_ST_FUNC_NOT_AVAIL ) +if (reg_ioat_propagate_error (cc, status))return -EIO ;zdev_s390_domain_update (zdev, domain);
drivers/md/dm-raid.c +4 -2
@@ -3810,8 +3810,10 @@ static void raid_io_hints(struct dm_target *ti, struct queue_limits *limits)struct raid_set *rs = ti->private;unsigned int chunk_size_bytes =to_bytes (rs->md.chunk_sectors); - limits->io_min = chunk_size_bytes; - limits->io_opt = chunk_size_bytes *mddev_data_stripes (rs); +if (chunk_size_bytes) { + limits->io_min = chunk_size_bytes; + limits->io_opt = chunk_size_bytes *mddev_data_stripes (rs); + } }static void raid_presuspend (struct dm_target *ti)
drivers/md/dm-stripe.c +7 -3
@@ -456,11 +456,15 @@ static void stripe_io_hints(struct dm_target *ti, struct queue_limits *limits) {struct stripe_c *sc = ti->private; -unsigned int chunk_size = sc->chunk_size <<SECTOR_SHIFT ; +unsigned int io_min, io_opt; limits->chunk_sectors = sc->chunk_size; - limits->io_min = chunk_size; - limits->io_opt = chunk_size * sc->stripes; + +if (!check_shl_overflow (sc->chunk_size,SECTOR_SHIFT , &io_min) && + !check_mul_overflow (io_min, sc->stripes, &io_opt)) { + limits->io_min = io_min; + limits->io_opt = io_opt; + } }static struct target_type stripe_target = {
drivers/mmc/host/mvsdio.c +1 -1
@@ -292,7 +292,7 @@ static u32 mvsd_finish_data(struct mvsd_host *host, struct mmc_data *data, host->pio_ptr =NULL ; host->pio_size =0 ; }else { -dma_unmap_sg (mmc_dev (host->mmc), data->sg, host->sg_frags, +dma_unmap_sg (mmc_dev (host->mmc), data->sg, data->sg_len,mmc_get_dma_dir (data)); }
drivers/mmc/host/sdhci-pci-gli.c +67 -1
92 lines not on this page · raw message
drivers/mmc/host/sdhci-uhs2.c +2 -1
@@ -295,7 +295,8 @@ static void __sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)else sdhci_uhs2_set_power (host, ios->power_mode, ios->vdd); -sdhci_set_clock (host, host->clock); + host->ops->set_clock (host, ios->clock); + host->clock = ios->clock; }static int sdhci_uhs2_set_ios (struct mmc_host *mmc,struct mmc_ios *ios)
drivers/mmc/host/sdhci.c +17 -17
@@ -2367,23 +2367,6 @@ void sdhci_set_ios_common(struct mmc_host *mmc, struct mmc_ios *ios) (ios->power_mode == MMC_POWER_UP) && !(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN))sdhci_enable_preset_value (host, false); - -if (!ios->clock || ios->clock != host->clock) { - host->ops->set_clock (host, ios->clock); - host->clock = ios->clock; - -if (host->quirks &SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK && - host->clock) { - host->timeout_clk = mmc->actual_clock ? - mmc->actual_clock /1000 : - host->clock /1000 ; - mmc->max_busy_timeout = - host->ops->get_max_timeout_count ? - host->ops->get_max_timeout_count (host) : -1 <<27 ; - mmc->max_busy_timeout /= host->timeout_clk; - } - } }EXPORT_SYMBOL_GPL (sdhci_set_ios_common);
@@ -2410,6 +2393,23 @@ void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)sdhci_set_ios_common (mmc, ios); +if (!ios->clock || ios->clock != host->clock) { + host->ops->set_clock (host, ios->clock); + host->clock = ios->clock; + +if (host->quirks &SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK && + host->clock) { + host->timeout_clk = mmc->actual_clock ? + mmc->actual_clock /1000 : + host->clock /1000 ; + mmc->max_busy_timeout = + host->ops->get_max_timeout_count ? + host->ops->get_max_timeout_count (host) : +1 <<27 ; + mmc->max_busy_timeout /= host->timeout_clk; + } + } +if (host->ops->set_power) host->ops->set_power (host, ios->power_mode, ios->vdd);else
drivers/net/bonding/bond_main.c +1 -1
@@ -2115,6 +2115,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,memcpy (ss.__data, bond_dev->dev_addr, bond_dev->addr_len); }else if (bond->params.fail_over_mac ==BOND_FOM_FOLLOW &&BOND_MODE (bond) ==BOND_MODE_ACTIVEBACKUP && +bond_has_slaves (bond) &&memcmp (slave_dev->dev_addr, bond_dev->dev_addr, bond_dev->addr_len) ==0 ) {/* Set slave to random address to avoid duplicate mac * address in later fail over.
@@ -3338,7 +3339,6 @@ static void bond_ns_send_all(struct bonding *bond, struct slave *slave)/* Find out through which dev should the packet go */ memset (&fl6,0 ,sizeof (struct flowi6 )); fl6.daddr = targets[i]; - fl6.flowi6_oif = bond->dev->ifindex; dst =ip6_route_output (dev_net (bond->dev),NULL , &fl6);if (dst->error) {
drivers/net/ethernet/broadcom/cnic.c +1 -2
@@ -4230,8 +4230,7 @@ static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev)cnic_bnx2x_delete_wait (dev,0 ); -cancel_delayed_work (&cp->delete_task); -flush_workqueue (cnic_wq); +cancel_delayed_work_sync (&cp->delete_task);if (atomic_read (&cp->iscsi_conn) !=0 ) netdev_warn(dev->netdev, "%d iSCSI connections not destroyed\n",
drivers/net/ethernet/cavium/liquidio/request_manager.c +1 -1
@@ -126,7 +126,7 @@ int octeon_init_instr_queue(struct octeon_device *oct, oct->io_qmask.iq |=BIT_ULL (iq_no);/* Set the 32B/64B mode for each input queue */ - oct->io_qmask.iq64B |= ((conf->instr_type ==64 ) << iq_no); + oct->io_qmask.iq64B |= ((u64)(conf->instr_type ==64 ) << iq_no); iq->iqcmd_64B = (conf->instr_type ==64 ); oct->fn_list.setup_iq_regs (oct, iq_no);
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +1 -1
@@ -2736,7 +2736,7 @@ static int dpaa2_switch_setup_dpbp(struct ethsw_core *ethsw)dev_err (dev,"dpsw_ctrl_if_set_pools() failed\n" ); goto err_get_attr; } - ethsw->bpid = dpbp_attrs.id; + ethsw->bpid = dpbp_attrs.bpid;return 0 ;
drivers/net/ethernet/intel/i40e/i40e_txrx.c +0 -3
@@ -947,9 +947,6 @@ static bool i40e_clean_tx_irq(struct i40e_vsi *vsi,if (!eop_desc)break ; -/* prevent any other reads prior to eop_desc */ -smp_rmb (); -i40e_trace (clean_tx_irq, tx_ring, tx_desc, tx_buf);/* we have caught up to head, no work left to do */ if (tx_head == tx_desc)
drivers/net/ethernet/intel/ice/ice_txrx.c +34 -46
163 lines not on this page · raw message
drivers/net/ethernet/intel/ice/ice_txrx.h +0 -1
@@ -358,7 +358,6 @@ struct ice_rx_ring {struct ice_tx_ring *xdp_ring;struct ice_rx_ring *next;/* pointer to next ring in q_vector */ struct xsk_buff_pool *xsk_pool; -u32 nr_frags;u16 max_frame;u16 rx_buf_len;dma_addr_t dma;/* physical address of ring */
drivers/net/ethernet/intel/igc/igc.h +1 -0
@@ -343,6 +343,7 @@ struct igc_adapter {/* LEDs */ struct mutex led_mutex;struct igc_led_classdev *leds; +bool leds_available; };void igc_up (struct igc_adapter *adapter);
drivers/net/ethernet/intel/igc/igc_main.c +9 -3
@@ -7301,8 +7301,14 @@ static int igc_probe(struct pci_dev *pdev,if (IS_ENABLED (CONFIG_IGC_LEDS )) { err =igc_led_setup (adapter); -if (err) - goto err_register; +if (err) { +netdev_warn_once (netdev, +"LED init failed (%d); continuing without LED support\n" , + err); + adapter->leds_available = false; + }else { + adapter->leds_available = true; + } }return 0 ;
@@ -7358,7 +7364,7 @@ static void igc_remove(struct pci_dev *pdev)cancel_work_sync (&adapter->watchdog_task);hrtimer_cancel (&adapter->hrtimer); -if (IS_ENABLED (CONFIG_IGC_LEDS )) +if (IS_ENABLED (CONFIG_IGC_LEDS ) && adapter->leds_available)igc_led_free (adapter);/* Release control of h/w to f/w. If f/w is AMT enabled, this
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +12 -10
@@ -6801,6 +6801,13 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,break ; } +/* Make sure the SWFW semaphore is in a valid state */ +if (hw->mac.ops.init_swfw_sync) + hw->mac.ops.init_swfw_sync (hw); + +if (hw->mac.type == ixgbe_mac_e610) +mutex_init (&hw->aci.lock); +#ifdef IXGBE_FCOE /* FCoE support exists, always init the FCoE lock */ spin_lock_init (&adapter->fcoe.lock);
@@ -11474,10 +11481,6 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)if (err) goto err_sw_init; -/* Make sure the SWFW semaphore is in a valid state */ -if (hw->mac.ops.init_swfw_sync) - hw->mac.ops.init_swfw_sync (hw); -if (ixgbe_check_fw_error (adapter))return ixgbe_recovery_probe (adapter);
@@ -11681,8 +11684,6 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)ether_addr_copy (hw->mac.addr, hw->mac.perm_addr);ixgbe_mac_set_default_filter (adapter); -if (hw->mac.type == ixgbe_mac_e610) -mutex_init (&hw->aci.lock);timer_setup (&adapter->service_timer, ixgbe_service_timer,0 );if (ixgbe_removed (hw->hw_addr)) {
@@ -11838,9 +11839,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)devl_unlock (adapter->devlink);ixgbe_release_hw_control (adapter);ixgbe_clear_interrupt_scheme (adapter); +err_sw_init:if (hw->mac.type == ixgbe_mac_e610)mutex_destroy (&adapter->hw.aci.lock); -err_sw_init:ixgbe_disable_sriov (adapter); adapter->flags2 &= ~IXGBE_FLAG2_SEARCH_FOR_SFP ;iounmap (adapter->io_addr);
@@ -11891,10 +11892,8 @@ static void ixgbe_remove(struct pci_dev *pdev)set_bit (__IXGBE_REMOVING, &adapter->state);cancel_work_sync (&adapter->service_task); -if (adapter->hw.mac.type == ixgbe_mac_e610) { +if (adapter->hw.mac.type == ixgbe_mac_e610)ixgbe_disable_link_status_events (adapter); -mutex_destroy (&adapter->hw.aci.lock); - }if (adapter->mii_bus)mdiobus_unregister (adapter->mii_bus);
@@ -11954,6 +11953,9 @@ static void ixgbe_remove(struct pci_dev *pdev) disable_dev = !test_and_set_bit (__IXGBE_DISABLED, &adapter->state);free_netdev (netdev); +if (adapter->hw.mac.type == ixgbe_mac_e610) +mutex_destroy (&adapter->hw.aci.lock); +if (disable_dev)pci_disable_device (pdev); }
drivers/net/ethernet/marvell/octeon_ep/octep_main.c +16 -0
@@ -1124,11 +1124,24 @@ static int octep_set_features(struct net_device *dev, netdev_features_t featuresreturn err; } +static bool octep_is_vf_valid (struct octep_device *oct,int vf) +{ +if (vf >=CFG_GET_ACTIVE_VFS (oct->conf)) { +netdev_err (oct->netdev,"Invalid VF ID %d\n" , vf); +return false; + } + +return true; +} +static int octep_get_vf_config (struct net_device *dev,int vf,struct ifla_vf_info *ivi) {struct octep_device *oct =netdev_priv (dev); +if (!octep_is_vf_valid (oct, vf)) +return -EINVAL ; + ivi->vf = vf;ether_addr_copy (ivi->mac, oct->vf_info[vf].mac_addr); ivi->spoofchk = true;
@@ -1143,6 +1156,9 @@ static int octep_set_vf_mac(struct net_device *dev, int vf, u8 *mac)struct octep_device *oct =netdev_priv (dev);int err; +if (!octep_is_vf_valid (oct, vf)) +return -EINVAL ; +if (!is_valid_ether_addr (mac)) {dev_err (&oct->pdev->dev,"Invalid MAC Address %pM\n" , mac);return -EADDRNOTAVAIL ;
drivers/net/ethernet/marvell/octeon_ep/octep_pfvf_mbox.c +3 -0
@@ -196,6 +196,7 @@ static void octep_pfvf_get_mac_addr(struct octep_device *oct, u32 vf_id, vf_id);return ; } +ether_addr_copy (oct->vf_info[vf_id].mac_addr, rsp->s_set_mac.mac_addr); rsp->s_set_mac.type =OCTEP_PFVF_MBOX_TYPE_RSP_ACK ; }
@@ -205,6 +206,8 @@ static void octep_pfvf_dev_remove(struct octep_device *oct, u32 vf_id, {int err; +/* Reset VF-specific information maintained by the PF */ +memset (&oct->vf_info[vf_id],0 ,sizeof (struct octep_pfvf_info )); err =octep_ctrl_net_dev_remove (oct, vf_id);if (err) { rsp->s.type =OCTEP_PFVF_MBOX_TYPE_RSP_NACK ;
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ptp.c +1 -1
@@ -491,7 +491,7 @@ void otx2_ptp_destroy(struct otx2_nic *pfvf)if (!ptp)return ; -cancel_delayed_work (&pfvf->ptp->synctstamp_work); +cancel_delayed_work_sync (&pfvf->ptp->synctstamp_work);ptp_clock_unregister (ptp->ptp_clock);kfree (ptp);
drivers/net/ethernet/mellanox/mlx5/core/en/fs.h +1 -0
@@ -92,6 +92,7 @@ enum {MLX5E_ACCEL_FS_ESP_FT_LEVEL =MLX5E_INNER_TTC_FT_LEVEL +1 ,MLX5E_ACCEL_FS_ESP_FT_ERR_LEVEL ,MLX5E_ACCEL_FS_POL_FT_LEVEL , +MLX5E_ACCEL_FS_POL_MISS_FT_LEVEL , MLX5E_ACCEL_FS_ESP_FT_ROCE_LEVEL, #endif };
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +1 -0
@@ -185,6 +185,7 @@ struct mlx5e_ipsec_rx_create_attr {u32 family;int prio;int pol_level; +int pol_miss_level;int sa_level;int status_level;enum mlx5_flow_namespace_type chains_ns;
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +2 -1
@@ -747,6 +747,7 @@ static void ipsec_rx_create_attr_set(struct mlx5e_ipsec *ipsec, attr->family = family; attr->prio =MLX5E_NIC_PRIO ; attr->pol_level =MLX5E_ACCEL_FS_POL_FT_LEVEL ; + attr->pol_miss_level =MLX5E_ACCEL_FS_POL_MISS_FT_LEVEL ; attr->sa_level =MLX5E_ACCEL_FS_ESP_FT_LEVEL ; attr->status_level =MLX5E_ACCEL_FS_ESP_FT_ERR_LEVEL ; attr->chains_ns =MLX5_FLOW_NAMESPACE_KERNEL ;
@@ -833,7 +834,7 @@ static int ipsec_rx_chains_create_miss(struct mlx5e_ipsec *ipsec, ft_attr.max_fte =1 ; ft_attr.autogroup.max_num_groups =1 ; - ft_attr.level = attr->pol_level; + ft_attr.level = attr->pol_miss_level; ft_attr.prio = attr->prio; ft =mlx5_create_auto_grouped_flow_table (attr->ns, &ft_attr);
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +0 -2
@@ -136,8 +136,6 @@ void mlx5e_update_carrier(struct mlx5e_priv *priv)if (up) {netdev_info (priv->netdev,"Link up\n" );netif_carrier_on (priv->netdev); -mlx5e_port_manual_buffer_config (priv,0 , priv->netdev->mtu, -NULL ,NULL ,NULL ); }else {netdev_info (priv->netdev,"Link down\n" );netif_carrier_off (priv->netdev);
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +22 -5
@@ -1506,12 +1506,21 @@ static const struct mlx5e_profile mlx5e_uplink_rep_profile = {static int mlx5e_vport_uplink_rep_load (struct mlx5_core_dev *dev,struct mlx5_eswitch_rep *rep) { -struct mlx5e_priv *priv =netdev_priv (mlx5_uplink_netdev_get (dev));struct mlx5e_rep_priv *rpriv =mlx5e_rep_to_rep_priv (rep); +struct net_device *netdev; +struct mlx5e_priv *priv; +int err; + + netdev =mlx5_uplink_netdev_get (dev); +if (!netdev) +return 0 ; + priv =netdev_priv (netdev); rpriv->netdev = priv->netdev; -return mlx5e_netdev_change_profile (priv, &mlx5e_uplink_rep_profile, - rpriv); + err =mlx5e_netdev_change_profile (priv, &mlx5e_uplink_rep_profile, + rpriv); +mlx5_uplink_netdev_put (dev, netdev); +return err; } static void
@@ -1638,8 +1647,16 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep) {struct mlx5e_rep_priv *rpriv =mlx5e_rep_to_rep_priv (rep);struct net_device *netdev = rpriv->netdev; -struct mlx5e_priv *priv =netdev_priv (netdev); -void *ppriv = priv->ppriv; +struct mlx5e_priv *priv; +void *ppriv; + +if (!netdev) { + ppriv = rpriv; + goto free_ppriv; + } + + priv =netdev_priv (netdev); + ppriv = priv->ppriv;if (rep->vport ==MLX5_VPORT_UPLINK ) {mlx5e_vport_uplink_rep_unload (rpriv);
drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +1 -0
@@ -743,6 +743,7 @@ static u32 mlx5_esw_qos_lag_link_speed_get_locked(struct mlx5_core_dev *mdev) speed = lksettings.base.speed; out: +mlx5_uplink_netdev_put (mdev, slave);return speed; }
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +2 -2
@@ -114,9 +114,9 @@#define ETHTOOL_NUM_PRIOS 11#define ETHTOOL_MIN_LEVEL (KERNEL_MIN_LEVEL + ETHTOOL_NUM_PRIOS)/* Vlan, mac, ttc, inner ttc, {UDP/ANY/aRFS/accel/{esp, esp_err}}, IPsec policy, -* {IPsec RoCE MPV,Alias table},IPsec RoCE policy +* IPsec policy miss, {IPsec RoCE MPV,Alias table},IPsec RoCE policy */ -#define KERNEL_NIC_PRIO_NUM_LEVELS 10 +#define KERNEL_NIC_PRIO_NUM_LEVELS 11#define KERNEL_NIC_NUM_PRIOS 1/* One more level for tc, and one more for promisc */ #define KERNEL_MIN_LEVEL (KERNEL_NIC_PRIO_NUM_LEVELS + 2)
drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h +14 -1
@@ -52,7 +52,20 @@ static inline struct net *mlx5_core_net(struct mlx5_core_dev *dev)static inline struct net_device *mlx5_uplink_netdev_get (struct mlx5_core_dev *mdev) { -return mdev->mlx5e_res.uplink_netdev; +struct mlx5e_resources *mlx5e_res = &mdev->mlx5e_res; +struct net_device *netdev; + +mutex_lock (&mlx5e_res->uplink_netdev_lock); + netdev = mlx5e_res->uplink_netdev; +netdev_hold (netdev, &mlx5e_res->tracker,GFP_KERNEL ); +mutex_unlock (&mlx5e_res->uplink_netdev_lock); +return netdev; +} + +static inline void mlx5_uplink_netdev_put (struct mlx5_core_dev *mdev, +struct net_device *netdev) +{ +netdev_put (netdev, &mdev->mlx5e_res.tracker); }struct mlx5_sd ;
drivers/net/ethernet/mellanox/mlx5/core/port.c +5 -1
@@ -1170,7 +1170,11 @@ const struct mlx5_link_info *mlx5_port_ptys2info(struct mlx5_core_dev *mdev,mlx5e_port_get_link_mode_info_arr (mdev, &table, &max_size, force_legacy); i =find_first_bit (&temp, max_size); -if (i < max_size) + +/* mlx5e_link_info has holes. Check speed +* is not zero as indication of one. +*/ +if (i < max_size && table[i].speed)return &table[i];return NULL ;
drivers/net/ethernet/natsemi/ns83820.c +6 -7
@@ -820,7 +820,7 @@ static void rx_irq(struct net_device *ndev)struct ns83820 *dev =PRIV (ndev);struct rx_info *info = &dev->rx_info;unsigned next_rx; -int rx_rc, len; +int len;u32 cmdsts;__le32 *desc;unsigned long flags;
@@ -881,8 +881,10 @@ static void rx_irq(struct net_device *ndev)if (likely (CMDSTS_OK & cmdsts)) {#endif skb_put (skb, len); -if (unlikely (!skb)) +if (unlikely (!skb)) { + ndev->stats.rx_dropped++; goto netdev_mangle_me_harder_failed; + }if (cmdsts &CMDSTS_DEST_MULTI ) ndev->stats.multicast++; ndev->stats.rx_packets++;
@@ -901,15 +903,12 @@ static void rx_irq(struct net_device *ndev) __vlan_hwaccel_put_tag(skb, htons(ETH_P_IPV6), tag); }#endif - rx_rc =netif_rx (skb); -if (NET_RX_DROP == rx_rc) { -netdev_mangle_me_harder_failed: - ndev->stats.rx_dropped++; - } +netif_rx (skb); }else {dev_kfree_skb_irq (skb); } +netdev_mangle_me_harder_failed: nr++; next_rx = info->next_rx; desc = info->descs + (DESC_SIZE * next_rx);
drivers/net/ethernet/qlogic/qed/qed_debug.c +4 -3
@@ -4462,10 +4462,11 @@ static enum dbg_status qed_protection_override_dump(struct qed_hwfn *p_hwfn, goto out; } -/* Add override window info to buffer */ +/* Add override window info to buffer, preventing buffer overflow */ override_window_dwords = -qed_rd (p_hwfn, p_ptt,GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW ) * -PROTECTION_OVERRIDE_ELEMENT_DWORDS ; +min (qed_rd (p_hwfn, p_ptt,GRC_REG_NUMBER_VALID_OVERRIDE_WINDOW ) * +PROTECTION_OVERRIDE_ELEMENT_DWORDS , +PROTECTION_OVERRIDE_DEPTH_DWORDS );if (override_window_dwords) { addr =BYTES_TO_DWORDS (GRC_REG_PROTECTION_OVERRIDE_WINDOW ); offset += qed_grc_dump_addr_range(p_hwfn,
drivers/net/wireless/mediatek/mt76/mac80211.c +1 -1
@@ -1731,7 +1731,7 @@ EXPORT_SYMBOL_GPL(mt76_wcid_cleanup);void mt76_wcid_add_poll (struct mt76_dev *dev,struct mt76_wcid *wcid) { -if (test_bit (MT76_MCU_RESET , &dev->phy.state)) +if (test_bit (MT76_MCU_RESET , &dev->phy.state) || !wcid->sta)return ;spin_lock_bh (&dev->sta_poll_lock);
drivers/net/wireless/microchip/wilc1000/wlan_cfg.c +27 -10
@@ -41,10 +41,10 @@ static const struct wilc_cfg_word g_cfg_word[] = { };static const struct wilc_cfg_str g_cfg_str[] = { - {WID_FIRMWARE_VERSION ,NULL }, - {WID_MAC_ADDR ,NULL }, - {WID_ASSOC_RES_INFO ,NULL }, - {WID_NIL ,NULL } + {WID_FIRMWARE_VERSION ,0 ,NULL }, + {WID_MAC_ADDR ,0 ,NULL }, + {WID_ASSOC_RES_INFO ,0 ,NULL }, + {WID_NIL ,0 ,NULL } };#define WILC_RESP_MSG_TYPE_CONFIG_REPLY 'R'
@@ -147,44 +147,58 @@ static void wilc_wlan_parse_response_frame(struct wilc *wl, u8 *info, int size)switch (FIELD_GET (WILC_WID_TYPE , wid)) {case WID_CHAR : + len =3 ; +if (len +2 > size) +return ; +while (cfg->b[i].id !=WID_NIL && cfg->b[i].id != wid) i++;if (cfg->b[i].id == wid) cfg->b[i].val = info[4 ]; - len =3 ;break ;case WID_SHORT : + len =4 ; +if (len +2 > size) +return ; +while (cfg->hw[i].id !=WID_NIL && cfg->hw[i].id != wid) i++;if (cfg->hw[i].id == wid) cfg->hw[i].val =get_unaligned_le16 (&info[4 ]); - len =4 ;break ;case WID_INT : + len =6 ; +if (len +2 > size) +return ; +while (cfg->w[i].id !=WID_NIL && cfg->w[i].id != wid) i++;if (cfg->w[i].id == wid) cfg->w[i].val =get_unaligned_le32 (&info[4 ]); - len =6 ;break ;case WID_STR : + len =2 +get_unaligned_le16 (&info[2 ]); +while (cfg->s[i].id !=WID_NIL && cfg->s[i].id != wid) i++; -if (cfg->s[i].id == wid) +if (cfg->s[i].id == wid) { +if (len > cfg->s[i].len || (len +2 > size)) +return ; +memcpy (cfg->s[i].str, &info[2 ], -get_unaligned_le16 (&info[2 ]) +2 ); + len); + } - len =2 +get_unaligned_le16 (&info[2 ]);break ;default :
@@ -384,12 +398,15 @@ int wilc_wlan_cfg_init(struct wilc *wl)/* store the string cfg parameters */ wl->cfg.s[i].id =WID_FIRMWARE_VERSION ; wl->cfg.s[i].str = str_vals->firmware_version; + wl->cfg.s[i].len =sizeof (str_vals->firmware_version); i++; wl->cfg.s[i].id =WID_MAC_ADDR ; wl->cfg.s[i].str = str_vals->mac_address; + wl->cfg.s[i].len =sizeof (str_vals->mac_address); i++; wl->cfg.s[i].id =WID_ASSOC_RES_INFO ; wl->cfg.s[i].str = str_vals->assoc_rsp; + wl->cfg.s[i].len =sizeof (str_vals->assoc_rsp); i++; wl->cfg.s[i].id =WID_NIL ; wl->cfg.s[i].str =NULL ;
drivers/net/wireless/microchip/wilc1000/wlan_cfg.h +3 -2
@@ -24,12 +24,13 @@ struct wilc_cfg_word {struct wilc_cfg_str {u16 id; +u16 len;u8 *str; };struct wilc_cfg_str_vals { -u8 mac_address[7 ]; -u8 firmware_version[129 ]; +u8 mac_address[8 ]; +u8 firmware_version[130 ];u8 assoc_rsp[WILC_MAX_ASSOC_RESP_FRAME_SIZE ]; };
drivers/nvme/host/core.c +11 -7
@@ -903,6 +903,15 @@ static void nvme_set_ref_tag(struct nvme_ns *ns, struct nvme_command *cmnd,u32 upper, lower;u64 ref48; +/* only type1 and type 2 PI formats have a reftag */ +switch (ns->head->pi_type) { +case NVME_NS_DPS_PI_TYPE1 : +case NVME_NS_DPS_PI_TYPE2 : +break ; +default : +return ; + } +/* both rw and write zeroes share the same reftag format */ switch (ns->head->guard_type) {case NVME_NVM_NS_16B_GUARD :
@@ -942,13 +951,7 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns,if (nvme_ns_has_pi (ns->head)) { cmnd->write_zeroes.control |=cpu_to_le16 (NVME_RW_PRINFO_PRACT ); - -switch (ns->head->pi_type) { -case NVME_NS_DPS_PI_TYPE1 : -case NVME_NS_DPS_PI_TYPE2 : -nvme_set_ref_tag (ns, cmnd, req); -break ; - } +nvme_set_ref_tag (ns, cmnd, req); }return BLK_STS_OK ;
@@ -1039,6 +1042,7 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns,if (WARN_ON_ONCE (!nvme_ns_has_pi (ns->head)))return BLK_STS_NOTSUPP ; control |=NVME_RW_PRINFO_PRACT ; +nvme_set_ref_tag (ns, cmnd, req); }if (bio_integrity_flagged (req->bio,BIP_CHECK_GUARD ))
drivers/pcmcia/omap_cf.c +7 -1
@@ -304,7 +304,13 @@ static void __exit omap_cf_remove(struct platform_device *pdev)kfree (cf); } -static struct platform_driver omap_cf_driver = { +/* +* omap_cf_remove() lives in .exit.text. For drivers registered via +* platform_driver_probe() this is ok because they cannot get unbound at +* runtime. So mark the driver struct with __refdata to prevent modpost +* triggering a section mismatch warning. +*/ +static struct platform_driver omap_cf_driver__refdata = { .driver = { .name = driver_name, },
drivers/platform/x86/asus-nb-wmi.c +21 -4
@@ -147,7 +147,12 @@ static struct quirk_entry quirk_asus_ignore_fan = { };static struct quirk_entry quirk_asus_zenbook_duo_kbd = { - .ignore_key_wlan = true, + .key_wlan_event =ASUS_WMI_KEY_IGNORE , +}; + +static struct quirk_entry quirk_asus_z13 = { + .key_wlan_event =ASUS_WMI_KEY_ARMOURY , + .tablet_switch_mode = asus_wmi_kbd_dock_devid, };static int dmi_matched (const struct dmi_system_id *dmi)
@@ -539,6 +544,15 @@ static const struct dmi_system_id asus_quirks[] = { }, .driver_data = &quirk_asus_zenbook_duo_kbd, }, + { + .callback = dmi_matched, + .ident = "ASUS ROG Z13", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "ROG Flow Z13"), + }, + .driver_data = &quirk_asus_z13, + }, {}, };
@@ -636,6 +650,7 @@ static const struct key_entry asus_nb_wmi_keymap[] = { { KE_IGNORE, 0xCF, }, /* AC mode */ { KE_KEY, 0xFA, { KEY_PROG2 } }, /* Lid flip action */ { KE_KEY, 0xBD, { KEY_PROG2 } }, /* Lid flip action on ROG xflow laptops */ + { KE_KEY, ASUS_WMI_KEY_ARMOURY, { KEY_PROG3 } }, { KE_END, 0}, };
@@ -655,9 +670,11 @@ static void asus_nb_wmi_key_filter(struct asus_wmi_driver *asus_wmi, int *code,if (atkbd_reports_vol_keys) *code =ASUS_WMI_KEY_IGNORE ;break ; -case 0x5F :/* Wireless console Disable */ -if (quirks->ignore_key_wlan) - *code =ASUS_WMI_KEY_IGNORE ; +case 0x5D :/* Wireless console Toggle */ +case 0x5E :/* Wireless console Enable / Keyboard Attach, Detach */ +case 0x5F :/* Wireless console Disable / Special Key */ +if (quirks->key_wlan_event) + *code = quirks->key_wlan_event;break ; } }
drivers/platform/x86/asus-wmi.h +2 -1
@@ -18,6 +18,7 @@#include <linux/i8042.h> #define ASUS_WMI_KEY_IGNORE (-1) +#define ASUS_WMI_KEY_ARMOURY 0xffff01#define ASUS_WMI_BRN_DOWN 0x2e#define ASUS_WMI_BRN_UP 0x2f
@@ -40,7 +41,7 @@ struct quirk_entry {bool wmi_force_als_set;bool wmi_ignore_fan;bool filter_i8042_e1_extended_codes; -bool ignore_key_wlan; +int key_wlan_event;enum asus_wmi_tablet_switch_mode tablet_switch_mode;int wapf;/*
drivers/power/supply/bq27xxx_battery.c +2 -2
@@ -1919,8 +1919,8 @@ static void bq27xxx_battery_update_unlocked(struct bq27xxx_device_info *di)bool has_singe_flag = di->opts &BQ27XXX_O_ZERO ; cache.flags =bq27xxx_read (di,BQ27XXX_REG_FLAGS , has_singe_flag); -if ((cache.flags &0xff ) ==0xff ) - cache.flags =-1 ;/* read error */ +if (di->chip ==BQ27000 && (cache.flags &0xff ) ==0xff ) + cache.flags = -ENODEV ;/* bq27000 hdq read error */ if (cache.flags >=0 ) { cache.capacity =bq27xxx_battery_read_soc (di);
fs/btrfs/delayed-inode.c +0 -3
@@ -1843,7 +1843,6 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans,int btrfs_fill_inode (struct btrfs_inode *inode,u32 *rdev) { -struct btrfs_fs_info *fs_info = inode->root->fs_info;struct btrfs_delayed_node *delayed_node;struct btrfs_inode_item *inode_item;struct inode *vfs_inode = &inode->vfs_inode;
@@ -1864,8 +1863,6 @@ int btrfs_fill_inode(struct btrfs_inode *inode, u32 *rdev)i_uid_write (vfs_inode,btrfs_stack_inode_uid (inode_item));i_gid_write (vfs_inode,btrfs_stack_inode_gid (inode_item));btrfs_i_size_write (inode,btrfs_stack_inode_size (inode_item)); -btrfs_inode_set_file_extent_range (inode,0 , -round_up (i_size_read (vfs_inode), fs_info->sectorsize)); vfs_inode->i_mode =btrfs_stack_inode_mode (inode_item);set_nlink (vfs_inode,btrfs_stack_inode_nlink (inode_item));inode_set_bytes (vfs_inode,btrfs_stack_inode_nbytes (inode_item));
fs/btrfs/inode.c +5 -6
@@ -3881,10 +3881,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_pathbool filled = false;int first_xattr_slot; - ret =btrfs_init_file_extent_tree (inode); -if (ret) - goto out; - ret =btrfs_fill_inode (inode, &rdev);if (!ret) filled = true;
@@ -3916,8 +3912,6 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_pathi_uid_write (vfs_inode,btrfs_inode_uid (leaf, inode_item));i_gid_write (vfs_inode,btrfs_inode_gid (leaf, inode_item));btrfs_i_size_write (inode,btrfs_inode_size (leaf, inode_item)); -btrfs_inode_set_file_extent_range (inode,0 , -round_up (i_size_read (vfs_inode), fs_info->sectorsize));inode_set_atime (vfs_inode,btrfs_timespec_sec (leaf, &inode_item->atime),btrfs_timespec_nsec (leaf, &inode_item->atime));
@@ -3948,6 +3942,11 @@ static int btrfs_read_locked_inode(struct btrfs_inode *inode, struct btrfs_pathbtrfs_update_inode_mapping_flags (inode); cache_index: + ret =btrfs_init_file_extent_tree (inode); +if (ret) + goto out; +btrfs_inode_set_file_extent_range (inode,0 , +round_up (i_size_read (vfs_inode), fs_info->sectorsize));/* * If we were modified in the current generation and evicted from memory * and then re-read we need to do a full sync since we don't have any
fs/btrfs/tree-checker.c +2 -2
@@ -1756,10 +1756,10 @@ static int check_inode_ref(struct extent_buffer *leaf,while (ptr < end) {u16 namelen; -if (unlikely (ptr +sizeof (iref) > end)) { +if (unlikely (ptr +sizeof (*iref) > end)) {inode_ref_err (leaf, slot,"inode ref overflow, ptr %lu end %lu inode_ref_size %zu" , - ptr, end,sizeof (iref)); + ptr, end,sizeof (*iref));return -EUCLEAN ; }
fs/btrfs/tree-log.c +1 -1
@@ -1933,7 +1933,7 @@ static noinline int replay_one_name(struct btrfs_trans_handle *trans, search_key.objectid = log_key.objectid; search_key.type =BTRFS_INODE_EXTREF_KEY ; - search_key.offset = key->objectid; + search_key.offset =btrfs_extref_hash (key->objectid, name.name, name.len); ret =backref_in_log (root->log_root, &search_key, key->objectid, &name);if (ret <0 ) { goto out;
fs/btrfs/zoned.c +1 -1
@@ -2577,9 +2577,9 @@ void btrfs_zoned_reserve_data_reloc_bg(struct btrfs_fs_info *fs_info)spin_lock (&space_info->lock); space_info->total_bytes -= bg->length; space_info->disk_total -= bg->length * factor; + space_info->disk_total -= bg->zone_unusable;/* There is no allocation ever happened. */ ASSERT (bg->used ==0 ); -ASSERT (bg->zone_unusable ==0 );/* No super block in a block group on the zoned setup. */ ASSERT (bg->bytes_super ==0 );spin_unlock (&space_info->lock);
fs/nilfs2/sysfs.c +2 -2
@@ -1075,7 +1075,7 @@ void nilfs_sysfs_delete_device_group(struct the_nilfs *nilfs)************************************************************************/ static ssize_t nilfs_feature_revision_show (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {return sysfs_emit (buf,"%d.%d\n" ,NILFS_CURRENT_REV ,NILFS_MINOR_REV );
@@ -1087,7 +1087,7 @@ static const char features_readme_str[] ="(1) revision\n\tshow current revision of NILFS file system driver.\n" ;static ssize_t nilfs_feature_README_show (struct kobject *kobj, -struct attribute *attr, +struct kobj_attribute *attr,char *buf) {return sysfs_emit (buf, features_readme_str);
fs/nilfs2/sysfs.h +4 -4
@@ -50,16 +50,16 @@ struct nilfs_sysfs_dev_subgroups {struct completion sg_segments_kobj_unregister; }; -#define NILFS_COMMON_ATTR_STRUCT (name) \ +#define NILFS_KOBJ_ATTR_STRUCT (name) \ struct nilfs_##name##_attr { \ struct attribute attr; \ - ssize_t (*show)(struct kobject *, struct attribute *, \ + ssize_t (*show)(struct kobject *, struct kobj_attribute *, \ char *); \ - ssize_t (*store)(struct kobject *, struct attribute *, \ + ssize_t (*store)(struct kobject *, struct kobj_attribute *, \ const char *, size_t); \ } -NILFS_COMMON_ATTR_STRUCT (feature); +NILFS_KOBJ_ATTR_STRUCT (feature);#define NILFS_DEV_ATTR_STRUCT (name) \ struct nilfs_##name##_attr { \
fs/smb/client/cifsproto.h +2 -2
@@ -297,8 +297,8 @@ extern void cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode);extern void cifs_close_all_deferred_files (struct cifs_tcon *cifs_tcon); -extern void cifs_close_deferred_file_under_dentry (struct cifs_tcon *cifs_tcon, -const char *path); +void cifs_close_deferred_file_under_dentry (struct cifs_tcon *cifs_tcon, +struct dentry *dentry);extern void cifs_mark_open_handles_for_deleted_file (struct inode *inode,const char *path);
fs/smb/client/inode.c +18 -5
@@ -1984,7 +1984,7 @@ static int __cifs_unlink(struct inode *dir, struct dentry *dentry, bool sillyren }netfs_wait_for_outstanding_io (inode); -cifs_close_deferred_file_under_dentry (tcon, full_path); +cifs_close_deferred_file_under_dentry (tcon, dentry);#ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY if (cap_unix (tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability))) {
@@ -2003,8 +2003,21 @@ static int __cifs_unlink(struct inode *dir, struct dentry *dentry, bool sillyren goto psx_del_no_retry; } -if (sillyrename || (server->vals->protocol_id >SMB10_PROT_ID && -d_is_positive (dentry) &&d_count (dentry) >2 )) +/* For SMB2+, if the file is open, we always perform a silly rename. +* +* We check for d_count() right after calling +* cifs_close_deferred_file_under_dentry() to make sure that the +* dentry's refcount gets dropped in case the file had any deferred +* close. +*/ +if (!sillyrename && server->vals->protocol_id >SMB10_PROT_ID ) { +spin_lock (&dentry->d_lock); +if (d_count (dentry) >1 ) + sillyrename = true; +spin_unlock (&dentry->d_lock); + } + +if (sillyrename) rc = -EBUSY ;else rc = server->ops->unlink (xid, tcon, full_path, cifs_sb, dentry);
@@ -2538,10 +2551,10 @@ cifs_rename2(struct mnt_idmap *idmap, struct inode *source_dir, goto cifs_rename_exit; } -cifs_close_deferred_file_under_dentry (tcon, from_name); +cifs_close_deferred_file_under_dentry (tcon, source_dentry);if (d_inode (target_dentry) !=NULL ) {netfs_wait_for_outstanding_io (d_inode (target_dentry)); -cifs_close_deferred_file_under_dentry (tcon, to_name); +cifs_close_deferred_file_under_dentry (tcon, target_dentry); } rc = cifs_do_rename(xid, source_dentry, from_name, target_dentry,
fs/smb/client/misc.c +16 -22
@@ -832,33 +832,28 @@ cifs_close_all_deferred_files(struct cifs_tcon *tcon)kfree (tmp_list); } } -void -cifs_close_deferred_file_under_dentry (struct cifs_tcon *tcon,const char *path) + +void cifs_close_deferred_file_under_dentry (struct cifs_tcon *tcon, +struct dentry *dentry) { -struct cifsFileInfo *cfile;struct file_list *tmp_list, *tmp_next_list; -void *page; -const char *full_path; +struct cifsFileInfo *cfile;LIST_HEAD (file_head); - page =alloc_dentry_path ();spin_lock (&tcon->open_file_lock);list_for_each_entry (cfile, &tcon->openFileList, tlist) { - full_path =build_path_from_dentry (cfile->dentry, page); -if (strstr (full_path, path)) { -if (delayed_work_pending (&cfile->deferred)) { -if (cancel_delayed_work (&cfile->deferred)) { -spin_lock (&CIFS_I (d_inode (cfile->dentry))->deferred_lock); -cifs_del_deferred_close (cfile); -spin_unlock (&CIFS_I (d_inode (cfile->dentry))->deferred_lock); - - tmp_list =kmalloc (sizeof (struct file_list ),GFP_ATOMIC ); -if (tmp_list ==NULL ) -break ; - tmp_list->cfile = cfile; -list_add_tail (&tmp_list->list, &file_head); - } - } +if ((cfile->dentry == dentry) && +delayed_work_pending (&cfile->deferred) && +cancel_delayed_work (&cfile->deferred)) { +spin_lock (&CIFS_I (d_inode (cfile->dentry))->deferred_lock); +cifs_del_deferred_close (cfile); +spin_unlock (&CIFS_I (d_inode (cfile->dentry))->deferred_lock); + + tmp_list =kmalloc (sizeof (struct file_list ),GFP_ATOMIC ); +if (tmp_list ==NULL ) +break ; + tmp_list->cfile = cfile; +list_add_tail (&tmp_list->list, &file_head); } }spin_unlock (&tcon->open_file_lock);
@@ -868,7 +863,6 @@ cifs_close_deferred_file_under_dentry(struct cifs_tcon *tcon, const char *path)list_del (&tmp_list->list);kfree (tmp_list); } -free_dentry_path (page); }/*
fs/smb/client/smbdirect.c +82 -50
25 lines not on this page · raw message
fs/smb/common/smbdirect/smbdirect_socket.h +29 -0
Lines of this file are not shown. View the raw message.
fs/smb/server/transport_rdma.c +125 -58
183 lines not on this page · raw message
kernel/cgroup/cgroup.c +36 -7
43 lines not on this page · raw message
mm/gup.c +41 -11
52 lines not on this page · raw message
mm/swap.c +26 -24
50 lines not on this page · raw message
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +5 -2
Lines of this file are not shown. View the raw message.
sound/usb/qcom/qc_audio_offload.c +48 -44
92 lines not on this page · raw message
tools/arch/loongarch/include/asm/inst.h +12 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_connect.c +6 -5
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/mptcp_sockopt.c +10 -6
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/pm_nl_ctl.c +7 -0
Lines of this file are not shown. View the raw message.
tools/testing/selftests/net/mptcp/userspace_pm.sh +11 -3
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.