5.13.13-rc1 review
Subsystems (3)
Sasha Levin
maintainercover 5.13.13-rc1 review
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.13.y
and the diffstat can be found below.
Thanks,
Sasha
-------------
Pseudo-Shortlog of commits:
Adrian Larumbe (1):
dmaengine: xilinx_dma: Fix read-after-free bug when terminating
transfers
Alan Stern (2):
USB: core: Avoid WARNings for 0-length descriptor requests
USB: core: Fix incorrect pipe calculation in do_proc_control()
Andreas Persson (1):
mtd: cfi_cmdset_0002: fix crash when erasing/writing AMD cards
Andrew Delgadillo (1):
arm64: clean vdso & vdso32 files
Andy Shevchenko (1):
ptp_pch: Restore dependency on PCI
Anshuman Gupta (1):
drm/i915: Tweaked Wa_14010685332 for all PCHs
Apurva Nandan (1):
spi: cadence-quadspi: Fix check condition for DTR ops
Arkadiusz Kubalewski (1):
i40e: Fix ATR queue selection
Arnd Bergmann (1):
mt76: fix enum type mismatch
Bing Guo (1):
drm/amd/display: Fix Dynamic bpp issue with 8K30 with Navi 1X
Bjorn Andersson (1):
clk: qcom: gdsc: Ensure regulator init state matches GDSC state
Caleb Connolly (1):
arm64: dts: qcom: sdm845-oneplus: fix reserved-mem
Christophe Kerello (1):
mmc: mmci: stm32: Check when the voltage switch procedure should be
done
Christophe Leroy (3):
powerpc/32s: Move setup_{kuep/kuap}() into {kuep/kuap}.c powerpc/32s: Refactor update of user segment registers powerpc/32s: Fix random crashes by adding isync() after
locking/unlocking KUEP
Dan Carpenter (1):
mtd: rawnand: Add a check in of_get_nand_secure_regions()
Dave Gerlach (1):
ARM: dts: am43x-epos-evm: Reduce i2c0 bus speed for tps65218
Dinghao Liu (1):
net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32
Dmitry Osipenko (1):
opp: Drop empty-table checks from _put functions
Dong Aisheng (1):
clk: imx6q: fix uart earlycon unwork
Dongliang Mu (2):
ipack: tpci200: fix many double free issues in tpci200_pci_probe
ipack: tpci200: fix memory leak in the tpci200_register
Eli Cohen (2):
vdpa/mlx5: Avoid destroying MR on empty iotlb
vdpa/mlx5: Fix queue type selection logic
Elliot Berman (1):
cfi: Use rcu_read_{un}lock_sched_notrace
Ezequiel Garcia (1):
iommu/dma: Fix leak in non-contiguous API
Frank Wunderlich (1):
iommu: Check if group is NULL before remove device
Hans de Goede (1):
usb: typec: tcpm: Fix VDMs sometimes not being forwarded to alt-mode
drivers
Harshvardhan Jha (2):
net: xfrm: Fix end of loop tests for list_for_each_entry
scsi: megaraid_mm: Fix end of loop tests for list_for_each_entry()
Hayes Wang (2):
r8152: fix writing USB_BP2_EN
r8152: fix the maximum number of PLA bp for RTL8153C
Ido Schimmel (1):
Revert "flow_offload: action should not be NULL when it is referenced"
Igor Pylypiv (1):
scsi: pm80xx: Fix TMF task completion race condition
Ilya Leoshkevich (1):
bpf: Clear zext_dst of dead insns
Ivan T. Ivanov (1):
net: usb: lan78xx: don't modify phy_device state concurrently
Jakub Kicinski (4):
bnxt: don't lock the tx queue from napi poll
bnxt: disable napi before canceling DIM
bnxt: make sure xmit_more + errors does not miss doorbells
bnxt: count Tx drops
Jaroslav Kysela (1):
ALSA: hda - fix the 'Capture Switch' value change notifications
Jason Wang (1):
virtio-net: use NETIF_F_GRO_HW instead of NETIF_F_LRO
Jeff Layton (1):
fs: warn about impending deprecation of mandatory locks
Jens Axboe (2):
io_uring: only assign io_uring_enter() SQPOLL error in actual error
case
io_uring: fix xa_alloc_cycle() error return value check
Johannes Berg (1):
mac80211: fix locking in ieee80211_restart_work()
Johannes Weiner (1):
mm: memcontrol: fix occasional OOMs due to proportional memory.low
reclaim
José Roberto de Souza (1):
drm/i915: Skip display interruption setup when display is not
available
Kai-Heng Feng (1):
ALSA: hda/realtek: Limit mic boost on HP ProBook 445 G8
Kristin Paget (1):
ALSA: hda/realtek: Enable 4-speaker output for Dell XPS 15 9510 laptop
Krzysztof Wilczyński (1):
PCI/sysfs: Use correct variable for the legacy_mem sysfs object
Lahav Schlesinger (1):
vrf: Reset skb conntrack connection on VRF rcv
Linus Torvalds (1):
pipe: avoid unnecessary EPOLLET wakeups under normal loads
Liu Yi L (1):
iommu/vt-d: Fix incomplete cache flush in
intel_pasid_tear_down_entry()
Lukas Bulwahn (1):
tracing: define needed config DYNAMIC_FTRACE_WITH_ARGS
Lukasz Luba (1):
cpufreq: arm_scmi: Fix error path when allocation failed
Manivannan Sadhasivam (1):
mtd: rawnand: Fix probe failure due to of_get_nand_secure_regions()
Marcin Bachry (1):
PCI: Increase D3 delay for AMD Renoir/Cezanne XHCI
Marco Elver (1):
kfence: fix is_kfence_address() for addresses below KFENCE_POOL_SIZE
Marek Behún (1):
cpufreq: armada-37xx: forbid cpufreq for 1.2 GHz variant
Matthieu Baerts (1):
mptcp: full fully established support after ADD_ADDR
Maxim Kochetkov (2):
soc: fsl: qe: convert QE interrupt controller to platform_device
soc: fsl: qe: fix static checker warning
Michael Chan (2):
bnxt_en: Disable aRFS if running on 212 firmware
bnxt_en: Add missing DMA memory barriers
Mike Kravetz (1):
hugetlb: don't pass page cache pages to restore_reserve_on_error
Nadav Amit (1):
io_uring: Use WRITE_ONCE() when writing to sq_flags
Naoya Horiguchi (2):
mm,hwpoison: make get_hwpoison_page() call get_any_page() mm/hwpoison: retry with shake_page() for unhandlable pages
NeilBrown (1):
btrfs: prevent rename2 from exchanging a subvol with a directory from
different parents
Nicolas Saenz Julienne (2):
mmc: sdhci-iproc: Cap min clock frequency on BCM2711
mmc: sdhci-iproc: Set SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN on BCM2711
Niklas Schnelle (1):
s390/pci: fix use after free of zpci_dev
Oleksij Rempel (1):
net: usb: asix: refactor asix_read_phy_addr() and handle errors on
return
Paolo Abeni (1):
mptcp: fix memory leak on address flush
Parav Pandit (1):
virtio: Protect vqs list access
Pavel Begunkov (1):
io_uring: fix code style problems
Pavel Skripkin (1):
net: 6pack: fix slab-out-of-bounds in decode_data
Peter Ujfalusi (1):
dmaengine: of-dma: router_xlate to return -EPROBE_DEFER if controller
is not yet available
Peter Zijlstra (1):
perf/x86: Fix out of bound MSR access
Petko Manolov (1):
net: usb: pegasus: Check the return value of get_geristers() and
friends;
Petr Pavlu (1):
riscv: Fix a number of free'd resources in init_resources()
Petr Vorel (3):
arm64: dts: qcom: msm8992-bullhead: Remove PSCI
arm64: dts: qcom: msm8992-bullhead: Fix cont_splash_mem mapping
arm64: dts: qcom: msm8994-angler: Disable cont_splash_mem
Pingfan Liu (1):
tracing: Apply trace filters on all output channels
Prabhakar Kushwaha (1):
qede: fix crash in rmmod qede while automatic debug collection
Qingqing Zhuo (1):
drm/amd/display: workaround for hard hang on HPD on native DP
Randy Dunlap (1):
dccp: add do-while-0 stubs for dccp_pr_debug macros
Saravana Kannan (2):
net: mdio-mux: Don't ignore memory allocation errors
net: mdio-mux: Handle -EPROBE_DEFER correctly
Sasha Levin (1):
Linux 5.13.13-rc1
Shaik Sajida Bhanu (1):
mmc: sdhci-msm: Update the software timeout value for sdhc
Sreekanth Reddy (1):
scsi: core: Avoid printing an error if target_alloc() returns -ENXIO
Srinivas Kandagatla (5):
arm64: dts: qcom: c630: fix correct powerdown pin for WSA881x
slimbus: messaging: start transaction ids from 1 instead of zero
slimbus: messaging: check for valid transaction id
slimbus: ngd: set correct device for pm
slimbus: ngd: reset dma setup during runtime pm
Steven Rostedt (VMware) (1):
tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL
event name
Sudeep Holla (1):
ARM: dts: nomadik: Fix up interrupt controller node names
Sylwester Dziedziuch (1):
iavf: Fix ping is lost after untrusted VF had tried to change MAC
Takashi Iwai (2):
ALSA: hda/via: Apply runtime PM workaround for ASUS B23E
ASoC: intel: atom: Fix breakage for PCM buffer address setup
Toke Høiland-Jørgensen (1):
sch_cake: fix srchost/dsthost hashing mode
Tony Lindgren (1):
bus: ti-sysc: Fix error handling for sysc_check_active_timer()
Uwe Kleine-König (1):
spi: spi-mux: Add module info needed for autoloading
Vincent Fu (1):
kyber: make trace_block_rq call consistent with documentation
Vincent Whitchurch (1):
mmc: dw_mmc: Fix hang on data CRC error
Vladimir Oltean (2):
net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q
CPU port
net: dpaa2-switch: disable the control interface on error path
Wang Hai (1):
ixgbe, xsk: clean up the resources in ixgbe_xsk_pool_enable error path
Xie Yongji (5):
vhost-vdpa: Fix integer overflow in vhost_vdpa_process_iotlb_update()
vhost: Fix the calculation in vhost_overflow()
vdpa_sim: Fix return value check for vdpa_alloc_device()
vp_vdpa: Fix return value check for vdpa_alloc_device() vDPA/ifcvf: Fix return value check for vdpa_alloc_device()
Ye Bin (1):
scsi: scsi_dh_rdac: Avoid crash during rdac_bus_attach()
Yifan Zhang (1):
drm/amdgpu: fix the doorbell missing when in CGPG issue for renoir.
Yu Kuai (1):
dmaengine: usb-dmac: Fix PM reference leak in usb_dmac_probe()
Zhan Liu (1):
drm/amd/display: Use DCN30 watermark calc for DCN301
jason-jh.lin (2):
drm/mediatek: Add AAL output size configuration drm/mediatek: Add component_del in OVL and COLOR remove function
kaixi.fan (1):
ovs: clear skb->tstamp in forwarding path
lijinlin (1):
scsi: core: Fix capacity set to zero after offlinining device
Makefile | 4 +- arch/arm/boot/dts/am43x-epos-evm.dts | 2 +- arch/arm/boot/dts/ste-nomadik-stn8815.dtsi | 4 +- arch/arm64/Makefile | 2 + .../dts/qcom/msm8992-bullhead-rev-101.dts | 12 ++ .../boot/dts/qcom/msm8994-angler-rev-101.dts | 4 + .../boot/dts/qcom/sdm845-oneplus-common.dtsi | 4 +- .../boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 4 +- arch/powerpc/include/asm/book3s/32/kup.h | 41 ++++ arch/powerpc/include/asm/book3s/32/mmu-hash.h | 27 +++ arch/powerpc/include/asm/kup.h | 5 +- arch/powerpc/mm/book3s32/Makefile | 1 + arch/powerpc/mm/book3s32/kuap.c | 11 + arch/powerpc/mm/book3s32/kuep.c | 37 +--- arch/powerpc/mm/book3s32/mmu.c | 20 -- arch/riscv/kernel/setup.c | 4 +- arch/s390/pci/pci.c | 6 + arch/s390/pci/pci_bus.h | 5 + arch/x86/events/core.c | 12 +- block/kyber-iosched.c | 2 +- drivers/bus/ti-sysc.c | 4 +- drivers/clk/imx/clk-imx6q.c | 2 +- drivers/clk/qcom/gdsc.c | 54 +++-- drivers/cpufreq/armada-37xx-cpufreq.c | 6 +- drivers/cpufreq/scmi-cpufreq.c | 2 +- drivers/dma/of-dma.c | 9 +- drivers/dma/sh/usb-dmac.c | 2 +- drivers/dma/xilinx/xilinx_dma.c | 12 ++ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 21 +- .../amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 4 +- .../gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | 2 +- .../amd/display/dc/dcn301/dcn301_resource.c | 96 +-------- .../drm/i915/display/intel_display_power.c | 16 +- drivers/gpu/drm/i915/i915_irq.c | 60 +++--- drivers/gpu/drm/mediatek/mtk_disp_color.c | 2 + drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 2 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 2 + drivers/iommu/dma-iommu.c | 1 + drivers/iommu/intel/pasid.c | 10 +- drivers/iommu/intel/pasid.h | 6 + drivers/iommu/iommu.c | 3 + drivers/ipack/carriers/tpci200.c | 60 +++--- drivers/mmc/host/dw_mmc.c | 6 +- drivers/mmc/host/mmci_stm32_sdmmc.c | 7 +- drivers/mmc/host/sdhci-iproc.c | 21 +- drivers/mmc/host/sdhci-msm.c | 18 ++ drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- drivers/mtd/nand/raw/nand_base.c | 10 +- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 113 ++++++---- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + .../ethernet/freescale/dpaa2/dpaa2-switch.c | 36 ++-- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 +- drivers/net/ethernet/intel/iavf/iavf.h | 1 + drivers/net/ethernet/intel/iavf/iavf_main.c | 1 + .../net/ethernet/intel/iavf/iavf_virtchnl.c | 47 ++++- drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 5 +- drivers/net/ethernet/mscc/ocelot.c | 1 + drivers/net/ethernet/qlogic/qede/qede.h | 1 + drivers/net/ethernet/qlogic/qede/qede_main.c | 8 + .../ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 4 +- drivers/net/hamradio/6pack.c | 6 + drivers/net/mdio/mdio-mux.c | 36 ++-- drivers/net/usb/asix.h | 3 +- drivers/net/usb/asix_common.c | 31 +-- drivers/net/usb/asix_devices.c | 15 +- drivers/net/usb/ax88172a.c | 5 + drivers/net/usb/lan78xx.c | 16 +- drivers/net/usb/pegasus.c | 108 +++++++--- drivers/net/usb/r8152.c | 23 +- drivers/net/virtio_net.c | 14 +- drivers/net/vrf.c | 4 + .../net/wireless/mediatek/mt76/mt7915/mcu.c | 2 +- .../net/wireless/mediatek/mt76/mt7915/mcu.h | 3 +- .../net/wireless/mediatek/mt76/mt7921/mcu.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/mcu.h | 3 +- drivers/opp/core.c | 15 -- drivers/pci/pci-sysfs.c | 2 +- drivers/pci/quirks.c | 1 + drivers/ptp/Kconfig | 3 +- drivers/scsi/device_handler/scsi_dh_rdac.c | 4 +- drivers/scsi/megaraid/megaraid_mm.c | 21 +- drivers/scsi/pm8001/pm8001_sas.c | 32 ++- drivers/scsi/scsi_scan.c | 3 +- drivers/scsi/scsi_sysfs.c | 9 +- drivers/slimbus/messaging.c | 7 +- drivers/slimbus/qcom-ngd-ctrl.c | 22 +- drivers/soc/fsl/qe/qe_ic.c | 84 ++++---- drivers/spi/spi-cadence-quadspi.c | 21 +- drivers/spi/spi-mux.c | 8 + drivers/usb/core/devio.c | 2 +- drivers/usb/core/message.c | 6 + drivers/usb/typec/tcpm/tcpm.c | 13 +- drivers/vdpa/ifcvf/ifcvf_main.c | 4 +- drivers/vdpa/mlx5/core/mr.c | 9 - drivers/vdpa/mlx5/net/mlx5_vnet.c | 14 +- drivers/vdpa/vdpa_sim/vdpa_sim.c | 4 +- drivers/vdpa/virtio_pci/vp_vdpa.c | 4 +- drivers/vhost/vdpa.c | 3 +- drivers/vhost/vhost.c | 10 +- drivers/virtio/virtio.c | 1 + drivers/virtio/virtio_ring.c | 8 + fs/btrfs/inode.c | 10 +- fs/io_uring.c | 37 ++-- fs/namespace.c | 6 +- fs/pipe.c | 15 +- include/linux/kfence.h | 7 +- include/linux/memcontrol.h | 29 +-- include/linux/mlx5/mlx5_ifc_vdpa.h | 10 +- include/linux/pipe_fs_i.h | 2 + include/linux/virtio.h | 1 + include/net/flow_offload.h | 12 +- kernel/bpf/verifier.c | 1 + kernel/cfi.c | 8 +- kernel/trace/Kconfig | 5 + kernel/trace/trace.c | 18 +- kernel/trace/trace.h | 32 --- kernel/trace/trace_events_hist.c | 2 + mm/hugetlb.c | 21 +- mm/memory-failure.c | 196 ++++++++++-------- mm/vmscan.c | 27 ++- net/dccp/dccp.h | 6 +- net/mac80211/main.c | 2 + net/mptcp/options.c | 10 +- net/mptcp/pm_netlink.c | 44 ++-- net/openvswitch/vport.c | 1 + net/sched/sch_cake.c | 2 +- net/xfrm/xfrm_ipcomp.c | 2 +- sound/pci/hda/hda_generic.c | 10 +- sound/pci/hda/patch_realtek.c | 12 +- sound/pci/hda/patch_via.c | 1 + sound/soc/intel/atom/sst-mfld-platform-pcm.c | 2 +- 131 files changed, 1202 insertions(+), 778 deletions(-) create mode 100644 arch/powerpc/mm/book3s32/kuap.c
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 1/127 mtd: cfi_cmdset_0002: fix crash when erasing/writing AMD cards
From: Andreas Persson <[email protected]>
commit 2394e628738933aa014093d93093030f6232946d upstream.
Erasing an AMD linear flash card (AM29F016D) crashes after the first sector has been erased. Likewise, writing to it crashes after two bytes have been written. The reason is a missing check for a null pointer - the cmdset_priv field is not set for this type of card.
--- drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/chips/cfi_cmdset_0002.c +1 -1
@@ -119,7 +119,7 @@ static int cfi_use_status_reg(struct cfi_private *cfi)struct cfi_pri_amdstd *extp = cfi->cmdset_priv;u8 poll_mask =CFI_POLL_STATUS_REG |CFI_POLL_DQ ; -return extp->MinorVersion >='5' && +return extp && extp->MinorVersion >='5' && (extp->SoftwareFeatures & poll_mask) ==CFI_POLL_STATUS_REG ; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 2/127 io_uring: Use WRITE_ONCE() when writing to sq_flags
In reply to Sasha LevinFrom: Nadav Amit <[email protected]>
[ Upstream commit 20c0b380f971e7d48f5d978bc27d827f7eabb21a ]
The compiler should be forbidden from any strange optimization for async writes to user visible data-structures. Without proper protection, the compiler can cause write-tearing or invent writes that would confuse the userspace.
However, there are writes to sq_flags which are not protected by WRITE_ONCE(). Use WRITE_ONCE() for these writes.
This is purely a theoretical issue. Presumably, any compiler is very unlikely to do such optimizations.
--- fs/io_uring.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
fs/io_uring.c +9 -4
@@ -1482,7 +1482,8 @@ static bool __io_cqring_overflow_flush(struct io_ring_ctx *ctx, bool force)if (all_flushed) {clear_bit (0 , &ctx->sq_check_overflow);clear_bit (0 , &ctx->cq_check_overflow); - ctx->rings->sq_flags &= ~IORING_SQ_CQ_OVERFLOW ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags & ~IORING_SQ_CQ_OVERFLOW ); }if (posted)
@@ -1562,7 +1563,9 @@ static bool io_cqring_event_overflow(struct io_ring_ctx *ctx, u64 user_data,if (list_empty (&ctx->cq_overflow_list)) {set_bit (0 , &ctx->sq_check_overflow);set_bit (0 , &ctx->cq_check_overflow); - ctx->rings->sq_flags |=IORING_SQ_CQ_OVERFLOW ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags |IORING_SQ_CQ_OVERFLOW ); + } ocqe->cqe.user_data = user_data; ocqe->cqe.res = res;
@@ -6790,14 +6793,16 @@ static inline void io_ring_set_wakeup_flag(struct io_ring_ctx *ctx) {/* Tell userspace we may need a wakeup call */ spin_lock_irq (&ctx->completion_lock); - ctx->rings->sq_flags |=IORING_SQ_NEED_WAKEUP ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags |IORING_SQ_NEED_WAKEUP );spin_unlock_irq (&ctx->completion_lock); }static inline void io_ring_clear_wakeup_flag (struct io_ring_ctx *ctx) {spin_lock_irq (&ctx->completion_lock); - ctx->rings->sq_flags &= ~IORING_SQ_NEED_WAKEUP ; +WRITE_ONCE (ctx->rings->sq_flags, + ctx->rings->sq_flags & ~IORING_SQ_NEED_WAKEUP );spin_unlock_irq (&ctx->completion_lock); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 3/127 USB: core: Avoid WARNings for 0-length descriptor requests
In reply to Sasha LevinFrom: Alan Stern <[email protected]>
[ Upstream commit 60dfe484cef45293e631b3a6e8995f1689818172 ]
The USB core has utility routines to retrieve various types of descriptors. These routines will now provoke a WARN if they are asked to retrieve 0 bytes (USB "receive" requests must not have zero length), so avert this by checking the size argument at the start.
--- drivers/usb/core/message.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/core/message.c +6 -0
@@ -783,6 +783,9 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type,int i;int result; +if (size <=0 )/* No point in asking for no data */ +return -EINVAL ; +memset (buf,0 , size);/* Make sure we parse really received data */ for (i =0 ; i <3 ; ++i) {
@@ -832,6 +835,9 @@ static int usb_get_string(struct usb_device *dev, unsigned short langid,int i;int result; +if (size <=0 )/* No point in asking for no data */ +return -EINVAL ; +for (i =0 ; i <3 ; ++i) {/* retry on length 0 or stall; some devices are flakey */ result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 4/127 USB: core: Fix incorrect pipe calculation in do_proc_control()
In reply to Sasha LevinFrom: Alan Stern <[email protected]>
[ Upstream commit b0863f1927323110e3d0d69f6adb6a91018a9a3c ]
When the user submits a control URB via usbfs, the user supplies the bRequestType value and the kernel uses it to compute the pipe value. However, do_proc_control() performs this computation incorrectly in the case where the bRequestType direction bit is set to USB_DIR_IN and the URB's transfer length is 0: The pipe's direction is also set to IN but it should be OUT, which is the direction the actual transfer will use regardless of bRequestType.
Commit 5cc59c418fde ("USB: core: WARN if pipe direction != setup packet direction") added a check to compare the direction bit in the pipe value to a control URB's actual direction and to WARN if they are different. This can be triggered by the incorrect computation mentioned above, as found by syzbot.
This patch fixes the computation, thus avoiding the WARNing.
--- drivers/usb/core/devio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/core/devio.c +1 -1
@@ -1133,7 +1133,7 @@ static int do_proc_control(struct usb_dev_state *ps,"wIndex=%04x wLength=%04x\n" , ctrl->bRequestType, ctrl->bRequest, ctrl->wValue, ctrl->wIndex, ctrl->wLength); -if (ctrl->bRequestType &0x80 ) { +if ((ctrl->bRequestType &USB_DIR_IN ) && ctrl->wLength) { pipe =usb_rcvctrlpipe (dev,0 );snoop_urb (dev,NULL , pipe, ctrl->wLength, tmo,SUBMIT ,NULL ,0 );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 5/127 dmaengine: xilinx_dma: Fix read-after-free bug when terminating transfers
In reply to Sasha LevinFrom: Adrian Larumbe <[email protected]>
[ Upstream commit 7dd2dd4ff9f3abda601f22b9d01441a0869d20d7 ]
When user calls dmaengine_terminate_sync, the driver will clean up any remaining descriptors for all the pending or active transfers that had previously been submitted. However, this might happen whilst the tasklet is invoking the DMA callback for the last finished transfer, so by the time it returns and takes over the channel's spinlock, the list of completed descriptors it was traversing is no longer valid. This leads to a read-after-free situation.
Fix it by signalling whether a user-triggered termination has happened by means of a boolean variable.
--- drivers/dma/xilinx/xilinx_dma.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/dma/xilinx/xilinx_dma.c +12 -0
@@ -394,6 +394,7 @@ struct xilinx_dma_tx_descriptor {* @genlock: Support genlock mode * @err: Channel has errors * @idle: Check for channel idle +* @terminating: Check for channel being synchronized by user * @tasklet: Cleanup work after irq * @config: Device configuration info * @flush_on_fsync: Flush on Frame sync
@@ -431,6 +432,7 @@ struct xilinx_dma_chan {bool genlock;bool err;bool idle; +bool terminating;struct tasklet_struct tasklet;struct xilinx_vdma_config config;bool flush_on_fsync;
@@ -1049,6 +1051,13 @@ static void xilinx_dma_chan_desc_cleanup(struct xilinx_dma_chan *chan)/* Run any dependencies, then free the descriptor */ dma_run_dependencies (&desc->async_tx);xilinx_dma_free_tx_descriptor (chan, desc); + +/* +* While we ran a callback the user called a terminate function, +* which takes care of cleaning up any remaining descriptors +*/ +if (chan->terminating) +break ; }spin_unlock_irqrestore (&chan->lock, flags);
@@ -1965,6 +1974,8 @@ static dma_cookie_t xilinx_dma_tx_submit(struct dma_async_tx_descriptor *tx)if (desc->cyclic) chan->cyclic = true; + chan->terminating = false; +spin_unlock_irqrestore (&chan->lock, flags);return cookie;
@@ -2436,6 +2447,7 @@ static int xilinx_dma_terminate_all(struct dma_chan *dchan)xilinx_dma_chan_reset (chan);/* Remove and free all of the descriptors in the lists */ + chan->terminating = true;xilinx_dma_free_descriptors (chan); chan->idle = true;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 6/127 dmaengine: usb-dmac: Fix PM reference leak in usb_dmac_probe()
In reply to Sasha LevinFrom: Yu Kuai <[email protected]>
[ Upstream commit 1da569fa7ec8cb0591c74aa3050d4ea1397778b4 ]
pm_runtime_get_sync will increment pm usage counter even it failed. Forgetting to putting operation will result in reference leak here. Fix it by moving the error_pm label above the pm_runtime_put() in the error path.
--- drivers/dma/sh/usb-dmac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/sh/usb-dmac.c +1 -1
@@ -855,8 +855,8 @@ static int usb_dmac_probe(struct platform_device *pdev) error:of_dma_controller_free (pdev->dev.of_node); -pm_runtime_put (&pdev->dev); error_pm: +pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev);return ret; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 7/127 spi: spi-mux: Add module info needed for autoloading
In reply to Sasha LevinFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 1d5ccab95f06675a269f4cb223a1e3f6d1ebef42 ]
With the spi device table udev can autoload the spi-mux module in the presence of an spi-mux device.
--- drivers/spi/spi-mux.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/spi/spi-mux.c +8 -0
@@ -167,10 +167,17 @@ err_put_ctlr:return ret; } +static const struct spi_device_id spi_mux_id[] = { + {"spi-mux" }, + { } +}; +MODULE_DEVICE_TABLE (spi, spi_mux_id); +static const struct of_device_id spi_mux_of_match[] = { { .compatible ="spi-mux" }, { } }; +MODULE_DEVICE_TABLE (of, spi_mux_of_match);static struct spi_driver spi_mux_driver = { .probe = spi_mux_probe,
@@ -178,6 +185,7 @@ static struct spi_driver spi_mux_driver = { .name = "spi-mux", .of_match_table = spi_mux_of_match, }, + .id_table = spi_mux_id, };module_spi_driver (spi_mux_driver);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 8/127 net: xfrm: Fix end of loop tests for list_for_each_entry
In reply to Sasha LevinFrom: Harshvardhan Jha <[email protected]>
[ Upstream commit 480e93e12aa04d857f7cc2e6fcec181c0d690404 ]
The list_for_each_entry() iterator, "pos" in this code, can never be NULL so the warning will never be printed.
--- net/xfrm/xfrm_ipcomp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/xfrm/xfrm_ipcomp.c +1 -1
@@ -241,7 +241,7 @@ static void ipcomp_free_tfms(struct crypto_comp * __percpu *tfms)break ; } -WARN_ON (!pos); +WARN_ON (list_entry_is_head (pos, &ipcomp_tfms_list, list));if (--pos->users)return ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 9/127 ARM: dts: am43x-epos-evm: Reduce i2c0 bus speed for tps65218
In reply to Sasha LevinFrom: Dave Gerlach <[email protected]>
[ Upstream commit 20a6b3fd8e2e2c063b25fbf2ee74d86b898e5087 ]
Based on the latest timing specifications for the TPS65218 from the data sheet, http://www.ti.com/lit/ds/symlink/tps65218.pdf, document SLDS206 from November 2014, we must change the i2c bus speed to better fit within the minimum high SCL time required for proper i2c transfer.
When running at 400khz, measurements show that SCL spends 0.8125 uS/1.666 uS high/low which violates the requirement for minimum high period of SCL provided in datasheet Table 7.6 which is 1 uS. Switching to 100khz gives us 5 uS/5 uS high/low which both fall above the minimum given values for 100 khz, 4.0 uS/4.7 uS high/low.
Without this patch occasionally a voltage set operation from the kernel will appear to have worked but the actual voltage reflected on the PMIC will not have updated, causing problems especially with cpufreq that may update to a higher OPP without actually raising the voltage on DCDC2, leading to a hang.
--- arch/arm/boot/dts/am43x-epos-evm.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/am43x-epos-evm.dts +1 -1
@@ -582,7 +582,7 @@ status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&i2c0_pins>; - clock-frequency = <400000>; + clock-frequency = <100000>; tps65218: tps65218@24 { reg = <0x24>;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 10/127 dmaengine: of-dma: router_xlate to return -EPROBE_DEFER if controller is not yet available
In reply to Sasha LevinFrom: Peter Ujfalusi <[email protected]>
[ Upstream commit eda97cb095f2958bbad55684a6ca3e7d7af0176a ]
If the router_xlate can not find the controller in the available DMA devices then it should return with -EPORBE_DEFER in a same way as the of_dma_request_slave_channel() does.
The issue can be reproduced if the event router is registered before the DMA controller itself and a driver would request for a channel before the controller is registered.
In of_dma_request_slave_channel():
1. of_dma_find_controller() would find the dma_router
2. ofdma->of_dma_xlate() would fail and returned NULL
3. -ENODEV is returned as error code
with this patch we would return in this case the correct -EPROBE_DEFER and the client can try to request the channel later.
--- drivers/dma/of-dma.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/dma/of-dma.c +7 -2
@@ -67,8 +67,12 @@ static struct dma_chan *of_dma_router_xlate(struct of_phandle_args *dma_spec,return NULL ; ofdma_target =of_dma_find_controller (&dma_spec_target); -if (!ofdma_target) -return NULL ; +if (!ofdma_target) { + ofdma->dma_router->route_free (ofdma->dma_router->dev, + route_data); + chan =ERR_PTR (-EPROBE_DEFER ); + goto err; + } chan = ofdma_target->of_dma_xlate (&dma_spec_target, ofdma_target);if (IS_ERR_OR_NULL (chan)) {
@@ -89,6 +93,7 @@ static struct dma_chan *of_dma_router_xlate(struct of_phandle_args *dma_spec, } } +err:/* * Need to put the node back since the ofdma->of_dma_route_allocate * has taken it for generating the new, translated dma_spec
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 11/127 scsi: pm80xx: Fix TMF task completion race condition
In reply to Sasha LevinFrom: Igor Pylypiv <[email protected]>
[ Upstream commit d712d3fb484b7fa8d1d57e9ca6f134bb9d8c18b1 ]
The TMF timeout timer may trigger at the same time when the response from a controller is being handled. When this happens the SAS task may get freed before the response processing is finished.
Fix this by calling complete() only when SAS_TASK_STATE_DONE is not set.
A similar race condition was fixed in commit b90cd6f2b905 ("scsi: libsas:
fix a race condition when smp task timeout")
--- drivers/scsi/pm8001/pm8001_sas.c | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-)
drivers/scsi/pm8001/pm8001_sas.c +15 -17
@@ -684,8 +684,7 @@ int pm8001_dev_found(struct domain_device *dev)void pm8001_task_done (struct sas_task *task) { -if (!del_timer (&task->slow_task->timer)) -return ; +del_timer (&task->slow_task->timer);complete (&task->slow_task->completion); }
@@ -693,9 +692,14 @@ static void pm8001_tmf_timedout(struct timer_list *t) {struct sas_task_slow *slow =from_timer (slow, t, timer);struct sas_task *task = slow->task; +unsigned long flags; - task->task_state_flags |=SAS_TASK_STATE_ABORTED ; -complete (&task->slow_task->completion); +spin_lock_irqsave (&task->task_state_lock, flags); +if (!(task->task_state_flags &SAS_TASK_STATE_DONE )) { + task->task_state_flags |=SAS_TASK_STATE_ABORTED ; +complete (&task->slow_task->completion); + } +spin_unlock_irqrestore (&task->task_state_lock, flags); }#define PM8001_TASK_TIMEOUT 20
@@ -748,13 +752,10 @@ static int pm8001_exec_internal_tmf_task(struct domain_device *dev, } res = -TMF_RESP_FUNC_FAILED ;/* Even TMF timed out, return direct. */ -if ((task->task_state_flags &SAS_TASK_STATE_ABORTED )) { -if (!(task->task_state_flags &SAS_TASK_STATE_DONE )) { -pm8001_dbg (pm8001_ha,FAIL , -"TMF task[%x]timeout.\n" , - tmf->tmf); - goto ex_err; - } +if (task->task_state_flags &SAS_TASK_STATE_ABORTED ) { +pm8001_dbg (pm8001_ha,FAIL ,"TMF task[%x]timeout.\n" , + tmf->tmf); + goto ex_err; } if (task->task_status.resp == SAS_TASK_COMPLETE &&
@@ -834,12 +835,9 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,wait_for_completion (&task->slow_task->completion); res =TMF_RESP_FUNC_FAILED ;/* Even TMF timed out, return direct. */ -if ((task->task_state_flags &SAS_TASK_STATE_ABORTED )) { -if (!(task->task_state_flags &SAS_TASK_STATE_DONE )) { -pm8001_dbg (pm8001_ha,FAIL , -"TMF task timeout.\n" ); - goto ex_err; - } +if (task->task_state_flags &SAS_TASK_STATE_ABORTED ) { +pm8001_dbg (pm8001_ha,FAIL ,"TMF task timeout.\n" ); + goto ex_err; } if (task->task_status.resp == SAS_TASK_COMPLETE &&
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 12/127 scsi: megaraid_mm: Fix end of loop tests for list_for_each_entry()
In reply to Sasha LevinFrom: Harshvardhan Jha <[email protected]>
[ Upstream commit 77541f78eadfe9fdb018a7b8b69f0f2af2cf4b82 ]
The list_for_each_entry() iterator, "adapter" in this code, can never be NULL. If we exit the loop without finding the correct adapter then "adapter" points invalid memory that is an offset from the list head. This will eventually lead to memory corruption and presumably a kernel crash.
--- drivers/scsi/megaraid/megaraid_mm.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/scsi/megaraid/megaraid_mm.c +15 -6
@@ -238,7 +238,7 @@ mraid_mm_get_adapter(mimd_t __user *umimd, int *rval)mimd_t mimd;uint32_t adapno;int iterator; - +bool is_found;if (copy_from_user (&mimd, umimd,sizeof (mimd_t))) { *rval = -EFAULT ;
@@ -254,12 +254,16 @@ mraid_mm_get_adapter(mimd_t __user *umimd, int *rval) adapter =NULL ; iterator =0 ; + is_found = false;list_for_each_entry (adapter, &adapters_list_g, list) { -if (iterator++ == adapno)break ; +if (iterator++ == adapno) { + is_found = true; +break ; + } } -if (!adapter) { +if (!is_found) { *rval = -ENODEV ;return NULL ; }
@@ -725,6 +729,7 @@ ioctl_done(uioc_t *kioc)uint32_t adapno;int iterator;mraid_mmadp_t * adapter; +bool is_found;/* * When the kioc returns from driver, make sure it still doesn't
@@ -747,19 +752,23 @@ ioctl_done(uioc_t *kioc) iterator =0 ; adapter =NULL ; adapno = kioc->adapno; + is_found = false;con_log (CL_ANN , (KERN_WARNING "megaraid cmm: completed " "ioctl that was timedout before\n" ));list_for_each_entry (adapter, &adapters_list_g, list) { -if (iterator++ == adapno)break ; +if (iterator++ == adapno) { + is_found = true; +break ; + } } kioc->timedout =0 ; -if (adapter) { +if (is_found)mraid_mm_dealloc_kioc ( adapter, kioc ); - } + }else {wake_up (&wait_q);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 13/127 scsi: scsi_dh_rdac: Avoid crash during rdac_bus_attach()
In reply to Sasha LevinFrom: Ye Bin <[email protected]>
[ Upstream commit bc546c0c9abb3bb2fb46866b3d1e6ade9695a5f6 ]
The following BUG_ON() was observed during RDAC scan:
[595952.944297] kernel BUG at drivers/scsi/device_handler/scsi_dh_rdac.c:427! [595952.951143] Internal error: Oops - BUG: 0 [#1] SMP ...... [595953.251065] Call trace: [595953.259054] check_ownership+0xb0/0x118 [595953.269794] rdac_bus_attach+0x1f0/0x4b0 [595953.273787] scsi_dh_handler_attach+0x3c/0xe8 [595953.278211] scsi_dh_add_device+0xc4/0xe8 [595953.282291] scsi_sysfs_add_sdev+0x8c/0x2a8 [595953.286544] scsi_probe_and_add_lun+0x9fc/0xd00 [595953.291142] __scsi_scan_target+0x598/0x630 [595953.295395] scsi_scan_target+0x120/0x130 [595953.299481] fc_user_scan+0x1a0/0x1c0 [scsi_transport_fc] [595953.304944] store_scan+0xb0/0x108 [595953.308420] dev_attr_store+0x44/0x60 [595953.312160] sysfs_kf_write+0x58/0x80 [595953.315893] kernfs_fop_write+0xe8/0x1f0 [595953.319888] __vfs_write+0x60/0x190 [595953.323448] vfs_write+0xac/0x1c0 [595953.326836] ksys_write+0x74/0xf0 [595953.330221] __arm64_sys_write+0x24/0x30
Code is in check_ownership:
list_for_each_entry_rcu(tmp, &h->ctlr->dh_list, node) {
/* h->sdev should always be valid */
BUG_ON(!tmp->sdev);
tmp->sdev->access_state = access_state;
}
rdac_bus_attach
initialize_controller
list_add_rcu(&h->node, &h->ctlr->dh_list);
h->sdev = sdev;
rdac_bus_detach
list_del_rcu(&h->node);
h->sdev = NULL;Fix the race between rdac_bus_attach() and rdac_bus_detach() where h->sdev is NULL when processing the RDAC attach.
--- drivers/scsi/device_handler/scsi_dh_rdac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/device_handler/scsi_dh_rdac.c +2 -2
@@ -453,8 +453,8 @@ static int initialize_controller(struct scsi_device *sdev,if (!h->ctlr) err =SCSI_DH_RES_TEMP_UNAVAIL ;else { -list_add_rcu (&h->node, &h->ctlr->dh_list); h->sdev = sdev; +list_add_rcu (&h->node, &h->ctlr->dh_list); }spin_unlock (&list_lock); err =SCSI_DH_OK ;
@@ -778,11 +778,11 @@ static void rdac_bus_detach( struct scsi_device *sdev )spin_lock (&list_lock);if (h->ctlr) {list_del_rcu (&h->node); - h->sdev =NULL ;kref_put (&h->ctlr->kref, release_controller); }spin_unlock (&list_lock); sdev->handler_data =NULL ; +synchronize_rcu ();kfree (h); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 14/127 scsi: core: Avoid printing an error if target_alloc() returns -ENXIO
In reply to Sasha LevinFrom: Sreekanth Reddy <[email protected]>
[ Upstream commit 70edd2e6f652f67d854981fd67f9ad0f1deaea92 ]
Avoid printing a 'target allocation failed' error if the driver target_alloc() callback function returns -ENXIO. This return value indicates that the corresponding H:C:T:L entry is empty.
Removing this error reduces the scan time if the user issues SCAN_WILD_CARD scan operation through sysfs parameter on a host with a lot of empty H:C:T:L entries.
Avoiding the printk on -ENXIO matches the behavior of the other callback functions during scanning.
--- drivers/scsi/scsi_scan.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/scsi_scan.c +2 -1
@@ -471,7 +471,8 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, error = shost->hostt->target_alloc (starget);if (error) { -dev_printk (KERN_ERR , dev,"target allocation failed, error %d\n" , error); +if (error != -ENXIO ) +dev_err (dev,"target allocation failed, error %d\n" , error);/* don't want scsi_target_reap to do the final * put because it will be under the host lock */ scsi_target_destroy (starget);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 15/127 scsi: core: Fix capacity set to zero after offlinining device
In reply to Sasha LevinFrom: lijinlin <[email protected]>
[ Upstream commit f0f82e2476f6adb9c7a0135cfab8091456990c99 ]
After adding physical volumes to a volume group through vgextend, the kernel will rescan the partitions. This in turn will cause the device capacity to be queried.
If the device status is set to offline through sysfs at this time, READ CAPACITY command will return a result which the host byte is DID_NO_CONNECT, and the capacity of the device will be set to zero in read_capacity_error(). After setting device status back to running, the capacity of the device will remain stuck at zero.
Fix this issue by rescanning device when the device state changes to SDEV_RUNNING.
--- drivers/scsi/scsi_sysfs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/scsi/scsi_sysfs.c +6 -3
@@ -807,11 +807,14 @@ store_state_field(struct device *dev, struct device_attribute *attr,mutex_lock (&sdev->state_mutex); ret =scsi_device_set_state (sdev, state);/* -* If the device state changes to SDEV_RUNNING, we need to run -* the queue to avoid I/O hang. +* If the device state changes to SDEV_RUNNING, we need to +* rescan the device to revalidate it, and run the queue to +* avoid I/O hang. */ -if (ret ==0 && state ==SDEV_RUNNING ) +if (ret ==0 && state ==SDEV_RUNNING ) { +scsi_rescan_device (dev);blk_mq_run_hw_queues (sdev->request_queue, true); + }mutex_unlock (&sdev->state_mutex);return ret ==0 ? count : -EINVAL ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 16/127 drm/amdgpu: fix the doorbell missing when in CGPG issue for renoir.
In reply to Sasha LevinFrom: Yifan Zhang <[email protected]>
[ Upstream commit 1c0539a6fc8a4a4b77278e35d763073890de96b9 ]
If GC has entered CGPG, ringing doorbell > first page doesn't wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to workaround this issue.
--- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +20 -1
@@ -1293,6 +1293,16 @@ static bool is_raven_kicker(struct amdgpu_device *adev)return false; } +static bool check_if_enlarge_doorbell_range (struct amdgpu_device *adev) +{ +if ((adev->asic_type ==CHIP_RENOIR ) && + (adev->gfx.me_fw_version >=0x000000a5 ) && + (adev->gfx.me_feature_version >=52 )) +return true; +else +return false; +} +static void gfx_v9_0_check_if_need_gfxoff (struct amdgpu_device *adev) {if (gfx_v9_0_should_disable_gfxoff (adev->pdev))
@@ -3673,7 +3683,16 @@ static int gfx_v9_0_kiq_init_register(struct amdgpu_ring *ring)if (ring->use_doorbell) {WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_LOWER, (adev->doorbell_index.kiq *2 ) <<2 ); -WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_UPPER, +/* If GC has entered CGPG, ringing doorbell > first page +* doesn't wakeup GC. Enlarge CP_MEC_DOORBELL_RANGE_UPPER to +* workaround this issue. And this change has to align with firmware +* update. +*/ +if (check_if_enlarge_doorbell_range (adev)) +WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_UPPER, + (adev->doorbell.size -4 )); +else +WREG32_SOC15 (GC ,0 , mmCP_MEC_DOORBELL_RANGE_UPPER, (adev->doorbell_index.userqueue_end *2 ) <<2 ); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 17/127 qede: fix crash in rmmod qede while automatic debug collection
In reply to Sasha LevinFrom: Prabhakar Kushwaha <[email protected]>
[ Upstream commit 1159e25c137422bdc48ee96e3fb014bd942092c6 ]
A crash has been observed if rmmod is done while automatic debug collection in progress. It is due to a race condition between both of them.
To fix stop the sp_task during unload to avoid running qede_sp_task even if they are schedule during removal process.
--- drivers/net/ethernet/qlogic/qede/qede.h | 1 + drivers/net/ethernet/qlogic/qede/qede_main.c | 8 ++++++++ 2 files changed, 9 insertions(+)
drivers/net/ethernet/qlogic/qede/qede.h +1 -0
@@ -501,6 +501,7 @@ struct qede_fastpath {#define QEDE_SP_HW_ERR 4#define QEDE_SP_ARFS_CONFIG 5#define QEDE_SP_AER 7 +#define QEDE_SP_DISABLE 8#ifdef CONFIG_RFS_ACCEL int qede_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
drivers/net/ethernet/qlogic/qede/qede_main.c +8 -0
@@ -1009,6 +1009,13 @@ static void qede_sp_task(struct work_struct *work) struct qede_dev *edev = container_of(work, struct qede_dev, sp_task.work); +/* Disable execution of this deferred work once +* qede removal is in progress, this stop any future +* scheduling of sp_task. +*/ +if (test_bit (QEDE_SP_DISABLE , &edev->sp_flags)) +return ; +/* The locking scheme depends on the specific flag: * In case of QEDE_SP_RECOVERY, acquiring the RTNL lock is required to * ensure that ongoing flows are ended and new ones are not started.
@@ -1300,6 +1307,7 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode)qede_rdma_dev_remove (edev, (mode ==QEDE_REMOVE_RECOVERY ));if (mode !=QEDE_REMOVE_RECOVERY ) { +set_bit (QEDE_SP_DISABLE , &edev->sp_flags);unregister_netdev (ndev);cancel_delayed_work_sync (&edev->sp_task);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 18/127 ARM: dts: nomadik: Fix up interrupt controller node names
In reply to Sasha LevinFrom: Sudeep Holla <[email protected]>
[ Upstream commit 47091f473b364c98207c4def197a0ae386fc9af1 ]
Once the new schema interrupt-controller/arm,vic.yaml is added, we get the below warnings:
arch/arm/boot/dts/ste-nomadik-nhk15.dt.yaml: intc@10140000: $nodename:0: 'intc@10140000' does not match '^interrupt-controller(@[0-9a-f,]+)*$'
Fix the node names for the interrupt controller to conform to the standard node name interrupt-controller@..
--- arch/arm/boot/dts/ste-nomadik-stn8815.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/ste-nomadik-stn8815.dtsi +2 -2
@@ -755,14 +755,14 @@ status = "disabled"; }; - vica: intc@10140000 { + vica: interrupt-controller@10140000 { compatible = "arm,versatile-vic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x10140000 0x20>; }; - vicb: intc@10140020 { + vicb: interrupt-controller@10140020 { compatible = "arm,versatile-vic"; interrupt-controller; #interrupt-cells = <1>;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 19/127 net: usb: pegasus: Check the return value of get_geristers() and friends;
In reply to Sasha LevinFrom: Petko Manolov <[email protected]>
[ Upstream commit 8a160e2e9aeb8318159b48701ad8a6e22274372d ]
Certain call sites of get_geristers() did not do proper error handling. This could be a problem as get_geristers() typically return the data via pointer to a buffer. If an error occurred the code is carelessly manipulating the wrong data.
--- drivers/net/usb/pegasus.c | 108 ++++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 33 deletions(-)
drivers/net/usb/pegasus.c +75 -33
@@ -132,9 +132,15 @@ static int get_registers(pegasus_t *pegasus, __u16 indx, __u16 size, void *data)static int set_registers (pegasus_t *pegasus,__u16 indx,__u16 size,const void *data) { -return usb_control_msg_send (pegasus->usb,0 ,PEGASUS_REQ_SET_REGS , +int ret; + + ret =usb_control_msg_send (pegasus->usb,0 ,PEGASUS_REQ_SET_REGS ,PEGASUS_REQT_WRITE ,0 , indx, data, size,1000 ,GFP_NOIO ); +if (ret <0 ) +netif_dbg (pegasus, drv, pegasus->net,"%s failed with %d\n" , __func__, ret); + +return ret; }/*
@@ -145,10 +151,15 @@ static int set_registers(pegasus_t *pegasus, __u16 indx, __u16 size,static int set_register (pegasus_t *pegasus,__u16 indx,__u8 data) {void *buf = &data; +int ret; -return usb_control_msg_send (pegasus->usb,0 ,PEGASUS_REQ_SET_REG , + ret =usb_control_msg_send (pegasus->usb,0 ,PEGASUS_REQ_SET_REG ,PEGASUS_REQT_WRITE , data, indx, buf,1 ,1000 ,GFP_NOIO ); +if (ret <0 ) +netif_dbg (pegasus, drv, pegasus->net,"%s failed with %d\n" , __func__, ret); + +return ret; }static int update_eth_regs_async (pegasus_t *pegasus)
@@ -188,10 +199,9 @@ static int update_eth_regs_async(pegasus_t *pegasus)static int __mii_op (pegasus_t *p,__u8 phy,__u8 indx,__u16 *regd,__u8 cmd) { -int i; -__u8 data[4 ] = { phy,0 ,0 , indx }; +int i, ret;__le16 regdi; -int ret = -ETIMEDOUT ; +__u8 data[4 ] = { phy,0 ,0 , indx };if (cmd &PHY_WRITE ) {__le16 *t = (__le16 *) & data[1 ];
@@ -207,12 +217,15 @@ static int __mii_op(pegasus_t *p, __u8 phy, __u8 indx, __u16 *regd, __u8 cmd)if (data[0 ] &PHY_DONE )break ; } -if (i >=REG_TIMEOUT ) +if (i >=REG_TIMEOUT ) { + ret = -ETIMEDOUT ; goto fail; + }if (cmd &PHY_READ ) { ret =get_registers (p, PhyData,2 , ®di); +if (ret <0 ) + goto fail; *regd =le16_to_cpu (regdi); -return ret; }return 0 ; fail:
@@ -235,9 +248,13 @@ static int write_mii_word(pegasus_t *pegasus, __u8 phy, __u8 indx, __u16 *regd)static int mdio_read (struct net_device *dev,int phy_id,int loc) {pegasus_t *pegasus =netdev_priv (dev); +int ret;u16 res; -read_mii_word (pegasus, phy_id, loc, &res); + ret =read_mii_word (pegasus, phy_id, loc, &res); +if (ret <0 ) +return ret; +return (int )res; }
@@ -251,10 +268,9 @@ static void mdio_write(struct net_device *dev, int phy_id, int loc, int val)static int read_eprom_word (pegasus_t *pegasus,__u8 index,__u16 *retdata) { -int i; -__u8 tmp =0 ; +int ret, i;__le16 retdatai; -int ret; +__u8 tmp =0 ;set_register (pegasus, EpromCtrl,0 );set_register (pegasus, EpromOffset, index);
@@ -262,21 +278,25 @@ static int read_eprom_word(pegasus_t *pegasus, __u8 index, __u16 *retdata)for (i =0 ; i <REG_TIMEOUT ; i++) { ret =get_registers (pegasus, EpromCtrl,1 , &tmp); +if (ret <0 ) + goto fail;if (tmp &EPROM_DONE )break ; -if (ret == -ESHUTDOWN ) - goto fail; } -if (i >=REG_TIMEOUT ) +if (i >=REG_TIMEOUT ) { + ret = -ETIMEDOUT ; goto fail; + } ret =get_registers (pegasus, EpromData,2 , &retdatai); +if (ret <0 ) + goto fail; *retdata =le16_to_cpu (retdatai);return ret; fail: -netif_warn (pegasus, drv, pegasus->net,"%s failed\n" , __func__); -return -ETIMEDOUT ; +netif_dbg (pegasus, drv, pegasus->net,"%s failed\n" , __func__); +return ret; }#ifdef PEGASUS_WRITE_EEPROM
@@ -324,10 +344,10 @@ static int write_eprom_word(pegasus_t *pegasus, __u8 index, __u16 data)return ret; fail: -netif_warn (pegasus, drv, pegasus->net,"%s failed\n" , __func__); +netif_dbg (pegasus, drv, pegasus->net,"%s failed\n" , __func__); return -ETIMEDOUT; } -#endif /* PEGASUS_WRITE_EEPROM */ +#endif /* PEGASUS_WRITE_EEPROM */ static inline int get_node_id (pegasus_t *pegasus,u8 *id) {
@@ -367,19 +387,21 @@ static void set_ethernet_addr(pegasus_t *pegasus)return ; err:eth_hw_addr_random (pegasus->net); -dev_info (&pegasus->intf->dev,"software assigned MAC address.\n" ); +netif_dbg (pegasus, drv, pegasus->net,"software assigned MAC address.\n" );return ; }static inline int reset_mac (pegasus_t *pegasus) { +int ret, i;__u8 data =0x8 ; -int i;set_register (pegasus, EthCtrl1, data);for (i =0 ; i <REG_TIMEOUT ; i++) { -get_registers (pegasus, EthCtrl1,1 , &data); + ret =get_registers (pegasus, EthCtrl1,1 , &data); +if (ret <0 ) + goto fail;if (~data &0x08 ) {if (loopback)break ;
@@ -402,22 +424,29 @@ static inline int reset_mac(pegasus_t *pegasus) }if (usb_dev_id[pegasus->dev_index].vendor ==VENDOR_ELCON ) {__u16 auxmode; -read_mii_word (pegasus,3 ,0x1b , &auxmode); + ret =read_mii_word (pegasus,3 ,0x1b , &auxmode); +if (ret <0 ) + goto fail; auxmode |=4 ;write_mii_word (pegasus,3 ,0x1b , &auxmode); }return 0 ; +fail: +netif_dbg (pegasus, drv, pegasus->net,"%s failed\n" , __func__); +return ret; }static int enable_net_traffic (struct net_device *dev,struct usb_device *usb) { -__u16 linkpart; -__u8 data[4 ];pegasus_t *pegasus =netdev_priv (dev);int ret; +__u16 linkpart; +__u8 data[4 ]; -read_mii_word (pegasus, pegasus->phy,MII_LPA , &linkpart); + ret =read_mii_word (pegasus, pegasus->phy,MII_LPA , &linkpart); +if (ret <0 ) + goto fail; data[0 ] =0xc8 ;/* TX & RX enable, append status, no CRC */ data[1 ] =0 ;if (linkpart & (ADVERTISE_100FULL |ADVERTISE_10FULL ))
@@ -435,11 +464,16 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb) usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS2 || usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {u16 auxmode; -read_mii_word (pegasus,0 ,0x1b , &auxmode); + ret =read_mii_word (pegasus,0 ,0x1b , &auxmode); +if (ret <0 ) + goto fail; auxmode |=4 ;write_mii_word (pegasus,0 ,0x1b , &auxmode); } +return 0 ; +fail: +netif_dbg (pegasus, drv, pegasus->net,"%s failed\n" , __func__);return ret; }
@@ -447,9 +481,9 @@ static void read_bulk_callback(struct urb *urb) {pegasus_t *pegasus = urb->context;struct net_device *net; +u8 *buf = urb->transfer_buffer;int rx_status, count = urb->actual_length;int status = urb->status; -u8 *buf = urb->transfer_buffer;__u16 pkt_len;if (!pegasus)
@@ -1004,8 +1038,7 @@ static int pegasus_ioctl(struct net_device *net, struct ifreq *rq, int cmd) data[0 ] = pegasus->phy; fallthrough;case SIOCDEVPRIVATE +1 : -read_mii_word (pegasus, data[0 ], data[1 ] &0x1f , &data[3 ]); - res =0 ; + res =read_mii_word (pegasus, data[0 ], data[1 ] &0x1f , &data[3 ]);break ;case SIOCDEVPRIVATE +2 :if (!capable (CAP_NET_ADMIN ))
@@ -1039,22 +1072,25 @@ static void pegasus_set_multicast(struct net_device *net)static __u8 mii_phy_probe (pegasus_t *pegasus) { -int i; +int i, ret;__u16 tmp;for (i =0 ; i <32 ; i++) { -read_mii_word (pegasus, i,MII_BMSR , &tmp); + ret =read_mii_word (pegasus, i,MII_BMSR , &tmp); +if (ret <0 ) + goto fail;if (tmp ==0 || tmp ==0xffff || (tmp &BMSR_MEDIA ) ==0 )continue ;else return i; } - +fail:return 0xff ; }static inline void setup_pegasus_II (pegasus_t *pegasus) { +int ret;__u8 data =0xa5 ;set_register (pegasus, Reg1d,0 );
@@ -1066,7 +1102,9 @@ static inline void setup_pegasus_II(pegasus_t *pegasus)set_register (pegasus, Reg7b,2 );set_register (pegasus,0x83 , data); -get_registers (pegasus,0x83 ,1 , &data); + ret =get_registers (pegasus,0x83 ,1 , &data); +if (ret <0 ) + goto fail;if (data ==0xa5 ) pegasus->chip =0x8513 ;
@@ -1081,6 +1119,10 @@ static inline void setup_pegasus_II(pegasus_t *pegasus)set_register (pegasus, Reg81,6 ); else set_register(pegasus, Reg81, 2); + + return; +fail: + netif_dbg(pegasus, drv, pegasus->net, "%s failed\n", __func__); } static void check_carrier(struct work_struct *work)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 20/127 net: usb: lan78xx: don't modify phy_device state concurrently
In reply to Sasha LevinFrom: "Ivan T. Ivanov" <[email protected]>
[ Upstream commit 6b67d4d63edece1033972214704c04f36c5be89a ]
Currently phy_device state could be left in inconsistent state shown by following alert message[1]. This is because phy_read_status could be called concurrently from lan78xx_delayedwork, phy_state_machine and __ethtool_get_link. Fix this by making sure that phy_device state is updated atomically.
[1] lan78xx 1-1.1.1:1.0 eth0: No phy led trigger registered for speed(-1)
--- drivers/net/usb/lan78xx.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/net/usb/lan78xx.c +12 -4
@@ -1154,7 +1154,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev) {struct phy_device *phydev = dev->net->phydev;struct ethtool_link_ksettings ecmd; -int ladv, radv, ret; +int ladv, radv, ret, link;u32 buf;/* clear LAN78xx interrupt status */
@@ -1162,9 +1162,12 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)if (unlikely (ret <0 ))return -EIO ; +mutex_lock (&phydev->lock);phy_read_status (phydev); + link = phydev->link; +mutex_unlock (&phydev->lock); -if (!phydev->link && dev->link_on) { +if (!link && dev->link_on) { dev->link_on = false;/* reset MAC */
@@ -1177,7 +1180,7 @@ static int lan78xx_link_reset(struct lan78xx_net *dev)return -EIO ;del_timer (&dev->stat_monitor); - }else if (phydev->link && !dev->link_on) { + }else if (link && !dev->link_on) { dev->link_on = true;phy_ethtool_ksettings_get (phydev, &ecmd);
@@ -1466,9 +1469,14 @@ static int lan78xx_set_eee(struct net_device *net, struct ethtool_eee *edata)static u32 lan78xx_get_link (struct net_device *net) { +u32 link; + +mutex_lock (&net->phydev->lock);phy_read_status (net->phydev); + link = net->phydev->link; +mutex_unlock (&net->phydev->lock); -return net->phydev->link; +return link; } static void lan78xx_get_drvinfo(struct net_device *net,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 21/127 perf/x86: Fix out of bound MSR access
In reply to Sasha LevinFrom: Peter Zijlstra <[email protected]>
[ Upstream commit f4b4b45652578357031fbbef7f7a1b04f6fa2dc3 ]
Quoted 3 lines · Vince Weaver
[32694.087403] unchecked MSR access error: WRMSR to 0x318 (tried to write 0x0000000000000000) at rIP: 0xffffffff8106f854 (native_write_msr+0x4/0x20) [32694.101374] Call Trace: [32694.103974] perf_clear_dirty_counters+0x86/0x100
The problem being that it doesn't filter out all fake counters, in specific the above (erroneously) tries to use FIXED_BTS. Limit the fixed counters indexes to the hardware supplied number.
--- arch/x86/events/core.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
arch/x86/events/core.c +7 -5
@@ -2489,13 +2489,15 @@ void perf_clear_dirty_counters(void)return ;for_each_set_bit (i, cpuc->dirty,X86_PMC_IDX_MAX ) { -/* Metrics and fake events don't have corresponding HW counters. */ -if (is_metric_idx (i) || (i ==INTEL_PMC_IDX_FIXED_VLBR )) -continue ; -else if (i >=INTEL_PMC_IDX_FIXED ) +if (i >=INTEL_PMC_IDX_FIXED ) { +/* Metrics and fake events don't have corresponding HW counters. */ +if ((i -INTEL_PMC_IDX_FIXED ) >=hybrid (cpuc->pmu, num_counters_fixed)) +continue ; +wrmsrl (MSR_ARCH_PERFMON_FIXED_CTR0 + (i -INTEL_PMC_IDX_FIXED ),0 ); -else + }else {wrmsrl (x86_pmu_event_addr (i),0 ); + } }bitmap_zero (cpuc->dirty,X86_PMC_IDX_MAX );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 22/127 spi: cadence-quadspi: Fix check condition for DTR ops
In reply to Sasha LevinFrom: Apurva Nandan <[email protected]>
[ Upstream commit 0395be967b067d99494113d78470574e86a02ed4 ]
buswidth and dtr fields in spi_mem_op are only valid when the corresponding spi_mem_op phase has a non-zero length. For example, SPI NAND core doesn't set buswidth when using SPI_MEM_OP_NO_ADDR phase.
Fix the dtr checks in set_protocol() and suppports_mem_op() to ignore empty spi_mem_op phases, as checking for dtr field in empty phase will result in false negatives.
--- drivers/spi/spi-cadence-quadspi.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
drivers/spi/spi-cadence-quadspi.c +18 -3
@@ -325,7 +325,15 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata, f_pdata->inst_width =CQSPI_INST_TYPE_SINGLE ; f_pdata->addr_width =CQSPI_INST_TYPE_SINGLE ; f_pdata->data_width =CQSPI_INST_TYPE_SINGLE ; - f_pdata->dtr = op->data.dtr && op->cmd.dtr && op->addr.dtr; + +/* +* For an op to be DTR, cmd phase along with every other non-empty +* phase should have dtr field set to 1. If an op phase has zero +* nbytes, ignore its dtr field; otherwise, check its dtr field. +*/ + f_pdata->dtr = op->cmd.dtr && + (!op->addr.nbytes || op->addr.dtr) && + (!op->data.nbytes || op->data.dtr);switch (op->data.buswidth) {case 0 :
@@ -1227,8 +1235,15 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem, {bool all_true, all_false; - all_true = op->cmd.dtr && op->addr.dtr && op->dummy.dtr && - op->data.dtr; +/* +* op->dummy.dtr is required for converting nbytes into ncycles. +* Also, don't check the dtr field of the op phase having zero nbytes. +*/ + all_true = op->cmd.dtr && + (!op->addr.nbytes || op->addr.dtr) && + (!op->dummy.nbytes || op->dummy.dtr) && + (!op->data.nbytes || op->data.dtr); + all_false = !op->cmd.dtr && !op->addr.dtr && !op->dummy.dtr && !op->data.dtr;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 23/127 drm/amd/display: Fix Dynamic bpp issue with 8K30 with Navi 1X
In reply to Sasha LevinFrom: Bing Guo <[email protected]>
[ Upstream commit 06050a0f01dbac2ca33145ef19a72041206ea983 ]
Why:
In DCN2x, HW doesn't automatically divide MASTER_UPDATE_LOCK_DB_X by the number of pipes ODM Combined.
How:
Set MASTER_UPDATE_LOCK_DB_X to the value that is adjusted by the number of pipes ODM Combined.
--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c +1 -1
@@ -464,7 +464,7 @@ void optc2_lock_doublebuffer_enable(struct timing_generator *optc)REG_UPDATE_2 (OTG_GLOBAL_CONTROL1 ,MASTER_UPDATE_LOCK_DB_X , - h_blank_start -200 -1 , + (h_blank_start -200 -1 ) / optc1->opp_count,MASTER_UPDATE_LOCK_DB_Y , v_blank_start -1 ); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 24/127 drm/amd/display: workaround for hard hang on HPD on native DP
In reply to Sasha LevinFrom: Qingqing Zhuo <[email protected]>
[ Upstream commit c4152b297d56d3696ad0a9003169bc5b98ad7b72 ]
[Why]
HPD disable and enable sequences are not mutually exclusive on Linux. For HPDs that spans over 1s (i.e. HPD low = 1s), part of the disable sequence (specifically, a request to SMU to lower refclk) could come right before the call to PHY enable, causing DMUB to access an unresponsive PHY and thus a hard hang on the system.
[How]
Disable 48mhz refclk off on native DP.
--- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr.c +3 -1
@@ -66,9 +66,11 @@ int rn_get_active_display_cnt_wa(for (i =0 ; i < context->stream_count; i++) {const struct dc_stream_state *stream = context->streams[i]; +/* Extend the WA to DP for Linux*/ if (stream->signal ==SIGNAL_TYPE_HDMI_TYPE_A || stream->signal ==SIGNAL_TYPE_DVI_SINGLE_LINK || - stream->signal ==SIGNAL_TYPE_DVI_DUAL_LINK ) + stream->signal ==SIGNAL_TYPE_DVI_DUAL_LINK || + stream->signal ==SIGNAL_TYPE_DISPLAY_PORT ) tmds_present = true; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 25/127 kyber: make trace_block_rq call consistent with documentation
In reply to Sasha LevinFrom: Vincent Fu <[email protected]>
[ Upstream commit fb7b9b0231ba8f77587c23f5257a4fdb6df1219e ]
The kyber ioscheduler calls trace_block_rq_insert() *after* the request is added to the queue but the documentation for trace_block_rq_insert() says that the call should be made *before* the request is added to the queue. Move the tracepoint for the kyber ioscheduler so that it is consistent with the documentation.
Reviewed by: Adam Manzanares <[email protected]>
--- block/kyber-iosched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/kyber-iosched.c +1 -1
@@ -596,13 +596,13 @@ static void kyber_insert_requests(struct blk_mq_hw_ctx *hctx,struct list_head *head = &kcq->rq_list[sched_domain];spin_lock (&kcq->lock); +trace_block_rq_insert (rq);if (at_head)list_move (&rq->queuelist, head);else list_move_tail (&rq->queuelist, head);sbitmap_set_bit (&khd->kcq_map[sched_domain], rq->mq_ctx->index_hw[hctx->type]); -trace_block_rq_insert (rq);spin_unlock (&kcq->lock); } }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 26/127 mtd: rawnand: Add a check in of_get_nand_secure_regions()
In reply to Sasha LevinFrom: Dan Carpenter <[email protected]>
[ Upstream commit 14f97f0b8e2b9950c028d0cb7311ffe26a3cc1c0 ]
Check for whether of_property_count_elems_of_size() returns a negative error code.
--- drivers/mtd/nand/raw/nand_base.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/nand_base.c +2 -2
@@ -5059,8 +5059,8 @@ static int of_get_nand_secure_regions(struct nand_chip *chip)int nr_elem, i, j; nr_elem =of_property_count_elems_of_size (dn,"secure-regions" ,sizeof (u64)); -if (!nr_elem) -return 0 ; +if (nr_elem <=0 ) +return nr_elem; chip->nr_secure_regions = nr_elem /2 ; chip->secure_regions = kcalloc(chip->nr_secure_regions, sizeof(*chip->secure_regions),
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 27/127 arm64: dts: qcom: c630: fix correct powerdown pin for WSA881x
In reply to Sasha LevinFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit 9a253bb42f190efd1a1c156939ad7298b3529dca ]
WSA881x powerdown pin is connected to GPIO1, GPIO2 not GPIO2 and GPIO3, so correct this. This was working so far due to a shift bug in gpio driver, however once that is fixed this will stop working, so fix this!
For some reason we forgot to add this dts change in last merge cycle so currently audio is broken in 5.13 as the gpio driver fix already landed in 5.13.
--- arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sdm850-lenovo-yoga-c630.dts +2 -2
@@ -700,7 +700,7 @@ left_spkr: wsa8810-left{ compatible = "sdw10217211000"; reg = <0 3>; - powerdown-gpios = <&wcdgpio 2 GPIO_ACTIVE_HIGH>; + powerdown-gpios = <&wcdgpio 1 GPIO_ACTIVE_HIGH>; #thermal-sensor-cells = <0>; sound-name-prefix = "SpkrLeft"; #sound-dai-cells = <0>;
@@ -708,7 +708,7 @@ right_spkr: wsa8810-right{ compatible = "sdw10217211000"; - powerdown-gpios = <&wcdgpio 3 GPIO_ACTIVE_HIGH>; + powerdown-gpios = <&wcdgpio 2 GPIO_ACTIVE_HIGH>; reg = <0 4>; #thermal-sensor-cells = <0>; sound-name-prefix = "SpkrRight";
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 28/127 arm64: dts: qcom: msm8992-bullhead: Remove PSCI
In reply to Sasha LevinFrom: Petr Vorel <[email protected]>
[ Upstream commit 9d1fc2e4f5a94a492c7dd1ca577c66fdb7571c84 ]
Bullhead firmware obviously doesn't support PSCI as it fails to boot with this definition.
--- arch/arm64/boot/dts/qcom/msm8992-bullhead-rev-101.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/qcom/msm8992-bullhead-rev-101.dts +4 -0
@@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2015, LGE Inc. All rights reserved. * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2021, Petr Vorel <[email protected]> */ /dts-v1/;
@@ -17,6 +18,9 @@ qcom,board-id = <0xb64 0>; qcom,pmic-id = <0x10009 0x1000A 0x0 0x0>; + /* Bullhead firmware doesn't support PSCI */ + /delete-node/ psci; + aliases { serial0 = &blsp1_uart2; };
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 29/127 arm64: dts: qcom: msm8992-bullhead: Fix cont_splash_mem mapping
In reply to Sasha LevinFrom: Petr Vorel <[email protected]>
[ Upstream commit 3cb6a271f4b04f11270111638c24fa5c0b846dec ]
cont_splash_mem has different memory mapping than generic from msm8994.dtsi:
[ 0.000000] cma: Found cont_splash_mem@0, memory base 0x0000000003400000, size 12 MiB, limit 0xffffffffffffffff [ 0.000000] cma: CMA: reserved 12 MiB at 0x0000000003400000 for cont_splash_mem
This fixes boot.
--- arch/arm64/boot/dts/qcom/msm8992-bullhead-rev-101.dts | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm64/boot/dts/qcom/msm8992-bullhead-rev-101.dts +8 -0
@@ -10,6 +10,9 @@ #include "pm8994.dtsi" #include "pmi8994.dtsi" +/* cont_splash_mem has different memory mapping */ +/delete-node/ &cont_splash_mem; + / { model = "LG Nexus 5X"; compatible = "lg,bullhead", "qcom,msm8992";
@@ -42,6 +45,11 @@ ftrace-size = <0x10000>; pmsg-size = <0x20000>; }; + + cont_splash_mem: memory@3400000 { + reg = <0 0x03400000 0 0x1200000>; + no-map; + }; }; };
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 30/127 iommu: Check if group is NULL before remove device
In reply to Sasha LevinFrom: Frank Wunderlich <[email protected]>
[ Upstream commit 5aa95d8834e07907e64937d792c12ffef7fb271f ]
If probe_device is failing, iommu_group is not initialized because iommu_group_add_device is not reached, so freeing it will result in NULL pointer access.
iommu_bus_init
->bus_iommu_probe
->probe_iommu_group in for each:/* return -22 in fail case */
->iommu_probe_device
->__iommu_probe_device /* return -22 here.*/
-> ops->probe_device /* return -22 here.*/
-> iommu_group_get_for_dev
-> ops->device_group
-> iommu_group_add_device //good case
->remove_iommu_group //in fail case, it will remove group
->iommu_release_device
->iommu_group_remove_device // here we don't have groupIn my case ops->probe_device (mtk_iommu_probe_device from mtk_iommu_v1.c) is due to failing fwspec->ops mismatch.
--- drivers/iommu/iommu.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/iommu/iommu.c +3 -0
@@ -924,6 +924,9 @@ void iommu_group_remove_device(struct device *dev)struct iommu_group *group = dev->iommu_group;struct group_device *tmp_device, *device =NULL ; +if (!group) +return ; +dev_info (dev,"Removing from iommu group %d\n" , group->id);/* Pre-notify listeners that a device is being removed. */
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 31/127 cpufreq: arm_scmi: Fix error path when allocation failed
In reply to Sasha LevinFrom: Lukasz Luba <[email protected]>
[ Upstream commit f7d635883fb73414c7c4e2648b42adc296c5d40d ]
Stop the initialization when cpumask allocation failed and return an error.
--- drivers/cpufreq/scmi-cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/scmi-cpufreq.c +1 -1
@@ -134,7 +134,7 @@ static int scmi_cpufreq_init(struct cpufreq_policy *policy) }if (!zalloc_cpumask_var (&opp_shared_cpus,GFP_KERNEL )) - ret = -ENOMEM ; +return -ENOMEM ;/* Obtain CPUs that share SCMI performance controls */ ret =scmi_get_sharing_cpus (cpu_dev, policy->cpus);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 32/127 arm64: dts: qcom: msm8994-angler: Disable cont_splash_mem
In reply to Sasha LevinFrom: Petr Vorel <[email protected]>
[ Upstream commit 0e5ded926f2a0f8b57dfa7f0d69a30767e1ea2ce ]
As the default definition breaks booting angler:
[ 1.862561] printk: console [ttyMSM0] enabled [ 1.872260] msm_serial: driver initialized
D - 15524 - pm_driver_init, Delta
cont_splash_mem was introduced in 74d6d0a145835, but the problem manifested after commit '86588296acbf ("fdt: Properly handle "no-map" field in the memory region")'.
Disabling it because Angler's firmware does not report where the memory is allocated (dmesg from downstream kernel):
[ 0.000000] cma: Found cont_splash_mem@0, memory base 0x0000000000000000, size 16 MiB, limit 0x0000000000000000 [ 0.000000] cma: CMA: reserved 16 MiB at 0x0000000000000000 for cont_splash_mem
Similar issue might be on Google Nexus 5X (lg-bullhead). Other MSM8992/4 are known to report correct address.
--- arch/arm64/boot/dts/qcom/msm8994-angler-rev-101.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/qcom/msm8994-angler-rev-101.dts +4 -0
@@ -1,12 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2015, Huawei Inc. All rights reserved. * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2021, Petr Vorel <[email protected]> */ /dts-v1/; #include "msm8994.dtsi" +/* Angler's firmware does not report where the memory is allocated */ +/delete-node/ &cont_splash_mem; + / { model = "Huawei Nexus 6P"; compatible = "huawei,angler", "qcom,msm8994";
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 33/127 arm64: dts: qcom: sdm845-oneplus: fix reserved-mem
In reply to Sasha LevinFrom: Caleb Connolly <[email protected]>
[ Upstream commit d77c95bf9a64d8620662151b2b10efd8221f4bcc ]
Fix the upper guard and the "removed_region", this fixes the random crashes which used to occur in memory intensive loads. I'm not sure WHY the upper guard being 0x2000 instead of 0x1000 doesn't fix this, but it HAS to be 0x1000.
--- arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/sdm845-oneplus-common.dtsi +2 -2
@@ -69,7 +69,7 @@ }; rmtfs_upper_guard: memory@f5d01000 { no-map; - reg = <0 0xf5d01000 0 0x2000>; + reg = <0 0xf5d01000 0 0x1000>; }; /*
@@ -78,7 +78,7 @@ */ removed_region: memory@88f00000 { no-map; - reg = <0 0x88f00000 0 0x200000>; + reg = <0 0x88f00000 0 0x1c00000>; }; ramoops: ramoops@ac300000 {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 34/127 mt76: fix enum type mismatch
In reply to Sasha LevinFrom: Arnd Bergmann <[email protected]>
[ Upstream commit abf3d98dee7c4038152ce88833ddc2189f68cbd4 ]
There is no 'NONE' version of 'enum mcu_cipher_type', and returning 'MT_CIPHER_NONE' causes a warning:
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c: In function 'mt7921_mcu_get_cipher':drivers/net/wireless/mediatek/mt76/mt7921/mcu.c:114:24: error: implicit conversion from 'enum mt76_cipher_type' to 'enum mcu_cipher_type' [-Werror=enum-conversion]
114 | return MT_CIPHER_NONE;
| ^~~~~~~~~~~~~~Add the missing MCU_CIPHER_NONE defintion that fits in here with the same value.
--- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 3 ++- drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7921/mcu.h | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +1 -1
@@ -111,7 +111,7 @@ mt7915_mcu_get_cipher(int cipher)case WLAN_CIPHER_SUITE_SMS4 :return MCU_CIPHER_WAPI ;default : -return MT_CIPHER_NONE ; +return MCU_CIPHER_NONE ; } }
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h +2 -1
@@ -1035,7 +1035,8 @@ enum { };enum mcu_cipher_type { -MCU_CIPHER_WEP40 =1 , +MCU_CIPHER_NONE =0 , +MCU_CIPHER_WEP40 ,MCU_CIPHER_WEP104 ,MCU_CIPHER_WEP128 ,MCU_CIPHER_TKIP ,
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +1 -1
@@ -111,7 +111,7 @@ mt7921_mcu_get_cipher(int cipher)case WLAN_CIPHER_SUITE_SMS4 :return MCU_CIPHER_WAPI ;default : -return MT_CIPHER_NONE ; +return MCU_CIPHER_NONE ; } }
drivers/net/wireless/mediatek/mt76/mt7921/mcu.h +2 -1
@@ -198,7 +198,8 @@ struct sta_rec_sec { } __packed;enum mcu_cipher_type { -MCU_CIPHER_WEP40 =1 , +MCU_CIPHER_NONE =0 , +MCU_CIPHER_WEP40 ,MCU_CIPHER_WEP104 ,MCU_CIPHER_WEP128 ,MCU_CIPHER_TKIP ,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 35/127 mtd: rawnand: Fix probe failure due to of_get_nand_secure_regions()
In reply to Sasha LevinFrom: Manivannan Sadhasivam <[email protected]>
[ Upstream commit b48027083a78b13356695555a05b0e085e378687 ]
Due to 14f97f0b8e2b, the rawnand platforms without "secure-regions" property defined in DT fails to probe. The issue is, of_get_nand_secure_regions() errors out if of_property_count_elems_of_size() returns a negative error code.
If the "secure-regions" property is not present in DT, then also we'll get -EINVAL from of_property_count_elems_of_size() but it should not be treated as an error for platforms not declaring "secure-regions" in DT.
So fix this behaviour by checking for the existence of that property in DT and return 0 if it is not present.
--- drivers/mtd/nand/raw/nand_base.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/mtd/nand/raw/nand_base.c +6 -0
@@ -5056,8 +5056,14 @@ static bool of_get_nand_on_flash_bbt(struct device_node *np)static int of_get_nand_secure_regions (struct nand_chip *chip) {struct device_node *dn =nand_get_flash_node (chip); +struct property *prop;int nr_elem, i, j; +/* Only proceed if the "secure-regions" property is present in DT */ + prop =of_find_property (dn,"secure-regions" ,NULL ); +if (!prop) +return 0 ; + nr_elem =of_property_count_elems_of_size (dn,"secure-regions" ,sizeof (u64));if (nr_elem <=0 )return nr_elem;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 36/127 soc: fsl: qe: convert QE interrupt controller to platform_device
In reply to Sasha LevinFrom: Maxim Kochetkov <[email protected]>
[ Upstream commit be7ecbd240b2f9ec544d3ce6fccf4cec3cd15dca ]
Since 5.13 QE's ucc nodes can't get interrupts from devicetree:
ucc@2000 {
cell-index = <1>;
reg = <0x2000 0x200>;
interrupts = <32>;
interrupt-parent = <&qeic>;
};Now fw_devlink expects driver to create and probe a struct device for interrupt controller.
So lets convert this driver to simple platform_device with probe(). Also use platform_get_ and devm_ family function to get/allocate resources and drop unused .compatible = "qeic".
[1] - https://lore.kernel.org/lkml/CAGETcx9PiX==mLxB9PO8Myyk6u2vhPVwTMsA5NkD-ywH5xhusw@mail.gmail.com
--- drivers/soc/fsl/qe/qe_ic.c | 75 ++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 31 deletions(-)
drivers/soc/fsl/qe/qe_ic.c +44 -31
@@ -23,6 +23,7 @@#include <linux/signal.h> #include <linux/device.h> #include <linux/spinlock.h> +#include <linux/platform_device.h> #include <asm/irq.h> #include <asm/io.h> #include <soc/fsl/qe/qe.h>
@@ -404,41 +405,40 @@ static void qe_ic_cascade_muxed_mpic(struct irq_desc *desc) chip->irq_eoi (&desc->irq_data); } -static void __init qe_ic_init (struct device_node *node) +static int qe_ic_init (struct platform_device *pdev) { +struct device *dev = &pdev->dev;void (*low_handler)(struct irq_desc *desc);void (*high_handler)(struct irq_desc *desc);struct qe_ic *qe_ic; -struct resource res; -u32 ret; +struct resource *res; +struct device_node *node = pdev->dev.of_node; - ret =of_address_to_resource (node,0 , &res); -if (ret) -return ; + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (res ==NULL ) { +dev_err (dev,"no memory resource defined\n" ); +return -ENODEV ; + } - qe_ic =kzalloc (sizeof (*qe_ic),GFP_KERNEL ); + qe_ic =devm_kzalloc (dev,sizeof (*qe_ic),GFP_KERNEL );if (qe_ic ==NULL ) -return ; +return -ENOMEM ; - qe_ic->irqhost =irq_domain_add_linear (node,NR_QE_IC_INTS , - &qe_ic_host_ops, qe_ic); -if (qe_ic->irqhost ==NULL ) { -kfree (qe_ic); -return ; + qe_ic->regs =devm_ioremap (dev, res->start,resource_size (res)); +if (qe_ic->regs ==NULL ) { +dev_err (dev,"failed to ioremap() registers\n" ); +return -ENODEV ; } - qe_ic->regs =ioremap (res.start,resource_size (&res)); - qe_ic->hc_irq = qe_ic_irq_chip; - qe_ic->virq_high =irq_of_parse_and_map (node,0 ); - qe_ic->virq_low =irq_of_parse_and_map (node,1 ); + qe_ic->virq_high =platform_get_irq (pdev,0 ); + qe_ic->virq_low =platform_get_irq (pdev,1 ); -if (!qe_ic->virq_low) { -printk (KERN_ERR "Failed to map QE_IC low IRQ\n" ); -kfree (qe_ic); -return ; +if (qe_ic->virq_low <0 ) { +return -ENODEV ; } +if (qe_ic->virq_high != qe_ic->virq_low) { low_handler = qe_ic_cascade_low; high_handler = qe_ic_cascade_high;
@@ -447,6 +447,13 @@ static void __init qe_ic_init(struct device_node *node) high_handler =NULL ; } + qe_ic->irqhost =irq_domain_add_linear (node,NR_QE_IC_INTS , + &qe_ic_host_ops, qe_ic); +if (qe_ic->irqhost ==NULL ) { +dev_err (dev,"failed to add irq domain\n" ); +return -ENODEV ; + } +qe_ic_write (qe_ic->regs,QEIC_CICR ,0 );irq_set_handler_data (qe_ic->virq_low, qe_ic);
@@ -456,20 +463,26 @@ static void __init qe_ic_init(struct device_node *node)irq_set_handler_data (qe_ic->virq_high, qe_ic);irq_set_chained_handler (qe_ic->virq_high, high_handler); } +return 0 ; } +static const struct of_device_id qe_ic_ids[] = { + { .compatible ="fsl,qe-ic" }, + { .type ="qeic" }, + {}, +}; -static int __init qe_ic_of_init (void ) +static struct platform_driver qe_ic_driver = { -struct device_node *np; + .driver = { + .name ="qe-ic" , + .of_match_table = qe_ic_ids, + }, + .probe = qe_ic_init, +}; - np =of_find_compatible_node (NULL ,NULL ,"fsl,qe-ic" ); -if (!np) { - np =of_find_node_by_type (NULL ,"qeic" ); -if (!np) -return -ENODEV ; - } -qe_ic_init (np); -of_node_put (np); +static int __init qe_ic_of_init (void ) +{ +platform_driver_register (&qe_ic_driver);return 0 ; }subsys_initcall (qe_ic_of_init);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 37/127 cpufreq: armada-37xx: forbid cpufreq for 1.2 GHz variant
In reply to Sasha LevinFrom: Marek Behún <[email protected]>
[ Upstream commit 484f2b7c61b9ae58cc00c5127bcbcd9177af8dfe ]
The 1.2 GHz variant of the Armada 3720 SOC is unstable with DVFS: when the SOC boots, the WTMI firmware sets clocks and AVS values that work correctly with 1.2 GHz CPU frequency, but random crashes occur once cpufreq driver starts scaling.
We do not know currently what is the reason:
- it may be that the voltage value for L0 for 1.2 GHz variant provided by the vendor in the OTP is simply incorrect when scaling is used,
- it may be that some delay is needed somewhere,
- it may be something else.
The most sane solution now seems to be to simply forbid the cpufreq driver on 1.2 GHz variant.
--- drivers/cpufreq/armada-37xx-cpufreq.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/cpufreq/armada-37xx-cpufreq.c +5 -1
@@ -104,7 +104,11 @@ struct armada_37xx_dvfs { };static struct armada_37xx_dvfs armada_37xx_dvfs[] = { - {.cpu_freq_max =1200 *1000 *1000 , .divider = {1 ,2 ,4 ,6 } }, +/* +* The cpufreq scaling for 1.2 GHz variant of the SOC is currently +* unstable because we do not know how to configure it properly. +*/ +/* {.cpu_freq_max = 1200*1000*1000, .divider = {1, 2, 4, 6} }, */ {.cpu_freq_max =1000 *1000 *1000 , .divider = {1 ,2 ,4 ,5 } }, {.cpu_freq_max =800 *1000 *1000 , .divider = {1 ,2 ,3 ,4 } }, {.cpu_freq_max =600 *1000 *1000 , .divider = {2 ,4 ,5 ,6 } },
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 38/127 dccp: add do-while-0 stubs for dccp_pr_debug macros
In reply to Sasha LevinFrom: Randy Dunlap <[email protected]>
[ Upstream commit 86aab09a4870bb8346c9579864588c3d7f555299 ]
GCC complains about empty macros in an 'if' statement, so convert them to 'do {} while (0)' macros.
Fixes these build warnings:
net/dccp/output.c: In function 'dccp_xmit_packet':../net/dccp/output.c:283:71: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
283 | dccp_pr_debug("transmit_skb() returned err=%d\n", err);net/dccp/ackvec.c: In function 'dccp_ackvec_update_old':../net/dccp/ackvec.c:163:80: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
163 | (unsigned long long)seqno, state);
--- net/dccp/dccp.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/dccp/dccp.h +3 -3
@@ -41,9 +41,9 @@ extern bool dccp_debug; #define dccp_pr_debug_cat(format, a...) DCCP_PRINTK(dccp_debug, format, ##a) #define dccp_debug(fmt, a...) dccp_pr_debug_cat(KERN_DEBUG fmt, ##a)#else -#define dccp_pr_debug(format, a...) -#define dccp_pr_debug_cat(format, a...) -#define dccp_debug(format, a...) +#define dccp_pr_debug(format, a...) do {} while (0) +#define dccp_pr_debug_cat(format, a...) do {} while (0) +#define dccp_debug(format, a...) do {} while (0)#endif extern struct inet_hashinfo dccp_hashinfo;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 39/127 virtio: Protect vqs list access
In reply to Sasha LevinFrom: Parav Pandit <[email protected]>
[ Upstream commit 0e566c8f0f2e8325e35f6f97e13cde5356b41814 ]
VQs may be accessed to mark the device broken while they are created/destroyed. Hence protect the access to the vqs list.
--- drivers/virtio/virtio.c | 1 + drivers/virtio/virtio_ring.c | 8 ++++++++ include/linux/virtio.h | 1 + 3 files changed, 10 insertions(+)
drivers/virtio/virtio.c +1 -0
@@ -355,6 +355,7 @@ int register_virtio_device(struct virtio_device *dev)virtio_add_status (dev,VIRTIO_CONFIG_S_ACKNOWLEDGE );INIT_LIST_HEAD (&dev->vqs); +spin_lock_init (&dev->vqs_list_lock);/* * device_add() causes the bus infrastructure to look for a matching
drivers/virtio/virtio_ring.c +8 -0
@@ -1668,7 +1668,9 @@ static struct virtqueue *vring_create_virtqueue_packed(cpu_to_le16 (vq->packed.event_flags_shadow); } +spin_lock (&vdev->vqs_list_lock);list_add_tail (&vq->vq.list, &vdev->vqs); +spin_unlock (&vdev->vqs_list_lock);return &vq->vq; err_desc_extra:
@@ -2126,7 +2128,9 @@ struct virtqueue *__vring_new_virtqueue(unsigned int index,memset (vq->split.desc_state,0 , vring.num *sizeof (struct vring_desc_state_split )); +spin_lock (&vdev->vqs_list_lock);list_add_tail (&vq->vq.list, &vdev->vqs); +spin_unlock (&vdev->vqs_list_lock);return &vq->vq; }EXPORT_SYMBOL_GPL (__vring_new_virtqueue);
@@ -2210,7 +2214,9 @@ void vring_del_virtqueue(struct virtqueue *_vq) }if (!vq->packed_ring)kfree (vq->split.desc_state); +spin_lock (&vq->vq.vdev->vqs_list_lock);list_del (&_vq->list); +spin_unlock (&vq->vq.vdev->vqs_list_lock);kfree (vq); }EXPORT_SYMBOL_GPL (vring_del_virtqueue);
@@ -2274,10 +2280,12 @@ void virtio_break_device(struct virtio_device *dev) {struct virtqueue *_vq; +spin_lock (&dev->vqs_list_lock);list_for_each_entry (_vq, &dev->vqs, list) {struct vring_virtqueue *vq =to_vvq (_vq); vq->broken = true; } +spin_unlock (&dev->vqs_list_lock); }EXPORT_SYMBOL_GPL (virtio_break_device);
include/linux/virtio.h +1 -0
@@ -110,6 +110,7 @@ struct virtio_device {bool config_enabled;bool config_change_pending;spinlock_t config_lock; +spinlock_t vqs_list_lock;/* Protects VQs list access */ struct device dev;struct virtio_device_id id;const struct virtio_config_ops *config;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 40/127 vhost-vdpa: Fix integer overflow in vhost_vdpa_process_iotlb_update()
In reply to Sasha LevinFrom: Xie Yongji <[email protected]>
[ Upstream commit 0e398290cff997610b66e73573faaee70c9a700e ]
The "msg->iova + msg->size" addition can have an integer overflow if the iotlb message is from a malicious user space application. So let's fix it.
--- drivers/vhost/vdpa.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/vhost/vdpa.c +2 -1
@@ -614,7 +614,8 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,long pinned;int ret =0 ; -if (msg->iova < v->range.first || +if (msg->iova < v->range.first || !msg->size || + msg->iova >U64_MAX - msg->size +1 || msg->iova + msg->size -1 > v->range.last)return -EINVAL ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 41/127 bus: ti-sysc: Fix error handling for sysc_check_active_timer()
In reply to Sasha LevinFrom: Tony Lindgren <[email protected]>
[ Upstream commit 06a089ef644934372a3062528244fca3417d3430 ]
We have changed the return type for sysc_check_active_timer() from -EBUSY to -ENXIO, but the gpt12 system timer fix still checks for -EBUSY. We are also not returning on other errors like we did earlier as noted by Pavel Machek <[email protected]>.
Commit 3ff340e24c9d ("bus: ti-sysc: Fix gpt12 system timer issue with reserved status") should have been updated for commit 65fb73676112 ("bus: ti-sysc: suppress err msg for timers used as clockevent/source").
Let's fix the issue by checking for -ENXIO and returning on any other errors as suggested by Pavel Machek <[email protected]>.
Depends-on: 65fb73676112 ("bus: ti-sysc: suppress err msg for timers used as clockevent/source")
--- drivers/bus/ti-sysc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/bus/ti-sysc.c +3 -1
@@ -3097,8 +3097,10 @@ static int sysc_probe(struct platform_device *pdev)return error; error =sysc_check_active_timer (ddata); -if (error == -EBUSY ) +if (error == -ENXIO ) ddata->reserved = true; +else if (error) +return error; error =sysc_get_clocks (ddata);if (error)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 42/127 vhost: Fix the calculation in vhost_overflow()
In reply to Sasha LevinFrom: Xie Yongji <[email protected]>
[ Upstream commit f7ad318ea0ad58ebe0e595e59aed270bb643b29b ]
This fixes the incorrect calculation for integer overflow when the last address of iova range is 0xffffffff.
--- drivers/vhost/vhost.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/vhost/vhost.c +8 -2
@@ -735,10 +735,16 @@ static bool log_access_ok(void __user *log_base, u64 addr, unsigned long sz) (sz + VHOST_PAGE_SIZE * 8 - 1) / VHOST_PAGE_SIZE / 8); } +/* Make sure 64 bit math will not overflow. */ static bool vhost_overflow (u64 uaddr,u64 size) { -/* Make sure 64 bit math will not overflow. */ -return uaddr >ULONG_MAX || size >ULONG_MAX || uaddr >ULONG_MAX - size; +if (uaddr >ULONG_MAX || size >ULONG_MAX ) +return true; + +if (!size) +return false; + +return uaddr >ULONG_MAX - size +1 ; }/* Caller should have vq mutex and device mutex. */
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 43/127 vdpa_sim: Fix return value check for vdpa_alloc_device()
In reply to Sasha LevinFrom: Xie Yongji <[email protected]>
[ Upstream commit 2b847f21145d84e2e1dde99d3e2c00a5468f02e4 ]
The vdpa_alloc_device() returns an error pointer upon failure, not NULL. To handle the failure correctly, this replaces NULL check with IS_ERR() check and propagate the error upwards.
--- drivers/vdpa/vdpa_sim/vdpa_sim.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/vdpa/vdpa_sim/vdpa_sim.c +3 -1
@@ -251,8 +251,10 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr) vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, dev_attr->name); -if (!vdpasim) +if (IS_ERR (vdpasim)) { + ret =PTR_ERR (vdpasim); goto err_alloc; + } vdpasim->dev_attr = *dev_attr;INIT_WORK (&vdpasim->work, dev_attr->work_fn);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 44/127 vp_vdpa: Fix return value check for vdpa_alloc_device()
In reply to Sasha LevinFrom: Xie Yongji <[email protected]>
[ Upstream commit 9632e78e82648aa98340df78eab9106f63da151e ]
The vdpa_alloc_device() returns an error pointer upon failure, not NULL. To handle the failure correctly, this replaces NULL check with IS_ERR() check and propagate the error upwards.
--- drivers/vdpa/virtio_pci/vp_vdpa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/vdpa/virtio_pci/vp_vdpa.c +2 -2
@@ -400,9 +400,9 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id) vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa, dev, &vp_vdpa_ops,NULL ); -if (vp_vdpa ==NULL ) { +if (IS_ERR (vp_vdpa)) {dev_err (dev,"vp_vdpa: Failed to allocate vDPA structure\n" ); -return -ENOMEM ; +return PTR_ERR (vp_vdpa); } mdev = &vp_vdpa->mdev;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 45/127 vDPA/ifcvf: Fix return value check for vdpa_alloc_device()
In reply to Sasha LevinFrom: Xie Yongji <[email protected]>
[ Upstream commit 1057afa0121db8bd3ca4718c8e0ca12388ab7759 ]
The vdpa_alloc_device() returns an error pointer upon failure, not NULL. To handle the failure correctly, this replaces NULL check with IS_ERR() check and propagate the error upwards.
--- drivers/vdpa/ifcvf/ifcvf_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/vdpa/ifcvf/ifcvf_main.c +2 -2
@@ -477,9 +477,9 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa, dev, &ifc_vdpa_ops,NULL ); -if (adapter ==NULL ) { +if (IS_ERR (adapter)) {IFCVF_ERR (pdev,"Failed to allocate vDPA structure" ); -return -ENOMEM ; +return PTR_ERR (adapter); }pci_set_master (pdev);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 46/127 vdpa/mlx5: Avoid destroying MR on empty iotlb
In reply to Sasha LevinFrom: Eli Cohen <[email protected]>
[ Upstream commit 08dbd5660232bede7916d8568003012c1182cc9a ]
The current code treats an empty iotlb provdied in set_map() as a special case and destroy the memory region object. This must not be done since the virtqueue objects reference this MR. Doing so will cause the driver unload to emit errors and log timeouts caused by the firmware complaining on busy resources.
This patch treats an empty iotlb as any other change of mapping. In this case, mlx5_vdpa_create_mr() will fail and the entire set_map() call to fail.
This issue has not been encountered before but was seen to occur in a non-official version of qemu. Since qemu is a userspace program, the driver must protect against such case.
--- drivers/vdpa/mlx5/core/mr.c | 9 --------- 1 file changed, 9 deletions(-)
drivers/vdpa/mlx5/core/mr.c +0 -9
@@ -454,11 +454,6 @@ out:mutex_unlock (&mr->mkey_mtx); } -static bool map_empty (struct vhost_iotlb *iotlb) -{ -return !vhost_iotlb_itree_first (iotlb,0 ,U64_MAX ); -} -int mlx5_vdpa_handle_set_map (struct mlx5_vdpa_dev *mvdev,struct vhost_iotlb *iotlb,bool *change_map) {
@@ -466,10 +461,6 @@ int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *ioint err =0 ; *change_map = false; -if (map_empty (iotlb)) { -mlx5_vdpa_destroy_mr (mvdev); -return 0 ; - }mutex_lock (&mr->mkey_mtx);if (mr->initialized) {mlx5_vdpa_info (mvdev,"memory map update\n" );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 47/127 vdpa/mlx5: Fix queue type selection logic
In reply to Sasha LevinFrom: Eli Cohen <[email protected]>
[ Upstream commit 879753c816dbbdb2a9a395aa4448d29feee92d1a ]
get_queue_type() comments that splict virtqueue is preferred, however, the actual logic preferred packed virtqueues. Since firmware has not supported packed virtqueues we ended up using split virtqueues as was desired.
Since we do not advertise support for packed virtqueues, we add a check to verify split virtqueues are indeed supported.
--- drivers/vdpa/mlx5/net/mlx5_vnet.c | 14 ++++++++++---- include/linux/mlx5/mlx5_ifc_vdpa.h | 10 ++++++---- 2 files changed, 16 insertions(+), 8 deletions(-)
drivers/vdpa/mlx5/net/mlx5_vnet.c +10 -4
@@ -752,12 +752,12 @@ static int get_queue_type(struct mlx5_vdpa_net *ndev) type_mask =MLX5_CAP_DEV_VDPA_EMULATION (ndev->mvdev.mdev, virtio_queue_type);/* prefer split queue */ -if (type_mask &MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED ) -return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED ; +if (type_mask &MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT ) +return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT ; -WARN_ON (!(type_mask &MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT )); +WARN_ON (!(type_mask &MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED )); -return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT ; +return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED ; }static bool vq_is_tx (u16 idx)
@@ -2010,6 +2010,12 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)return -ENOSPC ; mdev = mgtdev->madev->mdev; +if (!(MLX5_CAP_DEV_VDPA_EMULATION (mdev, virtio_queue_type) & +MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT )) { +dev_warn (mdev->device,"missing support for split virtqueues\n" ); +return -EOPNOTSUPP ; + } +/* we save one virtqueue for control virtqueue should we require it */ max_vqs =MLX5_CAP_DEV_VDPA_EMULATION (mdev, max_num_virtio_queues); max_vqs =min_t (u32, max_vqs,MLX5_MAX_SUPPORTED_VQS );
include/linux/mlx5/mlx5_ifc_vdpa.h +6 -4
@@ -11,13 +11,15 @@ enum { };enum { -MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT =0x1 ,// do I check this caps? -MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED =0x2 , +MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT =0 , +MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED =1 , };enum { -MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT =0 , -MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED =1 , +MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT = +BIT (MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT ), +MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED = +BIT (MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED ), };struct mlx5_ifc_virtio_q_bits {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 48/127 drm/mediatek: Add AAL output size configuration
In reply to Sasha LevinFrom: "jason-jh.lin" <[email protected]>
[ Upstream commit 71ac6f390f6a3017f58d05d677b961bb1f851338 ]
To avoid the output width and height is incorrect, AAL_OUTPUT_SIZE configuration should be set.
--- drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +2 -0
@@ -34,6 +34,7 @@#define DISP_AAL_EN 0x0000#define DISP_AAL_SIZE 0x0030 +#define DISP_AAL_OUTPUT_SIZE 0x04d8#define DISP_DITHER_EN 0x0000#define DITHER_EN BIT(0)
@@ -197,6 +198,7 @@ static void mtk_aal_config(struct device *dev, unsigned int w,struct mtk_ddp_comp_dev *priv =dev_get_drvdata (dev);mtk_ddp_write (cmdq_pkt, w <<16 | h, &priv->cmdq_reg, priv->regs,DISP_AAL_SIZE ); +mtk_ddp_write (cmdq_pkt, w <<16 | h, &priv->cmdq_reg, priv->regs,DISP_AAL_OUTPUT_SIZE ); }static void mtk_aal_gamma_set (struct device *dev,struct drm_crtc_state *state)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 49/127 drm/mediatek: Add component_del in OVL and COLOR remove function
In reply to Sasha LevinFrom: "jason-jh.lin" <[email protected]>
[ Upstream commit da4d4517ba70216799e3eb3b9bd71aa9dca065da ]
Add component_del in OVL and COLOR remove function.
--- drivers/gpu/drm/mediatek/mtk_disp_color.c | 2 ++ drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 2 ++ 2 files changed, 4 insertions(+)
drivers/gpu/drm/mediatek/mtk_disp_color.c +2 -0
@@ -134,6 +134,8 @@ static int mtk_disp_color_probe(struct platform_device *pdev)static int mtk_disp_color_remove (struct platform_device *pdev) { +component_del (&pdev->dev, &mtk_disp_color_component_ops); +return 0 ; }
drivers/gpu/drm/mediatek/mtk_disp_ovl.c +2 -0
@@ -424,6 +424,8 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)static int mtk_disp_ovl_remove (struct platform_device *pdev) { +component_del (&pdev->dev, &mtk_disp_ovl_component_ops); +return 0 ; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 50/127 bpf: Clear zext_dst of dead insns
In reply to Sasha LevinFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit 45c709f8c71b525b51988e782febe84ce933e7e0 ]
"access skb fields ok" verifier test fails on s390 with the "verifier bug. zext_dst is set, but no reg is defined" message. The first insns of the test prog are ...
0: 61 01 00 00 00 00 00 00 ldxw %r0,[%r1+0]
8: 35 00 00 01 00 00 00 00 jge %r0,0,1
10: 61 01 00 08 00 00 00 00 ldxw %r0,[%r1+8]
... and the 3rd one is dead (this does not look intentional to me, but this is a separate topic).
sanitize_dead_code() converts dead insns into "ja -1", but keeps zext_dst. When opt_subreg_zext_lo32_rnd_hi32() tries to parse such an insn, it sees this discrepancy and bails. This problem can be seen only with JITs whose bpf_jit_needs_zext() returns true.
Fix by clearning dead insns' zext_dst.
The commits that contributed to this problem are:
1. 5aa5bd14c5f8 ("bpf: add initial suite for selftests"), which introduced the test with the dead code.
2. 5327ed3d44b7 ("bpf: verifier: mark verified-insn with sub-register zext flag"), which introduced the zext_dst flag.
3. 83a2881903f3 ("bpf: Account for BPF_FETCH in insn_has_def32()"), which introduced the sanity check.
4. 9183671af6db ("bpf: Fix leakage under speculation on mispredicted branches"), which bisect points to.
It's best to fix this on stable branches that contain the second one, since that's the point where the inconsistency was introduced.
--- kernel/bpf/verifier.c | 1 + 1 file changed, 1 insertion(+)
kernel/bpf/verifier.c +1 -0
@@ -11632,6 +11632,7 @@ static void sanitize_dead_code(struct bpf_verifier_env *env)if (aux_data[i].seen)continue ;memcpy (insn + i, &trap,sizeof (trap)); + aux_data[i].zext_dst = false; } }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 51/127 bnxt: don't lock the tx queue from napi poll
In reply to Sasha LevinFrom: Jakub Kicinski <[email protected]>
[ Upstream commit 3c603136c9f82833813af77185618de5af67676c ]
We can't take the tx lock from the napi poll routine, because netpoll can poll napi at any moment, including with the tx lock already held.
The tx lock is protecting against two paths - the disable path, and (as Michael points out) the NETDEV_TX_BUSY case which may occur if NAPI completions race with start_xmit and both decide to re-enable the queue.
For the disable/ifdown path use synchronize_net() to make sure closing the device does not race we restarting the queues. Annotate accesses to dev_state against data races.
For the NAPI cleanup vs start_xmit path - appropriate barriers are already in place in the main spot where Tx queue is stopped but we need to do the same careful dance in the TX_BUSY case.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 54 ++++++++++++++--------- 1 file changed, 32 insertions(+), 22 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +32 -22
@@ -362,6 +362,26 @@ static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)return md_dst->u.port_info.port_id; } +static bool bnxt_txr_netif_try_stop_queue (struct bnxt *bp, +struct bnxt_tx_ring_info *txr, +struct netdev_queue *txq) +{ +netif_tx_stop_queue (txq); + +/* netif_tx_stop_queue() must be done before checking +* tx index in bnxt_tx_avail() below, because in +* bnxt_tx_int(), we update tx index before checking for +* netif_tx_queue_stopped(). +*/ +smp_mb (); +if (bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh) { +netif_tx_wake_queue (txq); +return false; + } + +return true; +} +static netdev_tx_t bnxt_start_xmit (struct sk_buff *skb,struct net_device *dev) {struct bnxt *bp =netdev_priv (dev);
@@ -390,8 +410,8 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) free_size =bnxt_tx_avail (bp, txr);if (unlikely (free_size <skb_shinfo (skb)->nr_frags +2 )) { -netif_tx_stop_queue (txq); -return NETDEV_TX_BUSY ; +if (bnxt_txr_netif_try_stop_queue (bp, txr, txq)) +return NETDEV_TX_BUSY ; } length = skb->len;
@@ -605,16 +625,7 @@ tx_done:if (netdev_xmit_more () && !tx_buf->is_push)bnxt_db_write (bp, &txr->tx_db, prod); -netif_tx_stop_queue (txq); - -/* netif_tx_stop_queue() must be done before checking -* tx index in bnxt_tx_avail() below, because in -* bnxt_tx_int(), we update tx index before checking for -* netif_tx_queue_stopped(). -*/ -smp_mb (); -if (bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh) -netif_tx_wake_queue (txq); +bnxt_txr_netif_try_stop_queue (bp, txr, txq); }return NETDEV_TX_OK ;
@@ -698,14 +709,9 @@ next_tx_int:smp_mb ();if (unlikely (netif_tx_queue_stopped (txq)) && - (bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh)) { -__netif_tx_lock (txq,smp_processor_id ()); -if (netif_tx_queue_stopped (txq) && -bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh && - txr->dev_state !=BNXT_DEV_STATE_CLOSING ) -netif_tx_wake_queue (txq); -__netif_tx_unlock (txq); - } +bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh && +READ_ONCE (txr->dev_state) !=BNXT_DEV_STATE_CLOSING ) +netif_tx_wake_queue (txq); } static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
@@ -9055,9 +9061,11 @@ void bnxt_tx_disable(struct bnxt *bp)if (bp->tx_ring) {for (i =0 ; i < bp->tx_nr_rings; i++) { txr = &bp->tx_ring[i]; - txr->dev_state =BNXT_DEV_STATE_CLOSING ; +WRITE_ONCE (txr->dev_state,BNXT_DEV_STATE_CLOSING ); } } +/* Make sure napi polls see @dev_state change */ +synchronize_net ();/* Drop carrier first to prevent TX timeout */ netif_carrier_off (bp->dev);/* Stop all TX queues */
@@ -9071,8 +9079,10 @@ void bnxt_tx_enable(struct bnxt *bp)for (i =0 ; i < bp->tx_nr_rings; i++) { txr = &bp->tx_ring[i]; - txr->dev_state =0 ; +WRITE_ONCE (txr->dev_state,0 ); } +/* Make sure napi polls see @dev_state change */ +synchronize_net ();netif_tx_wake_all_queues (bp->dev);if (bp->link_info.link_up)netif_carrier_on (bp->dev);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 52/127 bnxt: disable napi before canceling DIM
In reply to Sasha LevinFrom: Jakub Kicinski <[email protected]>
[ Upstream commit 01cca6b9330ac7460de44eeeb3a0607f8aae69ff ]
napi schedules DIM, napi has to be disabled first, then DIM canceled.
Noticed while reading the code.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -2
@@ -9024,10 +9024,9 @@ static void bnxt_disable_napi(struct bnxt *bp)for (i =0 ; i < bp->cp_nr_rings; i++) {struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring; +napi_disable (&bp->bnapi[i]->napi);if (bp->bnapi[i]->rx_ring)cancel_work_sync (&cpr->dim.work); - -napi_disable (&bp->bnapi[i]->napi); } }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 53/127 bnxt: make sure xmit_more + errors does not miss doorbells
In reply to Sasha LevinFrom: Jakub Kicinski <[email protected]>
[ Upstream commit e8d8c5d80f5e9d4586c68061b62c642752289095 ]
skbs are freed on error and not put on the ring. We may, however, be in a situation where we're freeing the last skb of a batch, and there is a doorbell ring pending because of xmit_more() being true earlier. Make sure we ring the door bell in such situations.
Since errors are rare don't pay attention to xmit_more() and just always flush the pending frames.
The busy case should be safe to be left alone because it can only happen if start_xmit races with completions and they both enable the queue. In that case the kick can't be pending.
Noticed while reading the code.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 39 +++++++++++++++-------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 27 insertions(+), 13 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +26 -13
@@ -69,7 +69,8 @@#include "bnxt_debugfs.h" #define BNXT_TX_TIMEOUT (5 * HZ) -#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW) +#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \ + NETIF_MSG_TX_ERR)MODULE_LICENSE ("GPL" );MODULE_DESCRIPTION ("Broadcom BCM573xx network driver" );
@@ -362,6 +363,13 @@ static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)return md_dst->u.port_info.port_id; } +static void bnxt_txr_db_kick (struct bnxt *bp,struct bnxt_tx_ring_info *txr, +u16 prod) +{ +bnxt_db_write (bp, &txr->tx_db, prod); + txr->kick_pending =0 ; +} +static bool bnxt_txr_netif_try_stop_queue (struct bnxt *bp,struct bnxt_tx_ring_info *txr,struct netdev_queue *txq)
@@ -410,6 +418,10 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) free_size =bnxt_tx_avail (bp, txr);if (unlikely (free_size <skb_shinfo (skb)->nr_frags +2 )) { +/* We must have raced with NAPI cleanup */ +if (net_ratelimit () && txr->kick_pending) +netif_warn (bp, tx_err, dev, +"bnxt: ring busy w/ flush pending!\n" );if (bnxt_txr_netif_try_stop_queue (bp, txr, txq))return NETDEV_TX_BUSY ; }
@@ -518,21 +530,16 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) normal_tx:if (length <BNXT_MIN_PKT_SIZE ) { pad =BNXT_MIN_PKT_SIZE - length; -if (skb_pad (skb, pad)) { +if (skb_pad (skb, pad))/* SKB already freed. */ - tx_buf->skb =NULL ; -return NETDEV_TX_OK ; - } + goto tx_kick_pending; length =BNXT_MIN_PKT_SIZE ; } mapping =dma_map_single (&pdev->dev, skb->data, len,DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (&pdev->dev, mapping))) { -dev_kfree_skb_any (skb); - tx_buf->skb =NULL ; -return NETDEV_TX_OK ; - } +if (unlikely (dma_mapping_error (&pdev->dev, mapping))) + goto tx_free;dma_unmap_addr_set (tx_buf, mapping, mapping); flags = (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD |
@@ -617,13 +624,15 @@ normal_tx: txr->tx_prod = prod;if (!netdev_xmit_more () ||netif_xmit_stopped (txq)) -bnxt_db_write (bp, &txr->tx_db, prod); +bnxt_txr_db_kick (bp, txr, prod); +else + txr->kick_pending =1 ; tx_done:if (unlikely (bnxt_tx_avail (bp, txr) <=MAX_SKB_FRAGS +1 )) {if (netdev_xmit_more () && !tx_buf->is_push) -bnxt_db_write (bp, &txr->tx_db, prod); +bnxt_txr_db_kick (bp, txr, prod);bnxt_txr_netif_try_stop_queue (bp, txr, txq); }
@@ -635,7 +644,6 @@ tx_dma_error:/* start back at beginning and unmap skb */ prod = txr->tx_prod; tx_buf = &txr->tx_buf_ring[prod]; - tx_buf->skb =NULL ;dma_unmap_single (&pdev->dev,dma_unmap_addr (tx_buf, mapping),skb_headlen (skb),PCI_DMA_TODEVICE ); prod =NEXT_TX (prod);
@@ -649,7 +657,12 @@ tx_dma_error: PCI_DMA_TODEVICE); } +tx_free:dev_kfree_skb_any (skb); +tx_kick_pending: +if (txr->kick_pending) +bnxt_txr_db_kick (bp, txr, txr->tx_prod); + txr->tx_buf_ring[txr->tx_prod].skb =NULL ;return NETDEV_TX_OK ; }
drivers/net/ethernet/broadcom/bnxt/bnxt.h +1 -0
@@ -783,6 +783,7 @@ struct bnxt_tx_ring_info {u16 tx_prod;u16 tx_cons;u16 txq_index; +u8 kick_pending;struct bnxt_db_info tx_db;struct tx_bd *tx_desc_ring[MAX_TX_PAGES ];
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 54/127 bnxt: count Tx drops
In reply to Sasha LevinFrom: Jakub Kicinski <[email protected]>
[ Upstream commit fb9f7190092d2bbd1f8f0b1cc252732cbe99a87e ]
Drivers should count packets they are dropping.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 -0
@@ -409,6 +409,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev) i =skb_get_queue_mapping (skb);if (unlikely (i >= bp->tx_nr_rings)) {dev_kfree_skb_any (skb); +atomic_long_inc (&dev->tx_dropped);return NETDEV_TX_OK ; }
@@ -663,6 +664,7 @@ tx_kick_pending:if (txr->kick_pending)bnxt_txr_db_kick (bp, txr, txr->tx_prod); txr->tx_buf_ring[txr->tx_prod].skb =NULL ; +atomic_long_inc (&dev->tx_dropped);return NETDEV_TX_OK ; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 55/127 soc: fsl: qe: fix static checker warning
In reply to Sasha LevinFrom: Maxim Kochetkov <[email protected]>
[ Upstream commit c1e64c0aec8cb0499e61af7ea086b59abba97945 ]
The patch be7ecbd240b2: "soc: fsl: qe: convert QE interrupt controller to platform_device" from Aug 3, 2021, leads to the following static checker warning:
drivers/soc/fsl/qe/qe_ic.c:438 qe_ic_init() warn: unsigned 'qe_ic->virq_low' is never less than zero.
In old variant irq_of_parse_and_map() returns zero if failed so unsigned int for virq_high/virq_low was ok.
In new variant platform_get_irq() returns negative error codes if failed so we need to use int for virq_high/virq_low.
Also simplify high_handler checking and remove the curly braces to make checkpatch happy.
--- drivers/soc/fsl/qe/qe_ic.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/soc/fsl/qe/qe_ic.c +5 -6
@@ -54,8 +54,8 @@ struct qe_ic {struct irq_chip hc_irq;/* VIRQ numbers of QE high/low irqs */ -unsigned int virq_high; -unsigned int virq_low; +int virq_high; +int virq_low; };/*
@@ -435,11 +435,10 @@ static int qe_ic_init(struct platform_device *pdev) qe_ic->virq_high =platform_get_irq (pdev,0 ); qe_ic->virq_low =platform_get_irq (pdev,1 ); -if (qe_ic->virq_low <0 ) { +if (qe_ic->virq_low <=0 )return -ENODEV ; - } -if (qe_ic->virq_high != qe_ic->virq_low) { +if (qe_ic->virq_high >0 && qe_ic->virq_high != qe_ic->virq_low) { low_handler = qe_ic_cascade_low; high_handler = qe_ic_cascade_high; }else {
@@ -459,7 +458,7 @@ static int qe_ic_init(struct platform_device *pdev)irq_set_handler_data (qe_ic->virq_low, qe_ic);irq_set_chained_handler (qe_ic->virq_low, low_handler); -if (qe_ic->virq_high && qe_ic->virq_high != qe_ic->virq_low) { +if (high_handler) {irq_set_handler_data (qe_ic->virq_high, qe_ic);irq_set_chained_handler (qe_ic->virq_high, high_handler); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 56/127 net: 6pack: fix slab-out-of-bounds in decode_data
In reply to Sasha LevinFrom: Pavel Skripkin <[email protected]>
[ Upstream commit 19d1532a187669ce86d5a2696eb7275310070793 ]
Syzbot reported slab-out-of bounds write in decode_data(). The problem was in missing validation checks.
Syzbot's reproducer generated malicious input, which caused decode_data() to be called a lot in sixpack_decode(). Since rx_count_cooked is only 400 bytes and noone reported before, that 400 bytes is not enough, let's just check if input is malicious and complain about buffer overrun.
Fail log:
==================================================================
BUG: KASAN: slab-out-of-bounds in drivers/net/hamradio/6pack.c:843 Write of size 1 at addr ffff888087c5544e by task kworker/u4:0/7 CPU: 0 PID: 7 Comm: kworker/u4:0 Not tainted 5.6.0-rc3-syzkaller #0 ... Workqueue: events_unbound flush_to_ldisc Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x197/0x210 lib/dump_stack.c:118 print_address_description.constprop.0.cold+0xd4/0x30b mm/kasan/report.c:374 __kasan_report.cold+0x1b/0x32 mm/kasan/report.c:506 kasan_report+0x12/0x20 mm/kasan/common.c:641 __asan_report_store1_noabort+0x17/0x20 mm/kasan/generic_report.c:137 decode_data.part.0+0x23b/0x270 drivers/net/hamradio/6pack.c:843 decode_data drivers/net/hamradio/6pack.c:965 [inline] sixpack_decode drivers/net/hamradio/6pack.c:968 [inline]
--- drivers/net/hamradio/6pack.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/hamradio/6pack.c +6 -0
@@ -833,6 +833,12 @@ static void decode_data(struct sixpack *sp, unsigned char inbyte)return ; } +if (sp->rx_count_cooked +2 >=sizeof (sp->cooked_buf)) { +pr_err ("6pack: cooked buffer overrun, data loss\n" ); + sp->rx_count =0 ; +return ; + } + buf = sp->raw_buf; sp->cooked_buf[sp->rx_count_cooked++] = buf[0 ] | ((buf[1 ] <<2 ) &0xc0 );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 57/127 ptp_pch: Restore dependency on PCI
In reply to Sasha LevinFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 55c8fca1dae1fb0d11deaa21b65a647dedb1bc50 ]
During the swap dependency on PCH_GBE to selection PTP_1588_CLOCK_PCH incidentally dropped the implicit dependency on the PCI. Restore it.
--- drivers/ptp/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/ptp/Kconfig +2 -1
@@ -90,7 +90,8 @@ config PTP_1588_CLOCK_INES config PTP_1588_CLOCK_PCH tristate "Intel PCH EG20T as PTP clock" depends on X86_32 || COMPILE_TEST - depends on HAS_IOMEM && NET + depends on HAS_IOMEM && PCI + depends on NET imply PTP_1588_CLOCK help This driver adds support for using the PCH EG20T as a PTP
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 58/127 bnxt_en: Disable aRFS if running on 212 firmware
In reply to Sasha LevinFrom: Michael Chan <[email protected]>
[ Upstream commit 976e52b718c3de9077fff8f3f674afb159c57fb1 ]
212 firmware broke aRFS, so disable it. Traffic may stop after ntuple filters are inserted and deleted by the 212 firmware.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +3 -0
@@ -10668,6 +10668,9 @@ static bool bnxt_rfs_supported(struct bnxt *bp)return true;return false; } +/* 212 firmware is broken for aRFS */ +if (BNXT_FW_MAJ (bp) ==212 ) +return false;if (BNXT_PF (bp) && !BNXT_CHIP_TYPE_NITRO_A0 (bp))return true;if (bp->flags &BNXT_FLAG_NEW_RSS_CAP )
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 59/127 bnxt_en: Add missing DMA memory barriers
In reply to Sasha LevinFrom: Michael Chan <[email protected]>
[ Upstream commit 828affc27ed43441bd1efdaf4e07e96dd43a0362 ]
Each completion ring entry has a valid bit to indicate that the entry contains a valid completion event. The driver's main poll loop __bnxt_poll_work() has the proper dma_rmb() to make sure the valid bit of the next entry has been checked before proceeding further. But when we call bnxt_rx_pkt() to process the RX event, the RX completion event consists of two completion entries and only the first entry has been checked to be valid. We need the same barrier after checking the next completion entry. Add missing dma_rmb() barriers in bnxt_rx_pkt() and other similar locations.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +12 -0
@@ -1754,6 +1754,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,if (!RX_CMP_VALID (rxcmp1, tmp_raw_cons))return -EBUSY ; +/* The valid test of the entry must be done first before +* reading any further. +*/ +dma_rmb (); prod = rxr->rx_prod;if (cmp_type ==CMP_TYPE_RX_L2_TPA_START_CMP ) {
@@ -1957,6 +1961,10 @@ static int bnxt_force_rx_discard(struct bnxt *bp,if (!RX_CMP_VALID (rxcmp1, tmp_raw_cons))return -EBUSY ; +/* The valid test of the entry must be done first before +* reading any further. +*/ +dma_rmb (); cmp_type =RX_CMP_TYPE (rxcmp);if (cmp_type ==CMP_TYPE_RX_L2_CMP ) { rxcmp1->rx_cmp_cfa_code_errors_v2 |=
@@ -2421,6 +2429,10 @@ static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)if (!TX_CMP_VALID (txcmp, raw_cons))break ; +/* The valid test of the entry must be done first before +* reading any further. +*/ +dma_rmb ();if ((TX_CMP_TYPE (txcmp) &0x30 ) ==0x10 ) { tmp_raw_cons =NEXT_RAW_CMP (raw_cons); cp_cons =RING_CMP (tmp_raw_cons);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 60/127 vrf: Reset skb conntrack connection on VRF rcv
In reply to Sasha LevinFrom: Lahav Schlesinger <[email protected]>
[ Upstream commit 09e856d54bda5f288ef8437a90ab2b9b3eab83d1 ]
To fix the "reverse-NAT" for replies.
When a packet is sent over a VRF, the POST_ROUTING hooks are called
twice: Once from the VRF interface, and once from the "actual" interface the packet will be sent from:
1) First SNAT: l3mdev_l3_out() -> vrf_l3_out() -> .. -> vrf_output_direct() This causes the POST_ROUTING hooks to run.
2) Second SNAT: 'ip_output()' calls POST_ROUTING hooks again.
Similarly for replies, first ip_rcv() calls PRE_ROUTING hooks, and second vrf_l3_rcv() calls them again.
As an example, consider the following SNAT rule:
Quoted 1 line
iptables -t nat -A POSTROUTING -p udp -m udp --dport 53 -j SNAT --to-source 2.2.2.2 -o
vrf_1
In this case sending over a VRF will create 2 conntrack entries. The first is from the VRF interface, which performs the IP SNAT. The second will run the SNAT, but since the "expected reply" will remain the same, conntrack randomizes the source port of the packet:
e..g With a socket bound to 1.1.1.1:10000, sending to 3.3.3.3:53, the conntrack rules are:
udp 17 29 src=2.2.2.2 dst=3.3.3.3 sport=10000 dport=53 packets=1 bytes=68 [UNREPLIED] src=3.3.3.3 dst=2.2.2.2 sport=53 dport=61033 packets=0 bytes=0 mark=0 use=1
udp 17 29 src=1.1.1.1 dst=3.3.3.3 sport=10000 dport=53 packets=1 bytes=68 [UNREPLIED] src=3.3.3.3 dst=2.2.2.2 sport=53 dport=10000 packets=0 bytes=0 mark=0 use=1
i.e. First SNAT IP from 1.1.1.1 --> 2.2.2.2, and second the src port is SNAT-ed from 10000 --> 61033.
But when a reply is sent (3.3.3.3:53 -> 2.2.2.2:61033) only the later conntrack entry is matched:
udp 17 29 src=2.2.2.2 dst=3.3.3.3 sport=10000 dport=53 packets=1 bytes=68 src=3.3.3.3 dst=2.2.2.2 sport=53 dport=61033 packets=1 bytes=49 mark=0 use=1
udp 17 28 src=1.1.1.1 dst=3.3.3.3 sport=10000 dport=53 packets=1 bytes=68 [UNREPLIED] src=3.3.3.3 dst=2.2.2.2 sport=53 dport=10000 packets=0 bytes=0 mark=0 use=1
And a "port 61033 unreachable" ICMP packet is sent back.
The issue is that when PRE_ROUTING hooks are called from vrf_l3_rcv(), the skb already has a conntrack flow attached to it, which means nf_conntrack_in() will not resolve the flow again.
This means only the dest port is "reverse-NATed" (61033 -> 10000) but the dest IP remains 2.2.2.2, and since the socket is bound to 1.1.1.1 it's not received.
This can be verified by logging the 4-tuple of the packet in '__udp4_lib_rcv()'.
The fix is then to reset the flow when skb is received on a VRF, to let conntrack resolve the flow again (which now will hit the earlier flow).
To reproduce: (Without the fix "Got pkt_to_nat_port" will not be printed by
running 'bash ./repro'):
$ cat run_in_A1.py
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import argparse def get_packet_to_send(udp_dst_port, msg_name):
return Ether(src='11:22:33:44:55:66', dst=iface_mac)/ \
IP(src='3.3.3.3', dst='2.2.2.2')/ \
UDP(sport=53, dport=udp_dst_port)/ \
Raw(f'{msg_name}\x0012345678901234567890') parser = argparse.ArgumentParser() parser.add_argument('-iface_mac', dest="iface_mac", type=str, required=True,
help="From run_in_A3.py")
parser.add_argument('-socket_port', dest="socket_port", type=str,
required=True, help="From run_in_A3.py")
parser.add_argument('-v1_mac', dest="v1_mac", type=str, required=True,
help="From script")
args, _ = parser.parse_known_args()
iface_mac = args.iface_mac
socket_port = int(args.socket_port)
v1_mac = args.v1_mac
print(f'Source port before NAT: {socket_port}')
while True:
pkts = sniff(iface='_v0', store=True, count=1, timeout=10) if 0 == len(pkts):
print('Something failed, rerun the script :(', flush=True) break
pkt = pkts[0]
if not pkt.haslayer('UDP'):
continue
pkt_sport = pkt.getlayer('UDP').sport print(f'Source port after NAT: {pkt_sport}', flush=True)
pkt_to_send = get_packet_to_send(pkt_sport, 'pkt_to_nat_port') sendp(pkt_to_send, '_v0', verbose=False) # Will not be received
pkt_to_send = get_packet_to_send(socket_port, 'pkt_to_socket_port') sendp(pkt_to_send, '_v0', verbose=False)
break
$ cat run_in_A2.py import socket import netifaces
print(f"{netifaces.ifaddresses('e00000')[netifaces.AF_LINK][0]['addr']}",
flush=True)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BINDTODEVICE,
str('vrf_1' + '\0').encode('utf-8')) s.connect(('3.3.3.3', 53))
print(f'{s. getsockname()[1]}', flush=True)
s.settimeout(5)
while True:
try:
# Periodically send in order to keep the conntrack entry alive. s.send(b'a'*40)
resp = s.recvfrom(1024)
msg_name = resp[0].decode('utf-8').split('\0')[0] print(f"Got {msg_name}", flush=True)
except Exception as e:
pass
$ cat repro.sh ip netns del A1 2> /dev/null ip netns del A2 2> /dev/null ip netns add A1 ip netns add A2
ip -n A1 link add _v0 type veth peer name _v1 netns A2 ip -n A1 link set _v0 up
ip -n A2 link add e00000 type bond
ip -n A2 link add lo0 type dummy
ip -n A2 link add vrf_1 type vrf table 10001
ip -n A2 link set vrf_1 up
ip -n A2 link set e00000 master vrf_1
ip -n A2 addr add 1.1.1.1/24 dev e00000
ip -n A2 link set e00000 up
ip -n A2 link set _v1 master e00000
ip -n A2 link set _v1 up
ip -n A2 link set lo0 up
ip -n A2 addr add 2.2.2.2/32 dev lo0
ip -n A2 neigh add 1.1.1.10 lladdr 77:77:77:77:77:77 dev e00000 ip -n A2 route add 3.3.3.3/32 via 1.1.1.10 dev e00000 table 10001
ip netns exec A2 iptables -t nat -A POSTROUTING -p udp -m udp --dport 53 -j \ SNAT --to-source 2.2.2.2 -o vrf_1
sleep 5
ip netns exec A2 python3 run_in_A2.py > x &
XPID=$!
sleep 5
IFACE_MAC=`sed -n 1p x`
SOCKET_PORT=`sed -n 2p x`
V1_MAC=`ip -n A2 link show _v1 | sed -n 2p | awk '{print $2'}`
ip netns exec A1 python3 run_in_A1.py -iface_mac ${IFACE_MAC} -socket_port \
${SOCKET_PORT} -v1_mac ${SOCKET_PORT}
sleep 5 kill -9 $XPID
wait $XPID 2> /dev/null
ip netns del A1
ip netns del A2
tail x -n 2
rm x
set +x
--- drivers/net/vrf.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/vrf.c +4 -0
@@ -1367,6 +1367,8 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,bool need_strict =rt6_need_strict (&ipv6_hdr (skb)->daddr);bool is_ndisc =ipv6_ndisc_frame (skb); +nf_reset_ct (skb); +/* loopback, multicast & non-ND link-local traffic; do not push through * packet taps again. Reset pkt_type for upper layers to process skb. * For strict packets with a source LLA, determine the dst using the
@@ -1429,6 +1431,8 @@ static struct sk_buff *vrf_ip_rcv(struct net_device *vrf_dev, skb->skb_iif = vrf_dev->ifindex;IPCB (skb)->flags |=IPSKB_L3SLAVE ; +nf_reset_ct (skb); +if (ipv4_is_multicast (ip_hdr (skb)->daddr)) goto out;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 61/127 virtio-net: use NETIF_F_GRO_HW instead of NETIF_F_LRO
In reply to Sasha LevinFrom: Jason Wang <[email protected]>
[ Upstream commit dbcf24d153884439dad30484a0e3f02350692e4c ]
Commit a02e8964eaf92 ("virtio-net: ethtool configurable LRO") maps LRO to virtio guest offloading features and allows the administrator to enable and disable those features via ethtool.
This leads to several issues:
- For a device that doesn't support control guest offloads, the "LRO" can't be disabled triggering WARN in dev_disable_lro() when turning off LRO or when enabling forwarding bridging etc.
- For a device that supports control guest offloads, the guest offloads are disabled in cases of bridging, forwarding etc slowing down the traffic.
Fix this by using NETIF_F_GRO_HW instead. Though the spec does not guarantee packets to be re-segmented as the original ones, we can add that to the spec, possibly with a flag for devices to differentiate between GRO and LRO.
Further, we never advertised LRO historically before a02e8964eaf92 ("virtio-net: ethtool configurable LRO") and so bridged/forwarded configs effectively always relied on virtio receive offloads behaving like GRO - thus even if this breaks any configs it is at least not a regression.
--- drivers/net/virtio_net.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/virtio_net.c +7 -7
@@ -63,7 +63,7 @@ static const unsigned long guest_offloads[] = { VIRTIO_NET_F_GUEST_CSUM }; -#define GUEST_OFFLOAD_LRO_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ +#define GUEST_OFFLOAD_GRO_HW_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ (1ULL << VIRTIO_NET_F_GUEST_ECN) | \ (1ULL << VIRTIO_NET_F_GUEST_UFO))
@@ -2490,7 +2490,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog, virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_ECN) || virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_UFO) || virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_CSUM))) { -NL_SET_ERR_MSG_MOD (extack,"Can't set XDP while host is implementing LRO/CSUM, disable LRO/CSUM first" ); +NL_SET_ERR_MSG_MOD (extack,"Can't set XDP while host is implementing GRO_HW/CSUM, disable GRO_HW/CSUM first" );return -EOPNOTSUPP ; }
@@ -2621,15 +2621,15 @@ static int virtnet_set_features(struct net_device *dev,u64 offloads;int err; -if ((dev->features ^ features) &NETIF_F_LRO ) { +if ((dev->features ^ features) &NETIF_F_GRO_HW ) {if (vi->xdp_enabled)return -EBUSY ; -if (features &NETIF_F_LRO ) +if (features &NETIF_F_GRO_HW ) offloads = vi->guest_offloads_capable;else offloads = vi->guest_offloads_capable & - ~GUEST_OFFLOAD_LRO_MASK ; + ~GUEST_OFFLOAD_GRO_HW_MASK ; err =virtnet_set_guest_offloads (vi, offloads);if (err)
@@ -3109,9 +3109,9 @@ static int virtnet_probe(struct virtio_device *vdev) dev->features |=NETIF_F_RXCSUM ;if (virtio_has_feature (vdev,VIRTIO_NET_F_GUEST_TSO4 ) ||virtio_has_feature (vdev,VIRTIO_NET_F_GUEST_TSO6 )) - dev->features |=NETIF_F_LRO ; + dev->features |=NETIF_F_GRO_HW ;if (virtio_has_feature (vdev,VIRTIO_NET_F_CTRL_GUEST_OFFLOADS )) - dev->hw_features |=NETIF_F_LRO ; + dev->hw_features |=NETIF_F_GRO_HW ; dev->vlan_features = dev->features;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 62/127 mac80211: fix locking in ieee80211_restart_work()
In reply to Sasha LevinFrom: Johannes Berg <[email protected]>
[ Upstream commit 276e189f8e4e3cce1634d6bac4ed0d9ca242441b ]
Ilan's change to move locking around accidentally lost the wiphy_lock() during some porting, add it back.
--- net/mac80211/main.c | 2 ++ 1 file changed, 2 insertions(+)
net/mac80211/main.c +2 -0
@@ -260,6 +260,8 @@ static void ieee80211_restart_work(struct work_struct *work)flush_work (&local->radar_detected_work);rtnl_lock (); +/* we might do interface manipulations, so need both */ +wiphy_lock (local->hw.wiphy);WARN (test_bit (SCAN_HW_SCANNING , &local->scanning),"%s called with hardware scan in progress\n" , __func__);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 63/127 net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32
In reply to Sasha LevinFrom: Dinghao Liu <[email protected]>
[ Upstream commit 0a298d133893c72c96e2156ed7cb0f0c4a306a3e ]
qlcnic_83xx_unlock_flash() is called on all paths after we call qlcnic_83xx_lock_flash(), except for one error path on failure of QLCRD32(), which may cause a deadlock. This bug is suggested by a static analysis tool, please advise.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +3 -1
@@ -3156,8 +3156,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, indirect_addr =QLC_83XX_FLASH_DIRECT_DATA (addr); ret =QLCRD32 (adapter, indirect_addr, &err); -if (err == -EIO ) +if (err == -EIO ) { +qlcnic_83xx_unlock_flash (adapter);return err; + } word = ret; *(u32 *)p_data = word;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 64/127 ixgbe, xsk: clean up the resources in ixgbe_xsk_pool_enable error path
In reply to Sasha LevinFrom: Wang Hai <[email protected]>
[ Upstream commit 1b80fec7b043552e01609bae7d0aad07aa742adc ]
In ixgbe_xsk_pool_enable(), if ixgbe_xsk_wakeup() fails, We should restore the previous state and clean up the resources. Add the missing clear af_xdp_zc_qps and unmap dma to fix this bug.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c +4 -1
@@ -52,8 +52,11 @@ static int ixgbe_xsk_pool_enable(struct ixgbe_adapter *adapter,/* Kick start the NAPI context so that receiving will start */ err =ixgbe_xsk_wakeup (adapter->netdev, qid,XDP_WAKEUP_RX ); -if (err) +if (err) { +clear_bit (qid, adapter->af_xdp_zc_qps); +xsk_pool_dma_unmap (pool,IXGBE_RX_DMA_ATTR );return err; + } }return 0 ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 65/127 sch_cake: fix srchost/dsthost hashing mode
In reply to Sasha LevinFrom: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 86b9bbd332d0510679c7fedcee3e3bd278be5756 ]
When adding support for using the skb->hash value as the flow hash in CAKE, I accidentally introduced a logic error that broke the host-only isolation modes of CAKE (srchost and dsthost keywords). Specifically, the flow_hash variable should stay initialised to 0 in cake_hash() in pure host-based hashing mode. Add a check for this before using the skb->hash value as flow_hash.
--- net/sched/sch_cake.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_cake.c +1 -1
@@ -720,7 +720,7 @@ static u32 cake_hash(struct cake_tin_data *q, const struct sk_buff *skb, skip_hash:if (flow_override) flow_hash = flow_override -1 ; -else if (use_skbhash) +else if (use_skbhash && (flow_mode &CAKE_FLOW_FLOWS )) flow_hash = skb->hash;if (host_override) { dsthost_hash = host_override -1 ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 66/127 net: mdio-mux: Don't ignore memory allocation errors
In reply to Sasha LevinFrom: Saravana Kannan <[email protected]>
[ Upstream commit 99d81e942474cc7677d12f673f42a7ea699e2589 ]
If we are seeing memory allocation errors, don't try to continue registering child mdiobus devices. It's unlikely they'll succeed.
--- drivers/net/mdio/mdio-mux.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/net/mdio/mdio-mux.c +18 -10
@@ -82,6 +82,17 @@ out:static int parent_count; +static void mdio_mux_uninit_children (struct mdio_mux_parent_bus *pb) +{ +struct mdio_mux_child_bus *cb = pb->children; + +while (cb) { +mdiobus_unregister (cb->mii_bus); +mdiobus_free (cb->mii_bus); + cb = cb->next; + } +} + int mdio_mux_init(struct device *dev, struct device_node *mux_node, int (*switch_fn)(int cur, int desired, void *data),
@@ -144,7 +155,7 @@ int mdio_mux_init(struct device *dev, cb =devm_kzalloc (dev,sizeof (*cb),GFP_KERNEL );if (!cb) { ret_val = -ENOMEM ; -continue ; + goto err_loop; } cb->bus_number = v; cb->parent = pb;
@@ -152,8 +163,7 @@ int mdio_mux_init(struct device *dev, cb->mii_bus =mdiobus_alloc ();if (!cb->mii_bus) { ret_val = -ENOMEM ; -devm_kfree (dev, cb); -continue ; + goto err_loop; } cb->mii_bus->priv = cb;
@@ -182,6 +192,10 @@ int mdio_mux_init(struct device *dev,dev_err (dev,"Error: No acceptable child buses found\n" );devm_kfree (dev, pb); + +err_loop: +mdio_mux_uninit_children (pb); +of_node_put (child_bus_node); err_pb_kz:put_device (&parent_bus->dev); err_parent_bus:
@@ -193,14 +207,8 @@ EXPORT_SYMBOL_GPL(mdio_mux_init);void mdio_mux_uninit (void *mux_handle) {struct mdio_mux_parent_bus *pb = mux_handle; -struct mdio_mux_child_bus *cb = pb->children; - -while (cb) { -mdiobus_unregister (cb->mii_bus); -mdiobus_free (cb->mii_bus); - cb = cb->next; - } +mdio_mux_uninit_children (pb);put_device (&pb->mii_bus->dev); }EXPORT_SYMBOL_GPL (mdio_mux_uninit);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 67/127 net: mdio-mux: Handle -EPROBE_DEFER correctly
In reply to Sasha LevinFrom: Saravana Kannan <[email protected]>
[ Upstream commit 7bd0cef5dac685f09ef8b0b2a7748ff42d284dc7 ]
When registering mdiobus children, if we get an -EPROBE_DEFER, we shouldn't ignore it and continue registering the rest of the mdiobus children. This would permanently prevent the deferring child mdiobus from working instead of reattempting it in the future. So, if a child mdiobus needs to be reattempted in the future, defer the entire mdio-mux initialization.
This fixes the issue where PHYs sitting under the mdio-mux aren't initialized correctly if the PHY's interrupt controller is not yet ready when the mdio-mux is being probed. Additional context in the link below.
--- drivers/net/mdio/mdio-mux.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/mdio/mdio-mux.c +6 -2
@@ -175,11 +175,15 @@ int mdio_mux_init(struct device *dev, cb->mii_bus->write = mdio_mux_write; r =of_mdiobus_register (cb->mii_bus, child_bus_node);if (r) { +mdiobus_free (cb->mii_bus); +if (r == -EPROBE_DEFER ) { + ret_val = r; + goto err_loop; + } +devm_kfree (dev, cb);dev_err (dev,"Error: Failed to register MDIO bus for child %pOF\n" , child_bus_node); -mdiobus_free (cb->mii_bus); -devm_kfree (dev, cb); }else { cb->next = pb->children; pb->children = cb;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 68/127 ovs: clear skb->tstamp in forwarding path
In reply to Sasha LevinFrom: "kaixi.fan" <[email protected]>
[ Upstream commit 01634047bf0d5c2d9b7d8095bb4de1663dbeedeb ]
fq qdisc requires tstamp to be cleared in the forwarding path. Now ovs doesn't clear skb->tstamp. We encountered a problem with linux version 5.4.56 and ovs version 2.14.1, and packets failed to dequeue from qdisc when fq qdisc was attached to ovs port.
--- net/openvswitch/vport.c | 1 + 1 file changed, 1 insertion(+)
net/openvswitch/vport.c +1 -0
@@ -507,6 +507,7 @@ void ovs_vport_send(struct vport *vport, struct sk_buff *skb, u8 mac_proto) } skb->dev = vport->dev; + skb->tstamp =0 ; vport->ops->send (skb);return ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 69/127 net: usb: asix: refactor asix_read_phy_addr() and handle errors on return
In reply to Sasha LevinFrom: Oleksij Rempel <[email protected]>
[ Upstream commit 7e88b11a862afe59ee0c365123ea5fb96a26cb3b ]
Refactor asix_read_phy_addr() to return usable error value directly and make sure all callers handle this error.
--- drivers/net/usb/asix.h | 3 +-- drivers/net/usb/asix_common.c | 31 ++++++++++++++++--------------- drivers/net/usb/asix_devices.c | 15 ++++++++++++--- drivers/net/usb/ax88172a.c | 5 +++++ 4 files changed, 34 insertions(+), 20 deletions(-)
drivers/net/usb/asix.h +1 -2
@@ -205,8 +205,7 @@ struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,int asix_set_sw_mii (struct usbnet *dev,int in_pm);int asix_set_hw_mii (struct usbnet *dev,int in_pm); -int asix_read_phy_addr (struct usbnet *dev,int internal); -int asix_get_phy_addr (struct usbnet *dev); +int asix_read_phy_addr (struct usbnet *dev,bool internal);int asix_sw_reset (struct usbnet *dev,u8 flags,int in_pm);
drivers/net/usb/asix_common.c +16 -15
@@ -288,32 +288,33 @@ int asix_set_hw_mii(struct usbnet *dev, int in_pm)return ret; } -int asix_read_phy_addr (struct usbnet *dev,int internal) +int asix_read_phy_addr (struct usbnet *dev,bool internal) { -int offset = (internal ?1 :0 ); +int ret, offset;u8 buf[2 ]; -int ret =asix_read_cmd (dev,AX_CMD_READ_PHY_ID ,0 ,0 ,2 , buf,0 ); -netdev_dbg (dev->net,"asix_get_phy_addr()\n" ); + ret =asix_read_cmd (dev,AX_CMD_READ_PHY_ID ,0 ,0 ,2 , buf,0 ); +if (ret <0 ) + goto error;if (ret <2 ) { -netdev_err (dev->net,"Error reading PHYID register: %02x\n" , ret); - goto out; + ret = -EIO ; + goto error; } -netdev_dbg (dev->net,"asix_get_phy_addr() returning 0x%04x\n" , - *((__le16 *)buf)); + + offset = (internal ?1 :0 ); ret = buf[offset]; -out: +netdev_dbg (dev->net,"%s PHY address 0x%x\n" , + internal ?"internal" :"external" , ret); +return ret; -} -int asix_get_phy_addr (struct usbnet *dev) -{ -/* return the address of the internal phy */ -return asix_read_phy_addr (dev,1 ); -} +error: +netdev_err (dev->net,"Error reading PHY_ID register: %02x\n" , ret); +return ret; +}int asix_sw_reset (struct usbnet *dev,u8 flags,int in_pm) {
drivers/net/usb/asix_devices.c +12 -3
@@ -262,7 +262,10 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) dev->mii.mdio_write = asix_mdio_write; dev->mii.phy_id_mask =0x3f ; dev->mii.reg_num_mask =0x1f ; - dev->mii.phy_id =asix_get_phy_addr (dev); + + dev->mii.phy_id =asix_read_phy_addr (dev, true); +if (dev->mii.phy_id <0 ) +return dev->mii.phy_id; dev->net->netdev_ops = &ax88172_netdev_ops; dev->net->ethtool_ops = &ax88172_ethtool_ops;
@@ -717,7 +720,10 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) dev->mii.mdio_write = asix_mdio_write; dev->mii.phy_id_mask =0x1f ; dev->mii.reg_num_mask =0x1f ; - dev->mii.phy_id =asix_get_phy_addr (dev); + + dev->mii.phy_id =asix_read_phy_addr (dev, true); +if (dev->mii.phy_id <0 ) +return dev->mii.phy_id; dev->net->netdev_ops = &ax88772_netdev_ops; dev->net->ethtool_ops = &ax88772_ethtool_ops;
@@ -1081,7 +1087,10 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) dev->mii.phy_id_mask =0x1f ; dev->mii.reg_num_mask =0xff ; dev->mii.supports_gmii =1 ; - dev->mii.phy_id =asix_get_phy_addr (dev); + + dev->mii.phy_id =asix_read_phy_addr (dev, true); +if (dev->mii.phy_id <0 ) +return dev->mii.phy_id; dev->net->netdev_ops = &ax88178_netdev_ops; dev->net->ethtool_ops = &ax88178_ethtool_ops;
drivers/net/usb/ax88172a.c +5 -0
@@ -220,6 +220,11 @@ static int ax88172a_bind(struct usbnet *dev, struct usb_interface *intf) } priv->phy_addr =asix_read_phy_addr (dev, priv->use_embdphy); +if (priv->phy_addr <0 ) { + ret = priv->phy_addr; + goto free; + } +ax88172a_reset_phy (dev, priv->use_embdphy);/* Asix framing packs multiple eth frames into a 2K usb bulk transfer */
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 70/127 iommu/vt-d: Fix incomplete cache flush in intel_pasid_tear_down_entry()
In reply to Sasha LevinFrom: Liu Yi L <[email protected]>
[ Upstream commit 8798d36411196da86e70b994725349c16c1119f6 ]
This fixes improper iotlb invalidation in intel_pasid_tear_down_entry(). When a PASID was used as nested mode, released and reused, the following error message will appear:
[ 180.187556] Unexpected page request in Privilege Mode [ 180.187565] Unexpected page request in Privilege Mode [ 180.279933] Unexpected page request in Privilege Mode [ 180.279937] Unexpected page request in Privilege Mode
Per chapter 6.5.3.3 of VT-d spec 3.3, when tear down a pasid entry, the software should use Domain selective IOTLB flush if the PGTT of the pasid entry is SL only or Nested, while for the pasid entries whose PGTT is FL only or PT using PASID-based IOTLB flush is enough.
--- drivers/iommu/intel/pasid.c | 10 ++++++++-- drivers/iommu/intel/pasid.h | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-)
drivers/iommu/intel/pasid.c +8 -2
@@ -511,7 +511,7 @@ void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev, u32 pasid, bool fault_ignore) {struct pasid_entry *pte; -u16 did; +u16 did, pgtt; pte =intel_pasid_get_entry (dev, pasid);if (WARN_ON (!pte))
@@ -521,13 +521,19 @@ void intel_pasid_tear_down_entry(struct intel_iommu *iommu, struct device *dev,return ; did =pasid_get_domain_id (pte); + pgtt =pasid_pte_get_pgtt (pte); +intel_pasid_clear_entry (dev, pasid, fault_ignore);if (!ecap_coherent (iommu->ecap))clflush_cache_range (pte,sizeof (*pte));pasid_cache_invalidation_with_pasid (iommu, did, pasid); -qi_flush_piotlb (iommu, did, pasid,0 ,-1 ,0 ); + +if (pgtt ==PASID_ENTRY_PGTT_PT || pgtt ==PASID_ENTRY_PGTT_FL_ONLY ) +qi_flush_piotlb (iommu, did, pasid,0 ,-1 ,0 ); +else + iommu->flush.flush_iotlb (iommu, did,0 ,0 ,DMA_TLB_DSI_FLUSH );/* Device IOTLB doesn't need to be flushed in caching mode. */ if (!cap_caching_mode (iommu->cap))
drivers/iommu/intel/pasid.h +6 -0
@@ -99,6 +99,12 @@ static inline bool pasid_pte_is_present(struct pasid_entry *pte)return READ_ONCE (pte->val[0 ]) &PASID_PTE_PRESENT ; } +/* Get PGTT field of a PASID table entry */ +static inline u16 pasid_pte_get_pgtt (struct pasid_entry *pte) +{ +return (u16)((READ_ONCE (pte->val[0 ]) >>6 ) &0x7 ); +} +extern unsigned int intel_pasid_max_id;int intel_pasid_alloc_table (struct device *dev);void intel_pasid_free_table (struct device *dev);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 71/127 drm/i915: Skip display interruption setup when display is not available
In reply to Sasha LevinFrom: José Roberto de Souza <[email protected]>
[ Upstream commit a844cfbe648d15d9f1031c45508c194f2d61c917 ]
Return ealier in the functions doing interruption setup for GEN8+ also adding a warning in gen8_de_irq_handler() to let us know that something else is still missing.
--- drivers/gpu/drm/i915/i915_irq.c | 39 +++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/i915_irq.c +32 -7
@@ -2421,6 +2421,8 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)u32 iir;enum pipe pipe; +drm_WARN_ON_ONCE (&dev_priv->drm, !HAS_DISPLAY (dev_priv)); +if (master_ctl &GEN8_DE_MISC_IRQ ) { iir =intel_uncore_read (&dev_priv->uncore,GEN8_DE_MISC_IIR );if (iir) {
@@ -3058,14 +3060,13 @@ static void cnp_display_clock_wa(struct drm_i915_private *dev_priv) } } -static void gen8_irq_reset (struct drm_i915_private *dev_priv) +static void gen8_display_irq_reset (struct drm_i915_private *dev_priv) {struct intel_uncore *uncore = &dev_priv->uncore;enum pipe pipe; -gen8_master_intr_disable (dev_priv->uncore.regs); - -gen8_gt_irq_reset (&dev_priv->gt); +if (!HAS_DISPLAY (dev_priv)) +return ;intel_uncore_write (uncore,EDP_PSR_IMR ,0xffffffff );intel_uncore_write (uncore,EDP_PSR_IIR ,0xffffffff );
@@ -3077,6 +3078,16 @@ static void gen8_irq_reset(struct drm_i915_private *dev_priv)GEN3_IRQ_RESET (uncore,GEN8_DE_PORT_ );GEN3_IRQ_RESET (uncore,GEN8_DE_MISC_ ); +} + +static void gen8_irq_reset (struct drm_i915_private *dev_priv) +{ +struct intel_uncore *uncore = &dev_priv->uncore; + +gen8_master_intr_disable (dev_priv->uncore.regs); + +gen8_gt_irq_reset (&dev_priv->gt); +gen8_display_irq_reset (dev_priv);GEN3_IRQ_RESET (uncore,GEN8_PCU_ );if (HAS_PCH_SPLIT (dev_priv))
@@ -3092,6 +3103,9 @@ static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)u32 trans_mask =BIT (TRANSCODER_A ) |BIT (TRANSCODER_B ) |BIT (TRANSCODER_C ) |BIT (TRANSCODER_D ); +if (!HAS_DISPLAY (dev_priv)) +return ; +intel_uncore_write (uncore,GEN11_DISPLAY_INT_CTL ,0 );if (DISPLAY_VER (dev_priv) >=12 ) {
@@ -3714,6 +3728,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)BIT (TRANSCODER_C ) |BIT (TRANSCODER_D );enum pipe pipe; +if (!HAS_DISPLAY (dev_priv)) +return ; +if (DISPLAY_VER (dev_priv) <=10 ) de_misc_masked |=GEN8_DE_MISC_GSE ;
@@ -3797,6 +3814,16 @@ static void gen8_irq_postinstall(struct drm_i915_private *dev_priv)gen8_master_intr_enable (dev_priv->uncore.regs); } +static void gen11_de_irq_postinstall (struct drm_i915_private *dev_priv) +{ +if (!HAS_DISPLAY (dev_priv)) +return ; + +gen8_de_irq_postinstall (dev_priv); + +intel_uncore_write (&dev_priv->uncore,GEN11_DISPLAY_INT_CTL , +GEN11_DISPLAY_IRQ_ENABLE ); +}static void gen11_irq_postinstall (struct drm_i915_private *dev_priv) {
@@ -3807,12 +3834,10 @@ static void gen11_irq_postinstall(struct drm_i915_private *dev_priv)icp_irq_postinstall (dev_priv);gen11_gt_irq_postinstall (&dev_priv->gt); -gen8_de_irq_postinstall (dev_priv); +gen11_de_irq_postinstall (dev_priv);GEN3_IRQ_INIT (uncore,GEN11_GU_MISC_ , ~gu_misc_masked, gu_misc_masked); -intel_uncore_write (&dev_priv->uncore,GEN11_DISPLAY_INT_CTL ,GEN11_DISPLAY_IRQ_ENABLE ); -if (HAS_MASTER_UNIT_IRQ (dev_priv)) {dg1_master_intr_enable (uncore->regs);intel_uncore_posting_read (&dev_priv->uncore,DG1_MSTR_UNIT_INTR );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 72/127 drm/i915: Tweaked Wa_14010685332 for all PCHs
In reply to Sasha LevinFrom: Anshuman Gupta <[email protected]>
[ Upstream commit b8441b288d6031eac21390891ba36487b2cb398b ]
dispcnlunit1_cp_xosc_clkreq clock observed to be active on TGL-H platform despite Wa_14010685332 original sequence,
thus blocks entry to deeper s0ix state.
The Tweaked Wa_14010685332 sequence fixes this issue, therefore use tweaked Wa_14010685332 sequence for every PCH since PCH_CNP.
v2:
- removed RKL from comment and simplified condition. [Rodrigo]
--- .../drm/i915/display/intel_display_power.c | 16 +++++++------- drivers/gpu/drm/i915/i915_irq.c | 21 ------------------- 2 files changed, 8 insertions(+), 29 deletions(-)
drivers/gpu/drm/i915/display/intel_display_power.c +8 -8
@@ -5910,13 +5910,13 @@ void intel_display_power_suspend_late(struct drm_i915_private *i915) {if (DISPLAY_VER (i915) >=11 ||IS_GEN9_LP (i915)) {bxt_enable_dc9 (i915); -/* Tweaked Wa_14010685332:icp,jsp,mcc */ -if (INTEL_PCH_TYPE (i915) >=PCH_ICP &&INTEL_PCH_TYPE (i915) <=PCH_MCC ) -intel_de_rmw (i915,SOUTH_CHICKEN1 , -SBCLK_RUN_REFCLK_DIS ,SBCLK_RUN_REFCLK_DIS ); }else if (IS_HASWELL (i915) ||IS_BROADWELL (i915)) {hsw_enable_pc8 (i915); } + +/* Tweaked Wa_14010685332:cnp,icp,jsp,mcc,tgp,adp */ +if (INTEL_PCH_TYPE (i915) >=PCH_CNP &&INTEL_PCH_TYPE (i915) <PCH_DG1 ) +intel_de_rmw (i915,SOUTH_CHICKEN1 ,SBCLK_RUN_REFCLK_DIS ,SBCLK_RUN_REFCLK_DIS ); }void intel_display_power_resume_early (struct drm_i915_private *i915)
@@ -5924,13 +5924,13 @@ void intel_display_power_resume_early(struct drm_i915_private *i915)if (DISPLAY_VER (i915) >=11 ||IS_GEN9_LP (i915)) {gen9_sanitize_dc_state (i915);bxt_disable_dc9 (i915); -/* Tweaked Wa_14010685332:icp,jsp,mcc */ -if (INTEL_PCH_TYPE (i915) >=PCH_ICP &&INTEL_PCH_TYPE (i915) <=PCH_MCC ) -intel_de_rmw (i915,SOUTH_CHICKEN1 ,SBCLK_RUN_REFCLK_DIS ,0 ); - }else if (IS_HASWELL (i915) ||IS_BROADWELL (i915)) {hsw_disable_pc8 (i915); } + +/* Tweaked Wa_14010685332:cnp,icp,jsp,mcc,tgp,adp */ +if (INTEL_PCH_TYPE (i915) >=PCH_CNP &&INTEL_PCH_TYPE (i915) <PCH_DG1 ) +intel_de_rmw (i915,SOUTH_CHICKEN1 ,SBCLK_RUN_REFCLK_DIS ,0 ); }void intel_display_power_suspend (struct drm_i915_private *i915)
drivers/gpu/drm/i915/i915_irq.c +0 -21
@@ -3042,24 +3042,6 @@ static void valleyview_irq_reset(struct drm_i915_private *dev_priv)spin_unlock_irq (&dev_priv->irq_lock); } -static void cnp_display_clock_wa (struct drm_i915_private *dev_priv) -{ -struct intel_uncore *uncore = &dev_priv->uncore; - -/* -* Wa_14010685332:cnp/cmp,tgp,adp -* TODO: Clarify which platforms this applies to -* TODO: Figure out if this workaround can be applied in the s0ix suspend/resume handlers as -* on earlier platforms and whether the workaround is also needed for runtime suspend/resume -*/ -if (INTEL_PCH_TYPE (dev_priv) ==PCH_CNP || - (INTEL_PCH_TYPE (dev_priv) >=PCH_TGP &&INTEL_PCH_TYPE (dev_priv) <PCH_DG1 )) { -intel_uncore_rmw (uncore,SOUTH_CHICKEN1 ,SBCLK_RUN_REFCLK_DIS , -SBCLK_RUN_REFCLK_DIS ); -intel_uncore_rmw (uncore,SOUTH_CHICKEN1 ,SBCLK_RUN_REFCLK_DIS ,0 ); - } -} -static void gen8_display_irq_reset (struct drm_i915_private *dev_priv) {struct intel_uncore *uncore = &dev_priv->uncore;
@@ -3093,7 +3075,6 @@ static void gen8_irq_reset(struct drm_i915_private *dev_priv)if (HAS_PCH_SPLIT (dev_priv))ibx_irq_reset (dev_priv); -cnp_display_clock_wa (dev_priv); }static void gen11_display_irq_reset (struct drm_i915_private *dev_priv)
@@ -3137,8 +3118,6 @@ static void gen11_display_irq_reset(struct drm_i915_private *dev_priv)if (INTEL_PCH_TYPE (dev_priv) >=PCH_ICP )GEN3_IRQ_RESET (uncore,SDE ); - -cnp_display_clock_wa (dev_priv); }static void gen11_irq_reset (struct drm_i915_private *dev_priv)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 73/127 pipe: avoid unnecessary EPOLLET wakeups under normal loads
In reply to Sasha LevinFrom: Linus Torvalds <[email protected]>
[ Upstream commit 3b844826b6c6affa80755254da322b017358a2f4 ]
I had forgotten just how sensitive hackbench is to extra pipe wakeups, and commit 3a34b13a88ca ("pipe: make pipe writes always wake up readers") ended up causing a quite noticeable regression on larger machines.
Now, hackbench isn't necessarily a hugely meaningful benchmark, and it's not clear that this matters in real life all that much, but as Mel points out, it's used often enough when comparing kernels and so the performance regression shows up like a sore thumb.
It's easy enough to fix at least for the common cases where pipes are used purely for data transfer, and you never have any exciting poll usage at all. So set a special 'poll_usage' flag when there is polling activity, and make the ugly "EPOLLET has crazy legacy expectations" semantics explicit to only that case.
I would love to limit it to just the broken EPOLLET case, but the pipe code can't see the difference between epoll and regular select/poll, so any non-read/write waiting will trigger the extra wakeup behavior. That is sufficient for at least the hackbench case.
Apart from making the odd extra wakeup cases more explicitly about EPOLLET, this also makes the extra wakeup be at the _end_ of the pipe write, not at the first write chunk. That is actually much saner semantics (as much as you can call any of the legacy edge-triggered expectations for EPOLLET "sane") since it means that you know the wakeup will happen once the write is done, rather than possibly in the middle of one.
[ For stable people: I'm putting a "Fixes" tag on this, but I leave it
up to you to decide whether you actually want to backport it or not. It likely has no impact outside of synthetic benchmarks - Linus ]
--- fs/pipe.c | 15 +++++++++------ include/linux/pipe_fs_i.h | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-)
fs/pipe.c +9 -6
@@ -444,9 +444,6 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)#endif /* -* Epoll nonsensically wants a wakeup whether the pipe -* was already empty or not. -* * If it wasn't empty we try to merge new data into * the last buffer. *
@@ -455,9 +452,9 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)* spanning multiple pages. */ head = pipe->head; - was_empty = true; + was_empty =pipe_empty (head, pipe->tail); chars = total_len & (PAGE_SIZE -1 ); -if (chars && !pipe_empty (head, pipe->tail)) { +if (chars && !was_empty) {unsigned int mask = pipe->ring_size -1 ;struct pipe_buffer *buf = &pipe->bufs[(head -1 ) & mask];int offset = buf->offset + buf->len;
@@ -590,8 +587,11 @@ out:* This is particularly important for small writes, because of * how (for example) the GNU make jobserver uses small writes to * wake up pending jobs +* +* Epoll nonsensically wants a wakeup whether the pipe +* was already empty or not. */ -if (was_empty) { +if (was_empty || pipe->poll_usage) {wake_up_interruptible_sync_poll (&pipe->rd_wait,EPOLLIN |EPOLLRDNORM );kill_fasync (&pipe->fasync_readers,SIGIO ,POLL_IN ); }
@@ -654,6 +654,9 @@ pipe_poll(struct file *filp, poll_table *wait)struct pipe_inode_info *pipe = filp->private_data;unsigned int head, tail; +/* Epoll has some historical nasty semantics, this enables them */ + pipe->poll_usage =1 ; +/* * Reading pipe state only -- no need for acquiring the semaphore. *
include/linux/pipe_fs_i.h +2 -0
@@ -48,6 +48,7 @@ struct pipe_buffer {* @files: number of struct file referring this pipe (protected by ->i_lock) * @r_counter: reader counter * @w_counter: writer counter +* @poll_usage: is this pipe used for epoll, which has crazy wakeups? * @fasync_readers: reader side fasync * @fasync_writers: writer side fasync * @bufs: the circular array of pipe buffers
@@ -70,6 +71,7 @@ struct pipe_inode_info {unsigned int files;unsigned int r_counter;unsigned int w_counter; +unsigned int poll_usage;struct page *tmp_page;struct fasync_struct *fasync_readers;struct fasync_struct *fasync_writers;
Signature · 1 line
2.30.2
Re: [PATCH 5.13 073/127] pipe: avoid unnecessary EPOLLET wakeups under normal loads
Quoted 4 lines · Sasha Levin
From: Linus Torvalds <[email protected]>
[ Upstream commit
3b844826b6c6affa80755254da322b017358a2f4]
This one has an odd performance regression report associated with it.
Honestly, I don't understand the performance regression, but that's likely on me, not on the kernel test robot.
So I'd hold off on applying it for now. It *might* be some odd test robot hiccup, but ..
Linus
Sasha Levin
maintainerRe: [PATCH 5.13 073/127] pipe: avoid unnecessary EPOLLET wakeups under normal loads
Quoted 6 lines · Linus Torvalds
Quoted 4 lines · Sasha Levin
From: Linus Torvalds <[email protected]>
[ Upstream commit
3b844826b6c6affa80755254da322b017358a2f4]
Quoted 7 lines
This one has an odd performance regression report associated with it.
Honestly, I don't understand the performance regression, but that's likely on me, not on the kernel test robot.
So I'd hold off on applying it for now. It *might* be some odd test robot hiccup, but ..
I'll drop it for now.
Ideally we wouldn't take it at all, but I don't think any of us wants to field "my tests have regressed!" questions for the next 5 years or so.
Thanks!
Signature · 2 lines
Thanks, Sasha
Re: [PATCH 5.13 073/127] pipe: avoid unnecessary EPOLLET wakeups under normal loads
Quoted 10 lines · Sasha Levin
Quoted 3 lines · Linus Torvalds
Honestly, I don't understand the performance regression, but that's likely on me, not on the kernel test robot.
I'll drop it for now.
Ideally we wouldn't take it at all, but I don't think any of us wants to field "my tests have regressed!" questions for the next 5 years or so.
I have a theory about what is going on, and it's not a new problem, but it would explain how that test might be so bimodal in performance if you happen to hit the exact right timing. And the test robot just might not have hit the right timing previously.
See
https://lore.kernel.org/lkml/CAHk-=wiKAg5QtrQOtvKNwkRUn0b2xufO54GPhUoTWxBgDzXWNA@mail.gmail.com/
with a test-patch in the next message in that thread.
So it looks like another case of an odd test, but it should be easy enough to make that test happy too. Knock wood.
Linus
Re: [PATCH 5.13 073/127] pipe: avoid unnecessary EPOLLET wakeups under normal loads
In reply to Linus TorvaldsQuoted 9 lines · Linus Torvalds
Quoted 2 lines · Sasha Levin
[ Upstream commit
3b844826b6c6affa80755254da322b017358a2f4]This one has an odd performance regression report associated with it.
Honestly, I don't understand the performance regression, but that's likely on me, not on the kernel test robot.
So my suspicion for the cause was confirmed by the kernel test robot people, and I've applied the fix as commit fe67f4dd8daa ("pipe: do FASYNC notifications for every pipe IO, not just state changes").
I suspect we are finally done with this saga (knock wood), and this all could go into stable. As before, the regressions in question are all for performance testing and likely there is no real-world impact outside of that, so this shouldn't be in any way critical. I didn't mark that thing for stable, but it may or may not be the right thing to do.
I _think_ I fully understand all the problems we hit, and the fixes are all obvious and straightforward and should be fine. But clearly a lot of tests use pipes for doing various IO/scheduler/random latency and throughput testing, so this all showed up in odd places.
Linus
Sasha Levin
maintainerPATCH 74/127 drm/amd/display: Use DCN30 watermark calc for DCN301
In reply to Sasha LevinFrom: Zhan Liu <[email protected]>
[ Upstream commit 37717b8c9f0e8c4dd73fc522769cc14649b4f657 ]
[why]dcn301_calculate_wm_and_dl() causes flickering when external monitor is connected.
This issue has been fixed before by commit 0e4c0ae59d7e
("drm/amdgpu/display: drop dcn301_calculate_wm_and_dl for now"), however
part of the fix was gone after commit 2cbcb78c9ee5 ("Merge tag 'amd-drm-next-5.13-2021-03-23' of https://gitlab.freedesktop.org/agd5f/linux into drm-next").
[how]
Use dcn30_calculate_wm_and_dlg() instead as in the original fix.
--- .../amd/display/dc/dcn301/dcn301_resource.c | 96 +------------------ 1 file changed, 1 insertion(+), 95 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_resource.c +1 -95
@@ -1622,106 +1622,12 @@ static void dcn301_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bdml_init_instance (&dc->dml, &dcn3_01_soc, &dcn3_01_ip,DML_PROJECT_DCN30 ); } -static void calculate_wm_set_for_vlevel ( -int vlevel, -struct wm_range_table_entry *table_entry, -struct dcn_watermarks *wm_set, -struct display_mode_lib *dml, -display_e2e_pipe_params_st *pipes, -int pipe_cnt) -{ -double dram_clock_change_latency_cached = dml->soc.dram_clock_change_latency_us; - -ASSERT (vlevel < dml->soc.num_states); -/* only pipe 0 is read for voltage and dcf/soc clocks */ - pipes[0 ].clks_cfg.voltage = vlevel; - pipes[0 ].clks_cfg.dcfclk_mhz = dml->soc.clock_limits[vlevel].dcfclk_mhz; - pipes[0 ].clks_cfg.socclk_mhz = dml->soc.clock_limits[vlevel].socclk_mhz; - - dml->soc.dram_clock_change_latency_us = table_entry->pstate_latency_us; - dml->soc.sr_exit_time_us = table_entry->sr_exit_time_us; - dml->soc.sr_enter_plus_exit_time_us = table_entry->sr_enter_plus_exit_time_us; - - wm_set->urgent_ns =get_wm_urgent (dml, pipes, pipe_cnt) *1000 ; - wm_set->cstate_pstate.cstate_enter_plus_exit_ns =get_wm_stutter_enter_exit (dml, pipes, pipe_cnt) *1000 ; - wm_set->cstate_pstate.cstate_exit_ns =get_wm_stutter_exit (dml, pipes, pipe_cnt) *1000 ; - wm_set->cstate_pstate.pstate_change_ns =get_wm_dram_clock_change (dml, pipes, pipe_cnt) *1000 ; - wm_set->pte_meta_urgent_ns =get_wm_memory_trip (dml, pipes, pipe_cnt) *1000 ; - wm_set->frac_urg_bw_nom =get_fraction_of_urgent_bandwidth (dml, pipes, pipe_cnt) *1000 ; - wm_set->frac_urg_bw_flip =get_fraction_of_urgent_bandwidth_imm_flip (dml, pipes, pipe_cnt) *1000 ; - wm_set->urgent_latency_ns =get_urgent_latency (dml, pipes, pipe_cnt) *1000 ; - dml->soc.dram_clock_change_latency_us = dram_clock_change_latency_cached; - -} - -static void dcn301_calculate_wm_and_dlg ( -struct dc *dc,struct dc_state *context, -display_e2e_pipe_params_st *pipes, -int pipe_cnt, -int vlevel_req) -{ -int i, pipe_idx; -int vlevel, vlevel_max; -struct wm_range_table_entry *table_entry; -struct clk_bw_params *bw_params = dc->clk_mgr->bw_params; - -ASSERT (bw_params); - - vlevel_max = bw_params->clk_table.num_entries -1 ; - -/* WM Set D */ - table_entry = &bw_params->wm_table.entries[WM_D ]; -if (table_entry->wm_type ==WM_TYPE_RETRAINING ) - vlevel =0 ; -else - vlevel = vlevel_max; -calculate_wm_set_for_vlevel (vlevel, table_entry, &context->bw_ctx.bw.dcn.watermarks.d, - &context->bw_ctx.dml, pipes, pipe_cnt); -/* WM Set C */ - table_entry = &bw_params->wm_table.entries[WM_C ]; - vlevel =min (max (vlevel_req,2 ), vlevel_max); -calculate_wm_set_for_vlevel (vlevel, table_entry, &context->bw_ctx.bw.dcn.watermarks.c, - &context->bw_ctx.dml, pipes, pipe_cnt); -/* WM Set B */ - table_entry = &bw_params->wm_table.entries[WM_B ]; - vlevel =min (max (vlevel_req,1 ), vlevel_max); -calculate_wm_set_for_vlevel (vlevel, table_entry, &context->bw_ctx.bw.dcn.watermarks.b, - &context->bw_ctx.dml, pipes, pipe_cnt); - -/* WM Set A */ - table_entry = &bw_params->wm_table.entries[WM_A ]; - vlevel =min (vlevel_req, vlevel_max); -calculate_wm_set_for_vlevel (vlevel, table_entry, &context->bw_ctx.bw.dcn.watermarks.a, - &context->bw_ctx.dml, pipes, pipe_cnt); - -for (i =0 , pipe_idx =0 ; i < dc->res_pool->pipe_count; i++) { -if (!context->res_ctx.pipe_ctx[i].stream) -continue ; - - pipes[pipe_idx].clks_cfg.dispclk_mhz =get_dispclk_calculated (&context->bw_ctx.dml, pipes, pipe_cnt); - pipes[pipe_idx].clks_cfg.dppclk_mhz =get_dppclk_calculated (&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); - -if (dc->config.forced_clocks) { - pipes[pipe_idx].clks_cfg.dispclk_mhz = context->bw_ctx.dml.soc.clock_limits[0 ].dispclk_mhz; - pipes[pipe_idx].clks_cfg.dppclk_mhz = context->bw_ctx.dml.soc.clock_limits[0 ].dppclk_mhz; - } -if (dc->debug.min_disp_clk_khz > pipes[pipe_idx].clks_cfg.dispclk_mhz *1000 ) - pipes[pipe_idx].clks_cfg.dispclk_mhz = dc->debug.min_disp_clk_khz /1000.0 ; -if (dc->debug.min_dpp_clk_khz > pipes[pipe_idx].clks_cfg.dppclk_mhz *1000 ) - pipes[pipe_idx].clks_cfg.dppclk_mhz = dc->debug.min_dpp_clk_khz /1000.0 ; - - pipe_idx++; - } - -dcn20_calculate_dlg_params (dc, context, pipes, pipe_cnt, vlevel); -} -static struct resource_funcs dcn301_res_pool_funcs = { .destroy = dcn301_destroy_resource_pool, .link_enc_create = dcn301_link_encoder_create, .panel_cntl_create = dcn301_panel_cntl_create, .validate_bandwidth = dcn30_validate_bandwidth, - .calculate_wm_and_dlg = dcn301_calculate_wm_and_dlg, + .calculate_wm_and_dlg = dcn30_calculate_wm_and_dlg, .update_soc_for_wm_a = dcn30_update_soc_for_wm_a, .populate_dml_pipes = dcn30_populate_dml_pipes_from_context, .acquire_idle_pipe_for_layer = dcn20_acquire_idle_pipe_for_layer,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 75/127 net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port
In reply to Sasha LevinFrom: Vladimir Oltean <[email protected]>
[ Upstream commit c1930148a3941f891ddbd76fceaa4e10a957ccf2 ]
Currently we are unable to ping a bridge on top of a felix switch which uses the ocelot-8021q tagger. The packets are dropped on the ingress of the user port and the 'drop_local' counter increments (the counter which denotes drops due to no valid destinations).
Dumping the PGID tables, it becomes clear that the PGID_SRC of the user port is zero, so it has no valid destinations.
But looking at the code, the cpu_fwd_mask (the bit mask of DSA tag_8021q ports) is clearly missing from the forwarding mask of ports that are under a bridge. So this has always been broken.
Looking at the version history of the patch, in v7
https://patchwork.kernel.org/project/netdevbpf/patch/[email protected]/
the code looked like this:
/* Standalone ports forward only to DSA tag_8021q CPU ports */ unsigned long mask = cpu_fwd_mask;
(...)
} else if (ocelot->bridge_fwd_mask & BIT(port)) {
mask |= ocelot->bridge_fwd_mask & ~BIT(port);while in v8 (the merged version)
https://patchwork.kernel.org/project/netdevbpf/patch/[email protected]/
it looked like this:
unsigned long mask;
(...)
} else if (ocelot->bridge_fwd_mask & BIT(port)) {
mask = ocelot->bridge_fwd_mask & ~BIT(port);So the breakage was introduced between v7 and v8 of the patch.
--- drivers/net/ethernet/mscc/ocelot.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mscc/ocelot.c +1 -0
@@ -1334,6 +1334,7 @@ void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot)struct net_device *bond = ocelot_port->bond; mask =ocelot_get_bridge_fwd_mask (ocelot, bridge); + mask |= cpu_fwd_mask; mask &= ~BIT (port);if (bond) { mask &= ~ocelot_get_bond_mask(ocelot, bond,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 76/127 mptcp: fix memory leak on address flush
In reply to Sasha LevinFrom: Paolo Abeni <[email protected]>
[ Upstream commit a0eea5f10eeb5180d115452b0d77afa6603dfe18 ]
The endpoint cleanup path is prone to a memory leak, as reported by syzkaller:
BUG: memory leak
unreferenced object 0xffff88810680ea00 (size 64):
comm "syz-executor.6", pid 6191, jiffies 4295756280 (age 24.138s)
hex dump (first 32 bytes):
58 75 7d 3c 80 88 ff ff 22 01 00 00 00 00 ad de Xu}<....".......
01 00 02 00 00 00 00 00 ac 1e 00 07 00 00 00 00 ................
backtrace:
[<0000000072a9f72a>] kmalloc include/linux/slab.h:591 [inline]
[<0000000072a9f72a>] mptcp_nl_cmd_add_addr+0x287/0x9f0 net/mptcp/pm_netlink.c:1170
[<00000000f6e931bf>] genl_family_rcv_msg_doit.isra.0+0x225/0x340 net/netlink/genetlink.c:731
[<00000000f1504a2c>] genl_family_rcv_msg net/netlink/genetlink.c:775 [inline]
[<00000000f1504a2c>] genl_rcv_msg+0x341/0x5b0 net/netlink/genetlink.c:792
[<0000000097e76f6a>] netlink_rcv_skb+0x148/0x430 net/netlink/af_netlink.c:2504
[<00000000ceefa2b8>] genl_rcv+0x24/0x40 net/netlink/genetlink.c:803
[<000000008ff91aec>] netlink_unicast_kernel net/netlink/af_netlink.c:1314 [inline]
[<000000008ff91aec>] netlink_unicast+0x537/0x750 net/netlink/af_netlink.c:1340
[<0000000041682c35>] netlink_sendmsg+0x846/0xd80 net/netlink/af_netlink.c:1929
[<00000000df3aa8e7>] sock_sendmsg_nosec net/socket.c:704 [inline]
[<00000000df3aa8e7>] sock_sendmsg+0x14e/0x190 net/socket.c:724
[<000000002154c54c>] ____sys_sendmsg+0x709/0x870 net/socket.c:2403
[<000000001aab01d7>] ___sys_sendmsg+0xff/0x170 net/socket.c:2457
[<00000000fa3b1446>] __sys_sendmsg+0xe5/0x1b0 net/socket.c:2486
[<00000000db2ee9c7>] do_syscall_x64 arch/x86/entry/common.c:50 [inline]
[<00000000db2ee9c7>] do_syscall_64+0x38/0x90 arch/x86/entry/common.c:80
[<000000005873517d>] entry_SYSCALL_64_after_hwframe+0x44/0xaeWe should not require an allocation to cleanup stuff.
Rework the code a bit so that the additional RCU work is no more needed.
--- net/mptcp/pm_netlink.c | 44 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 32 deletions(-)
net/mptcp/pm_netlink.c +12 -32
@@ -1135,36 +1135,12 @@ next:return 0 ; } -struct addr_entry_release_work { -struct rcu_work rwork; -struct mptcp_pm_addr_entry *entry; -}; - -static void mptcp_pm_release_addr_entry (struct work_struct *work) +/* caller must ensure the RCU grace period is already elapsed */ +static void __mptcp_pm_release_addr_entry (struct mptcp_pm_addr_entry *entry) { -struct addr_entry_release_work *w; -struct mptcp_pm_addr_entry *entry; - - w = container_of(to_rcu_work(work), struct addr_entry_release_work, rwork); - entry = w->entry; -if (entry) { -if (entry->lsk) -sock_release (entry->lsk); -kfree (entry); - } -kfree (w); -} - -static void mptcp_pm_free_addr_entry (struct mptcp_pm_addr_entry *entry) -{ -struct addr_entry_release_work *w; - - w =kmalloc (sizeof (*w),GFP_ATOMIC ); -if (w) { -INIT_RCU_WORK (&w->rwork, mptcp_pm_release_addr_entry); - w->entry = entry; -queue_rcu_work (system_wq, &w->rwork); - } +if (entry->lsk) +sock_release (entry->lsk); +kfree (entry); } static int mptcp_nl_remove_id_zero_address(struct net *net,
@@ -1244,7 +1220,8 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)spin_unlock_bh (&pernet->lock);mptcp_nl_remove_subflow_and_signal_addr (sock_net (skb->sk), &entry->addr); -mptcp_pm_free_addr_entry (entry); +synchronize_rcu (); +__mptcp_pm_release_addr_entry (entry);return ret; }
@@ -1297,6 +1274,7 @@ static void mptcp_nl_remove_addrs_list(struct net *net, } } +/* caller must ensure the RCU grace period is already elapsed */ static void __flush_addrs (struct list_head *list) {while (!list_empty (list)) {
@@ -1305,7 +1283,7 @@ static void __flush_addrs(struct list_head *list) cur =list_entry (list->next, struct mptcp_pm_addr_entry, list);list_del_rcu (&cur->list); -mptcp_pm_free_addr_entry (cur); +__mptcp_pm_release_addr_entry (cur); } }
@@ -1329,6 +1307,7 @@ static int mptcp_nl_cmd_flush_addrs(struct sk_buff *skb, struct genl_info *info)bitmap_zero (pernet->id_bitmap,MAX_ADDR_ID +1 );spin_unlock_bh (&pernet->lock);mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list); +synchronize_rcu ();__flush_addrs (&free_list);return 0 ; }
@@ -1936,7 +1915,8 @@ static void __net_exit pm_nl_exit_net(struct list_head *net_list)struct pm_nl_pernet *pernet =net_generic (net, pm_nl_pernet_id);/* net is removed from namespace list, can't race with -* other modifiers +* other modifiers, also netns core already waited for a +* RCU grace period. */ __flush_addrs (&pernet->local_addr_list); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 77/127 mptcp: full fully established support after ADD_ADDR
In reply to Sasha LevinFrom: Matthieu Baerts <[email protected]>
[ Upstream commit 67b12f792d5eaeb8b4fca3b2053e6b819eb3bf0f ]
If directly after an MP_CAPABLE 3WHS, the client receives an ADD_ADDR with HMAC from the server, it is enough to switch to a "fully established" mode because it has received more MPTCP options.
It was then OK to enable the "fully_established" flag on the MPTCP socket. Still, best to check if the ADD_ADDR looks valid by looking if it contains an HMAC (no 'echo' bit). If an ADD_ADDR echo is received while we are not in "fully established" mode, it is strange and then we should not switch to this mode now.
But that is not enough. On one hand, the path-manager has be notified the state has changed. On the other hand, the "fully_established" flag on the subflow socket should be turned on as well not to re-send the MP_CAPABLE 3rd ACK content with the next ACK.
--- net/mptcp/options.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
net/mptcp/options.c +3 -7
@@ -843,20 +843,16 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,return subflow->mp_capable; } -if (mp_opt->dss && mp_opt->use_ack) { +if ((mp_opt->dss && mp_opt->use_ack) || + (mp_opt->add_addr && !mp_opt->echo)) {/* subflows are fully established as soon as we get any -* additional ack. +* additional ack, including ADD_ADDR. */ subflow->fully_established =1 ;WRITE_ONCE (msk->fully_established, true); goto fully_established; } -if (mp_opt->add_addr) { -WRITE_ONCE (msk->fully_established, true); -return true; - } -/* If the first established packet does not contain MP_CAPABLE + data * then fallback to TCP. Fallback scenarios requires a reset for * MP_JOIN subflows.
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 78/127 r8152: fix writing USB_BP2_EN
In reply to Sasha LevinFrom: Hayes Wang <[email protected]>
[ Upstream commit a876a33d2a1102f99fc782fefb784f4dd4841d8c ]
The register of USB_BP2_EN is 16 bits, so we should use ocp_write_word(), not ocp_write_byte().
--- drivers/net/usb/r8152.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/r8152.c +1 -1
@@ -3963,7 +3963,7 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type)case RTL_VER_15 :default :if (type ==MCU_TYPE_USB ) { -ocp_write_byte (tp,MCU_TYPE_USB ,USB_BP2_EN ,0 ); +ocp_write_word (tp,MCU_TYPE_USB ,USB_BP2_EN ,0 );ocp_write_word (tp,MCU_TYPE_USB ,USB_BP_8 ,0 );ocp_write_word (tp,MCU_TYPE_USB ,USB_BP_9 ,0 );
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 79/127 r8152: fix the maximum number of PLA bp for RTL8153C
In reply to Sasha LevinFrom: Hayes Wang <[email protected]>
[ Upstream commit 6633fb83f1faddbfcac09e35edcae96bd0468335 ]
The maximum PLA bp number of RTL8153C is 16, not 8. That is, the bp 0 ~ 15 are at 0xfc28 ~ 0xfc46, and the bp_en is at 0xfc48.
--- drivers/net/usb/r8152.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/net/usb/r8152.c +19 -2
@@ -3953,13 +3953,24 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type)case RTL_VER_06 :ocp_write_byte (tp, type,PLA_BP_EN ,0 );break ; +case RTL_VER_14 : +ocp_write_word (tp, type,USB_BP2_EN ,0 ); + +ocp_write_word (tp, type,USB_BP_8 ,0 ); +ocp_write_word (tp, type,USB_BP_9 ,0 ); +ocp_write_word (tp, type,USB_BP_10 ,0 ); +ocp_write_word (tp, type,USB_BP_11 ,0 ); +ocp_write_word (tp, type,USB_BP_12 ,0 ); +ocp_write_word (tp, type,USB_BP_13 ,0 ); +ocp_write_word (tp, type,USB_BP_14 ,0 ); +ocp_write_word (tp, type,USB_BP_15 ,0 ); +break ;case RTL_VER_08 :case RTL_VER_09 :case RTL_VER_10 :case RTL_VER_11 :case RTL_VER_12 :case RTL_VER_13 : -case RTL_VER_14 :case RTL_VER_15 :default :if (type ==MCU_TYPE_USB ) {
@@ -4329,7 +4340,6 @@ static bool rtl8152_is_fw_mac_ok(struct r8152 *tp, struct fw_mac *mac)case RTL_VER_11 :case RTL_VER_12 :case RTL_VER_13 : -case RTL_VER_14 :case RTL_VER_15 : fw_reg =0xf800 ; bp_ba_addr =PLA_BP_BA ;
@@ -4337,6 +4347,13 @@ static bool rtl8152_is_fw_mac_ok(struct r8152 *tp, struct fw_mac *mac) bp_start =PLA_BP_0 ; max_bp =8 ;break ; +case RTL_VER_14 : + fw_reg =0xf800 ; + bp_ba_addr =PLA_BP_BA ; + bp_en_addr =USB_BP2_EN ; + bp_start =PLA_BP_0 ; + max_bp =16 ; +break ;default : goto out; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 80/127 PCI/sysfs: Use correct variable for the legacy_mem sysfs object
In reply to Sasha LevinFrom: Krzysztof Wilczyński <[email protected]>
[ Upstream commit 045a9277b5615846c7b662ffaba84e781f08a172 ]
Two legacy PCI sysfs objects "legacy_io" and "legacy_mem" were updated to use an unified address space in the commit 636b21b50152 ("PCI: Revoke mappings like devmem"). This allows for revocations to be managed from a single place when drivers want to take over and mmap() a /dev/mem range.
Following the update, both of the sysfs objects should leverage the iomem_get_mapping() function to get an appropriate address range, but only the "legacy_io" has been correctly updated - the second attribute seems to be using a wrong variable to pass the iomem_get_mapping() function to.
Thus, correct the variable name used so that the "legacy_mem" sysfs object would also correctly call the iomem_get_mapping() function.
--- drivers/pci/pci-sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/pci-sysfs.c +1 -1
@@ -978,7 +978,7 @@ void pci_create_legacy_files(struct pci_bus *b) b->legacy_mem->size =1024 *1024 ; b->legacy_mem->attr.mode =0600 ; b->legacy_mem->mmap = pci_mmap_legacy_mem; - b->legacy_io->mapping =iomem_get_mapping (); + b->legacy_mem->mapping =iomem_get_mapping ();pci_adjust_legacy_attr (b, pci_mmap_mem); error =device_create_bin_file (&b->dev, b->legacy_mem);if (error)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 81/127 i40e: Fix ATR queue selection
In reply to Sasha LevinFrom: Arkadiusz Kubalewski <[email protected]>
[ Upstream commit a222be597e316389f9f8c26033352c124ce93056 ]
Without this patch, ATR does not work. Receive/transmit uses queue selection based on SW DCB hashing method.
If traffic classes are not configured for PF, then use netdev_pick_tx function for selecting queue for packet transmission. Instead of calling i40e_swdcb_skb_tx_hash, call netdev_pick_tx, which ensures that packet is transmitted/received from CPU that is running the application.
Reproduction steps:
1. Load i40e driver
2. Map each MSI interrupt of i40e port for each CPU
3. Disable ntuple, enable ATR i.e.:
ethtool -K $interface ntuple off
ethtool --set-priv-flags $interface flow-director-atr
4. Run application that is generating traffic and is bound to a single CPU, i.e.:
taskset -c 9 netperf -H 1.1.1.1 -t TCP_RR -l 10
5. Observe behavior:
Application's traffic should be restricted to the CPU provided in taskset.
--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1 -2
@@ -3665,8 +3665,7 @@ u16 i40e_lan_select_queue(struct net_device *netdev,/* is DCB enabled at all? */ if (vsi->tc_config.numtc ==1 ) -return i40e_swdcb_skb_tx_hash (netdev, skb, - netdev->real_num_tx_queues); +return netdev_pick_tx (netdev, skb, sb_dev); prio = skb->priority; hw = &vsi->back->hw;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 82/127 iavf: Fix ping is lost after untrusted VF had tried to change MAC
In reply to Sasha LevinFrom: Sylwester Dziedziuch <[email protected]>
[ Upstream commit 8da80c9d50220a8e4190a4eaa0dd6aeefcbbb5bf ]
Make changes to MAC address dependent on the response of PF. Disallow changes to HW MAC address and MAC filter from untrusted VF, thanks to that ping is not lost if VF tries to change MAC. Add a new field in iavf_mac_filter, to indicate whether there was response from PF for given filter. Based on this field pass or discard the filter.
If untrusted VF tried to change it's address, it's not changed. Still filter was changed, because of that ping couldn't go through.
--- drivers/net/ethernet/intel/iavf/iavf.h | 1 + drivers/net/ethernet/intel/iavf/iavf_main.c | 1 + .../net/ethernet/intel/iavf/iavf_virtchnl.c | 47 ++++++++++++++++++- 3 files changed, 47 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/iavf/iavf.h +1 -0
@@ -136,6 +136,7 @@ struct iavf_q_vector {struct iavf_mac_filter {struct list_head list;u8 macaddr[ETH_ALEN ]; +bool is_new_mac;/* filter is new, wait for PF decision */ bool remove;/* filter needs to be removed */ bool add;/* filter needs to be added */ };
drivers/net/ethernet/intel/iavf/iavf_main.c +1 -0
@@ -751,6 +751,7 @@ struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,list_add_tail (&f->list, &adapter->mac_filter_list); f->add = true; + f->is_new_mac = true; adapter->aq_required |=IAVF_FLAG_AQ_ADD_MAC_FILTER ; }else { f->remove = false;
drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +45 -2
67 lines not on this page · raw message
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 83/127 Revert "flow_offload: action should not be NULL when it is referenced"
In reply to Sasha LevinFrom: Ido Schimmel <[email protected]>
[ Upstream commit fa05bdb89b01b098aad19ec0ebc4d1cc7b11177e ]
This reverts commit 9ea3e52c5bc8bb4a084938dc1e3160643438927a.
Cited commit added a check to make sure 'action' is not NULL, but 'action' is already dereferenced before the check, when calling flow_offload_has_one_action().
Therefore, the check does not make any sense and results in a smatch warning:
include/net/flow_offload.h:322 flow_action_mixed_hw_stats_check() warn:
variable dereferenced before check 'action' (see line 319)
Fix by reverting this commit.
--- include/net/flow_offload.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
include/net/flow_offload.h +5 -7
@@ -319,14 +319,12 @@ flow_action_mixed_hw_stats_check(const struct flow_action *action,if (flow_offload_has_one_action (action))return true; -if (action) { -flow_action_for_each (i, action_entry, action) { -if (i && action_entry->hw_stats != last_hw_stats) { -NL_SET_ERR_MSG_MOD (extack,"Mixing HW stats types for actions is not supported" ); -return false; - } - last_hw_stats = action_entry->hw_stats; +flow_action_for_each (i, action_entry, action) { +if (i && action_entry->hw_stats != last_hw_stats) { +NL_SET_ERR_MSG_MOD (extack,"Mixing HW stats types for actions is not supported" ); +return false; } + last_hw_stats = action_entry->hw_stats; }return true; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 84/127 net: dpaa2-switch: disable the control interface on error path
In reply to Sasha LevinFrom: Vladimir Oltean <[email protected]>
[ Upstream commit cd0a719fbd702eb4b455a6ad986483750125588a ]
Currently dpaa2_switch_takedown has a funny name and does not do the opposite of dpaa2_switch_init, which makes probing fail when we need to handle an -EPROBE_DEFER.
A sketch of what dpaa2_switch_init does:
dpsw_open
dpaa2_switch_detect_features
dpsw_reset
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
dpsw_if_disable
dpsw_if_set_stp
dpsw_vlan_remove_if_untagged
dpsw_if_set_tci
dpsw_vlan_remove_if
}
dpsw_vlan_remove
alloc_ordered_workqueue
dpsw_fdb_remove
dpaa2_switch_ctrl_if_setupWhen dpaa2_switch_takedown is called from the error path of dpaa2_switch_probe(), the control interface, enabled by dpaa2_switch_ctrl_if_setup from dpaa2_switch_init, remains enabled, because dpaa2_switch_takedown does not call dpaa2_switch_ctrl_if_teardown.
Since dpaa2_switch_probe might fail due to EPROBE_DEFER of a PHY, this means that a second probe of the driver will happen with the control interface directly enabled.
This will trigger a second error:
[ 93.273528] fsl_dpaa2_switch dpsw.0: dpsw_ctrl_if_set_pools() failed [ 93.281966] fsl_dpaa2_switch dpsw.0: fsl_mc_driver_probe failed: -13 [ 93.288323] fsl_dpaa2_switch: probe of dpsw.0 failed with error -13
Which if we investigate the /dev/dpaa2_mc_console log, we find out is caused by:
[E, ctrl_if_set_pools:2211, DPMNG] ctrl_if must be disabled
So make dpaa2_switch_takedown do the opposite of dpaa2_switch_init (in reasonable limits, no reason to change STP state, re-add VLANs etc), and rename it to something more conventional, like dpaa2_switch_teardown.
--- .../ethernet/freescale/dpaa2/dpaa2-switch.c | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c +18 -18
@@ -3038,26 +3038,30 @@ static int dpaa2_switch_port_init(struct ethsw_port_priv *port_priv, u16 port)return err; } -static void dpaa2_switch_takedown (struct fsl_mc_device *sw_dev) +static void dpaa2_switch_ctrl_if_teardown (struct ethsw_core *ethsw) +{ +dpsw_ctrl_if_disable (ethsw->mc_io,0 , ethsw->dpsw_handle); +dpaa2_switch_free_dpio (ethsw); +dpaa2_switch_destroy_rings (ethsw); +dpaa2_switch_drain_bp (ethsw); +dpaa2_switch_free_dpbp (ethsw); +} + +static void dpaa2_switch_teardown (struct fsl_mc_device *sw_dev) {struct device *dev = &sw_dev->dev;struct ethsw_core *ethsw =dev_get_drvdata (dev);int err; +dpaa2_switch_ctrl_if_teardown (ethsw); + +destroy_workqueue (ethsw->workqueue); + err =dpsw_close (ethsw->mc_io,0 , ethsw->dpsw_handle);if (err)dev_warn (dev,"dpsw_close err %d\n" , err); } -static void dpaa2_switch_ctrl_if_teardown (struct ethsw_core *ethsw) -{ -dpsw_ctrl_if_disable (ethsw->mc_io,0 , ethsw->dpsw_handle); -dpaa2_switch_free_dpio (ethsw); -dpaa2_switch_destroy_rings (ethsw); -dpaa2_switch_drain_bp (ethsw); -dpaa2_switch_free_dpbp (ethsw); -} -static int dpaa2_switch_remove (struct fsl_mc_device *sw_dev) {struct ethsw_port_priv *port_priv;
@@ -3068,8 +3072,6 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev) dev = &sw_dev->dev; ethsw =dev_get_drvdata (dev); -dpaa2_switch_ctrl_if_teardown (ethsw); -dpaa2_switch_teardown_irqs (sw_dev);dpsw_disable (ethsw->mc_io,0 , ethsw->dpsw_handle);
@@ -3084,9 +3086,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)kfree (ethsw->acls);kfree (ethsw->ports); -dpaa2_switch_takedown (sw_dev); - -destroy_workqueue (ethsw->workqueue); +dpaa2_switch_teardown (sw_dev);fsl_mc_portal_free (ethsw->mc_io);
@@ -3199,7 +3199,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev) GFP_KERNEL);if (!(ethsw->ports)) { err = -ENOMEM ; - goto err_takedown; + goto err_teardown; } ethsw->fdbs = kcalloc(ethsw->sw_attr.num_ifs, sizeof(*ethsw->fdbs),
@@ -3270,8 +3270,8 @@ err_free_fdbs: err_free_ports:kfree (ethsw->ports); -err_takedown: -dpaa2_switch_takedown (sw_dev); +err_teardown: +dpaa2_switch_teardown (sw_dev); err_free_cmdport:fsl_mc_portal_free (ethsw->mc_io);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 85/127 iommu/dma: Fix leak in non-contiguous API
In reply to Sasha LevinFrom: Ezequiel Garcia <[email protected]>
[ Upstream commit 0fbea680540108b09db7b26d9f4d24236d58a6ad ]
Currently, iommu_dma_alloc_noncontiguous() allocates a struct dma_sgt_handle object to hold some state needed for iommu_dma_free_noncontiguous().
However, the handle is neither freed nor returned explicitly by the ->alloc_noncontiguous method, and therefore seems leaked. This was found by code inspection, so please review carefully and test.
As a side note, it appears the struct dma_sgt_handle type is exposed to users of the DMA-API by linux/dma-map-ops.h, but is has no users or functions returning the type explicitly.
This may indicate it's a good idea to move the struct dma_sgt_handle type to drivers/iommu/dma-iommu.c. The decision is left to maintainers :-)
--- drivers/iommu/dma-iommu.c | 1 + 1 file changed, 1 insertion(+)
drivers/iommu/dma-iommu.c +1 -0
@@ -768,6 +768,7 @@ static void iommu_dma_free_noncontiguous(struct device *dev, size_t size,__iommu_dma_unmap (dev, sgt->sgl->dma_address, size);__iommu_dma_free_pages (sh->pages,PAGE_ALIGN (size) >>PAGE_SHIFT );sg_free_table (&sh->sgt); + kfree(sh); }#endif /* CONFIG_DMA_REMAP */
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 86/127 mmc: dw_mmc: Fix hang on data CRC error
In reply to Sasha LevinFrom: Vincent Whitchurch <[email protected]>
[ Upstream commit 25f8203b4be1937c4939bb98623e67dcfd7da4d1 ]
When a Data CRC interrupt is received, the driver disables the DMA, then sends the stop/abort command and then waits for Data Transfer Over.
However, sometimes, when a data CRC error is received in the middle of a multi-block write transfer, the Data Transfer Over interrupt is never received, and the driver hangs and never completes the request.
The driver sets the BMOD.SWR bit (SDMMC_IDMAC_SWRESET) when stopping the DMA, but according to the manual CMD.STOP_ABORT_CMD should be programmed "before assertion of SWR". Do these operations in the recommended order. With this change the Data Transfer Over is always received correctly in my tests.
--- drivers/mmc/host/dw_mmc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mmc/host/dw_mmc.c +3 -3
@@ -2018,8 +2018,8 @@ static void dw_mci_tasklet_func(struct tasklet_struct *t)continue ; } -dw_mci_stop_dma (host);send_stop_abort (host, data); +dw_mci_stop_dma (host); state =STATE_SENDING_STOP ;break ; }
@@ -2043,10 +2043,10 @@ static void dw_mci_tasklet_func(struct tasklet_struct *t)*/ if (test_and_clear_bit (EVENT_DATA_ERROR , &host->pending_events)) { -dw_mci_stop_dma (host);if (!(host->data_status & (SDMMC_INT_DRTO |SDMMC_INT_EBE )))send_stop_abort (host, data); +dw_mci_stop_dma (host); state =STATE_DATA_ERROR ;break ; }
@@ -2079,10 +2079,10 @@ static void dw_mci_tasklet_func(struct tasklet_struct *t)*/ if (test_and_clear_bit (EVENT_DATA_ERROR , &host->pending_events)) { -dw_mci_stop_dma (host);if (!(host->data_status & (SDMMC_INT_DRTO |SDMMC_INT_EBE )))send_stop_abort (host, data); +dw_mci_stop_dma (host); state =STATE_DATA_ERROR ;break ; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 87/127 mmc: mmci: stm32: Check when the voltage switch procedure should be done
In reply to Sasha LevinFrom: Christophe Kerello <[email protected]>
[ Upstream commit d8e193f13b07e6c0ffaa1a999386f1989f2b4c5e ]
If the card has not been power cycled, it may still be using 1.8V signaling. This situation is detected in mmc_sd_init_card function and should be handled in mmci stm32 variant. The host->pwr_reg variable is also correctly protected with spin locks.
--- drivers/mmc/host/mmci_stm32_sdmmc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/mmc/host/mmci_stm32_sdmmc.c +5 -2
@@ -479,8 +479,9 @@ static int sdmmc_post_sig_volt_switch(struct mmci_host *host,u32 status;int ret =0 ; -if (ios->signal_voltage ==MMC_SIGNAL_VOLTAGE_180 ) { -spin_lock_irqsave (&host->lock, flags); +spin_lock_irqsave (&host->lock, flags); +if (ios->signal_voltage ==MMC_SIGNAL_VOLTAGE_180 && + host->pwr_reg &MCI_STM32_VSWITCHEN ) {mmci_write_pwrreg (host, host->pwr_reg |MCI_STM32_VSWITCH );spin_unlock_irqrestore (&host->lock, flags);
@@ -492,9 +493,11 @@ static int sdmmc_post_sig_volt_switch(struct mmci_host *host,writel_relaxed (MCI_STM32_VSWENDC |MCI_STM32_CKSTOPC , host->base +MMCICLEAR ); +spin_lock_irqsave (&host->lock, flags);mmci_write_pwrreg (host, host->pwr_reg & ~(MCI_STM32_VSWITCHEN |MCI_STM32_VSWITCH )); } +spin_unlock_irqrestore (&host->lock, flags);return ret; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 88/127 mmc: sdhci-msm: Update the software timeout value for sdhc
In reply to Sasha LevinFrom: Shaik Sajida Bhanu <[email protected]>
[ Upstream commit 67b13f3e221ed81b46a657e2b499bf8b20162476 ]
Whenever SDHC run at clock rate 50MHZ or below, the hardware data timeout value will be 21.47secs, which is approx. 22secs and we have a current software timeout value as 10secs. We have to set software timeout value more than the hardware data timeout value to avioid seeing the below register dumps.
[ 332.953670] mmc2: Timeout waiting for hardware interrupt. [ 332.959608] mmc2: sdhci: ============ SDHCI REGISTER DUMP =========== [ 332.966450] mmc2: sdhci: Sys addr: 0x00000000 | Version: 0x00007202 [ 332.973256] mmc2: sdhci: Blk size: 0x00000200 | Blk cnt: 0x00000001 [ 332.980054] mmc2: sdhci: Argument: 0x00000000 | Trn mode: 0x00000027 [ 332.986864] mmc2: sdhci: Present: 0x01f801f6 | Host ctl: 0x0000001f [ 332.993671] mmc2: sdhci: Power: 0x00000001 | Blk gap: 0x00000000 [ 333.000583] mmc2: sdhci: Wake-up: 0x00000000 | Clock: 0x00000007 [ 333.007386] mmc2: sdhci: Timeout: 0x0000000e | Int stat: 0x00000000 [ 333.014182] mmc2: sdhci: Int enab: 0x03ff100b | Sig enab: 0x03ff100b [ 333.020976] mmc2: sdhci: ACmd stat: 0x00000000 | Slot int: 0x00000000 [ 333.027771] mmc2: sdhci: Caps: 0x322dc8b2 | Caps_1: 0x0000808f [ 333.034561] mmc2: sdhci: Cmd: 0x0000183a | Max curr: 0x00000000 [ 333.041359] mmc2: sdhci: Resp[0]: 0x00000900 | Resp[1]: 0x00000000 [ 333.048157] mmc2: sdhci: Resp[2]: 0x00000000 | Resp[3]: 0x00000000 [ 333.054945] mmc2: sdhci: Host ctl2: 0x00000000 [ 333.059657] mmc2: sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x0000000ffffff218 [ 333.067178] mmc2: sdhci_msm: ----------- VENDOR REGISTER DUMP ----------- [ 333.074343] mmc2: sdhci_msm: DLL sts: 0x00000000 | DLL cfg: 0x6000642c | DLL cfg2: 0x0020a000 [ 333.083417] mmc2: sdhci_msm: DLL cfg3: 0x00000000 | DLL usr ctl: 0x00000000 | DDR cfg: 0x80040873 [ 333.092850] mmc2: sdhci_msm: Vndr func: 0x00008a9c | Vndr func2 : 0xf88218a8 Vndr func3: 0x02626040 [ 333.102371] mmc2: sdhci: ============================================
So, set software timeout value more than hardware timeout value.
--- drivers/mmc/host/sdhci-msm.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/mmc/host/sdhci-msm.c +18 -0
@@ -2089,6 +2089,23 @@ static void sdhci_msm_cqe_disable(struct mmc_host *mmc, bool recovery)sdhci_cqe_disable (mmc, recovery); } +static void sdhci_msm_set_timeout (struct sdhci_host *host,struct mmc_command *cmd) +{ +u32 count, start =15 ; + +__sdhci_set_timeout (host, cmd); + count =sdhci_readb (host,SDHCI_TIMEOUT_CONTROL ); +/* +* Update software timeout value if its value is less than hardware data +* timeout value. Qcom SoC hardware data timeout value was calculated +* using 4 * MCLK * 2^(count + 13). where MCLK = 1 / host->clock. +*/ +if (cmd && cmd->data && host->clock >400000 && + host->clock <=50000000 && + ((1 << (count + start)) > (10 * host->clock))) + host->data_timeout =22LL *NSEC_PER_SEC ; +} +static const struct cqhci_host_ops sdhci_msm_cqhci_ops = { .enable = sdhci_msm_cqe_enable, .disable = sdhci_msm_cqe_disable,
@@ -2438,6 +2455,7 @@ static const struct sdhci_ops sdhci_msm_ops = { .irq = sdhci_msm_cqe_irq, .dump_vendor_regs = sdhci_msm_dump_vendor_regs, .set_power = sdhci_set_power_noreg, + .set_timeout = sdhci_msm_set_timeout, };static const struct sdhci_pltfm_data sdhci_msm_pdata = {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 89/127 clk: imx6q: fix uart earlycon unwork
In reply to Sasha LevinFrom: Dong Aisheng <[email protected]>
[ Upstream commit 283f1b9a0401859c53fdd6483ab66f1c4fadaea5 ]
The earlycon depends on the bootloader setup UART clocks being retained. There're actually two uart clocks (ipg, per) on MX6QDL,
but the 'Fixes' commit change to register only one which means another clock may be disabled during booting phase
and result in the earlycon unwork.
--- drivers/clk/imx/clk-imx6q.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-imx6q.c +1 -1
@@ -974,6 +974,6 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) hws[IMX6QDL_CLK_PLL3_USB_OTG]->clk); } -imx_register_uart_clocks (1 ); +imx_register_uart_clocks (2 ); }CLK_OF_DECLARE (imx6q,"fsl,imx6q-ccm" , imx6q_clocks_init);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 90/127 clk: qcom: gdsc: Ensure regulator init state matches GDSC state
In reply to Sasha LevinFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 9711759a87a041705148161b937ec847048d882e ]
As GDSCs are registered and found to be already enabled gdsc_init() ensures that 1) the kernel state matches the hardware state, and 2) votable GDSCs are properly enabled from this master as well.
But as the (optional) supply regulator is enabled deep into gdsc_toggle_logic(), which is only executed for votable GDSCs, the kernel's state of the regulator might not match the hardware. The regulator might be automatically turned off if no other users are present or the next call to gdsc_disable() would cause an unbalanced regulator_disable().
Given that the votable case deals with an already enabled GDSC, most of gdsc_enable() and gdsc_toggle_logic() can be skipped. Reduce it to just clearing the SW_COLLAPSE_MASK and enabling hardware control to simply call regulator_enable() in both cases.
The enablement of hardware control seems to be an independent property from the GDSC being enabled, so this is moved outside that conditional segment.
Lastly, as the propagation of ALWAYS_ON to GENPD_FLAG_ALWAYS_ON needs to happen regardless of the initial state this is grouped together with the other sc->pd updates at the end of the function.
--- drivers/clk/qcom/gdsc.c | 54 +++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 18 deletions(-)
drivers/clk/qcom/gdsc.c +36 -18
@@ -357,27 +357,43 @@ static int gdsc_init(struct gdsc *sc)if (on <0 )return on; -/* -* Votable GDSCs can be ON due to Vote from other masters. -* If a Votable GDSC is ON, make sure we have a Vote. -*/ -if ((sc->flags &VOTABLE ) && on) -gdsc_enable (&sc->pd); +if (on) { +/* The regulator must be on, sync the kernel state */ +if (sc->rsupply) { + ret =regulator_enable (sc->rsupply); +if (ret <0 ) +return ret; + } -/* -* Make sure the retain bit is set if the GDSC is already on, otherwise -* we end up turning off the GDSC and destroying all the register -* contents that we thought we were saving. -*/ -if ((sc->flags &RETAIN_FF_ENABLE ) && on) -gdsc_retain_ff_on (sc); +/* +* Votable GDSCs can be ON due to Vote from other masters. +* If a Votable GDSC is ON, make sure we have a Vote. +*/ +if (sc->flags &VOTABLE ) { + ret =regmap_update_bits (sc->regmap, sc->gdscr, +SW_COLLAPSE_MASK , val); +if (ret) +return ret; + } + +/* Turn on HW trigger mode if supported */ +if (sc->flags &HW_CTRL ) { + ret =gdsc_hwctrl (sc, true); +if (ret <0 ) +return ret; + } -/* If ALWAYS_ON GDSCs are not ON, turn them ON */ -if (sc->flags &ALWAYS_ON ) { -if (!on) -gdsc_enable (&sc->pd); +/* +* Make sure the retain bit is set if the GDSC is already on, +* otherwise we end up turning off the GDSC and destroying all +* the register contents that we thought we were saving. +*/ +if (sc->flags &RETAIN_FF_ENABLE ) +gdsc_retain_ff_on (sc); + }else if (sc->flags &ALWAYS_ON ) { +/* If ALWAYS_ON GDSCs are not ON, turn them ON */ +gdsc_enable (&sc->pd); on = true; - sc->pd.flags |=GENPD_FLAG_ALWAYS_ON ; }if (on || (sc->pwrsts &PWRSTS_RET ))
@@ -385,6 +401,8 @@ static int gdsc_init(struct gdsc *sc)else gdsc_clear_mem_on (sc); +if (sc->flags &ALWAYS_ON ) + sc->pd.flags |=GENPD_FLAG_ALWAYS_ON ;if (!sc->pd.power_off) sc->pd.power_off = gdsc_disable;if (!sc->pd.power_on)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 91/127 arm64: clean vdso & vdso32 files
In reply to Sasha LevinFrom: Andrew Delgadillo <[email protected]>
[ Upstream commit 017f5fb9ce793e3558db94ee72068622bc0b79db ]
commit a5b8ca97fbf8 ("arm64: do not descend to vdso directories twice") changes the cleaning behavior of arm64's vdso files, in that vdso.lds, vdso.so, and vdso.so.dbg are not removed upon a 'make clean/mrproper':
$ make defconfig ARCH=arm64 $ make ARCH=arm64 $ make mrproper ARCH=arm64 $ git clean -nxdf Would remove arch/arm64/kernel/vdso/vdso.lds Would remove arch/arm64/kernel/vdso/vdso.so Would remove arch/arm64/kernel/vdso/vdso.so.dbg
To remedy this, manually descend into arch/arm64/kernel/vdso upon cleaning.
After this commit:
$ make defconfig ARCH=arm64 $ make ARCH=arm64 $ make mrproper ARCH=arm64 $ git clean -nxdf <empty>
Similar results are obtained for the vdso32 equivalent.
--- arch/arm64/Makefile | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/Makefile +2 -0
@@ -181,6 +181,8 @@ archprepare: # We use MRPROPER_FILES and CLEAN_FILES now archclean: $(Q)$(MAKE) $(clean)=$(boot) + $(Q)$(MAKE) $(clean)=arch/arm64/kernel/vdso + $(Q)$(MAKE) $(clean)=arch/arm64/kernel/vdso32 ifeq ($(KBUILD_EXTMOD),) # We need to generate vdso-offsets.h before compiling certain files in kernel/.
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 92/127 cfi: Use rcu_read_{un}lock_sched_notrace
In reply to Sasha LevinFrom: Elliot Berman <[email protected]>
[ Upstream commit 14c4c8e41511aa8fba7fb239b20b6539b5bce201 ]
If rcu_read_lock_sched tracing is enabled, the tracing subsystem can perform a jump which needs to be checked by CFI. For example, stm_ftrace source is enabled as a module and hooks into enabled ftrace events. This can cause an recursive loop where find_shadow_check_fn -> rcu_read_lock_sched -> (call to stm_ftrace generates cfi slowpath) -> find_shadow_check_fn -> rcu_read_lock_sched -> ...
To avoid the recursion, either the ftrace codes needs to be marked with __no_cfi or CFI should not trace. Use the "_notrace" in CFI to avoid tracing so that CFI can guard ftrace.
--- kernel/cfi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/cfi.c +4 -4
@@ -248,9 +248,9 @@ static inline cfi_check_fn find_shadow_check_fn(unsigned long ptr) {cfi_check_fn fn; -rcu_read_lock_sched (); +rcu_read_lock_sched_notrace (); fn =ptr_to_check_fn (rcu_dereference_sched (cfi_shadow), ptr); -rcu_read_unlock_sched (); +rcu_read_unlock_sched_notrace ();return fn; }
@@ -269,11 +269,11 @@ static inline cfi_check_fn find_module_check_fn(unsigned long ptr)cfi_check_fn fn =NULL ;struct module *mod; -rcu_read_lock_sched (); +rcu_read_lock_sched_notrace (); mod =__module_address (ptr);if (mod) fn = mod->cfi_check; -rcu_read_unlock_sched (); +rcu_read_unlock_sched_notrace ();return fn; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 93/127 ALSA: hda - fix the 'Capture Switch' value change notifications
In reply to Sasha LevinFrom: Jaroslav Kysela <[email protected]>
[ Upstream commit a2befe9380dd04ee76c871568deca00eedf89134 ]
The original code in the cap_put_caller() function does not handle correctly the positive values returned from the passed function for multiple iterations. It means that the change notifications may be lost.
--- sound/pci/hda/hda_generic.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
sound/pci/hda/hda_generic.c +7 -3
@@ -3460,7 +3460,7 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,struct hda_gen_spec *spec = codec->spec;const struct hda_input_mux *imux;struct nid_path *path; -int i, adc_idx, err =0 ; +int i, adc_idx, ret, err =0 ; imux = &spec->input_mux; adc_idx = kcontrol->id.index;
@@ -3470,9 +3470,13 @@ static int cap_put_caller(struct snd_kcontrol *kcontrol,if (!path || !path->ctls[type])continue ; kcontrol->private_value = path->ctls[type]; - err =func (kcontrol, ucontrol); -if (err <0 ) + ret =func (kcontrol, ucontrol); +if (ret <0 ) { + err = ret;break ; + } +if (ret >0 ) + err =1 ; }mutex_unlock (&codec->control_mutex);if (err >=0 && spec->cap_sync_hook)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 94/127 tracing: define needed config DYNAMIC_FTRACE_WITH_ARGS
In reply to Sasha LevinFrom: Lukas Bulwahn <[email protected]>
[ Upstream commit 12f9951d3f311acb1d4ffe8e839bc2c07983546f ]
Commit 2860cd8a2353 ("livepatch: Use the default ftrace_ops instead of REGS when ARGS is available") intends to enable config LIVEPATCH when ftrace with ARGS is available. However, the chain of configs to enable LIVEPATCH is incomplete, as HAVE_DYNAMIC_FTRACE_WITH_ARGS is available, but the definition of DYNAMIC_FTRACE_WITH_ARGS, combining DYNAMIC_FTRACE and HAVE_DYNAMIC_FTRACE_WITH_ARGS, needed to enable LIVEPATCH, is missing in the commit.
Fortunately, ./scripts/checkkconfigsymbols.py detects this and warns:
DYNAMIC_FTRACE_WITH_ARGS
Referencing files: kernel/livepatch/Kconfig
So, define the config DYNAMIC_FTRACE_WITH_ARGS analogously to the already existing similar configs, DYNAMIC_FTRACE_WITH_REGS and DYNAMIC_FTRACE_WITH_DIRECT_CALLS, in ./kernel/trace/Kconfig to connect the chain of configs.
--- kernel/trace/Kconfig | 5 +++++ 1 file changed, 5 insertions(+)
kernel/trace/Kconfig +5 -0
@@ -219,6 +219,11 @@ config DYNAMIC_FTRACE_WITH_DIRECT_CALLS depends on DYNAMIC_FTRACE_WITH_REGS depends on HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS +config DYNAMIC_FTRACE_WITH_ARGS + def_bool y + depends on DYNAMIC_FTRACE + depends on HAVE_DYNAMIC_FTRACE_WITH_ARGS + config FUNCTION_PROFILER bool "Kernel function profiler" depends on FUNCTION_TRACER
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 95/127 tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL event name
In reply to Sasha LevinFrom: "Steven Rostedt (VMware)" <[email protected]>
[ Upstream commit 5acce0bff2a0420ce87d4591daeb867f47d552c2 ]
The following commands:
# echo 'read_max u64 size;' > synthetic_events # echo 'hist:keys=common_pid:count=count:onmax($count).trace(read_max,count)' > events/syscalls/sys_enter_read/trigger
Causes:
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP CPU: 4 PID: 1763 Comm: bash Not tainted 5.14.0-rc2-test+ #155 Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01 v03.03 07/14/2016 RIP: 0010:strcmp+0xc/0x20 Code: 75 f7 31 c0 0f b6 0c 06 88 0c 02 48 83 c0 01 84 c9 75 f1 4c 89 c0
c3 0f 1f 80 00 00 00 00 31 c0 eb 08 48 83 c0 01 84 d2 74 0f <0f> b6 14 07 3a 14 06 74 ef 19 c0 83 c8 01 c3 31 c0 c3 66 90 48 89
RSP: 0018:ffffb5fdc0963ca8 EFLAGS: 00010246
RAX: 0000000000000000 RBX: ffffffffb3a4e040 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff9714c0d0b640 RDI: 0000000000000000
RBP: 0000000000000000 R08: 00000022986b7cde R09: ffffffffb3a4dff8
R10: 0000000000000000 R11: 0000000000000000 R12: ffff9714c50603c8
R13: 0000000000000000 R14: ffff97143fdf9e48 R15: ffff9714c01a2210
FS: 00007f1fa6785740(0000) GS:ffff9714da400000(0000)
knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000000 CR3: 000000002d863004 CR4: 00000000001706e0
Call Trace: __find_event_file+0x4e/0x80 action_create+0x6b7/0xeb0 ? kstrdup+0x44/0x60 event_hist_trigger_func+0x1a07/0x2130 trigger_process_regex+0xbd/0x110 event_trigger_write+0x71/0xd0 vfs_write+0xe9/0x310 ksys_write+0x68/0xe0 do_syscall_64+0x3b/0x90 entry_SYSCALL_64_after_hwframe+0x44/0xae RIP: 0033:0x7f1fa6879e87
The problem was the "trace(read_max,count)" where the "count" should be "$count" as "onmax()" only handles variables (although it really should be able to figure out that "count" is a field of sys_enter_read). But there's a path that does not find the variable and ends up passing a NULL for the event, which ends up getting passed to "strcmp()".
Add a check for NULL to return and error on the command with:
# cat error_log
hist:syscalls:sys_enter_read: error: Couldn't create or find variable
Command: hist:keys=common_pid:count=count:onmax($count).trace(read_max,count)
^
Link: https://lkml.kernel.org/r/[email protected]--- kernel/trace/trace_events_hist.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace_events_hist.c +2 -0
@@ -3430,6 +3430,8 @@ trace_action_create_field_var(struct hist_trigger_data *hist_data, event = data->match_data.event; } +if (!event) + goto free;/* * At this point, we're looking at a field on another * event. Because we can't modify a hist trigger on
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 96/127 slimbus: messaging: start transaction ids from 1 instead of zero
In reply to Sasha LevinFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit 9659281ce78de0f15a4aa124da8f7450b1399c09 ]
As tid is unsigned its hard to figure out if the tid is valid or invalid. So Start the transaction ids from 1 instead of zero so that we could differentiate between a valid tid and invalid tids
This is useful in cases where controller would add a tid for controller specific transfers.
--- drivers/slimbus/messaging.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/slimbus/messaging.c +1 -1
@@ -66,7 +66,7 @@ int slim_alloc_txn_tid(struct slim_controller *ctrl, struct slim_msg_txn *txn)int ret =0 ;spin_lock_irqsave (&ctrl->txn_lock, flags); - ret =idr_alloc_cyclic (&ctrl->tid_idr, txn,0 , + ret =idr_alloc_cyclic (&ctrl->tid_idr, txn,1 ,SLIM_MAX_TIDS ,GFP_ATOMIC );if (ret <0 ) {spin_unlock_irqrestore (&ctrl->txn_lock, flags);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 97/127 slimbus: messaging: check for valid transaction id
In reply to Sasha LevinFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit a263c1ff6abe0e66712f40d595bbddc7a35907f8 ]
In some usecases transaction ids are dynamically allocated inside the controller driver after sending the messages which have generic acknowledge responses. So check for this before refcounting pm_runtime.
Without this we would end up imbalancing runtime pm count by doing pm_runtime_put() in both slim_do_transfer() and slim_msg_response() for a single pm_runtime_get() in slim_do_transfer()
--- drivers/slimbus/messaging.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/slimbus/messaging.c +3 -2
@@ -131,7 +131,8 @@ int slim_do_transfer(struct slim_controller *ctrl, struct slim_msg_txn *txn) goto slim_xfer_err; } } - +/* Initialize tid to invalid value */ + txn->tid =0 ; need_tid =slim_tid_txn (txn->mt, txn->mc);if (need_tid) {
@@ -163,7 +164,7 @@ int slim_do_transfer(struct slim_controller *ctrl, struct slim_msg_txn *txn) txn->mt, txn->mc, txn->la, ret); slim_xfer_err: -if (!clk_pause_msg && (!need_tid || ret == -ETIMEDOUT )) { +if (!clk_pause_msg && (txn->tid ==0 || ret == -ETIMEDOUT )) {/* * remove runtime-pm vote if this was TX only, or * if there was error during this transaction
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 98/127 slimbus: ngd: set correct device for pm
In reply to Sasha LevinFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit c0e38eaa8d5102c138e4f16658ea762417d42a8f ]
For some reason we ended up using wrong device in some places for pm_runtime calls. Fix this so that NGG driver can do runtime pm correctly.
--- drivers/slimbus/qcom-ngd-ctrl.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/slimbus/qcom-ngd-ctrl.c +9 -8
@@ -618,7 +618,7 @@ static void qcom_slim_ngd_rx(struct qcom_slim_ngd_ctrl *ctrl, u8 *buf) (mc == SLIM_USR_MC_GENERIC_ACK && mt == SLIM_MSG_MT_SRC_REFERRED_USER)) {slim_msg_response (&ctrl->ctrl, &buf[4 ], buf[3 ], len -4 ); -pm_runtime_mark_last_busy (ctrl->dev); +pm_runtime_mark_last_busy (ctrl->ctrl.dev); } }
@@ -1257,13 +1257,14 @@ static int qcom_slim_ngd_enable(struct qcom_slim_ngd_ctrl *ctrl, bool enable) }/* controller state should be in sync with framework state */ complete (&ctrl->qmi.qmi_comp); -if (!pm_runtime_enabled (ctrl->dev) || - !pm_runtime_suspended (ctrl->dev)) -qcom_slim_ngd_runtime_resume (ctrl->dev); +if (!pm_runtime_enabled (ctrl->ctrl.dev) || + !pm_runtime_suspended (ctrl->ctrl.dev)) +qcom_slim_ngd_runtime_resume (ctrl->ctrl.dev);else -pm_runtime_resume (ctrl->dev); -pm_runtime_mark_last_busy (ctrl->dev); -pm_runtime_put (ctrl->dev); +pm_runtime_resume (ctrl->ctrl.dev); + +pm_runtime_mark_last_busy (ctrl->ctrl.dev); +pm_runtime_put (ctrl->ctrl.dev); ret =slim_register_controller (&ctrl->ctrl);if (ret) {
@@ -1389,7 +1390,7 @@ static int qcom_slim_ngd_ssr_pdr_notify(struct qcom_slim_ngd_ctrl *ctrl,/* Make sure the last dma xfer is finished */ mutex_lock (&ctrl->tx_lock);if (ctrl->state !=QCOM_SLIM_NGD_CTRL_DOWN ) { -pm_runtime_get_noresume (ctrl->dev); +pm_runtime_get_noresume (ctrl->ctrl.dev); ctrl->state =QCOM_SLIM_NGD_CTRL_DOWN ;qcom_slim_ngd_down (ctrl);qcom_slim_ngd_exit_dma (ctrl);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 99/127 slimbus: ngd: reset dma setup during runtime pm
In reply to Sasha LevinFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit d77772538f00b7265deace6e77e555ee18365ad0 ]
During suspend/resume NGD remote instance is power cycled along with remotely controlled bam dma engine.
So Reset the dma configuration during this suspend resume path so that we are not dealing with any stale dma setup.
Without this transactions timeout after first suspend resume path.
--- drivers/slimbus/qcom-ngd-ctrl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/slimbus/qcom-ngd-ctrl.c +4 -1
@@ -1080,7 +1080,8 @@ static void qcom_slim_ngd_setup(struct qcom_slim_ngd_ctrl *ctrl) {u32 cfg =readl_relaxed (ctrl->ngd->base); -if (ctrl->state ==QCOM_SLIM_NGD_CTRL_DOWN ) +if (ctrl->state ==QCOM_SLIM_NGD_CTRL_DOWN || + ctrl->state ==QCOM_SLIM_NGD_CTRL_ASLEEP )qcom_slim_ngd_init_dma (ctrl);/* By default enable message queues */
@@ -1131,6 +1132,7 @@ static int qcom_slim_ngd_power_up(struct qcom_slim_ngd_ctrl *ctrl)dev_info (ctrl->dev,"Subsys restart: ADSP active framer\n" );return 0 ; } +qcom_slim_ngd_setup (ctrl);return 0 ; }
@@ -1618,6 +1620,7 @@ static int __maybe_unused qcom_slim_ngd_runtime_suspend(struct device *dev)struct qcom_slim_ngd_ctrl *ctrl =dev_get_drvdata (dev);int ret =0 ; +qcom_slim_ngd_exit_dma (ctrl);if (!ctrl->qmi.handle)return 0 ;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 100/127 ipack: tpci200: fix many double free issues in tpci200_pci_probe
In reply to Sasha LevinFrom: Dongliang Mu <[email protected]>
[ Upstream commit 57a1681095f912239c7fb4d66683ab0425973838 ]
The function tpci200_register called by tpci200_install and tpci200_unregister called by tpci200_uninstall are in pair. However, tpci200_unregister has some cleanup operations not in the tpci200_register. So the error handling code of tpci200_pci_probe has many different double free issues.
Fix this problem by moving those cleanup operations out of tpci200_unregister, into tpci200_pci_remove and reverting the previous commit 9272e5d0028d ("ipack/carriers/tpci200:
Fix a double free in tpci200_pci_probe").
--- drivers/ipack/carriers/tpci200.c | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/ipack/carriers/tpci200.c +18 -18
@@ -91,16 +91,13 @@ static void tpci200_unregister(struct tpci200_board *tpci200)free_irq (tpci200->info->pdev->irq, (void *) tpci200);pci_iounmap (tpci200->info->pdev, tpci200->info->interface_regs); -pci_iounmap (tpci200->info->pdev, tpci200->info->cfg_regs);pci_release_region (tpci200->info->pdev,TPCI200_IP_INTERFACE_BAR );pci_release_region (tpci200->info->pdev,TPCI200_IO_ID_INT_SPACES_BAR );pci_release_region (tpci200->info->pdev,TPCI200_MEM16_SPACE_BAR );pci_release_region (tpci200->info->pdev,TPCI200_MEM8_SPACE_BAR ); -pci_release_region (tpci200->info->pdev,TPCI200_CFG_MEM_BAR );pci_disable_device (tpci200->info->pdev); -pci_dev_put (tpci200->info->pdev); } static void tpci200_enable_irq(struct tpci200_board *tpci200,
@@ -529,7 +526,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev, tpci200->info =kzalloc (sizeof (struct tpci200_infos ),GFP_KERNEL );if (!tpci200->info) { ret = -ENOMEM ; - goto out_err_info; + goto err_tpci200; }pci_dev_get (pdev);
@@ -540,7 +537,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,if (ret) {dev_err (&pdev->dev,"Failed to allocate PCI Configuration Memory" ); ret = -EBUSY ; - goto out_err_pci_request; + goto err_tpci200_info; } tpci200->info->cfg_regs = ioremap( pci_resource_start(pdev, TPCI200_CFG_MEM_BAR),
@@ -548,7 +545,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,if (!tpci200->info->cfg_regs) {dev_err (&pdev->dev,"Failed to map PCI Configuration Memory" ); ret = -EFAULT ; - goto out_err_ioremap; + goto err_request_region; }/* Disable byte swapping for 16 bit IP module access. This will ensure
@@ -571,7 +568,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,if (ret) {dev_err (&pdev->dev,"error during tpci200 install\n" ); ret = -ENODEV ; - goto out_err_install; + goto err_cfg_regs; }/* Register the carrier in the industry pack bus driver */
@@ -583,7 +580,7 @@ static int tpci200_pci_probe(struct pci_dev *pdev,dev_err (&pdev->dev,"error registering the carrier on ipack driver\n" ); ret = -EFAULT ; - goto out_err_bus_register; + goto err_tpci200_install; }/* save the bus number given by ipack to logging purpose */
@@ -594,19 +591,16 @@ static int tpci200_pci_probe(struct pci_dev *pdev,tpci200_create_device (tpci200, i);return 0 ; -out_err_bus_register: +err_tpci200_install:tpci200_uninstall (tpci200); -/* tpci200->info->cfg_regs is unmapped in tpci200_uninstall */ - tpci200->info->cfg_regs =NULL ; -out_err_install: -if (tpci200->info->cfg_regs) -iounmap (tpci200->info->cfg_regs); -out_err_ioremap: +err_cfg_regs: +pci_iounmap (tpci200->info->pdev, tpci200->info->cfg_regs); +err_request_region:pci_release_region (pdev,TPCI200_CFG_MEM_BAR ); -out_err_pci_request: -pci_dev_put (pdev); +err_tpci200_info:kfree (tpci200->info); -out_err_info: +pci_dev_put (pdev); +err_tpci200:kfree (tpci200);return ret; }
@@ -616,6 +610,12 @@ static void __tpci200_pci_remove(struct tpci200_board *tpci200)ipack_bus_unregister (tpci200->info->ipack_bus);tpci200_uninstall (tpci200); +pci_iounmap (tpci200->info->pdev, tpci200->info->cfg_regs); + +pci_release_region (tpci200->info->pdev,TPCI200_CFG_MEM_BAR ); + +pci_dev_put (tpci200->info->pdev); +kfree (tpci200->info);kfree (tpci200); }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 101/127 ipack: tpci200: fix memory leak in the tpci200_register
In reply to Sasha LevinFrom: Dongliang Mu <[email protected]>
[ Upstream commit 50f05bd114a46a74726e432bf81079d3f13a55b7 ]
The error handling code in tpci200_register does not free interface_regs allocated by ioremap and the current version of error handling code is problematic.
Fix this by refactoring the error handling code and free interface_regs when necessary.
--- drivers/ipack/carriers/tpci200.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
drivers/ipack/carriers/tpci200.c +14 -10
@@ -256,7 +256,7 @@ static int tpci200_register(struct tpci200_board *tpci200)"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 2 !" , tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); - goto out_disable_pci; + goto err_disable_device; }/* Request IO ID INT space (Bar 3) */
@@ -268,7 +268,7 @@ static int tpci200_register(struct tpci200_board *tpci200)"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 3 !" , tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); - goto out_release_ip_space; + goto err_ip_interface_bar; }/* Request MEM8 space (Bar 5) */
@@ -279,7 +279,7 @@ static int tpci200_register(struct tpci200_board *tpci200)"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 5!" , tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); - goto out_release_ioid_int_space; + goto err_io_id_int_spaces_bar; }/* Request MEM16 space (Bar 4) */
@@ -290,7 +290,7 @@ static int tpci200_register(struct tpci200_board *tpci200)"(bn 0x%X, sn 0x%X) failed to allocate PCI resource for BAR 4!" , tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); - goto out_release_mem8_space; + goto err_mem8_space_bar; }/* Map internal tpci200 driver user space */
@@ -304,7 +304,7 @@ static int tpci200_register(struct tpci200_board *tpci200) tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); res = -ENOMEM ; - goto out_release_mem8_space; + goto err_mem16_space_bar; }/* Initialize lock that protects interface_regs */
@@ -343,18 +343,22 @@ static int tpci200_register(struct tpci200_board *tpci200)"(bn 0x%X, sn 0x%X) unable to register IRQ !" , tpci200->info->pdev->bus->number, tpci200->info->pdev->devfn); - goto out_release_ioid_int_space; + goto err_interface_regs; }return 0 ; -out_release_mem8_space: +err_interface_regs: +pci_iounmap (tpci200->info->pdev, tpci200->info->interface_regs); +err_mem16_space_bar: +pci_release_region (tpci200->info->pdev,TPCI200_MEM16_SPACE_BAR ); +err_mem8_space_bar:pci_release_region (tpci200->info->pdev,TPCI200_MEM8_SPACE_BAR ); -out_release_ioid_int_space: +err_io_id_int_spaces_bar:pci_release_region (tpci200->info->pdev,TPCI200_IO_ID_INT_SPACES_BAR ); -out_release_ip_space: +err_ip_interface_bar:pci_release_region (tpci200->info->pdev,TPCI200_IP_INTERFACE_BAR ); -out_disable_pci: +err_disable_device:pci_disable_device (tpci200->info->pdev);return res; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 102/127 io_uring: fix code style problems
In reply to Sasha LevinFrom: Pavel Begunkov <[email protected]>
[ Upstream commit fe7e325750299126b9cc86d3071af594b46c4518 ]
Fix a bunch of problems mostly found by checkpatch.pl
--- fs/io_uring.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
fs/io_uring.c +8 -8
@@ -165,7 +165,7 @@ struct io_rings {* Written by the application, shouldn't be modified by the * kernel. */ -u32 cq_flags; +u32 cq_flags;/* * Number of completion events lost because the queue was full; * this should be avoided by the application by making sure
@@ -850,7 +850,7 @@ struct io_kiocb {struct hlist_node hash_node;struct async_poll *apoll;struct io_wq_work work; -const struct cred *creds; +const struct cred *creds;/* store used ubuf, so we can prevent reloading */ struct io_mapped_ubuf *imu;
@@ -1721,7 +1721,7 @@ static struct io_kiocb *io_alloc_req(struct io_ring_ctx *ctx) {struct io_submit_state *state = &ctx->submit_state; -BUILD_BUG_ON (IO_REQ_ALLOC_BATCH >ARRAY_SIZE (state->reqs)); +BUILD_BUG_ON (ARRAY_SIZE (state->reqs) <IO_REQ_ALLOC_BATCH );if (!state->free_reqs) {gfp_t gfp =GFP_KERNEL | __GFP_NOWARN;
@@ -2778,7 +2778,7 @@ static void kiocb_done(struct kiocb *kiocb, ssize_t ret,else io_rw_done (kiocb, ret); -if (check_reissue && req->flags &REQ_F_REISSUE ) { +if (check_reissue && (req->flags &REQ_F_REISSUE )) { req->flags &= ~REQ_F_REISSUE ;if (io_resubmit_prep (req)) {req_ref_get (req);
@@ -3608,7 +3608,7 @@ static int io_shutdown(struct io_kiocb *req, unsigned int issue_flags)static int __io_splice_prep (struct io_kiocb *req,const struct io_uring_sqe *sqe) { -struct io_splice * sp = &req->splice; +struct io_splice *sp = &req->splice;unsigned int valid_flags =SPLICE_F_FD_IN_FIXED |SPLICE_F_ALL ;if (unlikely (req->ctx->flags &IORING_SETUP_IOPOLL ))
@@ -3662,7 +3662,7 @@ static int io_tee(struct io_kiocb *req, unsigned int issue_flags)static int io_splice_prep (struct io_kiocb *req,const struct io_uring_sqe *sqe) { -struct io_splice * sp = &req->splice; +struct io_splice *sp = &req->splice; sp->off_in =READ_ONCE (sqe->splice_off_in); sp->off_out =READ_ONCE (sqe->off);
@@ -8563,6 +8563,7 @@ static int io_eventfd_register(struct io_ring_ctx *ctx, void __user *arg) ctx->cq_ev_fd =eventfd_ctx_fdget (fd);if (IS_ERR (ctx->cq_ev_fd)) {int ret =PTR_ERR (ctx->cq_ev_fd); + ctx->cq_ev_fd =NULL ;return ret; }
@@ -9362,9 +9363,8 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,io_cqring_overflow_flush (ctx, false); ret = -EOWNERDEAD ; -if (unlikely (ctx->sq_data->thread ==NULL )) { +if (unlikely (ctx->sq_data->thread ==NULL )) goto out; - }if (flags &IORING_ENTER_SQ_WAKEUP )wake_up (&ctx->sq_data->wait);if (flags &IORING_ENTER_SQ_WAIT ) {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 103/127 io_uring: only assign io_uring_enter() SQPOLL error in actual error case
In reply to Sasha LevinFrom: Jens Axboe <[email protected]>
[ Upstream commit 21f965221e7c42609521342403e8fb91b8b3e76e ]
If an SQPOLL based ring is newly created and an application issues an io_uring_enter(2) system call on it, then we can return a spurious -EOWNERDEAD error. This happens because there's nothing to submit, and if the caller doesn't specify any other action, the initial error assignment of -EOWNERDEAD never gets overwritten. This causes us to return it directly, even if it isn't valid.
Move the error assignment into the actual failure case instead.
--- fs/io_uring.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/io_uring.c +3 -2
@@ -9362,9 +9362,10 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,if (ctx->flags &IORING_SETUP_SQPOLL ) {io_cqring_overflow_flush (ctx, false); - ret = -EOWNERDEAD ; -if (unlikely (ctx->sq_data->thread ==NULL )) +if (unlikely (ctx->sq_data->thread ==NULL )) { + ret = -EOWNERDEAD ; goto out; + }if (flags &IORING_ENTER_SQ_WAKEUP )wake_up (&ctx->sq_data->wait);if (flags &IORING_ENTER_SQ_WAIT ) {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 104/127 ALSA: hda/realtek: Enable 4-speaker output for Dell XPS 15 9510 laptop
In reply to Sasha LevinFrom: Kristin Paget <[email protected]>
[ Upstream commit da94692001ea45ffa1f5e9f17ecdef7aecd90c27 ]
The 2021-model XPS 15 appears to use the same 4-speakers-on-ALC289 audio setup as the Precision models, so requires the same quirk to enable woofer output. Tested on my own 9510.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -8272,6 +8272,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1028 ,0x0a2e ,"Dell" ,ALC236_FIXUP_DELL_AIO_HEADSET_MIC ),SND_PCI_QUIRK (0x1028 ,0x0a30 ,"Dell" ,ALC236_FIXUP_DELL_AIO_HEADSET_MIC ),SND_PCI_QUIRK (0x1028 ,0x0a58 ,"Dell" ,ALC255_FIXUP_DELL_HEADSET_MIC ), +SND_PCI_QUIRK (0x1028 ,0x0a61 ,"Dell XPS 15 9510" ,ALC289_FIXUP_DUAL_SPK ),SND_PCI_QUIRK (0x1028 ,0x164a ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1028 ,0x164b ,"Dell" ,ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 105/127 opp: Drop empty-table checks from _put functions
In reply to Sasha LevinFrom: Dmitry Osipenko <[email protected]>
[ Upstream commit c3ddfe66d2bb511f7fbcdc8e64952c7859e7e69d ]
The current_opp is released only when whole OPP table is released, otherwise it's only marked as removed by dev_pm_opp_remove_table(). Functions like dev_pm_opp_put_clkname() and dev_pm_opp_put_supported_hw() are checking whether OPP table is empty and it's not if current_opp is set since it holds the refcount of OPP, this produces a noisy warning from these functions about busy OPP table. Remove the checks to fix it.
--- drivers/opp/core.c | 15 --------------- 1 file changed, 15 deletions(-)
drivers/opp/core.c +0 -15
@@ -1846,9 +1846,6 @@ void dev_pm_opp_put_supported_hw(struct opp_table *opp_table)if (unlikely (!opp_table))return ; -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -kfree (opp_table->supported_hw); opp_table->supported_hw =NULL ; opp_table->supported_hw_count =0 ;
@@ -1934,9 +1931,6 @@ void dev_pm_opp_put_prop_name(struct opp_table *opp_table)if (unlikely (!opp_table))return ; -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -kfree (opp_table->prop_name); opp_table->prop_name =NULL ;
@@ -2046,9 +2040,6 @@ void dev_pm_opp_put_regulators(struct opp_table *opp_table)if (!opp_table->regulators) goto put_opp_table; -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -if (opp_table->enabled) {for (i = opp_table->regulator_count -1 ; i >=0 ; i--)regulator_disable (opp_table->regulators[i]);
@@ -2168,9 +2159,6 @@ void dev_pm_opp_put_clkname(struct opp_table *opp_table)if (unlikely (!opp_table))return ; -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); -clk_put (opp_table->clk); opp_table->clk =ERR_PTR (-EINVAL );
@@ -2269,9 +2257,6 @@ void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table)if (unlikely (!opp_table))return ; -/* Make sure there are no concurrent readers while updating opp_table */ -WARN_ON (!list_empty (&opp_table->opp_list)); - opp_table->set_opp =NULL ;mutex_lock (&opp_table->lock);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 106/127 mmc: sdhci-iproc: Cap min clock frequency on BCM2711
In reply to Sasha LevinFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit c9107dd0b851777d7e134420baf13a5c5343bc16 ]
There is a known bug on BCM2711's SDHCI core integration where the controller will hang when the difference between the core clock and the bus clock is too great. Specifically this can be reproduced under the following conditions:
- No SD card plugged in, polling thread is running, probing cards at 100 kHz.
- BCM2711's core clock configured at 500MHz or more.
So set 200 kHz as the minimum clock frequency available for that board.
For more information on the issue see this:
https://lore.kernel.org/linux-mmc/[email protected]/T/#m11f2783a09b581da6b8a15f302625b43a6ecdeca
--- drivers/mmc/host/sdhci-iproc.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/mmc/host/sdhci-iproc.c +18 -0
@@ -173,6 +173,23 @@ static unsigned int sdhci_iproc_get_max_clock(struct sdhci_host *host)return pltfm_host->clock; } +/* +* There is a known bug on BCM2711's SDHCI core integration where the +* controller will hang when the difference between the core clock and the bus +* clock is too great. Specifically this can be reproduced under the following +* conditions: +* +* - No SD card plugged in, polling thread is running, probing cards at +* 100 kHz. +* - BCM2711's core clock configured at 500MHz or more +* +* So we set 200kHz as the minimum clock frequency available for that SoC. +*/ +static unsigned int sdhci_iproc_bcm2711_get_min_clock (struct sdhci_host *host) +{ +return 200000 ; +} +static const struct sdhci_ops sdhci_iproc_ops = { .set_clock = sdhci_set_clock, .get_max_clock = sdhci_iproc_get_max_clock,
@@ -271,6 +288,7 @@ static const struct sdhci_ops sdhci_iproc_bcm2711_ops = { .set_clock = sdhci_set_clock, .set_power = sdhci_set_power_and_bus_voltage, .get_max_clock = sdhci_iproc_get_max_clock, + .get_min_clock = sdhci_iproc_bcm2711_get_min_clock, .set_bus_width = sdhci_set_bus_width, .reset = sdhci_reset, .set_uhs_signaling = sdhci_set_uhs_signaling,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 107/127 mmc: sdhci-iproc: Set SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN on BCM2711
In reply to Sasha LevinFrom: Nicolas Saenz Julienne <[email protected]>
[ Upstream commit 419dd626e357e89fc9c4e3863592c8b38cfe1571 ]
The controller doesn't seem to pick-up on clock changes, so set the SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN flag to query the clock frequency directly from the clock.
--- drivers/mmc/host/sdhci-iproc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci-iproc.c +2 -1
@@ -295,7 +295,8 @@ static const struct sdhci_ops sdhci_iproc_bcm2711_ops = { };static const struct sdhci_pltfm_data sdhci_bcm2711_pltfm_data = { - .quirks =SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 , + .quirks =SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12 | +SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN , .ops = &sdhci_iproc_bcm2711_ops, };
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 108/127 btrfs: prevent rename2 from exchanging a subvol with a directory from different parents
In reply to Sasha LevinFrom: NeilBrown <[email protected]>
[ Upstream commit 3f79f6f6247c83f448c8026c3ee16d4636ef8d4f ]
Cross-rename lacks a check when that would prevent exchanging a directory and subvolume from different parent subvolume. This causes data inconsistencies and is caught before commit by tree-checker, turning the filesystem to read-only.
Calling the renameat2 with RENAME_EXCHANGE flags like
renameat2(AT_FDCWD, namesrc, AT_FDCWD, namedest, (1 << 1))
on two paths:
namesrc = dir1/subvol1/dir2
namedest = subvol2/subvol3
will cause key order problem with following write time tree-checker report:
[1194842.307890] BTRFS critical (device loop1): corrupt leaf: root=5 block=27574272 slot=10 ino=258, invalid previous key objectid, have 257 expect 258 [1194842.322221] BTRFS info (device loop1): leaf 27574272 gen 8 total ptrs 11 free space 15444 owner 5 [1194842.331562] BTRFS info (device loop1): refs 2 lock_owner 0 current 26561 [1194842.338772] item 0 key (256 1 0) itemoff 16123 itemsize 160 [1194842.338793] inode generation 3 size 16 mode 40755 [1194842.338801] item 1 key (256 12 256) itemoff 16111 itemsize 12 [1194842.338809] item 2 key (256 84 2248503653) itemoff 16077 itemsize 34 [1194842.338817] dir oid 258 type 2 [1194842.338823] item 3 key (256 84 2363071922) itemoff 16043 itemsize 34 [1194842.338830] dir oid 257 type 2 [1194842.338836] item 4 key (256 96 2) itemoff 16009 itemsize 34 [1194842.338843] item 5 key (256 96 3) itemoff 15975 itemsize 34 [1194842.338852] item 6 key (257 1 0) itemoff 15815 itemsize 160 [1194842.338863] inode generation 6 size 8 mode 40755 [1194842.338869] item 7 key (257 12 256) itemoff 15801 itemsize 14 [1194842.338876] item 8 key (257 84 2505409169) itemoff 15767 itemsize 34 [1194842.338883] dir oid 256 type 2 [1194842.338888] item 9 key (257 96 2) itemoff 15733 itemsize 34 [1194842.338895] item 10 key (258 12 256) itemoff 15719 itemsize 14 [1194842.339163] BTRFS error (device loop1): block=27574272 write time tree block corruption detected [1194842.339245] ------------[ cut here ]------------ [1194842.443422] WARNING: CPU: 6 PID: 26561 at fs/btrfs/disk-io.c:449 csum_one_extent_buffer+0xed/0x100 [btrfs] [1194842.511863] CPU: 6 PID: 26561 Comm: kworker/u17:2 Not tainted 5.14.0-rc3-git+ #793 [1194842.511870] Hardware name: empty empty/S3993, BIOS PAQEX0-3 02/24/2008 [1194842.511876] Workqueue: btrfs-worker-high btrfs_work_helper [btrfs] [1194842.511976] RIP: 0010:csum_one_extent_buffer+0xed/0x100 [btrfs] [1194842.512068] RSP: 0018:ffffa2c284d77da0 EFLAGS: 00010282 [1194842.512074] RAX: 0000000000000000 RBX: 0000000000001000 RCX: ffff928867bd9978 [1194842.512078] RDX: 0000000000000000 RSI: 0000000000000027 RDI: ffff928867bd9970 [1194842.512081] RBP: ffff92876b958000 R08: 0000000000000001 R09: 00000000000c0003 [1194842.512085] R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000 [1194842.512088] R13: ffff92875f989f98 R14: 0000000000000000 R15: 0000000000000000 [1194842.512092] FS: 0000000000000000(0000) GS:ffff928867a00000(0000) knlGS:0000000000000000 [1194842.512095] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [1194842.512099] CR2: 000055f5384da1f0 CR3: 0000000102fe4000 CR4: 00000000000006e0 [1194842.512103] Call Trace: [1194842.512128] ? run_one_async_free+0x10/0x10 [btrfs] [1194842.631729] btree_csum_one_bio+0x1ac/0x1d0 [btrfs] [1194842.631837] run_one_async_start+0x18/0x30 [btrfs] [1194842.631938] btrfs_work_helper+0xd5/0x1d0 [btrfs] [1194842.647482] process_one_work+0x262/0x5e0 [1194842.647520] worker_thread+0x4c/0x320 [1194842.655935] ? process_one_work+0x5e0/0x5e0 [1194842.655946] kthread+0x135/0x160 [1194842.655953] ? set_kthread_struct+0x40/0x40 [1194842.655965] ret_from_fork+0x1f/0x30 [1194842.672465] irq event stamp: 1729 [1194842.672469] hardirqs last enabled at (1735): [<ffffffffbd1104f5>] console_trylock_spinning+0x185/0x1a0 [1194842.672477] hardirqs last disabled at (1740): [<ffffffffbd1104cc>] console_trylock_spinning+0x15c/0x1a0 [1194842.672482] softirqs last enabled at (1666): [<ffffffffbdc002e1>] __do_softirq+0x2e1/0x50a [1194842.672491] softirqs last disabled at (1651): [<ffffffffbd08aab7>] __irq_exit_rcu+0xa7/0xd0
The corrupted data will not be written, and filesystem can be unmounted and mounted again (all changes since the last commit will be lost).
Add the missing check for new_ino so that all non-subvolumes must reside under the same parent subvolume. There's an exception allowing to exchange two subvolumes from any parents as the directory representing a subvolume is only a logical link and does not have any other structures related to the parent subvolume, unlike files, directories etc, that are always in the inode namespace of the parent subvolume.
--- fs/btrfs/inode.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
fs/btrfs/inode.c +8 -2
@@ -9191,8 +9191,14 @@ static int btrfs_rename_exchange(struct inode *old_dir,bool dest_log_pinned = false;bool need_abort = false; -/* we only allow rename subvolume link between subvolumes */ -if (old_ino !=BTRFS_FIRST_FREE_OBJECTID && root != dest) +/* +* For non-subvolumes allow exchange only within one subvolume, in the +* same inode namespace. Two subvolumes (represented as directory) can +* be exchanged as they're a logical link and have a fixed inode number. +*/ +if (root != dest && + (old_ino !=BTRFS_FIRST_FREE_OBJECTID || + new_ino !=BTRFS_FIRST_FREE_OBJECTID ))return -EXDEV ;/* close the race window with snapshot create/destroy ioctl */
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 109/127 tracing: Apply trace filters on all output channels
In reply to Sasha LevinFrom: Pingfan Liu <[email protected]>
[ Upstream commit 6c34df6f350df9579ce99d887a2b5fa14cc13b32 ]
The event filters are not applied on all of the output, which results in the flood of printk when using tp_printk. Unfolding event_trigger_unlock_commit_regs() into trace_event_buffer_commit(), so the filters can be applied on every output.
--- kernel/trace/trace.c | 18 +++++++++++++++--- kernel/trace/trace.h | 32 -------------------------------- 2 files changed, 15 insertions(+), 35 deletions(-)
kernel/trace/trace.c +15 -3
@@ -2853,14 +2853,26 @@ int tracepoint_printk_sysctl(struct ctl_table *table, int write,void trace_event_buffer_commit (struct trace_event_buffer *fbuffer) { +enum event_trigger_type tt =ETT_NONE ; +struct trace_event_file *file = fbuffer->trace_file; + +if (__event_trigger_test_discard (file, fbuffer->buffer, fbuffer->event, + fbuffer->entry, &tt)) + goto discard; +if (static_key_false (&tracepoint_printk_key.key))output_printk (fbuffer);if (static_branch_unlikely (&trace_event_exports_enabled))ftrace_exports (fbuffer->event,TRACE_EXPORT_EVENT ); -event_trigger_unlock_commit_regs (fbuffer->trace_file, fbuffer->buffer, - fbuffer->event, fbuffer->entry, - fbuffer->trace_ctx, fbuffer->regs); + +trace_buffer_unlock_commit_regs (file->tr, fbuffer->buffer, + fbuffer->event, fbuffer->trace_ctx, fbuffer->regs); + +discard: +if (tt) +event_triggers_post_call (file, tt); + }EXPORT_SYMBOL_GPL (trace_event_buffer_commit);
kernel/trace/trace.h +0 -32
@@ -1391,38 +1391,6 @@ event_trigger_unlock_commit(struct trace_event_file *file,event_triggers_post_call (file, tt); } -/** -* event_trigger_unlock_commit_regs - handle triggers and finish event commit -* @file: The file pointer associated with the event -* @buffer: The ring buffer that the event is being written to -* @event: The event meta data in the ring buffer -* @entry: The event itself -* @trace_ctx: The tracing context flags. -* -* This is a helper function to handle triggers that require data -* from the event itself. It also tests the event against filters and -* if the event is soft disabled and should be discarded. -* -* Same as event_trigger_unlock_commit() but calls -* trace_buffer_unlock_commit_regs() instead of trace_buffer_unlock_commit(). -*/ -static inline void -event_trigger_unlock_commit_regs (struct trace_event_file *file, -struct trace_buffer *buffer, -struct ring_buffer_event *event, -void *entry,unsigned int trace_ctx, -struct pt_regs *regs) -{ -enum event_trigger_type tt =ETT_NONE ; - -if (!__event_trigger_test_discard (file, buffer, event, entry, &tt)) -trace_buffer_unlock_commit_regs (file->tr, buffer, event, - trace_ctx, regs); - -if (tt) -event_triggers_post_call (file, tt); -} -#define FILTER_PRED_INVALID ((unsigned short)-1)#define FILTER_PRED_IS_RIGHT (1 << 15)#define FILTER_PRED_FOLD (1 << 15)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 110/127 ALSA: hda/via: Apply runtime PM workaround for ASUS B23E
In reply to Sasha LevinFrom: Takashi Iwai <[email protected]>
[ Upstream commit 4bf61ad5f0204b67ba570da6e5c052c2095e29df ]
ASUS B23E requires the same workaround like other machines with VT1802, otherwise it looses the codec power on a few nodes and the sound kept silence.
--- sound/pci/hda/patch_via.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_via.c +1 -0
@@ -1041,6 +1041,7 @@ static const struct hda_fixup via_fixups[] = { };static const struct snd_pci_quirk vt2002p_fixups[] = { +SND_PCI_QUIRK (0x1043 ,0x13f7 ,"Asus B23E" ,VIA_FIXUP_POWER_SAVE ),SND_PCI_QUIRK (0x1043 ,0x1487 ,"Asus G75" ,VIA_FIXUP_ASUS_G75 ),SND_PCI_QUIRK (0x1043 ,0x8532 ,"Asus X202E" ,VIA_FIXUP_INTMIC_BOOST ),SND_PCI_QUIRK_VENDOR (0x1558 ,"Clevo" ,VIA_FIXUP_POWER_SAVE ),
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 111/127 s390/pci: fix use after free of zpci_dev
In reply to Sasha LevinFrom: Niklas Schnelle <[email protected]>
[ Upstream commit 2a671f77ee49f3e78997b77fdee139467ff6a598 ]
The struct pci_dev uses reference counting but zPCI assumed erroneously that the last reference would always be the local reference after calling pci_stop_and_remove_bus_device(). This is usually the case but not how reference counting works and thus inherently fragile.
In fact one case where this causes a NULL pointer dereference when on an SRIOV device the function 0 was hot unplugged before another function of the same multi-function device. In this case the second function's pdev->sriov->dev reference keeps the struct pci_dev of function 0 alive even after the unplug. This bug was previously hidden by the fact that we were leaking the struct pci_dev which in turn means that it always outlived the struct zpci_dev. This was fixed in commit 0b13525c20fe ("s390/pci: fix leak of PCI device structure") exposing the broken behavior.
Fix this by accounting for the long living reference a struct pci_dev has to its underlying struct zpci_dev via the zbus->function[] array and only release that in pcibios_release_device() ensuring that the struct pci_dev is not left with a dangling reference. This is a minimal fix in the future it would probably better to use fine grained reference counting for struct zpci_dev.
--- arch/s390/pci/pci.c | 6 ++++++ arch/s390/pci/pci_bus.h | 5 +++++ 2 files changed, 11 insertions(+)
arch/s390/pci/pci.c +6 -0
@@ -560,9 +560,12 @@ static void zpci_cleanup_bus_resources(struct zpci_dev *zdev)int pcibios_add_device (struct pci_dev *pdev) { +struct zpci_dev *zdev =to_zpci (pdev);struct resource *res;int i; +/* The pdev has a reference to the zdev via its bus */ +zpci_zdev_get (zdev);if (pdev->is_physfn) pdev->no_vf_scan =1 ;
@@ -582,7 +585,10 @@ int pcibios_add_device(struct pci_dev *pdev)void pcibios_release_device (struct pci_dev *pdev) { +struct zpci_dev *zdev =to_zpci (pdev); +zpci_unmap_resources (pdev); +zpci_zdev_put (zdev); }int pcibios_enable_device (struct pci_dev *pdev,int mask)
arch/s390/pci/pci_bus.h +5 -0
@@ -22,6 +22,11 @@ static inline void zpci_zdev_put(struct zpci_dev *zdev)kref_put (&zdev->kref, zpci_release_device); } +static inline void zpci_zdev_get (struct zpci_dev *zdev) +{ +kref_get (&zdev->kref); +} +int zpci_alloc_domain (int domain);void zpci_free_domain (int domain); int zpci_setup_bus_resources(struct zpci_dev *zdev,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 112/127 usb: typec: tcpm: Fix VDMs sometimes not being forwarded to alt-mode drivers
In reply to Sasha LevinFrom: Hans de Goede <[email protected]>
[ Upstream commit 5571ea3117ca22849072adb58074fb5a2fd12c00 ]
Commit a20dcf53ea98 ("usb: typec: tcpm: Respond Not_Supported if no snk_vdo"), stops tcpm_pd_data_request() calling tcpm_handle_vdm_request() when port->nr_snk_vdo is not set. But the VDM might be intended for an altmode-driver, in which case nr_snk_vdo does not matter.
This change breaks the forwarding of connector hotplug (HPD) events for displayport altmode on devices which don't set nr_snk_vdo.
tcpm_pd_data_request() is the only caller of tcpm_handle_vdm_request(), so we can move the nr_snk_vdo check to inside it, at which point we have already looked up the altmode device so we can check for this too.
Doing this check here also ensures that vdm_state gets set to VDM_STATE_DONE if it was VDM_STATE_BUSY, even if we end up with responding with PD_MSG_CTRL_NOT_SUPP later.
Note that tcpm_handle_vdm_request() was already sending PD_MSG_CTRL_NOT_SUPP in some circumstances, after moving the nr_snk_vdo check the same error-path is now taken when that check fails. So that we have only one error-path for this and not two. Replace the tcpm_queue_message(PD_MSG_CTRL_NOT_SUPP) used by the existing error-path with the more robust tcpm_pd_handle_msg() from the (now removed) second error-path.
--- drivers/usb/typec/tcpm/tcpm.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/usb/typec/tcpm/tcpm.c +7 -6
@@ -1709,6 +1709,10 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,return rlen; } +static void tcpm_pd_handle_msg (struct tcpm_port *port, +enum pd_msg_request message, +enum tcpm_ams ams); +static void tcpm_handle_vdm_request (struct tcpm_port *port,const __le32 *payload,int cnt) {
@@ -1736,11 +1740,11 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port, port->vdm_state =VDM_STATE_DONE ; } -if (PD_VDO_SVDM (p[0 ])) { +if (PD_VDO_SVDM (p[0 ]) && (adev ||tcpm_vdm_ams (port) || port->nr_snk_vdo)) { rlen =tcpm_pd_svdm (port, adev, p, cnt, response, &adev_action); }else {if (port->negotiated_rev >=PD_REV30 ) -tcpm_queue_message (port,PD_MSG_CTRL_NOT_SUPP ); +tcpm_pd_handle_msg (port,PD_MSG_CTRL_NOT_SUPP ,NONE_AMS ); }/*
@@ -2443,10 +2447,7 @@ static void tcpm_pd_data_request(struct tcpm_port *port, NONE_AMS);break ;case PD_DATA_VENDOR_DEF : -if (tcpm_vdm_ams (port) || port->nr_snk_vdo) -tcpm_handle_vdm_request (port, msg->payload, cnt); -else if (port->negotiated_rev >PD_REV20 ) -tcpm_pd_handle_msg (port,PD_MSG_CTRL_NOT_SUPP ,NONE_AMS ); +tcpm_handle_vdm_request (port, msg->payload, cnt);break ;case PD_DATA_BIST : port->bist_request =le32_to_cpu (msg->payload[0 ]);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 113/127 powerpc/32s: Move setup_{kuep/kuap}() into {kuep/kuap}.c
In reply to Sasha LevinFrom: Christophe Leroy <[email protected]>
[ Upstream commit 91ec66719d4c5c0e7b4e32585b01881660d1bc53 ]
Avoids the #ifdef in mmu.c
--- arch/powerpc/mm/book3s32/Makefile | 1 + arch/powerpc/mm/book3s32/kuap.c | 11 +++++++++++ arch/powerpc/mm/book3s32/kuep.c | 8 ++++++++ arch/powerpc/mm/book3s32/mmu.c | 20 -------------------- 4 files changed, 20 insertions(+), 20 deletions(-) create mode 100644 arch/powerpc/mm/book3s32/kuap.c
arch/powerpc/mm/book3s32/Makefile +1 -0
@@ -10,3 +10,4 @@ obj-y += mmu.o mmu_context.o obj-$(CONFIG_PPC_BOOK3S_603) += nohash_low.o obj-$(CONFIG_PPC_BOOK3S_604) += hash_low.o tlb.o obj-$(CONFIG_PPC_KUEP) += kuep.o +obj-$(CONFIG_PPC_KUAP) += kuap.o
arch/powerpc/mm/book3s32/kuap.c new file +11 -0
@@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <asm/kup.h> + +void __init setup_kuap (bool disabled) +{ +pr_info ("Activating Kernel Userspace Access Protection\n" ); + +if (disabled) +pr_warn ("KUAP cannot be disabled yet on 6xx when compiled in\n" ); +}
arch/powerpc/mm/book3s32/kuep.c +8 -0
@@ -38,3 +38,11 @@ void kuep_unlock(void) {kuep_update (mfsr (0 ) & ~SR_NX ); } + +void __init setup_kuep (bool disabled) +{ +pr_info ("Activating Kernel Userspace Execution Prevention\n" ); + +if (disabled) +pr_warn ("KUEP cannot be disabled yet on 6xx when compiled in\n" ); +}
arch/powerpc/mm/book3s32/mmu.c +0 -20
@@ -445,26 +445,6 @@ void __init print_system_hash_info(void)pr_info ("Hash_mask = 0x%lx\n" , Hash_mask); } -#ifdef CONFIG_PPC_KUEP -void __init setup_kuep (bool disabled) -{ -pr_info ("Activating Kernel Userspace Execution Prevention\n" ); - -if (disabled) -pr_warn ("KUEP cannot be disabled yet on 6xx when compiled in\n" ); -} -#endif - -#ifdef CONFIG_PPC_KUAP -void __init setup_kuap (bool disabled) -{ -pr_info ("Activating Kernel Userspace Access Protection\n" ); - -if (disabled) -pr_warn ("KUAP cannot be disabled yet on 6xx when compiled in\n" ); -} -#endif -void __init early_init_mmu (void ) { }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 114/127 powerpc/32s: Refactor update of user segment registers
In reply to Sasha LevinFrom: Christophe Leroy <[email protected]>
[ Upstream commit 91bb30822a2e1d7900f9f42e9e92647a9015f979 ]
KUEP implements the update of user segment registers.
Move it into mmu-hash.h in order to use it from other places.
And inline kuep_lock() and kuep_unlock(). Inlining kuep_lock() is important for system_call_exception(), otherwise system_call_exception() has to save into stack the system call parameters that are used just after, and doing that takes more instructions than kuep_lock() itself.
--- arch/powerpc/include/asm/book3s/32/kup.h | 21 +++++++++++ arch/powerpc/include/asm/book3s/32/mmu-hash.h | 27 ++++++++++++++ arch/powerpc/include/asm/kup.h | 5 +-- arch/powerpc/mm/book3s32/kuep.c | 37 ------------------- 4 files changed, 49 insertions(+), 41 deletions(-)
arch/powerpc/include/asm/book3s/32/kup.h +21 -0
@@ -7,6 +7,27 @@#ifndef __ASSEMBLY__ +static __always_inline bool kuep_is_disabled(void) +{ +return !IS_ENABLED (CONFIG_PPC_KUEP ); +} + +static inline void kuep_lock (void ) +{ +if (kuep_is_disabled ()) +return ; + +update_user_segments (mfsr (0 ) |SR_NX ); +} + +static inline void kuep_unlock (void ) +{ +if (kuep_is_disabled ()) +return ; + +update_user_segments (mfsr (0 ) & ~SR_NX ); +} +#ifdef CONFIG_PPC_KUAP #include <linux/sched.h>
arch/powerpc/include/asm/book3s/32/mmu-hash.h +27 -0
@@ -102,6 +102,33 @@ extern s32 patch__hash_page_B, patch__hash_page_C;extern s32 patch__flush_hash_A0, patch__flush_hash_A1, patch__flush_hash_A2;extern s32 patch__flush_hash_B; +#include <asm/reg.h> +#include <asm/task_size_32.h> + +#define UPDATE_TWO_USER_SEGMENTS (n) do { \ + if (TASK_SIZE > ((n) << 28)) \ + mtsr(val1, (n) << 28); \ + if (TASK_SIZE > (((n) + 1) << 28)) \ + mtsr(val2, ((n) + 1) << 28); \ + val1 = (val1 + 0x222) & 0xf0ffffff; \ + val2 = (val2 + 0x222) & 0xf0ffffff; \ +} while (0) + +static __always_inline void update_user_segments(u32 val) +{ +int val1 = val; +int val2 = (val +0x111 ) &0xf0ffffff ; + +UPDATE_TWO_USER_SEGMENTS (0 ); +UPDATE_TWO_USER_SEGMENTS (2 ); +UPDATE_TWO_USER_SEGMENTS (4 ); +UPDATE_TWO_USER_SEGMENTS (6 ); +UPDATE_TWO_USER_SEGMENTS (8 ); +UPDATE_TWO_USER_SEGMENTS (10 ); +UPDATE_TWO_USER_SEGMENTS (12 ); +UPDATE_TWO_USER_SEGMENTS (14 ); +} +#endif /* !__ASSEMBLY__ */ /* We happily ignore the smaller BATs on 601, we don't actually use
arch/powerpc/include/asm/kup.h +1 -4
@@ -46,10 +46,7 @@ void setup_kuep(bool disabled);static inline void setup_kuep (bool disabled) { }#endif /* CONFIG_PPC_KUEP */ -#if defined(CONFIG_PPC_KUEP ) && defined(CONFIG_PPC_BOOK3S_32 ) -void kuep_lock (void ); -void kuep_unlock (void ); -#else +#ifndef CONFIG_PPC_BOOK3S_32 static inline void kuep_lock (void ) { }static inline void kuep_unlock (void ) { }#endif
arch/powerpc/mm/book3s32/kuep.c +0 -37
@@ -1,43 +1,6 @@// SPDX-License-Identifier: GPL-2.0-or-later #include <asm/kup.h> -#include <asm/reg.h> -#include <asm/task_size_32.h> -#include <asm/mmu.h> - -#define KUEP_UPDATE_TWO_USER_SEGMENTS (n) do { \ - if (TASK_SIZE > ((n) << 28)) \ - mtsr(val1, (n) << 28); \ - if (TASK_SIZE > (((n) + 1) << 28)) \ - mtsr(val2, ((n) + 1) << 28); \ - val1 = (val1 + 0x222) & 0xf0ffffff; \ - val2 = (val2 + 0x222) & 0xf0ffffff; \ -} while (0) - -static __always_inline void kuep_update(u32 val) -{ -int val1 = val; -int val2 = (val +0x111 ) &0xf0ffffff ; - -KUEP_UPDATE_TWO_USER_SEGMENTS (0 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (2 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (4 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (6 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (8 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (10 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (12 ); -KUEP_UPDATE_TWO_USER_SEGMENTS (14 ); -} - -void kuep_lock (void ) -{ -kuep_update (mfsr (0 ) |SR_NX ); -} - -void kuep_unlock (void ) -{ -kuep_update (mfsr (0 ) & ~SR_NX ); -}void __init setup_kuep (bool disabled) {
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 115/127 powerpc/32s: Fix random crashes by adding isync() after locking/unlocking KUEP
In reply to Sasha LevinFrom: Christophe Leroy <[email protected]>
[ Upstream commit ef486bf448a057a6e2d50e40ae879f7add6585da ]
Commit b5efec00b671 ("powerpc/32s: Move KUEP locking/unlocking in C") removed the 'isync' instruction after adding/removing NX bit in user segments. The reasoning behind this change was that when setting the NX bit we don't mind it taking effect with delay as the kernel never executes text from userspace, and when clearing the NX bit this is to return to userspace and then the 'rfi' should synchronise the context.
However, it looks like on book3s/32 having a hash page table, at least on the G3 processor, we get an unexpected fault from userspace, then this is followed by something wrong in the verification of MSR_PR at end of another interrupt.
This is fixed by adding back the removed isync() following update of NX bit in user segment registers. Only do it for cores with an hash table, as 603 cores don't exhibit that problem and the two isync increase ./null_syscall selftest by 6 cycles on an MPC 832x.
First problem: unexpected WARN_ON() for mysterious PROTFAULT
WARNING: CPU: 0 PID: 1660 at arch/powerpc/mm/fault.c:354 do_page_fault+0x6c/0x5b0 Modules linked in: CPU: 0 PID: 1660 Comm: Xorg Not tainted 5.13.0-pmac-00028-gb3c15b60339a #40 NIP: c001b5c8 LR: c001b6f8 CTR: 00000000 REGS: e2d09e40 TRAP: 0700 Not tainted (5.13.0-pmac-00028-gb3c15b60339a) MSR: 00021032 <ME,IR,DR,RI> CR: 42d04f30 XER: 20000000 GPR00: c000424c e2d09f00 c301b680 e2d09f40 0000001e 42000000 00cba028 00000000 GPR08: 08000000 48000010 c301b680 e2d09f30 22d09f30 00c1fff0 00cba000 a7b7ba4c GPR16: 00000031 00000000 00000000 00000000 00000000 00000000 a7b7b0d0 00c5c010 GPR24: a7b7b64c a7b7d2f0 00000004 00000000 c1efa6c0 00cba02c 00000300 e2d09f40 NIP [c001b5c8] do_page_fault+0x6c/0x5b0 LR [c001b6f8] do_page_fault+0x19c/0x5b0 Call Trace: [e2d09f00] [e2d09f04] 0xe2d09f04 (unreliable) [e2d09f30] [c000424c] DataAccess_virt+0xd4/0xe4 --- interrupt: 300 at 0xa7a261dc NIP: a7a261dc LR: a7a253bc CTR: 00000000 REGS: e2d09f40 TRAP: 0300 Not tainted (5.13.0-pmac-00028-gb3c15b60339a) MSR: 0000d032 <EE,PR,ME,IR,DR,RI> CR: 228428e2 XER: 20000000 DAR: 00cba02c DSISR: 42000000 GPR00: a7a27448 afa6b0e0 a74c35c0 a7b7b614 0000001e a7b7b614 00cba028 00000000 GPR08: 00020fd9 00000031 00cb9ff8 a7a273b0 220028e2 00c1fff0 00cba000 a7b7ba4c GPR16: 00000031 00000000 00000000 00000000 00000000 00000000 a7b7b0d0 00c5c010 GPR24: a7b7b64c a7b7d2f0 00000004 00000002 0000001e a7b7b614 a7b7aff4 00000030 NIP [a7a261dc] 0xa7a261dc LR [a7a253bc] 0xa7a253bc --- interrupt: 300 Instruction dump: 7c4a1378 810300a0 75278410 83820298 83a300a4 553b018c 551e0036 4082038c 2e1b0000 40920228 75280800 41820220 <0fe00000> 3b600000 41920214 81420594
Second problem: MSR PR is seen unset allthough the interrupt frame shows it set
kernel BUG at arch/powerpc/kernel/interrupt.c:458!
Oops: Exception in kernel mode, sig: 5 [#1] BE PAGE_SIZE=4K MMU=Hash SMP NR_CPUS=2 PowerMac Modules linked in: CPU: 0 PID: 1660 Comm: Xorg Tainted: G W 5.13.0-pmac-00028-gb3c15b60339a #40 NIP: c0011434 LR: c001629c CTR: 00000000 REGS: e2d09e70 TRAP: 0700 Tainted: G W (5.13.0-pmac-00028-gb3c15b60339a) MSR: 00029032 <EE,ME,IR,DR,RI> CR: 42d09f30 XER: 00000000 GPR00: 00000000 e2d09f30 c301b680 e2d09f40 83440000 c44d0e68 e2d09e8c 00000000 GPR08: 00000002 00dc228a 00004000 e2d09f30 22d09f30 00c1fff0 afa6ceb4 00c26144 GPR16: 00c25fb8 00c26140 afa6ceb8 90000000 00c944d8 0000001c 00000000 00200000 GPR24: 00000000 000001fb afa6d1b4 00000001 00000000 a539a2a0 a530fd80 00000089 NIP [c0011434] interrupt_exit_kernel_prepare+0x10/0x70 LR [c001629c] interrupt_return+0x9c/0x144 Call Trace: [e2d09f30] [c000424c] DataAccess_virt+0xd4/0xe4 (unreliable) --- interrupt: 300 at 0xa09be008 NIP: a09be008 LR: a09bdfe8 CTR: a09bdfc0 REGS: e2d09f40 TRAP: 0300 Tainted: G W (5.13.0-pmac-00028-gb3c15b60339a) MSR: 0000d032 <EE,PR,ME,IR,DR,RI> CR: 420028e2 XER: 20000000 DAR: a539a308 DSISR: 0a000000 GPR00: a7b90d50 afa6b2d0 a74c35c0 a0a8b690 a0a8b698 a5365d70 a4fa82a8 00000004 GPR08: 00000000 a09bdfc0 00000000 a5360000 a09bde7c 00c1fff0 afa6ceb4 00c26144 GPR16: 00c25fb8 00c26140 afa6ceb8 90000000 00c944d8 0000001c 00000000 00200000 GPR24: 00000000 000001fb afa6d1b4 00000001 00000000 a539a2a0 a530fd80 00000089 NIP [a09be008] 0xa09be008 LR [a09bdfe8] 0xa09bdfe8 --- interrupt: 300 Instruction dump: 80010024 83e1001c 7c0803a6 4bffff80 3bc00800 4bffffd0 486b42fd 4bffffcc 81430084 71480002 41820038 554a0462 <0f0a0000> 80620060 74630001 40820034
--- arch/powerpc/include/asm/book3s/32/kup.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
arch/powerpc/include/asm/book3s/32/kup.h +20 -0
@@ -4,6 +4,8 @@#include <asm/bug.h> #include <asm/book3s/32/mmu-hash.h> +#include <asm/mmu.h> +#include <asm/synch.h> #ifndef __ASSEMBLY__
@@ -18,6 +20,15 @@ static inline void kuep_lock(void)return ;update_user_segments (mfsr (0 ) |SR_NX ); +/* +* This isync() shouldn't be necessary as the kernel is not excepted to +* run any instruction in userspace soon after the update of segments, +* but hash based cores (at least G3) seem to exhibit a random +* behaviour when the 'isync' is not there. 603 cores don't have this +* behaviour so don't do the 'isync' as it saves several CPU cycles. +*/ +if (mmu_has_feature (MMU_FTR_HPTE_TABLE )) +isync ();/* Context sync required after mtsr() */ }static inline void kuep_unlock (void )
@@ -26,6 +37,15 @@ static inline void kuep_unlock(void)return ;update_user_segments (mfsr (0 ) & ~SR_NX ); +/* +* This isync() shouldn't be necessary as a 'rfi' will soon be executed +* to return to userspace, but hash based cores (at least G3) seem to +* exhibit a random behaviour when the 'isync' is not there. 603 cores +* don't have this behaviour so don't do the 'isync' as it saves several +* CPU cycles. +*/ +if (mmu_has_feature (MMU_FTR_HPTE_TABLE )) +isync ();/* Context sync required after mtsr() */ }#ifdef CONFIG_PPC_KUAP
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 116/127 PCI: Increase D3 delay for AMD Renoir/Cezanne XHCI
In reply to Sasha LevinFrom: Marcin Bachry <[email protected]>
[ Upstream commit e0bff43220925b7e527f9d3bc9f5c624177c959e ]
The Renoir XHCI controller apparently doesn't resume reliably with the standard D3hot-to-D0 delay. Increase it to 20ms.
[Alex: I talked to the AMD USB hardware team and the AMD Windows team and they are not aware of any HW errata or specific issues. The HW works fine in Windows. I was told Windows uses a rather generous default delay of 100ms for PCI state transitions.]
--- drivers/pci/quirks.c | 1 + 1 file changed, 1 insertion(+)
drivers/pci/quirks.c +1 -0
@@ -1900,6 +1900,7 @@ static void quirk_ryzen_xhci_d3hot(struct pci_dev *dev) }DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,0x15e0 , quirk_ryzen_xhci_d3hot);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,0x15e1 , quirk_ryzen_xhci_d3hot); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,0x1639 , quirk_ryzen_xhci_d3hot);#ifdef CONFIG_X86_IO_APIC static int dmi_disable_ioapicreroute (const struct dmi_system_id *d)
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 117/127 ALSA: hda/realtek: Limit mic boost on HP ProBook 445 G8
In reply to Sasha LevinFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 8903376dc69949199301b290cc22dc64ae5d8a6d ]
The mic has lots of noises if mic boost is enabled. So disable mic boost to get crystal clear audio capture.
--- sound/pci/hda/patch_realtek.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
sound/pci/hda/patch_realtek.c +9 -2
@@ -6598,6 +6598,7 @@ enum {ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP ,ALC623_FIXUP_LENOVO_THINKSTATION_P340 ,ALC255_FIXUP_ACER_HEADPHONE_AND_MIC , + ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST, }; static const struct hda_fixup alc269_fixups[] = {
@@ -8182,6 +8183,12 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC255_FIXUP_XIAOMI_HEADSET_MIC }, + [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc269_fixup_limit_int_mic_boost, + .chained = true, + .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF, + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -8378,8 +8385,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x8847 ,"HP EliteBook x360 830 G8 Notebook PC" ,ALC285_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x884b ,"HP EliteBook 840 Aero G8 Notebook PC" ,ALC285_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x103c ,0x884c ,"HP EliteBook 840 G8 Notebook PC" ,ALC285_FIXUP_HP_GPIO_LED ), -SND_PCI_QUIRK (0x103c ,0x8862 ,"HP ProBook 445 G8 Notebook PC" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), -SND_PCI_QUIRK (0x103c ,0x8863 ,"HP ProBook 445 G8 Notebook PC" ,ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF ), +SND_PCI_QUIRK (0x103c ,0x8862 ,"HP ProBook 445 G8 Notebook PC" ,ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST ), +SND_PCI_QUIRK (0x103c ,0x8863 ,"HP ProBook 445 G8 Notebook PC" ,ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x103c ,0x886d ,"HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ),SND_PCI_QUIRK (0x103c ,0x8870 ,"HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC" ,ALC285_FIXUP_HP_GPIO_AMP_INIT ), SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 118/127 ASoC: intel: atom: Fix breakage for PCM buffer address setup
In reply to Sasha LevinFrom: Takashi Iwai <[email protected]>
[ Upstream commit 65ca89c2b12cca0d473f3dd54267568ad3af55cc ]
The commit 2e6b836312a4 ("ASoC: intel: atom: Fix reference to PCM buffer address") changed the reference of PCM buffer address to substream->runtime->dma_addr as the buffer address may change dynamically. However, I forgot that the dma_addr field is still not set up for the CONTINUOUS buffer type (that this driver uses) yet in 5.14 and earlier kernels, and it resulted in garbage I/O. The problem will be fixed in 5.15, but we need to address it quickly for now.
The fix is to deduce the address again from the DMA pointer with virt_to_phys(), but from the right one, substream->runtime->dma_area.
--- sound/soc/intel/atom/sst-mfld-platform-pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/intel/atom/sst-mfld-platform-pcm.c +1 -1
@@ -127,7 +127,7 @@ static void sst_fill_alloc_params(struct snd_pcm_substream *substream,snd_pcm_uframes_t period_size;ssize_t periodbytes;ssize_t buffer_bytes =snd_pcm_lib_buffer_bytes (substream); -u32 buffer_addr = substream->runtime->dma_addr; +u32 buffer_addr =virt_to_phys (substream->runtime->dma_area); channels = substream->runtime->channels; period_size = substream->runtime->period_size;
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 119/127 riscv: Fix a number of free'd resources in init_resources()
In reply to Sasha LevinFrom: Petr Pavlu <[email protected]>
[ Upstream commit aa3e1ba32e553e611a58145c2eb349802feaa6eb ]
Function init_resources() allocates a boot memory block to hold an array of resources which it adds to iomem_resource. The array is filled in from its end and the function then attempts to free any unused memory at the beginning. The problem is that size of the unused memory is incorrectly calculated and this can result in releasing memory which is in use by active resources. Their data then gets corrupted later when the memory is reused by a different part of the system.
Fix the size of the released memory to correctly match the number of unused resource entries.
--- arch/riscv/kernel/setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/kernel/setup.c +2 -2
@@ -230,8 +230,8 @@ static void __init init_resources(void) }/* Clean-up any unused pre-allocated resources */ - mem_res_sz = (num_resources - res_idx +1 ) *sizeof (*mem_res); -memblock_free (__pa (mem_res), mem_res_sz); +if (res_idx >=0 ) +memblock_free (__pa (mem_res), (res_idx +1 ) *sizeof (*mem_res));return ; error:
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 120/127 mm: memcontrol: fix occasional OOMs due to proportional memory.low reclaim
In reply to Sasha LevinFrom: Johannes Weiner <[email protected]>
[ Upstream commit f56ce412a59d7d938b81de8878faef128812482c ]
We've noticed occasional OOM killing when memory.low settings are in effect for cgroups. This is unexpected and undesirable as memory.low is supposed to express non-OOMing memory priorities between cgroups.
The reason for this is proportional memory.low reclaim. When cgroups are below their memory.low threshold, reclaim passes them over in the first round, and then retries if it couldn't find pages anywhere else. But when cgroups are slightly above their memory.low setting, page scan force is scaled down and diminished in proportion to the overage, to the point where it can cause reclaim to fail as well - only in that case we currently don't retry, and instead trigger OOM.
To fix this, hook proportional reclaim into the same retry logic we have in place for when cgroups are skipped entirely. This way if reclaim fails and some cgroups were scanned with diminished pressure, we'll try another full-force cycle before giving up and OOMing.
[[email protected]: coding-style fixes]
--- include/linux/memcontrol.h | 29 +++++++++++++++-------------- mm/vmscan.c | 27 +++++++++++++++++++-------- 2 files changed, 34 insertions(+), 22 deletions(-)
include/linux/memcontrol.h +15 -14
@@ -613,12 +613,15 @@ static inline bool mem_cgroup_disabled(void)return !cgroup_subsys_enabled (memory_cgrp_subsys); } -static inline unsigned long mem_cgroup_protection (struct mem_cgroup *root, -struct mem_cgroup *memcg, -bool in_low_reclaim) +static inline void mem_cgroup_protection (struct mem_cgroup *root, +struct mem_cgroup *memcg, +unsigned long *min, +unsigned long *low) { + *min = *low =0 ; +if (mem_cgroup_disabled ()) -return 0 ; +return ;/* * There is no reclaim protection applied to a targeted reclaim.
@@ -654,13 +657,10 @@ static inline unsigned long mem_cgroup_protection(struct mem_cgroup *root,* */ if (root == memcg) -return 0 ; - -if (in_low_reclaim) -return READ_ONCE (memcg->memory.emin); +return ; -return max (READ_ONCE (memcg->memory.emin), -READ_ONCE (memcg->memory.elow)); + *min =READ_ONCE (memcg->memory.emin); + *low =READ_ONCE (memcg->memory.elow); } void mem_cgroup_calculate_protection(struct mem_cgroup *root,
@@ -1165,11 +1165,12 @@ static inline void memcg_memory_event_mm(struct mm_struct *mm, { } -static inline unsigned long mem_cgroup_protection (struct mem_cgroup *root, -struct mem_cgroup *memcg, -bool in_low_reclaim) +static inline void mem_cgroup_protection (struct mem_cgroup *root, +struct mem_cgroup *memcg, +unsigned long *min, +unsigned long *low) { -return 0 ; + *min = *low =0 ; } static inline void mem_cgroup_calculate_protection(struct mem_cgroup *root,
mm/vmscan.c +19 -8
@@ -100,9 +100,12 @@ struct scan_control { unsigned int may_swap:1;/* -* Cgroups are not reclaimed below their configured memory.low, -* unless we threaten to OOM. If any cgroups are skipped due to -* memory.low and nothing was reclaimed, go back for memory.low. +* Cgroup memory below memory.low is protected as long as we +* don't threaten to OOM. If any cgroup is reclaimed at +* reduced force or passed over entirely due to its memory.low +* setting (memcg_low_skipped), and nothing is reclaimed as a +* result, then go back for one more cycle that reclaims the protected +* memory (memcg_low_reclaim) to avert OOM. */ unsigned int memcg_low_reclaim:1; unsigned int memcg_low_skipped:1;
@@ -2521,15 +2524,14 @@ out:for_each_evictable_lru (lru) {int file =is_file_lru (lru);unsigned long lruvec_size; +unsigned long low, min;unsigned long scan; -unsigned long protection; lruvec_size =lruvec_lru_size (lruvec, lru, sc->reclaim_idx); - protection =mem_cgroup_protection (sc->target_mem_cgroup, - memcg, - sc->memcg_low_reclaim); +mem_cgroup_protection (sc->target_mem_cgroup, memcg, + &min, &low); -if (protection) { +if (min || low) {/* * Scale a cgroup's reclaim pressure by proportioning * its current usage to its memory.low or memory.min
@@ -2560,6 +2562,15 @@ out:* hard protection. */ unsigned long cgroup_size =mem_cgroup_size (memcg); +unsigned long protection; + +/* memory.low scaling, make sure we retry before OOM */ +if (!sc->memcg_low_reclaim && low > min) { + protection = low; + sc->memcg_low_skipped =1 ; + }else { + protection = min; + }/* Avoid TOCTOU with earlier protection check */ cgroup_size =max (cgroup_size, protection);
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 121/127 mm,hwpoison: make get_hwpoison_page() call get_any_page()
In reply to Sasha LevinFrom: Naoya Horiguchi <[email protected]>
[ Upstream commit 0ed950d1f28142ccd9a9453c60df87853530d778 ]
__get_hwpoison_page() could fail to grab refcount by some race condition, so it's helpful if we can handle it by retrying. We already have retry logic, so make get_hwpoison_page() call get_any_page() when called from memory_failure().
As a result, get_hwpoison_page() can return negative values (i.e. error code), so some callers are also changed to handle error cases. soft_offline_page() does nothing for -EBUSY because that's enough and users in userspace can easily handle it. unpoison_memory() is also unchanged because it's broken and need thorough fixes (will be done later).
--- mm/hugetlb.c | 2 + mm/memory-failure.c | 194 +++++++++++++++++++++++++------------------- 2 files changed, 111 insertions(+), 85 deletions(-)
mm/hugetlb.c +2 -0
@@ -5930,6 +5930,8 @@ int get_hwpoison_huge_page(struct page *page, bool *hugetlb) *hugetlb = true;if (HPageFreed (page) ||HPageMigratable (page)) ret =get_page_unless_zero (page); +else + ret = -EBUSY ; }spin_unlock_irq (&hugetlb_lock);return ret;
mm/memory-failure.c +109 -85
256 lines not on this page · raw message
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 122/127 mm/hwpoison: retry with shake_page() for unhandlable pages
In reply to Sasha LevinFrom: Naoya Horiguchi <[email protected]>
[ Upstream commit fcc00621d88b274b5dffd8daeea71d0e4c28b84e ]
HWPoisonHandlable() sometimes returns false for typical user pages due to races with average memory events like transfers over LRU lists. This causes failures in hwpoison handling.
There's retry code for such a case but does not work because the retry loop reaches the retry limit too quickly before the page settles down to handlable state. Let get_any_page() call shake_page() to fix it.
--- mm/memory-failure.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
mm/memory-failure.c +9 -3
@@ -990,7 +990,7 @@ static int __get_hwpoison_page(struct page *page)* unexpected races caused by taking a page refcount. */ if (!HWPoisonHandlable (head)) -return 0 ; +return -EBUSY ;if (PageTransHuge (head)) {/*
@@ -1043,9 +1043,15 @@ try_again: } goto out; }else if (ret == -EBUSY ) { -/* We raced with freeing huge page to buddy, retry. */ -if (pass++ <3 ) +/* +* We raced with (possibly temporary) unhandlable +* page, retry. +*/ +if (pass++ <3 ) { +shake_page (p,1 ); goto try_again; + } + ret = -EIO ; goto out; } }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 123/127 kfence: fix is_kfence_address() for addresses below KFENCE_POOL_SIZE
In reply to Sasha LevinFrom: Marco Elver <[email protected]>
[ Upstream commit a7cb5d23eaea148f8582229846f8dfff192f05c3 ]
Originally the addr != NULL check was meant to take care of the case where __kfence_pool == NULL (KFENCE is disabled). However, this does not work for addresses where addr > 0 && addr < KFENCE_POOL_SIZE.
This can be the case on NULL-deref where addr > 0 && addr < PAGE_SIZE or any other faulting access with addr < KFENCE_POOL_SIZE. While the kernel would likely crash, the stack traces and report might be confusing due to double faults upon KFENCE's attempt to unprotect such an address.
Fix it by just checking that __kfence_pool != NULL instead.
--- include/linux/kfence.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
include/linux/kfence.h +4 -3
@@ -51,10 +51,11 @@ extern atomic_t kfence_allocation_gate; static __always_inline bool is_kfence_address(const void *addr) {/* -* The non-NULL check is required in case the __kfence_pool pointer was -* never initialized; keep it in the slow-path after the range-check. +* The __kfence_pool != NULL check is required to deal with the case +* where __kfence_pool == NULL && addr < KFENCE_POOL_SIZE. Keep it in +* the slow-path after the range-check! */ -return unlikely ((unsigned long )((char *)addr - __kfence_pool) <KFENCE_POOL_SIZE && addr); +return unlikely ((unsigned long )((char *)addr - __kfence_pool) <KFENCE_POOL_SIZE && __kfence_pool); }/**
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 124/127 hugetlb: don't pass page cache pages to restore_reserve_on_error
In reply to Sasha LevinFrom: Mike Kravetz <[email protected]>
[ Upstream commit c7b1850dfb41d0b4154aca8dbc04777fbd75616f ]
syzbot hit kernel BUG at fs/hugetlbfs/inode.c:532 as described in [1]. This BUG triggers if the HPageRestoreReserve flag is set on a page in the page cache. It should never be set, as the routine huge_add_to_page_cache explicitly clears the flag after adding a page to the cache.
The only code other than huge page allocation which sets the flag is restore_reserve_on_error. It will potentially set the flag in rare out of memory conditions. syzbot was injecting errors to cause memory allocation errors which exercised this specific path.
The code in restore_reserve_on_error is doing the right thing. However, there are instances where pages in the page cache were being passed to restore_reserve_on_error. This is incorrect, as once a page goes into the cache reservation information will not be modified for the page until it is removed from the cache. Error paths do not remove pages from the cache, so even in the case of error, the page will remain in the cache and no reservation adjustment is needed.
Modify routines that potentially call restore_reserve_on_error with a page cache page to no longer do so.
Note on fixes tag: Prior to commit 846be08578ed ("mm/hugetlb: expand restore_reserve_on_error functionality") the routine would not process page cache pages because the HPageRestoreReserve flag is not set on such pages. Therefore, this issue could not be trigggered. The code added by commit 846be08578ed ("mm/hugetlb: expand restore_reserve_on_error functionality") is needed and correct. It exposed incorrect calls to restore_reserve_on_error which is the root cause addressed by this commit.
[1] https://lore.kernel.org/linux-mm/[email protected]/
--- mm/hugetlb.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
mm/hugetlb.c +14 -5
@@ -2286,7 +2286,7 @@ void restore_reserve_on_error(struct hstate *h, struct vm_area_struct *vma,if (!rc) {/* * This indicates there is an entry in the reserve map -* added by alloc_huge_page. We know it was added +* not added by alloc_huge_page. We know it was added * before the alloc_huge_page call, otherwise * HPageRestoreReserve would be set on the page. * Remove the entry so that a subsequent allocation
@@ -4465,7 +4465,9 @@ retry_avoidcopy:spin_unlock (ptl);mmu_notifier_invalidate_range_end (&range); out_release_all: -restore_reserve_on_error (h, vma, haddr, new_page); +/* No restore in case of successful pagetable update (Break COW) */ +if (new_page != old_page) +restore_reserve_on_error (h, vma, haddr, new_page);put_page (new_page); out_release_old:put_page (old_page);
@@ -4581,7 +4583,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,pte_t new_pte;spinlock_t *ptl;unsigned long haddr = address &huge_page_mask (h); -bool new_page = false; +bool new_page, new_pagecache_page = false;/* * Currently, we are forced to kill the process in the event the
@@ -4604,6 +4606,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, goto out; retry: + new_page = false; page =find_lock_page (mapping, idx);if (!page) {/* Check for page in userfault range */
@@ -4647,6 +4650,7 @@ retry: goto retry; goto out; } + new_pagecache_page = true; }else {lock_page (page);if (unlikely (anon_vma_prepare (vma))) {
@@ -4731,7 +4735,9 @@ backout:spin_unlock (ptl); backout_unlocked:unlock_page (page); -restore_reserve_on_error (h, vma, haddr, page); +/* restore reserve for newly allocated pages not in page cache */ +if (new_page && !new_pagecache_page) +restore_reserve_on_error (h, vma, haddr, page);put_page (page); goto out; }
@@ -4940,6 +4946,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,int ret;struct page *page;int writable; +bool new_pagecache_page = false; mapping = dst_vma->vm_file->f_mapping; idx =vma_hugecache_offset (h, dst_vma, dst_addr);
@@ -5004,6 +5011,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm, ret =huge_add_to_page_cache (page, mapping, idx);if (ret) goto out_release_nounlock; + new_pagecache_page = true; } ptl =huge_pte_lockptr (h, dst_mm, dst_pte);
@@ -5067,7 +5075,8 @@ out_release_unlock:if (vm_shared || is_continue)unlock_page (page); out_release_nounlock: -restore_reserve_on_error (h, dst_vma, dst_addr, page); +if (!new_pagecache_page) +restore_reserve_on_error (h, dst_vma, dst_addr, page);put_page (page); goto out; }
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 125/127 io_uring: fix xa_alloc_cycle() error return value check
In reply to Sasha LevinFrom: Jens Axboe <[email protected]>
[ Upstream commit a30f895ad3239f45012e860d4f94c1a388b36d14 ]
We currently check for ret != 0 to indicate error, but '1' is a valid return and just indicates that the allocation succeeded with a wrap. Correct the check to be for < 0, like it was before the xarray conversion.
--- fs/io_uring.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
fs/io_uring.c +5 -4
@@ -9835,10 +9835,11 @@ static int io_register_personality(struct io_ring_ctx *ctx) ret =xa_alloc_cyclic (&ctx->personalities, &id, (void *)creds,XA_LIMIT (0 ,USHRT_MAX ), &ctx->pers_next,GFP_KERNEL ); -if (!ret) -return id; -put_cred (creds); -return ret; +if (ret <0 ) { +put_cred (creds); +return ret; + } +return id; } static int io_register_restrictions(struct io_ring_ctx *ctx, void __user *arg,
Signature · 1 line
2.30.2
Sasha Levin
maintainerPATCH 126/127 fs: warn about impending deprecation of mandatory locks
In reply to Sasha LevinFrom: Jeff Layton <[email protected]>
[ Upstream commit fdd92b64d15bc4aec973caa25899afd782402e68 ]
We've had CONFIG_MANDATORY_FILE_LOCKING since 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.
--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/namespace.c +5 -1
@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );return capable (CAP_SYS_ADMIN ); }#else
Signature · 1 line
2.30.2
Re: [PATCH 5.13 126/127] fs: warn about impending deprecation of mandatory locks
Quoted 21 lines · Sasha Levin
From: Jeff Layton <[email protected]>
[ Upstream commit
fdd92b64d15bc4aec973caa25899afd782402e68]We've had
CONFIG_MANDATORY_FILE_LOCKINGsince 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.Signed-off-by Jeff Layton <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)fs/namespace.c +0
-0
fs/namespace.c static inline bool may_mount(void) · line 1724
Quoted 10 lines
fs/namespace.c +5
-1@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );
We are getting this error on all devices while running LTP syscalls ftruncate test cases
on all the stable-rc branches.
- Naresh
Re: [PATCH 5.13 126/127] fs: warn about impending deprecation of mandatory locks
Quoted 24 lines · Naresh Kamboju
Quoted 23 lines · Sasha Levin
From: Jeff Layton <[email protected]>
[ Upstream commit
fdd92b64d15bc4aec973caa25899afd782402e68]We've had
CONFIG_MANDATORY_FILE_LOCKINGsince 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.Signed-off-by Jeff Layton <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)fs/namespace.c +0
-0@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }
Quoted 13 lines
fs/namespace.c static inline bool may_mount(void) · line 1724
Quoted 8 lines
fs/namespace.c +5
-1#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );We are getting this error on all devices while running LTP syscalls ftruncate test cases
on all the stable-rc branches.
You really don't want to run those tests anymore then. The "mand" mount option no longer works, so any tests that require mandatory locking won't function correctly.
Signature · 1 line
Jeff Layton <[email protected]>
Re: [PATCH 5.13 126/127] fs: warn about impending deprecation of mandatory locks
Quoted 40 lines · Jeff Layton
Quoted 24 lines · Naresh Kamboju
Quoted 23 lines · Sasha Levin
From: Jeff Layton <[email protected]>
[ Upstream commit
fdd92b64d15bc4aec973caa25899afd782402e68]We've had
CONFIG_MANDATORY_FILE_LOCKINGsince 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.Signed-off-by Jeff Layton <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)fs/namespace.c +0
-0@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }Quoted 13 lines
fs/namespace.c static inline bool may_mount(void) · line 1724
Quoted 8 lines
fs/namespace.c +5
-1#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );We are getting this error on all devices while running LTP syscalls ftruncate test cases
on all the stable-rc branches.
Quoted 3 lines
You really don't want to run those tests anymore then. The "mand" mount option no longer works, so any tests that require mandatory locking won't function correctly.
I will communicate this warning with the LTP community. Thank you.
- Naresh
Greg Kroah-Hartman
maintainerRe: [PATCH 5.13 126/127] fs: warn about impending deprecation of mandatory locks
In reply to Naresh KambojuQuoted 24 lines · Naresh Kamboju
Quoted 23 lines · Sasha Levin
From: Jeff Layton <[email protected]>
[ Upstream commit
fdd92b64d15bc4aec973caa25899afd782402e68]We've had
CONFIG_MANDATORY_FILE_LOCKINGsince 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.Signed-off-by Jeff Layton <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)fs/namespace.c +0
-0@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }
Quoted 12 lines
fs/namespace.c static inline bool may_mount(void) · line 1724
Quoted 8 lines
fs/namespace.c +5
-1#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );We are getting this error on all devices while running LTP syscalls ftruncate test cases
on all the stable-rc branches.
It's not an "error", it's a warning that the test should be fixed :)
thanks,
greg k-h
Re: [PATCH 5.13 126/127] fs: warn about impending deprecation of mandatory locks
Quoted 39 lines · Greg Kroah-Hartman
Quoted 24 lines · Naresh Kamboju
Quoted 23 lines · Sasha Levin
From: Jeff Layton <[email protected]>
[ Upstream commit
fdd92b64d15bc4aec973caa25899afd782402e68]We've had
CONFIG_MANDATORY_FILE_LOCKINGsince 2015 and a lot of distros have disabled it. Warn the stragglers that still use "-o mand" that we'll be dropping support for that mount option.Signed-off-by Jeff Layton <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/namespace.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)fs/namespace.c +0
-0@@ -1716,8 +1716,12 @@ static inline bool may_mount(void) }Quoted 12 lines
fs/namespace.c static inline bool may_mount(void) · line 1724
Quoted 8 lines
fs/namespace.c +5
-1#ifdef CONFIG_MANDATORY_FILE_LOCKING -static inline bool may_mandlock (void ) +static bool may_mandlock (void ) { +pr_warn_once ("======================================================\n" +"WARNING: the mand mount option is being deprecated and\n" +" will be removed in v5.15!\n" +"======================================================\n" );We are getting this error on all devices while running LTP syscalls ftruncate test cases
on all the stable-rc branches.
Quoted 1 line
It's not an "error", it's a warning that the test should be fixed :)
You are right, it is a warning :)
- Naresh
Sasha Levin
maintainerPATCH 127/127 Linux 5.13.13-rc1
In reply to Sasha Levin--- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Makefile +2 -2
@@ -1,8 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 13 -SUBLEVEL = 12 -EXTRAVERSION = +SUBLEVEL = 13 +EXTRAVERSION = -rc1 NAME = Opossums on Parade # *DOCUMENTATION*
Signature · 1 line
2.30.2
Quoted 9 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.13.y
and the diffstat can be found below.Thanks,
Sasha
All tests passing for Tegra ...
Test results for stable-v5.13:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
110 tests: 110 pass, 0 failLinux version: 5.13.13-rc1-gb85f43f33b05
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Hello!
Quoted 8 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.13.y
and the diffstat can be found below.Thanks,
Sasha
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.13.13-rc1
* git: ['https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git', 'https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc']
* git branch: linux-5.13.y
* git commit: b85f43f33b05cc36ebcb5b64122a56c9fb949a79
* git describe: v5.13.12-127-gb85f43f33b05
* test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.13.y/build/v5.13.12-127-gb85f43f33b05
## No regressions (compared to v5.13.12)
## No fixes (compared to v5.13.12)
## Test result summary
total: 80677, pass: 67984, fail: 1034, skip: 10884, xfail: 775
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 226 total, 226 passed, 0 failed
* arm64: 32 total, 32 passed, 0 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 31 total, 31 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 48 total, 48 passed, 0 failed
* parisc: 9 total, 9 passed, 0 failed
* powerpc: 27 total, 27 passed, 0 failed
* riscv: 24 total, 24 passed, 0 failed
* s390: 21 total, 21 passed, 0 failed
* sh: 18 total, 18 passed, 0 failed
* sparc: 9 total, 9 passed, 0 failed
* x15: 1 total, 0 passed, 1 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 33 total, 33 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* install-android-platform-tools-r2600
* kselftest-android
* kselftest-arm64
* kselftest-bpf
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-lkdtm
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-t[
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* rcutorture
* ssuite
* v4l2-compliance
Greetings!
Daniel Díaz
[email protected]
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Sasha Levin
maintainerQuoted 17 lines · Daniel Díaz
Hello!
Quoted 14 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.13.y
and the diffstat can be found below.
Quoted 7 lines
Quoted 2 lines
Thanks,
SashaResults from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Thanks for testing Daniel!
Signature · 2 lines
Thanks, Sasha
Quoted 9 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
Build results:
total: 154 pass: 154 fail: 0 Qemu test results: total: 479 pass: 479 fail: 0
Guenter
Sasha Levin
maintainerQuoted 11 lines · Guenter Roeck
Quoted 9 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 154 pass: 154 fail: 0 Qemu test results: total: 479 pass: 479 fail: 0Tested-by Guenter Roeck <[email protected]>
Thanks for testing, Guenter!
Signature · 2 lines
Thanks, Sasha
Quoted 9 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
Quoted 9 lines
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.13.y
and the diffstat can be found below.Thanks,
Sasha
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Sasha Levin
maintainerQuoted 16 lines · Shuah Khan
Quoted 15 lines · Sasha Levin
This is the start of the stable review cycle for the 5.13.13 release. There are 127 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu 26 Aug 2021 04:55:18 PM UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git/patch/?id=linux-5.13.y&id2=v5.13.12or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.13.y
and the diffstat can be found below.
Quoted 7 lines
Quoted 3 lines
Thanks,
SashaCompiled and booted on my test system. No dmesg regressions.
Tested-by Shuah Khan <[email protected]>
Thanks for testing, Shuah!
Signature · 2 lines
Thanks, Sasha