6.6.45-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 6.6.45-rc1 review
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.6.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.6.45-rc1
Paolo Abeni <[email protected]>
mptcp: prevent BPF accessing lowat from a subflow socket.
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: join: check backup support in signal endp
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: join: validate backup in MPJ
Liu Jing <[email protected]>
selftests: mptcp: always close input's FD if opened
Paolo Abeni <[email protected]>
mptcp: fix duplicate data handling
Matthieu Baerts (NGI0) <[email protected]>
mptcp: pm: only set request_bkup flag when sending MP_PRIO
Paolo Abeni <[email protected]>
mptcp: fix bad RCVPRUNED mib accounting
Matthieu Baerts (NGI0) <[email protected]>
mptcp: mib: count MPJ with backup flag
Paolo Abeni <[email protected]>
mptcp: fix NL PM announced address accounting
Matthieu Baerts (NGI0) <[email protected]>
mptcp: distinguish rcv vs sent backup flag in requests
Paolo Abeni <[email protected]>
mptcp: fix user-space PM announced address accounting
Heiner Kallweit <[email protected]>
r8169: don't increment tx_dropped in case of NETDEV_TX_BUSY
Ma Ke <[email protected]>
net: usb: sr9700: fix uninitialized variable use in sr_mdio_read
Nikita Zhandarovich <[email protected]>
drm/i915: Fix possible int overflow in skl_ddi_calculate_wrpll()
Dmitry Osipenko <[email protected]>
drm/virtio: Fix type of dma-fence context variable
Zack Rusin <[email protected]>
drm/vmwgfx: Fix a deadlock in dma buf fence polling
Edmund Raile <[email protected]>
Revert "ALSA: firewire-lib: operate for period elapse event in process context"
Edmund Raile <[email protected]>
Revert "ALSA: firewire-lib: obsolete workqueue for period update"
Takashi Iwai <[email protected]>
ALSA: seq: ump: Optimize conversions from SysEx to UMP
Mavroudis Chatzilazaridis <[email protected]>
ALSA: hda/realtek: Add quirk for Acer Aspire E5-574G
Takashi Iwai <[email protected]>
ALSA: usb-audio: Correct surround channels in UAC1 channel map
Matthieu Baerts (NGI0) <[email protected]>
mptcp: sched: check both directions for backup
Al Viro <[email protected]>
protect the fetch of ->fd[fd] in do_dup2() from mispredictions
Naohiro Aota <[email protected]>
btrfs: do not subtract delalloc from avail bytes
Naohiro Aota <[email protected]>
btrfs: zoned: fix zone_unusable accounting on making block group read-write again
Tatsunosuke Tobita <[email protected]>
HID: wacom: Modify pen IDs
Patryk Duda <[email protected]>
platform/chrome: cros_ec_proto: Lock device when updating MKBP version
Alice Ryhl <[email protected]>
rust: SHADOW_CALL_STACK is incompatible with Rust
Will Deacon <[email protected]>
arm64: jump_label: Ensure patched jump_labels are visible to all CPUs
Stuart Menefy <[email protected]>
riscv: Fix linear mapping checks for non-contiguous memory regions
Zhe Qiao <[email protected]>
riscv/mm: Add handling for VM_FAULT_SIGSEGV in mm_fault_error()
Shifrin Dmitry <[email protected]>
perf: riscv: Fix selecting counters in legacy mode
Clément Léger <[email protected]>
riscv: remove unused functions in traps_misaligned.c
Maciej Żenczykowski <[email protected]>
ipv6: fix ndisc_is_useropt() handling for PIO
Faizal Rahim <[email protected]>
igc: Fix double reset adapter triggered from a single taprio cmd
Shahar Shitrit <[email protected]>
net/mlx5e: Add a check for the return value from mlx5_port_set_eth_ptys
Chris Mi <[email protected]>
net/mlx5e: Fix CT entry update leaks of modify header context
Rahul Rameshbabu <[email protected]>
net/mlx5e: Require mlx5 tc classifier action support for IPsec prio capability
Moshe Shemesh <[email protected]>
net/mlx5: Fix missing lock on sync reset reload
Mark Bloch <[email protected]>
net/mlx5: Lag, don't use the hardcoded value of the first port
Shay Drory <[email protected]>
net/mlx5: Fix error handling in irq_pool_request_irq
Shay Drory <[email protected]>
net/mlx5: Always drain health in shutdown callback
Kuniyuki Iwashima <[email protected]>
netfilter: iptables: Fix potential null-ptr-deref in ip6table_nat_table_init().
Kuniyuki Iwashima <[email protected]>
netfilter: iptables: Fix null-ptr-deref in iptable_nat_table_init().
Takashi Iwai <[email protected]>
ALSA: hda: Conditionally use snooping for AMD HDMI
Raju Lakkaraju <[email protected]>
net: phy: micrel: Fix the KSZ9131 MDI-X status issue
Dan Carpenter <[email protected]>
net: mvpp2: Don't re-use loop iterator
Suraj Kandpal <[email protected]>
drm/i915/hdcp: Fix HDCP2_STREAM_STATUS macro
Alexandra Winter <[email protected]>
net/iucv: fix use after free in iucv_sock_close()
Maciej Fijalkowski <[email protected]>
ice: add missing WRITE_ONCE when clearing ice_rx_ring::xdp_prog
Maciej Fijalkowski <[email protected]>
ice: replace synchronize_rcu with synchronize_net
Maciej Fijalkowski <[email protected]>
ice: don't busy wait for Rx queue disable in ice_qp_dis()
Michal Kubiak <[email protected]>
ice: respect netif readiness in AF_XDP ZC related ndo's
Umesh Nerlige Ramappa <[email protected]>
i915/perf: Remove code to update PWR_CLK_STATE for gen12
Kuniyuki Iwashima <[email protected]>
rtnetlink: Don't ignore IFLA_TARGET_NETNSID when ifname is specified in rtnl_dellink().
Andy Chiu <[email protected]>
net: axienet: start napi before enabling Rx/Tx
Subash Abhinov Kasiviswanathan <[email protected]>
tcp: Adjust clamping window for applications specifying SO_RCVBUF
Eric Dumazet <[email protected]>
tcp: annotate data-races around tp->window_clamp
Paolo Abeni <[email protected]>
mptcp: give rcvlowat some love
Luiz Augusto von Dentz <[email protected]>
Bluetooth: hci_sync: Fix suspending with wrong filter policy
Kiran K <[email protected]>
Bluetooth: btintel: Fail setup on error
songxiebing <[email protected]>
ALSA: hda: conexant: Fix headset auto detect fail in the polling mode
Takashi Iwai <[email protected]>
ALSA: hda: conexant: Reduce CONFIG_PM dependencies
Mark Mentovai <[email protected]>
net: phy: realtek: add support for RTL8366S Gigabit PHY
Veerendranath Jakkam <[email protected]>
wifi: cfg80211: fix reporting failed MLO links status with cfg80211_connect_done
Eric Dumazet <[email protected]>
sched: act_ct: take care of padding in struct zones_ht_key
Ian Forbes <[email protected]>
drm/vmwgfx: Trigger a modeset when the screen moves
Ian Forbes <[email protected]>
drm/vmwgfx: Fix overlay when using Screen Targets
Danilo Krummrich <[email protected]>
drm/nouveau: prime: fix refcount underflow
Casey Chen <[email protected]>
perf tool: fix dereferencing NULL al->maps
Basavaraj Natikar <[email protected]>
HID: amd_sfh: Move sensor discovery before HID device initialization
Jinjie Ruan <[email protected]>
ARM: 9406/1: Fix callchain_trace() return value
Jiaxun Yang <[email protected]>
MIPS: dts: loongson: Fix ls2k1000-rtc interrupt
Jiaxun Yang <[email protected]>
MIPS: dts: loongson: Fix liointc IRQ polarity
Jiaxun Yang <[email protected]>
MIPS: Loongson64: DTS: Fix PCIe port nodes for ls7a
Xu Yang <[email protected]>
perf: imx_perf: fix counter start and config sequence
Joy Zou <[email protected]>
dmaengine: fsl-edma: change the memory access from local into remote mode in i.MX 8QM
Joy Zou <[email protected]>
dmaengine: fsl-edma: clean up unused "fsl,imx8qm-adma" compatible string
Joy Zou <[email protected]>
dmaengine: fsl-edma: add i.MX8ULP edma support
Frank Li <[email protected]>
dmaengine: fsl-edma: add address for channel mux register in fsl_edma_chan
Jaegeuk Kim <[email protected]>
f2fs: assign CURSEG_ALL_DATA_ATGC if blkaddr is valid
Zhiguo Niu <[email protected]>
f2fs: fix to avoid use SSR allocate when do defragment
Li Zhijian <[email protected]>
mm/page_alloc: fix pcp->count race between drain_pages_zone() vs __rmqueue_pcplist()
Lucas Stach <[email protected]>
mm: page_alloc: control latency caused by zone PCP draining
Huang Ying <[email protected]>
mm: restrict the pcp batch scale factor to avoid too long latency
Thomas Zimmermann <[email protected]>
fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes
Thomas Zimmermann <[email protected]>
firmware/sysfb: Update screen_info for relocated EFI framebuffers
Thomas Zimmermann <[email protected]>
video: Provide screen_info_get_pci_dev() to find screen_info's PCI device
Thomas Zimmermann <[email protected]>
video: Add helpers for decoding screen_info
Thomas Zimmermann <[email protected]>
fbdev/vesafb: Replace references to global screen_info by local pointer
Sui Jingfeng <[email protected]>
PCI: Add pci_get_base_class() helper
Sean Christopherson <[email protected]>
KVM: nVMX: Check for pending posted interrupts when looking for nested events
Sean Christopherson <[email protected]>
KVM: nVMX: Add a helper to get highest pending from Posted Interrupt vector
Jacob Pan <[email protected]>
KVM: VMX: Move posted interrupt descriptor out of VMX code
Vitaly Kuznetsov <[email protected]>
KVM: VMX: Split off vmx_onhyperv.{ch} from hyperv.{ch}Thomas Weißschuh <[email protected]>
leds: triggers: Flush pending brightness before activating trigger
Hans de Goede <[email protected]>
leds: trigger: Call synchronize_rcu() before calling trig->activate()
Heiner Kallweit <[email protected]>
leds: trigger: Store brightness set by led_trigger_event()
Heiner Kallweit <[email protected]>
leds: trigger: Remove unused function led_trigger_rename_static()
Javier Carrasco <[email protected]>
cpufreq: qcom-nvmem: fix memory leaks in probe error paths
Stephan Gerhold <[email protected]>
cpufreq: qcom-nvmem: Simplify driver data allocation
Zhang Yi <[email protected]>
ext4: check the extent status again before inserting delalloc block
Zhang Yi <[email protected]>
ext4: factor out a common helper to query extent map
Zhang Yi <[email protected]>
ext4: convert to exclusive lock while inserting delalloc extents
Zhang Yi <[email protected]>
ext4: refactor ext4_da_map_blocks()
Thomas Weißschuh <[email protected]>
sysctl: always initialize i_uid/i_gid
Thomas Weißschuh <[email protected]>
sysctl: treewide: drop unused argument ctl_table_root::set_ownership(table)
Alexey Gladkov <[email protected]>
sysctl: allow to change limits for posix messages queues
Alexey Gladkov <[email protected]>
sysctl: allow change system v ipc sysctls inside ipc namespace
Krzysztof Kozlowski <[email protected]>
thermal/drivers/broadcom: Fix race between removal and clock disable
Uwe Kleine-König <[email protected]>
thermal: bcm2835: Convert to platform remove callback returning void
Krishna Kurapati <[email protected]>
arm64: dts: qcom: sdm845: Disable SS instance in Parkmode for USB
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sdm845: switch USB QMP PHY to new style of bindings
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sdm845: switch USB+DP QMP PHY to new style of bindings
Krishna Kurapati <[email protected]>
arm64: dts: qcom: ipq8074: Disable SS instance in Parkmode for USB
Krishna Kurapati <[email protected]>
arm64: dts: qcom: msm8998: Disable SS instance in Parkmode for USB
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: msm8998: switch USB QMP PHY to new style of bindings
Krishna Kurapati <[email protected]>
arm64: dts: qcom: sc7280: Disable SuperSpeed instances in park mode
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sc7280: switch USB+DP QMP PHY to new style of bindings
Krishna Kurapati <[email protected]>
arm64: dts: qcom: sc7180: Disable SuperSpeed instances in park mode
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sc7180: switch USB+DP QMP PHY to new style of bindings
-------------
Diffstat:
Makefile | 4 +- arch/arm/kernel/perf_callchain.c | 3 +- arch/arm64/boot/dts/qcom/ipq8074.dtsi | 2 + arch/arm64/boot/dts/qcom/msm8998.dtsi | 36 ++-- arch/arm64/boot/dts/qcom/sc7180.dtsi | 58 ++---- arch/arm64/boot/dts/qcom/sc7280.dtsi | 60 ++---- arch/arm64/boot/dts/qcom/sdm845.dtsi | 98 ++++------ arch/arm64/include/asm/jump_label.h | 1 + arch/arm64/kernel/jump_label.c | 11 +- arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi | 81 +++++--- arch/riscv/kernel/traps_misaligned.c | 48 +---- arch/riscv/mm/fault.c | 17 +- arch/riscv/mm/init.c | 15 +- arch/x86/include/asm/posted_intr.h | 88 +++++++++ arch/x86/kvm/Makefile | 4 + arch/x86/kvm/vmx/hyperv.c | 139 ------------- arch/x86/kvm/vmx/hyperv.h | 217 ++++++++++----------- arch/x86/kvm/vmx/nested.c | 41 +++- arch/x86/kvm/vmx/posted_intr.h | 101 +--------- arch/x86/kvm/vmx/vmx.c | 2 + arch/x86/kvm/vmx/vmx.h | 2 +- arch/x86/kvm/vmx/vmx_onhyperv.c | 36 ++++ arch/x86/kvm/vmx/vmx_onhyperv.h | 124 ++++++++++++ arch/x86/kvm/vmx/vmx_ops.h | 2 +- drivers/bluetooth/btintel.c | 3 + drivers/cpufreq/qcom-cpufreq-nvmem.c | 50 +++-- drivers/dma/fsl-edma-common.c | 31 +-- drivers/dma/fsl-edma-common.h | 6 +- drivers/dma/fsl-edma-main.c | 25 ++- drivers/firmware/Kconfig | 1 + drivers/firmware/sysfb.c | 2 + drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 6 +- drivers/gpu/drm/i915/display/intel_hdcp_regs.h | 2 +- drivers/gpu/drm/i915/i915_perf.c | 33 ---- drivers/gpu/drm/nouveau/nouveau_prime.c | 3 +- drivers/gpu/drm/virtio/virtgpu_submit.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 17 +- drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 29 ++- drivers/hid/amd-sfh-hid/amd_sfh_client.c | 18 +- drivers/hid/wacom_wac.c | 3 +- drivers/leds/led-triggers.c | 32 +-- drivers/leds/trigger/ledtrig-timer.c | 5 - drivers/net/ethernet/intel/ice/ice_txrx.c | 2 +- drivers/net/ethernet/intel/ice/ice_xsk.c | 19 +- drivers/net/ethernet/intel/igc/igc_main.c | 33 ++-- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 6 +- drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c | 1 + .../mellanox/mlx5/core/en_accel/ipsec_offload.c | 7 +- .../net/ethernet/mellanox/mlx5/core/en_ethtool.c | 7 +- drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c | 5 +- .../net/ethernet/mellanox/mlx5/core/irq_affinity.c | 10 +- drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +- .../ethernet/mellanox/mlx5/core/sf/dev/driver.c | 1 + drivers/net/ethernet/realtek/r8169_main.c | 8 +- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 +- drivers/net/phy/micrel.c | 34 ++-- drivers/net/phy/realtek.c | 7 + drivers/net/usb/sr9700.c | 11 +- drivers/pci/search.c | 31 +++ drivers/perf/fsl_imx9_ddr_perf.c | 6 +- drivers/perf/riscv_pmu_sbi.c | 2 +- drivers/platform/chrome/cros_ec_proto.c | 2 + drivers/thermal/broadcom/bcm2835_thermal.c | 25 +-- drivers/video/Kconfig | 4 + drivers/video/Makefile | 4 + drivers/video/fbdev/vesafb.c | 66 ++++--- drivers/video/screen_info_generic.c | 146 ++++++++++++++ drivers/video/screen_info_pci.c | 136 +++++++++++++ fs/btrfs/block-group.c | 13 +- fs/btrfs/extent-tree.c | 3 +- fs/btrfs/free-space-cache.c | 4 +- fs/btrfs/space-info.c | 5 +- fs/btrfs/space-info.h | 1 + fs/ext4/inode.c | 98 ++++++---- fs/f2fs/segment.c | 4 +- fs/file.c | 1 + fs/proc/proc_sysctl.c | 8 +- include/linux/leds.h | 30 ++- include/linux/pci.h | 5 + include/linux/screen_info.h | 136 +++++++++++++ include/linux/sysctl.h | 1 - include/trace/events/btrfs.h | 8 + include/trace/events/mptcp.h | 2 +- init/Kconfig | 1 + ipc/ipc_sysctl.c | 36 +++- ipc/mq_sysctl.c | 35 ++++ mm/Kconfig | 11 ++ mm/page_alloc.c | 19 +- net/bluetooth/hci_sync.c | 21 ++ net/core/rtnetlink.c | 2 +- net/ipv4/netfilter/iptable_nat.c | 18 +- net/ipv4/syncookies.c | 3 +- net/ipv4/tcp.c | 8 +- net/ipv4/tcp_input.c | 36 ++-- net/ipv4/tcp_output.c | 18 +- net/ipv6/ndisc.c | 34 ++-- net/ipv6/netfilter/ip6table_nat.c | 14 +- net/ipv6/syncookies.c | 2 +- net/iucv/af_iucv.c | 4 +- net/mptcp/mib.c | 2 + net/mptcp/mib.h | 2 + net/mptcp/options.c | 2 +- net/mptcp/pm_netlink.c | 28 ++- net/mptcp/protocol.c | 44 ++--- net/mptcp/protocol.h | 21 ++ net/mptcp/sockopt.c | 46 +++++ net/mptcp/subflow.c | 35 +++- net/sched/act_ct.c | 4 +- net/sysctl_net.c | 1 - net/wireless/sme.c | 1 + sound/core/seq/seq_ump_convert.c | 41 ++-- sound/firewire/amdtp-stream.c | 38 ++-- sound/firewire/amdtp-stream.h | 1 + sound/pci/hda/hda_controller.h | 2 +- sound/pci/hda/hda_intel.c | 10 +- sound/pci/hda/patch_conexant.c | 58 +----- sound/pci/hda/patch_realtek.c | 1 + sound/usb/stream.c | 4 +- tools/perf/util/callchain.c | 2 +- tools/testing/selftests/net/mptcp/mptcp_connect.c | 8 +- tools/testing/selftests/net/mptcp/mptcp_join.sh | 72 +++++-- 123 files changed, 1922 insertions(+), 1121 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/121 arm64: dts: qcom: sc7180: switch USB+DP QMP PHY to new style of bindings
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit ebb840b00b7f9fc15153b37a7d9ec5b47a5308c1 ]
Change the USB QMP PHY to use newer style of QMP PHY bindings (single resource region, no per-PHY subnodes).
Stable-dep-of: 5b8baed4b881 ("arm64: dts: qcom: sc7180: Disable SuperSpeed instances in park mode")
--- arch/arm64/boot/dts/qcom/sc7180.dtsi | 57 ++++++++++------------------ 1 file changed, 19 insertions(+), 38 deletions(-)
arch/arm64/boot/dts/qcom/sc7180.dtsi +19 -38
@@ -15,6 +15,7 @@ #include <dt-bindings/interconnect/qcom,osm-l3.h> #include <dt-bindings/interconnect/qcom,sc7180.h> #include <dt-bindings/interrupt-controller/arm-gic.h> +#include <dt-bindings/phy/phy-qcom-qmp.h> #include <dt-bindings/phy/phy-qcom-qusb2.h> #include <dt-bindings/power/qcom-rpmpd.h> #include <dt-bindings/reset/qcom,sdm845-aoss.h>
@@ -2795,49 +2796,28 @@ usb_1_hsphy: phy@88e3000 { nvmem-cells = <&qusb2p_hstx_trim>; }; - usb_1_qmpphy: phy-wrapper@88e9000 { + usb_1_qmpphy: phy@88e8000 { compatible = "qcom,sc7180-qmp-usb3-dp-phy"; - reg = <0 0x088e9000 0 0x18c>, - <0 0x088e8000 0 0x3c>, - <0 0x088ea000 0 0x18c>; + reg = <0 0x088e8000 0 0x3000>; status = "disabled"; - #address-cells = <2>; - #size-cells = <2>; - ranges; clocks = <&gcc GCC_USB3_PRIM_PHY_AUX_CLK>, - <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, <&gcc GCC_USB3_PRIM_CLKREF_CLK>, - <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>; - clock-names = "aux", "cfg_ahb", "ref", "com_aux"; + <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>, + <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>, + <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>; + clock-names = "aux", + "ref", + "com_aux", + "usb3_pipe", + "cfg_ahb"; resets = <&gcc GCC_USB3_PHY_PRIM_BCR>, <&gcc GCC_USB3_DP_PHY_PRIM_BCR>; reset-names = "phy", "common"; - usb_1_ssphy: usb3-phy@88e9200 { - reg = <0 0x088e9200 0 0x128>, - <0 0x088e9400 0 0x200>, - <0 0x088e9c00 0 0x218>, - <0 0x088e9600 0 0x128>, - <0 0x088e9800 0 0x200>, - <0 0x088e9a00 0 0x18>; - #clock-cells = <0>; - #phy-cells = <0>; - clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>; - clock-names = "pipe0"; - clock-output-names = "usb3_phy_pipe_clk_src"; - }; - - dp_phy: dp-phy@88ea200 { - reg = <0 0x088ea200 0 0x200>, - <0 0x088ea400 0 0x200>, - <0 0x088eaa00 0 0x200>, - <0 0x088ea600 0 0x200>, - <0 0x088ea800 0 0x200>; - #clock-cells = <1>; - #phy-cells = <0>; - }; + #clock-cells = <1>; + #phy-cells = <1>; }; pmu@90b6300 {
@@ -3001,7 +2981,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0x540 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; - phys = <&usb_1_hsphy>, <&usb_1_ssphy>; + phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "super-speed"; };
@@ -3307,8 +3287,9 @@ mdss_dp: displayport-controller@ae90000 { "ctrl_link_iface", "stream_pixel"; assigned-clocks = <&dispcc DISP_CC_MDSS_DP_LINK_CLK_SRC>, <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>; - assigned-clock-parents = <&dp_phy 0>, <&dp_phy 1>; - phys = <&dp_phy>; + assigned-clock-parents = <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>; + phys = <&usb_1_qmpphy QMP_USB43DP_DP_PHY>; phy-names = "dp"; operating-points-v2 = <&dp_opp_table>;
@@ -3365,8 +3346,8 @@ dispcc: clock-controller@af00000 { <&gcc GCC_DISP_GPLL0_CLK_SRC>, <&mdss_dsi0_phy 0>, <&mdss_dsi0_phy 1>, - <&dp_phy 0>, - <&dp_phy 1>; + <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>; clock-names = "bi_tcxo", "gcc_disp_gpll0_clk_src", "dsi0_phy_pll_out_byteclk",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/121 arm64: dts: qcom: sc7180: Disable SuperSpeed instances in park mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit 5b8baed4b88132c12010ce6ca1b56f00d122e376 ]
On SC7180, in host mode, it is observed that stressing out controller results in HC died error:
xhci-hcd.12.auto: xHCI host not responding to stop endpoint command xhci-hcd.12.auto: xHCI host controller not responding, assume dead xhci-hcd.12.auto: HC died; cleaning up
And at this instant only restarting the host mode fixes it. Disable SuperSpeed instances in park mode for SC7180 to mitigate this issue.
--- arch/arm64/boot/dts/qcom/sc7180.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/qcom/sc7180.dtsi +1 -0
@@ -2981,6 +2981,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0x540 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; + snps,parkmode-disable-ss-quirk; phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "super-speed";
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/121 arm64: dts: qcom: sc7280: switch USB+DP QMP PHY to new style of bindings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 36888ed83f998c3335272f9e353eaf6d109e2429 ]
Change the USB QMP PHY to use newer style of QMP PHY bindings (single resource region, no per-PHY subnodes).
Stable-dep-of: 3d930f1750ce ("arm64: dts: qcom: sc7280: Disable SuperSpeed instances in park mode")
--- arch/arm64/boot/dts/qcom/sc7280.dtsi | 59 +++++++++------------------- 1 file changed, 19 insertions(+), 40 deletions(-)
arch/arm64/boot/dts/qcom/sc7280.dtsi +19 -40
@@ -18,6 +18,7 @@ #include <dt-bindings/interconnect/qcom,sc7280.h> #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/mailbox/qcom-ipcc.h> +#include <dt-bindings/phy/phy-qcom-qmp.h> #include <dt-bindings/power/qcom-rpmpd.h> #include <dt-bindings/reset/qcom,sdm845-aoss.h> #include <dt-bindings/reset/qcom,sdm845-pdc.h>
@@ -858,7 +859,7 @@ gcc: clock-controller@100000 { <&rpmhcc RPMH_CXO_CLK_A>, <&sleep_clk>, <0>, <&pcie1_lane>, <0>, <0>, <0>, - <&usb_1_ssphy>; + <&usb_1_qmpphy QMP_USB43DP_USB3_PIPE_CLK>; clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk", "pcie_0_pipe_clk", "pcie_1_pipe_clk", "ufs_phy_rx_symbol_0_clk", "ufs_phy_rx_symbol_1_clk",
@@ -3351,49 +3352,26 @@ usb_2_hsphy: phy@88e4000 { resets = <&gcc GCC_QUSB2PHY_SEC_BCR>; }; - usb_1_qmpphy: phy-wrapper@88e9000 { - compatible = "qcom,sc7280-qmp-usb3-dp-phy", - "qcom,sm8250-qmp-usb3-dp-phy"; - reg = <0 0x088e9000 0 0x200>, - <0 0x088e8000 0 0x40>, - <0 0x088ea000 0 0x200>; + usb_1_qmpphy: phy@88e8000 { + compatible = "qcom,sc7280-qmp-usb3-dp-phy"; + reg = <0 0x088e8000 0 0x3000>; status = "disabled"; - #address-cells = <2>; - #size-cells = <2>; - ranges; clocks = <&gcc GCC_USB3_PRIM_PHY_AUX_CLK>, <&rpmhcc RPMH_CXO_CLK>, - <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>; - clock-names = "aux", "ref_clk_src", "com_aux"; + <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>, + <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>; + clock-names = "aux", + "ref", + "com_aux", + "usb3_pipe"; resets = <&gcc GCC_USB3_DP_PHY_PRIM_BCR>, <&gcc GCC_USB3_PHY_PRIM_BCR>; reset-names = "phy", "common"; - usb_1_ssphy: usb3-phy@88e9200 { - reg = <0 0x088e9200 0 0x200>, - <0 0x088e9400 0 0x200>, - <0 0x088e9c00 0 0x400>, - <0 0x088e9600 0 0x200>, - <0 0x088e9800 0 0x200>, - <0 0x088e9a00 0 0x100>; - #clock-cells = <0>; - #phy-cells = <0>; - clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>; - clock-names = "pipe0"; - clock-output-names = "usb3_phy_pipe_clk_src"; - }; - - dp_phy: dp-phy@88ea200 { - reg = <0 0x088ea200 0 0x200>, - <0 0x088ea400 0 0x200>, - <0 0x088eaa00 0 0x200>, - <0 0x088ea600 0 0x200>, - <0 0x088ea800 0 0x200>; - #phy-cells = <0>; - #clock-cells = <1>; - }; + #clock-cells = <1>; + #phy-cells = <1>; }; usb_2: usb@8cf8800 {
@@ -3702,7 +3680,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0xe0 0x0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; - phys = <&usb_1_hsphy>, <&usb_1_ssphy>; + phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "super-speed"; };
@@ -3807,8 +3785,8 @@ dispcc: clock-controller@af00000 { <&gcc GCC_DISP_GPLL0_CLK_SRC>, <&mdss_dsi_phy 0>, <&mdss_dsi_phy 1>, - <&dp_phy 0>, - <&dp_phy 1>, + <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>, <&mdss_edp_phy 0>, <&mdss_edp_phy 1>; clock-names = "bi_tcxo",
@@ -4144,8 +4122,9 @@ mdss_dp: displayport-controller@ae90000 { "stream_pixel"; assigned-clocks = <&dispcc DISP_CC_MDSS_DP_LINK_CLK_SRC>, <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>; - assigned-clock-parents = <&dp_phy 0>, <&dp_phy 1>; - phys = <&dp_phy>; + assigned-clock-parents = <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>; + phys = <&usb_1_qmpphy QMP_USB43DP_DP_PHY>; phy-names = "dp"; operating-points-v2 = <&dp_opp_table>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/121 arm64: dts: qcom: sc7280: Disable SuperSpeed instances in park mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit 3d930f1750ce30a6c36dbc71f8ff7e20322b94d7 ]
On SC7280, in host mode, it is observed that stressing out controller results in HC died error:
xhci-hcd.12.auto: xHCI host not responding to stop endpoint command xhci-hcd.12.auto: xHCI host controller not responding, assume dead xhci-hcd.12.auto: HC died; cleaning up
And at this instant only restarting the host mode fixes it. Disable SuperSpeed instances in park mode for SC7280 to mitigate this issue.
--- arch/arm64/boot/dts/qcom/sc7280.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/qcom/sc7280.dtsi +1 -0
@@ -3680,6 +3680,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0xe0 0x0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; + snps,parkmode-disable-ss-quirk; phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; maximum-speed = "super-speed";
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/121 arm64: dts: qcom: msm8998: switch USB QMP PHY to new style of bindings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit b7efebfeb2e8ad8187cdabba5f0212ba2e6c1069 ]
Change the USB QMP PHY to use newer style of QMP PHY bindings (single resource region, no per-PHY subnodes).
Stable-dep-of: 0046325ae520 ("arm64: dts: qcom: msm8998: Disable SS instance in Parkmode for USB")
--- arch/arm64/boot/dts/qcom/msm8998.dtsi | 35 +++++++++++---------------- 1 file changed, 14 insertions(+), 21 deletions(-)
arch/arm64/boot/dts/qcom/msm8998.dtsi +14 -21
@@ -2159,7 +2159,7 @@ usb3_dwc3: usb@a800000 { interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; - phys = <&qusb2phy>, <&usb1_ssphy>; + phys = <&qusb2phy>, <&usb3phy>; phy-names = "usb2-phy", "usb3-phy"; snps,has-lpm-erratum; snps,hird-threshold = /bits/ 8 <0x10>;
@@ -2168,33 +2168,26 @@ usb3_dwc3: usb@a800000 { usb3phy: phy@c010000 { compatible = "qcom,msm8998-qmp-usb3-phy"; - reg = <0x0c010000 0x18c>; - status = "disabled"; - #address-cells = <1>; - #size-cells = <1>; - ranges; + reg = <0x0c010000 0x1000>; clocks = <&gcc GCC_USB3_PHY_AUX_CLK>, + <&gcc GCC_USB3_CLKREF_CLK>, <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, - <&gcc GCC_USB3_CLKREF_CLK>; - clock-names = "aux", "cfg_ahb", "ref"; + <&gcc GCC_USB3_PHY_PIPE_CLK>; + clock-names = "aux", + "ref", + "cfg_ahb", + "pipe"; + clock-output-names = "usb3_phy_pipe_clk_src"; + #clock-cells = <0>; + #phy-cells = <0>; resets = <&gcc GCC_USB3_PHY_BCR>, <&gcc GCC_USB3PHY_PHY_BCR>; - reset-names = "phy", "common"; + reset-names = "phy", + "phy_phy"; - usb1_ssphy: phy@c010200 { - reg = <0xc010200 0x128>, - <0xc010400 0x200>, - <0xc010c00 0x20c>, - <0xc010600 0x128>, - <0xc010800 0x200>; - #phy-cells = <0>; - #clock-cells = <0>; - clocks = <&gcc GCC_USB3_PHY_PIPE_CLK>; - clock-names = "pipe0"; - clock-output-names = "usb3_phy_pipe_clk_src"; - }; + status = "disabled"; }; qusb2phy: phy@c012000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 6/121 arm64: dts: qcom: msm8998: Disable SS instance in Parkmode for USB
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit 0046325ae52079b46da13a7f84dd7b2a6f7c38f8 ]
For Gen-1 targets like MSM8998, it is seen that stressing out the controller in host mode results in HC died error:
xhci-hcd.12.auto: xHCI host not responding to stop endpoint command xhci-hcd.12.auto: xHCI host controller not responding, assume dead xhci-hcd.12.auto: HC died; cleaning up
And at this instant only restarting the host mode fixes it. Disable SuperSpeed instance in park mode for MSM8998 to mitigate this issue.
--- arch/arm64/boot/dts/qcom/msm8998.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/qcom/msm8998.dtsi +1 -0
@@ -2159,6 +2159,7 @@ usb3_dwc3: usb@a800000 { interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; + snps,parkmode-disable-ss-quirk; phys = <&qusb2phy>, <&usb3phy>; phy-names = "usb2-phy", "usb3-phy"; snps,has-lpm-erratum;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 7/121 arm64: dts: qcom: ipq8074: Disable SS instance in Parkmode for USB
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit dc6ba95c6c4400a84cca5b419b34ae852a08cfb5 ]
For Gen-1 targets like IPQ8074, it is seen that stressing out the controller in host mode results in HC died error:
xhci-hcd.12.auto: xHCI host not responding to stop endpoint command xhci-hcd.12.auto: xHCI host controller not responding, assume dead xhci-hcd.12.auto: HC died; cleaning up
And at this instant only restarting the host mode fixes it. Disable SuperSpeed instance in park mode for IPQ8074 to mitigate this issue.
--- arch/arm64/boot/dts/qcom/ipq8074.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/ipq8074.dtsi +2 -0
@@ -641,6 +641,7 @@ dwc_0: usb@8a00000 { interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; phys = <&qusb_phy_0>, <&usb0_ssphy>; phy-names = "usb2-phy", "usb3-phy"; + snps,parkmode-disable-ss-quirk; snps,is-utmi-l1-suspend; snps,hird-threshold = /bits/ 8 <0x0>; snps,dis_u2_susphy_quirk;
@@ -683,6 +684,7 @@ dwc_1: usb@8c00000 { interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; phys = <&qusb_phy_1>, <&usb1_ssphy>; phy-names = "usb2-phy", "usb3-phy"; + snps,parkmode-disable-ss-quirk; snps,is-utmi-l1-suspend; snps,hird-threshold = /bits/ 8 <0x0>; snps,dis_u2_susphy_quirk;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 8/121 arm64: dts: qcom: sdm845: switch USB+DP QMP PHY to new style of bindings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit a9ecdec45a3a59057a68cf61ba4569d34caea5fc ]
Change the USB QMP PHY to use newer style of QMP PHY bindings (single resource region, no per-PHY subnodes).
Stable-dep-of: cf4d6d54eadb ("arm64: dts: qcom: sdm845: Disable SS instance in Parkmode for USB")
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 57 ++++++++++------------------ 1 file changed, 19 insertions(+), 38 deletions(-)
arch/arm64/boot/dts/qcom/sdm845.dtsi +19 -38
@@ -18,6 +18,7 @@ #include <dt-bindings/interconnect/qcom,osm-l3.h> #include <dt-bindings/interconnect/qcom,sdm845.h> #include <dt-bindings/interrupt-controller/arm-gic.h> +#include <dt-bindings/phy/phy-qcom-qmp.h> #include <dt-bindings/phy/phy-qcom-qusb2.h> #include <dt-bindings/power/qcom-rpmpd.h> #include <dt-bindings/reset/qcom,sdm845-aoss.h>
@@ -3983,49 +3984,28 @@ usb_2_hsphy: phy@88e3000 { nvmem-cells = <&qusb2s_hstx_trim>; }; - usb_1_qmpphy: phy@88e9000 { + usb_1_qmpphy: phy@88e8000 { compatible = "qcom,sdm845-qmp-usb3-dp-phy"; - reg = <0 0x088e9000 0 0x18c>, - <0 0x088e8000 0 0x38>, - <0 0x088ea000 0 0x40>; + reg = <0 0x088e8000 0 0x3000>; status = "disabled"; - #address-cells = <2>; - #size-cells = <2>; - ranges; clocks = <&gcc GCC_USB3_PRIM_PHY_AUX_CLK>, - <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, <&gcc GCC_USB3_PRIM_CLKREF_CLK>, - <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>; - clock-names = "aux", "cfg_ahb", "ref", "com_aux"; + <&gcc GCC_USB3_PRIM_PHY_COM_AUX_CLK>, + <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>, + <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>; + clock-names = "aux", + "ref", + "com_aux", + "usb3_pipe", + "cfg_ahb"; resets = <&gcc GCC_USB3_PHY_PRIM_BCR>, <&gcc GCC_USB3_DP_PHY_PRIM_BCR>; reset-names = "phy", "common"; - usb_1_ssphy: usb3-phy@88e9200 { - reg = <0 0x088e9200 0 0x128>, - <0 0x088e9400 0 0x200>, - <0 0x088e9c00 0 0x218>, - <0 0x088e9600 0 0x128>, - <0 0x088e9800 0 0x200>, - <0 0x088e9a00 0 0x100>; - #clock-cells = <0>; - #phy-cells = <0>; - clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>; - clock-names = "pipe0"; - clock-output-names = "usb3_phy_pipe_clk_src"; - }; - - dp_phy: dp-phy@88ea200 { - reg = <0 0x088ea200 0 0x200>, - <0 0x088ea400 0 0x200>, - <0 0x088eaa00 0 0x200>, - <0 0x088ea600 0 0x200>, - <0 0x088ea800 0 0x200>; - #clock-cells = <1>; - #phy-cells = <0>; - }; + #clock-cells = <1>; + #phy-cells = <1>; }; usb_2_qmpphy: phy@88eb000 {
@@ -4105,7 +4085,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0x740 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; - phys = <&usb_1_hsphy>, <&usb_1_ssphy>; + phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; }; };
@@ -4573,8 +4553,9 @@ mdss_dp: displayport-controller@ae90000 { "ctrl_link_iface", "stream_pixel"; assigned-clocks = <&dispcc DISP_CC_MDSS_DP_LINK_CLK_SRC>, <&dispcc DISP_CC_MDSS_DP_PIXEL_CLK_SRC>; - assigned-clock-parents = <&dp_phy 0>, <&dp_phy 1>; - phys = <&dp_phy>; + assigned-clock-parents = <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>; + phys = <&usb_1_qmpphy QMP_USB43DP_DP_PHY>; phy-names = "dp"; operating-points-v2 = <&dp_opp_table>;
@@ -4912,8 +4893,8 @@ dispcc: clock-controller@af00000 { <&mdss_dsi0_phy 1>, <&mdss_dsi1_phy 0>, <&mdss_dsi1_phy 1>, - <&dp_phy 0>, - <&dp_phy 1>; + <&usb_1_qmpphy QMP_USB43DP_DP_LINK_CLK>, + <&usb_1_qmpphy QMP_USB43DP_DP_VCO_DIV_CLK>; clock-names = "bi_tcxo", "gcc_disp_gpll0_clk_src", "gcc_disp_gpll0_div_clk_src",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 9/121 arm64: dts: qcom: sdm845: switch USB QMP PHY to new style of bindings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit ca5ca568d7388b38039c8d658735fc539352b1db ]
Change the USB QMP PHY to use newer style of QMP PHY bindings (single resource region, no per-PHY subnodes).
Stable-dep-of: cf4d6d54eadb ("arm64: dts: qcom: sdm845: Disable SS instance in Parkmode for USB")
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 39 ++++++++++++---------------- 1 file changed, 17 insertions(+), 22 deletions(-)
arch/arm64/boot/dts/qcom/sdm845.dtsi +17 -22
@@ -4010,33 +4010,28 @@ usb_1_qmpphy: phy@88e8000 { usb_2_qmpphy: phy@88eb000 { compatible = "qcom,sdm845-qmp-usb3-uni-phy"; - reg = <0 0x088eb000 0 0x18c>; - status = "disabled"; - #address-cells = <2>; - #size-cells = <2>; - ranges; + reg = <0 0x088eb000 0 0x1000>; clocks = <&gcc GCC_USB3_SEC_PHY_AUX_CLK>, <&gcc GCC_USB_PHY_CFG_AHB2PHY_CLK>, <&gcc GCC_USB3_SEC_CLKREF_CLK>, - <&gcc GCC_USB3_SEC_PHY_COM_AUX_CLK>; - clock-names = "aux", "cfg_ahb", "ref", "com_aux"; + <&gcc GCC_USB3_SEC_PHY_COM_AUX_CLK>, + <&gcc GCC_USB3_SEC_PHY_PIPE_CLK>; + clock-names = "aux", + "cfg_ahb", + "ref", + "com_aux", + "pipe"; + clock-output-names = "usb3_uni_phy_pipe_clk_src"; + #clock-cells = <0>; + #phy-cells = <0>; - resets = <&gcc GCC_USB3PHY_PHY_SEC_BCR>, - <&gcc GCC_USB3_PHY_SEC_BCR>; - reset-names = "phy", "common"; + resets = <&gcc GCC_USB3_PHY_SEC_BCR>, + <&gcc GCC_USB3PHY_PHY_SEC_BCR>; + reset-names = "phy", + "phy_phy"; - usb_2_ssphy: phy@88eb200 { - reg = <0 0x088eb200 0 0x128>, - <0 0x088eb400 0 0x1fc>, - <0 0x088eb800 0 0x218>, - <0 0x088eb600 0 0x70>; - #clock-cells = <0>; - #phy-cells = <0>; - clocks = <&gcc GCC_USB3_SEC_PHY_PIPE_CLK>; - clock-names = "pipe0"; - clock-output-names = "usb3_uni_phy_pipe_clk_src"; - }; + status = "disabled"; }; usb_1: usb@a6f8800 {
@@ -4136,7 +4131,7 @@ usb_2_dwc3: usb@a800000 { iommus = <&apps_smmu 0x760 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; - phys = <&usb_2_hsphy>, <&usb_2_ssphy>; + phys = <&usb_2_hsphy>, <&usb_2_qmpphy>; phy-names = "usb2-phy", "usb3-phy"; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 10/121 arm64: dts: qcom: sdm845: Disable SS instance in Parkmode for USB
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Kurapati <[email protected]>
[ Upstream commit cf4d6d54eadb60d2ee4d31c9d92299f5e8dcb55c ]
For Gen-1 targets like SDM845, it is seen that stressing out the controller in host mode results in HC died error:
xhci-hcd.12.auto: xHCI host not responding to stop endpoint command xhci-hcd.12.auto: xHCI host controller not responding, assume dead xhci-hcd.12.auto: HC died; cleaning up
And at this instant only restarting the host mode fixes it. Disable SuperSpeed instance in park mode for SDM845 to mitigate this issue.
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/sdm845.dtsi +2 -0
@@ -4080,6 +4080,7 @@ usb_1_dwc3: usb@a600000 { iommus = <&apps_smmu 0x740 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; + snps,parkmode-disable-ss-quirk; phys = <&usb_1_hsphy>, <&usb_1_qmpphy QMP_USB43DP_USB3_PHY>; phy-names = "usb2-phy", "usb3-phy"; };
@@ -4131,6 +4132,7 @@ usb_2_dwc3: usb@a800000 { iommus = <&apps_smmu 0x760 0>; snps,dis_u2_susphy_quirk; snps,dis_enblslpm_quirk; + snps,parkmode-disable-ss-quirk; phys = <&usb_2_hsphy>, <&usb_2_qmpphy>; phy-names = "usb2-phy", "usb3-phy"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 11/121 thermal: bcm2835: Convert to platform remove callback returning void
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit f29ecd3748a28d0b52512afc81b3c13fd4a00c9b ]
The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks.
To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new(), which already returns void. Eventually after all drivers are converted, .remove_new() will be renamed to .remove().
Trivially convert this driver from always returning zero in the remove callback to the void returning variant.
Stable-dep-of: e90c369cc2ff ("thermal/drivers/broadcom: Fix race between removal and clock disable")
--- drivers/thermal/broadcom/bcm2835_thermal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/thermal/broadcom/bcm2835_thermal.c +2 -4
@@ -282,19 +282,17 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } -static int bcm2835_thermal_remove (struct platform_device *pdev) +static void bcm2835_thermal_remove (struct platform_device *pdev) {struct bcm2835_thermal_data *data =platform_get_drvdata (pdev);debugfs_remove_recursive (data->debugfsdir);clk_disable_unprepare (data->clk); - -return 0 ; }static struct platform_driver bcm2835_thermal_driver = { .probe = bcm2835_thermal_probe, - .remove = bcm2835_thermal_remove, + .remove_new = bcm2835_thermal_remove, .driver = { .name ="bcm2835_thermal" , .of_match_table = bcm2835_thermal_of_match_table,
Signature · 1 line
2.43.0
Re: [PATCH 6.6 011/121] thermal: bcm2835: Convert to platform remove callback returning void
Hello Greg,
Quoted 46 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit
f29ecd3748a28d0b52512afc81b3c13fd4a00c9b]The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks.
To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new(), which already returns void. Eventually after all drivers are converted, .remove_new() will be renamed to .remove().
Trivially convert this driver from always returning zero in the remove callback to the void returning variant.
Signed-off-by Uwe Kleine-König <[email protected]>Acked-by Daniel Lezcano <[email protected]>Signed-off-by Rafael J. Wysocki <[email protected]>Stable-dep-of:
e90c369cc2ff("thermal/drivers/broadcom: Fix race between removal and clock disable")Signed-off-by Sasha Levin <[email protected]>--- drivers/thermal/broadcom/bcm2835_thermal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)drivers/thermal/broadcom/bcm2835_thermal.c +1
-2@@ -282,19 +282,17 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } -static int bcm2835_thermal_remove (struct platform_device *pdev) +static void bcm2835_thermal_remove (struct platform_device *pdev) {struct bcm2835_thermal_data *data =platform_get_drvdata (pdev);debugfs_remove_recursive (data->debugfsdir);clk_disable_unprepare (data->clk); -
drivers/thermal/broadcom/bcm2835_thermal.c static int bcm2835_thermal_probe(struct platform_device *pdev) · line 298
Quoted 10 lines
drivers/thermal/broadcom/bcm2835_thermal.c +1
-2-return 0 ; }static struct platform_driver bcm2835_thermal_driver = { .probe = bcm2835_thermal_probe, - .remove = bcm2835_thermal_remove, + .remove_new = bcm2835_thermal_remove, .driver = { .name ="bcm2835_thermal" , .of_match_table = bcm2835_thermal_of_match_table,
While I'm confident this patch not to break anything (there are so many of this type in mainline now and none regressed), it should be also easy to port the follow up patches onto 6.6.x without this change.
No strong opinion and maybe being able to cleanly cherry pick later changes is important enough to keep this conversion? Otherwise I'd tend to drop this patch.
Best regards
Uwe
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 011/121] thermal: bcm2835: Convert to platform remove callback returning void
Quoted 64 lines · Uwe Kleine-König
Hello Greg,
Quoted 46 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit
f29ecd3748a28d0b52512afc81b3c13fd4a00c9b]The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks.
To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new(), which already returns void. Eventually after all drivers are converted, .remove_new() will be renamed to .remove().
Trivially convert this driver from always returning zero in the remove callback to the void returning variant.
Signed-off-by Uwe Kleine-König <[email protected]>Acked-by Daniel Lezcano <[email protected]>Signed-off-by Rafael J. Wysocki <[email protected]>Stable-dep-of:
e90c369cc2ff("thermal/drivers/broadcom: Fix race between removal and clock disable")Signed-off-by Sasha Levin <[email protected]>--- drivers/thermal/broadcom/bcm2835_thermal.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)drivers/thermal/broadcom/bcm2835_thermal.c +1
-2@@ -282,19 +282,17 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } -static int bcm2835_thermal_remove (struct platform_device *pdev) +static void bcm2835_thermal_remove (struct platform_device *pdev) {struct bcm2835_thermal_data *data =platform_get_drvdata (pdev);debugfs_remove_recursive (data->debugfsdir);clk_disable_unprepare (data->clk); -drivers/thermal/broadcom/bcm2835_thermal.c static int bcm2835_thermal_probe(struct platform_device *pdev) · line 298
Quoted 10 lines
drivers/thermal/broadcom/bcm2835_thermal.c +1
-2-return 0 ; }static struct platform_driver bcm2835_thermal_driver = { .probe = bcm2835_thermal_probe, - .remove = bcm2835_thermal_remove, + .remove_new = bcm2835_thermal_remove, .driver = { .name ="bcm2835_thermal" , .of_match_table = bcm2835_thermal_of_match_table,While I'm confident this patch not to break anything (there are so many of this type in mainline now and none regressed), it should be also easy to port the follow up patches onto 6.6.x without this change.
Quoted 3 lines
No strong opinion and maybe being able to cleanly cherry pick later changes is important enough to keep this conversion? Otherwise I'd tend to drop this patch.
Thanks for the review, I'll leave it in as it made it simpler for the next commit.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 12/121 thermal/drivers/broadcom: Fix race between removal and clock disable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit e90c369cc2ffcf7145a46448de101f715a1f5584 ]
During the probe, driver enables clocks necessary to access registers (in get_temp()) and then registers thermal zone with managed-resources (devm) interface. Removal of device is not done in reversed order, because:
1. Clock will be disabled in driver remove() callback - thermal zone is still registered and accessible to users,
2. devm interface will unregister thermal zone.
This leaves short window between (1) and (2) for accessing the get_temp() callback with disabled clock.
Fix this by enabling clock also via devm-interface, so entire cleanup path will be in proper, reversed order.
--- drivers/thermal/broadcom/bcm2835_thermal.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-)
drivers/thermal/broadcom/bcm2835_thermal.c +4 -15
@@ -185,7 +185,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } - data->clk =devm_clk_get (&pdev->dev,NULL ); + data->clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (data->clk)) { err =PTR_ERR (data->clk);if (err != -EPROBE_DEFER )
@@ -193,10 +193,6 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)return err; } - err =clk_prepare_enable (data->clk); -if (err) -return err; - rate =clk_get_rate (data->clk);if ((rate <1920000 ) || (rate >5000000 )) dev_warn(&pdev->dev,
@@ -211,7 +207,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)dev_err (&pdev->dev,"Failed to register the thermal device: %d\n" , err); - goto err_clk; +return err; }/*
@@ -236,7 +232,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)dev_err (&pdev->dev,"Not able to read trip_temp: %d\n" , err); - goto err_tz; +return err; }/* set bandgap reference voltage and enable voltage regulator */
@@ -269,17 +265,11 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)*/ err =thermal_add_hwmon_sysfs (tz);if (err) - goto err_tz; +return err;bcm2835_thermal_debugfs (pdev);return 0 ; -err_tz: -devm_thermal_of_zone_unregister (&pdev->dev, tz); -err_clk: -clk_disable_unprepare (data->clk); - -return err; }static void bcm2835_thermal_remove (struct platform_device *pdev)
@@ -287,7 +277,6 @@ static void bcm2835_thermal_remove(struct platform_device *pdev)struct bcm2835_thermal_data *data =platform_get_drvdata (pdev);debugfs_remove_recursive (data->debugfsdir); -clk_disable_unprepare (data->clk); }static struct platform_driver bcm2835_thermal_driver = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 13/121 sysctl: allow change system v ipc sysctls inside ipc namespace
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Gladkov <[email protected]>
[ Upstream commit 50ec499b9a43e46200c9f7b7d723ab2e4af540b3 ]
Patch series "Allow to change ipc/mq sysctls inside ipc namespace", v3.
Right now ipc and mq limits count as per ipc namespace, but only real root can change them. By default, the current values of these limits are such that it can only be reduced. Since only root can change the values, it is impossible to reduce these limits in the rootless container.
We can allow limit changes within ipc namespace because mq parameters are limited by RLIMIT_MSGQUEUE and ipc parameters are not limited to anything other than cgroups.
This patch (of 3):
Rootless containers are not allowed to modify kernel IPC parameters.
All default limits are set to such high values that in fact there are no limits at all. All limits are not inherited and are initialized to default values when a new ipc_namespace is created.
For new ipc_namespace:
size_t ipc_ns.shm_ctlmax = SHMMAX; // (ULONG_MAX - (1UL << 24)) size_t ipc_ns.shm_ctlall = SHMALL; // (ULONG_MAX - (1UL << 24)) int ipc_ns.shm_ctlmni = IPCMNI; // (1 << 15) int ipc_ns.shm_rmid_forced = 0;
unsigned int ipc_ns.msg_ctlmax = MSGMAX; // 8192
unsigned int ipc_ns.msg_ctlmni = MSGMNI; // 32000
unsigned int ipc_ns.msg_ctlmnb = MSGMNB; // 16384
The shm_tot (total amount of shared pages) has also ceased to be global, it is located in ipc_namespace and is not inherited from anywhere.
In such conditions, it cannot be said that these limits limit anything. The real limiter for them is cgroups.
If we allow rootless containers to change these parameters, then it can only be reduced.
Stable-dep-of: 98ca62ba9e2b ("sysctl: always initialize i_uid/i_gid")
--- ipc/ipc_sysctl.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-)
ipc/ipc_sysctl.c +35 -2
@@ -14,6 +14,7 @@#include <linux/ipc_namespace.h> #include <linux/msg.h> #include <linux/slab.h> +#include <linux/cred.h> #include "util.h" static int proc_ipc_dointvec_minmax_orphans(struct ctl_table *table, int write,
@@ -190,25 +191,57 @@ static int set_is_seen(struct ctl_table_set *set)return ¤t->nsproxy->ipc_ns->ipc_set == set; } +static void ipc_set_ownership (struct ctl_table_header *head, +struct ctl_table *table, +kuid_t *uid,kgid_t *gid) +{ +struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, ipc_set); + +kuid_t ns_root_uid =make_kuid (ns->user_ns,0 ); +kgid_t ns_root_gid =make_kgid (ns->user_ns,0 ); + + *uid =uid_valid (ns_root_uid) ? ns_root_uid :GLOBAL_ROOT_UID ; + *gid =gid_valid (ns_root_gid) ? ns_root_gid :GLOBAL_ROOT_GID ; +} +static int ipc_permissions (struct ctl_table_header *head,struct ctl_table *table) {int mode = table->mode;#ifdef CONFIG_CHECKPOINT_RESTORE -struct ipc_namespace *ns = current->nsproxy->ipc_ns; +struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, ipc_set);if (((table->data == &ns->ids[IPC_SEM_IDS ].next_id) || (table->data == &ns->ids[IPC_MSG_IDS ].next_id) || (table->data == &ns->ids[IPC_SHM_IDS ].next_id)) &&checkpoint_restore_ns_capable (ns->user_ns)) mode =0666 ; + else#endif -return mode; + { +kuid_t ns_root_uid; +kgid_t ns_root_gid; + +ipc_set_ownership (head, table, &ns_root_uid, &ns_root_gid); + +if (uid_eq (current_euid (), ns_root_uid)) + mode >>=6 ; + +else if (in_egroup_p (ns_root_gid)) + mode >>=3 ; + } + + mode &=7 ; + +return (mode <<6 ) | (mode <<3 ) | mode; }static struct ctl_table_root set_root = { .lookup = set_lookup, .permissions = ipc_permissions, + .set_ownership = ipc_set_ownership, };bool setup_ipc_sysctls (struct ipc_namespace *ns)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 14/121 sysctl: allow to change limits for posix messages queues
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Gladkov <[email protected]>
[ Upstream commit f9436a5d0497f759330d07e1189565edd4456be8 ]
All parameters of posix messages queues (queues_max/msg_max/msgsize_max) end up being limited by RLIMIT_MSGQUEUE. The code in mqueue_get_inode is where that limiting happens.
The RLIMIT_MSGQUEUE is bound to the user namespace and is counted hierarchically.
We can allow root in the user namespace to modify the posix messages queues parameters.
Stable-dep-of: 98ca62ba9e2b ("sysctl: always initialize i_uid/i_gid")
--- ipc/mq_sysctl.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
ipc/mq_sysctl.c +36 -0
@@ -12,6 +12,7 @@#include <linux/stat.h> #include <linux/capability.h> #include <linux/slab.h> +#include <linux/cred.h> static int msg_max_limit_min =MIN_MSGMAX ;static int msg_max_limit_max =HARD_MSGMAX ;
@@ -76,8 +77,43 @@ static int set_is_seen(struct ctl_table_set *set)return ¤t->nsproxy->ipc_ns->mq_set == set; } +static void mq_set_ownership (struct ctl_table_header *head, +struct ctl_table *table, +kuid_t *uid,kgid_t *gid) +{ +struct ipc_namespace *ns = + container_of(head->set, struct ipc_namespace, mq_set); + +kuid_t ns_root_uid =make_kuid (ns->user_ns,0 ); +kgid_t ns_root_gid =make_kgid (ns->user_ns,0 ); + + *uid =uid_valid (ns_root_uid) ? ns_root_uid :GLOBAL_ROOT_UID ; + *gid =gid_valid (ns_root_gid) ? ns_root_gid :GLOBAL_ROOT_GID ; +} + +static int mq_permissions (struct ctl_table_header *head,struct ctl_table *table) +{ +int mode = table->mode; +kuid_t ns_root_uid; +kgid_t ns_root_gid; + +mq_set_ownership (head, table, &ns_root_uid, &ns_root_gid); + +if (uid_eq (current_euid (), ns_root_uid)) + mode >>=6 ; + +else if (in_egroup_p (ns_root_gid)) + mode >>=3 ; + + mode &=7 ; + +return (mode <<6 ) | (mode <<3 ) | mode; +} +static struct ctl_table_root set_root = { .lookup = set_lookup, + .permissions = mq_permissions, + .set_ownership = mq_set_ownership, };bool setup_mq_sysctls (struct ipc_namespace *ns)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 15/121 sysctl: treewide: drop unused argument ctl_table_root::set_ownership(table)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 520713a93d550406dae14d49cdb8778d70cecdfd ]
Remove the 'table' argument from set_ownership as it is never used. This change is a step towards putting "struct ctl_table" into .rodata and eventually having sysctl core only use "const struct ctl_table".
The patch was created with the following coccinelle script:
@@
identifier func, head, table, uid, gid;
@@
void func(
struct ctl_table_header *head,
- struct ctl_table *table,
kuid_t *uid, kgid_t *gid)
{ ... }
No additional occurrences of 'set_ownership' were found after doing a tree-wide search.
Stable-dep-of: 98ca62ba9e2b ("sysctl: always initialize i_uid/i_gid")
--- fs/proc/proc_sysctl.c | 2 +- include/linux/sysctl.h | 1 - ipc/ipc_sysctl.c | 3 +-- ipc/mq_sysctl.c | 3 +-- net/sysctl_net.c | 1 - 5 files changed, 3 insertions(+), 7 deletions(-)
fs/proc/proc_sysctl.c +1 -1
@@ -481,7 +481,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, }if (root->set_ownership) - root->set_ownership (head, table, &inode->i_uid, &inode->i_gid); + root->set_ownership (head, &inode->i_uid, &inode->i_gid);else { inode->i_uid =GLOBAL_ROOT_UID ; inode->i_gid =GLOBAL_ROOT_GID ;
include/linux/sysctl.h +0 -1
@@ -205,7 +205,6 @@ struct ctl_table_root {struct ctl_table_set default_set;struct ctl_table_set *(*lookup)(struct ctl_table_root *root);void (*set_ownership)(struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid);int (*permissions)(struct ctl_table_header *head,struct ctl_table *table); };
ipc/ipc_sysctl.c +1 -2
@@ -192,7 +192,6 @@ static int set_is_seen(struct ctl_table_set *set) }static void ipc_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct ipc_namespace *ns =
@@ -224,7 +223,7 @@ static int ipc_permissions(struct ctl_table_header *head, struct ctl_table *tablkuid_t ns_root_uid;kgid_t ns_root_gid; -ipc_set_ownership (head, table, &ns_root_uid, &ns_root_gid); +ipc_set_ownership (head, &ns_root_uid, &ns_root_gid);if (uid_eq (current_euid (), ns_root_uid)) mode >>=6 ;
ipc/mq_sysctl.c +1 -2
@@ -78,7 +78,6 @@ static int set_is_seen(struct ctl_table_set *set) }static void mq_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct ipc_namespace *ns =
@@ -97,7 +96,7 @@ static int mq_permissions(struct ctl_table_header *head, struct ctl_table *tablekuid_t ns_root_uid;kgid_t ns_root_gid; -mq_set_ownership (head, table, &ns_root_uid, &ns_root_gid); +mq_set_ownership (head, &ns_root_uid, &ns_root_gid);if (uid_eq (current_euid (), ns_root_uid)) mode >>=6 ;
net/sysctl_net.c +0 -1
@@ -54,7 +54,6 @@ static int net_ctl_permissions(struct ctl_table_header *head, }static void net_ctl_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct net *net = container_of(head->set, struct net, sysctls);
Signature · 1 line
2.43.0
Re: [PATCH 6.6 015/121] sysctl: treewide: drop unused argument ctl_table_root::set_ownership(table)
Hi Greg,
Quoted 1 line · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I don't think this has any value being backported to any version.
Quoted 123 lines
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit
520713a93d550406dae14d49cdb8778d70cecdfd]Remove the 'table' argument from
set_ownershipas it is never used. This change is a step towards putting "structctl_table" into .rodata and eventually having sysctl core only use "const structctl_table".The patch was created with the following coccinelle script:
@@
identifier func, head, table, uid, gid;
@@void func(
structctl_table_header*head,
- structctl_table*table,
kuid_t*uid,kgid_t*gid)
{ ... }No additional occurrences of '
set_ownership' were found after doing a tree-wide search.Reviewed-by Joel Granados <[email protected]>Signed-off-by Thomas Weißschuh <[email protected]>Signed-off-by Joel Granados <[email protected]>Stable-dep-of:
98ca62ba9e2b("sysctl: always initialize i_uid/i_gid")Signed-off-by Sasha Levin <[email protected]>--- fs/proc/proc_sysctl.c | 2 +- include/linux/sysctl.h | 1 - ipc/ipc_sysctl.c | 3 +-- ipc/mq_sysctl.c | 3 +-- net/sysctl_net.c | 1 - 5 files changed, 3 insertions(+), 7 deletions(-)fs/proc/proc_sysctl.c +1
-1@@ -481,7 +481,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, }if (root->set_ownership) - root->set_ownership (head, table, &inode->i_uid, &inode->i_gid); + root->set_ownership (head, &inode->i_uid, &inode->i_gid);else { inode->i_uid =GLOBAL_ROOT_UID ; inode->i_gid =GLOBAL_ROOT_GID ;include/linux/sysctl.h +0
-1@@ -205,7 +205,6 @@ struct ctl_table_root {struct ctl_table_set default_set;struct ctl_table_set *(*lookup)(struct ctl_table_root *root);void (*set_ownership)(struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid);int (*permissions)(struct ctl_table_header *head,struct ctl_table *table); };ipc/ipc_sysctl.c +1
-2@@ -192,7 +192,6 @@ static int set_is_seen(struct ctl_table_set *set) }static void ipc_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct ipc_namespace *ns =@@ -224,7 +223,7 @@ static int ipc_permissions(struct ctl_table_header *head, struct ctl_table *tablkuid_t ns_root_uid;kgid_t ns_root_gid; -ipc_set_ownership (head, table, &ns_root_uid, &ns_root_gid); +ipc_set_ownership (head, &ns_root_uid, &ns_root_gid);if (uid_eq (current_euid (), ns_root_uid)) mode >>=6 ;ipc/mq_sysctl.c +1
-2@@ -78,7 +78,6 @@ static int set_is_seen(struct ctl_table_set *set) }static void mq_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct ipc_namespace *ns =@@ -97,7 +96,7 @@ static int mq_permissions(struct ctl_table_header *head, struct ctl_table *tablekuid_t ns_root_uid;kgid_t ns_root_gid; -mq_set_ownership (head, table, &ns_root_uid, &ns_root_gid); +mq_set_ownership (head, &ns_root_uid, &ns_root_gid);if (uid_eq (current_euid (), ns_root_uid)) mode >>=6 ;net/sysctl_net.c +0
-1@@ -54,7 +54,6 @@ static int net_ctl_permissions(struct ctl_table_header *head, }static void net_ctl_set_ownership (struct ctl_table_header *head, -struct ctl_table *table,kuid_t *uid,kgid_t *gid) { struct net *net = container_of(head->set, struct net, sysctls);Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 015/121] sysctl: treewide: drop unused argument ctl_table_root::set_ownership(table)
Quoted 6 lines · Thomas Weißschuh
Hi Greg,
Quoted 1 line · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I don't think this has any value being backported to any version.
Did you miss this line:
Quoted 1 line
Quoted 1 line
Stable-dep-of:
98ca62ba9e2b("sysctl: always initialize i_uid/i_gid")
thanks,
greg k-h
Re: [PATCH 6.6 015/121] sysctl: treewide: drop unused argument ctl_table_root::set_ownership(table)
Hi Greg,
Aug 11, 2024 12:45:38 Greg Kroah-Hartman <[email protected]>:
Quoted 11 lines · Thomas Weißschuh
Quoted 6 lines
Hi Greg,
Quoted 1 line · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
I don't think this has any value being backported to any version.
Did you miss this line:
Quoted 1 line
Quoted 1 line
Stable-dep-of:
98ca62ba9e2b("sysctl: always initialize i_uid/i_gid")
I did. Thanks and sorry for the noise.
FWIW it should be trivial to break the dependency, but it's probably not worth to complicate it.
Thomas
Greg Kroah-Hartman
maintainerPATCH 16/121 sysctl: always initialize i_uid/i_gid
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 98ca62ba9e2be5863c7d069f84f7166b45a5b2f4 ]
Always initialize i_uid/i_gid inside the sysfs core so set_ownership() can safely skip setting them.
Commit 5ec27ec735ba ("fs/proc/proc_sysctl.c: fix the default values of i_uid/i_gid on /proc/sys inodes.") added defaults for i_uid/i_gid when set_ownership() was not implemented. It also missed adjusting net_ctl_set_ownership() to use the same default values in case the computation of a better value failed.
--- fs/proc/proc_sysctl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
fs/proc/proc_sysctl.c +2 -4
@@ -480,12 +480,10 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,make_empty_dir_inode (inode); } + inode->i_uid =GLOBAL_ROOT_UID ; + inode->i_gid =GLOBAL_ROOT_GID ;if (root->set_ownership) root->set_ownership (head, &inode->i_uid, &inode->i_gid); -else { - inode->i_uid =GLOBAL_ROOT_UID ; - inode->i_gid =GLOBAL_ROOT_GID ; - }return inode; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 17/121 ext4: refactor ext4_da_map_blocks()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Yi <[email protected]>
[ Upstream commit 3fcc2b887a1ba4c1f45319cd8c54daa263ecbc36 ]
Refactor and cleanup ext4_da_map_blocks(), reduce some unnecessary parameters and branches, no logic changes.
Stable-dep-of: 0ea6560abb3b ("ext4: check the extent status again before inserting delalloc block")
--- fs/ext4/inode.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-)
fs/ext4/inode.c +17 -22
@@ -1706,7 +1706,6 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,/* Lookup extent status tree firstly */ if (ext4_es_lookup_extent (inode, iblock,NULL , &es)) {if (ext4_es_is_hole (&es)) { - retval =0 ;down_read (&EXT4_I (inode)->i_data_sem); goto add_delayed; }
@@ -1751,26 +1750,9 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, retval =ext4_ext_map_blocks (NULL , inode, map,0 ); else retval =ext4_ind_map_blocks (NULL , inode, map,0 ); - -add_delayed: -if (retval ==0 ) { -int ret; - -/* -* XXX: __block_prepare_write() unmaps passed block, -* is it OK? -*/ - - ret =ext4_insert_delayed_block (inode, map->m_lblk); -if (ret !=0 ) { - retval = ret; - goto out_unlock; - } - -map_bh (bh, inode->i_sb, invalid_block); -set_buffer_new (bh); -set_buffer_delay (bh); - }else if (retval >0 ) { +if (retval <0 ) + goto out_unlock; +if (retval >0 ) {unsigned int status;if (unlikely (retval != map->m_len)) {
@@ -1785,11 +1767,24 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, EXTENT_STATUS_UNWRITTEN :EXTENT_STATUS_WRITTEN ;ext4_es_insert_extent (inode, map->m_lblk, map->m_len, map->m_pblk, status); + goto out_unlock; } +add_delayed: +/* +* XXX: __block_prepare_write() unmaps passed block, +* is it OK? +*/ + retval =ext4_insert_delayed_block (inode, map->m_lblk); +if (retval) + goto out_unlock; + +map_bh (bh, inode->i_sb, invalid_block); +set_buffer_new (bh); +set_buffer_delay (bh); + out_unlock:up_read ((&EXT4_I (inode)->i_data_sem)); -return retval; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 18/121 ext4: convert to exclusive lock while inserting delalloc extents
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Yi <[email protected]>
[ Upstream commit acf795dc161f3cf481db20f05db4250714e375e5 ]
ext4_da_map_blocks() only hold i_data_sem in shared mode and i_rwsem when inserting delalloc extents, it could be raced by another querying path of ext4_map_blocks() without i_rwsem, .e.g buffered read path. Suppose we buffered read a file containing just a hole, and without any cached extents tree, then it is raced by another delayed buffered write to the same area or the near area belongs to the same hole, and the new delalloc extent could be overwritten to a hole extent.
pread() pwrite()
filemap_read_folio()
ext4_mpage_readpages()
ext4_map_blocks()
down_read(i_data_sem)
ext4_ext_determine_hole()
//find hole
ext4_ext_put_gap_in_cache()
ext4_es_find_extent_range()
//no delalloc extent
ext4_da_map_blocks()
down_read(i_data_sem)
ext4_insert_delayed_block()
//insert delalloc extent
ext4_es_insert_extent()
//overwrite delalloc extent to holeThis race could lead to inconsistent delalloc extents tree and incorrect reserved space counter. Fix this by converting to hold i_data_sem in exclusive mode when adding a new delalloc extent in ext4_da_map_blocks().
Stable-dep-of: 0ea6560abb3b ("ext4: check the extent status again before inserting delalloc block")
--- fs/ext4/inode.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-)
fs/ext4/inode.c +11 -14
@@ -1705,10 +1705,8 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,/* Lookup extent status tree firstly */ if (ext4_es_lookup_extent (inode, iblock,NULL , &es)) { -if (ext4_es_is_hole (&es)) { -down_read (&EXT4_I (inode)->i_data_sem); +if (ext4_es_is_hole (&es)) goto add_delayed; - }/* * Delayed extent could be allocated by fallocate.
@@ -1750,8 +1748,10 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, retval =ext4_ext_map_blocks (NULL , inode, map,0 ); else retval =ext4_ind_map_blocks (NULL , inode, map,0 ); -if (retval <0 ) - goto out_unlock; +if (retval <0 ) { +up_read (&EXT4_I (inode)->i_data_sem); +return retval; + }if (retval >0 ) {unsigned int status;
@@ -1767,24 +1767,21 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, EXTENT_STATUS_UNWRITTEN :EXTENT_STATUS_WRITTEN ;ext4_es_insert_extent (inode, map->m_lblk, map->m_len, map->m_pblk, status); - goto out_unlock; +up_read (&EXT4_I (inode)->i_data_sem); +return retval; } +up_read (&EXT4_I (inode)->i_data_sem); add_delayed: -/* -* XXX: __block_prepare_write() unmaps passed block, -* is it OK? -*/ +down_write (&EXT4_I (inode)->i_data_sem); retval =ext4_insert_delayed_block (inode, map->m_lblk); +up_write (&EXT4_I (inode)->i_data_sem);if (retval) - goto out_unlock; +return retval;map_bh (bh, inode->i_sb, invalid_block);set_buffer_new (bh);set_buffer_delay (bh); - -out_unlock: -up_read ((&EXT4_I (inode)->i_data_sem));return retval; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 19/121 ext4: factor out a common helper to query extent map
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Yi <[email protected]>
[ Upstream commit 8e4e5cdf2fdeb99445a468b6b6436ad79b9ecb30 ]
Factor out a new common helper ext4_map_query_blocks() from the ext4_da_map_blocks(), it query and return the extent map status on the inode's extent path, no logic changes.
Stable-dep-of: 0ea6560abb3b ("ext4: check the extent status again before inserting delalloc block")
--- fs/ext4/inode.c | 57 +++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 25 deletions(-)
fs/ext4/inode.c +32 -25
@@ -453,6 +453,35 @@ static void ext4_map_blocks_es_recheck(handle_t *handle, }#endif /* ES_AGGRESSIVE_TEST */ +static int ext4_map_query_blocks (handle_t *handle,struct inode *inode, +struct ext4_map_blocks *map) +{ +unsigned int status; +int retval; + +if (ext4_test_inode_flag (inode,EXT4_INODE_EXTENTS )) + retval =ext4_ext_map_blocks (handle, inode, map,0 ); +else + retval =ext4_ind_map_blocks (handle, inode, map,0 ); + +if (retval <=0 ) +return retval; + +if (unlikely (retval != map->m_len)) { +ext4_warning (inode->i_sb, +"ES len assertion failed for inode " +"%lu: retval %d != map->m_len %d" , + inode->i_ino, retval, map->m_len); +WARN_ON (1 ); + } + + status = map->m_flags &EXT4_MAP_UNWRITTEN ? +EXTENT_STATUS_UNWRITTEN :EXTENT_STATUS_WRITTEN ; +ext4_es_insert_extent (inode, map->m_lblk, map->m_len, + map->m_pblk, status); +return retval; +} +/* * The ext4_map_blocks() function tries to look up the requested blocks, * and returns if the blocks are already mapped.
@@ -1744,33 +1773,11 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,down_read (&EXT4_I (inode)->i_data_sem);if (ext4_has_inline_data (inode)) retval =0 ; -else if (ext4_test_inode_flag (inode,EXT4_INODE_EXTENTS )) - retval =ext4_ext_map_blocks (NULL , inode, map,0 );else - retval =ext4_ind_map_blocks (NULL , inode, map,0 ); -if (retval <0 ) { -up_read (&EXT4_I (inode)->i_data_sem); -return retval; - } -if (retval >0 ) { -unsigned int status; - -if (unlikely (retval != map->m_len)) { -ext4_warning (inode->i_sb, -"ES len assertion failed for inode " -"%lu: retval %d != map->m_len %d" , - inode->i_ino, retval, map->m_len); -WARN_ON (1 ); - } - - status = map->m_flags &EXT4_MAP_UNWRITTEN ? -EXTENT_STATUS_UNWRITTEN :EXTENT_STATUS_WRITTEN ; -ext4_es_insert_extent (inode, map->m_lblk, map->m_len, - map->m_pblk, status); -up_read (&EXT4_I (inode)->i_data_sem); -return retval; - } + retval =ext4_map_query_blocks (NULL , inode, map);up_read (&EXT4_I (inode)->i_data_sem); +if (retval) +return retval; add_delayed:down_write (&EXT4_I (inode)->i_data_sem);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 20/121 ext4: check the extent status again before inserting delalloc block
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Yi <[email protected]>
[ Upstream commit 0ea6560abb3bac1ffcfa4bf6b2c4d344fdc27b3c ]
ext4_da_map_blocks looks up for any extent entry in the extent status tree (w/o i_data_sem) and then the looks up for any ondisk extent mapping (with i_data_sem in read mode).
If it finds a hole in the extent status tree or if it couldn't find any entry at all, it then takes the i_data_sem in write mode to add a da entry into the extent status tree. This can actually race with page mkwrite & fallocate path.
Note that this is ok between
1. ext4 buffered-write path v/s ext4_page_mkwrite(), because of the folio lock
2. ext4 buffered write path v/s ext4 fallocate because of the inode lock.
But this can race between ext4_page_mkwrite() & ext4 fallocate path
ext4_page_mkwrite() ext4_fallocate()
block_page_mkwrite()
ext4_da_map_blocks()
//find hole in extent status tree
ext4_alloc_file_blocks()
ext4_map_blocks()
//allocate block and unwritten extent
ext4_insert_delayed_block()
ext4_da_reserve_space()
//reserve one more block
ext4_es_insert_delayed_block()
//drop unwritten extent and add delayed extent by mistakeThen, the delalloc extent is wrong until writeback and the extra reserved block can't be released any more and it triggers below warning:
EXT4-fs (pmem2): Inode 13 (00000000bbbd4d23): i_reserved_data_blocks(1) not cleared!
Fix the problem by looking up extent status tree again while the i_data_sem is held in write mode. If it still can't find any entry, then we insert a new da entry into the extent status tree.
--- fs/ext4/inode.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
fs/ext4/inode.c +21 -0
@@ -1737,6 +1737,7 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,if (ext4_es_is_hole (&es)) goto add_delayed; +found:/* * Delayed extent could be allocated by fallocate. * So we need to check it.
@@ -1781,6 +1782,26 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, add_delayed:down_write (&EXT4_I (inode)->i_data_sem); +/* +* Page fault path (ext4_page_mkwrite does not take i_rwsem) +* and fallocate path (no folio lock) can race. Make sure we +* lookup the extent status tree here again while i_data_sem +* is held in write mode, before inserting a new da entry in +* the extent status tree. +*/ +if (ext4_es_lookup_extent (inode, iblock,NULL , &es)) { +if (!ext4_es_is_hole (&es)) { +up_write (&EXT4_I (inode)->i_data_sem); + goto found; + } + }else if (!ext4_has_inline_data (inode)) { + retval =ext4_map_query_blocks (NULL , inode, map); +if (retval) { +up_write (&EXT4_I (inode)->i_data_sem); +return retval; + } + } + retval =ext4_insert_delayed_block (inode, map->m_lblk);up_write (&EXT4_I (inode)->i_data_sem);if (retval)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 21/121 cpufreq: qcom-nvmem: Simplify driver data allocation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
[ Upstream commit 2a5d46c3ad6b0e62d2b04356ad999d504fb564e0 ]
Simplify the allocation and cleanup of driver data by using devm together with a flexible array. Prepare for adding additional per-CPU data by defining a struct qcom_cpufreq_drv_cpu instead of storing the opp_tokens directly.
Stable-dep-of: d01c84b97f19 ("cpufreq: qcom-nvmem: fix memory leaks in probe error paths")
--- drivers/cpufreq/qcom-cpufreq-nvmem.c | 49 ++++++++++------------------ 1 file changed, 18 insertions(+), 31 deletions(-)
drivers/cpufreq/qcom-cpufreq-nvmem.c +18 -31
@@ -40,10 +40,14 @@ struct qcom_cpufreq_match_data {const char **genpd_names; }; +struct qcom_cpufreq_drv_cpu { +int opp_token; +}; +struct qcom_cpufreq_drv { -int *opp_tokens;u32 versions;const struct qcom_cpufreq_match_data *data; +struct qcom_cpufreq_drv_cpu cpus[]; };static struct platform_device *cpufreq_dt_pdev, *cpufreq_pdev;
@@ -243,42 +247,32 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)return -ENOENT ; } - drv =kzalloc (sizeof (*drv),GFP_KERNEL ); + drv =devm_kzalloc (&pdev->dev,struct_size (drv, cpus,num_possible_cpus ()), +GFP_KERNEL );if (!drv)return -ENOMEM ; match = pdev->dev.platform_data; drv->data = match->data; -if (!drv->data) { - ret = -ENODEV ; - goto free_drv; - } +if (!drv->data) +return -ENODEV ;if (drv->data->get_version) { speedbin_nvmem =of_nvmem_cell_get (np,NULL ); -if (IS_ERR (speedbin_nvmem)) { - ret =dev_err_probe (cpu_dev,PTR_ERR (speedbin_nvmem), -"Could not get nvmem cell\n" ); - goto free_drv; - } +if (IS_ERR (speedbin_nvmem)) +return dev_err_probe (cpu_dev,PTR_ERR (speedbin_nvmem), +"Could not get nvmem cell\n" ); ret = drv->data->get_version (cpu_dev, speedbin_nvmem, &pvs_name, drv);if (ret) {nvmem_cell_put (speedbin_nvmem); - goto free_drv; +return ret; }nvmem_cell_put (speedbin_nvmem); }of_node_put (np); - drv->opp_tokens =kcalloc (num_possible_cpus (),sizeof (*drv->opp_tokens), -GFP_KERNEL ); -if (!drv->opp_tokens) { - ret = -ENOMEM ; - goto free_drv; - } -for_each_possible_cpu (cpu) {struct dev_pm_opp_config config = { .supported_hw =NULL ,
@@ -304,9 +298,9 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) }if (config.supported_hw || config.genpd_names) { - drv->opp_tokens[cpu] =dev_pm_opp_set_config (cpu_dev, &config); -if (drv->opp_tokens[cpu] <0 ) { - ret = drv->opp_tokens[cpu]; + drv->cpus[cpu].opp_token =dev_pm_opp_set_config (cpu_dev, &config); +if (drv->cpus[cpu].opp_token <0 ) { + ret = drv->cpus[cpu].opp_token;dev_err (cpu_dev,"Failed to set OPP config\n" ); goto free_opp; }
@@ -325,11 +319,7 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) free_opp:for_each_possible_cpu (cpu) -dev_pm_opp_clear_config (drv->opp_tokens[cpu]); -kfree (drv->opp_tokens); -free_drv: -kfree (drv); - +dev_pm_opp_clear_config (drv->cpus[cpu].opp_token);return ret; }
@@ -341,10 +331,7 @@ static void qcom_cpufreq_remove(struct platform_device *pdev)platform_device_unregister (cpufreq_dt_pdev);for_each_possible_cpu (cpu) -dev_pm_opp_clear_config (drv->opp_tokens[cpu]); - -kfree (drv->opp_tokens); -kfree (drv); +dev_pm_opp_clear_config (drv->cpus[cpu].opp_token); }static struct platform_driver qcom_cpufreq_driver = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 22/121 cpufreq: qcom-nvmem: fix memory leaks in probe error paths
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit d01c84b97f19f1137211e90b0a910289a560019e ]
The code refactoring added new error paths between the np device node allocation and the call to of_node_put(), which leads to memory leaks if any of those errors occur.
Add the missing of_node_put() in the error paths that require it.
--- drivers/cpufreq/qcom-cpufreq-nvmem.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/cpufreq/qcom-cpufreq-nvmem.c +10 -3
@@ -249,23 +249,30 @@ static int qcom_cpufreq_probe(struct platform_device *pdev) drv =devm_kzalloc (&pdev->dev,struct_size (drv, cpus,num_possible_cpus ()),GFP_KERNEL ); -if (!drv) +if (!drv) { +of_node_put (np);return -ENOMEM ; + } match = pdev->dev.platform_data; drv->data = match->data; -if (!drv->data) +if (!drv->data) { +of_node_put (np);return -ENODEV ; + }if (drv->data->get_version) { speedbin_nvmem =of_nvmem_cell_get (np,NULL ); -if (IS_ERR (speedbin_nvmem)) +if (IS_ERR (speedbin_nvmem)) { +of_node_put (np);return dev_err_probe (cpu_dev,PTR_ERR (speedbin_nvmem),"Could not get nvmem cell\n" ); + } ret = drv->data->get_version (cpu_dev, speedbin_nvmem, &pvs_name, drv);if (ret) { +of_node_put (np);nvmem_cell_put (speedbin_nvmem);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 23/121 leds: trigger: Remove unused function led_trigger_rename_static()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit c82a1662d4548c454de5343b88f69b9fc82266b3 ]
This function was added with a8df7b1ab70b ("leds: add led_trigger_rename function") 11 yrs ago, but it has no users. So remove it.
Stable-dep-of: ab477b766edd ("leds: triggers: Flush pending brightness before activating trigger")
--- drivers/leds/led-triggers.c | 13 ------------- include/linux/leds.h | 17 ----------------- 2 files changed, 30 deletions(-)
drivers/leds/led-triggers.c +0 -13
@@ -269,19 +269,6 @@ void led_trigger_set_default(struct led_classdev *led_cdev) }EXPORT_SYMBOL_GPL (led_trigger_set_default); -void led_trigger_rename_static (const char *name,struct led_trigger *trig) -{ -/* new name must be on a temporary string to prevent races */ -BUG_ON (name == trig->name); - -down_write (&triggers_list_lock); -/* this assumes that trig->name was originaly allocated to -* non constant storage */ -strcpy ((char *)trig->name, name); -up_write (&triggers_list_lock); -} -EXPORT_SYMBOL_GPL (led_trigger_rename_static); -/* LED Trigger Interface */ int led_trigger_register (struct led_trigger *trig)
include/linux/leds.h +0 -17
@@ -527,23 +527,6 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)return led_cdev->trigger_data; } -/** -* led_trigger_rename_static - rename a trigger -* @name: the new trigger name -* @trig: the LED trigger to rename -* -* Change a LED trigger name by copying the string passed in -* name into current trigger name, which MUST be large -* enough for the new string. -* -* Note that name must NOT point to the same string used -* during LED registration, as that could lead to races. -* -* This is meant to be used on triggers with statically -* allocated name. -*/ -void led_trigger_rename_static (const char *name,struct led_trigger *trig); -#define module_led_trigger (__led_trigger) \ module_driver(__led_trigger, led_trigger_register, \ led_trigger_unregister)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 24/121 leds: trigger: Store brightness set by led_trigger_event()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 822c91e72eac568ed8d83765634f00decb45666c ]
If a simple trigger is assigned to a LED, then the LED may be off until the next led_trigger_event() call. This may be an issue for simple triggers with rare led_trigger_event() calls, e.g. power supply charging indicators (drivers/power/supply/power_supply_leds.c). Therefore persist the brightness value of the last led_trigger_event() call and use this value if the trigger is assigned to a LED. In addition add a getter for the trigger brightness value.
Stable-dep-of: ab477b766edd ("leds: triggers: Flush pending brightness before activating trigger")
--- drivers/leds/led-triggers.c | 6 ++++-- include/linux/leds.h | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-)
drivers/leds/led-triggers.c +4 -2
@@ -194,11 +194,11 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)spin_unlock (&trig->leddev_list_lock); led_cdev->trigger = trig; + ret =0 ;if (trig->activate) ret = trig->activate (led_cdev);else - ret =0 ; - +led_set_brightness (led_cdev, trig->brightness);if (ret) goto err_activate;
@@ -373,6 +373,8 @@ void led_trigger_event(struct led_trigger *trig,if (!trig)return ; + trig->brightness = brightness; +rcu_read_lock ();list_for_each_entry_rcu (led_cdev, &trig->led_cdevs, trig_list)led_set_brightness (led_cdev, brightness);
include/linux/leds.h +15 -0
@@ -474,6 +474,9 @@ struct led_trigger {int (*activate)(struct led_classdev *led_cdev);void (*deactivate)(struct led_classdev *led_cdev); +/* Brightness set by led_trigger_event */ +enum led_brightness brightness; +/* LED-private triggers have this set */ struct led_hw_trigger_type *trigger_type;
@@ -527,6 +530,12 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev)return led_cdev->trigger_data; } +static inline enum led_brightness +led_trigger_get_brightness (const struct led_trigger *trigger) +{ +return trigger ? trigger->brightness :LED_OFF ; +} +#define module_led_trigger (__led_trigger) \ module_driver(__led_trigger, led_trigger_register, \ led_trigger_unregister)
@@ -563,6 +572,12 @@ static inline void *led_get_trigger_data(struct led_classdev *led_cdev) return NULL; } +static inline enum led_brightness +led_trigger_get_brightness (const struct led_trigger *trigger) +{ +return LED_OFF ; +} +#endif /* CONFIG_LEDS_TRIGGERS */ /* Trigger specific enum */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 25/121 leds: trigger: Call synchronize_rcu() before calling trig->activate()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit b1bbd20f35e19774ea01989320495e09ac44fba3 ]
Some triggers call led_trigger_event() from their activate() callback to initialize the brightness of the LED for which the trigger is being activated.
In order for the LED's initial state to be set correctly this requires that the led_trigger_event() call uses the new version of trigger->led_cdevs, which has the new LED.
AFAICT led_trigger_event() will always use the new version when it is running on the same CPU as where the list_add_tail_rcu() call was made, which is why the missing synchronize_rcu() has not lead to bug reports. But if activate() is pre-empted, sleeps or uses a worker then the led_trigger_event() call may run on another CPU which may still use the old trigger->led_cdevs list.
Add a synchronize_rcu() call to ensure that any led_trigger_event() calls done from activate() always use the new list.
Triggers using led_trigger_event() from their activate() callback are:net/bluetooth/leds.c, net/rfkill/core.c and drivers/tty/vt/keyboard.c.
Stable-dep-of: ab477b766edd ("leds: triggers: Flush pending brightness before activating trigger")
--- drivers/leds/led-triggers.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/leds/led-triggers.c +7 -0
@@ -194,6 +194,13 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)spin_unlock (&trig->leddev_list_lock); led_cdev->trigger = trig; +/* +* Some activate() calls use led_trigger_event() to initialize +* the brightness of the LED for which the trigger is being set. +* Ensure the led_cdev is visible on trig->led_cdevs for this. +*/ +synchronize_rcu (); + ret =0 ;if (trig->activate) ret = trig->activate (led_cdev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 26/121 leds: triggers: Flush pending brightness before activating trigger
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit ab477b766edd3bfb6321a6e3df4c790612613fae ]
The race fixed in timer_trig_activate() between a blocking set_brightness() call and trigger->activate() can affect any trigger. So move the call to flush_work() into led_trigger_set() where it can avoid the race for all triggers.
--- drivers/leds/led-triggers.c | 6 ++++++ drivers/leds/trigger/ledtrig-timer.c | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/leds/led-triggers.c +6 -0
@@ -201,6 +201,12 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)*/ synchronize_rcu (); +/* +* If "set brightness to 0" is pending in workqueue, +* we don't want that to be reordered after ->activate() +*/ +flush_work (&led_cdev->set_brightness_work); + ret =0 ;if (trig->activate) ret = trig->activate (led_cdev);
drivers/leds/trigger/ledtrig-timer.c +0 -5
@@ -110,11 +110,6 @@ static int timer_trig_activate(struct led_classdev *led_cdev) led_cdev->flags &= ~LED_INIT_DEFAULT_TRIGGER ; } -/* -* If "set brightness to 0" is pending in workqueue, we don't -* want that to be reordered after blink_set() -*/ -flush_work (&led_cdev->set_brightness_work);led_blink_set (led_cdev, &led_cdev->blink_delay_on, &led_cdev->blink_delay_off);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 27/121 KVM: VMX: Split off vmx_onhyperv.{ch} from hyperv.{ch}
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaly Kuznetsov <[email protected]>
[ Upstream commit 50a82b0eb88c108d1ebc73a97f5b81df0d5918e0 ]
hyperv.{ch} is currently a mix of stuff which is needed by both Hyper-V on KVM and KVM on Hyper-V. As a preparation to making Hyper-V emulation optional, put KVM-on-Hyper-V specific code into dedicated files.
No functional change intended.
Stable-dep-of: d83c36d822be ("KVM: nVMX: Add a helper to get highest pending from Posted Interrupt vector")
--- arch/x86/kvm/Makefile | 4 + arch/x86/kvm/vmx/hyperv.c | 139 -------------------- arch/x86/kvm/vmx/hyperv.h | 217 ++++++++++++++++---------------- arch/x86/kvm/vmx/vmx.c | 1 + arch/x86/kvm/vmx/vmx_onhyperv.c | 36 ++++++ arch/x86/kvm/vmx/vmx_onhyperv.h | 124 ++++++++++++++++++ arch/x86/kvm/vmx/vmx_ops.h | 2 +- 7 files changed, 271 insertions(+), 252 deletions(-) create mode 100644 arch/x86/kvm/vmx/vmx_onhyperv.c create mode 100644 arch/x86/kvm/vmx/vmx_onhyperv.h
arch/x86/kvm/Makefile +4 -0
@@ -26,6 +26,10 @@ kvm-intel-y += vmx/vmx.o vmx/vmenter.o vmx/pmu_intel.o vmx/vmcs12.o \ vmx/hyperv.o vmx/nested.o vmx/posted_intr.o kvm-intel-$(CONFIG_X86_SGX_KVM) += vmx/sgx.o +ifdef CONFIG_HYPERV +kvm-intel-y += vmx/vmx_onhyperv.o +endif + kvm-amd-y += svm/svm.o svm/vmenter.o svm/pmu.o svm/nested.o svm/avic.o \ svm/sev.o svm/hyperv.o
arch/x86/kvm/vmx/hyperv.c +0 -139
151 lines not on this page · raw message
arch/x86/kvm/vmx/hyperv.h +105 -112
231 lines not on this page · raw message
arch/x86/kvm/vmx/vmx.c +1 -0
@@ -66,6 +66,7 @@#include "vmx.h" #include "x86.h" #include "smm.h" +#include "vmx_onhyperv.h" MODULE_AUTHOR ("Qumranet" );MODULE_LICENSE ("GPL" );
arch/x86/kvm/vmx/vmx_onhyperv.c new file +36 -0
@@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include "capabilities.h" +#include "vmx_onhyperv.h" + +DEFINE_STATIC_KEY_FALSE (__kvm_is_using_evmcs); + +/* +* KVM on Hyper-V always uses the latest known eVMCSv1 revision, the assumption +* is: in case a feature has corresponding fields in eVMCS described and it was +* exposed in VMX feature MSRs, KVM is free to use it. Warn if KVM meets a +* feature which has no corresponding eVMCS field, this likely means that KVM +* needs to be updated. +*/ +#define evmcs_check_vmcs_conf (field, ctrl) \ + do { \ + typeof(vmcs_conf->field) unsupported; \ + \ + unsupported = vmcs_conf->field & ~EVMCS1_SUPPORTED_ ## ctrl; \ + if (unsupported) { \ + pr_warn_once(#field " unsupported with eVMCS: 0x%llx\n",\ + (u64)unsupported); \ + vmcs_conf->field &= EVMCS1_SUPPORTED_ ## ctrl; \ + } \ + } \ + while (0) + +void evmcs_sanitize_exec_ctrls (struct vmcs_config *vmcs_conf) +{ +evmcs_check_vmcs_conf (cpu_based_exec_ctrl,EXEC_CTRL ); +evmcs_check_vmcs_conf (pin_based_exec_ctrl,PINCTRL ); + evmcs_check_vmcs_conf(cpu_based_2nd_exec_ctrl, 2NDEXEC); + evmcs_check_vmcs_conf(cpu_based_3rd_exec_ctrl, 3RDEXEC); +evmcs_check_vmcs_conf (vmentry_ctrl,VMENTRY_CTRL ); +evmcs_check_vmcs_conf (vmexit_ctrl,VMEXIT_CTRL ); +}
arch/x86/kvm/vmx/vmx_onhyperv.h new file +124 -0
124 lines not on this page · raw message
arch/x86/kvm/vmx/vmx_ops.h +1 -1
@@ -6,7 +6,7 @@#include <asm/vmx.h> -#include "hyperv.h" +#include "vmx_onhyperv.h" #include "vmcs.h" #include "../x86.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 28/121 KVM: VMX: Move posted interrupt descriptor out of VMX code
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Pan <[email protected]>
[ Upstream commit 699f67512f04cbaee965fad872702c06eaf440f6 ]
To prepare native usage of posted interrupts, move the PID declarations out of VMX code such that they can be shared.
Stable-dep-of: d83c36d822be ("KVM: nVMX: Add a helper to get highest pending from Posted Interrupt vector")
--- arch/x86/include/asm/posted_intr.h | 88 ++++++++++++++++++++++++++++ arch/x86/kvm/vmx/posted_intr.h | 93 +----------------------------- arch/x86/kvm/vmx/vmx.c | 1 + arch/x86/kvm/vmx/vmx.h | 2 +- 4 files changed, 91 insertions(+), 93 deletions(-) create mode 100644 arch/x86/include/asm/posted_intr.h
arch/x86/include/asm/posted_intr.h new file +88 -0
@@ -0,0 +1,88 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _X86_POSTED_INTR_H +#define _X86_POSTED_INTR_H + +#define POSTED_INTR_ON 0 +#define POSTED_INTR_SN 1 + +#define PID_TABLE_ENTRY_VALID 1 + +/* Posted-Interrupt Descriptor */ +struct pi_desc { +u32 pir[8 ];/* Posted interrupt requested */ +union { +struct { +/* bit 256 - Outstanding Notification */ +u16 on :1 , +/* bit 257 - Suppress Notification */ + sn :1 , +/* bit 271:258 - Reserved */ + rsvd_1 :14 ; +/* bit 279:272 - Notification Vector */ +u8 nv; +/* bit 287:280 - Reserved */ +u8 rsvd_2; +/* bit 319:288 - Notification Destination */ +u32 ndst; + }; +u64 control; + }; +u32 rsvd[6 ]; +}__aligned(64) ; + +static inline bool pi_test_and_set_on (struct pi_desc *pi_desc) +{ +return test_and_set_bit (POSTED_INTR_ON , (unsigned long *)&pi_desc->control); +} + +static inline bool pi_test_and_clear_on (struct pi_desc *pi_desc) +{ +return test_and_clear_bit (POSTED_INTR_ON , (unsigned long *)&pi_desc->control); +} + +static inline bool pi_test_and_clear_sn (struct pi_desc *pi_desc) +{ +return test_and_clear_bit (POSTED_INTR_SN , (unsigned long *)&pi_desc->control); +} + +static inline bool pi_test_and_set_pir (int vector,struct pi_desc *pi_desc) +{ +return test_and_set_bit (vector, (unsigned long *)pi_desc->pir); +} + +static inline bool pi_is_pir_empty (struct pi_desc *pi_desc) +{ +return bitmap_empty ((unsigned long *)pi_desc->pir,NR_VECTORS ); +} + +static inline void pi_set_sn (struct pi_desc *pi_desc) +{ +set_bit (POSTED_INTR_SN , (unsigned long *)&pi_desc->control); +} + +static inline void pi_set_on (struct pi_desc *pi_desc) +{ +set_bit (POSTED_INTR_ON , (unsigned long *)&pi_desc->control); +} + +static inline void pi_clear_on (struct pi_desc *pi_desc) +{ +clear_bit (POSTED_INTR_ON , (unsigned long *)&pi_desc->control); +} + +static inline void pi_clear_sn (struct pi_desc *pi_desc) +{ +clear_bit (POSTED_INTR_SN , (unsigned long *)&pi_desc->control); +} + +static inline bool pi_test_on (struct pi_desc *pi_desc) +{ +return test_bit (POSTED_INTR_ON , (unsigned long *)&pi_desc->control); +} + +static inline bool pi_test_sn (struct pi_desc *pi_desc) +{ +return test_bit (POSTED_INTR_SN , (unsigned long *)&pi_desc->control); +} + +#endif /* _X86_POSTED_INTR_H */
arch/x86/kvm/vmx/posted_intr.h +1 -92
99 lines not on this page · raw message
arch/x86/kvm/vmx/vmx.c +1 -0
@@ -67,6 +67,7 @@#include "x86.h" #include "smm.h" #include "vmx_onhyperv.h" +#include "posted_intr.h" MODULE_AUTHOR ("Qumranet" );MODULE_LICENSE ("GPL" );
arch/x86/kvm/vmx/vmx.h +1 -1
@@ -7,10 +7,10 @@#include <asm/kvm.h> #include <asm/intel_pt.h> #include <asm/perf_event.h> +#include <asm/posted_intr.h> #include "capabilities.h" #include "../kvm_cache_regs.h" -#include "posted_intr.h" #include "vmcs.h" #include "vmx_ops.h" #include "../cpuid.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 29/121 KVM: nVMX: Add a helper to get highest pending from Posted Interrupt vector
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
[ Upstream commit d83c36d822be44db4bad0c43bea99c8908f54117 ]
Add a helper to retrieve the highest pending vector given a Posted Interrupt descriptor. While the actual operation is straightforward, it's surprisingly easy to mess up, e.g. if one tries to reuse lapic.c's find_highest_vector(), which doesn't work with PID.PIR due to the APIC's IRR and ISR component registers being physically discontiguous (they're 4-byte registers aligned at 16-byte intervals).
To make PIR handling more consistent with respect to IRR and ISR handling, return -1 to indicate "no interrupt pending".
--- arch/x86/kvm/vmx/nested.c | 5 +++-- arch/x86/kvm/vmx/posted_intr.h | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-)
arch/x86/kvm/vmx/nested.c +3 -2
@@ -12,6 +12,7 @@#include "mmu.h" #include "nested.h" #include "pmu.h" +#include "posted_intr.h" #include "sgx.h" #include "trace.h" #include "vmx.h"
@@ -3830,8 +3831,8 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu)if (!pi_test_and_clear_on (vmx->nested.pi_desc))return 0 ; - max_irr =find_last_bit ((unsigned long *)vmx->nested.pi_desc->pir,256 ); -if (max_irr !=256 ) { + max_irr =pi_find_highest_vector (vmx->nested.pi_desc); +if (max_irr >0 ) { vapic_page = vmx->nested.virtual_apic_map.hva;if (!vapic_page) goto mmio_needed;
arch/x86/kvm/vmx/posted_intr.h +10 -0
@@ -1,6 +1,8 @@/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __KVM_X86_VMX_POSTED_INTR_H#define __KVM_X86_VMX_POSTED_INTR_H + +#include <linux/find.h> #include <asm/posted_intr.h> void vmx_vcpu_pi_load (struct kvm_vcpu *vcpu,int cpu);
@@ -12,4 +14,12 @@ int vmx_pi_update_irte(struct kvm *kvm, unsigned int host_irq, uint32_t guest_irq, bool set);void vmx_pi_start_assignment (struct kvm *kvm); +static inline int pi_find_highest_vector (struct pi_desc *pi_desc) +{ +int vec; + + vec =find_last_bit ((unsigned long *)pi_desc->pir,256 ); +return vec <256 ? vec :-1 ; +} +#endif /* __KVM_X86_VMX_POSTED_INTR_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 30/121 KVM: nVMX: Check for pending posted interrupts when looking for nested events
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
[ Upstream commit 27c4fa42b11af780d49ce704f7fa67b3c2544df4 ]
Check for pending (and notified!) posted interrupts when checking if L2 has a pending wake event, as fully posted/notified virtual interrupt is a valid wake event for HLT.
Note that KVM must check vmx->nested.pi_pending to avoid prematurely waking L2, e.g. even if KVM sees a non-zero PID.PIR and PID.0N=1, the virtual interrupt won't actually be recognized until a notification IRQ is received by the vCPU or the vCPU does (nested) VM-Enter.
--- arch/x86/kvm/vmx/nested.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-)
arch/x86/kvm/vmx/nested.c +34 -2
@@ -3965,8 +3965,40 @@ static bool nested_vmx_preemption_timer_pending(struct kvm_vcpu *vcpu)static bool vmx_has_nested_events (struct kvm_vcpu *vcpu,bool for_injection) { -return nested_vmx_preemption_timer_pending (vcpu) || -to_vmx (vcpu)->nested.mtf_pending; +struct vcpu_vmx *vmx =to_vmx (vcpu); +void *vapic = vmx->nested.virtual_apic_map.hva; +int max_irr, vppr; + +if (nested_vmx_preemption_timer_pending (vcpu) || + vmx->nested.mtf_pending) +return true; + +/* +* Virtual Interrupt Delivery doesn't require manual injection. Either +* the interrupt is already in GUEST_RVI and will be recognized by CPU +* at VM-Entry, or there is a KVM_REQ_EVENT pending and KVM will move +* the interrupt from the PIR to RVI prior to entering the guest. +*/ +if (for_injection) +return false; + +if (!nested_cpu_has_vid (get_vmcs12 (vcpu)) || +__vmx_interrupt_blocked (vcpu)) +return false; + +if (!vapic) +return false; + + vppr = *((u32 *)(vapic +APIC_PROCPRI )); + +if (vmx->nested.pi_pending && vmx->nested.pi_desc && +pi_test_on (vmx->nested.pi_desc)) { + max_irr =pi_find_highest_vector (vmx->nested.pi_desc); +if (max_irr >0 && (max_irr &0xf0 ) > (vppr &0xf0 )) +return true; + } + +return false; }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 31/121 PCI: Add pci_get_base_class() helper
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sui Jingfeng <[email protected]>
[ Upstream commit d427da2323b093a65d8317783e76ab8fad2e2ef0 ]
There is no function to get all PCI devices in a system by matching against the base class code only, ignoring the sub-class code and the programming interface. Add pci_get_base_class() to suit the need.
For example, if a driver wants to process all PCI display devices in a system, it can do so like this:
pdev = NULL;
while ((pdev = pci_get_base_class(PCI_BASE_CLASS_DISPLAY, pdev))) {
do_something_for_pci_display_device(pdev);
}Stable-dep-of: c2bc958b2b03 ("fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes")
--- drivers/pci/search.c | 31 +++++++++++++++++++++++++++++++ include/linux/pci.h | 5 +++++ 2 files changed, 36 insertions(+)
drivers/pci/search.c +31 -0
@@ -363,6 +363,37 @@ struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) }EXPORT_SYMBOL (pci_get_class); +/** +* pci_get_base_class - searching for a PCI device by matching against the base class code only +* @class: search for a PCI device with this base class code +* @from: Previous PCI device found in search, or %NULL for new search. +* +* Iterates through the list of known PCI devices. If a PCI device is found +* with a matching base class code, the reference count to the device is +* incremented. See pci_match_one_device() to figure out how does this works. +* A new search is initiated by passing %NULL as the @from argument. +* Otherwise if @from is not %NULL, searches continue from next device on the +* global list. The reference count for @from is always decremented if it is +* not %NULL. +* +* Returns: +* A pointer to a matched PCI device, %NULL Otherwise. +*/ +struct pci_dev *pci_get_base_class (unsigned int class,struct pci_dev *from) +{ +struct pci_device_id id = { + .vendor =PCI_ANY_ID , + .device =PCI_ANY_ID , + .subvendor =PCI_ANY_ID , + .subdevice =PCI_ANY_ID , + .class_mask =0xFF0000 , + .class = class <<16 , + }; + +return pci_get_dev_by_id (&id, from); +} +EXPORT_SYMBOL (pci_get_base_class); +/** * pci_dev_present - Returns 1 if device matching the device list is present, 0 if not. * @ids: A pointer to a null terminated list of struct pci_device_id structures
include/linux/pci.h +5 -0
@@ -1182,6 +1182,8 @@ struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);struct pci_dev *pci_get_domain_bus_and_slot (int domain,unsigned int bus,unsigned int devfn);struct pci_dev *pci_get_class (unsigned int class,struct pci_dev *from); +struct pci_dev *pci_get_base_class (unsigned int class,struct pci_dev *from); +int pci_dev_present (const struct pci_device_id *ids); int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
@@ -1958,6 +1960,9 @@ static inline struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from) {return NULL ; } +static inline struct pci_dev *pci_get_base_class (unsigned int class, +struct pci_dev *from) +{return NULL ; }static inline int pci_dev_present (const struct pci_device_id *ids) {return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 32/121 fbdev/vesafb: Replace references to global screen_info by local pointer
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 3218286bbb78cac3dde713514529e0480d678173 ]
Get the global screen_info's address once and access the data via this pointer. Limits the use of global state.
Stable-dep-of: c2bc958b2b03 ("fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes")
--- drivers/video/fbdev/vesafb.c | 66 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 31 deletions(-)
drivers/video/fbdev/vesafb.c +35 -31
@@ -243,6 +243,7 @@ static int vesafb_setup(char *options)static int vesafb_probe (struct platform_device *dev) { +struct screen_info *si = &screen_info;struct fb_info *info;struct vesafb_par *par;int i, err;
@@ -255,17 +256,17 @@ static int vesafb_probe(struct platform_device *dev)fb_get_options ("vesafb" , &option);vesafb_setup (option); -if (screen_info.orig_video_isVGA !=VIDEO_TYPE_VLFB ) +if (si->orig_video_isVGA !=VIDEO_TYPE_VLFB )return -ENODEV ; - vga_compat = (screen_info.capabilities &2 ) ?0 :1 ; - vesafb_fix.smem_start = screen_info.lfb_base; - vesafb_defined.bits_per_pixel = screen_info.lfb_depth; + vga_compat = (si->capabilities &2 ) ?0 :1 ; + vesafb_fix.smem_start = si->lfb_base; + vesafb_defined.bits_per_pixel = si->lfb_depth;if (15 == vesafb_defined.bits_per_pixel) vesafb_defined.bits_per_pixel =16 ; - vesafb_defined.xres = screen_info.lfb_width; - vesafb_defined.yres = screen_info.lfb_height; - vesafb_fix.line_length = screen_info.lfb_linelength; + vesafb_defined.xres = si->lfb_width; + vesafb_defined.yres = si->lfb_height; + vesafb_fix.line_length = si->lfb_linelength; vesafb_fix.visual = (vesafb_defined.bits_per_pixel ==8 ) ?FB_VISUAL_PSEUDOCOLOR :FB_VISUAL_TRUECOLOR ;
@@ -277,7 +278,7 @@ static int vesafb_probe(struct platform_device *dev)/* size_total -- all video memory we have. Used for mtrr * entries, resource allocation and bounds * checking. */ - size_total = screen_info.lfb_size *65536 ; + size_total = si->lfb_size *65536 ;if (vram_total) size_total = vram_total *1024 *1024 ;if (size_total < size_vmode)
@@ -297,7 +298,7 @@ static int vesafb_probe(struct platform_device *dev) vesafb_fix.smem_len = size_remap;#ifndef __i386__ - screen_info.vesapm_seg =0 ; + si->vesapm_seg =0 ;#endif if (!request_mem_region (vesafb_fix.smem_start, size_total,"vesafb" )) {
@@ -317,23 +318,26 @@ static int vesafb_probe(struct platform_device *dev) par = info->par; info->pseudo_palette = par->pseudo_palette; - par->base = screen_info.lfb_base; + par->base = si->lfb_base; par->size = size_total;printk (KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n" , - vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages); + vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, + vesafb_fix.line_length, si->pages); -if (screen_info.vesapm_seg) { +if (si->vesapm_seg) {printk (KERN_INFO "vesafb: protected mode interface info at %04x:%04x\n" , - screen_info.vesapm_seg,screen_info.vesapm_off); + si->vesapm_seg, si->vesapm_off); } -if (screen_info.vesapm_seg <0xc000 ) +if (si->vesapm_seg <0xc000 ) ypan = pmi_setpal =0 ;/* not available or some DOS TSR ... */ if (ypan || pmi_setpal) { +unsigned long pmi_phys;unsigned short *pmi_base; - pmi_base = (unsigned short *)phys_to_virt (((unsigned long )screen_info.vesapm_seg <<4 ) + screen_info.vesapm_off); + pmi_phys = ((unsigned long )si->vesapm_seg <<4 ) + si->vesapm_off; + pmi_base = (unsigned short *)phys_to_virt (pmi_phys); pmi_start = (void *)((char *)pmi_base + pmi_base[1 ]); pmi_pal = (void *)((char *)pmi_base + pmi_base[2 ]);printk (KERN_INFO "vesafb: pmi: set display start = %p, set palette = %p\n" ,pmi_start,pmi_pal);
@@ -377,14 +381,14 @@ static int vesafb_probe(struct platform_device *dev) vesafb_defined.left_margin = (vesafb_defined.xres /8 ) &0xf8 ; vesafb_defined.hsync_len = (vesafb_defined.xres /8 ) &0xf8 ; - vesafb_defined.red.offset = screen_info.red_pos; - vesafb_defined.red.length = screen_info.red_size; - vesafb_defined.green.offset = screen_info.green_pos; - vesafb_defined.green.length = screen_info.green_size; - vesafb_defined.blue.offset = screen_info.blue_pos; - vesafb_defined.blue.length = screen_info.blue_size; - vesafb_defined.transp.offset = screen_info.rsvd_pos; - vesafb_defined.transp.length = screen_info.rsvd_size; + vesafb_defined.red.offset = si->red_pos; + vesafb_defined.red.length = si->red_size; + vesafb_defined.green.offset = si->green_pos; + vesafb_defined.green.length = si->green_size; + vesafb_defined.blue.offset = si->blue_pos; + vesafb_defined.blue.length = si->blue_size; + vesafb_defined.transp.offset = si->rsvd_pos; + vesafb_defined.transp.length = si->rsvd_size;if (vesafb_defined.bits_per_pixel <=8 ) { depth = vesafb_defined.green.length;
@@ -399,14 +403,14 @@ static int vesafb_probe(struct platform_device *dev) (vesafb_defined.bits_per_pixel >8 ) ?"Truecolor" : (vga_compat || pmi_setpal) ?"Pseudocolor" :"Static Pseudocolor" , - screen_info.rsvd_size, - screen_info.red_size, - screen_info.green_size, - screen_info.blue_size, - screen_info.rsvd_pos, - screen_info.red_pos, - screen_info.green_pos, - screen_info.blue_pos); + si->rsvd_size, + si->red_size, + si->green_size, + si->blue_size, + si->rsvd_pos, + si->red_pos, + si->green_pos, + si->blue_pos); vesafb_fix.ypanstep = ypan ?1 :0 ; vesafb_fix.ywrapstep = (ypan>1 ) ?1 :0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 33/121 video: Add helpers for decoding screen_info
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 75fa9b7e375e35739663cde0252d31e586c6314a ]
The plain values as stored in struct screen_info need to be decoded before being used. Add helpers that decode the type of video output and the framebuffer I/O aperture.
Old or non-x86 systems may not set the type of video directly, but only indicate the presence by storing 0x01 in orig_video_isVGA. The decoding logic in screen_info_video_type() takes this into account. It then follows similar code in vgacon's vgacon_startup() to detect the video type from the given values.
A call to screen_info_resources() returns all known resources of the given screen_info. The resources' values have been taken from existing code in vgacon and vga16fb. These drivers can later be converted to use the new interfaces.
v2:
* return ssize_t from screen_info_resources()
* don't call __screen_info_has_lfb() unnecessarily
Stable-dep-of: c2bc958b2b03 ("fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes")
--- drivers/firmware/Kconfig | 1 + drivers/video/Kconfig | 4 + drivers/video/Makefile | 3 + drivers/video/screen_info_generic.c | 146 ++++++++++++++++++++++++++++ include/linux/screen_info.h | 100 +++++++++++++++++++ 5 files changed, 254 insertions(+) create mode 100644 drivers/video/screen_info_generic.c
drivers/firmware/Kconfig +1 -0
@@ -229,6 +229,7 @@ config QCOM_SCM_DOWNLOAD_MODE_DEFAULT config SYSFB bool select BOOT_VESA_SUPPORT + select SCREEN_INFO config SYSFB_SIMPLEFB bool "Mark VGA/VBE/EFI FB as generic system framebuffer"
drivers/video/Kconfig +4 -0
@@ -11,6 +11,10 @@ config APERTURE_HELPERS Support tracking and hand-over of aperture ownership. Required by graphics drivers for firmware-provided framebuffers. +config SCREEN_INFO + bool + default n + config STI_CORE bool depends on PARISC
drivers/video/Makefile +3 -0
@@ -1,12 +1,15 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_APERTURE_HELPERS) += aperture.o +obj-$(CONFIG_SCREEN_INFO) += screen_info.o obj-$(CONFIG_STI_CORE) += sticore.o obj-$(CONFIG_VGASTATE) += vgastate.o obj-$(CONFIG_VIDEO_CMDLINE) += cmdline.o obj-$(CONFIG_VIDEO_NOMODESET) += nomodeset.o obj-$(CONFIG_HDMI) += hdmi.o +screen_info-y := screen_info_generic.o + obj-$(CONFIG_VT) += console/ obj-$(CONFIG_FB_STI) += console/ obj-$(CONFIG_LOGO) += logo/
drivers/video/screen_info_generic.c new file +146 -0
146 lines not on this page · raw message
include/linux/screen_info.h +100 -0
106 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 34/121 video: Provide screen_info_get_pci_dev() to find screen_infos PCI device
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 036105e3a776b6fc2fe0d262896a23ff2cc2e6b1 ]
Add screen_info_get_pci_dev() to find the PCI device of an instance of screen_info. Does nothing on systems without PCI bus.
v3:
* search PCI device with pci_get_base_class() (Sui)
v2:
* remove ret from screen_info_pci_dev() (Javier)
Stable-dep-of: c2bc958b2b03 ("fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes")
--- drivers/video/Makefile | 1 + drivers/video/screen_info_pci.c | 48 +++++++++++++++++++++++++++++++++ include/linux/screen_info.h | 10 +++++++ 3 files changed, 59 insertions(+) create mode 100644 drivers/video/screen_info_pci.c
drivers/video/Makefile +1 -0
@@ -9,6 +9,7 @@ obj-$(CONFIG_VIDEO_NOMODESET) += nomodeset.o obj-$(CONFIG_HDMI) += hdmi.o screen_info-y := screen_info_generic.o +screen_info-$(CONFIG_PCI) += screen_info_pci.o obj-$(CONFIG_VT) += console/ obj-$(CONFIG_FB_STI) += console/
drivers/video/screen_info_pci.c new file +48 -0
48 lines not on this page · raw message
include/linux/screen_info.h +10 -0
@@ -9,6 +9,7 @@*/ #define SCREEN_INFO_MAX_RESOURCES 3 +struct pci_dev ;struct resource ;static inline bool __screen_info_has_lfb (unsigned int type)
@@ -104,6 +105,15 @@ static inline unsigned int screen_info_video_type(const struct screen_info *si)ssize_t screen_info_resources (const struct screen_info *si,struct resource *r,size_t num); +#if defined(CONFIG_PCI ) +struct pci_dev *screen_info_pci_dev (const struct screen_info *si); +#else +static inline struct pci_dev *screen_info_pci_dev (const struct screen_info *si) +{ +return NULL ; +} +#endif +extern struct screen_info screen_info;#endif /* _SCREEN_INFO_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/121 firmware/sysfb: Update screen_info for relocated EFI framebuffers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 78aa89d1dfba1e3cf4a2e053afa3b4c4ec622371 ]
On ARM PCI systems, the PCI hierarchy might be reconfigured during boot and the firmware framebuffer might move as a result of that. The values in screen_info will then be invalid.
Work around this problem by tracking the framebuffer's initial location before it get relocated; then fix the screen_info state between reloaction and creating the firmware framebuffer's device.
This functionality has been lifted from efifb. See the commit message of commit 55d728a40d36 ("efi/fb: Avoid reconfiguration of BAR that covers the framebuffer") for more information.
Stable-dep-of: c2bc958b2b03 ("fbdev: vesafb: Detect VGA compatibility from screen info's VESA attributes")
--- drivers/firmware/sysfb.c | 2 + drivers/video/screen_info_pci.c | 88 +++++++++++++++++++++++++++++++++ include/linux/screen_info.h | 16 ++++++ 3 files changed, 106 insertions(+)
drivers/firmware/sysfb.c +2 -0
@@ -77,6 +77,8 @@ static __init int sysfb_init(void)bool compatible;int ret =0 ; +screen_info_apply_fixups (); +mutex_lock (&disable_lock);if (disabled) goto unlock_mutex;
drivers/video/screen_info_pci.c +88 -0
95 lines not on this page · raw message
include/linux/screen_info.h +16 -0
@@ -4,6 +4,8 @@#include <uapi/linux/screen_info.h> +#include <linux/bits.h> +/** * SCREEN_INFO_MAX_RESOURCES - maximum number of resources per screen_info */
@@ -27,6 +29,17 @@ static inline u64 __screen_info_lfb_base(const struct screen_info *si)return lfb_base; } +static inline void __screen_info_set_lfb_base (struct screen_info *si,u64 lfb_base) +{ + si->lfb_base = lfb_base &GENMASK_ULL (31 ,0 ); + si->ext_lfb_base = (lfb_base &GENMASK_ULL (63 ,32 )) >>32 ; + +if (si->ext_lfb_base) + si->capabilities |=VIDEO_CAPABILITY_64BIT_BASE ; +else + si->capabilities &= ~VIDEO_CAPABILITY_64BIT_BASE ; +} +static inline u64 __screen_info_lfb_size (const struct screen_info *si,unsigned int type) {u64 lfb_size = si->lfb_size;
@@ -106,8 +119,11 @@ static inline unsigned int screen_info_video_type(const struct screen_info *si)ssize_t screen_info_resources (const struct screen_info *si,struct resource *r,size_t num);#if defined(CONFIG_PCI ) +void screen_info_apply_fixups (void );struct pci_dev *screen_info_pci_dev (const struct screen_info *si);#else +static inline void screen_info_apply_fixups (void ) +{ }static inline struct pci_dev *screen_info_pci_dev (const struct screen_info *si) {return NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/121 fbdev: vesafb: Detect VGA compatibility from screen infos VESA attributes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit c2bc958b2b03e361f14df99983bc64a39a7323a3 ]
Test the vesa_attributes field in struct screen_info for compatibility with VGA hardware. Vesafb currently tests bit 1 in screen_info's capabilities field which indicates a 64-bit lfb address and is unrelated to VGA compatibility.
Section 4.4 of the Vesa VBE 2.0 specifications defines that bit 5 in the mode's attributes field signals VGA compatibility. The mode is compatible with VGA hardware if the bit is clear. In that case, the driver can access VGA state of the VBE's underlying hardware. The vesafb driver uses this feature to program the color LUT in palette modes. Without, colors might be incorrect.
The problem got introduced in commit 89ec4c238e7a ("[PATCH] vesafb: Fix incorrect logo colors in x86_64"). It incorrectly stores the mode attributes in the screen_info's capabilities field and updates vesafb accordingly. Later, commit 5e8ddcbe8692 ("Video mode probing support for the new x86 setup code") fixed the screen_info, but did not update vesafb. Color output still tends to work, because bit 1 in capabilities is usually 0.
Besides fixing the bug in vesafb, this commit introduces a helper that reads the correct bit from screen_info.
--- drivers/video/fbdev/vesafb.c | 2 +- include/linux/screen_info.h | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-)
drivers/video/fbdev/vesafb.c +1 -1
@@ -259,7 +259,7 @@ static int vesafb_probe(struct platform_device *dev)if (si->orig_video_isVGA !=VIDEO_TYPE_VLFB )return -ENODEV ; - vga_compat = (si->capabilities &2 ) ?0 :1 ; + vga_compat = !__screen_info_vbe_mode_nonvga (si); vesafb_fix.smem_start = si->lfb_base; vesafb_defined.bits_per_pixel = si->lfb_depth;if (15 == vesafb_defined.bits_per_pixel)
include/linux/screen_info.h +10 -0
@@ -49,6 +49,16 @@ static inline u64 __screen_info_lfb_size(const struct screen_info *si, unsignedreturn lfb_size; } +static inline bool __screen_info_vbe_mode_nonvga (const struct screen_info *si) +{ +/* +* VESA modes typically run on VGA hardware. Set bit 5 signals that this +* is not the case. Drivers can then not make use of VGA resources. See +* Sec 4.4 of the VBE 2.0 spec. +*/ +return si->vesa_attributes &BIT (5 ); +} +static inline unsigned int __screen_info_video_type (unsigned int type) {switch (type) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/121 mm: restrict the pcp batch scale factor to avoid too long latency
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huang Ying <[email protected]>
[ Upstream commit 52166607ecc980391b1fffbce0be3074a96d0c7b ]
In page allocator, PCP (Per-CPU Pageset) is refilled and drained in batches to increase page allocation throughput, reduce page allocation/freeing latency per page, and reduce zone lock contention. But too large batch size will cause too long maximal allocation/freeing latency, which may punish arbitrary users. So the default batch size is chosen carefully (in zone_batchsize(), the value is 63 for zone > 1GB) to avoid that.
In commit 3b12e7e97938 ("mm/page_alloc: scale the number of pages that are batch freed"), the batch size will be scaled for large number of page freeing to improve page freeing performance and reduce zone lock contention. Similar optimization can be used for large number of pages allocation too.
To find out a suitable max batch scale factor (that is, max effective batch size), some tests and measurement on some machines were done as follows.
A set of debug patches are implemented as follows,
- Set PCP high to be 2 * batch to reduce the effect of PCP high
- Disable free batch size scaling to get the raw performance.
- The code with zone lock held is extracted from rmqueue_bulk() and free_pcppages_bulk() to 2 separate functions to make it easy to measure the function run time with ftrace function_graph tracer.
- The batch size is hard coded to be 63 (default), 127, 255, 511, 1023, 2047, 4095.
Then will-it-scale/page_fault1 is used to generate the page allocation/freeing workload. The page allocation/freeing throughput (page/s) is measured via will-it-scale. The page allocation/freeing average latency (alloc/free latency avg, in us) and allocation/freeing latency at 99 percentile (alloc/free latency 99%, in us) are measured with ftrace function_graph tracer.
The test results are as follows,
Sapphire Rapids Server
======================
Batch throughput free latency free latency alloc latency alloc latency
page/s avg / us 99% / us avg / us 99% / us
----- ---------- ------------ ------------ ------------- -------------
63 513633.4 2.33 3.57 2.67 6.83
127 517616.7 4.35 6.65 4.22 13.03
255 520822.8 8.29 13.32 7.52 25.24
511 524122.0 15.79 23.42 14.02 49.35
1023 525980.5 30.25 44.19 25.36 94.88
2047 526793.6 59.39 84.50 45.22 140.81
Ice Lake Server
===============
Batch throughput free latency free latency alloc latency alloc latency
page/s avg / us 99% / us avg / us 99% / us
----- ---------- ------------ ------------ ------------- -------------
63 620210.3 2.21 3.68 2.02 4.35
127 627003.0 4.09 6.86 3.51 8.28
255 630777.5 7.70 13.50 6.17 15.97
511 633651.5 14.85 22.62 11.66 31.08
1023 637071.1 28.55 42.02 20.81 54.36
2047 638089.7 56.54 84.06 39.28 91.68
Cascade Lake Server
===================
Batch throughput free latency free latency alloc latency alloc latency
page/s avg / us 99% / us avg / us 99% / us ----- ---------- ------------ ------------ ------------- ------------- 63 404706.7 3.29 5.03 3.53 4.75 127 422475.2 6.12 9.09 6.36 8.76
255 411522.2 11.68 16.97 10.90 16.39
511 428124.1 22.54 31.28 19.86 32.25
1023 414718.4 43.39 62.52 40.00 66.33
2047 429848.7 86.64 120.34 71.14 106.08
Commet Lake Desktop
===================
Batch throughput free latency free latency alloc latency alloc latency
page/s avg / us 99% / us avg / us 99% / us
----- ---------- ------------ ------------ ------------- -------------
63 795183.13 2.18 3.55 2.03 3.05
127 803067.85 3.91 6.56 3.85 5.52
255 812771.10 7.35 10.80 7.14 10.20
511 817723.48 14.17 27.54 13.43 30.31
1023 818870.19 27.72 40.10 27.89 46.28
Coffee Lake Desktop
===================
Batch throughput free latency free latency alloc latency alloc latency
page/s avg / us 99% / us avg / us 99% / us
----- ---------- ------------ ------------ ------------- -------------
63 510542.8 3.13 4.40 2.48 3.43
127 514288.6 5.97 7.89 4.65 6.04
255 516889.7 11.86 15.58 8.96 12.55
511 519802.4 23.10 28.81 16.95 26.19
1023 520802.7 45.30 52.51 33.19 45.95
2047 519997.1 90.63 104.00 65.26 81.74
Quoted 1 line
From the above data, to restrict the allocation/freeing latency to be less
than 100 us in most times, the max batch scale factor needs to be less than or equal to 5.
Although it is reasonable to use 5 as max batch scale factor for the systems tested, there are also slower systems. Where smaller value should be used to constrain the page allocation/freeing latency.
So, in this patch, a new kconfig option (PCP_BATCH_SCALE_MAX) is added to set the max batch scale factor. Whose default value is 5, and users can reduce it when necessary.
Stable-dep-of: 66eca1021a42 ("mm/page_alloc: fix pcp->count race between drain_pages_zone() vs __rmqueue_pcplist()")
--- mm/Kconfig | 11 +++++++++++ mm/page_alloc.c | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-)
mm/Kconfig +11 -0
@@ -704,6 +704,17 @@ config HUGETLB_PAGE_SIZE_VARIABLE config CONTIG_ALLOC def_bool (MEMORY_ISOLATION && COMPACTION) || CMA +config PCP_BATCH_SCALE_MAX + int "Maximum scale factor of PCP (Per-CPU pageset) batch allocate/free" + default 5 + range 0 6 + help + In page allocator, PCP (Per-CPU pageset) is refilled and drained in + batches. The batch number is scaled automatically to improve page + allocation/free throughput. But too large scale factor may hurt + latency. This option sets the upper limit of scale factor to limit + the maximum latency. + config PHYS_ADDR_T_64BIT def_bool 64BIT
mm/page_alloc.c +1 -1
@@ -2343,7 +2343,7 @@ static int nr_pcp_free(struct per_cpu_pages *pcp, int high, bool free_high)* freeing of pages without any allocation. */ batch <<= pcp->free_factor; -if (batch < max_nr_free) +if (batch < max_nr_free && pcp->free_factor <CONFIG_PCP_BATCH_SCALE_MAX ) pcp->free_factor++; batch =clamp (batch, min_nr_free, max_nr_free);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/121 mm: page_alloc: control latency caused by zone PCP draining
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
[ Upstream commit 55f77df7d715110299f12c27f4365bd6332d1adb ]
Patch series "mm/treewide: Remove pXd_huge() API", v2.
In previous work [1], we removed the pXd_large() API, which is arch specific. This patchset further removes the hugetlb pXd_huge() API.
Hugetlb was never special on creating huge mappings when compared with other huge mappings. Having a standalone API just to detect such pgtable entries is more or less redundant, especially after the pXd_leaf() API set is introduced with/without CONFIG_HUGETLB_PAGE.
When looking at this problem, a few issues are also exposed that we don't have a clear definition of the *_huge() variance API. This patchset started by cleaning these issues first, then replace all *_huge() users to use *_leaf(), then drop all *_huge() code.
On x86/sparc, swap entries will be reported "true" in pXd_huge(), while for all the rest archs they're reported "false" instead. This part is done in patch 1-5, in which I suspect patch 1 can be seen as a bug fix, but I'll leave that to hmm experts to decide.
Besides, there are three archs (arm, arm64, powerpc) that have slightly different definitions between the *_huge() v.s. *_leaf() variances. I tackled them separately so that it'll be easier for arch experts to chim in when necessary. This part is done in patch 6-9.
The final patches 10-14 do the rest on the final removal, since *_leaf() will be the ultimate API in the future, and we seem to have quite some confusions on how *_huge() APIs can be defined, provide a rich comment for *_leaf() API set to define them properly to avoid future misuse, and hopefully that'll also help new archs to start support huge mappings and avoid traps (like either swap entries, or PROT_NONE entry checks).
[1] https://lore.kernel.org/r/[email protected]
This patch (of 14):
When the complete PCP is drained a much larger number of pages than the usual batch size might be freed at once, causing large IRQ and preemption latency spikes, as they are all freed while holding the pcp and zone spinlocks.
To avoid those latency spikes, limit the number of pages freed in a single bulk operation to common batch limits.
Stable-dep-of: 66eca1021a42 ("mm/page_alloc: fix pcp->count race between drain_pages_zone() vs __rmqueue_pcplist()")
--- mm/page_alloc.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
mm/page_alloc.c +7 -4
@@ -2185,12 +2185,15 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp)*/ static void drain_pages_zone (unsigned int cpu,struct zone *zone) { -struct per_cpu_pages *pcp; +struct per_cpu_pages *pcp =per_cpu_ptr (zone->per_cpu_pageset, cpu); +int count =READ_ONCE (pcp->count); + +while (count) { +int to_drain =min (count, pcp->batch <<CONFIG_PCP_BATCH_SCALE_MAX ); + count -= to_drain; - pcp =per_cpu_ptr (zone->per_cpu_pageset, cpu); -if (pcp->count) {spin_lock (&pcp->lock); -free_pcppages_bulk (zone, pcp->count, pcp,0 ); +free_pcppages_bulk (zone, to_drain, pcp,0 );spin_unlock (&pcp->lock); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/121 mm/page_alloc: fix pcp->count race between drain_pages_zone() vs __rmqueue_pcplist()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Zhijian <[email protected]>
[ Upstream commit 66eca1021a42856d6af2a9802c99e160278aed91 ]
It's expected that no page should be left in pcp_list after calling zone_pcp_disable() in offline_pages(). Previously, it's observed that offline_pages() gets stuck [1] due to some pages remaining in pcp_list.
Cause:
There is a race condition between drain_pages_zone() and __rmqueue_pcplist() involving the pcp->count variable. See below scenario:
CPU0 CPU1
---------------- ---------------
spin_lock(&pcp->lock);
__rmqueue_pcplist() {
zone_pcp_disable() {
/* list is empty */
if (list_empty(list)) {
/* add pages to pcp_list */
alloced = rmqueue_bulk()
mutex_lock(&pcp_batch_high_lock)
...
__drain_all_pages() {
drain_pages_zone() {
/* read pcp->count, it's 0 here */
count = READ_ONCE(pcp->count)
/* 0 means nothing to drain */
/* update pcp->count */
pcp->count += alloced << order;
...
...
spin_unlock(&pcp->lock);In this case, after calling zone_pcp_disable() though, there are still some pages in pcp_list. And these pages in pcp_list are neither movable nor isolated, offline_pages() gets stuck as a result.
Solution:
Expand the scope of the pcp->lock to also protect pcp->count in drain_pages_zone(), to ensure no pages are left in the pcp list after zone_pcp_disable()
[1] https://lore.kernel.org/linux-mm/[email protected]/
--- mm/page_alloc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
mm/page_alloc.c +11 -7
@@ -2186,16 +2186,20 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp)static void drain_pages_zone (unsigned int cpu,struct zone *zone) {struct per_cpu_pages *pcp =per_cpu_ptr (zone->per_cpu_pageset, cpu); -int count =READ_ONCE (pcp->count); - -while (count) { -int to_drain =min (count, pcp->batch <<CONFIG_PCP_BATCH_SCALE_MAX ); - count -= to_drain; +int count; +do {spin_lock (&pcp->lock); -free_pcppages_bulk (zone, to_drain, pcp,0 ); + count = pcp->count; +if (count) { +int to_drain =min (count, + pcp->batch <<CONFIG_PCP_BATCH_SCALE_MAX ); + +free_pcppages_bulk (zone, to_drain, pcp,0 ); + count -= to_drain; + }spin_unlock (&pcp->lock); - } + }while (count); }/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/121 f2fs: fix to avoid use SSR allocate when do defragment
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Niu <[email protected]>
[ Upstream commit 21327a042dd94bc73181d7300e688699cb1f467e ]
SSR allocate mode will be used when doing file defragment if ATGC is working at the same time, that is because set_page_private_gcing may make CURSEG_ALL_DATA_ATGC segment type got in f2fs_allocate_data_block when defragment page is writeback, which may cause file fragmentation is worse.
A file with 2 fragmentations is changed as following after defragment:
----------------file info-------------------
sensorsdata :
--------------------------------------------
dev [254:48] ino [0x 3029 : 12329] mode [0x 81b0 : 33200] nlink [0x 1 : 1] uid [0x 27e6 : 10214] gid [0x 27e6 : 10214] size [0x 242000 : 2367488] blksize [0x 1000 : 4096] blocks [0x 1210 : 4624]
--------------------------------------------
file_pos start_blk end_blk blks
0 11361121 11361207 87 356352 11361215 11361216 2 364544 11361218 11361218 1 368640 11361220 11361221 2 376832 11361224 11361225 2 385024 11361227 11361238 12 434176 11361240 11361252 13 487424 11361254 11361254 1 491520 11361271 11361279 9 528384 3681794 3681795 2 536576 3681797 3681797 1 540672 3681799 3681799 1 544768 3681803 3681803 1 548864 3681805 3681805 1 552960 3681807 3681807 1 557056 3681809 3681809 1
Stable-dep-of: 8cb1f4080dd9 ("f2fs: assign CURSEG_ALL_DATA_ATGC if blkaddr is valid")
--- fs/f2fs/segment.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/segment.c +2 -1
@@ -3350,7 +3350,8 @@ static int __get_segment_type_6(struct f2fs_io_info *fio)if (page_private_gcing (fio->page)) {if (fio->sbi->am.atgc_enabled && (fio->io_type ==FS_DATA_IO ) && - (fio->sbi->gc_mode !=GC_URGENT_HIGH )) + (fio->sbi->gc_mode !=GC_URGENT_HIGH ) && + !is_inode_flag_set (inode,FI_OPU_WRITE ))return CURSEG_ALL_DATA_ATGC ;else return CURSEG_COLD_DATA ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/121 f2fs: assign CURSEG_ALL_DATA_ATGC if blkaddr is valid
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit 8cb1f4080dd91c6e6b01dbea013a3f42341cb6a1 ]
mkdir /mnt/test/compf2fs_io setflags compression /mnt/test/comp
dd if=/dev/zero of=/mnt/test/comp/testfile bs=16k count=1 truncate --size 13 /mnt/test/comp/testfile
In the above scenario, we can get a BUG_ON.
kernel BUG at fs/f2fs/segment.c:3589!
Call Trace: do_write_page+0x78/0x390 [f2fs] f2fs_outplace_write_data+0x62/0xb0 [f2fs] f2fs_do_write_data_page+0x275/0x740 [f2fs] f2fs_write_single_data_page+0x1dc/0x8f0 [f2fs] f2fs_write_multi_pages+0x1e5/0xae0 [f2fs] f2fs_write_cache_pages+0xab1/0xc60 [f2fs] f2fs_write_data_pages+0x2d8/0x330 [f2fs] do_writepages+0xcf/0x270 __writeback_single_inode+0x44/0x350 writeback_sb_inodes+0x242/0x530 __writeback_inodes_wb+0x54/0xf0 wb_writeback+0x192/0x310 wb_workfn+0x30d/0x400
The reason is we gave CURSEG_ALL_DATA_ATGC to COMPR_ADDR where the page was set the gcing flag by set_cluster_dirty().
--- fs/f2fs/segment.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/segment.c +1 -0
@@ -3351,6 +3351,7 @@ static int __get_segment_type_6(struct f2fs_io_info *fio)if (fio->sbi->am.atgc_enabled && (fio->io_type ==FS_DATA_IO ) && (fio->sbi->gc_mode !=GC_URGENT_HIGH ) && +__is_valid_data_blkaddr (fio->old_blkaddr) && !is_inode_flag_set (inode,FI_OPU_WRITE ))return CURSEG_ALL_DATA_ATGC ;else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/121 dmaengine: fsl-edma: add address for channel mux register in fsl_edma_chan
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit e0a08ed25492b6437e366b347113db484037b9b9 ]
iMX95 move channel mux register to management page address space. This prepare to support iMX95.
Add mux_addr in struct fsl_edma_chan. No function change.
Stable-dep-of: 8ddad5589970 ("dmaengine: fsl-edma: change the memory access from local into remote mode in i.MX 8QM")
--- drivers/dma/fsl-edma-common.c | 6 +++--- drivers/dma/fsl-edma-common.h | 3 +++ drivers/dma/fsl-edma-main.c | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-)
drivers/dma/fsl-edma-common.c +3 -3
@@ -97,8 +97,8 @@ static void fsl_edma3_enable_request(struct fsl_edma_chan *fsl_chan)* ch_mux: With the exception of 0, attempts to write a value * already in use will be forced to 0. */ -if (!edma_readl_chreg (fsl_chan, ch_mux)) -edma_writel_chreg (fsl_chan, fsl_chan->srcid, ch_mux); +if (!edma_readl (fsl_chan->edma, fsl_chan->mux_addr)) +edma_writel (fsl_chan->edma, fsl_chan->srcid, fsl_chan->mux_addr); } val =edma_readl_chreg (fsl_chan, ch_csr);
@@ -134,7 +134,7 @@ static void fsl_edma3_disable_request(struct fsl_edma_chan *fsl_chan) flags =fsl_edma_drvflags (fsl_chan);if (flags &FSL_EDMA_DRV_HAS_CHMUX ) -edma_writel_chreg (fsl_chan,0 , ch_mux); +edma_writel (fsl_chan->edma,0 , fsl_chan->mux_addr); val &= ~EDMA_V3_CH_CSR_ERQ ;edma_writel_chreg (fsl_chan, val, ch_csr);
drivers/dma/fsl-edma-common.h +3 -0
@@ -146,6 +146,7 @@ struct fsl_edma_chan {enum dma_data_direction dma_dir;char chan_name[32 ];struct fsl_edma_hw_tcd __iomem *tcd; +void __iomem *mux_addr;u32 real_count;struct work_struct issue_worker;struct platform_device *pdev;
@@ -207,6 +208,8 @@ struct fsl_edma_drvdata {u32 chreg_off;u32 chreg_space_sz;u32 flags; +u32 mux_off;/* channel mux register offset */ +u32 mux_skip;/* how much skip for each channel */ int (*setup_irq)(struct platform_device *pdev,struct fsl_edma_engine *fsl_edma); };
drivers/dma/fsl-edma-main.c +3 -0
@@ -364,6 +364,8 @@ static struct fsl_edma_drvdata imx93_data4 = { .flags = FSL_EDMA_DRV_HAS_CHMUX | FSL_EDMA_DRV_HAS_DMACLK | FSL_EDMA_DRV_EDMA4, .chreg_space_sz = 0x8000, .chreg_off = 0x10000, + .mux_off = 0x10000 + offsetof(struct fsl_edma3_ch_reg, ch_mux), + .mux_skip = 0x8000, .setup_irq = fsl_edma3_irq_init, };
@@ -540,6 +542,7 @@ static int fsl_edma_probe(struct platform_device *pdev) offsetof(struct fsl_edma3_ch_reg, tcd) : 0; fsl_chan->tcd = fsl_edma->membase + i * drvdata->chreg_space_sz + drvdata->chreg_off + len; + fsl_chan->mux_addr = fsl_edma->membase + drvdata->mux_off + i * drvdata->mux_skip; fsl_chan->pdev = pdev;vchan_init (&fsl_chan->vchan, &fsl_edma->dma_dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/121 dmaengine: fsl-edma: add i.MX8ULP edma support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joy Zou <[email protected]>
[ Upstream commit d8d4355861d874cbd1395ec0edcbe4e0f6940738 ]
Add support for the i.MX8ULP platform to the eDMA driver. Introduce the use of the correct FSL_EDMA_DRV_HAS_CHCLK flag to handle per-channel clock configurations.
Stable-dep-of: 8ddad5589970 ("dmaengine: fsl-edma: change the memory access from local into remote mode in i.MX 8QM")
--- drivers/dma/fsl-edma-common.c | 6 ++++++ drivers/dma/fsl-edma-main.c | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+)
drivers/dma/fsl-edma-common.c +6 -0
@@ -3,6 +3,7 @@// Copyright (c) 2013-2014 Freescale Semiconductor, Inc // Copyright (c) 2017 Sysam, Angelo Dureghello <[email protected]> +#include <linux/clk.h> #include <linux/dmapool.h> #include <linux/module.h> #include <linux/slab.h>
@@ -802,6 +803,9 @@ int fsl_edma_alloc_chan_resources(struct dma_chan *chan) {struct fsl_edma_chan *fsl_chan =to_fsl_edma_chan (chan); +if (fsl_edma_drvflags (fsl_chan) &FSL_EDMA_DRV_HAS_CHCLK ) +clk_prepare_enable (fsl_chan->clk); + fsl_chan->tcd_pool =dma_pool_create ("tcd_pool" , chan->device->dev,sizeof (struct fsl_edma_hw_tcd ),32 ,0 );
@@ -829,6 +833,8 @@ void fsl_edma_free_chan_resources(struct dma_chan *chan) fsl_chan->tcd_pool =NULL ; fsl_chan->is_sw = false; fsl_chan->srcid =0 ; +if (fsl_edma_drvflags (fsl_chan) &FSL_EDMA_DRV_HAS_CHCLK ) +clk_disable_unprepare (fsl_chan->clk); }void fsl_edma_cleanup_vchan (struct dma_device *dmadev)
drivers/dma/fsl-edma-main.c +22 -0
@@ -353,6 +353,16 @@ static struct fsl_edma_drvdata imx8qm_audio_data = { .setup_irq = fsl_edma3_irq_init, }; +static struct fsl_edma_drvdata imx8ulp_data = { + .flags =FSL_EDMA_DRV_HAS_CHMUX |FSL_EDMA_DRV_HAS_CHCLK |FSL_EDMA_DRV_HAS_DMACLK | +FSL_EDMA_DRV_EDMA3 , + .chreg_space_sz =0x10000 , + .chreg_off =0x10000 , + .mux_off =0x10000 + offsetof(struct fsl_edma3_ch_reg , ch_mux), + .mux_skip =0x10000 , + .setup_irq = fsl_edma3_irq_init, +}; +static struct fsl_edma_drvdata imx93_data3 = { .flags =FSL_EDMA_DRV_HAS_DMACLK |FSL_EDMA_DRV_EDMA3 , .chreg_space_sz =0x10000 ,
@@ -375,6 +385,7 @@ static const struct of_device_id fsl_edma_dt_ids[] = { { .compatible = "fsl,imx7ulp-edma", .data = &imx7ulp_data}, { .compatible = "fsl,imx8qm-edma", .data = &imx8qm_data}, { .compatible = "fsl,imx8qm-adma", .data = &imx8qm_audio_data}, + { .compatible = "fsl,imx8ulp-edma", .data = &imx8ulp_data}, { .compatible = "fsl,imx93-edma3", .data = &imx93_data3}, { .compatible = "fsl,imx93-edma4", .data = &imx93_data4}, {/* sentinel */ }
@@ -429,6 +440,7 @@ static int fsl_edma_probe(struct platform_device *pdev)struct fsl_edma_engine *fsl_edma;const struct fsl_edma_drvdata *drvdata =NULL ;u32 chan_mask[2 ] = {0 ,0 }; +char clk_name[36 ];struct edma_regs *regs;int chans;int ret, i;
@@ -544,11 +556,21 @@ static int fsl_edma_probe(struct platform_device *pdev) + i * drvdata->chreg_space_sz + drvdata->chreg_off + len; fsl_chan->mux_addr = fsl_edma->membase + drvdata->mux_off + i * drvdata->mux_skip; +if (drvdata->flags &FSL_EDMA_DRV_HAS_CHCLK ) { +snprintf (clk_name,sizeof (clk_name),"ch%02d" , i); + fsl_chan->clk =devm_clk_get_enabled (&pdev->dev, + (const char *)clk_name); + +if (IS_ERR (fsl_chan->clk)) +return PTR_ERR (fsl_chan->clk); + } fsl_chan->pdev = pdev;vchan_init (&fsl_chan->vchan, &fsl_edma->dma_dev);edma_write_tcdreg (fsl_chan,0 , csr);fsl_edma_chan_mux (fsl_chan,0 , false); +if (fsl_chan->edma->drvdata->flags &FSL_EDMA_DRV_HAS_CHCLK ) +clk_disable_unprepare (fsl_chan->clk); } ret = fsl_edma->drvdata->setup_irq (pdev, fsl_edma);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/121 dmaengine: fsl-edma: clean up unused "fsl,imx8qm-adma" compatible string
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joy Zou <[email protected]>
[ Upstream commit 77584368a0f3d9eba112c3df69f1df7f282dbfe9 ]
The eDMA hardware issue only exist imx8QM A0. A0 never mass production. So remove the workaround safely.
Stable-dep-of: 8ddad5589970 ("dmaengine: fsl-edma: change the memory access from local into remote mode in i.MX 8QM")
--- drivers/dma/fsl-edma-common.c | 16 ++++------------ drivers/dma/fsl-edma-common.h | 2 -- drivers/dma/fsl-edma-main.c | 8 -------- 3 files changed, 4 insertions(+), 22 deletions(-)
drivers/dma/fsl-edma-common.c +4 -12
@@ -75,18 +75,10 @@ static void fsl_edma3_enable_request(struct fsl_edma_chan *fsl_chan) flags =fsl_edma_drvflags (fsl_chan); val =edma_readl_chreg (fsl_chan, ch_sbr); -/* Remote/local swapped wrongly on iMX8 QM Audio edma */ -if (flags &FSL_EDMA_DRV_QUIRK_SWAPPED ) { -if (!fsl_chan->is_rxchan) - val |=EDMA_V3_CH_SBR_RD ; -else - val |=EDMA_V3_CH_SBR_WR ; - }else { -if (fsl_chan->is_rxchan) - val |=EDMA_V3_CH_SBR_RD ; -else - val |=EDMA_V3_CH_SBR_WR ; - } +if (fsl_chan->is_rxchan) + val |=EDMA_V3_CH_SBR_RD ; +else + val |=EDMA_V3_CH_SBR_WR ;if (fsl_chan->is_remote) val &= ~(EDMA_V3_CH_SBR_RD |EDMA_V3_CH_SBR_WR );
drivers/dma/fsl-edma-common.h +0 -2
@@ -178,8 +178,6 @@ struct fsl_edma_desc {#define FSL_EDMA_DRV_HAS_PD BIT(5)#define FSL_EDMA_DRV_HAS_CHCLK BIT(6)#define FSL_EDMA_DRV_HAS_CHMUX BIT(7) -/* imx8 QM audio edma remote local swapped */ -#define FSL_EDMA_DRV_QUIRK_SWAPPED BIT(8)/* control and status register is in tcd address space, edma3 reg layout */ #define FSL_EDMA_DRV_SPLIT_REG BIT(9)#define FSL_EDMA_DRV_BUS_8BYTE BIT(10)
drivers/dma/fsl-edma-main.c +0 -8
@@ -346,13 +346,6 @@ static struct fsl_edma_drvdata imx8qm_data = { .setup_irq = fsl_edma3_irq_init, }; -static struct fsl_edma_drvdata imx8qm_audio_data = { - .flags =FSL_EDMA_DRV_QUIRK_SWAPPED |FSL_EDMA_DRV_HAS_PD |FSL_EDMA_DRV_EDMA3 , - .chreg_space_sz =0x10000 , - .chreg_off =0x10000 , - .setup_irq = fsl_edma3_irq_init, -}; -static struct fsl_edma_drvdata imx8ulp_data = { .flags =FSL_EDMA_DRV_HAS_CHMUX |FSL_EDMA_DRV_HAS_CHCLK |FSL_EDMA_DRV_HAS_DMACLK |FSL_EDMA_DRV_EDMA3 ,
@@ -384,7 +377,6 @@ static const struct of_device_id fsl_edma_dt_ids[] = { { .compatible = "fsl,ls1028a-edma", .data = &ls1028a_data}, { .compatible = "fsl,imx7ulp-edma", .data = &imx7ulp_data}, { .compatible = "fsl,imx8qm-edma", .data = &imx8qm_data}, - { .compatible = "fsl,imx8qm-adma", .data = &imx8qm_audio_data}, { .compatible = "fsl,imx8ulp-edma", .data = &imx8ulp_data}, { .compatible = "fsl,imx93-edma3", .data = &imx93_data3}, { .compatible = "fsl,imx93-edma4", .data = &imx93_data4},
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 45/121 dmaengine: fsl-edma: change the memory access from local into remote mode in i.MX 8QM
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joy Zou <[email protected]>
[ Upstream commit 8ddad558997002ce67980e30c9e8dfaa696e163b ]
Fix the issue where MEM_TO_MEM fail on i.MX8QM due to the requirement that both source and destination addresses need pass through the IOMMU. Typically, peripheral FIFO addresses bypass the IOMMU, necessitating only one of the source or destination to go through it.
Set "is_remote" to true to ensure both source and destination addresses pass through the IOMMU.
iMX8 Spec define "Local" and "Remote" bus as below.
Local bus: bypass IOMMU to directly access other peripheral register, such as FIFO.
Remote bus: go through IOMMU to access system memory.
The test fail log as follow:
[ 66.268506] dmatest: dma0chan0-copy0: result #1: 'test timed out' with src_off=0x100 dst_off=0x80 len=0x3ec0 (0) [ 66.278785] dmatest: dma0chan0-copy0: summary 1 tests, 1 failures 0.32 iops 4 KB/s (0)
--- drivers/dma/fsl-edma-common.c | 3 +++ drivers/dma/fsl-edma-common.h | 1 + drivers/dma/fsl-edma-main.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-)
drivers/dma/fsl-edma-common.c +3 -0
@@ -747,6 +747,8 @@ struct dma_async_tx_descriptor *fsl_edma_prep_memcpy(struct dma_chan *chan, fsl_desc->iscyclic = false; fsl_chan->is_sw = true; +if (fsl_edma_drvflags (fsl_chan) &FSL_EDMA_DRV_MEM_REMOTE ) + fsl_chan->is_remote = true;/* To match with copy_align and max_seg_size so 1 tcd is enough */ fsl_edma_fill_tcd(fsl_chan, fsl_desc->tcd[0].vtcd, dma_src, dma_dst,
@@ -825,6 +827,7 @@ void fsl_edma_free_chan_resources(struct dma_chan *chan) fsl_chan->tcd_pool =NULL ; fsl_chan->is_sw = false; fsl_chan->srcid =0 ; + fsl_chan->is_remote = false;if (fsl_edma_drvflags (fsl_chan) &FSL_EDMA_DRV_HAS_CHCLK )clk_disable_unprepare (fsl_chan->clk); }
drivers/dma/fsl-edma-common.h +1 -0
@@ -178,6 +178,7 @@ struct fsl_edma_desc {#define FSL_EDMA_DRV_HAS_PD BIT(5)#define FSL_EDMA_DRV_HAS_CHCLK BIT(6)#define FSL_EDMA_DRV_HAS_CHMUX BIT(7) +#define FSL_EDMA_DRV_MEM_REMOTE BIT(8)/* control and status register is in tcd address space, edma3 reg layout */ #define FSL_EDMA_DRV_SPLIT_REG BIT(9)#define FSL_EDMA_DRV_BUS_8BYTE BIT(10)
drivers/dma/fsl-edma-main.c +1 -1
@@ -340,7 +340,7 @@ static struct fsl_edma_drvdata imx7ulp_data = { };static struct fsl_edma_drvdata imx8qm_data = { - .flags =FSL_EDMA_DRV_HAS_PD |FSL_EDMA_DRV_EDMA3 , + .flags =FSL_EDMA_DRV_HAS_PD |FSL_EDMA_DRV_EDMA3 |FSL_EDMA_DRV_MEM_REMOTE , .chreg_space_sz =0x10000 , .chreg_off =0x10000 , .setup_irq = fsl_edma3_irq_init,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/121 perf: imx_perf: fix counter start and config sequence
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Yang <[email protected]>
[ Upstream commit ac9aa295f7a89d38656739628796f086f0b160e2 ]
In current driver, the counter will start firstly and then be configured. This sequence is not correct for AXI filter events since the correct AXI_MASK and AXI_ID are not set yet. Then the results may be inaccurate.
--- drivers/perf/fsl_imx9_ddr_perf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/perf/fsl_imx9_ddr_perf.c +3 -3
@@ -476,12 +476,12 @@ static int ddr_perf_event_add(struct perf_event *event, int flags) hwc->idx = counter; hwc->state |=PERF_HES_STOPPED ; -if (flags &PERF_EF_START ) -ddr_perf_event_start (event, flags); -/* read trans, write trans, read beat */ ddr_perf_monitor_config (pmu, cfg, cfg1, cfg2); +if (flags &PERF_EF_START ) +ddr_perf_event_start (event, flags); +return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/121 MIPS: Loongson64: DTS: Fix PCIe port nodes for ls7a
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
[ Upstream commit d89a415ff8d5e0aad4963f2d8ebb0f9e8110b7fa ]
Add various required properties to silent warnings:
arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi:116.16-297.5: Warning (interrupt_provider): /bus@10000000/pci@1a000000: '#interrupt-cells' found, but node is not an interrupt provider arch/mips/boot/dts/loongson/loongson64_2core_2k1000.dtb: Warning (interrupt_map): Failed prerequisite 'interrupt_provider'
Stable-dep-of: dbb69b9d6234 ("MIPS: dts: loongson: Fix liointc IRQ polarity")
--- .../boot/dts/loongson/loongson64-2k1000.dtsi | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-)
arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +30 -7
@@ -117,7 +117,6 @@ pci@1a000000 { device_type = "pci"; #address-cells = <3>; #size-cells = <2>; - #interrupt-cells = <2>; reg = <0 0x1a000000 0 0x02000000>, <0xfe 0x00000000 0 0x20000000>;
@@ -205,93 +204,117 @@ sata@8,0 { interrupt-parent = <&liointc0>; }; - pci_bridge@9,0 { + pcie@9,0 { compatible = "pci0014,7a19.0", "pci0014,7a19", "pciclass060400", "pciclass0604"; reg = <0x4800 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <0 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 0 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; }; - pci_bridge@a,0 { + pcie@a,0 { compatible = "pci0014,7a09.0", "pci0014,7a09", "pciclass060400", "pciclass0604"; reg = <0x5000 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <1 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 1 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; }; - pci_bridge@b,0 { + pcie@b,0 { compatible = "pci0014,7a09.0", "pci0014,7a09", "pciclass060400", "pciclass0604"; reg = <0x5800 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <2 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 2 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; }; - pci_bridge@c,0 { + pcie@c,0 { compatible = "pci0014,7a09.0", "pci0014,7a09", "pciclass060400", "pciclass0604"; reg = <0x6000 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <3 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 3 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; }; - pci_bridge@d,0 { + pcie@d,0 { compatible = "pci0014,7a19.0", "pci0014,7a19", "pciclass060400", "pciclass0604"; reg = <0x6800 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <4 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 4 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; }; - pci_bridge@e,0 { + pcie@e,0 { compatible = "pci0014,7a09.0", "pci0014,7a09", "pciclass060400", "pciclass0604"; reg = <0x7000 0x0 0x0 0x0 0x0>; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; #interrupt-cells = <1>; interrupts = <5 IRQ_TYPE_LEVEL_LOW>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; interrupt-map = <0 0 0 0 &liointc1 5 IRQ_TYPE_LEVEL_LOW>; + ranges; external-facing; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/121 MIPS: dts: loongson: Fix liointc IRQ polarity
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
[ Upstream commit dbb69b9d6234aad23b3ecd33e5bc8a8ae1485b7d ]
All internal liointc interrupts are high level triggered.
--- .../boot/dts/loongson/loongson64-2k1000.dtsi | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-)
arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +21 -21
@@ -100,7 +100,7 @@ rtc0: rtc@1fe07800 { compatible = "loongson,ls2k1000-rtc"; reg = <0 0x1fe07800 0 0x78>; interrupt-parent = <&liointc0>; - interrupts = <60 IRQ_TYPE_LEVEL_LOW>; + interrupts = <60 IRQ_TYPE_LEVEL_HIGH>; }; uart0: serial@1fe00000 {
@@ -108,7 +108,7 @@ uart0: serial@1fe00000 { reg = <0 0x1fe00000 0 0x8>; clock-frequency = <125000000>; interrupt-parent = <&liointc0>; - interrupts = <0 IRQ_TYPE_LEVEL_LOW>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; no-loopback-test; };
@@ -131,8 +131,8 @@ gmac@3,0 { "pciclass0c03"; reg = <0x1800 0x0 0x0 0x0 0x0>; - interrupts = <12 IRQ_TYPE_LEVEL_LOW>, - <13 IRQ_TYPE_LEVEL_LOW>; + interrupts = <12 IRQ_TYPE_LEVEL_HIGH>, + <13 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "macirq", "eth_lpi"; interrupt-parent = <&liointc0>; phy-mode = "rgmii-id";
@@ -155,8 +155,8 @@ gmac@3,1 { "loongson, pci-gmac"; reg = <0x1900 0x0 0x0 0x0 0x0>; - interrupts = <14 IRQ_TYPE_LEVEL_LOW>, - <15 IRQ_TYPE_LEVEL_LOW>; + interrupts = <14 IRQ_TYPE_LEVEL_HIGH>, + <15 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "macirq", "eth_lpi"; interrupt-parent = <&liointc0>; phy-mode = "rgmii-id";
@@ -178,7 +178,7 @@ ehci@4,1 { "pciclass0c03"; reg = <0x2100 0x0 0x0 0x0 0x0>; - interrupts = <18 IRQ_TYPE_LEVEL_LOW>; + interrupts = <18 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; };
@@ -189,7 +189,7 @@ ohci@4,2 { "pciclass0c03"; reg = <0x2200 0x0 0x0 0x0 0x0>; - interrupts = <19 IRQ_TYPE_LEVEL_LOW>; + interrupts = <19 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; };
@@ -200,7 +200,7 @@ sata@8,0 { "pciclass0106"; reg = <0x4000 0x0 0x0 0x0 0x0>; - interrupts = <19 IRQ_TYPE_LEVEL_LOW>; + interrupts = <19 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc0>; };
@@ -215,10 +215,10 @@ pcie@9,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <0 IRQ_TYPE_LEVEL_LOW>; + interrupts = <0 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 0 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 0 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
@@ -234,10 +234,10 @@ pcie@a,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <1 IRQ_TYPE_LEVEL_LOW>; + interrupts = <1 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 1 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 1 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
@@ -253,10 +253,10 @@ pcie@b,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <2 IRQ_TYPE_LEVEL_LOW>; + interrupts = <2 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 2 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 2 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
@@ -272,10 +272,10 @@ pcie@c,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <3 IRQ_TYPE_LEVEL_LOW>; + interrupts = <3 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 3 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 3 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
@@ -291,10 +291,10 @@ pcie@d,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <4 IRQ_TYPE_LEVEL_LOW>; + interrupts = <4 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 4 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 4 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
@@ -310,10 +310,10 @@ pcie@e,0 { #size-cells = <2>; device_type = "pci"; #interrupt-cells = <1>; - interrupts = <5 IRQ_TYPE_LEVEL_LOW>; + interrupts = <5 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&liointc1>; interrupt-map-mask = <0 0 0 0>; - interrupt-map = <0 0 0 0 &liointc1 5 IRQ_TYPE_LEVEL_LOW>; + interrupt-map = <0 0 0 0 &liointc1 5 IRQ_TYPE_LEVEL_HIGH>; ranges; external-facing; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/121 MIPS: dts: loongson: Fix ls2k1000-rtc interrupt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
[ Upstream commit f70fd92df7529e7283e02a6c3a2510075f13ba30 ]
The correct interrupt line for RTC is line 8 on liointc1.
--- arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +2 -2
@@ -99,8 +99,8 @@ liointc1: interrupt-controller@1fe11440 { rtc0: rtc@1fe07800 { compatible = "loongson,ls2k1000-rtc"; reg = <0 0x1fe07800 0 0x78>; - interrupt-parent = <&liointc0>; - interrupts = <60 IRQ_TYPE_LEVEL_HIGH>; + interrupt-parent = <&liointc1>; + interrupts = <8 IRQ_TYPE_LEVEL_HIGH>; }; uart0: serial@1fe00000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/121 ARM: 9406/1: Fix callchain_trace() return value
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 4e7b4ff2dcaed228cb2fb7bfe720262c98ec1bb9 ]
perf_callchain_store() return 0 on success, -1 otherwise, fix callchain_trace() to return correct bool value. So walk_stackframe() can have a chance to stop walking the stack ahead.
--- arch/arm/kernel/perf_callchain.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/arm/kernel/perf_callchain.c +1 -2
@@ -85,8 +85,7 @@ static bool callchain_trace(void *data, unsigned long pc) {struct perf_callchain_entry_ctx *entry = data; -perf_callchain_store (entry, pc); -return true; +return perf_callchain_store (entry, pc) ==0 ; }void
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/121 HID: amd_sfh: Move sensor discovery before HID device initialization
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Basavaraj Natikar <[email protected]>
[ Upstream commit 8031b001da700474c11d28629581480b12a0d8d4 ]
Sensors discovery is independent of HID device initialization. If sensor discovery fails after HID initialization, then the HID device needs to be deinitialized. Therefore, sensors discovery should be moved before HID device initialization.
--- drivers/hid/amd-sfh-hid/amd_sfh_client.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
drivers/hid/amd-sfh-hid/amd_sfh_client.c +11 -7
@@ -288,12 +288,22 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) mp2_ops->start (privdata, info); cl_data->sensor_sts[i] =amd_sfh_wait_for_response (privdata, cl_data->sensor_idx[i],SENSOR_ENABLED ); + +if (cl_data->sensor_sts[i] ==SENSOR_ENABLED ) + cl_data->is_any_sensor_enabled = true; + } + +if (!cl_data->is_any_sensor_enabled || + (mp2_ops->discovery_status && mp2_ops->discovery_status (privdata) ==0 )) { +dev_warn (dev,"Failed to discover, sensors not enabled is %d\n" , + cl_data->is_any_sensor_enabled); + rc = -EOPNOTSUPP ; + goto cleanup; }for (i =0 ; i < cl_data->num_hid_devices; i++) { cl_data->cur_hid_dev = i;if (cl_data->sensor_sts[i] ==SENSOR_ENABLED ) { - cl_data->is_any_sensor_enabled = true; rc =amdtp_hid_probe (i, cl_data);if (rc) goto cleanup;
@@ -305,12 +315,6 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata) cl_data->sensor_sts[i]); } -if (!cl_data->is_any_sensor_enabled || - (mp2_ops->discovery_status && mp2_ops->discovery_status (privdata) ==0 )) { -dev_warn (dev,"Failed to discover, sensors not enabled is %d\n" , cl_data->is_any_sensor_enabled); - rc = -EOPNOTSUPP ; - goto cleanup; - }schedule_delayed_work (&cl_data->work_buffer,msecs_to_jiffies (AMD_SFH_IDLE_LOOP ));return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/121 perf tool: fix dereferencing NULL al->maps
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Casey Chen <[email protected]>
[ Upstream commit 4c17736689ccfc44ec7dcc472577f25c34cf8724 ]
With 0dd5041c9a0e ("perf addr_location: Add init/exit/copy functions"), when cpumode is 3 (macro PERF_RECORD_MISC_HYPERVISOR), thread__find_map() could return with al->maps being NULL.
The path below could add a callchain_cursor_node with NULL ms.maps.
add_callchain_ip()
thread__find_symbol(.., &al)
thread__find_map(.., &al) // al->maps becomes NULL
ms.maps = maps__get(al.maps)
callchain_cursor_append(..., &ms, ...)
node->ms.maps = maps__get(ms->maps)Then the path below would dereference NULL maps and get segfault.
fill_callchain_info()
maps__machine(node->ms.maps);
Fix it by checking if maps is NULL in fill_callchain_info().
--- tools/perf/util/callchain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/callchain.c +1 -1
@@ -1126,7 +1126,7 @@ int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *sampint fill_callchain_info (struct addr_location *al,struct callchain_cursor_node *node,bool hide_unresolved) { -struct machine *machine =maps__machine (node->ms.maps); +struct machine *machine = node->ms.maps ?maps__machine (node->ms.maps) :NULL ;maps__put (al->maps); al->maps =maps__get (node->ms.maps);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/121 drm/nouveau: prime: fix refcount underflow
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danilo Krummrich <[email protected]>
[ Upstream commit a9bf3efc33f1fbf88787a277f7349459283c9b95 ]
Calling nouveau_bo_ref() on a nouveau_bo without initializing it (and hence the backing ttm_bo) leads to a refcount underflow.
Instead of calling nouveau_bo_ref() in the unwind path of drm_gem_object_init(), clean things up manually.
--- drivers/gpu/drm/nouveau/nouveau_prime.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nouveau_prime.c +2 -1
@@ -64,7 +64,8 @@ struct drm_gem_object *nouveau_gem_prime_import_sg_table(struct drm_device *dev,* to the caller, instead of a normal nouveau_bo ttm reference. */ ret =drm_gem_object_init (dev, &nvbo->bo.base, size);if (ret) { -nouveau_bo_ref (NULL , &nvbo); +drm_gem_object_release (&nvbo->bo.base); +kfree (nvbo); obj =ERR_PTR (-ENOMEM ); goto unlock; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/121 drm/vmwgfx: Fix overlay when using Screen Targets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Forbes <[email protected]>
[ Upstream commit cb372a505a994cb39aa75acfb8b3bcf94787cf94 ]
This code was never updated to support Screen Targets.
Fixes a bug where Xv playback displays a green screen instead of actual video contents when 3D acceleration is disabled in the guest.
--- drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_overlay.c +1 -1
@@ -92,7 +92,7 @@ static int vmw_overlay_send_put(struct vmw_private *dev_priv, {struct vmw_escape_video_flush *flush;size_t fifo_size; -bool have_so = (dev_priv->active_display_unit == vmw_du_screen_object); +bool have_so = (dev_priv->active_display_unit != vmw_du_legacy);int i, num_items;SVGAGuestPtr ptr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/121 drm/vmwgfx: Trigger a modeset when the screen moves
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Forbes <[email protected]>
[ Upstream commit 75c3e8a26a35d4f3eee299b3cc7e465f166f4e2d ]
When multi-monitor is cycled the X,Y position of the Screen Target will likely change but the resolution will not. We need to trigger a modeset when this occurs in order to recreate the Screen Target with the correct X,Y position.
Fixes a bug where multiple displays are shown in a single scrollable host window rather than in 2+ windows on separate host displays.
--- drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 29 +++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c +28 -1
@@ -868,6 +868,32 @@ vmw_stdu_connector_mode_valid(struct drm_connector *connector,return MODE_OK ; } +/* +* Trigger a modeset if the X,Y position of the Screen Target changes. +* This is needed when multi-mon is cycled. The original Screen Target will have +* the same mode but its relative X,Y position in the topology will change. +*/ +static int vmw_stdu_connector_atomic_check (struct drm_connector *conn, +struct drm_atomic_state *state) +{ +struct drm_connector_state *conn_state; +struct vmw_screen_target_display_unit *du; +struct drm_crtc_state *new_crtc_state; + + conn_state =drm_atomic_get_connector_state (state, conn); + du =vmw_connector_to_stdu (conn); + +if (!conn_state->crtc) +return 0 ; + + new_crtc_state =drm_atomic_get_new_crtc_state (state, conn_state->crtc); +if (du->base.gui_x != du->base.set_gui_x || + du->base.gui_y != du->base.set_gui_y) + new_crtc_state->mode_changed = true; + +return 0 ; +} +static const struct drm_connector_funcs vmw_stdu_connector_funcs = { .dpms = vmw_du_connector_dpms, .detect = vmw_du_connector_detect,
@@ -882,7 +908,8 @@ static const struct drm_connector_funcs vmw_stdu_connector_funcs = {static const struct drm_connector_helper_funcs vmw_stdu_connector_helper_funcs = { .get_modes = vmw_connector_get_modes, - .mode_valid = vmw_stdu_connector_mode_valid + .mode_valid = vmw_stdu_connector_mode_valid, + .atomic_check = vmw_stdu_connector_atomic_check, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/121 sched: act_ct: take care of padding in struct zones_ht_key
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 2191a54f63225b548fd8346be3611c3219a24738 ]
Blamed commit increased lookup key size from 2 bytes to 16 bytes, because zones_ht_key got a struct net pointer.
Make sure rhashtable_lookup() is not using the padding bytes which are not initialized.
BUG: KMSAN: uninit-value in rht_ptr_rcu include/linux/rhashtable.h:376 [inline] BUG: KMSAN: uninit-value in __rhashtable_lookup include/linux/rhashtable.h:607 [inline] BUG: KMSAN: uninit-value in rhashtable_lookup include/linux/rhashtable.h:646 [inline] BUG: KMSAN: uninit-value in rhashtable_lookup_fast include/linux/rhashtable.h:672 [inline] BUG: KMSAN: uninit-value in tcf_ct_flow_table_get+0x611/0x2260 net/sched/act_ct.c:329 rht_ptr_rcu include/linux/rhashtable.h:376 [inline] __rhashtable_lookup include/linux/rhashtable.h:607 [inline] rhashtable_lookup include/linux/rhashtable.h:646 [inline] rhashtable_lookup_fast include/linux/rhashtable.h:672 [inline] tcf_ct_flow_table_get+0x611/0x2260 net/sched/act_ct.c:329 tcf_ct_init+0xa67/0x2890 net/sched/act_ct.c:1408 tcf_action_init_1+0x6cc/0xb30 net/sched/act_api.c:1425 tcf_action_init+0x458/0xf00 net/sched/act_api.c:1488 tcf_action_add net/sched/act_api.c:2061 [inline] tc_ctl_action+0x4be/0x19d0 net/sched/act_api.c:2118 rtnetlink_rcv_msg+0x12fc/0x1410 net/core/rtnetlink.c:6647 netlink_rcv_skb+0x375/0x650 net/netlink/af_netlink.c:2550 rtnetlink_rcv+0x34/0x40 net/core/rtnetlink.c:6665 netlink_unicast_kernel net/netlink/af_netlink.c:1331 [inline] netlink_unicast+0xf52/0x1260 net/netlink/af_netlink.c:1357 netlink_sendmsg+0x10da/0x11e0 net/netlink/af_netlink.c:1901 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x30f/0x380 net/socket.c:745 ____sys_sendmsg+0x877/0xb60 net/socket.c:2597 ___sys_sendmsg+0x28d/0x3c0 net/socket.c:2651 __sys_sendmsg net/socket.c:2680 [inline] __do_sys_sendmsg net/socket.c:2689 [inline] __se_sys_sendmsg net/socket.c:2687 [inline] __x64_sys_sendmsg+0x307/0x4a0 net/socket.c:2687 x64_sys_call+0x2dd6/0x3c10 arch/x86/include/generated/asm/syscalls_64.h:47 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xcd/0x1e0 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
Local variable key created at:
tcf_ct_flow_table_get+0x4a/0x2260 net/sched/act_ct.c:324 tcf_ct_init+0xa67/0x2890 net/sched/act_ct.c:1408
--- net/sched/act_ct.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/sched/act_ct.c +3 -1
@@ -44,6 +44,8 @@ static DEFINE_MUTEX(zones_mutex);struct zones_ht_key {struct net *net;u16 zone; +/* Note : pad[] must be the last field. */ +u8 pad[]; };struct tcf_ct_flow_table {
@@ -60,7 +62,7 @@ struct tcf_ct_flow_table {static const struct rhashtable_params zones_params = { .head_offset = offsetof(struct tcf_ct_flow_table , node), .key_offset = offsetof(struct tcf_ct_flow_table , key), - .key_len = sizeof_field(struct tcf_ct_flow_table, key), + .key_len = offsetof(struct zones_ht_key , pad), .automatic_shrinking = true, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 57/121 wifi: cfg80211: fix reporting failed MLO links status with cfg80211_connect_done
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Veerendranath Jakkam <[email protected]>
[ Upstream commit baeaabf970b9a90999f62ae27edf63f6cb86c023 ]
Individual MLO links connection status is not copied to EVENT_CONNECT_RESULT data while processing the connect response information in cfg80211_connect_done(). Due to this failed links are wrongly indicated with success status in EVENT_CONNECT_RESULT.
To fix this, copy the individual MLO links status to the EVENT_CONNECT_RESULT data.
--- net/wireless/sme.c | 1 + 1 file changed, 1 insertion(+)
net/wireless/sme.c +1 -0
@@ -1057,6 +1057,7 @@ void cfg80211_connect_done(struct net_device *dev,cfg80211_hold_bss (bss_from_pub (params->links[link].bss)); ev->cr.links[link].bss = params->links[link].bss; + ev->cr.links[link].status = params->links[link].status;if (params->links[link].addr) { ev->cr.links[link].addr = next;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/121 net: phy: realtek: add support for RTL8366S Gigabit PHY
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Mentovai <[email protected]>
[ Upstream commit 225990c487c1023e7b3aa89beb6a68011fbc0461 ]
The PHY built in to the Realtek RTL8366S switch controller was previously supported by genphy_driver. This PHY does not implement MMD operations. Since commit 9b01c885be36 ("net: phy: c22: migrate to genphy_c45_write_eee_adv()"), MMD register reads have been made during phy_probe to determine EEE support. For genphy_driver, these reads are transformed into 802.3 annex 22D clause 45-over-clause 22 mmd_phy_indirect operations that perform MII register writes to MII_MMD_CTRL and MII_MMD_DATA. This overwrites those two MII registers, which on this PHY are reserved and have another function, rendering the PHY unusable while so configured.
Proper support for this PHY is restored by providing a phy_driver that declares MMD operations as unsupported by using the helper functions provided for that purpose, while remaining otherwise identical to genphy_driver.
--- drivers/net/phy/realtek.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/phy/realtek.c +7 -0
@@ -1083,6 +1083,13 @@ static struct phy_driver realtek_drvs[] = { .handle_interrupt = genphy_handle_interrupt_no_ack, .suspend = genphy_suspend, .resume = genphy_resume, + }, { + PHY_ID_MATCH_EXACT(0x001cc960), + .name = "RTL8366S Gigabit Ethernet", + .suspend = genphy_suspend, + .resume = genphy_resume, + .read_mmd = genphy_read_mmd_unsupported, + .write_mmd = genphy_write_mmd_unsupported, }, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/121 ALSA: hda: conexant: Reduce CONFIG_PM dependencies
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 29d57f6dc62485ee0752767debdfa2783d162beb ]
CONFIG_PM dependencies got reduced in HD-audio codec core driver, and now it's time to reduce in HD-audio conexant codec driver, too.
Simply drop CONFIG_PM ifdefs.
Stable-dep-of: e60dc9812211 ("ALSA: hda: conexant: Fix headset auto detect fail in the polling mode")
--- sound/pci/hda/patch_conexant.c | 4 ---- 1 file changed, 4 deletions(-)
sound/pci/hda/patch_conexant.c +0 -4
@@ -294,13 +294,11 @@ static void cx_jack_unsol_event(struct hda_codec *codec, unsigned int res)snd_hda_jack_unsol_event (codec, res); } -#ifdef CONFIG_PM static int cx_auto_suspend (struct hda_codec *codec) {cx_auto_shutdown (codec);return 0 ; } -#endif static const struct hda_codec_ops cx_auto_patch_ops = { .build_controls = snd_hda_gen_build_controls,
@@ -308,10 +306,8 @@ static const struct hda_codec_ops cx_auto_patch_ops = { .init = cx_auto_init, .free = cx_auto_free, .unsol_event = cx_jack_unsol_event, -#ifdef CONFIG_PM .suspend = cx_auto_suspend, .check_power_status = snd_hda_gen_check_power_status, -#endif };/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/121 ALSA: hda: conexant: Fix headset auto detect fail in the polling mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: songxiebing <[email protected]>
[ Upstream commit e60dc98122110594d0290845160f12916192fc6d ]
The previous fix (7aeb25908648) only handles the unsol_event reporting during interrupts and does not include the polling mode used to set jackroll_ms, so now we are replacing it with snd_hda_jack_detect_enable_callback.
--- sound/pci/hda/patch_conexant.c | 54 ++++++---------------------------- 1 file changed, 9 insertions(+), 45 deletions(-)
sound/pci/hda/patch_conexant.c +9 -45
@@ -21,12 +21,6 @@#include "hda_jack.h" #include "hda_generic.h" -enum { -CX_HEADSET_NOPRESENT =0 , -CX_HEADSET_PARTPRESENT , -CX_HEADSET_ALLPRESENT , -}; -struct conexant_spec {struct hda_gen_spec gen;
@@ -48,7 +42,6 @@ struct conexant_spec {unsigned int gpio_led;unsigned int gpio_mute_led_mask;unsigned int gpio_mic_led_mask; -unsigned int headset_present_flag;bool is_cx8070_sn6140; };
@@ -250,48 +243,19 @@ static void cx_process_headset_plugin(struct hda_codec *codec) } } -static void cx_update_headset_mic_vref (struct hda_codec *codec,unsigned int res) +static void cx_update_headset_mic_vref (struct hda_codec *codec,struct hda_jack_callback *event) { -unsigned int phone_present, mic_persent, phone_tag, mic_tag; -struct conexant_spec *spec = codec->spec; +unsigned int mic_present;/* In cx8070 and sn6140, the node 16 can only be config to headphone or disabled, * the node 19 can only be config to microphone or disabled. * Check hp&mic tag to process headset pulgin&plugout. */ - phone_tag =snd_hda_codec_read (codec,0x16 ,0 ,AC_VERB_GET_UNSOLICITED_RESPONSE ,0x0 ); - mic_tag =snd_hda_codec_read (codec,0x19 ,0 ,AC_VERB_GET_UNSOLICITED_RESPONSE ,0x0 ); -if ((phone_tag & (res >>AC_UNSOL_RES_TAG_SHIFT )) || - (mic_tag & (res >>AC_UNSOL_RES_TAG_SHIFT ))) { - phone_present =snd_hda_codec_read (codec,0x16 ,0 ,AC_VERB_GET_PIN_SENSE ,0x0 ); -if (!(phone_present &AC_PINSENSE_PRESENCE )) {/* headphone plugout */ - spec->headset_present_flag =CX_HEADSET_NOPRESENT ; -snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x20 ); -return ; - } -if (spec->headset_present_flag ==CX_HEADSET_NOPRESENT ) { - spec->headset_present_flag =CX_HEADSET_PARTPRESENT ; - }else if (spec->headset_present_flag ==CX_HEADSET_PARTPRESENT ) { - mic_persent =snd_hda_codec_read (codec,0x19 ,0 , -AC_VERB_GET_PIN_SENSE ,0x0 ); -/* headset is present */ -if ((phone_present &AC_PINSENSE_PRESENCE ) && - (mic_persent &AC_PINSENSE_PRESENCE )) { -cx_process_headset_plugin (codec); - spec->headset_present_flag =CX_HEADSET_ALLPRESENT ; - } - } - } -} - -static void cx_jack_unsol_event (struct hda_codec *codec,unsigned int res) -{ -struct conexant_spec *spec = codec->spec; - -if (spec->is_cx8070_sn6140) -cx_update_headset_mic_vref (codec, res); - -snd_hda_jack_unsol_event (codec, res); + mic_present =snd_hda_codec_read (codec,0x19 ,0 ,AC_VERB_GET_PIN_SENSE ,0x0 ); +if (!(mic_present &AC_PINSENSE_PRESENCE ))/* mic plugout */ +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x20 ); +else +cx_process_headset_plugin (codec); }static int cx_auto_suspend (struct hda_codec *codec)
@@ -305,7 +269,7 @@ static const struct hda_codec_ops cx_auto_patch_ops = { .build_pcms = snd_hda_gen_build_pcms, .init = cx_auto_init, .free = cx_auto_free, - .unsol_event = cx_jack_unsol_event, + .unsol_event = snd_hda_jack_unsol_event, .suspend = cx_auto_suspend, .check_power_status = snd_hda_gen_check_power_status, };
@@ -1163,7 +1127,7 @@ static int patch_conexant_auto(struct hda_codec *codec)case 0x14f11f86 :case 0x14f11f87 : spec->is_cx8070_sn6140 = true; - spec->headset_present_flag =CX_HEADSET_NOPRESENT ; +snd_hda_jack_detect_enable_callback (codec,0x19 , cx_update_headset_mic_vref);break ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/121 Bluetooth: btintel: Fail setup on error
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiran K <[email protected]>
[ Upstream commit e22a3a9d4134d7e6351a2998771522e74bcc58da ]
Do not attempt to send any hci command to controller if *setup* function fails.
--- drivers/bluetooth/btintel.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/bluetooth/btintel.c +3 -0
@@ -2845,6 +2845,9 @@ static int btintel_setup_combined(struct hci_dev *hdev)btintel_set_dsm_reset_method (hdev, &ver_tlv); err =btintel_bootloader_setup_tlv (hdev, &ver_tlv); +if (err) + goto exit_error; +btintel_register_devcoredump_support (hdev);break ;default :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/121 Bluetooth: hci_sync: Fix suspending with wrong filter policy
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 96b82af36efaa1787946e021aa3dc5410c05beeb ]
When suspending the scan filter policy cannot be 0x00 (no acceptlist) since that means the host has to process every advertisement report waking up the system, so this attempts to check if hdev is marked as suspended and if the resulting filter policy would be 0x00 (no acceptlist) then skip passive scanning if thre no devices in the acceptlist otherwise reset the filter policy to 0x01 so the acceptlist is used since the devices programmed there can still wakeup be system.
--- net/bluetooth/hci_sync.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
net/bluetooth/hci_sync.c +21 -0
@@ -2862,6 +2862,27 @@ static int hci_passive_scan_sync(struct hci_dev *hdev)*/ filter_policy =hci_update_accept_list_sync (hdev); +/* If suspended and filter_policy set to 0x00 (no acceptlist) then +* passive scanning cannot be started since that would require the host +* to be woken up to process the reports. +*/ +if (hdev->suspended && !filter_policy) { +/* Check if accept list is empty then there is no need to scan +* while suspended. +*/ +if (list_empty (&hdev->le_accept_list)) +return 0 ; + +/* If there are devices is the accept_list that means some +* devices could not be programmed which in non-suspended case +* means filter_policy needs to be set to 0x00 so the host needs +* to filter, but since this is treating suspended case we +* can ignore device needing host to filter to allow devices in +* the acceptlist to be able to wakeup the system. +*/ + filter_policy =0x01 ; + } +/* When the controller is using random resolvable addresses and * with that having LE privacy enabled, then controllers with * Extended Scanner Filter Policies support can now enable support
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/121 mptcp: give rcvlowat some love
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 5684ab1a0effbfeb706f47d85785f653005b97b1 ]
The MPTCP protocol allow setting sk_rcvlowat, but the value there is currently ignored.
Additionally, the default subflows sk_rcvlowat basically disables per subflow delayed ack: the MPTCP protocol move the incoming data from the subflows into the msk socket as soon as the TCP stacks invokes the subflow data_ready callback. Later, when __tcp_ack_snd_check() takes action, the subflow-level copied_seq matches rcv_nxt, and that mandate for an immediate ack.
Let the mptcp receive path be aware of such threshold, explicitly tracking the amount of data available to be ready and checking vs sk_rcvlowat in mptcp_poll() and before waking-up readers.
Additionally implement the set_rcvlowat() callback, to properly handle the rcvbuf auto-tuning on sk_rcvlowat changes.
Finally to properly handle delayed ack, force the subflow level threshold to 0 and instead explicitly ask for an immediate ack when the msk level th is not reached.
Stable-dep-of: 05f76b2d634e ("tcp: Adjust clamping window for applications specifying SO_RCVBUF")
--- net/mptcp/protocol.c | 24 +++++++++++------------- net/mptcp/protocol.h | 20 ++++++++++++++++++++ net/mptcp/sockopt.c | 42 ++++++++++++++++++++++++++++++++++++++++++ net/mptcp/subflow.c | 12 ++++++++++-- 4 files changed, 83 insertions(+), 15 deletions(-)
net/mptcp/protocol.c +11 -13
@@ -849,9 +849,8 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk)/* Wake-up the reader only for in-sequence data */ mptcp_data_lock (sk); -if (move_skbs_to_msk (msk, ssk)) +if (move_skbs_to_msk (msk, ssk) &&mptcp_epollin_ready (sk)) sk->sk_data_ready (sk); -mptcp_data_unlock (sk); }
@@ -1918,6 +1917,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,if (!(flags &MSG_PEEK )) {MPTCP_SKB_CB (skb)->offset += count;MPTCP_SKB_CB (skb)->map_seq += count; + msk->bytes_consumed += count; }break ; }
@@ -1928,6 +1928,7 @@ static int __mptcp_recvmsg_mskq(struct mptcp_sock *msk,WRITE_ONCE (msk->rmem_released, msk->rmem_released + skb->truesize);__skb_unlink (skb, &msk->receive_queue);__kfree_skb (skb); + msk->bytes_consumed += count; }if (copied >= len)
@@ -2752,6 +2753,7 @@ static void __mptcp_init_sock(struct sock *sk) msk->rmem_fwd_alloc =0 ;WRITE_ONCE (msk->rmem_released,0 ); msk->timer_ival =TCP_RTO_MIN ; + msk->scaling_ratio =TCP_DEFAULT_SCALING_RATIO ;WRITE_ONCE (msk->first,NULL );inet_csk (sk)->icsk_sync_mss = mptcp_sync_mss;
@@ -2984,16 +2986,9 @@ void __mptcp_unaccepted_force_close(struct sock *sk)__mptcp_destroy_sock (sk); } -static __poll_t mptcp_check_readable (struct mptcp_sock *msk) +static __poll_t mptcp_check_readable (struct sock *sk) { -/* Concurrent splices from sk_receive_queue into receive_queue will -* always show at least one non-empty queue when checked in this order. -*/ -if (skb_queue_empty_lockless (&((struct sock *)msk)->sk_receive_queue) && -skb_queue_empty_lockless (&msk->receive_queue)) -return 0 ; - -return EPOLLIN |EPOLLRDNORM ; +return mptcp_epollin_ready (sk) ?EPOLLIN |EPOLLRDNORM :0 ; }static void mptcp_check_listen_stop (struct sock *sk)
@@ -3031,7 +3026,7 @@ bool __mptcp_close(struct sock *sk, long timeout) goto cleanup; } -if (mptcp_check_readable (msk) || timeout <0 ) { +if (mptcp_data_avail (msk) || timeout <0 ) {/* If the msk has read data, or the caller explicitly ask it, * do the MPTCP equivalent of TCP reset, aka MPTCP fastclose */
@@ -3157,6 +3152,7 @@ static int mptcp_disconnect(struct sock *sk, int flags) msk->snd_data_fin_enable = false; msk->rcv_fastclose = false; msk->use_64bit_ack = false; + msk->bytes_consumed =0 ;WRITE_ONCE (msk->csum_enabled,mptcp_is_checksum_enabled (sock_net (sk)));mptcp_pm_data_reset (msk);mptcp_ca_reset (sk);
@@ -3983,7 +3979,7 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock, mask |=EPOLLIN |EPOLLRDNORM |EPOLLRDHUP ;if (state !=TCP_SYN_SENT && state !=TCP_SYN_RECV ) { - mask |=mptcp_check_readable (msk); + mask |=mptcp_check_readable (sk);if (shutdown &SEND_SHUTDOWN ) mask |=EPOLLOUT |EPOLLWRNORM ;else
@@ -4021,6 +4017,7 @@ static const struct proto_ops mptcp_stream_ops = { .sendmsg = inet_sendmsg, .recvmsg = inet_recvmsg, .mmap = sock_no_mmap, + .set_rcvlowat = mptcp_set_rcvlowat, };static struct inet_protosw mptcp_protosw = {
@@ -4122,6 +4119,7 @@ static const struct proto_ops mptcp_v6_stream_ops = {#ifdef CONFIG_COMPAT .compat_ioctl = inet6_compat_ioctl, #endif + .set_rcvlowat = mptcp_set_rcvlowat, };static struct proto mptcp_v6_prot;
net/mptcp/protocol.h +20 -0
@@ -268,6 +268,7 @@ struct mptcp_sock {atomic64_t rcv_wnd_sent;u64 rcv_data_fin_seq;u64 bytes_retrans; +u64 bytes_consumed;int rmem_fwd_alloc;int snd_burst;int old_wspace;
@@ -674,6 +675,24 @@ struct sock *mptcp_subflow_get_retrans(struct mptcp_sock *msk);int mptcp_sched_get_send (struct mptcp_sock *msk);int mptcp_sched_get_retrans (struct mptcp_sock *msk); +static inline u64 mptcp_data_avail (const struct mptcp_sock *msk) +{ +return READ_ONCE (msk->bytes_received) -READ_ONCE (msk->bytes_consumed); +} + +static inline bool mptcp_epollin_ready (const struct sock *sk) +{ +/* mptcp doesn't have to deal with small skbs in the receive queue, +* at it can always coalesce them +*/ +return (mptcp_data_avail (mptcp_sk (sk)) >= sk->sk_rcvlowat) || + (mem_cgroup_sockets_enabled && sk->sk_memcg && +mem_cgroup_under_socket_pressure (sk->sk_memcg)) || +READ_ONCE (tcp_memory_pressure); +} + +int mptcp_set_rcvlowat (struct sock *sk,int val); +static inline bool __tcp_can_send (const struct sock *ssk) {/* only send if our side has not closed yet */
@@ -748,6 +767,7 @@ static inline bool mptcp_is_fully_established(struct sock *sk)return inet_sk_state_load (sk) ==TCP_ESTABLISHED &&READ_ONCE (mptcp_sk (sk)->fully_established); } +void mptcp_rcv_space_init (struct mptcp_sock *msk,const struct sock *ssk);void mptcp_data_ready (struct sock *sk,struct sock *ssk);bool mptcp_finish_join (struct sock *sk);
net/mptcp/sockopt.c +42 -0
51 lines not on this page · raw message
net/mptcp/subflow.c +10 -2
@@ -1432,10 +1432,18 @@ static void subflow_data_ready(struct sock *sk)WARN_ON_ONCE (!__mptcp_check_fallback (msk) && !subflow->mp_capable && !subflow->mp_join && !(state &TCPF_CLOSE )); -if (mptcp_subflow_data_available (sk)) +if (mptcp_subflow_data_available (sk)) {mptcp_data_ready (parent, sk); -else if (unlikely (sk->sk_err)) + +/* subflow-level lowat test are not relevant. +* respect the msk-level threshold eventually mandating an immediate ack +*/ +if (mptcp_data_avail (msk) < parent->sk_rcvlowat && + (tcp_sk (sk)->rcv_nxt -tcp_sk (sk)->rcv_wup) >inet_csk (sk)->icsk_ack.rcv_mss) +inet_csk (sk)->icsk_ack.pending |=ICSK_ACK_NOW ; + }else if (unlikely (sk->sk_err)) {subflow_error_report (sk); + } }static void subflow_write_space (struct sock *ssk)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/121 tcp: annotate data-races around tp->window_clamp
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f410cbea9f3d2675b4c8e52af1d1985b11b387d1 ]
tp->window_clamp can be read locklessly, add READ_ONCE() and WRITE_ONCE() annotations.
Stable-dep-of: 05f76b2d634e ("tcp: Adjust clamping window for applications specifying SO_RCVBUF")
--- net/ipv4/syncookies.c | 3 ++- net/ipv4/tcp.c | 8 ++++---- net/ipv4/tcp_input.c | 17 ++++++++++------- net/ipv4/tcp_output.c | 18 ++++++++++-------- net/ipv6/syncookies.c | 2 +- net/mptcp/protocol.c | 2 +- net/mptcp/sockopt.c | 2 +- 7 files changed, 29 insertions(+), 23 deletions(-)
net/ipv4/syncookies.c +2 -1
@@ -424,7 +424,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) }/* Try to redo what tcp_v4_send_synack did. */ - req->rsk_window_clamp = tp->window_clamp ? :dst_metric (&rt->dst,RTAX_WINDOW ); + req->rsk_window_clamp =READ_ONCE (tp->window_clamp) ? : +dst_metric (&rt->dst,RTAX_WINDOW );/* limit the window selection if the user enforce a smaller rx buffer */ full_space =tcp_full_space (sk); if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
net/ipv4/tcp.c +4 -4
@@ -1723,7 +1723,7 @@ int tcp_set_rcvlowat(struct sock *sk, int val) space =tcp_space_from_win (sk, val);if (space > sk->sk_rcvbuf) {WRITE_ONCE (sk->sk_rcvbuf, space); -tcp_sk (sk)->window_clamp = val; +WRITE_ONCE (tcp_sk (sk)->window_clamp, val); }return 0 ; }
@@ -3386,7 +3386,7 @@ int tcp_set_window_clamp(struct sock *sk, int val)if (!val) {if (sk->sk_state !=TCP_CLOSE )return -EINVAL ; - tp->window_clamp =0 ; +WRITE_ONCE (tp->window_clamp,0 ); }else {u32 new_rcv_ssthresh, old_window_clamp = tp->window_clamp; u32 new_window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
@@ -3395,7 +3395,7 @@ int tcp_set_window_clamp(struct sock *sk, int val)if (new_window_clamp == old_window_clamp)return 0 ; - tp->window_clamp = new_window_clamp; +WRITE_ONCE (tp->window_clamp, new_window_clamp);if (new_window_clamp < old_window_clamp) {/* need to apply the reserved mem provisioning only * when shrinking the window clamp
@@ -4020,7 +4020,7 @@ int do_tcp_getsockopt(struct sock *sk, int level, TCP_RTO_MAX / HZ);break ;case TCP_WINDOW_CLAMP : - val = tp->window_clamp; + val =READ_ONCE (tp->window_clamp);break ;case TCP_INFO : {struct tcp_info info;
net/ipv4/tcp_input.c +10 -7
@@ -570,19 +570,20 @@ static void tcp_init_buffer_space(struct sock *sk) maxwin =tcp_full_space (sk);if (tp->window_clamp >= maxwin) { - tp->window_clamp = maxwin; +WRITE_ONCE (tp->window_clamp, maxwin);if (tcp_app_win && maxwin >4 * tp->advmss) - tp->window_clamp =max (maxwin - - (maxwin >> tcp_app_win), -4 * tp->advmss); +WRITE_ONCE (tp->window_clamp, +max (maxwin - (maxwin >> tcp_app_win), +4 * tp->advmss)); }/* Force reservation of one segment. */ if (tcp_app_win && tp->window_clamp >2 * tp->advmss && tp->window_clamp + tp->advmss > maxwin) - tp->window_clamp =max (2 * tp->advmss, maxwin - tp->advmss); +WRITE_ONCE (tp->window_clamp, +max (2 * tp->advmss, maxwin - tp->advmss)); tp->rcv_ssthresh =min (tp->rcv_ssthresh, tp->window_clamp); tp->snd_cwnd_stamp = tcp_jiffies32;
@@ -768,7 +769,8 @@ void tcp_rcv_space_adjust(struct sock *sk)WRITE_ONCE (sk->sk_rcvbuf, rcvbuf);/* Make the window clamp follow along. */ - tp->window_clamp =tcp_win_from_space (sk, rcvbuf); +WRITE_ONCE (tp->window_clamp, +tcp_win_from_space (sk, rcvbuf)); } } tp->rcvq_space.space = copied;
@@ -6347,7 +6349,8 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,if (!tp->rx_opt.wscale_ok) { tp->rx_opt.snd_wscale = tp->rx_opt.rcv_wscale =0 ; - tp->window_clamp =min (tp->window_clamp,65535U ); +WRITE_ONCE (tp->window_clamp, +min (tp->window_clamp,65535U )); }if (tp->rx_opt.saw_tstamp) {
net/ipv4/tcp_output.c +10 -8
@@ -203,16 +203,17 @@ static inline void tcp_event_ack_sent(struct sock *sk, u32 rcv_nxt)* This MUST be enforced by all callers. */ void tcp_select_initial_window (const struct sock *sk,int __space,__u32 mss, -__u32 *rcv_wnd,__u32 *window_clamp, +__u32 *rcv_wnd,__u32 *__window_clamp,int wscale_ok,__u8 *rcv_wscale,__u32 init_rcv_wnd) {unsigned int space = (__space <0 ?0 : __space); +u32 window_clamp =READ_ONCE (*__window_clamp);/* If no clamp set the clamp to the max possible scaled window */ -if (*window_clamp ==0 ) - (*window_clamp) = (U16_MAX <<TCP_MAX_WSCALE ); - space =min (*window_clamp, space); +if (window_clamp ==0 ) + window_clamp = (U16_MAX <<TCP_MAX_WSCALE ); + space =min (window_clamp, space);/* Quantize space offering to a multiple of mss if possible. */ if (space > mss)
@@ -239,12 +240,13 @@ void tcp_select_initial_window(const struct sock *sk, int __space, __u32 mss,/* Set window scaling on max possible window */ space =max_t (u32, space,READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ])); space =max_t (u32, space,READ_ONCE (sysctl_rmem_max)); - space =min_t (u32, space, *window_clamp); + space =min_t (u32, space, window_clamp); *rcv_wscale =clamp_t (int,ilog2 (space) -15 ,0 ,TCP_MAX_WSCALE ); }/* Set the clamp no higher than max representable value */ - (*window_clamp) =min_t (__u32,U16_MAX << (*rcv_wscale), *window_clamp); +WRITE_ONCE (*__window_clamp, +min_t (__u32,U16_MAX << (*rcv_wscale), window_clamp)); }EXPORT_SYMBOL (tcp_select_initial_window);
@@ -3787,7 +3789,7 @@ static void tcp_connect_init(struct sock *sk)tcp_ca_dst_init (sk, dst);if (!tp->window_clamp) - tp->window_clamp =dst_metric (dst,RTAX_WINDOW ); +WRITE_ONCE (tp->window_clamp,dst_metric (dst,RTAX_WINDOW )); tp->advmss =tcp_mss_clamp (tp,dst_metric_advmss (dst));tcp_initialize_rcv_mss (sk);
@@ -3795,7 +3797,7 @@ static void tcp_connect_init(struct sock *sk)/* limit the window selection if the user enforce a smaller rx buffer */ if (sk->sk_userlocks &SOCK_RCVBUF_LOCK && (tp->window_clamp >tcp_full_space (sk) || tp->window_clamp ==0 )) - tp->window_clamp =tcp_full_space (sk); +WRITE_ONCE (tp->window_clamp,tcp_full_space (sk)); rcv_wnd =tcp_rwnd_init_bpf (sk);if (rcv_wnd ==0 )
net/ipv6/syncookies.c +1 -1
@@ -243,7 +243,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) goto out_free; } - req->rsk_window_clamp = tp->window_clamp ? :dst_metric (dst,RTAX_WINDOW ); + req->rsk_window_clamp =READ_ONCE (tp->window_clamp) ? :dst_metric (dst,RTAX_WINDOW );/* limit the window selection if the user enforce a smaller rx buffer */ full_space =tcp_full_space (sk); if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
net/mptcp/protocol.c +1 -1
@@ -2024,7 +2024,7 @@ static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied) ssk =mptcp_subflow_tcp_sock (subflow); slow =lock_sock_fast (ssk);WRITE_ONCE (ssk->sk_rcvbuf, rcvbuf); -tcp_sk (ssk)->window_clamp = window_clamp; +WRITE_ONCE (tcp_sk (ssk)->window_clamp, window_clamp);tcp_cleanup_rbuf (ssk,1 );unlock_sock_fast (ssk, slow); }
net/mptcp/sockopt.c +1 -1
@@ -1564,7 +1564,7 @@ int mptcp_set_rcvlowat(struct sock *sk, int val) slow =lock_sock_fast (ssk);WRITE_ONCE (ssk->sk_rcvbuf, space); -tcp_sk (ssk)->window_clamp = val; +WRITE_ONCE (tcp_sk (ssk)->window_clamp, val);unlock_sock_fast (ssk, slow); }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/121 tcp: Adjust clamping window for applications specifying SO_RCVBUF
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Subash Abhinov Kasiviswanathan <[email protected]>
[ Upstream commit 05f76b2d634e65ab34472802d9b142ea9e03f74e ]
tp->scaling_ratio is not updated based on skb->len/skb->truesize once SO_RCVBUF is set leading to the maximum window scaling to be 25% of rcvbuf after
commit dfa2f0483360 ("tcp: get rid of sysctl_tcp_adv_win_scale") and 50% of rcvbuf after
commit 697a6c8cec03 ("tcp: increase the default TCP scaling ratio"). 50% tries to emulate the behavior of older kernels using sysctl_tcp_adv_win_scale with default value.
Systems which were using a different values of sysctl_tcp_adv_win_scale in older kernels ended up seeing reduced download speeds in certain cases as covered in https://lists.openwall.net/netdev/2024/05/15/13
While the sysctl scheme is no longer acceptable, the value of 50% is a bit conservative when the skb->len/skb->truesize ratio is later determined to be ~0.66.
Applications not specifying SO_RCVBUF update the window scaling and the receiver buffer every time data is copied to userspace. This computation is now used for applications setting SO_RCVBUF to update the maximum window scaling while ensuring that the receive buffer is within the application specified limit.
--- net/ipv4/tcp_input.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
net/ipv4/tcp_input.c +16 -7
@@ -748,8 +748,7 @@ void tcp_rcv_space_adjust(struct sock *sk)* <prev RTT . ><current RTT .. ><next RTT .... > */ -if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_moderate_rcvbuf) && - !(sk->sk_userlocks &SOCK_RCVBUF_LOCK )) { +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_moderate_rcvbuf)) {u64 rcvwin, grow;int rcvbuf;
@@ -765,12 +764,22 @@ void tcp_rcv_space_adjust(struct sock *sk) rcvbuf =min_t (u64,tcp_space_from_win (sk, rcvwin),READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_rmem[2 ])); -if (rcvbuf > sk->sk_rcvbuf) { -WRITE_ONCE (sk->sk_rcvbuf, rcvbuf); +if (!(sk->sk_userlocks &SOCK_RCVBUF_LOCK )) { +if (rcvbuf > sk->sk_rcvbuf) { +WRITE_ONCE (sk->sk_rcvbuf, rcvbuf); -/* Make the window clamp follow along. */ -WRITE_ONCE (tp->window_clamp, -tcp_win_from_space (sk, rcvbuf)); +/* Make the window clamp follow along. */ +WRITE_ONCE (tp->window_clamp, +tcp_win_from_space (sk, rcvbuf)); + } + }else { +/* Make the window clamp follow along while being bounded +* by SO_RCVBUF. +*/ +int clamp =tcp_win_from_space (sk,min (rcvbuf, sk->sk_rcvbuf)); + +if (clamp > tp->window_clamp) +WRITE_ONCE (tp->window_clamp, clamp); } } tp->rcvq_space.space = copied;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/121 net: axienet: start napi before enabling Rx/Tx
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Chiu <[email protected]>
[ Upstream commit 799a829507506924add8a7620493adc1c3cfda30 ]
softirq may get lost if an Rx interrupt comes before we call napi_enable. Move napi_enable in front of axienet_setoptions(), which turns on the device, to address the issue.
--- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/xilinx/xilinx_axienet_main.c +1 -1
@@ -1826,9 +1826,9 @@ static void axienet_dma_err_handler(struct work_struct *work) ~(XAE_OPTION_TXEN | XAE_OPTION_RXEN));axienet_set_mac_address (ndev,NULL );axienet_set_multicast_list (ndev); -axienet_setoptions (ndev, lp->options);napi_enable (&lp->napi_rx);napi_enable (&lp->napi_tx); +axienet_setoptions (ndev, lp->options); }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/121 rtnetlink: Dont ignore IFLA_TARGET_NETNSID when ifname is specified in rtnl_dellink().
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 9415d375d8520e0ed55f0c0b058928da9a5b5b3d ]
The cited commit accidentally replaced tgt_net with net in rtnl_dellink().
As a result, IFLA_TARGET_NETNSID is ignored if the interface is specified with IFLA_IFNAME or IFLA_ALT_IFNAME.
Let's pass tgt_net to rtnl_dev_get().
--- net/core/rtnetlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/rtnetlink.c +1 -1
@@ -3263,7 +3263,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,if (ifm->ifi_index >0 ) dev =__dev_get_by_index (tgt_net, ifm->ifi_index);else if (tb[IFLA_IFNAME ] || tb[IFLA_ALT_IFNAME ]) - dev =rtnl_dev_get (net, tb); + dev =rtnl_dev_get (tgt_net, tb);else if (tb[IFLA_GROUP ]) err =rtnl_group_dellink (tgt_net,nla_get_u32 (tb[IFLA_GROUP ]));else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/121 i915/perf: Remove code to update PWR_CLK_STATE for gen12
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Umesh Nerlige Ramappa <[email protected]>
[ Upstream commit 4bc14b9cfaa2149d41baef2f2620e9f82d9847d7 ]
PWR_CLK_STATE only needs to be modified up until gen11. For gen12 this code is not applicable. Remove code to update context image with PWR_CLK_STATE for gen12.
--- drivers/gpu/drm/i915/i915_perf.c | 33 -------------------------------- 1 file changed, 33 deletions(-)
drivers/gpu/drm/i915/i915_perf.c +0 -33
@@ -2781,26 +2781,6 @@ oa_configure_all_contexts(struct i915_perf_stream *stream,return 0 ; } -static int -gen12_configure_all_contexts (struct i915_perf_stream *stream, -const struct i915_oa_config *oa_config, -struct i915_active *active) -{ -struct flex regs[] = { - { -GEN8_R_PWR_CLK_STATE (RENDER_RING_BASE ), -CTX_R_PWR_CLK_STATE , - }, - }; - -if (stream->engine->class !=RENDER_CLASS ) -return 0 ; - -return oa_configure_all_contexts (stream, - regs,ARRAY_SIZE (regs), - active); -} - static int lrc_configure_all_contexts(struct i915_perf_stream *stream, const struct i915_oa_config *oa_config,
@@ -2907,7 +2887,6 @@ gen12_enable_metric_set(struct i915_perf_stream *stream, {struct drm_i915_private *i915 = stream->perf->i915;struct intel_uncore *uncore = stream->uncore; -struct i915_oa_config *oa_config = stream->oa_config;bool periodic = stream->periodic;u32 period_exponent = stream->period_exponent;u32 sqcnt1;
@@ -2951,15 +2930,6 @@ gen12_enable_metric_set(struct i915_perf_stream *stream,intel_uncore_rmw (uncore,GEN12_SQCNT1 ,0 , sqcnt1); -/* -* Update all contexts prior writing the mux configurations as we need -* to make sure all slices/subslices are ON before writing to NOA -* registers. -*/ - ret =gen12_configure_all_contexts (stream, oa_config, active); -if (ret) -return ret; -/* * For Gen12, performance counters are context * saved/restored. Only enable it for the context that
@@ -3014,9 +2984,6 @@ static void gen12_disable_metric_set(struct i915_perf_stream *stream) _MASKED_BIT_DISABLE(GEN12_DISABLE_DOP_GATING)); } -/* Reset all contexts' slices/subslices configurations. */ -gen12_configure_all_contexts (stream,NULL ,NULL ); -/* disable the context save/restore or OAR counters */ if (stream->ctx)gen12_configure_oar_context (stream,NULL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 69/121 ice: respect netif readiness in AF_XDP ZC related ndos
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Kubiak <[email protected]>
[ Upstream commit ec145a18687fec8dd97eeb4f30057fa4debef577 ]
Address a scenario in which XSK ZC Tx produces descriptors to XDP Tx ring when link is either not yet fully initialized or process of stopping the netdev has already started. To avoid this, add checks against carrier readiness in ice_xsk_wakeup() and in ice_xmit_zc(). One could argue that bailing out early in ice_xsk_wakeup() would be sufficient but given the fact that we produce Tx descriptors on behalf of NAPI that is triggered for Rx traffic, the latter is also needed.
Bringing link up is an asynchronous event executed within ice_service_task so even though interface has been brought up there is still a time frame where link is not yet ok.
Without this patch, when AF_XDP ZC Tx is used simultaneously with stack Tx, Tx timeouts occur after going through link flap (admin brings interface down then up again). HW seem to be unable to transmit descriptor to the wire after HW tail register bump which in turn causes bit __QUEUE_STATE_STACK_XOFF to be set forever as netdev_tx_completed_queue() sees no cleaned bytes on the input.
--- drivers/net/ethernet/intel/ice/ice_xsk.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_xsk.c +5 -1
@@ -1068,6 +1068,10 @@ bool ice_xmit_zc(struct ice_tx_ring *xdp_ring)ice_clean_xdp_irq_zc (xdp_ring); +if (!netif_carrier_ok (xdp_ring->vsi->netdev) || + !netif_running (xdp_ring->vsi->netdev)) +return true; + budget =ICE_DESC_UNUSED (xdp_ring); budget =min_t (u16, budget,ICE_RING_QUARTER (xdp_ring));
@@ -1111,7 +1115,7 @@ ice_xsk_wakeup(struct net_device *netdev, u32 queue_id,struct ice_vsi *vsi = np->vsi;struct ice_tx_ring *ring; -if (test_bit (ICE_VSI_DOWN , vsi->state)) +if (test_bit (ICE_VSI_DOWN , vsi->state) || !netif_carrier_ok (netdev))return -ENETDOWN ;if (!ice_is_xdp_ena_vsi (vsi))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/121 ice: dont busy wait for Rx queue disable in ice_qp_dis()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej Fijalkowski <[email protected]>
[ Upstream commit 1ff72a2f67791cd4ddad19ed830445f57b30e992 ]
When ice driver is spammed with multiple xdpsock instances and flow control is enabled, there are cases when Rx queue gets stuck and unable to reflect the disable state in QRX_CTRL register. Similar issue has previously been addressed in commit 13a6233b033f ("ice: Add support to enable/disable all Rx queues before waiting").
To workaround this, let us simply not wait for a disabled state as later patch will make sure that regardless of the encountered error in the process of disabling a queue pair, the Rx queue will be enabled.
--- drivers/net/ethernet/intel/ice/ice_xsk.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/intel/ice/ice_xsk.c +1 -3
@@ -199,10 +199,8 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)if (err)return err; } - err =ice_vsi_ctrl_one_rx_ring (vsi, false, q_idx, true); -if (err) -return err; +ice_vsi_ctrl_one_rx_ring (vsi, false, q_idx, false);ice_qp_clean_rings (vsi, q_idx);ice_qp_reset_stats (vsi, q_idx);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/121 ice: replace synchronize_rcu with synchronize_net
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej Fijalkowski <[email protected]>
[ Upstream commit 405d9999aa0b4ae467ef391d1d9c7e0d30ad0841 ]
Given that ice_qp_dis() is called under rtnl_lock, synchronize_net() can be called instead of synchronize_rcu() so that XDP rings can finish its job in a faster way. Also let us do this as earlier in XSK queue disable flow.
Additionally, turn off regular Tx queue before disabling irqs and NAPI.
--- drivers/net/ethernet/intel/ice/ice_xsk.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/ice/ice_xsk.c +4 -5
@@ -52,10 +52,8 @@ static void ice_qp_reset_stats(struct ice_vsi *vsi, u16 q_idx)static void ice_qp_clean_rings (struct ice_vsi *vsi,u16 q_idx) {ice_clean_tx_ring (vsi->tx_rings[q_idx]); -if (ice_is_xdp_ena_vsi (vsi)) { -synchronize_rcu (); +if (ice_is_xdp_ena_vsi (vsi))ice_clean_tx_ring (vsi->xdp_rings[q_idx]); - }ice_clean_rx_ring (vsi->rx_rings[q_idx]); }
@@ -180,11 +178,12 @@ static int ice_qp_dis(struct ice_vsi *vsi, u16 q_idx)usleep_range (1000 ,2000 ); } +synchronize_net (); +netif_tx_stop_queue (netdev_get_tx_queue (vsi->netdev, q_idx)); +ice_qvec_dis_irq (vsi, rx_ring, q_vector);ice_qvec_toggle_napi (vsi, q_vector, false); -netif_tx_stop_queue (netdev_get_tx_queue (vsi->netdev, q_idx)); -ice_fill_txq_meta (vsi, tx_ring, &txq_meta); err =ice_vsi_stop_tx_ring (vsi,ICE_NO_RESET ,0 , tx_ring, &txq_meta);if (err)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/121 ice: add missing WRITE_ONCE when clearing ice_rx_ring::xdp_prog
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej Fijalkowski <[email protected]>
[ Upstream commit 6044ca26210ba72b3dcc649fae1cbedd9e6ab018 ]
It is read by data path and modified from process context on remote cpu so it is needed to use WRITE_ONCE to clear the pointer.
--- drivers/net/ethernet/intel/ice/ice_txrx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_txrx.c +1 -1
@@ -456,7 +456,7 @@ void ice_free_rx_ring(struct ice_rx_ring *rx_ring)if (rx_ring->vsi->type ==ICE_VSI_PF )if (xdp_rxq_info_is_reg (&rx_ring->xdp_rxq))xdp_rxq_info_unreg (&rx_ring->xdp_rxq); - rx_ring->xdp_prog =NULL ; +WRITE_ONCE (rx_ring->xdp_prog,NULL );if (rx_ring->xsk_pool) {kfree (rx_ring->xdp_buf); rx_ring->xdp_buf =NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 73/121 net/iucv: fix use after free in iucv_sock_close()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandra Winter <[email protected]>
[ Upstream commit f558120cd709682b739207b48cf7479fd9568431 ]
iucv_sever_path() is called from process context and from bh context. iucv->path is used as indicator whether somebody else is taking care of severing the path (or it is already removed / never existed). This needs to be done with atomic compare and swap, otherwise there is a small window where iucv_sock_close() will try to work with a path that has already been severed and freed by iucv_callback_connrej() called by iucv_tasklet_fn().
Example:
[452744.123844] Call Trace: [452744.123845] ([<0000001e87f03880>] 0x1e87f03880) [452744.123966] [<00000000d593001e>] iucv_path_sever+0x96/0x138 [452744.124330] [<000003ff801ddbca>] iucv_sever_path+0xc2/0xd0 [af_iucv] [452744.124336] [<000003ff801e01b6>] iucv_sock_close+0xa6/0x310 [af_iucv] [452744.124341] [<000003ff801e08cc>] iucv_sock_release+0x3c/0xd0 [af_iucv] [452744.124345] [<00000000d574794e>] __sock_release+0x5e/0xe8 [452744.124815] [<00000000d5747a0c>] sock_close+0x34/0x48 [452744.124820] [<00000000d5421642>] __fput+0xba/0x268 [452744.124826] [<00000000d51b382c>] task_work_run+0xbc/0xf0 [452744.124832] [<00000000d5145710>] do_notify_resume+0x88/0x90 [452744.124841] [<00000000d5978096>] system_call+0xe2/0x2c8 [452744.125319] Last Breaking-Event-Address: [452744.125321] [<00000000d5930018>] iucv_path_sever+0x90/0x138 [452744.125324] [452744.125325] Kernel panic - not syncing: Fatal exception in interrupt
Note that bh_lock_sock() is not serializing the tasklet context against process context, because the check for sock_owned_by_user() and corresponding handling is missing.
Ideas for a future clean-up patch:
A) Correct usage of bh_lock_sock() in tasklet context, as described in
Re-enqueue, if needed. This may require adding return values to the tasklet functions and thus changes to all users of iucv.
B) Change iucv tasklet into worker and use only lock_sock() in af_iucv.
--- net/iucv/af_iucv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/iucv/af_iucv.c +2 -2
@@ -335,8 +335,8 @@ static void iucv_sever_path(struct sock *sk, int with_user_data)struct iucv_sock *iucv =iucv_sk (sk);struct iucv_path *path = iucv->path; -if (iucv->path) { - iucv->path =NULL ; +/* Whoever resets the path pointer, must sever and free it. */ +if (xchg (&iucv->path,NULL )) {if (with_user_data) {low_nmcpy (user_data, iucv->src_name);high_nmcpy (user_data, iucv->dst_name);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/121 drm/i915/hdcp: Fix HDCP2_STREAM_STATUS macro
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suraj Kandpal <[email protected]>
[ Upstream commit 555069117390a5d581863bc797fb546bb4417c31 ]
Fix HDCP2_STREAM_STATUS macro, it called pipe instead of port never threw a compile error as no one used it.
--v2
-Add Fixes [Jani]
--- drivers/gpu/drm/i915/display/intel_hdcp_regs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/display/intel_hdcp_regs.h +1 -1
@@ -249,7 +249,7 @@#define HDCP2_STREAM_STATUS (dev_priv, trans, port) \ (GRAPHICS_VER(dev_priv) >= 12 ? \ TRANS_HDCP2_STREAM_STATUS(trans) : \ - PIPE_HDCP2_STREAM_STATUS(pipe)) + PIPE_HDCP2_STREAM_STATUS(port))#define _PORTA_HDCP2_AUTH_STREAM 0x66F00#define _PORTB_HDCP2_AUTH_STREAM 0x66F04
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/121 net: mvpp2: Dont re-use loop iterator
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 0aa3ca956c46d849775eae1816cef8fe4bc8b50e ]
This function has a nested loop. The problem is that both the inside and outside loop use the same variable as an iterator. I found this via static analysis so I'm not sure the impact. It could be that it loops forever or, more likely, the loop exits early.
--- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +3 -3
@@ -953,13 +953,13 @@ static void mvpp2_bm_pool_update_fc(struct mvpp2_port *port,static void mvpp2_bm_pool_update_priv_fc (struct mvpp2 *priv,bool en) {struct mvpp2_port *port; -int i; +int i, j;for (i =0 ; i < priv->port_count; i++) { port = priv->port_list[i];if (port->priv->percpu_pools) { -for (i =0 ; i < port->nrxqs; i++) -mvpp2_bm_pool_update_fc (port, &port->priv->bm_pools[i], +for (j =0 ; j < port->nrxqs; j++) +mvpp2_bm_pool_update_fc (port, &port->priv->bm_pools[j], port->tx_fc & en); }else {mvpp2_bm_pool_update_fc (port, port->pool_long, port->tx_fc & en);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/121 net: phy: micrel: Fix the KSZ9131 MDI-X status issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raju Lakkaraju <[email protected]>
[ Upstream commit 84383b5ef4cd21b4a67de92afdc05a03b5247db9 ]
The MDIX status is not accurately reflecting the current state after the link partner has manually altered its MDIX configuration while operating in forced mode.
Access information about Auto mdix completion and pair selection from the KSZ9131's Auto/MDI/MDI-X status register
--- drivers/net/phy/micrel.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-)
drivers/net/phy/micrel.c +19 -15
@@ -1293,6 +1293,8 @@ static int ksz9131_config_init(struct phy_device *phydev)const struct device *dev_walker;int ret; + phydev->mdix_ctrl =ETH_TP_MDI_AUTO ; + dev_walker = &phydev->mdio.dev; do { of_node = dev_walker->of_node;
@@ -1342,28 +1344,30 @@ static int ksz9131_config_init(struct phy_device *phydev)#define MII_KSZ9131_AUTO_MDIX 0x1C#define MII_KSZ9131_AUTO_MDI_SET BIT(7)#define MII_KSZ9131_AUTO_MDIX_SWAP_OFF BIT(6) +#define MII_KSZ9131_DIG_AXAN_STS 0x14 +#define MII_KSZ9131_DIG_AXAN_STS_LINK_DET BIT(14) +#define MII_KSZ9131_DIG_AXAN_STS_A_SELECT BIT(12)static int ksz9131_mdix_update (struct phy_device *phydev) {int ret; - ret =phy_read (phydev,MII_KSZ9131_AUTO_MDIX ); -if (ret <0 ) -return ret; - -if (ret &MII_KSZ9131_AUTO_MDIX_SWAP_OFF ) { -if (ret &MII_KSZ9131_AUTO_MDI_SET ) - phydev->mdix_ctrl =ETH_TP_MDI ; -else - phydev->mdix_ctrl =ETH_TP_MDI_X ; +if (phydev->mdix_ctrl !=ETH_TP_MDI_AUTO ) { + phydev->mdix = phydev->mdix_ctrl; }else { - phydev->mdix_ctrl =ETH_TP_MDI_AUTO ; - } + ret =phy_read (phydev,MII_KSZ9131_DIG_AXAN_STS ); +if (ret <0 ) +return ret; -if (ret &MII_KSZ9131_AUTO_MDI_SET ) - phydev->mdix =ETH_TP_MDI ; -else - phydev->mdix =ETH_TP_MDI_X ; +if (ret &MII_KSZ9131_DIG_AXAN_STS_LINK_DET ) { +if (ret &MII_KSZ9131_DIG_AXAN_STS_A_SELECT ) + phydev->mdix =ETH_TP_MDI ; +else + phydev->mdix =ETH_TP_MDI_X ; + }else { + phydev->mdix =ETH_TP_MDI_INVALID ; + } + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/121 ALSA: hda: Conditionally use snooping for AMD HDMI
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 478689b5990deb626a0b3f1ebf165979914d6be4 ]
The recent regression report revealed that the use of WC pages for AMD HDMI device together with AMD IOMMU leads to unexpected truncation or noises. The issue seems triggered by the change in the kernel core memory allocation that enables IOMMU driver to use always S/G buffers. Meanwhile, the use of WC pages has been a workaround for the similar issue with standard pages in the past. So, now we need to apply the workaround conditionally, namely, only when IOMMU isn't in place.
This patch modifies the workaround code to check the DMA ops at first and apply the snoop-off only when needed.
--- sound/pci/hda/hda_controller.h | 2 +- sound/pci/hda/hda_intel.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-)
sound/pci/hda/hda_controller.h +1 -1
@@ -28,7 +28,7 @@#else #define AZX_DCAPS_I915_COMPONENT 0/* NOP */ #endif -/* 14 unused */ +#define AZX_DCAPS_AMD_ALLOC_FIX (1 << 14)/* AMD allocation workaround */ #define AZX_DCAPS_CTX_WORKAROUND (1 << 15)/* X-Fi workaround */ #define AZX_DCAPS_POSFIX_LPIB (1 << 16)/* Use LPIB as default */ #define AZX_DCAPS_AMD_WORKAROUND (1 << 17)/* AMD-specific workaround */
sound/pci/hda/hda_intel.c +9 -1
@@ -40,6 +40,7 @@#ifdef CONFIG_X86 /* for snoop control */ +#include <linux/dma-map-ops.h> #include <asm/set_memory.h> #include <asm/cpufeature.h> #endif
@@ -301,7 +302,7 @@ enum {/* quirks for ATI HDMI with snoop off */ #define AZX_DCAPS_PRESET_ATI_HDMI_NS \ - (AZX_DCAPS_PRESET_ATI_HDMI | AZX_DCAPS_SNOOP_OFF) + (AZX_DCAPS_PRESET_ATI_HDMI | AZX_DCAPS_AMD_ALLOC_FIX)/* quirks for AMD SB */ #define AZX_DCAPS_PRESET_AMD_SB \
@@ -1715,6 +1716,13 @@ static void azx_check_snoop_available(struct azx *chip)if (chip->driver_caps &AZX_DCAPS_SNOOP_OFF ) snoop = false; +#ifdef CONFIG_X86 +/* check the presence of DMA ops (i.e. IOMMU), disable snoop conditionally */ +if ((chip->driver_caps &AZX_DCAPS_AMD_ALLOC_FIX ) && + !get_dma_ops (chip->card->dev)) + snoop = false; +#endif + chip->snoop = snoop;if (!snoop) {dev_info (chip->card->dev,"Force to non-snoop mode\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/121 netfilter: iptables: Fix null-ptr-deref in iptable_nat_table_init().
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 5830aa863981d43560748aa93589c0695191d95d ]
We had a report that iptables-restore sometimes triggered null-ptr-deref at boot time. [0]
The problem is that iptable_nat_table_init() is exposed to user space before the kernel fully initialises netns.
In the small race window, a user could call iptable_nat_table_init() that accesses net_generic(net, iptable_nat_net_id), which is available only after registering iptable_nat_net_ops.
Let's call register_pernet_subsys() before xt_register_template().
[0]:
bpfilter: Loaded bpfilter_umh pid 11702
Started bpfilter
BUG: kernel NULL pointer dereference, address: 0000000000000013 PF: supervisor write access in kernel mode PF: error_code(0x0002) - not-present page PGD 0 P4D 0 PREEMPT SMP NOPTI CPU: 2 PID: 11879 Comm: iptables-restor Not tainted 6.1.92-99.174.amzn2023.x86_64 #1 Hardware name: Amazon EC2 c6i.4xlarge/, BIOS 1.0 10/16/2017 RIP: 0010:iptable_nat_table_init (net/ipv4/netfilter/iptable_nat.c:87 net/ipv4/netfilter/iptable_nat.c:121) iptable_nat Code: 10 4c 89 f6 48 89 ef e8 0b 19 bb ff 41 89 c4 85 c0 75 38 41 83 c7 01 49 83 c6 28 41 83 ff 04 75 dc 48 8b 44 24 08 48 8b 0c 24 <48> 89 08 4c 89 ef e8 a2 3b a2 cf 48 83 c4 10 44 89 e0 5b 5d 41 5c RSP: 0018:ffffbef902843cd0 EFLAGS: 00010246 RAX: 0000000000000013 RBX: ffff9f4b052caa20 RCX: ffff9f4b20988d80 RDX: 0000000000000000 RSI: 0000000000000064 RDI: ffffffffc04201c0 RBP: ffff9f4b29394000 R08: ffff9f4b07f77258 R09: ffff9f4b07f77240 R10: 0000000000000000 R11: ffff9f4b09635388 R12: 0000000000000000 R13: ffff9f4b1a3c6c00 R14: ffff9f4b20988e20 R15: 0000000000000004 FS: 00007f6284340000(0000) GS:ffff9f51fe280000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000013 CR3: 00000001d10a6005 CR4: 00000000007706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <TASK> ? show_trace_log_lvl (arch/x86/kernel/dumpstack.c:259) ? show_trace_log_lvl (arch/x86/kernel/dumpstack.c:259) ? xt_find_table_lock (net/netfilter/x_tables.c:1259) ? __die_body.cold (arch/x86/kernel/dumpstack.c:478 arch/x86/kernel/dumpstack.c:420) ? page_fault_oops (arch/x86/mm/fault.c:727) ? exc_page_fault (./arch/x86/include/asm/irqflags.h:40 ./arch/x86/include/asm/irqflags.h:75 arch/x86/mm/fault.c:1470 arch/x86/mm/fault.c:1518) ? asm_exc_page_fault (./arch/x86/include/asm/idtentry.h:570) ? iptable_nat_table_init (net/ipv4/netfilter/iptable_nat.c:87 net/ipv4/netfilter/iptable_nat.c:121) iptable_nat xt_find_table_lock (net/netfilter/x_tables.c:1259) xt_request_find_table_lock (net/netfilter/x_tables.c:1287) get_info (net/ipv4/netfilter/ip_tables.c:965) ? security_capable (security/security.c:809 (discriminator 13)) ? ns_capable (kernel/capability.c:376 kernel/capability.c:397) ? do_ipt_get_ctl (net/ipv4/netfilter/ip_tables.c:1656) ? bpfilter_send_req (net/bpfilter/bpfilter_kern.c:52) bpfilter nf_getsockopt (net/netfilter/nf_sockopt.c:116) ip_getsockopt (net/ipv4/ip_sockglue.c:1827) __sys_getsockopt (net/socket.c:2327) __x64_sys_getsockopt (net/socket.c:2342 net/socket.c:2339 net/socket.c:2339) do_syscall_64 (arch/x86/entry/common.c:51 arch/x86/entry/common.c:81) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:121) RIP: 0033:0x7f62844685ee Code: 48 8b 0d 45 28 0f 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 49 89 ca b8 37 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 0a c3 66 0f 1f 84 00 00 00 00 00 48 8b 15 09 RSP: 002b:00007ffd1f83d638 EFLAGS: 00000246 ORIG_RAX: 0000000000000037 RAX: ffffffffffffffda RBX: 00007ffd1f83d680 RCX: 00007f62844685ee RDX: 0000000000000040 RSI: 0000000000000000 RDI: 0000000000000004 RBP: 0000000000000004 R08: 00007ffd1f83d670 R09: 0000558798ffa2a0 R10: 00007ffd1f83d680 R11: 0000000000000246 R12: 00007ffd1f83e3b2 R13: 00007f628455baa0 R14: 00007ffd1f83d7b0 R15: 00007f628457a008 </TASK> Modules linked in: iptable_nat(+) bpfilter rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache veth xt_state xt_connmark xt_nat xt_statistic xt_MASQUERADE xt_mark xt_addrtype ipt_REJECT nf_reject_ipv4 nft_chain_nat nf_nat xt_conntrack nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 xt_comment nft_compat nf_tables nfnetlink overlay nls_ascii nls_cp437 vfat fat ghash_clmulni_intel aesni_intel ena crypto_simd ptp cryptd i8042 pps_core serio button sunrpc sch_fq_codel configfs loop dm_mod fuse dax dmi_sysfs crc32_pclmul crc32c_intel efivarfs
CR2: 0000000000000013
--- net/ipv4/netfilter/iptable_nat.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
net/ipv4/netfilter/iptable_nat.c +10 -8
@@ -145,25 +145,27 @@ static struct pernet_operations iptable_nat_net_ops = {static int __init iptable_nat_init (void ) { -int ret =xt_register_template (&nf_nat_ipv4_table, - iptable_nat_table_init); +int ret; +/* net->gen->ptr[iptable_nat_net_id] must be allocated +* before calling iptable_nat_table_init(). +*/ + ret =register_pernet_subsys (&iptable_nat_net_ops);if (ret <0 )return ret; - ret =register_pernet_subsys (&iptable_nat_net_ops); -if (ret <0 ) { -xt_unregister_template (&nf_nat_ipv4_table); -return ret; - } + ret =xt_register_template (&nf_nat_ipv4_table, + iptable_nat_table_init); +if (ret <0 ) +unregister_pernet_subsys (&iptable_nat_net_ops);return ret; } static void __exit iptable_nat_exit(void) { -unregister_pernet_subsys (&iptable_nat_net_ops);xt_unregister_template (&nf_nat_ipv4_table); +unregister_pernet_subsys (&iptable_nat_net_ops); }module_init (iptable_nat_init);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/121 netfilter: iptables: Fix potential null-ptr-deref in ip6table_nat_table_init().
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit c22921df777de5606f1047b1345b8d22ef1c0b34 ]
ip6table_nat_table_init() accesses net->gen->ptr[ip6table_nat_net_ops.id], but the function is exposed to user space before the entry is allocated via register_pernet_subsys().
Let's call register_pernet_subsys() before xt_register_template().
--- net/ipv6/netfilter/ip6table_nat.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
net/ipv6/netfilter/ip6table_nat.c +9 -5
@@ -147,23 +147,27 @@ static struct pernet_operations ip6table_nat_net_ops = {static int __init ip6table_nat_init (void ) { -int ret =xt_register_template (&nf_nat_ipv6_table, - ip6table_nat_table_init); +int ret; +/* net->gen->ptr[ip6table_nat_net_id] must be allocated +* before calling ip6t_nat_register_lookups(). +*/ + ret =register_pernet_subsys (&ip6table_nat_net_ops);if (ret <0 )return ret; - ret =register_pernet_subsys (&ip6table_nat_net_ops); + ret =xt_register_template (&nf_nat_ipv6_table, + ip6table_nat_table_init);if (ret) -xt_unregister_template (&nf_nat_ipv6_table); +unregister_pernet_subsys (&ip6table_nat_net_ops);return ret; } static void __exit ip6table_nat_exit(void) { -unregister_pernet_subsys (&ip6table_nat_net_ops);xt_unregister_template (&nf_nat_ipv6_table); +unregister_pernet_subsys (&ip6table_nat_net_ops); }module_init (ip6table_nat_init);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/121 net/mlx5: Always drain health in shutdown callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit 1b75da22ed1e6171e261bc9265370162553d5393 ]
There is no point in recovery during device shutdown. if health work started need to wait for it to avoid races and NULL pointer access.
Hence, drain health WQ on shutdown callback.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +1 -1
@@ -2130,7 +2130,6 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)/* Panic tear down fw command will stop the PCI bus communication * with the HCA, so the health poll is no longer needed. */ -mlx5_drain_health_wq (dev);mlx5_stop_health_poll (dev, false); ret =mlx5_cmd_fast_teardown_hca (dev);
@@ -2165,6 +2164,7 @@ static void shutdown(struct pci_dev *pdev)mlx5_core_info (dev,"Shutdown was called\n" );set_bit (MLX5_BREAK_FW_WAIT , &dev->intf_state); +mlx5_drain_health_wq (dev); err =mlx5_try_fast_unload (dev);if (err)mlx5_unload_one (dev, false);
drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c +1 -0
@@ -90,6 +90,7 @@ static void mlx5_sf_dev_shutdown(struct auxiliary_device *adev)struct mlx5_core_dev *mdev = sf_dev->mdev;set_bit (MLX5_BREAK_FW_WAIT , &mdev->intf_state); +mlx5_drain_health_wq (mdev);mlx5_unload_one (mdev, false); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/121 net/mlx5: Fix error handling in irq_pool_request_irq
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit a4557b0b57c40871ff00da4f623cf79211e052f3 ]
In case mlx5_irq_alloc fails, the previously allocated index remains in the XArray, which could lead to inconsistencies.
Fix it by adding error handling that erases the allocated index from the XArray if mlx5_irq_alloc returns an error.
--- drivers/net/ethernet/mellanox/mlx5/core/irq_affinity.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/irq_affinity.c +7 -3
@@ -48,6 +48,7 @@ static struct mlx5_irq * irq_pool_request_irq(struct mlx5_irq_pool *pool, struct irq_affinity_desc *af_desc) { struct irq_affinity_desc auto_desc = {}; +struct mlx5_irq *irq;u32 irq_index;int err;
@@ -64,9 +65,12 @@ irq_pool_request_irq(struct mlx5_irq_pool *pool, struct irq_affinity_desc *af_deelse cpu_get (pool,cpumask_first (&af_desc->mask)); } -return mlx5_irq_alloc (pool, irq_index, -cpumask_empty (&auto_desc.mask) ? af_desc : &auto_desc, -NULL ); + irq =mlx5_irq_alloc (pool, irq_index, +cpumask_empty (&auto_desc.mask) ? af_desc : &auto_desc, +NULL ); +if (IS_ERR (irq)) +xa_erase (&pool->irqs, irq_index); +return irq; }/* Looking for the IRQ with the smallest refcount that fits req_mask.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/121 net/mlx5: Lag, dont use the hardcoded value of the first port
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
[ Upstream commit 3fda84dc090390573cfbd0b1d70372663315de21 ]
The cited commit didn't change the body of the loop as it should. It shouldn't be using MLX5_LAG_P1.
--- drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +1 -1
@@ -1512,7 +1512,7 @@ u8 mlx5_lag_get_slave_port(struct mlx5_core_dev *dev, goto unlock;for (i =0 ; i < ldev->ports; i++) { -if (ldev->pf[MLX5_LAG_P1 ].netdev == slave) { +if (ldev->pf[i].netdev == slave) { port = i;break ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/121 net/mlx5: Fix missing lock on sync reset reload
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Moshe Shemesh <[email protected]>
[ Upstream commit 572f9caa9e7295f8c8822e4122c7ae8f1c412ff9 ]
On sync reset reload work, when remote host updates devlink on reload actions performed on that host, it misses taking devlink lock before calling devlink_remote_reload_actions_performed() which results in triggering lock assert like the following:
WARNING: CPU: 4 PID: 1164 at net/devlink/core.c:261 devl_assert_locked+0x3e/0x50 … CPU: 4 PID: 1164 Comm: kworker/u96:6 Tainted: G S W 6.10.0-rc2+ #116 Hardware name: Supermicro SYS-2028TP-DECTR/X10DRT-PT, BIOS 2.0 12/18/2015 Workqueue: mlx5_fw_reset_events mlx5_sync_reset_reload_work [mlx5_core] RIP: 0010:devl_assert_locked+0x3e/0x50 … Call Trace: <TASK> ? __warn+0xa4/0x210 ? devl_assert_locked+0x3e/0x50 ? report_bug+0x160/0x280 ? handle_bug+0x3f/0x80 ? exc_invalid_op+0x17/0x40 ? asm_exc_invalid_op+0x1a/0x20 ? devl_assert_locked+0x3e/0x50 devlink_notify+0x88/0x2b0 ? mlx5_attach_device+0x20c/0x230 [mlx5_core] ? __pfx_devlink_notify+0x10/0x10 ? process_one_work+0x4b6/0xbb0 process_one_work+0x4b6/0xbb0
[…]
--- drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c +4 -1
@@ -206,6 +206,7 @@ int mlx5_fw_reset_set_live_patch(struct mlx5_core_dev *dev)static void mlx5_fw_reset_complete_reload (struct mlx5_core_dev *dev,bool unloaded) {struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; +struct devlink *devlink =priv_to_devlink (dev);/* if this is the driver that initiated the fw reset, devlink completed the reload */ if (test_bit (MLX5_FW_RESET_FLAGS_PENDING_COMP , &fw_reset->reset_flags)) {
@@ -217,9 +218,11 @@ static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unloadmlx5_core_err (dev,"reset reload flow aborted, PCI reads still not working\n" ); elsemlx5_load_one (dev ,true ); -devlink_remote_reload_actions_performed (priv_to_devlink (dev),0 , +devl_lock (devlink); +devlink_remote_reload_actions_performed (devlink,0 ,BIT (DEVLINK_RELOAD_ACTION_DRIVER_REINIT ) |BIT (DEVLINK_RELOAD_ACTION_FW_ACTIVATE )); +devl_unlock (devlink); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/121 net/mlx5e: Require mlx5 tc classifier action support for IPsec prio capability
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rahul Rameshbabu <[email protected]>
[ Upstream commit 06827e27fdcd197557be72b2229dbd362303794f ]
Require mlx5 classifier action support when creating IPSec chains in offload path. MLX5_IPSEC_CAP_PRIO should only be set if CONFIG_MLX5_CLS_ACT is enabled. If CONFIG_MLX5_CLS_ACT=n and MLX5_IPSEC_CAP_PRIO is set, configuring IPsec offload will fail due to the mlxx5 ipsec chain rules failing to be created due to lack of classifier action support.
--- .../ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +4 -3
@@ -50,9 +50,10 @@ u32 mlx5_ipsec_device_caps(struct mlx5_core_dev *mdev) MLX5_CAP_FLOWTABLE_NIC_RX(mdev, decap)) caps |=MLX5_IPSEC_CAP_PACKET_OFFLOAD ; -if ((MLX5_CAP_FLOWTABLE_NIC_TX (mdev, ignore_flow_level) && -MLX5_CAP_FLOWTABLE_NIC_RX (mdev, ignore_flow_level)) || -MLX5_CAP_ESW_FLOWTABLE_FDB (mdev, ignore_flow_level)) +if (IS_ENABLED (CONFIG_MLX5_CLS_ACT ) && + ((MLX5_CAP_FLOWTABLE_NIC_TX (mdev, ignore_flow_level) && +MLX5_CAP_FLOWTABLE_NIC_RX (mdev, ignore_flow_level)) || +MLX5_CAP_ESW_FLOWTABLE_FDB (mdev, ignore_flow_level))) caps |=MLX5_IPSEC_CAP_PRIO ; if (MLX5_CAP_FLOWTABLE_NIC_TX(mdev,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/121 net/mlx5e: Fix CT entry update leaks of modify header context
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mi <[email protected]>
[ Upstream commit 025f2b85a5e5a46df14ecf162c3c80a957a36d0b ]
The cited commit allocates a new modify header to replace the old one when updating CT entry. But if failed to allocate a new one, eg. exceed the max number firmware can support, modify header will be an error pointer that will trigger a panic when deallocating it. And the old modify header point is copied to old attr. When the old attr is freed, the old modify header is lost.
Fix it by restoring the old attr to attr when failed to allocate a new modify header context. So when the CT entry is freed, the right modify header context will be freed. And the panic of accessing error pointer is also fixed.
--- drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +1 -0
@@ -920,6 +920,7 @@ mlx5_tc_ct_entry_replace_rule(struct mlx5_tc_ct_priv *ct_priv,mlx5_tc_ct_entry_destroy_mod_hdr (ct_priv, zone_rule->attr, mh);mlx5_put_label_mapping (ct_priv, attr->ct_attr.ct_labels_id); err_mod_hdr: + *attr = *old_attr;kfree (old_attr); err_attr:kvfree (spec);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/121 net/mlx5e: Add a check for the return value from mlx5_port_set_eth_ptys
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shahar Shitrit <[email protected]>
[ Upstream commit 3f8e82a020a5c22f9b791f4ac499b8e18007fbda ]
Since the documentation for mlx5_toggle_port_link states that it should only be used after setting the port register, we add a check for the return value from mlx5_port_set_eth_ptys to ensure the register was successfully set before calling it.
--- drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +6 -1
@@ -1223,7 +1223,12 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv,if (!an_changes && link_modes == eproto.admin) goto out; -mlx5_port_set_eth_ptys (mdev, an_disable, link_modes, ext); + err =mlx5_port_set_eth_ptys (mdev, an_disable, link_modes, ext); +if (err) { +netdev_err (priv->netdev,"%s: failed to set ptys reg: %d\n" , __func__, err); + goto out; + } +mlx5_toggle_port_link (mdev); out:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/121 igc: Fix double reset adapter triggered from a single taprio cmd
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Faizal Rahim <[email protected]>
[ Upstream commit b9e7fc0aeda79031a101610b2fcb12bf031056e9 ]
Following the implementation of "igc: Add TransmissionOverrun counter" patch, when a taprio command is triggered by user, igc processes two
commands: TAPRIO_CMD_REPLACE followed by TAPRIO_CMD_STATS. However, both commands unconditionally pass through igc_tsn_offload_apply() which evaluates and triggers reset adapter. The double reset causes issues in the calculation of adapter->qbv_count in igc.
TAPRIO_CMD_REPLACE command is expected to reset the adapter since it activates qbv. It's unexpected for TAPRIO_CMD_STATS to do the same because it doesn't configure any driver-specific TSN settings. So, the evaluation in igc_tsn_offload_apply() isn't needed for TAPRIO_CMD_STATS.
To address this, commands parsing are relocated to igc_tsn_enable_qbv_scheduling(). Commands that don't require an adapter reset will exit after processing, thus avoiding igc_tsn_offload_apply().
--- drivers/net/ethernet/intel/igc/igc_main.c | 33 ++++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-)
drivers/net/ethernet/intel/igc/igc_main.c +17 -16
@@ -6208,21 +6208,6 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,size_t n;int i; -switch (qopt->cmd) { -case TAPRIO_CMD_REPLACE : -break ; -case TAPRIO_CMD_DESTROY : -return igc_tsn_clear_schedule (adapter); -case TAPRIO_CMD_STATS : -igc_taprio_stats (adapter->netdev, &qopt->stats); -return 0 ; -case TAPRIO_CMD_QUEUE_STATS : -igc_taprio_queue_stats (adapter->netdev, &qopt->queue_stats); -return 0 ; -default : -return -EOPNOTSUPP ; - } -if (qopt->base_time <0 )return -ERANGE ;
@@ -6331,7 +6316,23 @@ static int igc_tsn_enable_qbv_scheduling(struct igc_adapter *adapter,if (hw->mac.type != igc_i225)return -EOPNOTSUPP ; - err =igc_save_qbv_schedule (adapter, qopt); +switch (qopt->cmd) { +case TAPRIO_CMD_REPLACE : + err =igc_save_qbv_schedule (adapter, qopt); +break ; +case TAPRIO_CMD_DESTROY : + err =igc_tsn_clear_schedule (adapter); +break ; +case TAPRIO_CMD_STATS : +igc_taprio_stats (adapter->netdev, &qopt->stats); +return 0 ; +case TAPRIO_CMD_QUEUE_STATS : +igc_taprio_queue_stats (adapter->netdev, &qopt->queue_stats); +return 0 ; +default : +return -EOPNOTSUPP ; + } +if (err)return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/121 ipv6: fix ndisc_is_useropt() handling for PIO
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej Żenczykowski <[email protected]>
[ Upstream commit a46c68debf3be3a477a69ccbf0a1d050df841676 ]
The current logic only works if the PIO is between two other ND user options. This fixes it so that the PIO can also be either before or after other ND user options (for example the first or last option in the RA).
side note: there's actually Android tests verifying a portion of the old broken behaviour, so:
https://android-review.googlesource.com/c/kernel/tests/+/3196704
fixes those up.
--- net/ipv6/ndisc.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-)
net/ipv6/ndisc.c +18 -16
@@ -227,6 +227,7 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,return NULL ;memset (ndopts,0 ,sizeof (*ndopts));while (opt_len) { +bool unknown = false;int l;if (opt_len <sizeof (struct nd_opt_hdr ))return NULL ;
@@ -262,22 +263,23 @@ struct ndisc_options *ndisc_parse_options(const struct net_device *dev,break ;#endif default : -if (ndisc_is_useropt (dev, nd_opt)) { - ndopts->nd_useropts_end = nd_opt; -if (!ndopts->nd_useropts) - ndopts->nd_useropts = nd_opt; - }else { -/* -* Unknown options must be silently ignored, -* to accommodate future extension to the -* protocol. -*/ -ND_PRINTK (2 , notice, -"%s: ignored unsupported option; type=%d, len=%d\n" , - __func__, - nd_opt->nd_opt_type, - nd_opt->nd_opt_len); - } + unknown = true; + } +if (ndisc_is_useropt (dev, nd_opt)) { + ndopts->nd_useropts_end = nd_opt; +if (!ndopts->nd_useropts) + ndopts->nd_useropts = nd_opt; + }else if (unknown) { +/* +* Unknown options must be silently ignored, +* to accommodate future extension to the +* protocol. +*/ +ND_PRINTK (2 , notice, +"%s: ignored unsupported option; type=%d, len=%d\n" , + __func__, + nd_opt->nd_opt_type, + nd_opt->nd_opt_len); } next_opt: opt_len -= l;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/121 riscv: remove unused functions in traps_misaligned.c
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clément Léger <[email protected]>
[ Upstream commit f19c3b4239f5bfb69aacbaf75d4277c095e7aa7d ]
Replace macros by the only two function calls that are done from this file, store_u8() and load_u8().
Stable-dep-of: fb197c5d2fd2 ("riscv/purgatory: align riscv_kernel_entry")
--- arch/riscv/kernel/traps_misaligned.c | 46 +++++----------------------- 1 file changed, 7 insertions(+), 39 deletions(-)
arch/riscv/kernel/traps_misaligned.c +7 -39
@@ -151,51 +151,19 @@#define PRECISION_S 0#define PRECISION_D 1 -#define DECLARE_UNPRIVILEGED_LOAD_FUNCTION (type, insn) \ -static inline type load_##type(const type *addr) \ -{ \ - type val; \ - asm (#insn " %0, %1" \ - : "=&r" (val) : "m" (*addr)); \ - return val; \ -} +static inline u8 load_u8 (const u8 *addr) +{ +u8 val; -#define DECLARE_UNPRIVILEGED_STORE_FUNCTION (type, insn) \ -static inline void store_##type(type *addr, type val) \ -{ \ - asm volatile (#insn " %0, %1\n" \ - : : "r" (val), "m" (*addr)); \ -} + asmvolatile ("lbu %0, %1" :"=&r" (val) :"m" (*addr)); -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u8, lbu) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u16, lhu) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s8, lb) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s16, lh) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s32, lw) -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u8, sb) -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u16, sh) -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u32, sw) -#if defined(CONFIG_64BIT ) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u32, lwu) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u64, ld) -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u64, sd) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(ulong, ld) -#else -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u32, lw) -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(ulong, lw) - -static inline u64 load_u64 (const u64 *addr) -{ -return load_u32 ((u32 *)addr) - + ((u64 )load_u32 ((u32 *)addr +1 ) <<32 ); +return val; } -static inline void store_u64 (u64 *addr,u64 val) +static inline void store_u8 (u8 *addr,u8 val) { -store_u32 ((u32 *)addr, val); -store_u32 ((u32 *)addr +1 , val >>32 ); + asmvolatile ("sb %0, %1\n" : :"r" (val),"m" (*addr)); } -#endif static inline ulong get_insn (ulong mepc) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/121 perf: riscv: Fix selecting counters in legacy mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shifrin Dmitry <[email protected]>
[ Upstream commit 941a8e9b7a86763ac52d5bf6ccc9986d37fde628 ]
It is required to check event type before checking event config. Events with the different types can have the same config. This check is missed for legacy mode code
For such perf usage:
sysctl -w kernel.perf_user_access=2
perf stat -e cycles,L1-dcache-loads --
driver will try to force both events to CYCLE counter.
This commit implements event type check before forcing events on the special counters.
--- drivers/perf/riscv_pmu_sbi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/perf/riscv_pmu_sbi.c +1 -1
@@ -355,7 +355,7 @@ static int pmu_sbi_ctr_get_idx(struct perf_event *event)* but not in the user access mode as we want to use the other counters * that support sampling/filtering. */ -if (hwc->flags &PERF_EVENT_FLAG_LEGACY ) { +if ((hwc->flags &PERF_EVENT_FLAG_LEGACY ) && (event->attr.type ==PERF_TYPE_HARDWARE )) {if (event->attr.config ==PERF_COUNT_HW_CPU_CYCLES ) { cflags |=SBI_PMU_CFG_FLAG_SKIP_MATCH ; cmask =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/121 riscv/mm: Add handling for VM_FAULT_SIGSEGV in mm_fault_error()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhe Qiao <[email protected]>
[ Upstream commit 0c710050c47d45eb77b28c271cddefc5c785cb40 ]
Handle VM_FAULT_SIGSEGV in the page fault path so that we correctly kill the process and we don't BUG() the kernel.
--- arch/riscv/mm/fault.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
arch/riscv/mm/fault.c +9 -8
@@ -61,26 +61,27 @@ static inline void no_context(struct pt_regs *regs, unsigned long addr)static inline void mm_fault_error (struct pt_regs *regs,unsigned long addr,vm_fault_t fault) { +if (!user_mode (regs)) { +no_context (regs, addr); +return ; + } +if (fault &VM_FAULT_OOM ) {/* * We ran out of memory, call the OOM killer, and return the userspace * (which will retry the fault, or kill us if we got oom-killed). */ -if (!user_mode (regs)) { -no_context (regs, addr); -return ; - }pagefault_out_of_memory ();return ; }else if (fault & (VM_FAULT_SIGBUS |VM_FAULT_HWPOISON |VM_FAULT_HWPOISON_LARGE )) {/* Kernel mode? Handle exceptions or die */ -if (!user_mode (regs)) { -no_context (regs, addr); -return ; - }do_trap (regs,SIGBUS ,BUS_ADRERR , addr);return ; + }else if (fault &VM_FAULT_SIGSEGV ) { +do_trap (regs,SIGSEGV ,SEGV_MAPERR , addr); +return ; } +BUG (); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/121 riscv: Fix linear mapping checks for non-contiguous memory regions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stuart Menefy <[email protected]>
[ Upstream commit 3b6564427aea83b7a35a15ca278291d50a1edcfc ]
The RISC-V kernel already has checks to ensure that memory which would lie outside of the linear mapping is not used. However those checks use memory_limit, which is used to implement the mem= kernel command line option (to limit the total amount of memory, not its address range). When memory is made up of two or more non-contiguous memory banks this check is incorrect.
Two changes are made here:
- add a call in setup_bootmem() to memblock_cap_memory_range() which will cause any memory which falls outside the linear mapping to be removed from the memory regions.
- remove the check in create_linear_mapping_page_table() which was intended to remove memory which is outside the liner mapping based on memory_limit, as it is no longer needed. Note a check for mapping more memory than memory_limit (to implement mem=) is unnecessary because of the existing call to memblock_enforce_memory_limit().
This issue was seen when booting on a SV39 platform with two memory banks:
0x00,80000000 1GiB
0x20,00000000 32GiB
This memory range is 158GiB from top to bottom, but the linear mapping is limited to 128GiB, so the lower block of RAM will be mapped at PAGE_OFFSET, and the upper block straddles the top of the linear mapping.
This causes the following Oops:
[ 0.000000] Linux version 6.10.0-rc2-gd3b8dd5b51dd-dirty ([email protected]) (riscv64-codasip-linux-gcc (GCC) 13.2.0, GNU ld (GNU Binutils) 2.41.0.20231213) #20 SMP Sat Jun 22 11:34:22 BST 2024 [ 0.000000] memblock_add: [0x0000000080000000-0x00000000bfffffff] early_init_dt_add_memory_arch+0x4a/0x52 [ 0.000000] memblock_add: [0x0000002000000000-0x00000027ffffffff] early_init_dt_add_memory_arch+0x4a/0x52 ... [ 0.000000] memblock_alloc_try_nid: 23724 bytes align=0x8 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 early_init_dt_alloc_memory_arch+0x1e/0x48 [ 0.000000] memblock_reserve: [0x00000027ffff5350-0x00000027ffffaffb] memblock_alloc_range_nid+0xb8/0x132 [ 0.000000] Unable to handle kernel paging request at virtual address fffffffe7fff5350 [ 0.000000] Oops [#1] [ 0.000000] Modules linked in: [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.10.0-rc2-gd3b8dd5b51dd-dirty #20 [ 0.000000] Hardware name: codasip,a70x (DT) [ 0.000000] epc : __memset+0x8c/0x104 [ 0.000000] ra : memblock_alloc_try_nid+0x74/0x84 [ 0.000000] epc : ffffffff805e88c8 ra : ffffffff806148f6 sp : ffffffff80e03d50 [ 0.000000] gp : ffffffff80ec4158 tp : ffffffff80e0bec0 t0 : fffffffe7fff52f8 [ 0.000000] t1 : 00000027ffffb000 t2 : 5f6b636f6c626d65 s0 : ffffffff80e03d90 [ 0.000000] s1 : 0000000000005cac a0 : fffffffe7fff5350 a1 : 0000000000000000 [ 0.000000] a2 : 0000000000005cac a3 : fffffffe7fffaff8 a4 : 000000000000002c [ 0.000000] a5 : ffffffff805e88c8 a6 : 0000000000005cac a7 : 0000000000000030 [ 0.000000] s2 : fffffffe7fff5350 s3 : ffffffffffffffff s4 : 0000000000000000 [ 0.000000] s5 : ffffffff8062347e s6 : 0000000000000000 s7 : 0000000000000001 [ 0.000000] s8 : 0000000000002000 s9 : 00000000800226d0 s10: 0000000000000000 [ 0.000000] s11: 0000000000000000 t3 : ffffffff8080a928 t4 : ffffffff8080a928 [ 0.000000] t5 : ffffffff8080a928 t6 : ffffffff8080a940 [ 0.000000] status: 0000000200000100 badaddr: fffffffe7fff5350 cause: 000000000000000f [ 0.000000] [<ffffffff805e88c8>] __memset+0x8c/0x104 [ 0.000000] [<ffffffff8062349c>] early_init_dt_alloc_memory_arch+0x1e/0x48 [ 0.000000] [<ffffffff8043e892>] __unflatten_device_tree+0x52/0x114 [ 0.000000] [<ffffffff8062441e>] unflatten_device_tree+0x9e/0xb8 [ 0.000000] [<ffffffff806046fe>] setup_arch+0xd4/0x5bc [ 0.000000] [<ffffffff806007aa>] start_kernel+0x76/0x81a [ 0.000000] Code: b823 02b2 bc23 02b2 b023 04b2 b423 04b2 b823 04b2 (bc23) 04b2 [ 0.000000] ---[ end trace 0000000000000000 ]--- [ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task! [ 0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---
The problem is that memblock (unaware that some physical memory cannot be used) has allocated memory from the top of memory but which is outside the linear mapping region.
--- arch/riscv/mm/init.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
arch/riscv/mm/init.c +11 -4
@@ -217,8 +217,6 @@ static void __init setup_bootmem(void)*/ memblock_reserve (vmlinux_start, vmlinux_end - vmlinux_start); - phys_ram_end =memblock_end_of_DRAM (); -/* * Make sure we align the start of the memory on a PMD boundary so that * at worst, we map the linear mapping with PMD mappings.
@@ -233,6 +231,16 @@ static void __init setup_bootmem(void)if (IS_ENABLED (CONFIG_64BIT ) &&IS_ENABLED (CONFIG_MMU )) kernel_map.va_pa_offset =PAGE_OFFSET - phys_ram_base; +/* +* The size of the linear page mapping may restrict the amount of +* usable RAM. +*/ +if (IS_ENABLED (CONFIG_64BIT )) { + max_mapped_addr =__pa (PAGE_OFFSET ) +KERN_VIRT_SIZE ; +memblock_cap_memory_range (phys_ram_base, + max_mapped_addr - phys_ram_base); + } +/* * Reserve physical address space that would be mapped to virtual * addresses greater than (void *)(-PAGE_SIZE) because:
@@ -249,6 +257,7 @@ static void __init setup_bootmem(void)memblock_reserve (max_mapped_addr, (phys_addr_t)-max_mapped_addr); } + phys_ram_end =memblock_end_of_DRAM (); min_low_pfn =PFN_UP (phys_ram_base); max_low_pfn = max_pfn =PFN_DOWN (phys_ram_end); high_memory = (void *)(__va (PFN_PHYS (max_low_pfn)));
@@ -1269,8 +1278,6 @@ static void __init create_linear_mapping_page_table(void)if (start <=__pa (PAGE_OFFSET ) &&__pa (PAGE_OFFSET ) < end) start =__pa (PAGE_OFFSET ); -if (end >=__pa (PAGE_OFFSET ) + memory_limit) - end =__pa (PAGE_OFFSET ) + memory_limit;create_linear_mapping_range (start, end,0 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/121 arm64: jump_label: Ensure patched jump_labels are visible to all CPUs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[ Upstream commit cfb00a35786414e7c0e6226b277d9f09657eae74 ]
Although the Arm architecture permits concurrent modification and execution of NOP and branch instructions, it still requires some synchronisation to ensure that other CPUs consistently execute the newly written instruction:
Quoted 4 lines
When the modified instructions are observable, each PE that is executing the modified instructions must execute an ISB or perform a context synchronizing event to ensure execution of the modified instructions
Prior to commit f6cc0c501649 ("arm64: Avoid calling stop_machine() when patching jump labels"), the arm64 jump_label patching machinery performed synchronisation using stop_machine() after each modification, however this was problematic when flipping static keys from atomic contexts (namely, the arm_arch_timer CPU hotplug startup notifier) and so we switched to the _nosync() patching routines to avoid "scheduling while atomic" BUG()s during boot.
In hindsight, the analysis of the issue in f6cc0c501649 isn't quite
right: it cites the use of IPIs in the default patching routines as the cause of the lockup, whereas stop_machine() does not rely on IPIs and the I-cache invalidation is performed using __flush_icache_range(), which elides the call to kick_all_cpus_sync(). In fact, the blocking wait for other CPUs is what triggers the BUG() and the problem remains even after f6cc0c501649, for example because we could block on the jump_label_mutex. Eventually, the arm_arch_timer driver was fixed to avoid the static key entirely in commit a862fc2254bd ("clocksource/arm_arch_timer: Remove use of workaround static key").
This all leaves the jump_label patching code in a funny situation on arm64 as we do not synchronise with other CPUs to reduce the likelihood of a bug which no longer exists. Consequently, toggling a static key on one CPU cannot be assumed to take effect on other CPUs, leading to potential issues, for example with missing preempt notifiers.
Rather than revert f6cc0c501649 and go back to stop_machine() for each patch site, implement arch_jump_label_transform_apply() and kick all the other CPUs with an IPI at the end of patching.
--- arch/arm64/include/asm/jump_label.h | 1 + arch/arm64/kernel/jump_label.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-)
arch/arm64/include/asm/jump_label.h +1 -0
@@ -13,6 +13,7 @@#include <linux/types.h> #include <asm/insn.h> +#define HAVE_JUMP_LABEL_BATCH #define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE static __always_inline bool arch_static_branch(struct static_key * const key,
arch/arm64/kernel/jump_label.c +9 -2
@@ -7,11 +7,12 @@*/ #include <linux/kernel.h> #include <linux/jump_label.h> +#include <linux/smp.h> #include <asm/insn.h> #include <asm/patching.h> -void arch_jump_label_transform (struct jump_entry *entry, -enum jump_label_type type) +bool arch_jump_label_transform_queue (struct jump_entry *entry, +enum jump_label_type type) {void *addr = (void *)jump_entry_code (entry);u32 insn;
@@ -25,4 +26,10 @@ void arch_jump_label_transform(struct jump_entry *entry, }aarch64_insn_patch_text_nosync (addr, insn); +return true; +} + +void arch_jump_label_transform_apply (void ) +{ +kick_all_cpus_sync (); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/121 rust: SHADOW_CALL_STACK is incompatible with Rust
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Ryhl <[email protected]>
commit f126745da81783fb1d082e67bf14c6795e489a88 upstream.
When using the shadow call stack sanitizer, all code must be compiled with the -ffixed-x18 flag, but this flag is not currently being passed to Rust. This results in crashes that are extremely difficult to debug.
To ensure that nobody else has to go through the same debugging session that I had to, prevent configurations that enable both SHADOW_CALL_STACK and RUST.
It is rather common for people to backport 724a75ac9542 ("arm64: rust:
Enable Rust support for AArch64"), so I recommend applying this fix all the way back to 6.1.
--- init/Kconfig | 1 + 1 file changed, 1 insertion(+)
init/Kconfig +1 -0
@@ -1898,6 +1898,7 @@ config RUST depends on !MODVERSIONS depends on !GCC_PLUGINS depends on !RANDSTRUCT + depends on !SHADOW_CALL_STACK depends on !DEBUG_INFO_BTF || PAHOLE_HAS_LANG_EXCLUDE help Enables Rust support in the kernel.
Greg Kroah-Hartman
maintainerPATCH 95/121 platform/chrome: cros_ec_proto: Lock device when updating MKBP version
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patryk Duda <[email protected]>
commit df615907f1bf907260af01ccb904d0e9304b5278 upstream.
The cros_ec_get_host_command_version_mask() function requires that the caller must have ec_dev->lock mutex before calling it. This requirement was not met and as a result it was possible that two commands were sent to the device at the same time.
The problem was observed while using UART backend which doesn't use any additional locks, unlike SPI backend which locks the controller until response is received.
--- drivers/platform/chrome/cros_ec_proto.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/platform/chrome/cros_ec_proto.c +2 -0
@@ -805,9 +805,11 @@ int cros_ec_get_next_event(struct cros_eif (ret == -ENOPROTOOPT ) {dev_dbg (ec_dev->dev,"GET_NEXT_EVENT returned invalid version error.\n" ); +mutex_lock (&ec_dev->lock); ret =cros_ec_get_host_command_version_mask (ec_dev,EC_CMD_GET_NEXT_EVENT , &ver_mask); +mutex_unlock (&ec_dev->lock);if (ret <0 || ver_mask ==0 )/* * Do not change the MKBP supported version if we can't
Greg Kroah-Hartman
maintainerPATCH 96/121 HID: wacom: Modify pen IDs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tatsunosuke Tobita <[email protected]>
commit f0d17d696dfce77c9abc830e4ac2d677890a2dad upstream.
The pen ID, 0x80842, was not the correct ID for wacom driver to treat. The ID was corrected to 0x8842.
Also, 0x4200 was not the expected ID used on any Wacom device. Therefore, 0x4200 was removed.
--- drivers/hid/wacom_wac.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/hid/wacom_wac.c +1 -2
@@ -714,13 +714,12 @@ static int wacom_intuos_get_tool_type(incase 0x8e2 :/* IntuosHT2 pen */ case 0x022 :case 0x200 :/* Pro Pen 3 */ -case 0x04200 :/* Pro Pen 3 */ case 0x10842 :/* MobileStudio Pro Pro Pen slim */ case 0x14802 :/* Intuos4/5 13HD/24HD Classic Pen */ case 0x16802 :/* Cintiq 13HD Pro Pen */ case 0x18802 :/* DTH2242 Pen */ case 0x10802 :/* Intuos4/5 13HD/24HD General Pen */ -case 0x80842 :/* Intuos Pro and Cintiq Pro 3D Pen */ +case 0x8842 :/* Intuos Pro and Cintiq Pro 3D Pen */ tool_type =BTN_TOOL_PEN ;break ;
Greg Kroah-Hartman
maintainerPATCH 97/121 btrfs: zoned: fix zone_unusable accounting on making block group read-write again
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
commit 8cd44dd1d17a23d5cc8c443c659ca57aa76e2fa5 upstream.
When btrfs makes a block group read-only, it adds all free regions in the block group to space_info->bytes_readonly. That free space excludes reserved and pinned regions. OTOH, when btrfs makes the block group read-write again, it moves all the unused regions into the block group's zone_unusable. That unused region includes reserved and pinned regions. As a result, it counts too much zone_unusable bytes.
Fortunately (or unfortunately), having erroneous zone_unusable does not affect the calculation of space_info->bytes_readonly, because free space (num_bytes in btrfs_dec_block_group_ro) calculation is done based on the erroneous zone_unusable and it reduces the num_bytes just to cancel the error.
This behavior can be easily discovered by adding a WARN_ON to check e.g, "bg->pinned > 0" in btrfs_dec_block_group_ro(), and running fstests test case like btrfs/282.
Fix it by properly considering pinned and reserved in btrfs_dec_block_group_ro(). Also, add a WARN_ON and introduce btrfs_space_info_update_bytes_zone_unusable() to catch a similar mistake.
--- fs/btrfs/block-group.c | 13 ++++++++----- fs/btrfs/extent-tree.c | 3 ++- fs/btrfs/free-space-cache.c | 4 +++- fs/btrfs/space-info.c | 2 +- fs/btrfs/space-info.h | 1 + include/trace/events/btrfs.h | 8 ++++++++ 6 files changed, 23 insertions(+), 8 deletions(-)
fs/btrfs/block-group.c +8 -5
@@ -1214,8 +1214,8 @@ int btrfs_remove_block_group(struct btrf block_group->space_info->total_bytes -= block_group->length; block_group->space_info->bytes_readonly -= (block_group->length - block_group->zone_unusable); - block_group->space_info->bytes_zone_unusable -= - block_group->zone_unusable; +btrfs_space_info_update_bytes_zone_unusable (fs_info, block_group->space_info, + -block_group->zone_unusable); block_group->space_info->disk_total -= block_group->length * factor;spin_unlock (&block_group->space_info->lock);
@@ -1399,7 +1399,8 @@ static int inc_block_group_ro(struct btrif (btrfs_is_zoned (cache->fs_info)) {/* Migrate zone_unusable bytes to readonly */ sinfo->bytes_readonly += cache->zone_unusable; - sinfo->bytes_zone_unusable -= cache->zone_unusable; +btrfs_space_info_update_bytes_zone_unusable (cache->fs_info, sinfo, + -cache->zone_unusable); cache->zone_unusable =0 ; } cache->ro++;
@@ -3023,9 +3024,11 @@ void btrfs_dec_block_group_ro(struct btrif (btrfs_is_zoned (cache->fs_info)) {/* Migrate zone_unusable bytes back */ cache->zone_unusable = - (cache->alloc_offset - cache->used) + + (cache->alloc_offset - cache->used - cache->pinned - + cache->reserved) + (cache->length - cache->zone_capacity); - sinfo->bytes_zone_unusable += cache->zone_unusable; +btrfs_space_info_update_bytes_zone_unusable (cache->fs_info, sinfo, + cache->zone_unusable); sinfo->bytes_readonly -= cache->zone_unusable; } num_bytes = cache->length - cache->reserved -
fs/btrfs/extent-tree.c +2 -1
@@ -2749,7 +2749,8 @@ static int unpin_extent_range(struct btr readonly = true; }else if (btrfs_is_zoned (fs_info)) {/* Need reset before reusing in a zoned block group */ - space_info->bytes_zone_unusable += len; +btrfs_space_info_update_bytes_zone_unusable (fs_info, space_info, + len); readonly = true; }spin_unlock (&cache->lock);
fs/btrfs/free-space-cache.c +3 -1
@@ -2721,8 +2721,10 @@ static int __btrfs_add_free_space_zoned(* If the block group is read-only, we should account freed space into * bytes_readonly. */ -if (!block_group->ro) +if (!block_group->ro) { block_group->zone_unusable += to_unusable; +WARN_ON (block_group->zone_unusable > block_group->length); + }spin_unlock (&ctl->tree_lock);if (!used) {spin_lock (&block_group->lock);
fs/btrfs/space-info.c +1 -1
@@ -312,7 +312,7 @@ void btrfs_add_bg_to_space_info(struct b found->bytes_used += block_group->used; found->disk_used += block_group->used * factor; found->bytes_readonly += block_group->bytes_super; - found->bytes_zone_unusable += block_group->zone_unusable; +btrfs_space_info_update_bytes_zone_unusable (info, found, block_group->zone_unusable);if (block_group->length >0 ) found->full =0 ;btrfs_try_granting_tickets (info, found);
fs/btrfs/space-info.h +1 -0
@@ -197,6 +197,7 @@ btrfs_space_info_update_##name(struct btDECLARE_SPACE_INFO_UPDATE (bytes_may_use,"space_info" );DECLARE_SPACE_INFO_UPDATE (bytes_pinned,"pinned" ); +DECLARE_SPACE_INFO_UPDATE (bytes_zone_unusable,"zone_unusable" );int btrfs_init_space_info (struct btrfs_fs_info *fs_info); void btrfs_add_bg_to_space_info(struct btrfs_fs_info *info,
include/trace/events/btrfs.h +8 -0
@@ -2430,6 +2430,14 @@ DEFINE_EVENT(btrfs__space_info_update, uTP_ARGS (fs_info, sinfo, old, diff) ); +DEFINE_EVENT (btrfs__space_info_update, update_bytes_zone_unusable, + + TP_PROTO(const struct btrfs_fs_info *fs_info, + const struct btrfs_space_info *sinfo, u64 old, s64 diff), + +TP_ARGS (fs_info, sinfo, old, diff) +); + DECLARE_EVENT_CLASS(btrfs_raid56_bio, TP_PROTO(const struct btrfs_raid_bio *rbio,
Greg Kroah-Hartman
maintainerPATCH 98/121 btrfs: do not subtract delalloc from avail bytes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
commit d89c285d28491d8f10534c262ac9e6bdcbe1b4d2 upstream.
The block group's avail bytes printed when dumping a space info subtract the delalloc_bytes. However, as shown in btrfs_add_reserved_bytes() and btrfs_free_reserved_bytes(), it is added or subtracted along with "reserved" for the delalloc case, which means the "delalloc_bytes" is a part of the "reserved" bytes. So, excluding it to calculate the avail space counts delalloc_bytes twice, which can lead to an invalid result.
--- fs/btrfs/space-info.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/btrfs/space-info.c +1 -2
@@ -524,8 +524,7 @@ again:spin_lock (&cache->lock); avail = cache->length - cache->used - cache->pinned - - cache->reserved - cache->delalloc_bytes - - cache->bytes_super - cache->zone_unusable; + cache->reserved - cache->bytes_super - cache->zone_unusable; btrfs_info(fs_info, "block group %llu has %llu bytes, %llu used %llu pinned %llu reserved %llu delalloc %llu super %llu zone_unusable (%llu bytes available) %s", cache->start, cache->length, cache->used, cache->pinned,
Greg Kroah-Hartman
maintainerPATCH 99/121 protect the fetch of ->fd[fd] in do_dup2() from mispredictions
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 8aa37bde1a7b645816cda8b80df4753ecf172bf1 upstream.
both callers have verified that fd is not greater than ->max_fds; however, misprediction might end up with
tofree = fdt->fd[fd];
being speculatively executed. That's wrong for the same reasons why it's wrong in close_fd()/file_close_fd_locked(); the same solution applies - array_index_nospec(fd, fdt->max_fds) could differ from fd only in case of speculative execution on mispredicted path.
--- fs/file.c | 1 + 1 file changed, 1 insertion(+)
fs/file.c +1 -0
@@ -1124,6 +1124,7 @@ __releases(&files->file_lock)* tables and this condition does not arise without those. */ fdt =files_fdtable (files); + fd =array_index_nospec (fd, fdt->max_fds); tofree = fdt->fd[fd];if (!tofree &&fd_is_open (fd, fdt)) goto Ebusy;
Greg Kroah-Hartman
maintainerPATCH 100/121 mptcp: sched: check both directions for backup
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit b6a66e521a2032f7fcba2af5a9bcbaeaa19b7ca3 upstream.
The 'mptcp_subflow_context' structure has two items related to the backup flags:
- 'backup': the subflow has been marked as backup by the other peer
- 'request_bkup': the backup flag has been set by the host
Before this patch, the scheduler was only looking at the 'backup' flag. That can make sense in some cases, but it looks like that's not what we wanted for the general use, because either the path-manager was setting both of them when sending an MP_PRIO, or the receiver was duplicating the 'backup' flag in the subflow request.
Note that the use of these two flags in the path-manager are going to be fixed in the next commits, but this change here is needed not to modify the behaviour.
--- include/trace/events/mptcp.h | 2 +- net/mptcp/protocol.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-)
include/trace/events/mptcp.h +1 -1
@@ -34,7 +34,7 @@ TRACE_EVENT(mptcp_subflow_get_send,struct sock *ssk; __entry->active =mptcp_subflow_active (subflow); - __entry->backup = subflow->backup; + __entry->backup = subflow->backup || subflow->request_bkup;if (subflow->tcp_sock &&sk_fullsock (subflow->tcp_sock)) __entry->free =sk_stream_memory_free (subflow->tcp_sock);
net/mptcp/protocol.c +6 -4
@@ -1417,13 +1417,15 @@ struct sock *mptcp_subflow_get_send(stru }mptcp_for_each_subflow (msk, subflow) { +bool backup = subflow->backup || subflow->request_bkup; +trace_mptcp_subflow_get_send (subflow); ssk =mptcp_subflow_tcp_sock (subflow);if (!mptcp_subflow_active (subflow))continue ; tout =max (tout,mptcp_timeout_from_subflow (subflow)); - nr_active += !subflow->backup; + nr_active += !backup; pace = subflow->avg_pacing_rate;if (unlikely (!pace)) {/* init pacing rate from socket */
@@ -1434,9 +1436,9 @@ struct sock *mptcp_subflow_get_send(stru } linger_time =div_u64 ((u64 )READ_ONCE (ssk->sk_wmem_queued) <<32 , pace); -if (linger_time < send_info[subflow->backup].linger_time) { - send_info[subflow->backup].ssk = ssk; - send_info[subflow->backup].linger_time = linger_time; +if (linger_time < send_info[backup].linger_time) { + send_info[backup].ssk = ssk; + send_info[backup].linger_time = linger_time; } }__mptcp_set_timeout (sk, tout);
Greg Kroah-Hartman
maintainerPATCH 101/121 ALSA: usb-audio: Correct surround channels in UAC1 channel map
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit b7b7e1ab7619deb3b299b5e5c619c3e6f183a12d upstream.
USB-audio driver puts SNDRV_CHMAP_SL and _SR as left and right surround channels for UAC1 channel map, respectively. But they should have been SNDRV_CHMAP_RL and _RR; the current value *_SL and _SR are rather "side" channels, not "surround". I guess I took those mistakenly when I read the spec mentioning "surround left".
This patch corrects those entries to be the right channels.
--- sound/usb/stream.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/usb/stream.c +2 -2
@@ -244,8 +244,8 @@ static struct snd_pcm_chmap_elem *converSNDRV_CHMAP_FR ,/* right front */ SNDRV_CHMAP_FC ,/* center front */ SNDRV_CHMAP_LFE ,/* LFE */ -SNDRV_CHMAP_SL ,/* left surround */ -SNDRV_CHMAP_SR ,/* right surround */ +SNDRV_CHMAP_RL ,/* left surround */ +SNDRV_CHMAP_RR ,/* right surround */ SNDRV_CHMAP_FLC ,/* left of center */ SNDRV_CHMAP_FRC ,/* right of center */ SNDRV_CHMAP_RC, /* surround */
Greg Kroah-Hartman
maintainerPATCH 102/121 ALSA: hda/realtek: Add quirk for Acer Aspire E5-574G
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mavroudis Chatzilazaridis <[email protected]>
commit 3c0b6f924e1259ade38587ea719b693f6f6f2f3e upstream.
ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST fixes combo jack detection and limits the internal microphone boost that causes clipping on this model.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -9639,6 +9639,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x079b ,"Acer Aspire V5-573G" ,ALC282_FIXUP_ASPIRE_V5_PINS ),SND_PCI_QUIRK (0x1025 ,0x080d ,"Acer Aspire V5-122P" ,ALC269_FIXUP_ASPIRE_HEADSET_MIC ),SND_PCI_QUIRK (0x1025 ,0x0840 ,"Acer Aspire E1" ,ALC269VB_FIXUP_ASPIRE_E1_COEF ), +SND_PCI_QUIRK (0x1025 ,0x100c ,"Acer Aspire E5-574G" ,ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST ),SND_PCI_QUIRK (0x1025 ,0x101c ,"Acer Veriton N2510G" ,ALC269_FIXUP_LIFEBOOK ),SND_PCI_QUIRK (0x1025 ,0x102b ,"Acer Aspire C24-860" ,ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 103/121 ALSA: seq: ump: Optimize conversions from SysEx to UMP
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 952b13c215234855d75ef4b5bb0138075e73677c upstream.
The current conversion from the legacy SysEx event to UMP SysEx packet in the sequencer core has a couple of issues:
* The first packet trims the SysEx start byte (0xf0), hence it contains only 5 bytes instead of 6. This isn't wrong, per specification, but it's strange not to fill 6 bytes.
* When the SysEx end marker (0xf7) is placed at the first byte of the next packet, it'll end up with an empty data just with the END status. It can be rather folded into the previous packet with the END status.
This patch tries to address those issues. The first packet may have 6 bytes even with the SysEx start, and an empty packet with the SysEx end marker is omitted.
--- sound/core/seq/seq_ump_convert.c | 41 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-)
sound/core/seq/seq_ump_convert.c +25 -16
@@ -1192,44 +1192,53 @@ static int cvt_sysex_to_ump(struct snd_seq_client *dest, {struct snd_seq_ump_event ev_cvt;unsigned char status; -u8 buf[6 ], *xbuf; +u8 buf[8 ], *xbuf;int offset =0 ;int len, err; +bool finished = false;if (!snd_seq_ev_is_variable (event))return 0 ;setup_ump_event (&ev_cvt, event); -for (;;) { +while (!finished) { len =snd_seq_expand_var_event_at (event,sizeof (buf), buf, offset);if (len <=0 )break ; -if (WARN_ON (len >6 )) +if (WARN_ON (len >sizeof (buf)))break ; - offset += len; + xbuf = buf; + status =UMP_SYSEX_STATUS_CONTINUE ; +/* truncate the sysex start-marker */ if (*xbuf ==UMP_MIDI1_MSG_SYSEX_START ) { status =UMP_SYSEX_STATUS_START ; - xbuf++; len--; -if (len >0 && xbuf[len -1 ] ==UMP_MIDI1_MSG_SYSEX_END ) { - status =UMP_SYSEX_STATUS_SINGLE ; - len--; - } - }else { -if (xbuf[len -1 ] ==UMP_MIDI1_MSG_SYSEX_END ) { - status =UMP_SYSEX_STATUS_END ; - len--; - }else { - status =UMP_SYSEX_STATUS_CONTINUE ; - } + offset++; + xbuf++; } + +/* if the last of this packet or the 1st byte of the next packet +* is the end-marker, finish the transfer with this packet +*/ +if (len >0 && len <8 && + xbuf[len -1 ] ==UMP_MIDI1_MSG_SYSEX_END ) { +if (status ==UMP_SYSEX_STATUS_START ) + status =UMP_SYSEX_STATUS_SINGLE ; +else + status =UMP_SYSEX_STATUS_END ; + len--; + finished = true; + } + + len =min (len,6 );fill_sysex7_ump (dest_port, ev_cvt.ump, status, xbuf, len); err =__snd_seq_deliver_single_event (dest, dest_port, (struct snd_seq_event *)&ev_cvt, atomic, hop);if (err <0 )return err; + offset += len; }return 0 ; }
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 104/121 Revert "ALSA: firewire-lib: obsolete workqueue for period update"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edmund Raile <[email protected]>
commit 6ccf9984d6be3c2f804087b736db05c2ec42664b upstream.
prepare resolution of AB/BA deadlock competition for substream lock:
restore workqueue previously used for process context:
revert commit b5b519965c4c ("ALSA: firewire-lib: obsolete workqueue for period update")
--- sound/firewire/amdtp-stream.c | 15 +++++++++++++++ sound/firewire/amdtp-stream.h | 1 + 2 files changed, 16 insertions(+)
sound/firewire/amdtp-stream.c +15 -0
@@ -77,6 +77,8 @@// overrun. Actual device can skip more, then this module stops the packet streaming. #define IR_JUMBO_PAYLOAD_MAX_SKIP_CYCLES 5 +static void pcm_period_work (struct work_struct *work); +/** * amdtp_stream_init - initialize an AMDTP stream structure * @s: the AMDTP stream to initialize
@@ -105,6 +107,7 @@ int amdtp_stream_init(struct amdtp_strea s->flags = flags; s->context =ERR_PTR (-1 );mutex_init (&s->mutex); +INIT_WORK (&s->period_work, pcm_period_work); s->packet_index =0 ;init_waitqueue_head (&s->ready_wait);
@@ -347,6 +350,7 @@ EXPORT_SYMBOL(amdtp_stream_get_max_paylo*/ void amdtp_stream_pcm_prepare (struct amdtp_stream *s) { +cancel_work_sync (&s->period_work); s->pcm_buffer_pointer =0 ; s->pcm_period_pointer =0 ; }
@@ -624,6 +628,16 @@ static void update_pcm_pointers(struct a } } +static void pcm_period_work (struct work_struct *work) +{ + struct amdtp_stream *s = container_of(work, struct amdtp_stream, + period_work); +struct snd_pcm_substream *pcm =READ_ONCE (s->pcm); + +if (pcm) +snd_pcm_period_elapsed (pcm); +} +static int queue_packet (struct amdtp_stream *s,struct fw_iso_packet *params,bool sched_irq) {
@@ -1912,6 +1926,7 @@ static void amdtp_stream_stop(struct amdreturn ; } +cancel_work_sync (&s->period_work);fw_iso_context_stop (s->context);fw_iso_context_destroy (s->context); s->context =ERR_PTR (-1 );
sound/firewire/amdtp-stream.h +1 -0
@@ -191,6 +191,7 @@ struct amdtp_stream {/* For a PCM substream processing. */ struct snd_pcm_substream *pcm; +struct work_struct period_work;snd_pcm_uframes_t pcm_buffer_pointer;unsigned int pcm_period_pointer;unsigned int pcm_frame_multiplier;
Greg Kroah-Hartman
maintainerPATCH 105/121 Revert "ALSA: firewire-lib: operate for period elapse event in process context"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edmund Raile <[email protected]>
commit 3dab73ab925a51ab05543b491bf17463a48ca323 upstream.
Commit 7ba5ca32fe6e ("ALSA: firewire-lib: operate for period elapse event in process context") removed the process context workqueue from amdtp_domain_stream_pcm_pointer() and update_pcm_pointers() to remove its overhead.
With RME Fireface 800, this lead to a regression since Kernels 5.14.0, causing an AB/BA deadlock competition for the substream lock with eventual system freeze under ALSA operation:
thread 0:
* (lock A) acquire substream lock by snd_pcm_stream_lock_irq() in snd_pcm_status64()
* (lock B) wait for tasklet to finish by calling tasklet_unlock_spin_wait() in tasklet_disable_in_atomic() in ohci_flush_iso_completions() of ohci.c
thread 1:
* (lock B) enter tasklet
* (lock A) attempt to acquire substream lock,
waiting for it to be released:
snd_pcm_stream_lock_irqsave() in
snd_pcm_period_elapsed() in
update_pcm_pointers() in
process_ctx_payloads() in
process_rx_packets() of amdtp-stream.c
? tasklet_unlock_spin_wait
</NMI> <TASK>
ohci_flush_iso_completions firewire_ohciamdtp_domain_stream_pcm_pointer snd_firewire_libsnd_pcm_update_hw_ptr0 snd_pcmsnd_pcm_status64 snd_pcm
? native_queued_spin_lock_slowpath
</NMI> <IRQ>
_raw_spin_lock_irqsavesnd_pcm_period_elapsed snd_pcmprocess_rx_packets snd_firewire_libirq_target_callback snd_firewire_libhandle_it_packet firewire_ohcicontext_tasklet firewire_ohci
Restore the process context work queue to prevent deadlock AB/BA deadlock competition for ALSA substream lock of snd_pcm_stream_lock_irq() in snd_pcm_status64()
and snd_pcm_stream_lock_irqsave() in snd_pcm_period_elapsed().
revert commit 7ba5ca32fe6e ("ALSA: firewire-lib: operate for period elapse event in process context")
Replace inline description to prevent future deadlock.
--- sound/firewire/amdtp-stream.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-)
sound/firewire/amdtp-stream.c +9 -14
@@ -615,16 +615,8 @@ static void update_pcm_pointers(struct a// The program in user process should periodically check the status of intermediate // buffer associated to PCM substream to process PCM frames in the buffer, instead // of receiving notification of period elapsed by poll wait. -if (!pcm->runtime->no_period_wakeup) { -if (in_softirq ()) { -// In software IRQ context for 1394 OHCI. -snd_pcm_period_elapsed (pcm); - }else { -// In process context of ALSA PCM application under acquired lock of -// PCM substream. -snd_pcm_period_elapsed_under_stream_lock (pcm); - } - } +if (!pcm->runtime->no_period_wakeup) +queue_work (system_highpri_wq, &s->period_work); } }
@@ -1866,11 +1858,14 @@ unsigned long amdtp_domain_stream_pcm_po {struct amdtp_stream *irq_target = d->irq_target; -// Process isochronous packets queued till recent isochronous cycle to handle PCM frames. if (irq_target &&amdtp_stream_running (irq_target)) { -// In software IRQ context, the call causes dead-lock to disable the tasklet -// synchronously. -if (!in_softirq ()) +// use wq to prevent AB/BA deadlock competition for +// substream lock: +// fw_iso_context_flush_completions() acquires +// lock by ohci_flush_iso_completions(), +// amdtp-stream process_rx_packets() attempts to +// acquire same lock by snd_pcm_elapsed() +if (current_work () != &s->period_work)fw_iso_context_flush_completions (irq_target->context); }
Greg Kroah-Hartman
maintainerPATCH 106/121 drm/vmwgfx: Fix a deadlock in dma buf fence polling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zack Rusin <[email protected]>
commit e58337100721f3cc0c7424a18730e4f39844934f upstream.
Introduce a version of the fence ops that on release doesn't remove the fence from the pending list, and thus doesn't require a lock to fix poll->fence wait->fence unref deadlocks.
vmwgfx overwrites the wait callback to iterate over the list of all fences and update their status, to do that it holds a lock to prevent the list modifcations from other threads. The fence destroy callback both deletes the fence and removes it from the list of pending fences, for which it holds a lock.
dma buf polling cb unrefs a fence after it's been signaled: so the poll calls the wait, which signals the fences, which are being destroyed. The destruction tries to acquire the lock on the pending fences list which it can never get because it's held by the wait from which it was called.
Old bug, but not a lot of userspace apps were using dma-buf polling interfaces. Fix those, in particular this fixes KDE stalls/deadlock.
--- drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +7 -10
@@ -32,7 +32,6 @@#define VMW_FENCE_WRAP (1 << 31)struct vmw_fence_manager { -int num_fence_objects;struct vmw_private *dev_priv;spinlock_t lock;struct list_head fence_list;
@@ -124,13 +123,13 @@ static void vmw_fence_obj_destroy(struct {struct vmw_fence_obj *fence = container_of(f, struct vmw_fence_obj, base); -struct vmw_fence_manager *fman =fman_from_fence (fence); -spin_lock (&fman->lock); -list_del_init (&fence->head); - --fman->num_fence_objects; -spin_unlock (&fman->lock); +if (!list_empty (&fence->head)) { +spin_lock (&fman->lock); +list_del_init (&fence->head); +spin_unlock (&fman->lock); + } fence->destroy (fence); }
@@ -257,7 +256,6 @@ static const struct dma_fence_ops vmw_fe .release = vmw_fence_obj_destroy, }; -/* * Execute signal actions on fences recently signaled. * This is done from a workqueue so we don't have to execute
@@ -355,7 +353,6 @@ static int vmw_fence_obj_init(struct vmw goto out_unlock; }list_add_tail (&fence->head, &fman->fence_list); - ++fman->num_fence_objects; out_unlock:spin_unlock (&fman->lock);
@@ -403,7 +400,7 @@ static bool vmw_fence_goal_new_locked(st u32 passed_seqno) {u32 goal_seqno; -struct vmw_fence_obj *fence; +struct vmw_fence_obj *fence, *next_fence;if (likely (!fman->seqno_valid))return false;
@@ -413,7 +410,7 @@ static bool vmw_fence_goal_new_locked(streturn false; fman->seqno_valid = false; -list_for_each_entry (fence, &fman->fence_list, head) { +list_for_each_entry_safe (fence, next_fence, &fman->fence_list, head) {if (!list_empty (&fence->seq_passed_actions)) { fman->seqno_valid = true; vmw_fence_goal_write(fman->dev_priv,
Greg Kroah-Hartman
maintainerPATCH 107/121 drm/virtio: Fix type of dma-fence context variable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Osipenko <[email protected]>
commit 445d336cd15860f1efb441e6d694f829fbf679eb upstream.
Type of DMA fence context is u64. Fence-waiting code uses u32 for the context variable, fix it.
--- drivers/gpu/drm/virtio/virtgpu_submit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/virtio/virtgpu_submit.c +1 -1
@@ -48,7 +48,7 @@ struct virtio_gpu_submit {static int virtio_gpu_do_fence_wait (struct virtio_gpu_submit *submit,struct dma_fence *in_fence) { -u32 context = submit->fence_ctx + submit->ring_idx; +u64 context = submit->fence_ctx + submit->ring_idx;if (dma_fence_match_context (in_fence, context))return 0 ;
Signature · 1 line
2.46.0
Greg Kroah-Hartman
maintainerPATCH 108/121 drm/i915: Fix possible int overflow in skl_ddi_calculate_wrpll()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Zhandarovich <[email protected]>
commit 5b511572660190db1dc8ba412efd0be0d3781ab6 upstream.
On the off chance that clock value ends up being too high (by means of skl_ddi_calculate_wrpll() having been called with big enough value of crtc_state->port_clock * 1000), one possible consequence may be that the result will not be able to fit into signed int.
Fix this issue by moving conversion of clock parameter from kHz to Hz into the body of skl_ddi_calculate_wrpll(), as well as casting the same parameter to u64 type while calculating the value for AFE clock. This both mitigates the overflow problem and avoids possible erroneous integer promotion mishaps.
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/display/intel_dpll_mgr.c +3 -3
@@ -1556,7 +1556,7 @@ static void skl_wrpll_params_populate(st }static int -skl_ddi_calculate_wrpll (int clock/* in Hz */ , +skl_ddi_calculate_wrpll (int clock,int ref_clock,struct skl_wrpll_params *wrpll_params) {
@@ -1581,7 +1581,7 @@ skl_ddi_calculate_wrpll(int clock /* in };unsigned int dco, d, i;unsigned int p0, p1, p2; -u64 afe_clock = clock *5 ;/* AFE Clock is 5x Pixel clock */ +u64 afe_clock = (u64 )clock *1000 *5 ;/* AFE Clock is 5x Pixel clock, in Hz */ for (d =0 ; d <ARRAY_SIZE (dividers); d++) {for (dco =0 ; dco <ARRAY_SIZE (dco_central_freq); dco++) {
@@ -1713,7 +1713,7 @@ static int skl_ddi_hdmi_pll_dividers(str ctrl1 |=DPLL_CTRL1_HDMI_MODE (0 ); - ret =skl_ddi_calculate_wrpll (crtc_state->port_clock *1000 , + ret =skl_ddi_calculate_wrpll (crtc_state->port_clock, i915->display.dpll.ref_clks.nssc, &wrpll_params);if (ret)return ret;
Greg Kroah-Hartman
maintainerPATCH 109/121 net: usb: sr9700: fix uninitialized variable use in sr_mdio_read
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ma Ke <[email protected]>
commit 08f3a5c38087d1569e982a121aad1e6acbf145ce upstream.
It could lead to error happen because the variable res is not updated if the call to sr_share_read_word returns an error. In this particular case error code was returned and res stayed uninitialized. Same issue also applies to sr_read_reg.
This can be avoided by checking the return value of sr_share_read_word and sr_read_reg, and propagating the error if the read operation failed.
Found by code review.
--- drivers/net/usb/sr9700.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/net/usb/sr9700.c +9 -2
@@ -179,6 +179,7 @@ static int sr_mdio_read(struct net_devicstruct usbnet *dev =netdev_priv (netdev);__le16 res;int rc =0 ; +int err;if (phy_id) {netdev_dbg (netdev,"Only internal phy supported\n" );
@@ -189,11 +190,17 @@ static int sr_mdio_read(struct net_devicif (loc ==MII_BMSR ) {u8 value; -sr_read_reg (dev,SR_NSR , &value); + err =sr_read_reg (dev,SR_NSR , &value); +if (err <0 ) +return err; +if (value &NSR_LINKST ) rc =1 ; } -sr_share_read_word (dev,1 , loc, &res); + err =sr_share_read_word (dev,1 , loc, &res); +if (err <0 ) +return err; +if (rc ==1 ) res =le16_to_cpu (res) |BMSR_LSTATUS ;else
Greg Kroah-Hartman
maintainerPATCH 110/121 r8169: dont increment tx_dropped in case of NETDEV_TX_BUSY
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
commit d516b187a9cc2e842030dd005be2735db3e8f395 upstream.
The skb isn't consumed in case of NETDEV_TX_BUSY, therefore don't increment the tx_dropped counter.
--- drivers/net/ethernet/realtek/r8169_main.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +2 -6
@@ -4256,7 +4256,8 @@ static netdev_tx_t rtl8169_start_xmit(stif (unlikely (!rtl_tx_slots_avail (tp))) {if (net_ratelimit ())netdev_err (dev,"BUG! Tx Ring full when queue awake!\n" ); - goto err_stop_0; +netif_stop_queue (dev); +return NETDEV_TX_BUSY ; } opts[1 ] =rtl8169_tx_vlan_tag (skb);
@@ -4312,11 +4313,6 @@ err_dma_0:dev_kfree_skb_any (skb); dev->stats.tx_dropped++;return NETDEV_TX_OK ; - -err_stop_0: -netif_stop_queue (dev); - dev->stats.tx_dropped++; -return NETDEV_TX_BUSY ; }static unsigned int rtl_last_frag_len (struct sk_buff *skb)
Greg Kroah-Hartman
maintainerPATCH 111/121 mptcp: fix user-space PM announced address accounting
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 167b93258d1e2230ee3e8a97669b4db4cc9e90aa upstream.
Currently the per-connection announced address counter is never decreased. When the user-space PM is in use, this just affect the information exposed via diag/sockopt, but it could still foul the PM to wrong decision.
Add the missing accounting for the user-space PM's sake.
--- net/mptcp/pm_netlink.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
net/mptcp/pm_netlink.c +13 -4
@@ -1565,16 +1565,25 @@ void mptcp_pm_remove_addrs(struct mptcp_ {struct mptcp_rm_list alist = { .nr =0 };struct mptcp_pm_addr_entry *entry; +int anno_nr =0 ;list_for_each_entry (entry, rm_list, list) { -if ((remove_anno_list_by_saddr (msk, &entry->addr) || -lookup_subflow_by_saddr (&msk->conn_list, &entry->addr)) && - alist.nr <MPTCP_RM_IDS_MAX ) - alist.ids[alist.nr++] = entry->addr.id; +if (alist.nr >=MPTCP_RM_IDS_MAX ) +break ; + +/* only delete if either announced or matching a subflow */ +if (remove_anno_list_by_saddr (msk, &entry->addr)) + anno_nr++; +else if (!lookup_subflow_by_saddr (&msk->conn_list, + &entry->addr)) +continue ; + + alist.ids[alist.nr++] = entry->addr.id; }if (alist.nr) {spin_lock_bh (&msk->pm.lock); + msk->pm.add_addr_signaled -= anno_nr;mptcp_pm_remove_addr (msk, &alist);spin_unlock_bh (&msk->pm.lock); }
Greg Kroah-Hartman
maintainerPATCH 112/121 mptcp: distinguish rcv vs sent backup flag in requests
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit efd340bf3d7779a3a8ec954d8ec0fb8a10f24982 upstream.
When sending an MP_JOIN + SYN + ACK, it is possible to mark the subflow as 'backup' by setting the flag with the same name. Before this patch, the backup was set if the other peer set it in its MP_JOIN + SYN request.
It is not correct: the backup flag should be set in the MPJ+SYN+ACK only if the host asks for it, and not mirroring what was done by the other peer. It is then required to have a dedicated bit for each direction, similar to what is done in the subflow context.
--- net/mptcp/options.c | 2 +- net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 1 + 3 files changed, 3 insertions(+), 1 deletion(-)
net/mptcp/options.c +1 -1
@@ -909,7 +909,7 @@ bool mptcp_synack_options(const struct rreturn true; }else if (subflow_req->mp_join) { opts->suboptions =OPTION_MPTCP_MPJ_SYNACK ; - opts->backup = subflow_req->backup; + opts->backup = subflow_req->request_bkup; opts->join_id = subflow_req->local_id; opts->thmac = subflow_req->thmac; opts->nonce = subflow_req->local_nonce;
net/mptcp/protocol.h +1 -0
@@ -419,6 +419,7 @@ struct mptcp_subflow_request_sock { u16 mp_capable : 1, mp_join : 1, backup : 1, + request_bkup : 1, csum_reqd : 1, allow_join_id0 : 1;u8 local_id;
net/mptcp/subflow.c +1 -0
@@ -1976,6 +1976,7 @@ static void subflow_ulp_clone(const stru new_ctx->fully_established =1 ; new_ctx->remote_key_valid =1 ; new_ctx->backup = subflow_req->backup; + new_ctx->request_bkup = subflow_req->request_bkup;WRITE_ONCE (new_ctx->remote_id, subflow_req->remote_id); new_ctx->token = subflow_req->token; new_ctx->thmac = subflow_req->thmac;
Greg Kroah-Hartman
maintainerPATCH 113/121 mptcp: fix NL PM announced address accounting
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 4b317e0eb287bd30a1b329513531157c25e8b692 upstream.
Currently the per connection announced address counter is never decreased. As a consequence, after connection establishment, if the NL PM deletes an endpoint and adds a new/different one, no additional subflow is created for the new endpoint even if the current limits allow that.
Address the issue properly updating the signaled address counter every time the NL PM removes such addresses.
--- net/mptcp/pm_netlink.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/mptcp/pm_netlink.c +6 -4
@@ -1432,6 +1432,7 @@ static bool mptcp_pm_remove_anno_addr(st ret =remove_anno_list_by_saddr (msk, addr);if (ret || force) {spin_lock_bh (&msk->pm.lock); + msk->pm.add_addr_signaled -= ret;mptcp_pm_remove_addr (msk, &list);spin_unlock_bh (&msk->pm.lock); }
@@ -1596,17 +1597,18 @@ void mptcp_pm_remove_addrs_and_subflows(struct mptcp_pm_addr_entry *entry;list_for_each_entry (entry, rm_list, list) { -if (lookup_subflow_by_saddr (&msk->conn_list, &entry->addr) && - slist.nr <MPTCP_RM_IDS_MAX ) +if (slist.nr <MPTCP_RM_IDS_MAX && +lookup_subflow_by_saddr (&msk->conn_list, &entry->addr)) slist.ids[slist.nr++] = entry->addr.id; -if (remove_anno_list_by_saddr (msk, &entry->addr) && - alist.nr <MPTCP_RM_IDS_MAX ) +if (alist.nr <MPTCP_RM_IDS_MAX && +remove_anno_list_by_saddr (msk, &entry->addr)) alist.ids[alist.nr++] = entry->addr.id; }if (alist.nr) {spin_lock_bh (&msk->pm.lock); + msk->pm.add_addr_signaled -= alist.nr;mptcp_pm_remove_addr (msk, &alist);spin_unlock_bh (&msk->pm.lock); }
Greg Kroah-Hartman
maintainerPATCH 114/121 mptcp: mib: count MPJ with backup flag
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit 4dde0d72ccec500c60c798e036b852e013d6e124 upstream.
Without such counters, it is difficult to easily debug issues with MPJ not having the backup flags on production servers.
This is not strictly a fix, but it eases to validate the following patches without requiring to take packet traces, to query ongoing connections with Netlink with admin permissions, or to guess by looking at the behaviour of the packet scheduler. Also, the modification is self contained, isolated, well controlled, and the increments are done just after others, there from the beginning. It looks then safe, and helpful to backport this.
--- net/mptcp/mib.c | 2 ++ net/mptcp/mib.h | 2 ++ net/mptcp/subflow.c | 6 ++++++ 3 files changed, 10 insertions(+)
net/mptcp/mib.c +2 -0
@@ -19,7 +19,9 @@ static const struct snmp_mib mptcp_snmp_SNMP_MIB_ITEM ("MPTCPRetrans" ,MPTCP_MIB_RETRANSSEGS ),SNMP_MIB_ITEM ("MPJoinNoTokenFound" ,MPTCP_MIB_JOINNOTOKEN ),SNMP_MIB_ITEM ("MPJoinSynRx" ,MPTCP_MIB_JOINSYNRX ), +SNMP_MIB_ITEM ("MPJoinSynBackupRx" ,MPTCP_MIB_JOINSYNBACKUPRX ),SNMP_MIB_ITEM ("MPJoinSynAckRx" ,MPTCP_MIB_JOINSYNACKRX ), +SNMP_MIB_ITEM ("MPJoinSynAckBackupRx" ,MPTCP_MIB_JOINSYNACKBACKUPRX ),SNMP_MIB_ITEM ("MPJoinSynAckHMacFailure" ,MPTCP_MIB_JOINSYNACKMAC ),SNMP_MIB_ITEM ("MPJoinAckRx" ,MPTCP_MIB_JOINACKRX ), SNMP_MIB_ITEM("MPJoinAckHMacFailure", MPTCP_MIB_JOINACKMAC),
net/mptcp/mib.h +2 -0
@@ -12,7 +12,9 @@ enum linux_mptcp_mib_field {MPTCP_MIB_RETRANSSEGS ,/* Segments retransmitted at the MPTCP-level */ MPTCP_MIB_JOINNOTOKEN ,/* Received MP_JOIN but the token was not found */ MPTCP_MIB_JOINSYNRX ,/* Received a SYN + MP_JOIN */ +MPTCP_MIB_JOINSYNBACKUPRX ,/* Received a SYN + MP_JOIN + backup flag */ MPTCP_MIB_JOINSYNACKRX ,/* Received a SYN/ACK + MP_JOIN */ +MPTCP_MIB_JOINSYNACKBACKUPRX ,/* Received a SYN/ACK + MP_JOIN + backup flag */ MPTCP_MIB_JOINSYNACKMAC ,/* HMAC was wrong on SYN/ACK + MP_JOIN */ MPTCP_MIB_JOINACKRX ,/* Received an ACK + MP_JOIN */ MPTCP_MIB_JOINACKMAC, /* HMAC was wrong on ACK + MP_JOIN */
net/mptcp/subflow.c +6 -0
@@ -166,6 +166,9 @@ static int subflow_check_req(struct requreturn 0 ; }else if (opt_mp_join) {SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_JOINSYNRX ); + +if (mp_opt.backup) +SUBFLOW_REQ_INC_STATS (req,MPTCP_MIB_JOINSYNBACKUPRX ); }if (opt_mp_capable && listener->request_mptcp) {
@@ -558,6 +561,9 @@ static void subflow_finish_connect(struc subflow->mp_join =1 ;MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNACKRX ); +if (subflow->backup) +MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_JOINSYNACKBACKUPRX ); +if (subflow_use_different_dport (msk, sk)) { pr_debug("synack inet_dport=%d %d", ntohs(inet_sk(sk)->inet_dport),
Greg Kroah-Hartman
maintainerPATCH 115/121 mptcp: fix bad RCVPRUNED mib accounting
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 0a567c2a10033bf04ed618368d179bce6977984b upstream.
Since its introduction, the mentioned MIB accounted for the wrong
event: wake-up being skipped as not-needed on some edge condition instead of incoming skb being dropped after landing in the (subflow) receive queue.
Move the increment in the correct location.
--- net/mptcp/protocol.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/mptcp/protocol.c +4 -4
@@ -352,8 +352,10 @@ static bool __mptcp_move_skb(struct mptcskb_orphan (skb);/* try to fetch required memory from subflow */ -if (!mptcp_rmem_schedule (sk, ssk, skb->truesize)) +if (!mptcp_rmem_schedule (sk, ssk, skb->truesize)) { +MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_RCVPRUNED ); goto drop; + } has_rxtstamp =TCP_SKB_CB (skb)->has_rxtstamp;
@@ -842,10 +844,8 @@ void mptcp_data_ready(struct sock *sk, s sk_rbuf = ssk_rbuf;/* over limit? can't append more skbs to msk, Also, no need to wake-up*/ -if (__mptcp_rmem (sk) > sk_rbuf) { -MPTCP_INC_STATS (sock_net (sk),MPTCP_MIB_RCVPRUNED ); +if (__mptcp_rmem (sk) > sk_rbuf)return ; - }/* Wake-up the reader only for in-sequence data */ mptcp_data_lock (sk);
Greg Kroah-Hartman
maintainerPATCH 116/121 mptcp: pm: only set request_bkup flag when sending MP_PRIO
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit 4258b94831bb7ff28ab80e3c8d94db37db930728 upstream.
The 'backup' flag from mptcp_subflow_context structure is supposed to be set only when the other peer flagged a subflow as backup, not the opposite.
--- net/mptcp/pm_netlink.c | 1 - 1 file changed, 1 deletion(-)
net/mptcp/pm_netlink.c +0 -1
@@ -476,7 +476,6 @@ static void __mptcp_pm_send_ack(struct m slow =lock_sock_fast (ssk);if (prio) { subflow->send_mp_prio =1 ; - subflow->backup = backup; subflow->request_bkup = backup; }
Greg Kroah-Hartman
maintainerPATCH 117/121 mptcp: fix duplicate data handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 68cc924729ffcfe90d0383177192030a9aeb2ee4 upstream.
When a subflow receives and discards duplicate data, the mptcp stack assumes that the consumed offset inside the current skb is zero.
With multiple subflows receiving data simultaneously such assertion does not held true. As a result the subflow-level copied_seq will be incorrectly increased and later on the same subflow will observe a bad mapping, leading to subflow reset.
Address the issue taking into account the skb consumed offset in mptcp_subflow_discard_data().
--- net/mptcp/subflow.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
net/mptcp/subflow.c +12 -4
@@ -1198,14 +1198,22 @@ static void mptcp_subflow_discard_data(s {struct mptcp_subflow_context *subflow =mptcp_subflow_ctx (ssk);bool fin =TCP_SKB_CB (skb)->tcp_flags &TCPHDR_FIN ; -u32 incr; +struct tcp_sock *tp =tcp_sk (ssk); +u32 offset, incr, avail_len; - incr = limit >= skb->len ? skb->len + fin : limit; + offset = tp->copied_seq -TCP_SKB_CB (skb)->seq; +if (WARN_ON_ONCE (offset > skb->len)) + goto out; -pr_debug ("discarding=%d len=%d seq=%d" , incr, skb->len, - subflow->map_subflow_seq); + avail_len = skb->len - offset; + incr = limit >= avail_len ? avail_len + fin : limit; + +pr_debug ("discarding=%d len=%d offset=%d seq=%d" , incr, skb->len, + offset, subflow->map_subflow_seq);MPTCP_INC_STATS (sock_net (ssk),MPTCP_MIB_DUPDATA );tcp_sk (ssk)->copied_seq += incr; + +out:if (!before (tcp_sk (ssk)->copied_seq,TCP_SKB_CB (skb)->end_seq))sk_eat_skb (ssk, skb);if (mptcp_subflow_get_map_offset (subflow) >= subflow->map_data_len)
Greg Kroah-Hartman
maintainerPATCH 118/121 selftests: mptcp: always close inputs FD if opened
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Jing <[email protected]>
commit 7c70bcc2a84cf925f655ea1ac4b8088062b144a3 upstream.
In main_loop_s function, when the open(cfg_input, O_RDONLY) function is run, the last fd is not closed if the "--cfg_repeat > 0" branch is not taken.
--- tools/testing/selftests/net/mptcp/mptcp_connect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_connect.c +4 -4
@@ -1115,11 +1115,11 @@ again:return 1 ; } -if (--cfg_repeat >0 ) { -if (cfg_input) -close (fd); +if (cfg_input) +close (fd); + +if (--cfg_repeat >0 ) goto again; - }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 119/121 selftests: mptcp: join: validate backup in MPJ
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit 935ff5bb8a1cfcdf8e60c8f5c794d0bbbc234437 upstream.
A peer can notify the other one that a subflow has to be treated as "backup" by two different ways: either by sending a dedicated MP_PRIO notification, or by setting the backup flag in the MP_JOIN handshake.
The selftests were previously monitoring the former, but not the latter. This is what is now done here by looking at these new MIB counters when validating the 'backup' cases:
MPTcpExtMPJoinSynBackupRx
MPTcpExtMPJoinSynAckBackupRx
The 'Fixes' tag here below is the same as the one from the previous
commit: this patch here is not fixing anything wrong in the selftests, but it will help to validate a new fix for an issue introduced by this commit ID.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 42 ++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +32 -10
@@ -1778,6 +1778,8 @@ chk_prio_nr() { local mp_prio_nr_tx=$1 local mp_prio_nr_rx=$2 + local mpj_syn=$3 + local mpj_syn_ack=$4 local count print_check "ptx"
@@ -1799,6 +1801,26 @@ chk_prio_nr() else print_ok fi + + print_check "syn backup" + count=$(mptcp_lib_get_counter ${ns1} "MPTcpExtMPJoinSynBackupRx") + if [ -z "$count" ]; then + print_skip + elif [ "$count" != "$mpj_syn" ]; then + fail_test "got $count JOIN[s] syn with Backup expected $mpj_syn" + else + print_ok + fi + + print_check "synack backup" + count=$(mptcp_lib_get_counter ${ns2} "MPTcpExtMPJoinSynAckBackupRx") + if [ -z "$count" ]; then + print_skip + elif [ "$count" != "$mpj_syn_ack" ]; then + fail_test "got $count JOIN[s] synack with Backup expected $mpj_syn_ack" + else + print_ok + fi } chk_subflow_nr()
@@ -2751,7 +2773,7 @@ backup_tests() sflags=nobackup speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 1 1 1 - chk_prio_nr 0 1 + chk_prio_nr 0 1 1 0 fi # single address, backup
@@ -2764,7 +2786,7 @@ backup_tests() run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 1 1 1 chk_add_nr 1 1 - chk_prio_nr 1 1 + chk_prio_nr 1 1 0 0 fi # single address with port, backup
@@ -2777,7 +2799,7 @@ backup_tests() run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 1 1 1 chk_add_nr 1 1 - chk_prio_nr 1 1 + chk_prio_nr 1 1 0 0 fi if reset "mpc backup" &&
@@ -2786,7 +2808,7 @@ backup_tests() speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 - chk_prio_nr 0 1 + chk_prio_nr 0 1 0 0 fi if reset "mpc backup both sides" &&
@@ -2796,7 +2818,7 @@ backup_tests() speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 - chk_prio_nr 1 1 + chk_prio_nr 1 1 0 0 fi if reset "mpc switch to backup" &&
@@ -2805,7 +2827,7 @@ backup_tests() sflags=backup speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 - chk_prio_nr 0 1 + chk_prio_nr 0 1 0 0 fi if reset "mpc switch to backup both sides" &&
@@ -2815,7 +2837,7 @@ backup_tests() sflags=backup speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 - chk_prio_nr 1 1 + chk_prio_nr 1 1 0 0 fi }
@@ -3215,7 +3237,7 @@ fullmesh_tests() addr_nr_ns2=1 sflags=backup,fullmesh speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 2 2 2 - chk_prio_nr 0 1 + chk_prio_nr 0 1 1 0 chk_rm_nr 0 1 fi
@@ -3228,7 +3250,7 @@ fullmesh_tests() sflags=nobackup,nofullmesh speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 2 2 2 - chk_prio_nr 0 1 + chk_prio_nr 0 1 1 0 chk_rm_nr 0 1 fi }
@@ -3407,7 +3429,7 @@ userspace_tests() sflags=backup speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 1 1 0 - chk_prio_nr 0 0 + chk_prio_nr 0 0 0 0 fi # userspace pm type prevents rm_addr
Greg Kroah-Hartman
maintainerPATCH 120/121 selftests: mptcp: join: check backup support in signal endp
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
commit f833470c27832136d4416d8fc55d658082af0989 upstream.
Before the previous commit, 'signal' endpoints with the 'backup' flag were ignored when sending the MP_JOIN.
The MPTCP Join selftest has then been modified to validate this case:
the "single address, backup" test, is now validating the MP_JOIN with a backup flag as it is what we expect it to do with such name. The previous version has been kept, but renamed to "single address, switch to backup" to avoid confusions.
The "single address with port, backup" test is also now validating the MPJ with a backup flag, which makes more sense than checking the switch to backup with an MP_PRIO.
The "mpc backup both sides" test is now validating that the backup flag is also set in MP_JOIN from and to the addresses used in the initial subflow, using the special ID 0.
The 'Fixes' tag here below is the same as the one from the previous
commit: this patch here is not fixing anything wrong in the selftests, but it validates the previous fix for an issue introduced by this commit ID.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 34 +++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +28 -6
@@ -2780,6 +2780,19 @@ backup_tests() if reset "single address, backup" && continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then pm_nl_set_limits $ns1 0 1 + pm_nl_add_endpoint $ns1 10.0.2.1 flags signal,backup + pm_nl_set_limits $ns2 1 1 + sflags=nobackup speed=slow \ + run_tests $ns1 $ns2 10.0.1.1 + chk_join_nr 1 1 1 + chk_add_nr 1 1 + chk_prio_nr 1 0 0 1 + fi + + # single address, switch to backup + if reset "single address, switch to backup" && + continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then + pm_nl_set_limits $ns1 0 1 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_set_limits $ns2 1 1 sflags=backup speed=slow \
@@ -2793,13 +2806,13 @@ backup_tests() if reset "single address with port, backup" && continue_if mptcp_lib_kallsyms_has "subflow_rebuild_header$"; then pm_nl_set_limits $ns1 0 1 - pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 + pm_nl_add_endpoint $ns1 10.0.2.1 flags signal,backup port 10100 pm_nl_set_limits $ns2 1 1 - sflags=backup speed=slow \ + sflags=nobackup speed=slow \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 1 1 1 chk_add_nr 1 1 - chk_prio_nr 1 1 0 0 + chk_prio_nr 1 0 0 1 fi if reset "mpc backup" &&
@@ -2813,12 +2826,21 @@ backup_tests() if reset "mpc backup both sides" && continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then - pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow,backup + pm_nl_set_limits $ns1 0 2 + pm_nl_set_limits $ns2 1 2 + pm_nl_add_endpoint $ns1 10.0.1.1 flags signal,backup pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup + + # 10.0.2.2 (non-backup) -> 10.0.1.1 (backup) + pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow + # 10.0.1.2 (backup) -> 10.0.2.1 (non-backup) + pm_nl_add_endpoint $ns1 10.0.2.1 flags signal + ip -net "$ns2" route add 10.0.2.1 via 10.0.1.1 dev ns2eth1 # force this path + speed=slow \ run_tests $ns1 $ns2 10.0.1.1 - chk_join_nr 0 0 0 - chk_prio_nr 1 1 0 0 + chk_join_nr 2 2 2 + chk_prio_nr 1 1 1 1 fi if reset "mpc switch to backup" &&
Greg Kroah-Hartman
maintainerPATCH 121/121 mptcp: prevent BPF accessing lowat from a subflow socket.
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit fcf4692fa39e86a590c14a4af2de704e1d20a3b5 upstream.
Alexei reported the following splat:
WARNING: CPU: 32 PID: 3276 at net/mptcp/subflow.c:1430 subflow_data_ready+0x147/0x1c0 Modules linked in: dummy bpf_testmod(O) [last unloaded: bpf_test_no_cfi(O)] CPU: 32 PID: 3276 Comm: test_progs Tainted: GO 6.8.0-12873-g2c43c33bfd23 Call Trace: <TASK> mptcp_set_rcvlowat+0x79/0x1d0 sk_setsockopt+0x6c0/0x1540 __bpf_setsockopt+0x6f/0x90 bpf_sock_ops_setsockopt+0x3c/0x90 bpf_prog_509ce5db2c7f9981_bpf_test_sockopt_int+0xb4/0x11b bpf_prog_dce07e362d941d2b_bpf_test_socket_sockopt+0x12b/0x132 bpf_prog_348c9b5faaf10092_skops_sockopt+0x954/0xe86 __cgroup_bpf_run_filter_sock_ops+0xbc/0x250 tcp_connect+0x879/0x1160 tcp_v6_connect+0x50c/0x870 mptcp_connect+0x129/0x280 __inet_stream_connect+0xce/0x370 inet_stream_connect+0x36/0x50 bpf_trampoline_6442491565+0x49/0xef inet_stream_connect+0x5/0x50 __sys_connect+0x63/0x90 __x64_sys_connect+0x14/0x20
The root cause of the issue is that bpf allows accessing mptcp-level proto_ops from a tcp subflow scope.
Fix the issue detecting the problematic call and preventing any action.
--- net/mptcp/sockopt.c | 4 ++++ 1 file changed, 4 insertions(+)
net/mptcp/sockopt.c +4 -0
@@ -1538,6 +1538,10 @@ int mptcp_set_rcvlowat(struct sock *sk,struct mptcp_subflow_context *subflow;int space, cap; +/* bpf can land here with a wrong sk type */ +if (sk->sk_protocol ==IPPROTO_TCP ) +return -EINVAL ; +if (sk->sk_userlocks &SOCK_RCVBUF_LOCK ) cap = sk->sk_rcvbuf >>1 ;else
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENEIRC:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro's test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 6.6.45-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: 272b28faf61f0b80e9d6f92cbcfa32817f9ece7b
* git describe: v6.6.44-122-g272b28faf61f
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.6.y/build/v6.6.44-122-g272b28faf61f
## Test Regressions (compared to v6.6.43-569-g7d0be44d622f)
## Metric Regressions (compared to v6.6.43-569-g7d0be44d622f)
## Test Fixes (compared to v6.6.43-569-g7d0be44d622f)
## Metric Fixes (compared to v6.6.43-569-g7d0be44d622f)
## Test result summary
total: 238058, pass: 205175, fail: 4074, skip: 28347, xfail: 462
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 127 total, 127 passed, 0 failed
* arm64: 36 total, 36 passed, 0 failed
* i386: 27 total, 27 passed, 0 failed
* mips: 24 total, 24 passed, 0 failed
* parisc: 3 total, 3 passed, 0 failed
* powerpc: 34 total, 34 passed, 0 failed
* riscv: 17 total, 17 passed, 0 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 10 total, 10 passed, 0 failed
* sparc: 6 total, 6 passed, 0 failed
* x86_64: 31 total, 31 passed, 0 failed
## Test suites summary
* boot
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-filesystems-epoll
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-kcmp
* kselftest-kvm
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-mincore
* kselftest-mqueue
* kselftest-net
* kselftest-net-mptcp
* kselftest-openat2
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-tc-testing
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user_events
* kselftest-vDSO
* kselftest-watchdog
* kselftest-x86
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-smoketest
* ltp-syscalls
* ltp-tracing
* perf
* rcutorture
--
Linaro LKFT
https://lkft.linaro.org
Quoted 8 lines · On Wed, 07 Aug 2024 16:58:52 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
Boot-tested under QEMU for Rust x86_64:
Thanks!
Cheers,
Miguel
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
6.6.45-rc1 tested.
Build successfully completed.
Boot successfully completed.
No dmesg regressions.
Video output normal.
Sound output normal.
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
[ 0.000000] Linux version 6.6.45-rc1rv
(takeshi@ThinkPadX1Gen10J0764) (gcc (GCC) 14.2.1 20240805, GNU ld (GNU Binutils) 2.43.0) #1 SMP PREEMPT_DYNAMIC Thu Aug 8 20:02:46 JST 2024
Thanks
Quoted 9 lines
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my x86_64 and ARM64 test systems. No errors or regressions.
Thanks.
Am 07.08.2024 um 16:58 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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.
Builds, boots and works on my 2-socket Ivy Bridge Xeon E5-2697 v2 server. No dmesg oddities or regressions found.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.6:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.6.45-rc1-g272b28faf61f
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
---- On Wed, 07 Aug 2024 20:28:52 +0530 Greg Kroah-Hartman wrote ---
Quoted 8 lines
This is the start of the stable review cycle for the 6.6.45 release. There are 121 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 Fri, 09 Aug 2024 14:59:53 +0000. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.6.45-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.6.y and the diffstat can be found below.thanks,
KernelCI report for stable-rc/linux-6.6.y for this week :-
Date: 2024-08-07
## Build failures:
No **new** boot failures seen for the stable-rc/linux-6.6.y commit head \o/
## Boot failures:
No **new** boot failures seen for the stable-rc/linux-6.6.y commit head \o/
Thanks,
Shreeya Patel