Linux 5.13.12
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.13.12 kernel.
All users of the 5.13 kernel series must upgrade.
The updated 5.13.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.13.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/virt/kvm/locking.rst | 8 Makefile | 2 arch/arc/kernel/fpu.c | 9 arch/arm64/kvm/hyp/nvhe/mem_protect.c | 2 arch/powerpc/include/asm/interrupt.h | 3 arch/powerpc/include/asm/irq.h | 2 arch/powerpc/include/asm/ptrace.h | 16 + arch/powerpc/kernel/asm-offsets.c | 31 +- arch/powerpc/kernel/head_book3s_32.S | 2 arch/powerpc/kernel/head_booke.h | 27 -- arch/powerpc/kernel/irq.c | 7 arch/powerpc/kernel/kprobes.c | 3 arch/powerpc/kernel/sysfs.c | 2 arch/powerpc/kernel/time.c | 2 arch/powerpc/kernel/traps.c | 9 arch/powerpc/platforms/pseries/setup.c | 5 arch/powerpc/sysdev/xive/common.c | 35 ++- arch/riscv/kernel/Makefile | 2 arch/x86/events/intel/core.c | 23 +- arch/x86/events/perf_event.h | 15 + arch/x86/include/asm/kvm_host.h | 7 arch/x86/include/asm/svm.h | 2 arch/x86/kernel/apic/io_apic.c | 6 arch/x86/kernel/apic/msi.c | 11 arch/x86/kernel/cpu/resctrl/monitor.c | 27 +- arch/x86/kernel/hpet.c | 2 arch/x86/kvm/mmu/mmu.c | 28 ++ arch/x86/kvm/mmu/tdp_mmu.c | 26 +- arch/x86/kvm/svm/nested.c | 12 - arch/x86/kvm/svm/svm.c | 9 arch/x86/kvm/vmx/nested.c | 3 arch/x86/kvm/vmx/vmx.h | 2 arch/x86/tools/chkobjdump.awk | 1 block/blk-cgroup.c | 14 - drivers/acpi/nfit/core.c | 3 drivers/base/core.c | 1 drivers/block/nbd.c | 14 - drivers/firmware/efi/libstub/arm64-stub.c | 69 +++++- drivers/firmware/efi/libstub/randomalloc.c | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 12 - drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 7 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 2 drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c | 1 drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 2 drivers/gpu/drm/i915/display/intel_display.c | 34 ++ drivers/gpu/drm/i915/gvt/handlers.c | 1 drivers/gpu/drm/i915/gvt/mmio_context.c | 2 drivers/gpu/drm/i915/i915_gpu_error.c | 19 + drivers/gpu/drm/i915/i915_reg.h | 16 - drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 drivers/gpu/drm/mediatek/mtk_drm_plane.c | 60 ++--- drivers/gpu/drm/meson/meson_registers.h | 5 drivers/gpu/drm/meson/meson_viu.c | 7 drivers/i2c/busses/i2c-bcm-iproc.c | 4 drivers/i2c/i2c-dev.c | 5 drivers/iio/adc/palmas_gpadc.c | 4 drivers/iio/adc/ti-ads7950.c | 1 drivers/iio/humidity/hdc100x.c | 6 drivers/iio/imu/adis.c | 3 drivers/infiniband/hw/mlx5/cq.c | 4 drivers/infiniband/hw/mlx5/devx.c | 3 drivers/net/bareudp.c | 16 - drivers/net/dsa/hirschmann/hellcreek.c | 7 drivers/net/dsa/lan9303-core.c | 34 +- drivers/net/dsa/lantiq_gswip.c | 14 - drivers/net/dsa/microchip/ksz8795.c | 82 +++++-- drivers/net/dsa/microchip/ksz8795_reg.h | 4 drivers/net/dsa/microchip/ksz_common.h | 9 drivers/net/dsa/mt7530.c | 1 drivers/net/dsa/qca/ar9331.c | 73 ++++++ drivers/net/dsa/sja1105/sja1105_main.c | 4 drivers/net/ethernet/intel/iavf/iavf_main.c | 13 - drivers/net/ethernet/intel/ice/ice.h | 1 drivers/net/ethernet/intel/ice/ice_main.c | 28 +- drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 7 drivers/net/ethernet/marvell/mvpp2/mvpp2.h | 2 drivers/net/ethernet/mellanox/mlx5/core/cq.c | 1 drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 11 drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c | 5 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 33 +- drivers/net/ethernet/mellanox/mlx5/core/eq.c | 20 + drivers/net/ethernet/mellanox/mlx5/core/esw/sample.c | 1 drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 14 - drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c | 4 drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h | 2 drivers/net/ethernet/mellanox/mlx5/core/main.c | 12 - drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h | 5 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c | 4 drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v0.c | 2 drivers/net/ethernet/ti/cpsw_new.c | 7 drivers/net/ethernet/ti/cpsw_priv.h | 4 drivers/net/ieee802154/mac802154_hwsim.c | 6 drivers/net/phy/micrel.c | 2 drivers/net/ppp/ppp_generic.c | 2 drivers/net/wwan/mhi_wwan_ctrl.c | 12 - drivers/nvdimm/namespace_devs.c | 17 - drivers/pci/msi.c | 125 ++++++----- drivers/pinctrl/intel/pinctrl-tigerlake.c | 26 +- drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 8 drivers/pinctrl/pinctrl-k210.c | 26 +- drivers/pinctrl/sunxi/pinctrl-sunxi.c | 8 drivers/platform/x86/pcengines-apuv2.c | 2 drivers/scsi/lpfc/lpfc_init.c | 3 drivers/usb/dwc3/gadget.c | 18 - drivers/vdpa/mlx5/net/mlx5_vnet.c | 3 drivers/xen/events/events_base.c | 20 + fs/ceph/caps.c | 17 + fs/ceph/mds_client.c | 25 +- fs/ceph/snap.c | 54 +++- fs/ceph/super.h | 2 fs/cifs/cifsglob.h | 5 fs/cifs/dir.c | 2 fs/cifs/file.c | 35 +-- fs/cifs/inode.c | 19 + fs/cifs/misc.c | 50 +++- fs/cifs/smb2pdu.c | 2 fs/io-wq.c | 26 +- fs/io_uring.c | 26 +- fs/overlayfs/file.c | 47 ++++ include/asm-generic/vmlinux.lds.h | 1 include/linux/bpf-cgroup.h | 4 include/linux/device.h | 1 include/linux/inetdevice.h | 2 include/linux/irq.h | 2 include/linux/mlx5/driver.h | 3 include/linux/msi.h | 2 include/net/psample.h | 2 include/uapi/linux/neighbour.h | 7 kernel/bpf/hashtab.c | 4 kernel/bpf/helpers.c | 4 kernel/cgroup/rstat.c | 19 - kernel/irq/chip.c | 5 kernel/irq/msi.c | 13 - kernel/irq/timings.c | 5 kernel/locking/rtmutex.c | 2 kernel/seccomp.c | 2 lib/devmem_is_allowed.c | 2 mm/slub.c | 4 net/bridge/br.c | 3 net/bridge/br_fdb.c | 11 net/bridge/br_if.c | 2 net/bridge/br_private.h | 2 net/bridge/netfilter/nf_conntrack_bridge.c | 6 net/core/link_watch.c | 5 net/ieee802154/socket.c | 7 net/ipv4/igmp.c | 21 + net/ipv4/tcp_bbr.c | 2 net/sched/act_mirred.c | 3 net/smc/af_smc.c | 2 net/smc/smc_core.c | 4 net/smc/smc_core.h | 4 net/smc/smc_llc.c | 10 net/smc/smc_tx.c | 18 + net/smc/smc_wr.c | 10 net/vmw_vsock/virtio_transport.c | 7 sound/soc/amd/acp-pcm-dma.c | 2 sound/soc/amd/raven/acp3x-pcm-dma.c | 2 sound/soc/amd/renoir/acp3x-pdm-dma.c | 2 sound/soc/codecs/cs42l42.c | 83 ++++--- sound/soc/codecs/cs42l42.h | 3 sound/soc/codecs/tlv320aic31xx.c | 10 sound/soc/intel/atom/sst-mfld-platform-pcm.c | 3 sound/soc/kirkwood/kirkwood-dma.c | 26 +- sound/soc/sof/intel/Kconfig | 4 sound/soc/sof/intel/hda-ipc.c | 4 sound/soc/uniphier/aio-dma.c | 2 sound/soc/xilinx/xlnx_formatter_pcm.c | 4 tools/lib/bpf/btf.c | 3 tools/lib/bpf/libbpf_probes.c | 4 tools/testing/selftests/sgx/sigstruct.c | 41 +-- 171 files changed, 1392 insertions(+), 657 deletions(-)
Alex Deucher (2):
drm/amdgpu: don't enable baco on boco platforms in runpm drm/amdgpu: handle VCN instances when harvesting (v2)
Alex Vesker (1):
net/mlx5: DR, Add fail on error check on decap
Andre Przywara (1):
pinctrl: sunxi: Don't underestimate number of functions
Andy Shevchenko (1):
pinctrl: tigerlake: Fix GPIO mapping for newer version of software
Anirudh Venkataramanan (2):
ice: Prevent probing virtual functions
ice: Stop processing VF messages during teardown
Ankit Nautiyal (1):
drm/i915/display: Fix the 12 BPC bits for PIPE_MISC reg
Anson Jacob (1):
drm/amd/display: use GFP_ATOMIC in amdgpu_dm_irq_schedule_work
Antti Keränen (1):
iio: adis: set GPIO reset pin direction
Ard Biesheuvel (3):
efi/libstub: arm64: Force Image reallocation if BSS was not reserved efi/libstub: arm64: Relax 2M alignment again for relocatable kernels efi/libstub: arm64: Double check image alignment at entry
Aya Levin (2):
net/mlx5: Block switchdev mode while devlink traps are active net/mlx5: Fix return value from tracer initialization
Babu Moger (1):
x86/resctrl: Fix default monitoring groups reporting
Ben Dai (1):
genirq/timings: Prevent potential array overflow in __irq_timings_store()
Ben Hutchings (8):
net: phy: micrel: Fix link detection on ksz87xx switch"
net: dsa: microchip: Fix ksz_read64()
net: dsa: microchip: ksz8795: Fix PVID tag insertion
net: dsa: microchip: ksz8795: Reject unsupported VLAN configuration
net: dsa: microchip: ksz8795: Fix VLAN untagged flag change on deletion
net: dsa: microchip: ksz8795: Use software untagging on CPU port
net: dsa: microchip: ksz8795: Fix VLAN filtering
net: dsa: microchip: ksz8795: Don't use phy_port_cnt in VLAN table lookup
Benjamin Herrenschmidt (1):
arm64: efi: kaslr: Fix occasional random alloc (and boot) failure
Bixuan Cui (1):
genirq/msi: Ensure deactivation on teardown
Brett Creeley (1):
ice: don't remove netdev->dev_addr from uc sync list
Changbin Du (1):
riscv: kexec: do not add '-mno-relax' flag if compiler doesn't support it
Chris Lesiak (1):
iio: humidity: hdc100x: Add margin to the conversion time
Chris Mi (1):
net/mlx5e: TC, Fix error handling memory leak
Christian Hewitt (1):
drm/meson: fix colour distortion from HDR set during vendor u-boot
Christophe JAILLET (1):
drm/amd/pm: Fix a memory leak in an error handling path in 'vangogh_tables_init()'
Christophe Leroy (5):
powerpc/interrupt: Fix OOPS by not calling do_IRQ() from timer_interrupt() powerpc/interrupt: Do not call single_step_exception() from other exceptions powerpc/32s: Fix napping restore in data storage interrupt (DSI) powerpc/smp: Fix OOPS in topology_init()
powerpc/32: Fix critical and debug interrupts on BOOKE
Colin Ian King (1):
iio: adc: Fix incorrect exit of for-loop
Cédric Le Goater (1):
powerpc/xive: Do not skip CPU-less nodes when creating the IPIs
DENG Qingfang (1):
net: dsa: mt7530: add the missing RxUnicast MIB counter
Damien Le Moal (1):
pinctrl: k210: Fix k210_fpioa_probe()
Dan Williams (2):
ACPI: NFIT: Fix support for virtual SPA ranges libnvdimm/region: Fix label activation vs errors
Daniel Xu (1):
libbpf: Do not close un-owned FD 0 on errors
David Brazdil (1):
KVM: arm64: Fix off-by-one in range_is_memory
Dhananjay Phadke (1):
i2c: iproc: fix race between client unreg and tasklet
Dongliang Mu (2):
ieee802154: hwsim: fix GPF in hwsim_set_edge_lqi
ieee802154: hwsim: fix GPF in hwsim_new_edge_nl
Eric Bernstein (1):
drm/amd/display: Remove invalid assert for ODM + MPC case
Eric Dumazet (2):
net: igmp: fix data-race in igmp_ifc_timer_expire()
net: igmp: increase size of mr_ifc_count
Ewan D. Milne (1):
scsi: lpfc: Move initialization of phba->poll_list earlier to avoid crash
Greg Kroah-Hartman (3):
Revert "usb: dwc3: gadget: Use list_replace_init() before traversing lists"
i2c: dev: zero out array used for i2c reads from userspace Linux 5.13.12
Grygorii Strashko (1):
net: ethernet: ti: cpsw: fix min eth packet size for non-switch use-cases
Guennadi Liakhovetski (1):
ASoC: SOF: Intel: hda-ipc: fix reply size checking
Guillaume Nault (1):
bareudp: Fix invalid read beyond skb's linear data
Guvenc Gulce (1):
net/smc: Correct smc link connection counter in case of smc client
Hangbin Liu (1):
net: sched: act_mirred: Reset ct info when mirror/redirect skb
Hans de Goede (1):
platform/x86: pcengines-apuv2: Add missing terminating entries to gpio-lookup tables
Hao Xu (2):
io-wq: fix bug of creating io-wokers unconditionally
io-wq: fix IO_WORKER_F_FIXED issue in create_io_worker()
Hsin-Yi Wang (1):
pinctrl: mediatek: Fix fallback behavior for bias_set_combo
Hsuan-Chi Kuo (1):
seccomp: Fix setting loaded filter count during TSYNC
Jeff Layton (3):
ceph: add some lockdep assertions around snaprealm handling
ceph: clean up locking annotation for ceph_get_snap_realm and __lookup_snap_realm
ceph: take snap_empty_lock atomically with snaprealm refcount change
Jens Axboe (1):
io_uring: drop ctx->uring_lock before flushing work item
John Hubbard (1):
net: mvvp2: fix short frame size on s390
Kan Liang (1):
perf/x86/intel: Apply mid ACK for small core
Karsten Graul (1):
net/smc: fix wait on already cleared link
Kuan-Ying Lee (1):
kasan, slub: reset tag when printing address
Laurent Dufour (1):
powerpc/pseries: Fix update of LPAR security flavor after LPM
Leon Romanovsky (1):
net/mlx5: Don't skip subfunction cleanup in case of error in module init
Liang Wang (1):
lib: use PFN_PHYS() in devmem_is_allowed()
Loic Poulain (1):
net: wwan: mhi_wwan_ctrl: Fix possible deadlock
Longpeng(Mike) (1):
vsock/virtio: avoid potential deadlock when vsock device remove
Luis Henriques (1):
ceph: reduce contention in ceph_check_delayed_caps()
Mark Brown (1):
ASoC: tlv320aic31xx: Fix jack detection after suspend
Matt Roper (1):
drm/i915: Only access SFC_DONE when media domain is not fused off
Maxim Levitsky (2):
KVM: nSVM: avoid picking up unsupported bits from L2 in int_ctl (CVE-2021-3653)
KVM: nSVM: always intercept VMLOAD/VMSAVE when nested (CVE-2021-3656)
Maxim Mikityanskiy (1):
net/mlx5e: Destroy page pool after XDP SQ to fix use-after-free
Maximilian Heyne (1):
xen/events: Fix race in set_evtchn_to_irq
Md Fahad Iqbal Polash (1):
iavf: Set RSS LUT and key in reset handle path
Miklos Szeredi (1):
ovl: fix deadlock in splice write
Nadav Amit (1):
io_uring: clear TIF_NOTIFY_SIGNAL when running task work
Nathan Chancellor (1):
vmlinux.lds.h: Handle clang's module.{c,d}tor sections
Neal Cardwell (1):
tcp_bbr: fix u32 wrap bug in round logic if bbr_init() called after 2B packets
Nikolay Aleksandrov (1):
net: bridge: fix flags interpretation for extern learn fdb entries
Oleksij Rempel (1):
net: dsa: qca: ar9331: make proper initial port defaults
Pali Rohár (1):
ppp: Fix generating ifname when empty IFLA_IFNAME is specified
Pavel Begunkov (1):
io_uring: fix ctx-exit io_rsrc_put_work() deadlock
Pierre-Louis Bossart (1):
ASoC: SOF: Intel: Kconfig: fix SoundWire dependencies
Pu Lehui (1):
powerpc/kprobes: Fix kprobe Oops happens in booke
Randy Dunlap (1):
x86/tools: Fix objdump version check again
Richard Fitzgerald (8):
ASoC: cs42l42: Correct definition of ADC Volume control
ASoC: cs42l42: Don't allow SND_SOC_DAIFMT_LEFT_J
ASoC: cs42l42: Fix bclk calculation for mono
ASoC: cs42l42: Fix inversion of ADC Notch Switch control
ASoC: cs42l42: Remove duplicate control for WNF filter frequency
ASoC: cs42l42: PLL must be running when changing MCLK_SRC_SEL
ASoC: cs42l42: Fix LRCLK frame start edge
ASoC: cs42l42: Fix mono playback
Robin Gögge (1):
libbpf: Fix probe for BPF_PROG_TYPE_CGROUP_SOCKOPT
Rohith Surabattula (2):
cifs: Handle race conditions during rename
cifs: Call close synchronously during unlink/rename/lease break.
Roi Dayan (2):
psample: Add a fwd declaration for skbuff net/mlx5e: Avoid creating tunnel headers for local route
Ronnie Sahlberg (1):
cifs: use the correct max-length for dentry_path_raw()
Sean Christopherson (4):
KVM: VMX: Use current VMCS to query WAITPKG support for MSR emulation
KVM: nVMX: Use vmx_need_pf_intercept() when deciding if L0 wants a #PF
KVM: x86/mmu: Don't leak non-leaf SPTEs when zapping all SPTEs
KVM: x86/mmu: Protect marking SPs unsync when using TDP MMU with spinlock
Shay Drory (1):
net/mlx5: Synchronize correct IRQ when destroying CQ
Shyam Prasad N (1):
cifs: create sd context must be a multiple of 8
Solomon Chiu (1):
drm/amdgpu: Add preferred mode in modeset when freesync video mode's enabled.
Takashi Iwai (5):
ASoC: amd: Fix reference to PCM buffer address
ASoC: xilinx: Fix reference to PCM buffer address
ASoC: uniphier: Fix reference to PCM buffer address
ASoC: kirkwood: Fix reference to PCM buffer address
ASoC: intel: atom: Fix reference to PCM buffer address
Takeshi Misawa (1):
net: Fix memory leak in ieee802154_raw_deliver
Tatsuhiko Yasumatsu (1):
bpf: Fix integer overflow involving bucket_size
Tejun Heo (1):
cgroup: rstat: fix A-A deadlock on 32bit around u64_stats_sync
Thomas Gleixner (11):
genirq: Provide IRQCHIP_AFFINITY_PRE_STARTUP x86/msi: Force affinity setup before startup x86/ioapic: Force affinity setup before startup PCI/MSI: Enable and mask MSI-X early
PCI/MSI: Mask all unused MSI-X entries
PCI/MSI: Enforce that MSI-X table entry is masked for update PCI/MSI: Enforce MSI[X] entry updates to be visible PCI/MSI: Do not set invalid bits in MSI mask PCI/MSI: Correct misleading comments
PCI/MSI: Use msi_mask_irq() in pci_msi_shutdown() PCI/MSI: Protect msi_desc::masked for multi-MSI
Tianjia Zhang (1):
selftests/sgx: Fix Q1 and Q2 calculation in sigstruct.c
Uwe Kleine-König (1):
iio: adc: ti-ads7950: Ensure CS is deasserted after reading channels
Vineet Gupta (1):
ARC: fp: set FPU_STATUS.FWE to enable FPU_STATUS update on context switch
Vladimir Oltean (4):
net: dsa: hellcreek: fix broken backpressure in .port_fdb_dump
net: dsa: lan9303: fix broken backpressure in .port_fdb_dump
net: dsa: lantiq: fix broken backpressure in .port_fdb_dump
net: dsa: sja1105: fix broken backpressure in .port_fdb_dump
Willy Tarreau (1):
net: linkwatch: fix failure to restore device state across suspend/resume
Xie Yongji (1):
nbd: Aovid double completion of a request
Yajun Deng (1):
netfilter: nf_conntrack_bridge: Fix memory leak when error
Yang Yingliang (1):
net: bridge: fix memleak in br_add_if()
Yonghong Song (1):
bpf: Fix potentially incorrect results with bpf_get_local_storage()
Zhen Lei (1):
locking/rtmutex: Use the correct rtmutex debugging config option
Zhenyu Wang (1):
drm/i915/gvt: Fix cached atomics setting for Windows VM
jason-jh.lin (1):
drm/mediatek: Fix cursor plane no update
Greg Kroah-Hartman
maintainerDocumentation/virt/kvm/locking.rst +4 -4
@@ -20,10 +20,10 @@ On x86: - vcpu->mutex is taken outside kvm->arch.hyperv.hv_lock -- kvm->arch.mmu_lock is an rwlock. kvm->arch.tdp_mmu_pages_lock is - taken inside kvm->arch.mmu_lock, and cannot be taken without already - holding kvm->arch.mmu_lock (typically with ``read_lock``, otherwise - there's no need to take kvm->arch.tdp_mmu_pages_lock at all). +- kvm->arch.mmu_lock is an rwlock. kvm->arch.tdp_mmu_pages_lock and + kvm->arch.mmu_unsync_pages_lock are taken inside kvm->arch.mmu_lock, and + cannot be taken without already holding kvm->arch.mmu_lock (typically with + ``read_lock`` for the TDP MMU, thus the need for additional spinlocks). Everything else is a leaf: no other lock is taken inside the critical sections.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 13 -SUBLEVEL = 11 +SUBLEVEL = 12 EXTRAVERSION = NAME = Opossums on Parade
arch/arc/kernel/fpu.c +6 -3
@@ -57,23 +57,26 @@ void fpu_save_restore(struct task_struct *prev, struct task_struct *next)void fpu_init_task (struct pt_regs *regs) { +const unsigned int fwe =0x80000000 ; +/* default rounding mode */ write_aux_reg (ARC_REG_FPU_CTRL ,0x100 ); -/* set "Write enable" to allow explicit write to exception flags */ -write_aux_reg (ARC_REG_FPU_STATUS ,0x80000000 ); +/* Initialize to zero: setting requires FWE be set */ +write_aux_reg (ARC_REG_FPU_STATUS , fwe); }void fpu_save_restore (struct task_struct *prev,struct task_struct *next) {struct arc_fpu *save = &prev->thread.fpu;struct arc_fpu *restore = &next->thread.fpu; +const unsigned int fwe =0x80000000 ; save->ctrl =read_aux_reg (ARC_REG_FPU_CTRL ); save->status =read_aux_reg (ARC_REG_FPU_STATUS );write_aux_reg (ARC_REG_FPU_CTRL , restore->ctrl); -write_aux_reg (ARC_REG_FPU_STATUS , restore->status); +write_aux_reg (ARC_REG_FPU_STATUS , (fwe | restore->status)); }#endif
arch/arm64/kvm/hyp/nvhe/mem_protect.c +1 -1
@@ -190,7 +190,7 @@ static bool range_is_memory(u64 start, u64 end) {struct kvm_mem_range r1, r2; -if (!find_mem_range (start, &r1) || !find_mem_range (end, &r2)) +if (!find_mem_range (start, &r1) || !find_mem_range (end -1 , &r2))return false;if (r1.start != r2.start)return false;
arch/powerpc/include/asm/interrupt.h +3 -0
@@ -531,6 +531,9 @@ DECLARE_INTERRUPT_HANDLER_NMI(hmi_exception_realmode);DECLARE_INTERRUPT_HANDLER_ASYNC (TAUException); +/* irq.c */ +DECLARE_INTERRUPT_HANDLER_ASYNC (do_IRQ); +void __noreturn unrecoverable_exception (struct pt_regs *regs);void replay_system_reset (void );
arch/powerpc/include/asm/irq.h +1 -1
@@ -53,7 +53,7 @@ extern void *mcheckirq_ctx[NR_CPUS];extern void *hardirq_ctx[NR_CPUS ];extern void *softirq_ctx[NR_CPUS ]; -extern void do_IRQ (struct pt_regs *regs); +void __do_IRQ (struct pt_regs *regs);extern void __init init_IRQ (void );extern void __do_irq (struct pt_regs *regs);
arch/powerpc/include/asm/ptrace.h +16 -0
@@ -68,6 +68,22 @@ struct pt_regs };unsigned long __pad[4 ];/* Maintain 16 byte interrupt stack alignment */ }; +#if defined(CONFIG_PPC32 ) && defined(CONFIG_BOOKE ) +struct {/* Must be a multiple of 16 bytes */ +unsigned long mas0; +unsigned long mas1; +unsigned long mas2; +unsigned long mas3; +unsigned long mas6; +unsigned long mas7; +unsigned long srr0; +unsigned long srr1; +unsigned long csrr0; +unsigned long csrr1; +unsigned long dsrr0; +unsigned long dsrr1; + }; +#endif };#endif
arch/powerpc/kernel/asm-offsets.c +14 -17
@@ -348,24 +348,21 @@ int main(void)#endif -#if defined(CONFIG_PPC32 ) -#if defined(CONFIG_BOOKE ) || defined(CONFIG_40x) -DEFINE (EXC_LVL_SIZE ,STACK_EXC_LVL_FRAME_SIZE ); -DEFINE (MAS0 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas0)); +#if defined(CONFIG_PPC32 ) && defined(CONFIG_BOOKE ) +STACK_PT_REGS_OFFSET (MAS0 , mas0);/* we overload MMUCR for 44x on MAS0 since they are mutually exclusive */ -DEFINE (MMUCR ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas0)); -DEFINE (MAS1 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas1)); -DEFINE (MAS2 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas2)); -DEFINE (MAS3 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas3)); -DEFINE (MAS6 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas6)); -DEFINE (MAS7 ,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , mas7)); -DEFINE (_SRR0,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , srr0)); -DEFINE (_SRR1,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , srr1)); -DEFINE (_CSRR0,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , csrr0)); -DEFINE (_CSRR1,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , csrr1)); -DEFINE (_DSRR0,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , dsrr0)); -DEFINE (_DSRR1,STACK_INT_FRAME_SIZE +offsetof(struct exception_regs , dsrr1)); -#endif +STACK_PT_REGS_OFFSET (MMUCR , mas0); +STACK_PT_REGS_OFFSET (MAS1 , mas1); +STACK_PT_REGS_OFFSET (MAS2 , mas2); +STACK_PT_REGS_OFFSET (MAS3 , mas3); +STACK_PT_REGS_OFFSET (MAS6 , mas6); +STACK_PT_REGS_OFFSET (MAS7 , mas7); +STACK_PT_REGS_OFFSET (_SRR0, srr0); +STACK_PT_REGS_OFFSET (_SRR1, srr1); +STACK_PT_REGS_OFFSET (_CSRR0, csrr0); +STACK_PT_REGS_OFFSET (_CSRR1, csrr1); +STACK_PT_REGS_OFFSET (_DSRR0, dsrr0); +STACK_PT_REGS_OFFSET (_DSRR1, dsrr1);#endif #ifndef CONFIG_PPC64
arch/powerpc/kernel/head_book3s_32.S +1 -1
@@ -300,7 +300,7 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE) EXCEPTION_PROLOG_1 EXCEPTION_PROLOG_2 INTERRUPT_DATA_STORAGE DataAccess handle_dar_dsisr=1 prepare_transfer_to_handler - lwz r5, _DSISR(r11) + lwz r5, _DSISR(r1) andis. r0, r5, DSISR_DABRMATCH@h bne- 1f bl do_page_fault
arch/powerpc/kernel/head_booke.h +3 -24
@@ -185,20 +185,18 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)/* only on e500mc */ #define DBG_STACK_BASE dbgirq_ctx -#define EXC_LVL_FRAME_OVERHEAD (THREAD_SIZE - INT_FRAME_SIZE - EXC_LVL_SIZE) -#ifdef CONFIG_SMP #define BOOKE_LOAD_EXC_LEVEL_STACK (level) \ mfspr r8,SPRN_PIR; \ slwi r8,r8,2; \ addis r8,r8,level##_STACK_BASE@ha; \ lwz r8,level##_STACK_BASE@l(r8); \ - addi r8,r8,EXC_LVL_FRAME_OVERHEAD; + addi r8,r8,THREAD_SIZE - INT_FRAME_SIZE;#else #define BOOKE_LOAD_EXC_LEVEL_STACK (level) \ lis r8,level##_STACK_BASE@ha; \ lwz r8,level##_STACK_BASE@l(r8); \ - addi r8,r8,EXC_LVL_FRAME_OVERHEAD; + addi r8,r8,THREAD_SIZE - INT_FRAME_SIZE;#endif /*
@@ -225,7 +223,7 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)mtmsr r11; \mfspr r11,SPRN_SPRG_THREAD ;/* if from user, start at top of */ \ lwz r11, TASK_STACK - THREAD(r11); /* this thread's kernel stack */\ -addi r11,r11,EXC_LVL_FRAME_OVERHEAD ;/* allocate stack frame */ \ + addi r11,r11,THREAD_SIZE - INT_FRAME_SIZE; /* allocate stack frame */\ beq 1f; \/* COMING FROM USER MODE */ \stw r9,_CCR (r11 );/* save CR */ \
@@ -533,24 +531,5 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_EMB_HV)bl kernel_fp_unavailable_exception; \ b interrupt_return -#else /* __ASSEMBLY__ */ -struct exception_regs { -unsigned long mas0; -unsigned long mas1; -unsigned long mas2; -unsigned long mas3; -unsigned long mas6; -unsigned long mas7; -unsigned long srr0; -unsigned long srr1; -unsigned long csrr0; -unsigned long csrr1; -unsigned long dsrr0; -unsigned long dsrr1; -}; - -/* ensure this structure is always sized to a multiple of the stack alignment */ -#define STACK_EXC_LVL_FRAME_SIZE ALIGN(sizeof (struct exception_regs), 16) -#endif /* __ASSEMBLY__ */ #endif /* __HEAD_BOOKE_H__ */
arch/powerpc/kernel/irq.c +6 -1
@@ -654,7 +654,7 @@ void __do_irq(struct pt_regs *regs)trace_irq_exit (regs); } -DEFINE_INTERRUPT_HANDLER_ASYNC (do_IRQ) +void __do_IRQ (struct pt_regs *regs) {struct pt_regs *old_regs =set_irq_regs (regs);void *cursp, *irqsp, *sirqsp;
@@ -678,6 +678,11 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(do_IRQ)set_irq_regs (old_regs); } +DEFINE_INTERRUPT_HANDLER_ASYNC (do_IRQ) +{ +__do_IRQ (regs); +} +static void *__init alloc_vm_stack (void ) { return __vmalloc_node(THREAD_SIZE, THREAD_ALIGN, THREADINFO_GFP,
arch/powerpc/kernel/kprobes.c +2 -1
@@ -276,7 +276,8 @@ int kprobe_handler(struct pt_regs *regs)if (user_mode (regs))return 0 ; -if (!(regs->msr &MSR_IR ) || !(regs->msr &MSR_DR )) +if (!IS_ENABLED (CONFIG_BOOKE ) && + (!(regs->msr &MSR_IR ) || !(regs->msr &MSR_DR )))return 0 ;/*
arch/powerpc/kernel/sysfs.c +1 -1
@@ -1167,7 +1167,7 @@ static int __init topology_init(void)* CPU. For instance, the boot cpu might never be valid * for hotplugging. */ -if (smp_ops->cpu_offline_self) +if (smp_ops && smp_ops->cpu_offline_self) c->hotpluggable =1 ;#endif
arch/powerpc/kernel/time.c +1 -1
@@ -607,7 +607,7 @@ DEFINE_INTERRUPT_HANDLER_ASYNC(timer_interrupt)#if defined(CONFIG_PPC32 ) && defined(CONFIG_PPC_PMAC )if (atomic_read (&ppc_n_lost_interrupts) !=0 ) -do_IRQ (regs); +__do_IRQ (regs);#endif old_regs =set_irq_regs (regs);
arch/powerpc/kernel/traps.c +7 -2
@@ -1103,7 +1103,7 @@ DEFINE_INTERRUPT_HANDLER(RunModeException)_exception (SIGTRAP , regs,TRAP_UNK ,0 ); } -DEFINE_INTERRUPT_HANDLER (single_step_exception) +static void __single_step_exception (struct pt_regs *regs) {clear_single_step (regs);clear_br_trace (regs);
@@ -1120,6 +1120,11 @@ DEFINE_INTERRUPT_HANDLER(single_step_exception)_exception (SIGTRAP , regs,TRAP_TRACE , regs->nip); } +DEFINE_INTERRUPT_HANDLER (single_step_exception) +{ +__single_step_exception (regs); +} +/* * After we have successfully emulated an instruction, we have to * check if the instruction was being single-stepped, and if so,
@@ -1129,7 +1134,7 @@ DEFINE_INTERRUPT_HANDLER(single_step_exception)static void emulate_single_step (struct pt_regs *regs) {if (single_stepping (regs)) -single_step_exception (regs); +__single_step_exception (regs); }static inline int __parse_fpscr (unsigned long fpscr)
arch/powerpc/platforms/pseries/setup.c +3 -2
@@ -539,9 +539,10 @@ static void init_cpu_char_feature_flags(struct h_cpu_char_result *result)* H_CPU_BEHAV_FAVOUR_SECURITY_H could be set only if * H_CPU_BEHAV_FAVOUR_SECURITY is. */ -if (!(result->behaviour &H_CPU_BEHAV_FAVOUR_SECURITY )) +if (!(result->behaviour &H_CPU_BEHAV_FAVOUR_SECURITY )) {security_ftr_clear (SEC_FTR_FAVOUR_SECURITY ); -else if (result->behaviour &H_CPU_BEHAV_FAVOUR_SECURITY_H ) + pseries_security_flavor =0 ; + }else if (result->behaviour &H_CPU_BEHAV_FAVOUR_SECURITY_H ) pseries_security_flavor =1 ;else pseries_security_flavor =2 ;
arch/powerpc/sysdev/xive/common.c +24 -11
@@ -67,6 +67,7 @@ static struct irq_domain *xive_irq_domain;static struct xive_ipi_desc {unsigned int irq;char name[16 ]; +atomic_t started; } *xive_ipis;/*
@@ -1120,7 +1121,7 @@ static const struct irq_domain_ops xive_ipi_irq_domain_ops = { .alloc = xive_ipi_irq_domain_alloc, }; -static int __init xive_request_ipi (void ) +static int __init xive_init_ipis (void ) {struct fwnode_handle *fwnode;struct irq_domain *ipi_domain;
@@ -1144,10 +1145,6 @@ static int __init xive_request_ipi(void)struct xive_ipi_desc *xid = &xive_ipis[node];struct xive_ipi_alloc_info info = { node }; -/* Skip nodes without CPUs */ -if (cpumask_empty (cpumask_of_node (node))) -continue ; -/* * Map one IPI interrupt per node for all cpus of that node. * Since the HW interrupt number doesn't have any meaning,
@@ -1159,11 +1156,6 @@ static int __init xive_request_ipi(void) xid->irq = ret;snprintf (xid->name,sizeof (xid->name),"IPI-%d" , node); - - ret =request_irq (xid->irq, xive_muxed_ipi_action, -IRQF_PERCPU |IRQF_NO_THREAD , xid->name,NULL ); - -WARN (ret <0 ,"Failed to request IPI %d: %d\n" , xid->irq, ret); }return ret;
@@ -1178,6 +1170,22 @@ static int __init xive_request_ipi(void)return ret; } +static int __init xive_request_ipi (unsigned int cpu) +{ +struct xive_ipi_desc *xid = &xive_ipis[early_cpu_to_node (cpu)]; +int ret; + +if (atomic_inc_return (&xid->started) >1 ) +return 0 ; + + ret =request_irq (xid->irq, xive_muxed_ipi_action, +IRQF_PERCPU |IRQF_NO_THREAD , + xid->name,NULL ); + +WARN (ret <0 ,"Failed to request IPI %d: %d\n" , xid->irq, ret); +return ret; +} +static int xive_setup_cpu_ipi (unsigned int cpu) {unsigned int xive_ipi_irq =xive_ipi_cpu_to_irq (cpu);
@@ -1192,6 +1200,9 @@ static int xive_setup_cpu_ipi(unsigned int cpu)if (xc->hw_ipi !=XIVE_BAD_IRQ )return 0 ; +/* Register the IPI */ +xive_request_ipi (cpu); +/* Grab an IPI from the backend, this will populate xc->hw_ipi */ if (xive_ops->get_ipi (cpu, xc))return -EIO ;
@@ -1231,6 +1242,8 @@ static void xive_cleanup_cpu_ipi(unsigned int cpu, struct xive_cpu *xc)if (xc->hw_ipi ==XIVE_BAD_IRQ )return ; +/* TODO: clear IPI mapping */ +/* Mask the IPI */ xive_do_source_set_mask (&xc->ipi_data, true);
@@ -1253,7 +1266,7 @@ void __init xive_smp_probe(void) smp_ops->cause_ipi = xive_cause_ipi;/* Register the IPI */ -xive_request_ipi (); +xive_init_ipis ();/* Allocate and setup IPI for the boot CPU */ xive_setup_cpu_ipi (smp_processor_id ());
arch/riscv/kernel/Makefile +1 -1
@@ -11,7 +11,7 @@ endif CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,) ifdef CONFIG_KEXEC -AFLAGS_kexec_relocate.o := -mcmodel=medany -mno-relax +AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax) endif extra-y += head.o
arch/x86/events/intel/core.c +15 -8
@@ -2904,24 +2904,28 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)*/ static int intel_pmu_handle_irq (struct pt_regs *regs) { -struct cpu_hw_events *cpuc; +struct cpu_hw_events *cpuc =this_cpu_ptr (&cpu_hw_events); +bool late_ack =hybrid_bit (cpuc->pmu, late_ack); +bool mid_ack =hybrid_bit (cpuc->pmu, mid_ack);int loops;u64 status;int handled;int pmu_enabled; - cpuc =this_cpu_ptr (&cpu_hw_events); -/* * Save the PMU state. * It needs to be restored when leaving the handler. */ pmu_enabled = cpuc->enabled;/* -* No known reason to not always do late ACK, -* but just in case do it opt-in. +* In general, the early ACK is only applied for old platforms. +* For the big core starts from Haswell, the late ACK should be +* applied. +* For the small core after Tremont, we have to do the ACK right +* before re-enabling counters, which is in the middle of the +* NMI handler. */ -if (!x86_pmu.late_ack) +if (!late_ack && !mid_ack)apic_write (APIC_LVTPC ,APIC_DM_NMI );intel_bts_disable_local (); cpuc->enabled =0 ;
@@ -2958,6 +2962,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) goto again; done: +if (mid_ack) +apic_write (APIC_LVTPC ,APIC_DM_NMI );/* Only restore PMU state when it's active. See x86_pmu_disable(). */ cpuc->enabled = pmu_enabled;if (pmu_enabled)
@@ -2969,7 +2975,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)* have been reset. This avoids spurious NMIs on * Haswell CPUs. */ -if (x86_pmu.late_ack) +if (late_ack)apic_write (APIC_LVTPC ,APIC_DM_NMI );return handled; }
@@ -6123,7 +6129,6 @@ __init int intel_pmu_init(void)static_branch_enable (&perf_is_hybrid); x86_pmu.num_hybrid_pmus =X86_HYBRID_NUM_PMUS ; - x86_pmu.late_ack = true; x86_pmu.pebs_aliases =NULL ; x86_pmu.pebs_prec_dist = true; x86_pmu.pebs_block = true;
@@ -6161,6 +6166,7 @@ __init int intel_pmu_init(void) pmu = &x86_pmu.hybrid_pmu[X86_HYBRID_PMU_CORE_IDX ]; pmu->name ="cpu_core" ; pmu->cpu_type = hybrid_big; + pmu->late_ack = true;if (cpu_feature_enabled (X86_FEATURE_HYBRID_CPU )) { pmu->num_counters = x86_pmu.num_counters +2 ; pmu->num_counters_fixed = x86_pmu.num_counters_fixed +1 ;
@@ -6186,6 +6192,7 @@ __init int intel_pmu_init(void) pmu = &x86_pmu.hybrid_pmu[X86_HYBRID_PMU_ATOM_IDX ]; pmu->name ="cpu_atom" ; pmu->cpu_type = hybrid_small; + pmu->mid_ack = true; pmu->num_counters = x86_pmu.num_counters; pmu->num_counters_fixed = x86_pmu.num_counters_fixed; pmu->max_pebs_events = x86_pmu.max_pebs_events;
arch/x86/events/perf_event.h +15 -0
@@ -656,6 +656,10 @@ struct x86_hybrid_pmu {struct event_constraint *event_constraints;struct event_constraint *pebs_constraints;struct extra_reg *extra_regs; + + unsigned int late_ack :1, + mid_ack :1, + enabled_ack :1; }; static __always_inline struct x86_hybrid_pmu *hybrid_pmu(struct pmu *pmu)
@@ -686,6 +690,16 @@ extern struct static_key_false perf_is_hybrid; __Fp; \ })) +#define hybrid_bit (_pmu, _field) \ +({ \ + bool __Fp = x86_pmu._field; \ + \ + if (is_hybrid() && (_pmu)) \ + __Fp = hybrid_pmu(_pmu)->_field; \ + \ + __Fp; \ +}) +enum hybrid_pmu_type { hybrid_big =0x40 , hybrid_small =0x20 ,
@@ -755,6 +769,7 @@ struct x86_pmu {/* PMI handler bits */ unsigned int late_ack :1, + mid_ack :1, enabled_ack :1;/* * sysfs attrs
arch/x86/include/asm/kvm_host.h +7 -0
@@ -987,6 +987,13 @@ struct kvm_arch {struct list_head lpage_disallowed_mmu_pages;struct kvm_page_track_notifier_node mmu_sp_tracker;struct kvm_page_track_notifier_head track_notifier_head; +/* +* Protects marking pages unsync during page faults, as TDP MMU page +* faults only take mmu_lock for read. For simplicity, the unsync +* pages lock is always taken when marking pages unsync regardless of +* whether mmu_lock is held for read or write. +*/ +spinlock_t mmu_unsync_pages_lock;struct list_head assigned_dev_head;struct iommu_domain *iommu_domain;
arch/x86/include/asm/svm.h +2 -0
@@ -178,6 +178,8 @@ struct __attribute__ ((__packed__)) vmcb_control_area {#define V_IGN_TPR_SHIFT 20#define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT) +#define V_IRQ_INJECTION_BITS_MASK (V_IRQ_MASK | V_INTR_PRIO_MASK | V_IGN_TPR_MASK) +#define V_INTR_MASKING_SHIFT 24#define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT)
arch/x86/kernel/apic/io_apic.c +4 -2
@@ -1986,7 +1986,8 @@ static struct irq_chip ioapic_chip __read_mostly = { .irq_set_affinity = ioapic_set_affinity, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_get_irqchip_state = ioapic_irq_get_chip_state, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | + IRQCHIP_AFFINITY_PRE_STARTUP, };static struct irq_chip ioapic_ir_chip__read_mostly = {
@@ -1999,7 +2000,8 @@ static struct irq_chip ioapic_ir_chip __read_mostly = { .irq_set_affinity = ioapic_set_affinity, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_get_irqchip_state = ioapic_irq_get_chip_state, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | + IRQCHIP_AFFINITY_PRE_STARTUP, };static inline void init_IO_APIC_traps (void )
arch/x86/kernel/apic/msi.c +8 -3
@@ -58,11 +58,13 @@ msi_set_affinity(struct irq_data *irqd, const struct cpumask *mask, bool force)* The quirk bit is not set in this case. * - The new vector is the same as the old vector * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up) +* - The interrupt is not yet started up * - The new destination CPU is the same as the old destination CPU */ if (!irqd_msi_nomask_quirk (irqd) || cfg->vector == old_cfg.vector || old_cfg.vector ==MANAGED_IRQ_SHUTDOWN_VECTOR || + !irqd_is_started (irqd) || cfg->dest_apicid == old_cfg.dest_apicid) {irq_msi_update_msg (irqd, cfg);return ret;
@@ -150,7 +152,8 @@ static struct irq_chip pci_msi_controller = { .irq_ack = irq_chip_ack_parent, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_set_affinity = msi_set_affinity, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | + IRQCHIP_AFFINITY_PRE_STARTUP, }; int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
@@ -219,7 +222,8 @@ static struct irq_chip pci_msi_ir_controller = { .irq_mask = pci_msi_mask_irq, .irq_ack = irq_chip_ack_parent, .irq_retrigger = irq_chip_retrigger_hierarchy, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | + IRQCHIP_AFFINITY_PRE_STARTUP, };static struct msi_domain_info pci_msi_ir_domain_info = {
@@ -273,7 +277,8 @@ static struct irq_chip dmar_msi_controller = { .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_compose_msi_msg = dmar_msi_compose_msg, .irq_write_msi_msg = dmar_msi_write_msg, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | + IRQCHIP_AFFINITY_PRE_STARTUP, }; static int dmar_msi_init(struct irq_domain *domain,
arch/x86/kernel/cpu/resctrl/monitor.c +13 -14
@@ -285,15 +285,14 @@ static u64 mbm_overflow_count(u64 prev_msr, u64 cur_msr, unsigned int width)return chunks >>= shift; } -static int __mon_event_count (u32 rmid,struct rmid_read *rr) +static u64 __mon_event_count (u32 rmid,struct rmid_read *rr) {struct mbm_state *m;u64 chunks, tval; tval =__rmid_read (rmid, rr->evtid);if (tval & (RMID_VAL_ERROR |RMID_VAL_UNAVAIL )) { - rr->val = tval; -return -EINVAL ; +return tval; }switch (rr->evtid) {case QOS_L3_OCCUP_EVENT_ID :
@@ -305,12 +304,6 @@ static int __mon_event_count(u32 rmid, struct rmid_read *rr)case QOS_L3_MBM_LOCAL_EVENT_ID : m = &rr->d->mbm_local[rmid];break ; -default : -/* -* Code would never reach here because -* an invalid event id would fail the __rmid_read. -*/ -return -EINVAL ; }if (rr->first) {
@@ -361,23 +354,29 @@ void mon_event_count(void *info)struct rdtgroup *rdtgrp, *entry;struct rmid_read *rr = info;struct list_head *head; +u64 ret_val; rdtgrp = rr->rgrp; -if (__mon_event_count (rdtgrp->mon.rmid, rr)) -return ; + ret_val =__mon_event_count (rdtgrp->mon.rmid, rr);/* -* For Ctrl groups read data from child monitor groups. +* For Ctrl groups read data from child monitor groups and +* add them together. Count events which are read successfully. +* Discard the rmid_read's reporting errors. */ head = &rdtgrp->mon.crdtgrp_list;if (rdtgrp->type ==RDTCTRL_GROUP ) {list_for_each_entry (entry, head, mon.crdtgrp_list) { -if (__mon_event_count (entry->mon.rmid, rr)) -return ; +if (__mon_event_count (entry->mon.rmid, rr) ==0 ) + ret_val =0 ; } } + +/* Report error if none of rmid_reads are successful */ +if (ret_val) + rr->val = ret_val; }/*
arch/x86/kernel/hpet.c +1 -1
@@ -508,7 +508,7 @@ static struct irq_chip hpet_msi_controller __ro_after_init = { .irq_set_affinity = msi_domain_set_affinity, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_write_msi_msg = hpet_msi_write_msg, - .flags = IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_AFFINITY_PRE_STARTUP, }; static int hpet_msi_init(struct irq_domain *domain,
arch/x86/kvm/mmu/mmu.c +28 -0
@@ -2454,6 +2454,7 @@ bool mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn, bool can_unsync) {struct kvm_mmu_page *sp; +bool locked = false;if (kvm_page_track_is_active (vcpu, gfn,KVM_PAGE_TRACK_WRITE ))return true;
@@ -2465,9 +2466,34 @@ bool mmu_need_write_protect(struct kvm_vcpu *vcpu, gfn_t gfn,if (sp->unsync)continue ; +/* +* TDP MMU page faults require an additional spinlock as they +* run with mmu_lock held for read, not write, and the unsync +* logic is not thread safe. Take the spinklock regardless of +* the MMU type to avoid extra conditionals/parameters, there's +* no meaningful penalty if mmu_lock is held for write. +*/ +if (!locked) { + locked = true; +spin_lock (&vcpu->kvm->arch.mmu_unsync_pages_lock); + +/* +* Recheck after taking the spinlock, a different vCPU +* may have since marked the page unsync. A false +* positive on the unprotected check above is not +* possible as clearing sp->unsync _must_ hold mmu_lock +* for write, i.e. unsync cannot transition from 0->1 +* while this CPU holds mmu_lock for read (or write). +*/ +if (READ_ONCE (sp->unsync)) +continue ; + } +WARN_ON (sp->role.level !=PG_LEVEL_4K );kvm_unsync_page (vcpu, sp); } +if (locked) +spin_unlock (&vcpu->kvm->arch.mmu_unsync_pages_lock);/* * We need to ensure that the marking of unsync pages is visible
@@ -5514,6 +5540,8 @@ void kvm_mmu_init_vm(struct kvm *kvm) {struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker; +spin_lock_init (&kvm->arch.mmu_unsync_pages_lock); +kvm_mmu_init_tdp_mmu (kvm); node->track_write = kvm_mmu_pte_write;
arch/x86/kvm/mmu/tdp_mmu.c +16 -10
@@ -41,6 +41,7 @@ void kvm_mmu_uninit_tdp_mmu(struct kvm *kvm)if (!kvm->arch.tdp_mmu_enabled)return ; +WARN_ON (!list_empty (&kvm->arch.tdp_mmu_pages));WARN_ON (!list_empty (&kvm->arch.tdp_mmu_roots));/*
@@ -79,8 +80,6 @@ static void tdp_mmu_free_sp_rcu_callback(struct rcu_head *head)void kvm_tdp_mmu_put_root (struct kvm *kvm,struct kvm_mmu_page *root,bool shared) { -gfn_t max_gfn =1ULL << (shadow_phys_bits -PAGE_SHIFT ); -kvm_lockdep_assert_mmu_lock_held (kvm, shared);if (!refcount_dec_and_test (&root->tdp_mmu_root_count))
@@ -92,7 +91,7 @@ void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root,list_del_rcu (&root->link);spin_unlock (&kvm->arch.tdp_mmu_pages_lock); -zap_gfn_range (kvm, root,0 , max_gfn, false, false, shared); +zap_gfn_range (kvm, root,0 ,-1ull , false, false, shared);call_rcu (&root->rcu_head, tdp_mmu_free_sp_rcu_callback); }
@@ -722,8 +721,17 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root, gfn_t start, gfn_t end, bool can_yield, bool flush, bool shared) { + gfn_t max_gfn_host = 1ULL << (shadow_phys_bits - PAGE_SHIFT); +bool zap_all = (start ==0 && end >= max_gfn_host);struct tdp_iter iter; +/* +* Bound the walk at host.MAXPHYADDR, guest accesses beyond that will +* hit a #PF(RSVD) and never get to an EPT Violation/Misconfig / #NPF, +* and so KVM will never install a SPTE for such addresses. +*/ + end =min (end, max_gfn_host); +kvm_lockdep_assert_mmu_lock_held (kvm, shared);rcu_read_lock ();
@@ -742,9 +750,10 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,/* * If this is a non-last-level SPTE that covers a larger range * than should be zapped, continue, and zap the mappings at a -* lower level. +* lower level, except when zapping all SPTEs. */ -if ((iter.gfn < start || +if (!zap_all && + (iter.gfn < start || iter.gfn +KVM_PAGES_PER_HPAGE (iter.level) > end) && !is_last_spte (iter.old_spte, iter.level))continue ;
@@ -792,12 +801,11 @@ bool __kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, int as_id, gfn_t start,void kvm_tdp_mmu_zap_all (struct kvm *kvm) { -gfn_t max_gfn =1ULL << (shadow_phys_bits -PAGE_SHIFT );bool flush = false;int i;for (i =0 ; i <KVM_ADDRESS_SPACE_NUM ; i++) - flush =kvm_tdp_mmu_zap_gfn_range (kvm, i,0 , max_gfn, + flush =kvm_tdp_mmu_zap_gfn_range (kvm, i,0 ,-1ull , flush, false);if (flush)
@@ -836,7 +844,6 @@ static struct kvm_mmu_page *next_invalidated_root(struct kvm *kvm,*/ void kvm_tdp_mmu_zap_invalidated_roots (struct kvm *kvm) { -gfn_t max_gfn =1ULL << (shadow_phys_bits -PAGE_SHIFT );struct kvm_mmu_page *next_root;struct kvm_mmu_page *root;bool flush = false;
@@ -852,8 +859,7 @@ void kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm)rcu_read_unlock (); - flush =zap_gfn_range (kvm, root,0 , max_gfn, true, flush, - true); + flush =zap_gfn_range (kvm, root,0 ,-1ull , true, flush, true);/* * Put the reference acquired in
arch/x86/kvm/svm/nested.c +9 -3
@@ -149,6 +149,9 @@ void recalc_intercepts(struct vcpu_svm *svm)for (i =0 ; i <MAX_INTERCEPT ; i++) c->intercepts[i] |= g->intercepts[i]; + +vmcb_set_intercept (c,INTERCEPT_VMLOAD ); +vmcb_set_intercept (c,INTERCEPT_VMSAVE ); } static void copy_vmcb_control_area(struct vmcb_control_area *dst,
@@ -480,7 +483,10 @@ static void nested_vmcb02_prepare_save(struct vcpu_svm *svm, struct vmcb *vmcb12static void nested_vmcb02_prepare_control (struct vcpu_svm *svm) { -const u32 mask =V_INTR_MASKING_MASK |V_GIF_ENABLE_MASK |V_GIF_MASK ; +const u32 int_ctl_vmcb01_bits = +V_INTR_MASKING_MASK |V_GIF_MASK |V_GIF_ENABLE_MASK ; + +const u32 int_ctl_vmcb12_bits =V_TPR_MASK |V_IRQ_INJECTION_BITS_MASK ;/* * Filled at exit: exit_code, exit_code_hi, exit_info_1, exit_info_2,
@@ -511,8 +517,8 @@ static void nested_vmcb02_prepare_control(struct vcpu_svm *svm) svm->vcpu.arch.l1_tsc_offset + svm->nested.ctl.tsc_offset; svm->vmcb->control.int_ctl = - (svm->nested.ctl.int_ctl & ~mask) | - (svm->vmcb01.ptr->control.int_ctl & mask); + (svm->nested.ctl.int_ctl & int_ctl_vmcb12_bits) | + (svm->vmcb01.ptr->control.int_ctl & int_ctl_vmcb01_bits); svm->vmcb->control.virt_ext = svm->nested.ctl.virt_ext; svm->vmcb->control.int_vector = svm->nested.ctl.int_vector;
arch/x86/kvm/svm/svm.c +5 -4
@@ -1552,17 +1552,18 @@ static void svm_set_vintr(struct vcpu_svm *svm)static void svm_clear_vintr (struct vcpu_svm *svm) { -const u32 mask =V_TPR_MASK |V_GIF_ENABLE_MASK |V_GIF_MASK |V_INTR_MASKING_MASK ;svm_clr_intercept (svm,INTERCEPT_VINTR );/* Drop int_ctl fields related to VINTR injection. */ - svm->vmcb->control.int_ctl &= mask; + svm->vmcb->control.int_ctl &= ~V_IRQ_INJECTION_BITS_MASK ;if (is_guest_mode (&svm->vcpu)) { - svm->vmcb01.ptr->control.int_ctl &= mask; + svm->vmcb01.ptr->control.int_ctl &= ~V_IRQ_INJECTION_BITS_MASK ;WARN_ON ((svm->vmcb->control.int_ctl &V_TPR_MASK ) != (svm->nested.ctl.int_ctl &V_TPR_MASK )); - svm->vmcb->control.int_ctl |= svm->nested.ctl.int_ctl & ~mask; + + svm->vmcb->control.int_ctl |= svm->nested.ctl.int_ctl & +V_IRQ_INJECTION_BITS_MASK ; }vmcb_mark_dirty (svm->vmcb,VMCB_INTR );
arch/x86/kvm/vmx/nested.c +2 -1
@@ -5798,7 +5798,8 @@ static bool nested_vmx_l0_wants_exit(struct kvm_vcpu *vcpu,if (is_nmi (intr_info))return true;else if (is_page_fault (intr_info)) -return vcpu->arch.apf.host_apf_flags || !enable_ept; +return vcpu->arch.apf.host_apf_flags || +vmx_need_pf_intercept (vcpu);else if (is_debug (intr_info) && vcpu->guest_debug & (KVM_GUESTDBG_SINGLESTEP |KVM_GUESTDBG_USE_HW_BP ))
arch/x86/kvm/vmx/vmx.h +1 -1
@@ -538,7 +538,7 @@ static inline void decache_tsc_multiplier(struct vcpu_vmx *vmx)static inline bool vmx_has_waitpkg (struct vcpu_vmx *vmx) { -return vmx->secondary_exec_control & +return secondary_exec_controls_get (vmx) &SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE ; }
arch/x86/tools/chkobjdump.awk +1 -0
@@ -10,6 +10,7 @@ BEGIN { /^GNU objdump/ { verstr = "" + gsub(/\(.*\)/, ""); for (i = 3; i <= NF; i++) if (match($(i), "^[0-9]")) { verstr = $(i);
block/blk-cgroup.c +8 -6
@@ -774,6 +774,7 @@ static void blkcg_rstat_flush(struct cgroup_subsys_state *css, int cpu)struct blkcg_gq *parent = blkg->parent;struct blkg_iostat_set *bisc =per_cpu_ptr (blkg->iostat_cpu, cpu);struct blkg_iostat cur, delta; +unsigned long flags;unsigned int seq;/* fetch the current per-cpu values */
@@ -783,21 +784,21 @@ static void blkcg_rstat_flush(struct cgroup_subsys_state *css, int cpu) }while (u64_stats_fetch_retry (&bisc->sync, seq));/* propagate percpu delta to global */ -u64_stats_update_begin (&blkg->iostat.sync); + flags =u64_stats_update_begin_irqsave (&blkg->iostat.sync);blkg_iostat_set (&delta, &cur);blkg_iostat_sub (&delta, &bisc->last);blkg_iostat_add (&blkg->iostat.cur, &delta);blkg_iostat_add (&bisc->last, &delta); -u64_stats_update_end (&blkg->iostat.sync); +u64_stats_update_end_irqrestore (&blkg->iostat.sync, flags);/* propagate global delta to parent (unless that's root) */ if (parent && parent->parent) { -u64_stats_update_begin (&parent->iostat.sync); + flags =u64_stats_update_begin_irqsave (&parent->iostat.sync);blkg_iostat_set (&delta, &blkg->iostat.cur);blkg_iostat_sub (&delta, &blkg->iostat.last);blkg_iostat_add (&parent->iostat.cur, &delta);blkg_iostat_add (&blkg->iostat.last, &delta); -u64_stats_update_end (&parent->iostat.sync); +u64_stats_update_end_irqrestore (&parent->iostat.sync, flags); } }
@@ -832,6 +833,7 @@ static void blkcg_fill_root_iostats(void)memset (&tmp,0 ,sizeof (tmp));for_each_possible_cpu (cpu) {struct disk_stats *cpu_dkstats; +unsigned long flags; cpu_dkstats =per_cpu_ptr (bdev->bd_stats, cpu); tmp.ios[BLKG_IOSTAT_READ] +=
@@ -848,9 +850,9 @@ static void blkcg_fill_root_iostats(void) tmp.bytes[BLKG_IOSTAT_DISCARD ] += cpu_dkstats->sectors[STAT_DISCARD ] <<9 ; -u64_stats_update_begin (&blkg->iostat.sync); + flags =u64_stats_update_begin_irqsave (&blkg->iostat.sync);blkg_iostat_set (&blkg->iostat.cur, &tmp); -u64_stats_update_end (&blkg->iostat.sync); +u64_stats_update_end_irqrestore (&blkg->iostat.sync, flags); } } }
drivers/acpi/nfit/core.c +3 -0
@@ -3021,6 +3021,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;struct nd_mapping_desc *mapping; +/* range index 0 == unmapped in SPA or invalid-SPA */ +if (memdev->range_index ==0 || spa->range_index ==0 ) +continue ;if (memdev->range_index != spa->range_index)continue ;if (count >=ND_MAX_MAPPINGS ) {
drivers/base/core.c +1 -0
@@ -2809,6 +2809,7 @@ void device_initialize(struct device *dev)device_pm_init (dev);set_dev_node (dev,-1 );#ifdef CONFIG_GENERIC_MSI_IRQ +raw_spin_lock_init (&dev->msi_lock);INIT_LIST_HEAD (&dev->msi_list);#endif INIT_LIST_HEAD (&dev->links.consumers);
drivers/block/nbd.c +11 -3
@@ -805,6 +805,10 @@ static bool nbd_clear_req(struct request *req, void *data, bool reserved) {struct nbd_cmd *cmd =blk_mq_rq_to_pdu (req); +/* don't abort one completed request */ +if (blk_mq_request_completed (req)) +return true; +mutex_lock (&cmd->lock); cmd->status =BLK_STS_IOERR ;mutex_unlock (&cmd->lock);
@@ -1973,15 +1977,19 @@ static void nbd_disconnect_and_put(struct nbd_device *nbd) {mutex_lock (&nbd->config_lock);nbd_disconnect (nbd); -nbd_clear_sock (nbd); -mutex_unlock (&nbd->config_lock); +sock_shutdown (nbd);/* * Make sure recv thread has finished, so it does not drop the last * config ref and try to destroy the workqueue from inside the work -* queue. +* queue. And this also ensure that we can safely call nbd_clear_que() +* to cancel the inflight I/Os. */ if (nbd->recv_workq)flush_workqueue (nbd->recv_workq); +nbd_clear_que (nbd); + nbd->task_setup =NULL ; +mutex_unlock (&nbd->config_lock); +if (test_and_clear_bit (NBD_RT_HAS_CONFIG_REF , &nbd->config->runtime_flags))nbd_config_put (nbd);
drivers/firmware/efi/libstub/arm64-stub.c +59 -10
107 lines not on this page · raw message
drivers/firmware/efi/libstub/randomalloc.c +2 -0
@@ -30,6 +30,8 @@ static unsigned long get_entry_num_slots(efi_memory_desc_t *md, region_end =min (md->phys_addr + md->num_pages *EFI_PAGE_SIZE -1 , (u64 )ULONG_MAX ); +if (region_end < size) +return 0 ; first_slot =round_up (md->phys_addr, align); last_slot =round_down (region_end - size +1 , align);
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +9 -3
@@ -299,6 +299,9 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev) ip->major, ip->minor, ip->revision); +if (le16_to_cpu (ip->hw_id) ==VCN_HWID ) + adev->vcn.num_vcn_inst++; +for (k =0 ; k < num_base_address; k++) {/* * convert the endianness of base addresses in place,
@@ -377,7 +380,7 @@ void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev) {struct binary_header *bhdr;struct harvest_table *harvest_info; -int i; +int i, vcn_harvest_count =0 ; bhdr = (struct binary_header *)adev->mman.discovery_bin; harvest_info = (struct harvest_table *)(adev->mman.discovery_bin +
@@ -389,8 +392,7 @@ void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)switch (le32_to_cpu (harvest_info->list[i].hw_id)) {case VCN_HWID : - adev->harvest_ip_mask |=AMD_HARVEST_IP_VCN_MASK ; - adev->harvest_ip_mask |=AMD_HARVEST_IP_JPEG_MASK ; + vcn_harvest_count++;break ;case DMU_HWID : adev->harvest_ip_mask |=AMD_HARVEST_IP_DMU_MASK ;
@@ -399,6 +401,10 @@ void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)break ; } } +if (vcn_harvest_count == adev->vcn.num_vcn_inst) { + adev->harvest_ip_mask |=AMD_HARVEST_IP_VCN_MASK ; + adev->harvest_ip_mask |=AMD_HARVEST_IP_JPEG_MASK ; + } }int amdgpu_discovery_get_gfx_info (struct amdgpu_device *adev)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +2 -0
@@ -1537,6 +1537,8 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)pci_ignore_hotplug (pdev);pci_set_power_state (pdev, PCI_D3cold); drm_dev->switch_power_state =DRM_SWITCH_POWER_DYNAMIC_OFF ; + }else if (amdgpu_device_supports_boco (drm_dev)) { +/* nothing to do */ }else if (amdgpu_device_supports_baco (drm_dev)) {amdgpu_device_baco_enter (drm_dev); }
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +6 -1
@@ -9410,7 +9410,12 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm, }else if (amdgpu_freesync_vid_mode && aconnector &&is_freesync_video_mode (&new_crtc_state->mode, aconnector)) { -set_freesync_fixed_config (dm_new_crtc_state); +struct drm_display_mode *high_mode; + + high_mode =get_highest_refresh_rate_mode (aconnector, false); +if (!drm_mode_equal (&new_crtc_state->mode, high_mode)) { +set_freesync_fixed_config (dm_new_crtc_state); + } } ret =dm_atomic_get_state (state, &dm_state);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c +1 -1
@@ -584,7 +584,7 @@ static void amdgpu_dm_irq_schedule_work(struct amdgpu_device *adev, handler_data = container_of(handler_list->next, struct amdgpu_dm_irq_handler_data, list);/*allocate a new amdgpu_dm_irq_handler_data*/ - handler_data_add =kzalloc (sizeof (*handler_data),GFP_KERNEL ); + handler_data_add =kzalloc (sizeof (*handler_data),GFP_ATOMIC );if (!handler_data_add) {DRM_ERROR ("DM_IRQ: failed to allocate irq handler!\n" );return ;
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c +0 -1
@@ -1788,7 +1788,6 @@ static bool dcn30_split_stream_for_mpc_or_odm( } pri_pipe->next_odm_pipe = sec_pipe; sec_pipe->prev_odm_pipe = pri_pipe; -ASSERT (sec_pipe->top_pipe ==NULL );if (!sec_pipe->top_pipe) sec_pipe->stream_res.opp = pool->opps[pipe_idx];
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +1 -1
@@ -242,7 +242,7 @@ static int vangogh_tables_init(struct smu_context *smu)return 0 ; err3_out: -kfree (smu_table->clocks_table); +kfree (smu_table->watermarks_table); err2_out:kfree (smu_table->gpu_metrics_table); err1_out:
drivers/gpu/drm/i915/display/intel_display.c +24 -10
@@ -5424,16 +5424,18 @@ static void bdw_set_pipemisc(const struct intel_crtc_state *crtc_state)switch (crtc_state->pipe_bpp) {case 18 : - val |=PIPEMISC_DITHER_6_BPC ; + val |=PIPEMISC_6_BPC ;break ;case 24 : - val |=PIPEMISC_DITHER_8_BPC ; + val |=PIPEMISC_8_BPC ;break ;case 30 : - val |=PIPEMISC_DITHER_10_BPC ; + val |=PIPEMISC_10_BPC ;break ;case 36 : - val |=PIPEMISC_DITHER_12_BPC ; +/* Port output 12BPC defined for ADLP+ */ +if (DISPLAY_VER (dev_priv) >12 ) + val |=PIPEMISC_12_BPC_ADLP ;break ;default :MISSING_CASE (crtc_state->pipe_bpp);
@@ -5469,15 +5471,27 @@ int bdw_get_pipemisc_bpp(struct intel_crtc *crtc) tmp =intel_de_read (dev_priv,PIPEMISC (crtc->pipe)); -switch (tmp &PIPEMISC_DITHER_BPC_MASK ) { -case PIPEMISC_DITHER_6_BPC : +switch (tmp &PIPEMISC_BPC_MASK ) { +case PIPEMISC_6_BPC :return 18 ; -case PIPEMISC_DITHER_8_BPC : +case PIPEMISC_8_BPC :return 24 ; -case PIPEMISC_DITHER_10_BPC : +case PIPEMISC_10_BPC :return 30 ; -case PIPEMISC_DITHER_12_BPC : -return 36 ; +/* +* PORT OUTPUT 12 BPC defined for ADLP+. +* +* TODO: +* For previous platforms with DSI interface, bits 5:7 +* are used for storing pipe_bpp irrespective of dithering. +* Since the value of 12 BPC is not defined for these bits +* on older platforms, need to find a workaround for 12 BPC +* MIPI DSI HW readout. +*/ +case PIPEMISC_12_BPC_ADLP : +if (DISPLAY_VER (dev_priv) >12 ) +return 36 ; + fallthrough;default :MISSING_CASE (tmp);return 0 ;
drivers/gpu/drm/i915/gvt/handlers.c +1 -0
@@ -3149,6 +3149,7 @@ static int init_bdw_mmio_info(struct intel_gvt *gvt)MMIO_DFH (_MMIO (0xb100 ),D_BDW ,F_CMD_ACCESS ,NULL ,NULL );MMIO_DFH (_MMIO (0xb10c ),D_BDW ,F_CMD_ACCESS ,NULL ,NULL );MMIO_D (_MMIO (0xb110 ),D_BDW ); +MMIO_D (GEN9_SCRATCH_LNCF1 ,D_BDW_PLUS );MMIO_F (_MMIO (0x24d0 ),48 ,F_CMD_ACCESS |F_CMD_WRITE_PATCH ,0 ,0 ,D_BDW_PLUS ,NULL , force_nonpriv_write);
drivers/gpu/drm/i915/gvt/mmio_context.c +2 -0
@@ -105,6 +105,8 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = { {RCS0, COMMON_SLICE_CHICKEN2, 0xffff, true}, /* 0x7014 */ {RCS0, GEN9_CS_DEBUG_MODE1, 0xffff, false}, /* 0x20ec */ {RCS0, GEN8_L3SQCREG4, 0, false}, /* 0xb118 */ + {RCS0, GEN9_SCRATCH1, 0, false}, /* 0xb11c */ + {RCS0, GEN9_SCRATCH_LNCF1, 0, false}, /* 0xb008 */ {RCS0, GEN7_HALF_SLICE_CHICKEN1, 0xffff, true}, /* 0xe100 */ {RCS0, HALF_SLICE_CHICKEN2, 0xffff, true}, /* 0xe180 */ {RCS0, HALF_SLICE_CHICKEN3, 0xffff, true}, /* 0xe184 */
drivers/gpu/drm/i915/i915_gpu_error.c +18 -1
@@ -728,9 +728,18 @@ static void err_print_gt(struct drm_i915_error_state_buf *m,if (INTEL_GEN (m->i915) >=12 ) {int i; -for (i =0 ; i <GEN12_SFC_DONE_MAX ; i++) +for (i =0 ; i <GEN12_SFC_DONE_MAX ; i++) { +/* +* SFC_DONE resides in the VD forcewake domain, so it +* only exists if the corresponding VCS engine is +* present. +*/ +if (!HAS_ENGINE (gt->_gt,_VCS (i *2 ))) +continue ; +err_printf (m," SFC_DONE[%d]: 0x%08x\n" , i, gt->sfc_done[i]); + }err_printf (m," GAM_DONE: 0x%08x\n" , gt->gam_done); }
@@ -1586,6 +1595,14 @@ static void gt_record_regs(struct intel_gt_coredump *gt)if (INTEL_GEN (i915) >=12 ) {for (i =0 ; i <GEN12_SFC_DONE_MAX ; i++) { +/* +* SFC_DONE resides in the VD forcewake domain, so it +* only exists if the corresponding VCS engine is +* present. +*/ +if (!HAS_ENGINE (gt->_gt,_VCS (i *2 ))) +continue ; + gt->sfc_done[i] =intel_uncore_read (uncore,GEN12_SFC_DONE (i)); }
drivers/gpu/drm/i915/i915_reg.h +11 -5
@@ -6134,11 +6134,17 @@ enum {#define PIPEMISC_HDR_MODE_PRECISION (1 << 23)/* icl+ */ #define PIPEMISC_OUTPUT_COLORSPACE_YUV (1 << 11)#define PIPEMISC_PIXEL_ROUNDING_TRUNC REG_BIT(8)/* tgl+ */ -#define PIPEMISC_DITHER_BPC_MASK (7 << 5) -#define PIPEMISC_DITHER_8_BPC (0 << 5) -#define PIPEMISC_DITHER_10_BPC (1 << 5) -#define PIPEMISC_DITHER_6_BPC (2 << 5) -#define PIPEMISC_DITHER_12_BPC (3 << 5) +/* +* For Display < 13, Bits 5-7 of PIPE MISC represent DITHER BPC with +* valid values of: 6, 8, 10 BPC. +* ADLP+, the bits 5-7 represent PORT OUTPUT BPC with valid values of: +* 6, 8, 10, 12 BPC. +*/ +#define PIPEMISC_BPC_MASK (7 << 5) +#define PIPEMISC_8_BPC (0 << 5) +#define PIPEMISC_10_BPC (1 << 5) +#define PIPEMISC_6_BPC (2 << 5) +#define PIPEMISC_12_BPC_ADLP (4 << 5)/* adlp+ */ #define PIPEMISC_DITHER_ENABLE (1 << 4)#define PIPEMISC_DITHER_TYPE_MASK (3 << 2)#define PIPEMISC_DITHER_TYPE_SP (0 << 2)
drivers/gpu/drm/mediatek/mtk_drm_crtc.c +0 -3
@@ -532,13 +532,10 @@ void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, struct drm_atomic_state *state) {struct mtk_drm_crtc *mtk_crtc =to_mtk_crtc (crtc); -const struct drm_plane_helper_funcs *plane_helper_funcs = - plane->helper_private;if (!mtk_crtc->enabled)return ; - plane_helper_funcs->atomic_update (plane, state);mtk_drm_crtc_update_config (mtk_crtc, false); }
drivers/gpu/drm/mediatek/mtk_drm_plane.c +34 -26
86 lines not on this page · raw message
drivers/gpu/drm/meson/meson_registers.h +5 -0
@@ -634,6 +634,11 @@#define VPP_WRAP_OSD3_MATRIX_PRE_OFFSET2 0x3dbc#define VPP_WRAP_OSD3_MATRIX_EN_CTRL 0x3dbd +/* osd1 HDR */ +#define OSD1_HDR2_CTRL 0x38a0 +#define OSD1_HDR2_CTRL_VDIN0_HDR2_TOP_EN BIT(13) +#define OSD1_HDR2_CTRL_REG_ONLY_MAT BIT(16) +/* osd2 scaler */ #define OSD2_VSC_PHASE_STEP 0x3d00#define OSD2_VSC_INI_PHASE 0x3d01
drivers/gpu/drm/meson/meson_viu.c +6 -1
@@ -425,9 +425,14 @@ void meson_viu_init(struct meson_drm *priv)if (meson_vpu_is_compatible (priv,VPU_COMPATIBLE_GXM ) ||meson_vpu_is_compatible (priv,VPU_COMPATIBLE_GXL ))meson_viu_load_matrix (priv); -else if (meson_vpu_is_compatible (priv,VPU_COMPATIBLE_G12A )) +else if (meson_vpu_is_compatible (priv,VPU_COMPATIBLE_G12A )) {meson_viu_set_g12a_osd1_matrix (priv, RGB709_to_YUV709l_coeff, true); +/* fix green/pink color distortion from vendor u-boot */ +writel_bits_relaxed (OSD1_HDR2_CTRL_REG_ONLY_MAT | +OSD1_HDR2_CTRL_VDIN0_HDR2_TOP_EN ,0 , + priv->io_base +_REG (OSD1_HDR2_CTRL )); + }/* Initialize OSD1 fifo control register */ reg = VIU_OSD_DDR_PRIORITY_URGENT |
drivers/i2c/busses/i2c-bcm-iproc.c +2 -2
@@ -1224,14 +1224,14 @@ static int bcm_iproc_i2c_unreg_slave(struct i2c_client *slave)disable_irq (iproc_i2c->irq); +tasklet_kill (&iproc_i2c->slave_rx_tasklet); +/* disable all slave interrupts */ tmp =iproc_i2c_rd_reg (iproc_i2c,IE_OFFSET ); tmp &= ~(IE_S_ALL_INTERRUPT_MASK <<IE_S_ALL_INTERRUPT_SHIFT );iproc_i2c_wr_reg (iproc_i2c,IE_OFFSET , tmp); -tasklet_kill (&iproc_i2c->slave_rx_tasklet); -/* Erase the slave address programmed */ tmp =iproc_i2c_rd_reg (iproc_i2c,S_CFG_SMBUS_ADDR_OFFSET ); tmp &= ~BIT (S_CFG_EN_NIC_SMB_ADDR3_SHIFT );
drivers/i2c/i2c-dev.c +3 -2
@@ -141,7 +141,7 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,if (count >8192 ) count =8192 ; - tmp =kmalloc (count,GFP_KERNEL ); + tmp =kzalloc (count,GFP_KERNEL );if (tmp ==NULL )return -ENOMEM ;
@@ -150,7 +150,8 @@ static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count, ret =i2c_master_recv (client, tmp, count);if (ret >=0 ) - ret =copy_to_user (buf, tmp, count) ? -EFAULT : ret; +if (copy_to_user (buf, tmp, ret)) + ret = -EFAULT ;kfree (tmp);return ret; }
drivers/iio/adc/palmas_gpadc.c +2 -2
@@ -664,8 +664,8 @@ static int palmas_adc_wakeup_configure(struct palmas_gpadc *adc) adc_period = adc->auto_conversion_period;for (i =0 ; i <16 ; ++i) { -if (((1000 * (1 << i)) /32 ) < adc_period) -continue ; +if (((1000 * (1 << i)) /32 ) >= adc_period) +break ; }if (i >0 ) i--;
drivers/iio/adc/ti-ads7950.c +0 -1
@@ -568,7 +568,6 @@ static int ti_ads7950_probe(struct spi_device *spi) st->ring_xfer.tx_buf = &st->tx_buf[0 ]; st->ring_xfer.rx_buf = &st->rx_buf[0 ];/* len will be set later */ - st->ring_xfer.cs_change = true;spi_message_add_tail (&st->ring_xfer, &st->ring_msg);
drivers/iio/humidity/hdc100x.c +4 -2
@@ -25,6 +25,8 @@#include <linux/iio/trigger_consumer.h> #include <linux/iio/triggered_buffer.h> +#include <linux/time.h> +#define HDC100X_REG_TEMP 0x00#define HDC100X_REG_HUMIDITY 0x01
@@ -166,7 +168,7 @@ static int hdc100x_get_measurement(struct hdc100x_data *data, struct iio_chan_spec const *chan) {struct i2c_client *client = data->client; -int delay = data->adc_int_us[chan->address]; +int delay = data->adc_int_us[chan->address] +1 *USEC_PER_MSEC ;int ret;__be16 val;
@@ -316,7 +318,7 @@ static irqreturn_t hdc100x_trigger_handler(int irq, void *p)struct iio_dev *indio_dev = pf->indio_dev;struct hdc100x_data *data =iio_priv (indio_dev);struct i2c_client *client = data->client; -int delay = data->adc_int_us[0 ] + data->adc_int_us[1 ]; +int delay = data->adc_int_us[0 ] + data->adc_int_us[1 ] +2 *USEC_PER_MSEC ;int ret;/* dual read starts at temp register */
drivers/iio/imu/adis.c +1 -2
@@ -415,12 +415,11 @@ int __adis_initial_startup(struct adis *adis)int ret;/* check if the device has rst pin low */ - gpio =devm_gpiod_get_optional (&adis->spi->dev,"reset" ,GPIOD_ASIS ); + gpio =devm_gpiod_get_optional (&adis->spi->dev,"reset" ,GPIOD_OUT_HIGH );if (IS_ERR (gpio))return PTR_ERR (gpio);if (gpio) { -gpiod_set_value_cansleep (gpio,1 );msleep (10 );/* bring device out of reset */ gpiod_set_value_cansleep (gpio,0 );
drivers/infiniband/hw/mlx5/cq.c +1 -3
@@ -941,7 +941,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,u32 *cqb =NULL ;void *cqc;int cqe_size; -unsigned int irqn;int eqn;int err;
@@ -980,7 +979,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,INIT_WORK (&cq->notify_work, notify_soft_wc_handler); } - err =mlx5_vector2eqn (dev->mdev, vector, &eqn, &irqn); + err =mlx5_vector2eqn (dev->mdev, vector, &eqn);if (err) goto err_cqb;
@@ -1003,7 +1002,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, goto err_cqb;mlx5_ib_dbg (dev,"cqn 0x%x\n" , cq->mcq.cqn); - cq->mcq.irqn = irqn;if (udata) cq->mcq.tasklet_ctx.comp = mlx5_ib_cq_comp;else
drivers/infiniband/hw/mlx5/devx.c +1 -2
@@ -975,7 +975,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(struct mlx5_ib_dev *dev;int user_vector;int dev_eqn; -unsigned int irqn;int err; if (uverbs_copy_from(&user_vector, attrs,
@@ -987,7 +986,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(return PTR_ERR (c); dev =to_mdev (c->ibucontext.device); - err =mlx5_vector2eqn (dev->mdev, user_vector, &dev_eqn, &irqn); + err =mlx5_vector2eqn (dev->mdev, user_vector, &dev_eqn);if (err <0 )return err;
drivers/net/bareudp.c +11 -5
@@ -71,12 +71,18 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) family =AF_INET6 ;if (bareudp->ethertype ==htons (ETH_P_IP )) { -struct iphdr *iphdr; +__u8 ipversion; - iphdr = (struct iphdr *)(skb->data +BAREUDP_BASE_HLEN ); -if (iphdr->version ==4 ) { - proto = bareudp->ethertype; - }else if (bareudp->multi_proto_mode && (iphdr->version ==6 )) { +if (skb_copy_bits (skb,BAREUDP_BASE_HLEN , &ipversion, +sizeof (ipversion))) { + bareudp->dev->stats.rx_dropped++; + goto drop; + } + ipversion >>=4 ; + +if (ipversion ==4 ) { + proto =htons (ETH_P_IP ); + }else if (ipversion ==6 && bareudp->multi_proto_mode) { proto =htons (ETH_P_IPV6 ); }else { bareudp->dev->stats.rx_dropped++;
drivers/net/dsa/hirschmann/hellcreek.c +5 -2
@@ -912,6 +912,7 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port, {struct hellcreek *hellcreek = ds->priv;u16 entries; +int ret =0 ;size_t i;mutex_lock (&hellcreek->reg_lock);
@@ -944,12 +945,14 @@ static int hellcreek_fdb_dump(struct dsa_switch *ds, int port,if (!(entry.portmask &BIT (port)))continue ; -cb (entry.mac,0 , entry.is_static, data); + ret =cb (entry.mac,0 , entry.is_static, data); +if (ret) +break ; }mutex_unlock (&hellcreek->reg_lock); -return 0 ; +return ret; } static int hellcreek_vlan_filtering(struct dsa_switch *ds, int port,
drivers/net/dsa/lan9303-core.c +19 -15
@@ -557,12 +557,12 @@ static int lan9303_alr_make_entry_raw(struct lan9303 *chip, u32 dat0, u32 dat1)return 0 ; } -typedef void alr_loop_cb_t (struct lan9303 *chip,u32 dat0,u32 dat1, -int portmap,void *ctx); +typedef int alr_loop_cb_t (struct lan9303 *chip,u32 dat0,u32 dat1, +int portmap,void *ctx); -static void lan9303_alr_loop (struct lan9303 *chip,alr_loop_cb_t *cb,void *ctx) +static int lan9303_alr_loop (struct lan9303 *chip,alr_loop_cb_t *cb,void *ctx) { -int i; +int ret =0 , i;mutex_lock (&chip->alr_mutex); lan9303_write_switch_reg(chip, LAN9303_SWE_ALR_CMD,
@@ -582,13 +582,17 @@ static void lan9303_alr_loop(struct lan9303 *chip, alr_loop_cb_t *cb, void *ctx)LAN9303_ALR_DAT1_PORT_BITOFFS ; portmap = alrport_2_portmap[alrport]; -cb (chip, dat0, dat1, portmap, ctx); + ret =cb (chip, dat0, dat1, portmap, ctx); +if (ret) +break ;lan9303_write_switch_reg (chip,LAN9303_SWE_ALR_CMD ,LAN9303_ALR_CMD_GET_NEXT );lan9303_write_switch_reg (chip,LAN9303_SWE_ALR_CMD ,0 ); }mutex_unlock (&chip->alr_mutex); + +return ret; }static void alr_reg_to_mac (u32 dat0,u32 dat1,u8 mac[6 ])
@@ -606,18 +610,20 @@ struct del_port_learned_ctx { };/* Clear learned (non-static) entry on given port */ -static void alr_loop_cb_del_port_learned (struct lan9303 *chip,u32 dat0, -u32 dat1,int portmap,void *ctx) +static int alr_loop_cb_del_port_learned (struct lan9303 *chip,u32 dat0, +u32 dat1,int portmap,void *ctx) {struct del_port_learned_ctx *del_ctx = ctx;int port = del_ctx->port;if (((BIT (port) & portmap) ==0 ) || (dat1 &LAN9303_ALR_DAT1_STATIC )) -return ; +return 0 ;/* learned entries has only one port, we can just delete */ dat1 &= ~LAN9303_ALR_DAT1_VALID ;/* delete entry */ lan9303_alr_make_entry_raw (chip, dat0, dat1); + +return 0 ; }struct port_fdb_dump_ctx {
@@ -626,19 +632,19 @@ struct port_fdb_dump_ctx {dsa_fdb_dump_cb_t *cb; }; -static void alr_loop_cb_fdb_port_dump (struct lan9303 *chip,u32 dat0, -u32 dat1,int portmap,void *ctx) +static int alr_loop_cb_fdb_port_dump (struct lan9303 *chip,u32 dat0, +u32 dat1,int portmap,void *ctx) {struct port_fdb_dump_ctx *dump_ctx = ctx;u8 mac[ETH_ALEN ];bool is_static;if ((BIT (dump_ctx->port) & portmap) ==0 ) -return ; +return 0 ;alr_reg_to_mac (dat0, dat1, mac); is_static = !!(dat1 &LAN9303_ALR_DAT1_STATIC ); - dump_ctx->cb (mac,0 , is_static, dump_ctx->data); +return dump_ctx->cb (mac,0 , is_static, dump_ctx->data); }/* Set a static ALR entry. Delete entry if port_map is zero */
@@ -1210,9 +1216,7 @@ static int lan9303_port_fdb_dump(struct dsa_switch *ds, int port, };dev_dbg (chip->dev,"%s(%d)\n" , __func__, port); -lan9303_alr_loop (chip, alr_loop_cb_fdb_port_dump, &dump_ctx); - -return 0 ; +return lan9303_alr_loop (chip, alr_loop_cb_fdb_port_dump, &dump_ctx); } static int lan9303_port_mdb_prepare(struct dsa_switch *ds, int port,
drivers/net/dsa/lantiq_gswip.c +10 -4
@@ -1404,11 +1404,17 @@ static int gswip_port_fdb_dump(struct dsa_switch *ds, int port, addr[1 ] = mac_bridge.key[2 ] &0xff ; addr[0 ] = (mac_bridge.key[2 ] >>8 ) &0xff ;if (mac_bridge.val[1 ] &GSWIP_TABLE_MAC_BRIDGE_STATIC ) { -if (mac_bridge.val[0 ] &BIT (port)) -cb (addr,0 , true, data); +if (mac_bridge.val[0 ] &BIT (port)) { + err =cb (addr,0 , true, data); +if (err) +return err; + } }else { -if (((mac_bridge.val[0 ] &GENMASK (7 ,4 )) >>4 ) == port) -cb (addr,0 , false, data); +if (((mac_bridge.val[0 ] &GENMASK (7 ,4 )) >>4 ) == port) { + err =cb (addr,0 , false, data); +if (err) +return err; + } } }return 0 ;
drivers/net/dsa/microchip/ksz8795.c +67 -15
165 lines not on this page · raw message
drivers/net/dsa/microchip/ksz8795_reg.h +4 -0
@@ -631,6 +631,10 @@#define REG_PORT_4_OUT_RATE_3 0xEE#define REG_PORT_5_OUT_RATE_3 0xFE +/* 88x3 specific */ + +#define REG_SW_INSERT_SRC_PVID 0xC2 +/* PME */ #define SW_PME_OUTPUT_ENABLE BIT(1)
drivers/net/dsa/microchip/ksz_common.h +3 -6
@@ -27,6 +27,7 @@ struct ksz_port_mib {struct ksz_port {u16 member;u16 vid_member; +bool remove_tag;/* Remove Tag flag set, for ksz8795 only */ int stp_state;struct phy_device phydev;
@@ -205,12 +206,8 @@ static inline int ksz_read64(struct ksz_device *dev, u32 reg, u64 *val)int ret; ret =regmap_bulk_read (dev->regmap[2 ], reg, value,2 ); -if (!ret) { -/* Ick! ToDo: Add 64bit R/W to regmap on 32bit systems */ - value[0 ] =swab32 (value[0 ]); - value[1 ] =swab32 (value[1 ]); - *val =swab64 ((u64)*value); - } +if (!ret) + *val = (u64 )value[0 ] <<32 | value[1 ];return ret; }
drivers/net/dsa/mt7530.c +1 -0
@@ -46,6 +46,7 @@ static const struct mt7530_mib_desc mt7530_mib[] = {MIB_DESC (2 ,0x48 ,"TxBytes" ),MIB_DESC (1 ,0x60 ,"RxDrop" ),MIB_DESC (1 ,0x64 ,"RxFiltering" ), +MIB_DESC (1 ,0x68 ,"RxUnicast" ),MIB_DESC (1 ,0x6c ,"RxMulticast" ),MIB_DESC (1 ,0x70 ,"RxBroadcast" ), MIB_DESC(1, 0x74, "RxAlignErr"),
drivers/net/dsa/qca/ar9331.c +72 -1
96 lines not on this page · raw message
drivers/net/dsa/sja1105/sja1105_main.c +3 -1
@@ -1625,7 +1625,9 @@ static int sja1105_fdb_dump(struct dsa_switch *ds, int port,/* We need to hide the dsa_8021q VLANs from the user. */ if (priv->vlan_state ==SJA1105_VLAN_UNAWARE ) l2_lookup.vlanid =0 ; -cb (macaddr, l2_lookup.vlanid, l2_lookup.lockeds, data); + rc =cb (macaddr, l2_lookup.vlanid, l2_lookup.lockeds, data); +if (rc) +return rc; }return 0 ; }
drivers/net/ethernet/intel/iavf/iavf_main.c +8 -5
@@ -1506,11 +1506,6 @@ static int iavf_reinit_interrupt_scheme(struct iavf_adapter *adapter)set_bit (__IAVF_VSI_DOWN, adapter->vsi.state);iavf_map_rings_to_vectors (adapter); - -if (RSS_AQ (adapter)) - adapter->aq_required |=IAVF_FLAG_AQ_CONFIGURE_RSS ; -else - err =iavf_init_rss (adapter); err:return err; }
@@ -2200,6 +2195,14 @@ static void iavf_reset_task(struct work_struct *work) goto reset_err; } +if (RSS_AQ (adapter)) { + adapter->aq_required |=IAVF_FLAG_AQ_CONFIGURE_RSS ; + }else { + err =iavf_init_rss (adapter); +if (err) + goto reset_err; + } + adapter->aq_required |=IAVF_FLAG_AQ_GET_CONFIG ; adapter->aq_required |=IAVF_FLAG_AQ_MAP_VECTORS ;
drivers/net/ethernet/intel/ice/ice.h +1 -0
@@ -226,6 +226,7 @@ enum ice_pf_state {ICE_VFLR_EVENT_PENDING ,ICE_FLTR_OVERFLOW_PROMISC ,ICE_VF_DIS , +ICE_VF_DEINIT_IN_PROGRESS ,ICE_CFG_BUSY ,ICE_SERVICE_SCHED , ICE_SERVICE_DIS,
drivers/net/ethernet/intel/ice/ice_main.c +20 -8
@@ -183,6 +183,14 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr)struct ice_netdev_priv *np =netdev_priv (netdev);struct ice_vsi *vsi = np->vsi; +/* Under some circumstances, we might receive a request to delete our +* own device address from our uc list. Because we store the device +* address in the VSI's MAC filter list, we need to ignore such +* requests and not delete our device address from this list. +*/ +if (ether_addr_equal (addr, netdev->dev_addr)) +return 0 ; +if (ice_fltr_add_mac_to_list (vsi, &vsi->tmp_unsync_list, addr,ICE_FWD_TO_VSI ))return -EINVAL ;
@@ -4014,6 +4022,11 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)struct ice_hw *hw;int i, err; +if (pdev->is_virtfn) { +dev_err (dev,"can't probe a virtual function\n" ); +return -EINVAL ; + } +/* this driver uses devres, see * Documentation/driver-api/driver-model/devres.rst */
@@ -4908,7 +4921,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)return -EADDRNOTAVAIL ;if (ether_addr_equal (netdev->dev_addr, mac)) { -netdev_warn (netdev,"already using mac %pM\n" , mac); +netdev_dbg (netdev,"already using mac %pM\n" , mac);return 0 ; }
@@ -4919,6 +4932,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)return -EBUSY ; } +netif_addr_lock_bh (netdev);/* Clean up old MAC filter. Not an error if old filter doesn't exist */ status =ice_fltr_remove_mac (vsi, netdev->dev_addr,ICE_FWD_TO_VSI );if (status && status !=ICE_ERR_DOES_NOT_EXIST ) {
@@ -4928,30 +4942,28 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)/* Add filter for new MAC. If filter exists, return success */ status =ice_fltr_add_mac (vsi, mac,ICE_FWD_TO_VSI ); -if (status ==ICE_ERR_ALREADY_EXISTS ) { +if (status ==ICE_ERR_ALREADY_EXISTS )/* Although this MAC filter is already present in hardware it's * possible in some cases (e.g. bonding) that dev_addr was * modified outside of the driver and needs to be restored back * to this value. */ -memcpy (netdev->dev_addr, mac, netdev->addr_len);netdev_dbg (netdev,"filter for MAC %pM already exists\n" , mac); -return 0 ; - } - -/* error if the new filter addition failed */ -if (status) +else if (status) +/* error if the new filter addition failed */ err = -EADDRNOTAVAIL ; err_update_filters:if (err) {netdev_err (netdev,"can't set MAC %pM. filter update failed\n" , mac); +netif_addr_unlock_bh (netdev);return err; }/* change the netdev's MAC address */ memcpy (netdev->dev_addr, mac, netdev->addr_len); +netif_addr_unlock_bh (netdev);netdev_dbg (vsi->netdev,"updated MAC address to %pM\n" , netdev->dev_addr);
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +7 -0
@@ -615,6 +615,8 @@ void ice_free_vfs(struct ice_pf *pf)struct ice_hw *hw = &pf->hw;unsigned int tmp, i; +set_bit (ICE_VF_DEINIT_IN_PROGRESS , pf->state); +if (!pf->vf)return ;
@@ -680,6 +682,7 @@ void ice_free_vfs(struct ice_pf *pf) i);clear_bit (ICE_VF_DIS , pf->state); +clear_bit (ICE_VF_DEINIT_IN_PROGRESS , pf->state);clear_bit (ICE_FLAG_SRIOV_ENA , pf->flags); }
@@ -4292,6 +4295,10 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event)struct device *dev;int err =0 ; +/* if de-init is underway, don't process messages from VF */ +if (test_bit (ICE_VF_DEINIT_IN_PROGRESS , pf->state)) +return ; + dev =ice_pf_to_dev (pf);if (ice_validate_vf_id (pf, vf_id)) { err = -EINVAL ;
drivers/net/ethernet/marvell/mvpp2/mvpp2.h +1 -1
@@ -938,7 +938,7 @@ enum mvpp22_ptp_packet_format {#define MVPP2_BM_COOKIE_POOL_OFFS 8#define MVPP2_BM_COOKIE_CPU_OFFS 24 -#define MVPP2_BM_SHORT_FRAME_SIZE 704/* frame size 128 */ +#define MVPP2_BM_SHORT_FRAME_SIZE 736/* frame size 128 */ #define MVPP2_BM_LONG_FRAME_SIZE 2240/* frame size 1664 */ #define MVPP2_BM_JUMBO_FRAME_SIZE 10432/* frame size 9856 */ /* BM short pool packet size
drivers/net/ethernet/mellanox/mlx5/core/cq.c +1 -0
@@ -134,6 +134,7 @@ int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq, cq->cqn); cq->uar = dev->priv.uar; + cq->irqn = eq->core.irqn;return 0 ;
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +9 -2
@@ -1019,12 +1019,19 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer)MLX5_NB_INIT (&tracer->nb, fw_tracer_event,DEVICE_TRACER );mlx5_eq_notifier_register (dev, &tracer->nb); -mlx5_fw_tracer_start (tracer); - + err =mlx5_fw_tracer_start (tracer); +if (err) { +mlx5_core_warn (dev,"FWTracer: Failed to start tracer %d\n" , err); + goto err_notifier_unregister; + }return 0 ; +err_notifier_unregister: +mlx5_eq_notifier_unregister (dev, &tracer->nb); +mlx5_core_destroy_mkey (dev, &tracer->buff.mkey); err_dealloc_pd:mlx5_core_dealloc_pd (dev, tracer->buff.pdn); +cancel_work_sync (&tracer->read_fw_strings_work);return err; }
drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c +5 -0
@@ -124,6 +124,11 @@ static int mlx5e_route_lookup_ipv4_get(struct mlx5e_priv *priv,if (IS_ERR (rt))return PTR_ERR (rt); +if (rt->rt_type !=RTN_UNICAST ) { + ret = -ENETUNREACH ; + goto err_rt_release; + } +if (mlx5_lag_is_multipath (mdev) && rt->rt_gw_family !=AF_INET ) { ret = -ENETUNREACH ; goto err_rt_release;
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +12 -21
@@ -1531,15 +1531,9 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv, {struct mlx5_core_dev *mdev = priv->mdev;struct mlx5_core_cq *mcq = &cq->mcq; -int eqn_not_used; -unsigned int irqn;int err;u32 i; - err =mlx5_vector2eqn (mdev, param->eq_ix, &eqn_not_used, &irqn); -if (err) -return err; - err =mlx5_cqwq_create (mdev, ¶m->wq, param->cqc, &cq->wq, &cq->wq_ctrl);if (err)
@@ -1553,7 +1547,6 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv, mcq->vector = param->eq_ix; mcq->comp = mlx5e_completion_event; mcq->event = mlx5e_cq_error_event; - mcq->irqn = irqn;for (i =0 ; i <mlx5_cqwq_get_size (&cq->wq); i++) {struct mlx5_cqe64 *cqe =mlx5_cqwq_get_wqe (&cq->wq, i);
@@ -1601,11 +1594,10 @@ static int mlx5e_create_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)void *in;void *cqc;int inlen; -unsigned int irqn_not_used;int eqn;int err; - err =mlx5_vector2eqn (mdev, param->eq_ix, &eqn, &irqn_not_used); + err =mlx5_vector2eqn (mdev, param->eq_ix, &eqn);if (err)return err;
@@ -1887,30 +1879,30 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,if (err) goto err_close_icosq; + err =mlx5e_open_rxq_rq (c, params, &cparam->rq); +if (err) + goto err_close_sqs; +if (c->xdp) { err =mlx5e_open_xdpsq (c, params, &cparam->xdp_sq,NULL , &c->rq_xdpsq, false);if (err) - goto err_close_sqs; + goto err_close_rq; } - err =mlx5e_open_rxq_rq (c, params, &cparam->rq); -if (err) - goto err_close_xdp_sq; - err =mlx5e_open_xdpsq (c, params, &cparam->xdp_sq,NULL , &c->xdpsq, true);if (err) - goto err_close_rq; + goto err_close_xdp_sq;return 0 ; -err_close_rq: -mlx5e_close_rq (&c->rq); - err_close_xdp_sq:if (c->xdp)mlx5e_close_xdpsq (&c->rq_xdpsq); +err_close_rq: +mlx5e_close_rq (&c->rq); + err_close_sqs:mlx5e_close_sqs (c);
@@ -1945,9 +1937,9 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,static void mlx5e_close_queues (struct mlx5e_channel *c) {mlx5e_close_xdpsq (&c->xdpsq); -mlx5e_close_rq (&c->rq);if (c->xdp)mlx5e_close_xdpsq (&c->rq_xdpsq); +mlx5e_close_rq (&c->rq);mlx5e_close_sqs (c);mlx5e_close_icosq (&c->icosq);mlx5e_close_icosq (&c->async_icosq);
@@ -1979,9 +1971,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,struct mlx5e_channel *c;unsigned int irq;int err; -int eqn; - err =mlx5_vector2eqn (priv->mdev, ix, &eqn, &irq); + err =mlx5_vector2irqn (priv->mdev, ix, &irq);if (err)return err;
drivers/net/ethernet/mellanox/mlx5/core/eq.c +16 -4
@@ -871,8 +871,8 @@ static int create_comp_eqs(struct mlx5_core_dev *dev)return err; } -int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn, -unsigned int *irqn) +static int vector2eqnirqn (struct mlx5_core_dev *dev,int vector,int *eqn, +unsigned int *irqn) {struct mlx5_eq_table *table = dev->priv.eq_table;struct mlx5_eq_comp *eq, *n;
@@ -881,8 +881,10 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,list_for_each_entry_safe (eq, n, &table->comp_eqs_list, list) {if (i++ == vector) { - *eqn = eq->core.eqn; - *irqn = eq->core.irqn; +if (irqn) + *irqn = eq->core.irqn; +if (eqn) + *eqn = eq->core.eqn; err =0 ;break ; }
@@ -890,8 +892,18 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,return err; } + +int mlx5_vector2eqn (struct mlx5_core_dev *dev,int vector,int *eqn) +{ +return vector2eqnirqn (dev, vector, eqn,NULL ); +}EXPORT_SYMBOL (mlx5_vector2eqn); +int mlx5_vector2irqn (struct mlx5_core_dev *dev,int vector,unsigned int *irqn) +{ +return vector2eqnirqn (dev, vector,NULL , irqn); +} +unsigned int mlx5_comp_vectors_count (struct mlx5_core_dev *dev) {return dev->priv.eq_table->num_comp_eqs;
drivers/net/ethernet/mellanox/mlx5/core/esw/sample.c +1 -0
@@ -501,6 +501,7 @@ mlx5_esw_sample_offload(struct mlx5_esw_psample *esw_psample, err_offload_rule:mlx5_esw_vporttbl_put (esw, &per_vport_tbl_attr); err_default_tbl: +kfree (sample_flow);return ERR_PTR (err); }
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +11 -3
@@ -48,6 +48,7 @@#include "lib/fs_chains.h" #include "en_tc.h" #include "en/mapping.h" +#include "devlink.h" #define mlx5_esw_for_each_rep (esw, i, rep) \ xa_for_each(&((esw)->offloads.vport_reps), i, rep)
@@ -2984,12 +2985,19 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,if (cur_mlx5_mode == mlx5_mode) goto unlock; -if (mode ==DEVLINK_ESWITCH_MODE_SWITCHDEV ) +if (mode ==DEVLINK_ESWITCH_MODE_SWITCHDEV ) { +if (mlx5_devlink_trap_get_num_active (esw->dev)) { +NL_SET_ERR_MSG_MOD (extack, +"Can't change mode while devlink traps are active" ); + err = -EOPNOTSUPP ; + goto unlock; + } err =esw_offloads_start (esw, extack); -else if (mode ==DEVLINK_ESWITCH_MODE_LEGACY ) + }else if (mode ==DEVLINK_ESWITCH_MODE_LEGACY ) { err =esw_offloads_stop (esw, extack); -else + }else { err = -EINVAL ; + } unlock:mlx5_esw_unlock (esw);
drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c +1 -3
@@ -417,7 +417,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size)struct mlx5_wq_param wqp;struct mlx5_cqe64 *cqe;int inlen, err, eqn; -unsigned int irqn;void *cqc, *in;__be64 *pas;u32 i;
@@ -446,7 +445,7 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) goto err_cqwq; } - err =mlx5_vector2eqn (mdev,smp_processor_id (), &eqn, &irqn); + err =mlx5_vector2eqn (mdev,smp_processor_id (), &eqn);if (err) {kvfree (in); goto err_cqwq;
@@ -476,7 +475,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) *conn->cq.mcq.arm_db =0 ; conn->cq.mcq.vector =0 ; conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete; - conn->cq.mcq.irqn = irqn; conn->cq.mcq.uar = fdev->conn_res.uar;tasklet_setup (&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet);
drivers/net/ethernet/mellanox/mlx5/core/lib/eq.h +2 -0
@@ -103,4 +103,6 @@ void mlx5_core_eq_free_irqs(struct mlx5_core_dev *dev);struct cpu_rmap *mlx5_eq_table_get_rmap (struct mlx5_core_dev *dev);#endif +int mlx5_vector2irqn (struct mlx5_core_dev *dev,int vector,unsigned int *irqn); +#endif
drivers/net/ethernet/mellanox/mlx5/core/main.c +4 -8
@@ -1781,16 +1781,14 @@ static int __init init(void)if (err) goto err_sf; -#ifdef CONFIG_MLX5_CORE_EN err =mlx5e_init (); -if (err) { -pci_unregister_driver (&mlx5_core_driver); - goto err_debug; - } -#endif +if (err) + goto err_en;return 0 ; +err_en: +mlx5_sf_driver_unregister (); err_sf:pci_unregister_driver (&mlx5_core_driver); err_debug:
@@ -1800,9 +1798,7 @@ static int __init init(void) static void __exit cleanup(void) { -#ifdef CONFIG_MLX5_CORE_EN mlx5e_cleanup (); -#endif mlx5_sf_driver_unregister ();pci_unregister_driver (&mlx5_core_driver);mlx5_unregister_debugfs ();
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +5 -0
@@ -223,8 +223,13 @@ int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,int mlx5_fw_version_query (struct mlx5_core_dev *dev,u32 *running_ver,u32 *stored_ver); +#ifdef CONFIG_MLX5_CORE_EN int mlx5e_init (void );void mlx5e_cleanup (void ); +#else +static inline int mlx5e_init (void ){return 0 ; } +static inline void mlx5e_cleanup (void ){} +#endif static inline bool mlx5_sriov_is_enabled (struct mlx5_core_dev *dev) {
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c +1 -3
@@ -749,7 +749,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,struct mlx5_cqe64 *cqe;struct mlx5dr_cq *cq;int inlen, err, eqn; -unsigned int irqn;void *cqc, *in;__be64 *pas;int vector;
@@ -782,7 +781,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev, goto err_cqwq; vector =raw_smp_processor_id () %mlx5_comp_vectors_count (mdev); - err =mlx5_vector2eqn (mdev, vector, &eqn, &irqn); + err =mlx5_vector2eqn (mdev, vector, &eqn);if (err) {kvfree (in); goto err_cqwq;
@@ -818,7 +817,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev, *cq->mcq.arm_db =cpu_to_be32 (2 <<28 ); cq->mcq.vector =0 ; - cq->mcq.irqn = irqn; cq->mcq.uar = uar;return cq;
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_ste_v0.c +2 -0
@@ -352,6 +352,7 @@ static void dr_ste_v0_set_rx_decap(u8 *hw_ste_p) {MLX5_SET (ste_rx_steering_mult, hw_ste_p, tunneling_action,DR_STE_TUNL_ACTION_DECAP ); +MLX5_SET (ste_rx_steering_mult, hw_ste_p, fail_on_error,1 ); }static void dr_ste_v0_set_rx_pop_vlan (u8 *hw_ste_p)
@@ -365,6 +366,7 @@ static void dr_ste_v0_set_rx_decap_l3(u8 *hw_ste_p, bool vlan)MLX5_SET (ste_rx_steering_mult, hw_ste_p, tunneling_action,DR_STE_TUNL_ACTION_L3_DECAP );MLX5_SET (ste_modify_packet, hw_ste_p, action_description, vlan ?1 :0 ); +MLX5_SET (ste_rx_steering_mult, hw_ste_p, fail_on_error,1 ); } static void dr_ste_v0_set_rewrite_actions(u8 *hw_ste_p, u16 num_of_actions,
drivers/net/ethernet/ti/cpsw_new.c +5 -2
@@ -920,7 +920,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,struct cpdma_chan *txch;int ret, q_idx; -if (skb_padto (skb,CPSW_MIN_PACKET_SIZE )) { +if (skb_put_padto (skb,READ_ONCE (priv->tx_packet_min))) {cpsw_err (priv, tx_err,"packet pad failed\n" ); ndev->stats.tx_dropped++;return NET_XMIT_DROP ;
@@ -1100,7 +1100,7 @@ static int cpsw_ndo_xdp_xmit(struct net_device *ndev, int n,for (i =0 ; i < n; i++) { xdpf = frames[i]; -if (xdpf->len <CPSW_MIN_PACKET_SIZE ) +if (xdpf->len <READ_ONCE (priv->tx_packet_min))break ;if (cpsw_xdp_tx_frame (priv, xdpf,NULL , priv->emac_port))
@@ -1389,6 +1389,7 @@ static int cpsw_create_ports(struct cpsw_common *cpsw) priv->dev = dev; priv->msg_enable =netif_msg_init (debug_level,CPSW_DEBUG ); priv->emac_port = i +1 ; + priv->tx_packet_min =CPSW_MIN_PACKET_SIZE ;if (is_valid_ether_addr (slave_data->mac_addr)) {ether_addr_copy (priv->mac_addr, slave_data->mac_addr);
@@ -1686,6 +1687,7 @@ static int cpsw_dl_switch_mode_set(struct devlink *dl, u32 id, priv =netdev_priv (sl_ndev); slave->port_vlan = vlan; +WRITE_ONCE (priv->tx_packet_min,CPSW_MIN_PACKET_SIZE_VLAN );if (netif_running (sl_ndev))cpsw_port_add_switch_def_ale_entries (priv, slave);
@@ -1714,6 +1716,7 @@ static int cpsw_dl_switch_mode_set(struct devlink *dl, u32 id, priv =netdev_priv (slave->ndev); slave->port_vlan = slave->data->dual_emac_res_vlan; +WRITE_ONCE (priv->tx_packet_min,CPSW_MIN_PACKET_SIZE );cpsw_port_add_dual_emac_def_ale_entries (priv, slave); }
drivers/net/ethernet/ti/cpsw_priv.h +3 -1
@@ -89,7 +89,8 @@ do { \#define CPSW_POLL_WEIGHT 64#define CPSW_RX_VLAN_ENCAP_HDR_SIZE 4 -#define CPSW_MIN_PACKET_SIZE (VLAN_ETH_ZLEN) +#define CPSW_MIN_PACKET_SIZE_VLAN (VLAN_ETH_ZLEN) +#define CPSW_MIN_PACKET_SIZE (ETH_ZLEN)#define CPSW_MAX_PACKET_SIZE (VLAN_ETH_FRAME_LEN +\ ETH_FCS_LEN +\ CPSW_RX_VLAN_ENCAP_HDR_SIZE)
@@ -380,6 +381,7 @@ struct cpsw_priv {u32 emac_port;struct cpsw_common *cpsw;int offload_fwd_mark; +u32 tx_packet_min; };#define ndev_to_cpsw (ndev) (((struct cpsw_priv *)netdev_priv(ndev))->cpsw)
drivers/net/ieee802154/mac802154_hwsim.c +3 -3
@@ -418,7 +418,7 @@ static int hwsim_new_edge_nl(struct sk_buff *msg, struct genl_info *info)struct hwsim_edge *e;u32 v0, v1; -if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID ] && +if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID ] || !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE ])return -EINVAL ;
@@ -528,14 +528,14 @@ static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info)u32 v0, v1;u8 lqi; -if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID ] && +if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID ] || !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE ])return -EINVAL ;if (nla_parse_nested_deprecated (edge_attrs,MAC802154_HWSIM_EDGE_ATTR_MAX , info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE ], hwsim_edge_policy,NULL ))return -EINVAL ; -if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID ] && +if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID ] || !edge_attrs[MAC802154_HWSIM_EDGE_ATTR_LQI ])return -EINVAL ;
drivers/net/phy/micrel.c +0 -2
@@ -1406,8 +1406,6 @@ static struct phy_driver ksphy_driver[] = { .name = "Micrel KSZ87XX Switch",/* PHY_BASIC_FEATURES */ .config_init = kszphy_config_init, - .config_aneg = ksz8873mll_config_aneg, - .read_status = ksz8873mll_read_status, .match_phy_device = ksz8795_match_phy_device, .suspend = genphy_suspend, .resume = genphy_resume,
drivers/net/ppp/ppp_generic.c +1 -1
@@ -1317,7 +1317,7 @@ static int ppp_nl_newlink(struct net *src_net, struct net_device *dev,* the PPP unit identifer as suffix (i.e. ppp<unit_id>). This allows * userspace to infer the device name using to the PPPIOCGUNIT ioctl. */ -if (!tb[IFLA_IFNAME ]) +if (!tb[IFLA_IFNAME ] || !nla_len (tb[IFLA_IFNAME ]) || !*(char *)nla_data (tb[IFLA_IFNAME ])) conf.ifname_is_set = false; err =ppp_dev_configure (src_net, dev, &conf);
drivers/net/wwan/mhi_wwan_ctrl.c +6 -6
@@ -41,14 +41,14 @@ struct mhi_wwan_dev {/* Increment RX budget and schedule RX refill if necessary */ static void mhi_wwan_rx_budget_inc (struct mhi_wwan_dev *mhiwwan) { -spin_lock (&mhiwwan->rx_lock); +spin_lock_bh (&mhiwwan->rx_lock); mhiwwan->rx_budget++;if (test_bit (MHI_WWAN_RX_REFILL , &mhiwwan->flags))schedule_work (&mhiwwan->rx_refill); -spin_unlock (&mhiwwan->rx_lock); +spin_unlock_bh (&mhiwwan->rx_lock); }/* Decrement RX budget if non-zero and return true on success */
@@ -56,7 +56,7 @@ static bool mhi_wwan_rx_budget_dec(struct mhi_wwan_dev *mhiwwan) {bool ret = false; -spin_lock (&mhiwwan->rx_lock); +spin_lock_bh (&mhiwwan->rx_lock);if (mhiwwan->rx_budget) { mhiwwan->rx_budget--;
@@ -64,7 +64,7 @@ static bool mhi_wwan_rx_budget_dec(struct mhi_wwan_dev *mhiwwan) ret = true; } -spin_unlock (&mhiwwan->rx_lock); +spin_unlock_bh (&mhiwwan->rx_lock);return ret; }
@@ -130,9 +130,9 @@ static void mhi_wwan_ctrl_stop(struct wwan_port *port) {struct mhi_wwan_dev *mhiwwan =wwan_port_get_drvdata (port); -spin_lock (&mhiwwan->rx_lock); +spin_lock_bh (&mhiwwan->rx_lock);clear_bit (MHI_WWAN_RX_REFILL , &mhiwwan->flags); -spin_unlock (&mhiwwan->rx_lock); +spin_unlock_bh (&mhiwwan->rx_lock);cancel_work_sync (&mhiwwan->rx_refill);
drivers/nvdimm/namespace_devs.c +11 -6
@@ -2527,7 +2527,7 @@ static void deactivate_labels(void *region)static int init_active_labels (struct nd_region *nd_region) { -int i; +int i, rc =0 ;for (i =0 ; i < nd_region->ndr_mappings; i++) {struct nd_mapping *nd_mapping = &nd_region->mapping[i];
@@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region)else if (test_bit (NDD_LABELING , &nvdimm->flags))/* fail, labels needed to disambiguate dpa */ ;else -return 0 ; +continue ;dev_err (&nd_region->dev,"%s: is %s, failing probe\n" ,dev_name (&nd_mapping->nvdimm->dev),test_bit (NDD_LOCKED , &nvdimm->flags) ?"locked" :"disabled" ); -return -ENXIO ; + rc = -ENXIO ; + goto out; } nd_mapping->ndd = ndd;atomic_inc (&nvdimm->busy);
@@ -2586,13 +2587,17 @@ static int init_active_labels(struct nd_region *nd_region)break ; } -if (i < nd_region->ndr_mappings) { +if (i < nd_region->ndr_mappings) + rc = -ENOMEM ; + +out: +if (rc) {deactivate_labels (nd_region); -return -ENOMEM ; +return rc; }return devm_add_action_or_reset (&nd_region->dev, deactivate_labels, - nd_region); + nd_region); }int nd_region_register_namespaces (struct nd_region *nd_region,int *err)
drivers/pci/msi.c +77 -48
246 lines not on this page · raw message
drivers/pinctrl/intel/pinctrl-tigerlake.c +13 -13
@@ -701,32 +701,32 @@ static const struct pinctrl_pin_desc tglh_pins[] = {static const struct intel_padgroup tglh_community0_gpps[] = {TGL_GPP (0 ,0 ,24 ,0 ),/* GPP_A */ -TGL_GPP (1 ,25 ,44 ,128 ),/* GPP_R */ -TGL_GPP (2 ,45 ,70 ,32 ),/* GPP_B */ -TGL_GPP (3 ,71 ,78 ,INTEL_GPIO_BASE_NOMAP ),/* vGPIO_0 */ +TGL_GPP (1 ,25 ,44 ,32 ),/* GPP_R */ +TGL_GPP (2 ,45 ,70 ,64 ),/* GPP_B */ +TGL_GPP (3 ,71 ,78 ,96 ),/* vGPIO_0 */ };static const struct intel_padgroup tglh_community1_gpps[] = { -TGL_GPP (0 ,79 ,104 ,96 ),/* GPP_D */ -TGL_GPP (1 ,105 ,128 ,64 ),/* GPP_C */ -TGL_GPP (2 ,129 ,136 ,160 ),/* GPP_S */ -TGL_GPP (3 ,137 ,153 ,192 ),/* GPP_G */ -TGL_GPP (4 ,154 ,180 ,224 ),/* vGPIO */ +TGL_GPP (0 ,79 ,104 ,128 ),/* GPP_D */ +TGL_GPP (1 ,105 ,128 ,160 ),/* GPP_C */ +TGL_GPP (2 ,129 ,136 ,192 ),/* GPP_S */ +TGL_GPP (3 ,137 ,153 ,224 ),/* GPP_G */ +TGL_GPP (4 ,154 ,180 ,256 ),/* vGPIO */ };static const struct intel_padgroup tglh_community3_gpps[] = { -TGL_GPP (0 ,181 ,193 ,256 ),/* GPP_E */ -TGL_GPP (1 ,194 ,217 ,288 ),/* GPP_F */ +TGL_GPP (0 ,181 ,193 ,288 ),/* GPP_E */ +TGL_GPP (1 ,194 ,217 ,320 ),/* GPP_F */ };static const struct intel_padgroup tglh_community4_gpps[] = { -TGL_GPP (0 ,218 ,241 ,320 ),/* GPP_H */ +TGL_GPP (0 ,218 ,241 ,352 ),/* GPP_H */ TGL_GPP (1 ,242 ,251 ,384 ),/* GPP_J */ -TGL_GPP (2 ,252 ,266 ,352 ),/* GPP_K */ +TGL_GPP (2 ,252 ,266 ,416 ),/* GPP_K */ };static const struct intel_padgroup tglh_community5_gpps[] = { -TGL_GPP (0 ,267 ,281 ,416 ),/* GPP_I */ +TGL_GPP (0 ,267 ,281 ,448 ),/* GPP_I */ TGL_GPP (1 ,282 ,290 ,INTEL_GPIO_BASE_NOMAP ),/* JTAG */ };
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c +3 -5
@@ -925,12 +925,10 @@ int mtk_pinconf_adv_pull_set(struct mtk_pinctrl *hw, err = hw->soc->bias_set (hw, desc, pullup);if (err)return err; - }else if (hw->soc->bias_set_combo) { - err = hw->soc->bias_set_combo (hw, desc, pullup, arg); -if (err) -return err; }else { -return -ENOTSUPP ; + err =mtk_pinconf_bias_set_rev1 (hw, desc, pullup); +if (err) + err =mtk_pinconf_bias_set (hw, desc, pullup); } }
drivers/pinctrl/pinctrl-k210.c +20 -6
@@ -950,23 +950,37 @@ static int k210_fpioa_probe(struct platform_device *pdev)return ret; pdata->pclk =devm_clk_get_optional (dev,"pclk" ); -if (!IS_ERR (pdata->pclk)) -clk_prepare_enable (pdata->pclk); +if (!IS_ERR (pdata->pclk)) { + ret =clk_prepare_enable (pdata->pclk); +if (ret) + goto disable_clk; + } pdata->sysctl_map =syscon_regmap_lookup_by_phandle_args (np,"canaan,k210-sysctl-power" ,1 , &pdata->power_offset); -if (IS_ERR (pdata->sysctl_map)) -return PTR_ERR (pdata->sysctl_map); +if (IS_ERR (pdata->sysctl_map)) { + ret =PTR_ERR (pdata->sysctl_map); + goto disable_pclk; + }k210_fpioa_init_ties (pdata); pdata->pctl =pinctrl_register (&k210_pinctrl_desc, dev, (void *)pdata); -if (IS_ERR (pdata->pctl)) -return PTR_ERR (pdata->pctl); +if (IS_ERR (pdata->pctl)) { + ret =PTR_ERR (pdata->pctl); + goto disable_pclk; + }return 0 ; + +disable_pclk: +clk_disable_unprepare (pdata->pclk); +disable_clk: +clk_disable_unprepare (pdata->clk); + +return ret; }static const struct of_device_id k210_fpioa_dt_ids[] = {
drivers/pinctrl/sunxi/pinctrl-sunxi.c +5 -3
@@ -1219,10 +1219,12 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev) }/* -* We suppose that we won't have any more functions than pins, -* we'll reallocate that later anyway +* Find an upper bound for the maximum number of functions: in +* the worst case we have gpio_in, gpio_out, irq and up to four +* special functions per pin, plus one entry for the sentinel. +* We'll reallocate that later anyway. */ - pctl->functions =kcalloc (pctl->ngroups, + pctl->functions =kcalloc (4 * pctl->ngroups +4 ,sizeof (*pctl->functions),GFP_KERNEL );if (!pctl->functions)
drivers/platform/x86/pcengines-apuv2.c +2 -0
@@ -94,6 +94,7 @@ static struct gpiod_lookup_table gpios_led_table = { NULL, 1, GPIO_ACTIVE_LOW), GPIO_LOOKUP_IDX(AMD_FCH_GPIO_DRIVER_NAME, APU2_GPIO_LINE_LED3, NULL, 2, GPIO_ACTIVE_LOW), + {}/* Terminating entry */ } };
@@ -123,6 +124,7 @@ static struct gpiod_lookup_table gpios_key_table = { .table = { GPIO_LOOKUP_IDX(AMD_FCH_GPIO_DRIVER_NAME, APU2_GPIO_LINE_MODESW, NULL, 0, GPIO_ACTIVE_LOW), + {}/* Terminating entry */ } };
drivers/scsi/lpfc/lpfc_init.c +2 -1
@@ -13091,6 +13091,8 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)if (!phba)return -ENOMEM ; +INIT_LIST_HEAD (&phba->poll_list); +/* Perform generic PCI device enabling operation */ error =lpfc_enable_pci_dev (phba);if (error)
@@ -13225,7 +13227,6 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)/* Enable RAS FW log support */ lpfc_sli4_ras_setup (phba); -INIT_LIST_HEAD (&phba->poll_list);timer_setup (&phba->cpuhp_poll_timer, lpfc_sli4_poll_hbtimer,0 );cpuhp_state_add_instance_nocalls (lpfc_cpuhp_state, &phba->cpuhp);
drivers/usb/dwc3/gadget.c +2 -16
@@ -1741,13 +1741,9 @@ static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep) {struct dwc3_request *req;struct dwc3_request *tmp; -struct list_head local;struct dwc3 *dwc = dep->dwc; -restart: -list_replace_init (&dep->cancelled_list, &local);
Lines of this file are not shown. View the raw message.
fs/ceph/snap.c +35 -19
54 lines not on this page · raw message
fs/cifs/misc.c +39 -11
50 lines not on this page · raw message
fs/overlayfs/file.c +46 -1
47 lines not on this page · raw message
net/bridge/netfilter/nf_conntrack_bridge.c +6 -0
Lines of this file are not shown. View the raw message.
sound/soc/codecs/cs42l42.c +50 -33
83 lines not on this page · raw message
sound/soc/intel/atom/sst-mfld-platform-pcm.c +1 -2
Lines of this file are not shown. View the raw message.
tools/testing/selftests/sgx/sigstruct.c +21 -20
41 lines not on this page · 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.