6.1.115-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 6.1.115-rc1 review
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +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.1.115-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.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.115-rc1
junhua huang <[email protected]>
arm64/uprobes: change the uprobe_opcode_t typedef to fix the sparse warning
Dan Carpenter <[email protected]>
ACPI: PRM: Clean up guid type in struct prm_handler_info
Armin Wolf <[email protected]>
platform/x86: dell-wmi: Ignore suspend notifications
Zichen Xie <[email protected]>
ASoC: qcom: Fix NULL Dereference in asoc_qcom_lpass_cpu_platform_probe()
Xinyu Zhang <[email protected]>
block: fix sanity checks in blk_rq_map_user_bvec
Michel Alex <[email protected]>
net: phy: dp83822: Fix reset pin definitions
Jiri Slaby (SUSE) <[email protected]>
serial: protect uart_port_dtr_rts() in uart_shutdown() too
Paul Moore <[email protected]>
selinux: improve error checking in sel_write_load()
Mario Limonciello <[email protected]>
drm/amd/display: Disable PSR-SU on Parade 08-01 TCON too
Haiyang Zhang <[email protected]>
hv_netvsc: Fix VF namespace also in synthetic NIC NETDEV_REGISTER event
Petr Vaganov <[email protected]>
xfrm: fix one more kernel-infoleak in algo dumping
Huacai Chen <[email protected]>
LoongArch: Get correct cores_per_package for SMT systems
José Relvas <[email protected]>
ALSA: hda/realtek: Add subwoofer quirk for Acer Predator G9-593
Marc Zyngier <[email protected]>
KVM: arm64: Don't eagerly teardown the vgic on init error
Sean Christopherson <[email protected]>
KVM: nSVM: Ignore nCR3[4:0] when loading PDPTEs from memory
Aleksa Sarai <[email protected]>
openat2: explicitly return -E2BIG for (usize > PAGE_SIZE)
Ryusuke Konishi <[email protected]>
nilfs2: fix kernel bug due to missing clearing of buffer delay flag
Shubham Panwar <[email protected]>
ACPI: button: Add DMI quirk for Samsung Galaxy Book2 to fix initial lid detection issue
Koba Ko <[email protected]>
ACPI: PRM: Find EFI_MEMORY_RUNTIME block for PRM handler and context
Christian Heusel <[email protected]>
ACPI: resource: Add LG 16T90SP to irq1_level_low_skip_override[]
Mario Limonciello <[email protected]>
drm/amd: Guard against bad data for ATIF ACPI method
Naohiro Aota <[email protected]>
btrfs: zoned: fix zone unusable accounting for freed reserved extent
Yue Haibing <[email protected]>
btrfs: fix passing 0 to ERR_PTR in btrfs_search_dir_index_item()
liwei <[email protected]>
cpufreq: CPPC: fix perf_to_khz/khz_to_perf conversion exception
Vincent Guittot <[email protected]>
cpufreq/cppc: Move and rename cppc_cpufreq_{perf_to_khz|khz_to_perf}()
Kailang Yang <[email protected]>
ALSA: hda/realtek: Update default depop procedure
Yuan Can <[email protected]>
powercap: dtpm_devfreq: Fix error check against dev_pm_qos_add_request()
Andrey Shumilin <[email protected]>
ALSA: firewire-lib: Avoid division by zero in apply_constraint_to_size()
Miquel Raynal <[email protected]>
ASoC: dt-bindings: davinci-mcasp: Fix interrupt properties
Miquel Raynal <[email protected]>
ASoC: dt-bindings: davinci-mcasp: Fix interrupts property
Jiri Olsa <[email protected]>
bpf,perf: Fix perf_event_detach_bpf_prog error handling
Luiz Augusto von Dentz <[email protected]>
Bluetooth: ISO: Fix UAF on iso_sock_timeout
Luiz Augusto von Dentz <[email protected]>
Bluetooth: SCO: Fix UAF on sco_sock_timeout
Jinjie Ruan <[email protected]>
posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime()
Heiner Kallweit <[email protected]>
r8169: avoid unsolicited interrupts
Dmitry Antipov <[email protected]>
net: sched: fix use-after-free in taprio_change()
Vladimir Oltean <[email protected]>
net/sched: act_api: deny mismatched skip_sw/skip_hw flags for actions created by classifiers
Oliver Neukum <[email protected]>
net: usb: usbnet: fix name regression
Eric Dumazet <[email protected]>
net: fix races in netdev_tx_sent_queue()/dev_watchdog()
Praveen Kumar Kannoju <[email protected]>
net/sched: adjust device watchdog timer to detect stopped queue at right time
Jakub Kicinski <[email protected]>
net: provide macros for commonly copied lockless queue stop/wake code
Jakub Kicinski <[email protected]>
docs: net: reformat driver.rst from a list to sections
Lin Ma <[email protected]>
net: wwan: fix global oob in wwan_rtnl_policy
Pablo Neira Ayuso <[email protected]>
netfilter: xtables: fix typo causing some targets not to load on IPv6
Peter Rashleigh <[email protected]>
net: dsa: mv88e6xxx: Fix error when setting port policy on mv88e6393x
Aleksandr Mishin <[email protected]>
octeon_ep: Add SKB allocation failures handling in __octep_oq_process_rx()
Aleksandr Mishin <[email protected]>
octeon_ep: Implement helper for iterating packets in Rx queue
Jakub Boehm <[email protected]>
net: plip: fix break; causing plip to never transmit
Wang Hai <[email protected]>
be2net: fix potential memory leak in be_xmit()
Wang Hai <[email protected]>
net/sun3_82586: fix potential memory leak in sun3_82586_send_packet()
Eyal Birger <[email protected]>
xfrm: respect ip protocols rules criteria when performing dst lookups
Eyal Birger <[email protected]>
xfrm: extract dst lookup parameters into a struct
Leo Yan <[email protected]>
tracing: Consider the NULL character when validating the event length
Dave Kleikamp <[email protected]>
jfs: Fix sanity check in dbMount
Thomas Weißschuh <[email protected]>
LoongArch: Don't crash in stack_top() for tasks without vDSO
Tiezhu Yang <[email protected]>
LoongArch: Add support to clone a time namespace
Crag Wang <[email protected]>
platform/x86: dell-sysman: add support for alienware products
Alexey Klimov <[email protected]>
ASoC: qcom: sm8250: add qrb4210-rb2-sndcard compatible string
Gianfranco Trad <[email protected]>
udf: fix uninit-value use in udf_get_fileshortad
Zhao Mengmeng <[email protected]>
udf: refactor udf_current_aext() to handle error
Mark Rutland <[email protected]>
arm64: Force position-independent veneers
Shengjiu Wang <[email protected]>
ASoC: fsl_sai: Enable 'FIFO continue on error' FCONT bit
Alexey Klimov <[email protected]>
ASoC: codecs: lpass-rx-macro: add missing CDC_RX_BCL_VBAT_RF_PROC2 to default regs values
Hans de Goede <[email protected]>
drm/vboxvideo: Replace fake VLA at end of vbva_mouse_pointer_shape with real VLA
Konstantin Komarov <[email protected]>
fs/ntfs3: Add more attributes checks in mi_enum_attr()
Mateusz Guzik <[email protected]>
exec: don't WARN for racy path_noexec check
Yu Kuai <[email protected]>
block, bfq: fix procress reference leakage for bfqq in merge chain
Marek Vasut <[email protected]>
serial: imx: Update mctrl old_status on RTSD interrupt
Ilpo Järvinen <[email protected]>
serial: Make uart_handle_cts_change() status param bool active
Ilpo Järvinen <[email protected]>
tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
Roger Quadros <[email protected]>
usb: dwc3: core: Fix system suspend on TI AM62 platforms
Frank Li <[email protected]>
XHCI: Separate PORT and CAPs macros into dedicated file
Elson Roy Serrao <[email protected]>
usb: gadget: Add function wakeup support
Kevin Groeneveld <[email protected]>
usb: gadget: f_uac2: fix return value for UAC2_ATTRIBUTE_STRING store
John Keeping <[email protected]>
usb: gadget: f_uac2: fix non-newline-terminated function name
Lee Jones <[email protected]>
usb: gadget: f_uac2: Replace snprintf() with the safer scnprintf() variant
Mathias Nyman <[email protected]>
xhci: dbc: honor usb transfer size boundaries.
Jiri Slaby (SUSE) <[email protected]>
xhci: dbgtty: use kfifo from tty_port struct
Jiri Slaby (SUSE) <[email protected]>
xhci: dbgtty: remove kfifo_out() wrapper
Mark Rutland <[email protected]>
arm64: probes: Fix uprobes for big-endian kernels
junhua huang <[email protected]>
arm64:uprobe fix the uprobe SWBP_INSN in big-endian
Jordan Rome <[email protected]>
bpf: Fix iter/task tid filtering
Andrea Parri <[email protected]>
riscv, bpf: Make BPF_CMPXCHG fully ordered
Cosmin Ratiu <[email protected]>
net/mlx5: Unregister notifier on eswitch init failure
Shay Drory <[email protected]>
net/mlx5: Fix command bitmask initialization
Shay Drory <[email protected]>
net/mlx5: split mlx5_cmd_init() to probe and reload routines
Shay Drory <[email protected]>
net/mlx5: Remove redundant cmdif revision check
Ye Bin <[email protected]>
Bluetooth: bnep: fix wild-memory-access in proto_unregister
Heiko Carstens <[email protected]>
s390: Initialize psw mask in perf_arch_fetch_caller_regs()
Thadeu Lima de Souza Cascardo <[email protected]>
usb: typec: altmode should keep reference to parent
Paulo Alcantara <[email protected]>
smb: client: fix OOBs when building SMB2_IOCTL request
Wang Hai <[email protected]>
scsi: target: core: Fix null-ptr-deref in target_alloc_device()
Niklas Söderlund <[email protected]>
net: ravb: Only advertise Rx/Tx timestamps if hardware supports it
Gal Pressman <[email protected]>
ravb: Remove setting of RX software timestamp
Eric Dumazet <[email protected]>
genetlink: hold RCU in genlmsg_mcast()
Kuniyuki Iwashima <[email protected]>
tcp/dccp: Don't use timer_pending() in reqsk_queue_unlink().
Jessica Zhang <[email protected]>
drm/msm/dpu: don't always program merge_3d block
Marijn Suijten <[email protected]>
drm/msm/dpu: Wire up DSC mask for active CTL configuration
Fabrizio Castro <[email protected]>
irqchip/renesas-rzg2l: Fix missing put_device
Claudiu Beznea <[email protected]>
irqchip/renesas-rzg2l: Add support for suspend to RAM
Claudiu Beznea <[email protected]>
irqchip/renesas-rzg2l: Document structure members
Claudiu Beznea <[email protected]>
irqchip/renesas-rzg2l: Align struct member names to tabs
Wang Hai <[email protected]>
net: systemport: fix potential memory leak in bcm_sysport_xmit()
Wang Hai <[email protected]>
net: xilinx: axienet: fix potential memory leak in axienet_start_xmit()
Li RongQing <[email protected]>
net/smc: Fix searching in list of known pnetids in smc_pnet_add_pnetid
Wang Hai <[email protected]>
net: ethernet: aeroflex: fix potential memory leak in greth_start_xmit_gbit()
Eric Dumazet <[email protected]>
netdevsim: use cond_resched() in nsim_dev_trap_report_work()
Sabrina Dubroca <[email protected]>
macsec: don't increment counters for an unrelated SA
Srinivasan Shanmugam <[email protected]>
drm/amd/amdgpu: Fix double unlock in amdgpu_mes_add_ring
Colin Ian King <[email protected]>
octeontx2-af: Fix potential integer overflows on integer shifts
Oliver Neukum <[email protected]>
net: usb: usbnet: fix race in probe failure
Douglas Anderson <[email protected]>
drm/msm: Allocate memory for disp snapshot with kvzalloc()
Douglas Anderson <[email protected]>
drm/msm: Avoid NULL dereference in msm_disp_state_print_regs()
Jonathan Marek <[email protected]>
drm/msm/dsi: fix 32-bit signed integer extension in pclk_rate calculation
Dmitry Baryshkov <[email protected]>
drm/msm/dpu: make sure phys resources are properly initialized
Bhargava Chenna Marreddy <[email protected]>
RDMA/bnxt_re: Fix a bug while setting up Level-2 PBL pages
Kalesh AP <[email protected]>
RDMA/bnxt_re: Return more meaningful error
Xin Long <[email protected]>
ipv4: give an IPv4 dev to blackhole_netdev
Bart Van Assche <[email protected]>
RDMA/srpt: Make slab cache names unique
Alexander Zubkov <[email protected]>
RDMA/irdma: Fix misspelling of "accept*"
Anumula Murali Mohan Reddy <[email protected]>
RDMA/cxgb4: Fix RDMA_CM_EVENT_UNREACHABLE error for iWARP
Murad Masimov <[email protected]>
ALSA: hda/cs8409: Fix possible NULL dereference
Tony Ambardar <[email protected]>
selftests/bpf: Fix cross-compiling urandom_read
Ian Forbes <[email protected]>
drm/vmwgfx: Handle possible ENOMEM in vmw_stdu_connector_atomic_check
Javier Carrasco <[email protected]>
iio: frequency: admv4420: fix missing select REMAP_SPI in Kconfig
Javier Carrasco <[email protected]>
iio: frequency: {admv4420,adrf6780}: format Kconfig entries
Toke Høiland-Jørgensen <[email protected]>
bpf: fix kfunc btf caching for modules
Niklas Schnelle <[email protected]>
s390/pci: Handle PCI error codes other than 0x3a
Florian Klink <[email protected]>
ARM: dts: bcm2837-rpi-cm3-io3: Fix HDMI hpd-gpio pin
Martin Kletzander <[email protected]>
x86/resctrl: Avoid overflow in MB settings in bw_validate()
Kalesh AP <[email protected]>
RDMA/bnxt_re: Add a check for memory allocation
Saravanan Vajravel <[email protected]>
RDMA/bnxt_re: Fix incorrect AVID type in WQE structure
Jiri Olsa <[email protected]>
bpf: Fix memory leak in bpf_core_apply
Florian Kauer <[email protected]>
bpf: devmap: provide rxq after redirect
Toke Høiland-Jørgensen <[email protected]>
bpf: Make sure internal and UAPI bpf_redirect flags don't overlap
Mikhail Lobanov <[email protected]>
iio: accel: bma400: Fix uninitialized variable field_value in tap event handling.
Wander Lairson Costa <[email protected]>
bpf: Use raw_spinlock_t in ringbuf
-------------
Diffstat:
.../bindings/sound/davinci-mcasp-audio.yaml | 18 +- Documentation/networking/driver.rst | 97 +++++--- Makefile | 4 +- arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts | 2 +- arch/arm64/Makefile | 2 +- arch/arm64/include/asm/uprobes.h | 12 +- arch/arm64/kernel/probes/uprobes.c | 4 +- arch/arm64/kvm/arm.c | 3 + arch/arm64/kvm/vgic/vgic-init.c | 6 +- arch/loongarch/Kconfig | 1 + arch/loongarch/include/asm/bootinfo.h | 4 + arch/loongarch/include/asm/page.h | 1 + arch/loongarch/include/asm/vdso/gettimeofday.h | 9 +- arch/loongarch/include/asm/vdso/vdso.h | 32 ++- arch/loongarch/kernel/process.c | 14 +- arch/loongarch/kernel/setup.c | 3 +- arch/loongarch/kernel/vdso.c | 98 ++++++-- arch/loongarch/vdso/vgetcpu.c | 2 +- arch/riscv/net/bpf_jit_comp64.c | 4 +- arch/s390/include/asm/perf_event.h | 1 + arch/s390/pci/pci_event.c | 17 +- arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 23 +- arch/x86/kvm/svm/nested.c | 6 +- block/bfq-iosched.c | 37 ++- block/blk-map.c | 4 +- drivers/acpi/button.c | 11 + drivers/acpi/cppc_acpi.c | 116 +++++++++ drivers/acpi/prmt.c | 29 ++- drivers/acpi/resource.c | 7 + drivers/cpufreq/cppc_cpufreq.c | 139 ++--------- drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 15 +- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 5 +- .../drm/amd/display/modules/power/power_helpers.c | 2 + drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 +- .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 1 + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 3 +- drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 19 +- drivers/gpu/drm/msm/dsi/dsi_host.c | 2 +- drivers/gpu/drm/vboxvideo/hgsmi_base.c | 10 +- drivers/gpu/drm/vboxvideo/vboxvideo.h | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 4 + drivers/iio/accel/bma400_core.c | 3 +- drivers/iio/frequency/Kconfig | 31 +-- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 2 +- drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 2 +- drivers/infiniband/hw/bnxt_re/qplib_res.c | 21 +- drivers/infiniband/hw/cxgb4/cm.c | 9 +- drivers/infiniband/hw/irdma/cm.c | 2 +- drivers/infiniband/ulp/srpt/ib_srpt.c | 80 ++++++- drivers/irqchip/irq-renesas-rzg2l.c | 94 ++++++-- drivers/net/dsa/mv88e6xxx/port.c | 1 + drivers/net/ethernet/aeroflex/greth.c | 3 +- drivers/net/ethernet/broadcom/bcmsysport.c | 1 + drivers/net/ethernet/emulex/benet/be_main.c | 10 +- drivers/net/ethernet/i825xx/sun3_82586.c | 1 + drivers/net/ethernet/marvell/octeon_ep/octep_rx.c | 82 +++++-- .../net/ethernet/marvell/octeontx2/af/rvu_nix.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 138 ++++++----- drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 5 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 15 +- .../net/ethernet/mellanox/mlx5/core/mlx5_core.h | 2 + drivers/net/ethernet/realtek/r8169_main.c | 4 +- drivers/net/ethernet/renesas/ravb_main.c | 25 +- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 + drivers/net/hyperv/netvsc_drv.c | 30 +++ drivers/net/macsec.c | 18 -- drivers/net/netdevsim/dev.c | 15 +- drivers/net/phy/dp83822.c | 4 +- drivers/net/plip/plip.c | 2 +- drivers/net/usb/usbnet.c | 4 +- drivers/net/wwan/wwan_core.c | 2 +- drivers/platform/x86/dell/dell-wmi-base.c | 9 + drivers/platform/x86/dell/dell-wmi-sysman/sysman.c | 1 + drivers/powercap/dtpm_devfreq.c | 2 +- drivers/pps/clients/pps-ldisc.c | 6 +- drivers/target/target_core_device.c | 2 +- drivers/target/target_core_user.c | 2 +- drivers/tty/serial/imx.c | 17 +- drivers/tty/serial/max3100.c | 2 +- drivers/tty/serial/max310x.c | 3 +- drivers/tty/serial/serial_core.c | 32 +-- drivers/tty/serial/sunhv.c | 8 +- drivers/usb/dwc3/core.c | 19 ++ drivers/usb/dwc3/core.h | 3 + drivers/usb/gadget/composite.c | 40 ++++ drivers/usb/gadget/function/f_uac2.c | 13 +- drivers/usb/host/xhci-caps.h | 85 +++++++ drivers/usb/host/xhci-dbgcap.h | 2 +- drivers/usb/host/xhci-dbgtty.c | 71 ++++-- drivers/usb/host/xhci-port.h | 176 ++++++++++++++ drivers/usb/host/xhci.h | 262 +-------------------- drivers/usb/typec/class.c | 3 + fs/btrfs/block-group.c | 2 + fs/btrfs/dir-item.c | 4 +- fs/btrfs/inode.c | 7 +- fs/exec.c | 21 +- fs/jfs/jfs_dmap.c | 2 +- fs/nilfs2/page.c | 6 +- fs/ntfs3/record.c | 67 +++++- fs/open.c | 2 + fs/smb/client/smb2pdu.c | 9 + fs/udf/inode.c | 49 ++-- fs/udf/truncate.c | 10 +- fs/udf/udfdecl.h | 5 +- include/acpi/cppc_acpi.h | 2 + include/linux/netdevice.h | 13 + include/linux/serial_core.h | 6 +- include/linux/tty_ldisc.h | 4 +- include/linux/usb/composite.h | 6 + include/linux/usb/gadget.h | 1 + include/net/bluetooth/bluetooth.h | 1 + include/net/genetlink.h | 3 +- include/net/netdev_queues.h | 144 +++++++++++ include/net/xfrm.h | 28 ++- include/uapi/linux/bpf.h | 13 +- kernel/bpf/btf.c | 1 + kernel/bpf/devmap.c | 11 +- kernel/bpf/ringbuf.c | 12 +- kernel/bpf/task_iter.c | 2 +- kernel/bpf/verifier.c | 8 +- kernel/time/posix-clock.c | 6 +- kernel/trace/bpf_trace.c | 2 - kernel/trace/trace_probe.c | 2 +- net/bluetooth/af_bluetooth.c | 22 ++ net/bluetooth/bnep/core.c | 3 +- net/bluetooth/iso.c | 18 +- net/bluetooth/sco.c | 18 +- net/core/filter.c | 8 +- net/ipv4/devinet.c | 35 ++- net/ipv4/inet_connection_sock.c | 21 +- net/ipv4/xfrm4_policy.c | 38 ++- net/ipv6/xfrm6_policy.c | 31 +-- net/l2tp/l2tp_netlink.c | 4 +- net/netfilter/xt_NFLOG.c | 2 +- net/netfilter/xt_TRACE.c | 1 + net/netfilter/xt_mark.c | 2 +- net/netlink/genetlink.c | 28 +-- net/sched/act_api.c | 23 +- net/sched/sch_generic.c | 17 +- net/sched/sch_taprio.c | 3 +- net/smc/smc_pnet.c | 2 +- net/wireless/nl80211.c | 8 +- net/xfrm/xfrm_device.c | 11 +- net/xfrm/xfrm_policy.c | 50 +++- net/xfrm/xfrm_user.c | 4 +- security/selinux/selinuxfs.c | 27 ++- sound/firewire/amdtp-stream.c | 3 + sound/pci/hda/patch_cs8409.c | 5 +- sound/pci/hda/patch_realtek.c | 48 ++-- sound/soc/codecs/lpass-rx-macro.c | 2 +- sound/soc/fsl/fsl_sai.c | 5 +- sound/soc/fsl/fsl_sai.h | 1 + sound/soc/qcom/lpass-cpu.c | 2 + sound/soc/qcom/sm8250.c | 1 + tools/testing/selftests/bpf/Makefile | 2 +- 155 files changed, 1978 insertions(+), 1066 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/137 bpf: Use raw_spinlock_t in ringbuf
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wander Lairson Costa <[email protected]>
[ Upstream commit 8b62645b09f870d70c7910e7550289d444239a46 ]
The function __bpf_ringbuf_reserve is invoked from a tracepoint, which disables preemption. Using spinlock_t in this context can lead to a "sleep in atomic" warning in the RT variant. This issue is illustrated in the example below:
BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 556208, name: test_progspreempt_count: 1, expected: 0
RCU nest depth: 1, expected: 1
INFO: lockdep is turned off.
Preemption disabled at:
[<ffffd33a5c88ea44>] migrate_enable+0xc0/0x39c CPU: 7 PID: 556208 Comm: test_progs Tainted: G Hardware name: Qualcomm SA8775P Ride (DT) Call trace: dump_backtrace+0xac/0x130 show_stack+0x1c/0x30 dump_stack_lvl+0xac/0xe8 dump_stack+0x18/0x30 __might_resched+0x3bc/0x4fc rt_spin_lock+0x8c/0x1a4 __bpf_ringbuf_reserve+0xc4/0x254 bpf_ringbuf_reserve_dynptr+0x5c/0xdc bpf_prog_ac3d15160d62622a_test_read_write+0x104/0x238 trace_call_bpf+0x238/0x774 perf_call_bpf_enter.isra.0+0x104/0x194 perf_syscall_enter+0x2f8/0x510 trace_sys_enter+0x39c/0x564 syscall_trace_enter+0x220/0x3c0 do_el0_svc+0x138/0x1dc el0_svc+0x54/0x130 el0t_64_sync_handler+0x134/0x150 el0t_64_sync+0x17c/0x180
Switch the spinlock to raw_spinlock_t to avoid this error.
--- kernel/bpf/ringbuf.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kernel/bpf/ringbuf.c +6 -6
@@ -37,7 +37,7 @@ struct bpf_ringbuf {u64 mask;struct page **pages;int nr_pages; -spinlock_t spinlock____cacheline_aligned_in_smp ; +raw_spinlock_t spinlock____cacheline_aligned_in_smp ;/* For user-space producer ring buffers, an atomic_t busy bit is used * to synchronize access to the ring buffers in the kernel, rather than * the spinlock that is used for kernel-producer ring buffers. This is
@@ -170,7 +170,7 @@ static struct bpf_ringbuf *bpf_ringbuf_alloc(size_t data_sz, int numa_node)if (!rb)return NULL ; -spin_lock_init (&rb->spinlock); +raw_spin_lock_init (&rb->spinlock);atomic_set (&rb->busy,0 );init_waitqueue_head (&rb->waitq);init_irq_work (&rb->work, bpf_ringbuf_notify);
@@ -407,10 +407,10 @@ static void *__bpf_ringbuf_reserve(struct bpf_ringbuf *rb, u64 size) cons_pos =smp_load_acquire (&rb->consumer_pos);if (in_nmi ()) { -if (!spin_trylock_irqsave (&rb->spinlock, flags)) +if (!raw_spin_trylock_irqsave (&rb->spinlock, flags))return NULL ; }else { -spin_lock_irqsave (&rb->spinlock, flags); +raw_spin_lock_irqsave (&rb->spinlock, flags); } pend_pos = rb->pending_pos;
@@ -436,7 +436,7 @@ static void *__bpf_ringbuf_reserve(struct bpf_ringbuf *rb, u64 size)*/ if (new_prod_pos - cons_pos > rb->mask || new_prod_pos - pend_pos > rb->mask) { -spin_unlock_irqrestore (&rb->spinlock, flags); +raw_spin_unlock_irqrestore (&rb->spinlock, flags);return NULL ; }
@@ -448,7 +448,7 @@ static void *__bpf_ringbuf_reserve(struct bpf_ringbuf *rb, u64 size)/* pairs with consumer's smp_load_acquire() */ smp_store_release (&rb->producer_pos, new_prod_pos); -spin_unlock_irqrestore (&rb->spinlock, flags); +raw_spin_unlock_irqrestore (&rb->spinlock, flags);return (void *)hdr +BPF_RINGBUF_HDR_SZ ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/137 iio: accel: bma400: Fix uninitialized variable field_value in tap event handling.
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikhail Lobanov <[email protected]>
[ Upstream commit db9795a43dc944f048a37b65e06707f60f713e34 ]
In the current implementation, the local variable field_value is used without prior initialization, which may lead to reading uninitialized memory. Specifically, in the macro set_mask_bits, the initial (potentially uninitialized) value of the buffer is copied into old__, and a mask is applied to calculate new__. A similar issue was resolved in commit 6ee2a7058fea ("iio: accel: bma400: Fix smatch warning based on use of unintialized value.").
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/iio/accel/bma400_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iio/accel/bma400_core.c +2 -1
@@ -1245,7 +1245,8 @@ static int bma400_activity_event_en(struct bma400_data *data,static int bma400_tap_event_en (struct bma400_data *data,enum iio_event_direction dir,int state) { -unsigned int mask, field_value; +unsigned int mask; +unsigned int field_value =0 ;int ret;/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/137 bpf: Make sure internal and UAPI bpf_redirect flags dont overlap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 09d88791c7cd888d5195c84733caf9183dcfbd16 ]
The bpf_redirect_info is shared between the SKB and XDP redirect paths, and the two paths use the same numeric flag values in the ri->flags field (specifically, BPF_F_BROADCAST == BPF_F_NEXTHOP). This means that if skb bpf_redirect_neigh() is used with a non-NULL params argument and, subsequently, an XDP redirect is performed using the same bpf_redirect_info struct, the XDP path will get confused and end up crashing, which syzbot managed to trigger.
With the stack-allocated bpf_redirect_info, the structure is no longer shared between the SKB and XDP paths, so the crash doesn't happen anymore. However, different code paths using identically-numbered flag values in the same struct field still seems like a bit of a mess, so this patch cleans that up by moving the flag definitions together and redefining the three flags in BPF_F_REDIRECT_INTERNAL to not overlap with the flags used for XDP. It also adds a BUILD_BUG_ON() check to make sure the overlap is not re-introduced by mistake.
--- include/uapi/linux/bpf.h | 13 +++++-------- net/core/filter.c | 8 +++++--- 2 files changed, 10 insertions(+), 11 deletions(-)
include/uapi/linux/bpf.h +5 -8
@@ -5717,11 +5717,6 @@ enum { BPF_F_MARK_ENFORCE = (1ULL << 6), }; -/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ -enum { -BPF_F_INGRESS = (1ULL <<0 ), -}; -/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ enum {BPF_F_TUNINFO_IPV6 = (1ULL <<0 ),
@@ -5865,10 +5860,12 @@ enum { BPF_F_BPRM_SECUREEXEC = (1ULL << 0), }; -/* Flags for bpf_redirect_map helper */ +/* Flags for bpf_redirect and bpf_redirect_map helpers */ enum { -BPF_F_BROADCAST = (1ULL <<3 ), -BPF_F_EXCLUDE_INGRESS = (1ULL <<4 ), +BPF_F_INGRESS = (1ULL <<0 ),/* used for skb path */ +BPF_F_BROADCAST = (1ULL <<3 ),/* used for XDP path */ +BPF_F_EXCLUDE_INGRESS = (1ULL <<4 ),/* used for XDP path */ +#define BPF_F_REDIRECT_FLAGS (BPF_F_INGRESS | BPF_F_BROADCAST | BPF_F_EXCLUDE_INGRESS) };#define __bpf_md_ptr (type, name) \
net/core/filter.c +5 -3
@@ -2416,9 +2416,9 @@ static int __bpf_redirect_neigh(struct sk_buff *skb, struct net_device *dev,/* Internal, non-exposed redirect flags. */ enum { -BPF_F_NEIGH = (1ULL <<1 ), -BPF_F_PEER = (1ULL <<2 ), -BPF_F_NEXTHOP = (1ULL <<3 ), +BPF_F_NEIGH = (1ULL <<16 ), +BPF_F_PEER = (1ULL <<17 ), +BPF_F_NEXTHOP = (1ULL <<18 ),#define BPF_F_REDIRECT_INTERNAL (BPF_F_NEIGH | BPF_F_PEER | BPF_F_NEXTHOP) };
@@ -2428,6 +2428,8 @@ BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)struct sk_buff *clone;int ret; +BUILD_BUG_ON (BPF_F_REDIRECT_INTERNAL &BPF_F_REDIRECT_FLAGS ); +if (unlikely (flags & (~(BPF_F_INGRESS ) |BPF_F_REDIRECT_INTERNAL )))return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/137 bpf: devmap: provide rxq after redirect
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Kauer <[email protected]>
[ Upstream commit ca9984c5f0ab3690d98b13937b2485a978c8dd73 ]
rxq contains a pointer to the device from where the redirect happened. Currently, the BPF program that was executed after a redirect via BPF_MAP_TYPE_DEVMAP* does not have it set.
This is particularly bad since accessing ingress_ifindex, e.g.
SEC("xdp")
int prog(struct xdp_md *pkt)
{
return bpf_redirect_map(&dev_redirect_map, 0, 0);
}SEC("xdp/devmap")
int prog_after_redirect(struct xdp_md *pkt)
{
bpf_printk("ifindex %i", pkt->ingress_ifindex);
return XDP_PASS;
}depends on access to rxq, so a NULL pointer gets dereferenced:
<1>[ 574.475170] BUG: kernel NULL pointer dereference, address: 0000000000000000 <1>[ 574.475188] #PF: supervisor read access in kernel mode <1>[ 574.475194] #PF: error_code(0x0000) - not-present page <6>[ 574.475199] PGD 0 P4D 0 <4>[ 574.475207] Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI <4>[ 574.475217] CPU: 4 UID: 0 PID: 217 Comm: kworker/4:1 Not tainted 6.11.0-rc5-reduced-00859-g780801200300 #23 <4>[ 574.475226] Hardware name: Intel(R) Client Systems NUC13ANHi7/NUC13ANBi7, BIOS ANRPL357.0026.2023.0314.1458 03/14/2023 <4>[ 574.475231] Workqueue: mld mld_ifc_work <4>[ 574.475247] RIP: 0010:bpf_prog_5e13354d9cf5018a_prog_after_redirect+0x17/0x3c <4>[ 574.475257] Code: cc cc cc cc cc cc cc 80 00 00 00 cc cc cc cc cc cc cc cc f3 0f 1e fa 0f 1f 44 00 00 66 90 55 48 89 e5 f3 0f 1e fa 48 8b 57 20 <48> 8b 52 00 8b 92 e0 00 00 00 48 bf f8 a6 d5 c4 5d a0 ff ff be 0b <4>[ 574.475263] RSP: 0018:ffffa62440280c98 EFLAGS: 00010206 <4>[ 574.475269] RAX: ffffa62440280cd8 RBX: 0000000000000001 RCX: 0000000000000000 <4>[ 574.475274] RDX: 0000000000000000 RSI: ffffa62440549048 RDI: ffffa62440280ce0 <4>[ 574.475278] RBP: ffffa62440280c98 R08: 0000000000000002 R09: 0000000000000001 <4>[ 574.475281] R10: ffffa05dc8b98000 R11: ffffa05f577fca40 R12: ffffa05dcab24000 <4>[ 574.475285] R13: ffffa62440280ce0 R14: ffffa62440549048 R15: ffffa62440549000 <4>[ 574.475289] FS: 0000000000000000(0000) GS:ffffa05f4f700000(0000) knlGS:0000000000000000 <4>[ 574.475294] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 <4>[ 574.475298] CR2: 0000000000000000 CR3: 000000025522e000 CR4: 0000000000f50ef0 <4>[ 574.475303] PKRU: 55555554 <4>[ 574.475306] Call Trace: <4>[ 574.475313] <IRQ> <4>[ 574.475318] ? __die+0x23/0x70 <4>[ 574.475329] ? page_fault_oops+0x180/0x4c0 <4>[ 574.475339] ? skb_pp_cow_data+0x34c/0x490 <4>[ 574.475346] ? kmem_cache_free+0x257/0x280 <4>[ 574.475357] ? exc_page_fault+0x67/0x150 <4>[ 574.475368] ? asm_exc_page_fault+0x26/0x30 <4>[ 574.475381] ? bpf_prog_5e13354d9cf5018a_prog_after_redirect+0x17/0x3c <4>[ 574.475386] bq_xmit_all+0x158/0x420 <4>[ 574.475397] __dev_flush+0x30/0x90 <4>[ 574.475407] veth_poll+0x216/0x250 [veth] <4>[ 574.475421] __napi_poll+0x28/0x1c0 <4>[ 574.475430] net_rx_action+0x32d/0x3a0 <4>[ 574.475441] handle_softirqs+0xcb/0x2c0 <4>[ 574.475451] do_softirq+0x40/0x60 <4>[ 574.475458] </IRQ> <4>[ 574.475461] <TASK> <4>[ 574.475464] __local_bh_enable_ip+0x66/0x70 <4>[ 574.475471] __dev_queue_xmit+0x268/0xe40 <4>[ 574.475480] ? selinux_ip_postroute+0x213/0x420 <4>[ 574.475491] ? alloc_skb_with_frags+0x4a/0x1d0 <4>[ 574.475502] ip6_finish_output2+0x2be/0x640 <4>[ 574.475512] ? nf_hook_slow+0x42/0xf0 <4>[ 574.475521] ip6_finish_output+0x194/0x300 <4>[ 574.475529] ? __pfx_ip6_finish_output+0x10/0x10 <4>[ 574.475538] mld_sendpack+0x17c/0x240 <4>[ 574.475548] mld_ifc_work+0x192/0x410 <4>[ 574.475557] process_one_work+0x15d/0x380 <4>[ 574.475566] worker_thread+0x29d/0x3a0 <4>[ 574.475573] ? __pfx_worker_thread+0x10/0x10 <4>[ 574.475580] ? __pfx_worker_thread+0x10/0x10 <4>[ 574.475587] kthread+0xcd/0x100 <4>[ 574.475597] ? __pfx_kthread+0x10/0x10 <4>[ 574.475606] ret_from_fork+0x31/0x50 <4>[ 574.475615] ? __pfx_kthread+0x10/0x10 <4>[ 574.475623] ret_from_fork_asm+0x1a/0x30 <4>[ 574.475635] </TASK> <4>[ 574.475637] Modules linked in: veth br_netfilter bridge stp llc iwlmvm x86_pkg_temp_thermal iwlwifi efivarfs nvme nvme_core <4>[ 574.475662] CR2: 0000000000000000 <4>[ 574.475668] ---[ end trace 0000000000000000 ]---
Therefore, provide it to the program by setting rxq properly.
--- kernel/bpf/devmap.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
kernel/bpf/devmap.c +7 -4
@@ -326,9 +326,11 @@ static int dev_map_hash_get_next_key(struct bpf_map *map, void *key,static int dev_map_bpf_prog_run (struct bpf_prog *xdp_prog,struct xdp_frame **frames,int n, -struct net_device *dev) +struct net_device *tx_dev, +struct net_device *rx_dev) { -struct xdp_txq_info txq = { .dev = dev }; +struct xdp_txq_info txq = { .dev = tx_dev }; +struct xdp_rxq_info rxq = { .dev = rx_dev };struct xdp_buff xdp;int i, nframes =0 ;
@@ -339,6 +341,7 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog,xdp_convert_frame_to_buff (xdpf, &xdp); xdp.txq = &txq; + xdp.rxq = &rxq; act =bpf_prog_run_xdp (xdp_prog, &xdp);switch (act) {
@@ -353,7 +356,7 @@ static int dev_map_bpf_prog_run(struct bpf_prog *xdp_prog,bpf_warn_invalid_xdp_action (NULL , xdp_prog, act); fallthrough;case XDP_ABORTED : -trace_xdp_exception (dev, xdp_prog, act); +trace_xdp_exception (tx_dev, xdp_prog, act); fallthrough;case XDP_DROP :xdp_return_frame_rx_napi (xdpf);
@@ -381,7 +384,7 @@ static void bq_xmit_all(struct xdp_dev_bulk_queue *bq, u32 flags) }if (bq->xdp_prog) { - to_send =dev_map_bpf_prog_run (bq->xdp_prog, bq->q, cnt, dev); + to_send =dev_map_bpf_prog_run (bq->xdp_prog, bq->q, cnt, dev, bq->dev_rx);if (!to_send) goto out; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/137 bpf: Fix memory leak in bpf_core_apply
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 45126b155e3b5201179cdc038504bf93a8ccd921 ]
We need to free specs properly.
--- kernel/bpf/btf.c | 1 + 1 file changed, 1 insertion(+)
kernel/bpf/btf.c +1 -0
@@ -7987,6 +7987,7 @@ int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo,if (!type) {bpf_log (ctx->log,"relo #%u: bad type id %u\n" , relo_idx, relo->type_id); +kfree (specs);return -EINVAL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 6/137 RDMA/bnxt_re: Fix incorrect AVID type in WQE structure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Saravanan Vajravel <[email protected]>
[ Upstream commit 9ab20f76ae9fad55ebaf36bdff04aea1c2552374 ]
Driver uses internal data structure to construct WQE frame. It used avid type as u16 which can accommodate up to 64K AVs. When outstanding AVID crosses 64K, driver truncates AVID and hence it uses incorrect AVID to WR. This leads to WR failure due to invalid AV ID and QP is moved to error state with reason set to 19 (INVALID AVID). When RDMA CM path is used, this issue hits QP1 and it is moved to error state
--- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.h +1 -1
@@ -169,7 +169,7 @@ struct bnxt_qplib_swqe { };u32 q_key;u32 dst_qp; -u16 avid; +u32 avid; } send;/* Send Raw Ethernet and QP1 */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 7/137 RDMA/bnxt_re: Add a check for memory allocation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit c5c1ae73b7741fa3b58e6e001b407825bb971225 ]
__alloc_pbl() can return error when memory allocation fails. Driver is not checking the status on one of the instances.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/bnxt_re/qplib_res.c +2 -0
@@ -244,6 +244,8 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq, sginfo.pgsize = npde * pg_size; sginfo.npages =1 ; rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_0 ], &sginfo); +if (rc) + goto fail;/* Alloc PBL pages */ sginfo.npages = npbl;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 8/137 x86/resctrl: Avoid overflow in MB settings in bw_validate()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Kletzander <[email protected]>
[ Upstream commit 2b5648416e47933939dc310c4ea1e29404f35630 ]
The resctrl schemata file supports specifying memory bandwidth associated with the Memory Bandwidth Allocation (MBA) feature via a percentage (this is the default) or bandwidth in MiBps (when resctrl is mounted with the "mba_MBps" option).
The allowed range for the bandwidth percentage is from /sys/fs/resctrl/info/MB/min_bandwidth to 100, using a granularity of /sys/fs/resctrl/info/MB/bandwidth_gran. The supported range for the MiBps bandwidth is 0 to U32_MAX.
There are two issues with parsing of MiBps memory bandwidth:
* The user provided MiBps is mistakenly rounded up to the granularity that is unique to percentage input.
* The user provided MiBps is parsed using unsigned long (thus accepting values up to ULONG_MAX), and then assigned to u32 that could result in overflow.
Do not round up the MiBps value and parse user provided bandwidth as the u32 it is intended to be. Use the appropriate kstrtou32() that can detect out of range values.
--- arch/x86/kernel/cpu/resctrl/ctrlmondata.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
arch/x86/kernel/cpu/resctrl/ctrlmondata.c +14 -9
@@ -27,10 +27,10 @@* hardware. The allocated bandwidth percentage is rounded to the next * control step available on the hardware. */ -static bool bw_validate (char *buf,unsigned long *data,struct rdt_resource *r) +static bool bw_validate (char *buf,u32 *data,struct rdt_resource *r) { -unsigned long bw;int ret; +u32 bw;/* * Only linear delay values is supported for current Intel SKUs.
@@ -40,16 +40,21 @@ static bool bw_validate(char *buf, unsigned long *data, struct rdt_resource *r)return false; } - ret =kstrtoul (buf,10 , &bw); + ret =kstrtou32 (buf,10 , &bw);if (ret) { -rdt_last_cmd_printf ("Non-decimal digit in MB value %s\n" , buf); +rdt_last_cmd_printf ("Invalid MB value %s\n" , buf);return false; } -if ((bw < r->membw.min_bw || bw > r->default_ctrl) && - !is_mba_sc (r)) { -rdt_last_cmd_printf ("MB value %ld out of range [%d,%d]\n" , bw, - r->membw.min_bw, r->default_ctrl); +/* Nothing else to do if software controller is enabled. */ +if (is_mba_sc (r)) { + *data = bw; +return true; + } + +if (bw < r->membw.min_bw || bw > r->default_ctrl) { +rdt_last_cmd_printf ("MB value %u out of range [%d,%d]\n" , + bw, r->membw.min_bw, r->default_ctrl);return false; }
@@ -63,7 +68,7 @@ int parse_bw(struct rdt_parse_data *data, struct resctrl_schema *s,struct resctrl_staged_config *cfg;u32 closid = data->rdtgrp->closid;struct rdt_resource *r = s->res; -unsigned long bw_val; +u32 bw_val; cfg = &d->staged_config[s->conf_type];if (cfg->have_new_ctrl) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 9/137 ARM: dts: bcm2837-rpi-cm3-io3: Fix HDMI hpd-gpio pin
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Klink <[email protected]>
[ Upstream commit dc7785e4723510616d776862ddb4c08857a1bdb2 ]
HDMI_HPD_N_1V8 is connected to GPIO pin 0, not 1.
This fixes HDMI hotplug/output detection.
See https://datasheets.raspberrypi.com/cm/cm3-schematics.pdf
--- arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts +1 -1
@@ -76,7 +76,7 @@ }; &hdmi { - hpd-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; + hpd-gpios = <&expgpio 0 GPIO_ACTIVE_LOW>; power-domains = <&power RPI_POWER_DOMAIN_HDMI>; status = "okay"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 10/137 s390/pci: Handle PCI error codes other than 0x3a
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit 3cd03ea57e8e16cc78cc357d5e9f26078426f236 ]
The Linux implementation of PCI error recovery for s390 was based on the understanding that firmware error recovery is a two step process with an optional initial error event to indicate the cause of the error if known followed by either error event 0x3A (Success) or 0x3B (Failure) to indicate whether firmware was able to recover. While this has been the case in testing and the error cases seen in the wild it turns out this is not correct. Instead firmware only generates 0x3A for some error and service scenarios and expects the OS to perform recovery for all PCI events codes except for those indicating permanent error (0x3B, 0x40) and those indicating errors on the function measurement block (0x2A, 0x2B, 0x2C). Align Linux behavior with these expectations.
--- arch/s390/pci/pci_event.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
arch/s390/pci/pci_event.c +9 -8
@@ -272,18 +272,19 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf) goto no_pdev;switch (ccdf->pec) { -case 0x003a :/* Service Action or Error Recovery Successful */ +case 0x002a :/* Error event concerns FMB */ +case 0x002b : +case 0x002c : +break ; +case 0x0040 :/* Service Action or Error Recovery Failed */ +case 0x003b : +zpci_event_io_failure (pdev, pci_channel_io_perm_failure); +break ; +default :/* PCI function left in the error state attempt to recover */ ers_res =zpci_event_attempt_error_recovery (pdev);if (ers_res !=PCI_ERS_RESULT_RECOVERED )zpci_event_io_failure (pdev, pci_channel_io_perm_failure);break ; -default : -/* -* Mark as frozen not permanently failed because the device -* could be subsequently recovered by the platform. -*/ -zpci_event_io_failure (pdev, pci_channel_io_frozen); -break ; }pci_dev_put (pdev); no_pdev:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 11/137 bpf: fix kfunc btf caching for modules
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 6cb86a0fdece87e126323ec1bb19deb16a52aedf ]
The verifier contains a cache for looking up module BTF objects when calling kfuncs defined in modules. This cache uses a 'struct bpf_kfunc_btf_tab', which contains a sorted list of BTF objects that were already seen in the current verifier run, and the BTF objects are looked up by the offset stored in the relocated call instruction using bsearch().
The first time a given offset is seen, the module BTF is loaded from the file descriptor passed in by libbpf, and stored into the cache. However, there's a bug in the code storing the new entry: it stores a pointer to the new cache entry, then calls sort() to keep the cache sorted for the next lookup using bsearch(), and then returns the entry that was just stored through the stored pointer. However, because sort() modifies the list of entries in place *by value*, the stored pointer may no longer point to the right entry, in which case the wrong BTF object will be returned.
The end result of this is an intermittent bug where, if a BPF program calls two functions with the same signature in two different modules, the function from the wrong module may sometimes end up being called. Whether this happens depends on the order of the calls in the BPF program (as that affects whether sort() reorders the array of BTF objects), making it especially hard to track down. Simon, credited as reporter below, spent significant effort analysing and creating a reproducer for this issue. The reproducer is added as a selftest in a subsequent patch.
The fix is straight forward: simply don't use the stored pointer after calling sort(). Since we already have an on-stack pointer to the BTF object itself at the point where the function return, just use that, and populate it from the cache entry in the branch where the lookup succeeds.
--- kernel/bpf/verifier.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
kernel/bpf/verifier.c +7 -1
@@ -1924,10 +1924,16 @@ static struct btf *__find_kfunc_desc_btf(struct bpf_verifier_env *env, b->module = mod; b->offset = offset; +/* sort() reorders entries by value, so b may no longer point +* to the right entry after this +*/ sort (tab->descs, tab->nr_descs,sizeof (tab->descs[0 ]), kfunc_btf_cmp_by_off,NULL ); + }else { + btf = b->btf; } -return b->btf; + +return btf; }void bpf_free_kfunc_btf_tab (struct bpf_kfunc_btf_tab *tab)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 12/137 iio: frequency: {admv4420,adrf6780}: format Kconfig entries
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit 5c9644a683e1690387a476a4f5f6bd5cf9a1d695 ]
Format the entries of these drivers in the Kconfig, where spaces instead of tabs were used.
Stable-dep-of: 6b8e9dbfaed4 ("iio: frequency: admv4420: fix missing select REMAP_SPI in Kconfig")
--- drivers/iio/frequency/Kconfig | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
drivers/iio/frequency/Kconfig +16 -16
@@ -71,25 +71,25 @@ config ADMV1014 module will be called admv1014. config ADMV4420 - tristate "Analog Devices ADMV4420 K Band Downconverter" - depends on SPI - help - Say yes here to build support for Analog Devices K Band - Downconverter with integrated Fractional-N PLL and VCO. + tristate "Analog Devices ADMV4420 K Band Downconverter" + depends on SPI + help + Say yes here to build support for Analog Devices K Band + Downconverter with integrated Fractional-N PLL and VCO. - To compile this driver as a module, choose M here: the - module will be called admv4420. + To compile this driver as a module, choose M here: the + module will be called admv4420. config ADRF6780 - tristate "Analog Devices ADRF6780 Microwave Upconverter" - depends on SPI - depends on COMMON_CLK - help - Say yes here to build support for Analog Devices ADRF6780 - 5.9 GHz to 23.6 GHz, Wideband, Microwave Upconverter. - - To compile this driver as a module, choose M here: the - module will be called adrf6780. + tristate "Analog Devices ADRF6780 Microwave Upconverter" + depends on SPI + depends on COMMON_CLK + help + Say yes here to build support for Analog Devices ADRF6780 + 5.9 GHz to 23.6 GHz, Wideband, Microwave Upconverter. + + To compile this driver as a module, choose M here: the + module will be called adrf6780. endmenu endmenu
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 13/137 iio: frequency: admv4420: fix missing select REMAP_SPI in Kconfig
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit 6b8e9dbfaed471627f7b863633b9937717df1d4d ]
This driver makes use of regmap_spi, but does not select the required module.
Add the missing 'select REGMAP_SPI'.
--- drivers/iio/frequency/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/iio/frequency/Kconfig +1 -0
@@ -73,6 +73,7 @@ config ADMV1014 config ADMV4420 tristate "Analog Devices ADMV4420 K Band Downconverter" depends on SPI + select REGMAP_SPI help Say yes here to build support for Analog Devices K Band Downconverter with integrated Fractional-N PLL and VCO.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 14/137 drm/vmwgfx: Handle possible ENOMEM in vmw_stdu_connector_atomic_check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Forbes <[email protected]>
[ Upstream commit 4809a017a2bc42ff239d53ade4b2e70f2fe81348 ]
Handle unlikely ENOMEN condition and other errors in vmw_stdu_connector_atomic_check.
--- drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c +4 -0
@@ -1028,6 +1028,10 @@ static int vmw_stdu_connector_atomic_check(struct drm_connector *conn,struct drm_crtc_state *new_crtc_state; conn_state =drm_atomic_get_connector_state (state, conn); + +if (IS_ERR (conn_state)) +return PTR_ERR (conn_state); + du =vmw_connector_to_stdu (conn);if (!conn_state->crtc)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 15/137 selftests/bpf: Fix cross-compiling urandom_read
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit fd526e121c4d6f71aed82d21a8b8277b03e60b43 ]
Linking of urandom_read and liburandom_read.so prefers LLVM's 'ld.lld' but falls back to using 'ld' if unsupported. However, this fallback discards any existing makefile macro for LD and can break cross-compilation.
Fix by changing the fallback to use the target linker $(LD), passed via '-fuse-ld=' using an absolute path rather than a linker "flavour".
--- tools/testing/selftests/bpf/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/Makefile +1 -1
@@ -171,7 +171,7 @@ $(OUTPUT)/%:%.c ifeq ($(SRCARCH),x86) LLD := lld else -LLD := ld +LLD := $(shell command -v $(LD)) endif # Filter out -static for liburandom_read.so and its dependent targets so that static builds
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 16/137 ALSA: hda/cs8409: Fix possible NULL dereference
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Murad Masimov <[email protected]>
[ Upstream commit c9bd4a82b4ed32c6d1c90500a52063e6e341517f ]
If snd_hda_gen_add_kctl fails to allocate memory and returns NULL, then NULL pointer dereference will occur in the next line.
Since dolphin_fixups function is a hda_fixup function which is not supposed to return any errors, add simple check before dereference, ignore the fail.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- sound/pci/hda/patch_cs8409.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/pci/hda/patch_cs8409.c +3 -2
@@ -1411,8 +1411,9 @@ void dolphin_fixups(struct hda_codec *codec, const struct hda_fixup *fix, int ac kctrl =snd_hda_gen_add_kctl (&spec->gen,"Line Out Playback Volume" , &cs42l42_dac_volume_mixer);/* Update Line Out kcontrol template */ - kctrl->private_value =HDA_COMPOSE_AMP_VAL_OFS (DOLPHIN_HP_PIN_NID ,3 ,CS8409_CODEC1 , -HDA_OUTPUT ,CS42L42_VOL_DAC ) |HDA_AMP_VAL_MIN_MUTE ; +if (kctrl) + kctrl->private_value =HDA_COMPOSE_AMP_VAL_OFS (DOLPHIN_HP_PIN_NID ,3 ,CS8409_CODEC1 , +HDA_OUTPUT ,CS42L42_VOL_DAC ) |HDA_AMP_VAL_MIN_MUTE ;cs8409_enable_ur (codec,0 );snd_hda_codec_set_name (codec,"CS8409/CS42L42" );break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 17/137 RDMA/cxgb4: Fix RDMA_CM_EVENT_UNREACHABLE error for iWARP
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anumula Murali Mohan Reddy <[email protected]>
[ Upstream commit c659b405b82ead335bee6eb33f9691bf718e21e8 ]
ip_dev_find() always returns real net_device address, whether traffic is running on a vlan or real device, if traffic is over vlan, filling endpoint struture with real ndev and an attempt to send a connect request will results in RDMA_CM_EVENT_UNREACHABLE error. This patch fixes the issue by using vlan_dev_real_dev().
--- drivers/infiniband/hw/cxgb4/cm.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/infiniband/hw/cxgb4/cm.c +4 -5
@@ -2086,7 +2086,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, err = -ENOMEM ;if (n->dev->flags &IFF_LOOPBACK ) {if (iptype ==4 ) - pdev =ip_dev_find (&init_net, *(__be32 *)peer_ip); + pdev =__ip_dev_find (&init_net, *(__be32 *)peer_ip, false);else if (IS_ENABLED (CONFIG_IPV6 ))for_each_netdev (&init_net, pdev) { if (ipv6_chk_addr(&init_net,
@@ -2101,12 +2101,12 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, err = -ENODEV ; goto out; } +if (is_vlan_dev (pdev)) + pdev =vlan_dev_real_dev (pdev); ep->l2t =cxgb4_l2t_get (cdev->rdev.lldi.l2t, n, pdev,rt_tos2priority (tos)); -if (!ep->l2t) { -dev_put (pdev); +if (!ep->l2t) goto out; - } ep->mtu = pdev->mtu; ep->tx_chan =cxgb4_port_chan (pdev); ep->smac_idx = ((struct port_info *)netdev_priv (pdev))->smt_idx;
@@ -2119,7 +2119,6 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip, ep->rss_qid = cdev->rdev.lldi.rxq_ids[cxgb4_port_idx (pdev) * step];set_tcp_window (ep, (struct port_info *)netdev_priv (pdev)); -dev_put (pdev); }else { pdev =get_real_dev (n->dev); ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 18/137 RDMA/irdma: Fix misspelling of "accept*"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Zubkov <[email protected]>
[ Upstream commit 8cddfa535c931b8d8110c73bfed7354a94cbf891 ]
There is "accept*" misspelled as "accpet*" in the comments. Fix the spelling.
--- drivers/infiniband/hw/irdma/cm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/irdma/cm.c +1 -1
@@ -3584,7 +3584,7 @@ void irdma_free_lsmm_rsrc(struct irdma_qp *iwqp)/** * irdma_accept - registered call for connection to be accepted * @cm_id: cm information for passive connection -* @conn_param: accpet parameters +* @conn_param: accept parameters */ int irdma_accept (struct iw_cm_id *cm_id,struct iw_cm_conn_param *conn_param) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 19/137 RDMA/srpt: Make slab cache names unique
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit 4d784c042d164f10fc809e2338457036cd7c653d ]
Since commit 4c39529663b9 ("slab: Warn on duplicate cache names when DEBUG_VM=y"), slab complains about duplicate cache names. Hence this patch. The approach is as follows:
- Maintain an xarray with the slab size as index and a reference count and a kmem_cache pointer as contents. Use srpt-${slab_size} as kmem cache name.
- Use 512-byte alignment for all slabs instead of only for some of the slabs.
- Increment the reference count instead of calling kmem_cache_create().
- Decrement the reference count instead of calling kmem_cache_destroy().
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 80 +++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 12 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +68 -12
@@ -68,6 +68,8 @@ MODULE_LICENSE("Dual BSD/GPL");static u64 srpt_service_guid;static DEFINE_SPINLOCK (srpt_dev_lock);/* Protects srpt_dev_list. */ static LIST_HEAD (srpt_dev_list);/* List of srpt_device structures. */ +static DEFINE_MUTEX (srpt_mc_mutex);/* Protects srpt_memory_caches. */ +static DEFINE_XARRAY (srpt_memory_caches);/* See also srpt_memory_cache_entry */ static unsigned srp_max_req_size =DEFAULT_MAX_REQ_SIZE ;module_param (srp_max_req_size, int,0444 );
@@ -105,6 +107,63 @@ static void srpt_recv_done(struct ib_cq *cq, struct ib_wc *wc);static void srpt_send_done (struct ib_cq *cq,struct ib_wc *wc);static void srpt_process_wait_list (struct srpt_rdma_ch *ch); +/* Type of the entries in srpt_memory_caches. */ +struct srpt_memory_cache_entry { +refcount_t ref; +struct kmem_cache *c; +}; + +static struct kmem_cache *srpt_cache_get (unsigned int object_size) +{ +struct srpt_memory_cache_entry *e; +char name[32 ]; +void *res; + +guard (mutex)(&srpt_mc_mutex); + e =xa_load (&srpt_memory_caches, object_size); +if (e) { +refcount_inc (&e->ref); +return e->c; + } +snprintf (name,sizeof (name),"srpt-%u" , object_size); + e =kmalloc (sizeof (*e),GFP_KERNEL ); +if (!e) +return NULL ; +refcount_set (&e->ref,1 ); + e->c =kmem_cache_create (name, object_size,/*align=*/ 512 ,0 ,NULL ); +if (!e->c) + goto free_entry; + res =xa_store (&srpt_memory_caches, object_size, e,GFP_KERNEL ); +if (xa_is_err (res)) + goto destroy_cache; +return e->c; + +destroy_cache: +kmem_cache_destroy (e->c); + +free_entry: +kfree (e); +return NULL ; +} + +static void srpt_cache_put (struct kmem_cache *c) +{ +struct srpt_memory_cache_entry *e =NULL ; +unsigned long object_size; + +guard (mutex)(&srpt_mc_mutex); +xa_for_each (&srpt_memory_caches, object_size, e) +if (e->c == c) +break ; +if (WARN_ON_ONCE (!e)) +return ; +if (!refcount_dec_and_test (&e->ref)) +return ; +WARN_ON_ONCE (xa_erase (&srpt_memory_caches, object_size) != e); +kmem_cache_destroy (e->c); +kfree (e); +} +/* * The only allowed channel state changes are those that change the channel * state into a state with a higher numerical value. Hence the new > prev test.
@@ -2119,13 +2178,13 @@ static void srpt_release_channel_work(struct work_struct *w) ch->sport->sdev, ch->rq_size, ch->rsp_buf_cache, DMA_TO_DEVICE); -kmem_cache_destroy (ch->rsp_buf_cache); +srpt_cache_put (ch->rsp_buf_cache);srpt_free_ioctx_ring ((struct srpt_ioctx **)ch->ioctx_recv_ring, sdev, ch->rq_size, ch->req_buf_cache,DMA_FROM_DEVICE ); -kmem_cache_destroy (ch->req_buf_cache); +srpt_cache_put (ch->req_buf_cache);kref_put (&ch->kref, srpt_free_ch); }
@@ -2245,8 +2304,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev,INIT_LIST_HEAD (&ch->cmd_wait_list); ch->max_rsp_size = ch->sport->port_attrib.srp_max_rsp_size; - ch->rsp_buf_cache =kmem_cache_create ("srpt-rsp-buf" , ch->max_rsp_size, -512 ,0 ,NULL ); + ch->rsp_buf_cache =srpt_cache_get (ch->max_rsp_size);if (!ch->rsp_buf_cache) goto free_ch;
@@ -2280,8 +2338,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev, alignment_offset =round_up (imm_data_offset,512 ) - imm_data_offset; req_sz = alignment_offset + imm_data_offset + srp_max_req_size; - ch->req_buf_cache =kmem_cache_create ("srpt-req-buf" , req_sz, -512 ,0 ,NULL ); + ch->req_buf_cache =srpt_cache_get (req_sz);if (!ch->req_buf_cache) goto free_rsp_ring;
@@ -2478,7 +2535,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev, ch->req_buf_cache, DMA_FROM_DEVICE); free_recv_cache: -kmem_cache_destroy (ch->req_buf_cache); +srpt_cache_put (ch->req_buf_cache); free_rsp_ring: srpt_free_ioctx_ring((struct srpt_ioctx **)ch->ioctx_ring,
@@ -2486,7 +2543,7 @@ static int srpt_cm_req_recv(struct srpt_device *const sdev, ch->rsp_buf_cache, DMA_TO_DEVICE); free_rsp_cache: -kmem_cache_destroy (ch->rsp_buf_cache); +srpt_cache_put (ch->rsp_buf_cache); free_ch:if (rdma_cm_id)
@@ -3055,7 +3112,7 @@ static void srpt_free_srq(struct srpt_device *sdev)srpt_free_ioctx_ring ((struct srpt_ioctx **)sdev->ioctx_ring, sdev, sdev->srq_size, sdev->req_buf_cache,DMA_FROM_DEVICE ); -kmem_cache_destroy (sdev->req_buf_cache); +srpt_cache_put (sdev->req_buf_cache); sdev->srq =NULL ; }
@@ -3082,8 +3139,7 @@ static int srpt_alloc_srq(struct srpt_device *sdev)pr_debug ("create SRQ #wr= %d max_allow=%d dev= %s\n" , sdev->srq_size, sdev->device->attrs.max_srq_wr,dev_name (&device->dev)); - sdev->req_buf_cache =kmem_cache_create ("srpt-srq-req-buf" , - srp_max_req_size,0 ,0 ,NULL ); + sdev->req_buf_cache =srpt_cache_get (srp_max_req_size);if (!sdev->req_buf_cache) goto free_srq;
@@ -3105,7 +3161,7 @@ static int srpt_alloc_srq(struct srpt_device *sdev)return 0 ; free_cache: -kmem_cache_destroy (sdev->req_buf_cache); +srpt_cache_put (sdev->req_buf_cache); free_srq:ib_destroy_srq (srq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 20/137 ipv4: give an IPv4 dev to blackhole_netdev
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 22600596b6756b166fd052d5facb66287e6f0bad ]
After commit 8d7017fd621d ("blackhole_netdev: use blackhole_netdev to invalidate dst entries"), blackhole_netdev was introduced to invalidate dst cache entries on the TX path whenever the cache times out or is flushed.
When two UDP sockets (sk1 and sk2) send messages to the same destination simultaneously, they are using the same dst cache. If the dst cache is invalidated on one path (sk2) while the other (sk1) is still transmitting, sk1 may try to use the invalid dst entry.
CPU1 CPU2
udp_sendmsg(sk1) udp_sendmsg(sk2)
udp_send_skb()
ip_output()
<--- dst timeout or flushed
dst_dev_put()
ip_finish_output2()
ip_neigh_for_gw()This results in a scenario where ip_neigh_for_gw() returns -EINVAL because blackhole_dev lacks an in_dev, which is needed to initialize the neigh in arp_constructor(). This error is then propagated back to userspace, breaking the UDP application.
The patch fixes this issue by assigning an in_dev to blackhole_dev for IPv4, similar to what was done for IPv6 in commit e5f80fcf869a ("ipv6:
give an IPv6 dev to blackhole_netdev"). This ensures that even when the dst entry is invalidated with blackhole_dev, it will not fail to create the neigh entry.
As devinet_init() is called ealier than blackhole_netdev_init() in system booting, it can not assign the in_dev to blackhole_dev in devinet_init(). As Paolo suggested, add a separate late_initcall() in devinet.c to ensure inet_blackhole_dev_init() is called after blackhole_netdev_init().
--- net/ipv4/devinet.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-)
net/ipv4/devinet.c +25 -10
@@ -276,17 +276,19 @@ static struct in_device *inetdev_init(struct net_device *dev)/* Account for reference dev->ip_ptr (below) */ refcount_set (&in_dev->refcnt,1 ); - err =devinet_sysctl_register (in_dev); -if (err) { - in_dev->dead =1 ; -neigh_parms_release (&arp_tbl, in_dev->arp_parms); -in_dev_put (in_dev); - in_dev =NULL ; - goto out; +if (dev != blackhole_netdev) { + err =devinet_sysctl_register (in_dev); +if (err) { + in_dev->dead =1 ; +neigh_parms_release (&arp_tbl, in_dev->arp_parms); +in_dev_put (in_dev); + in_dev =NULL ; + goto out; + } +ip_mc_init_dev (in_dev); +if (dev->flags &IFF_UP ) +ip_mc_up (in_dev); } -ip_mc_init_dev (in_dev); -if (dev->flags &IFF_UP ) -ip_mc_up (in_dev);/* we can receive as soon as ip_ptr is set -- do this last */ rcu_assign_pointer (dev->ip_ptr, in_dev);
@@ -331,6 +333,19 @@ static void inetdev_destroy(struct in_device *in_dev)call_rcu (&in_dev->rcu_head, in_dev_rcu_put); } +static int __init inet_blackhole_dev_init (void ) +{ +int err =0 ; + +rtnl_lock (); +if (!inetdev_init (blackhole_netdev)) + err = -ENOMEM ; +rtnl_unlock (); + +return err; +} +late_initcall (inet_blackhole_dev_init); +int inet_addr_onlink (struct in_device *in_dev,__be32 a,__be32 b) {const struct in_ifaddr *ifa;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 21/137 RDMA/bnxt_re: Return more meaningful error
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 98647df0178df215b8239c5c365537283b2852a6 ]
When the HWRM command fails, driver currently returns -EFAULT(Bad address). This does not look correct.
Modified to return -EIO(I/O error).
--- drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c +1 -1
@@ -249,7 +249,7 @@ int bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,/* failed with status */ dev_err (&rcfw->pdev->dev,"cmdq[%#x]=%#x status %#x\n" , cookie, opcode, evnt->status); - rc = -EFAULT ; + rc = -EIO ; }return rc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 22/137 RDMA/bnxt_re: Fix a bug while setting up Level-2 PBL pages
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bhargava Chenna Marreddy <[email protected]>
[ Upstream commit 7988bdbbb85ac85a847baf09879edcd0f70521dc ]
Avoid memory corruption while setting up Level-2 PBL pages for the non MR resources when num_pages > 256K.
There will be a single PDE page address (contiguous pages in the case of > PAGE_SIZE), but, current logic assumes multiple pages, leading to invalid memory access after 256K PBL entries in the PDE.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +3 -16
@@ -257,22 +257,9 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq, dst_virt_ptr = (dma_addr_t **)hwq->pbl[PBL_LVL_0 ].pg_arr; src_phys_ptr = hwq->pbl[PBL_LVL_1 ].pg_map_arr; -if (hwq_attr->type ==HWQ_TYPE_MR ) { -/* For MR it is expected that we supply only 1 contigous -* page i.e only 1 entry in the PDL that will contain -* all the PBLs for the user supplied memory region -*/ -for (i =0 ; i < hwq->pbl[PBL_LVL_1 ].pg_count; - i++) - dst_virt_ptr[0 ][i] = src_phys_ptr[i] | - flag; - }else { -for (i =0 ; i < hwq->pbl[PBL_LVL_1 ].pg_count; - i++) - dst_virt_ptr[PTR_PG (i)][PTR_IDX (i)] = - src_phys_ptr[i] | -PTU_PDE_VALID ; - } +for (i =0 ; i < hwq->pbl[PBL_LVL_1 ].pg_count; i++) + dst_virt_ptr[0 ][i] = src_phys_ptr[i] | flag; +/* Alloc or init PTEs */ rc =__alloc_pbl (res, &hwq->pbl[PBL_LVL_2 ], hwq_attr->sginfo);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 23/137 drm/msm/dpu: make sure phys resources are properly initialized
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit bfecbc2cfba9b06d67d9d249c33d92e570e2fa70 ]
The commit b954fa6baaca ("drm/msm/dpu: Refactor rm iterator") removed zero-init of the hw_ctl array, but didn't change the error condition, that checked for hw_ctl[i] being NULL. At the same time because of the early returns in case of an error dpu_encoder_phys might be left with the resources assigned in the previous state. Rework assigning of hw_pp / hw_ctl to the dpu_encoder_phys in order to make sure they are always set correctly.
Patchwork: https://patchwork.freedesktop.org/patch/612233/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +4 -5
@@ -1106,21 +1106,20 @@ static void dpu_encoder_virt_atomic_mode_set(struct drm_encoder *drm_enc,for (i =0 ; i < dpu_enc->num_phys_encs; i++) {struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i]; -if (!dpu_enc->hw_pp[i]) { + phys->hw_pp = dpu_enc->hw_pp[i]; +if (!phys->hw_pp) {DPU_ERROR_ENC (dpu_enc,"no pp block assigned at idx: %d\n" , i);return ; } -if (!hw_ctl[i]) { + phys->hw_ctl = i < num_ctl ?to_dpu_hw_ctl (hw_ctl[i]) :NULL ; +if (!phys->hw_ctl) {DPU_ERROR_ENC (dpu_enc,"no ctl block assigned at idx: %d\n" , i);return ; } - phys->hw_pp = dpu_enc->hw_pp[i]; - phys->hw_ctl =to_dpu_hw_ctl (hw_ctl[i]); - phys->cached_mode = crtc_state->adjusted_mode;if (phys->ops.atomic_mode_set) phys->ops.atomic_mode_set (phys, crtc_state, conn_state);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 24/137 drm/msm/dsi: fix 32-bit signed integer extension in pclk_rate calculation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Marek <[email protected]>
[ Upstream commit 358b762400bd94db2a14a72dfcef74c7da6bd845 ]
When (mode->clock * 1000) is larger than (1<<31), int to unsigned long conversion will sign extend the int to 64 bits and the pclk_rate value will be incorrect.
Fix this by making the result of the multiplication unsigned.
Note that above (1<<32) would still be broken and require more changes, but its unlikely anyone will need that anytime soon.
Patchwork: https://patchwork.freedesktop.org/patch/618434/
--- drivers/gpu/drm/msm/dsi/dsi_host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/dsi_host.c +1 -1
@@ -576,7 +576,7 @@ static unsigned long dsi_get_pclk_rate(struct msm_dsi_host *msm_host, bool is_bostruct drm_display_mode *mode = msm_host->mode;unsigned long pclk_rate; - pclk_rate = mode->clock *1000 ; + pclk_rate = mode->clock *1000u ;/* * For bonded DSI mode, the current DRM mode has the complete width of the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 25/137 drm/msm: Avoid NULL dereference in msm_disp_state_print_regs()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit 293f53263266bc4340d777268ab4328a97f041fa ]
If the allocation in msm_disp_state_dump_regs() failed then block->state can be NULL. The msm_disp_state_print_regs() function _does_ have code to try to handle it with:
if (*reg)
dump_addr = *reg;...but since "dump_addr" is initialized to NULL the above is actually a noop. The code then goes on to dereference dump_addr.
Make the function print "Registers not stored" when it sees a NULL to solve this. Since we're touching the code, fix msm_disp_state_print_regs() not to pointlessly take a double-pointer and properly mark the pointer as const.
Patchwork: https://patchwork.freedesktop.org/patch/619657/
--- drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c +8 -7
@@ -48,20 +48,21 @@ static void msm_disp_state_dump_regs(u32 **reg, u32 aligned_len, void __iomem *b } } -static void msm_disp_state_print_regs (u32 **reg,u32 len,void __iomem *base_addr, -struct drm_printer *p) +static void msm_disp_state_print_regs (const u32 *dump_addr,u32 len, +void __iomem *base_addr,struct drm_printer *p) {int i; -u32 *dump_addr =NULL ;void __iomem *addr;u32 num_rows; +if (!dump_addr) { +drm_printf (p,"Registers not stored\n" ); +return ; + } + addr = base_addr; num_rows = len /REG_DUMP_ALIGN ; -if (*reg) - dump_addr = *reg; -for (i =0 ; i < num_rows; i++) { drm_printf(p, "0x%lx : %08x %08x %08x %08x\n", (unsigned long)(addr - base_addr),
@@ -89,7 +90,7 @@ void msm_disp_state_print(struct msm_disp_state *state, struct drm_printer *p)list_for_each_entry_safe (block, tmp, &state->blocks, node) {drm_printf (p,"====================%s================\n" , block->name); -msm_disp_state_print_regs (&block->state, block->size, block->base_addr, p); +msm_disp_state_print_regs (block->state, block->size, block->base_addr, p); }drm_printf (p,"===================dpu drm state================\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 26/137 drm/msm: Allocate memory for disp snapshot with kvzalloc()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit e4a45582db1b792c57bdb52c45958264f7fcfbdc ]
With the "drm/msm: add a display mmu fault handler" series [1] we saw issues in the field where memory allocation was failing when allocating space for registers in msm_disp_state_dump_regs(). Specifically we were seeing an order 5 allocation fail. It's not surprising that order 5 allocations will sometimes fail after the system has been up and running for a while.
There's no need here for contiguous memory. Change the allocation to kvzalloc() which should make it much less likely to fail.
[1] https://lore.kernel.org/r/[email protected]/
Patchwork: https://patchwork.freedesktop.org/patch/619658/
--- drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c +2 -2
@@ -26,7 +26,7 @@ static void msm_disp_state_dump_regs(u32 **reg, u32 aligned_len, void __iomem *b end_addr = base_addr + aligned_len;if (!(*reg)) - *reg =kzalloc (len_padded,GFP_KERNEL ); + *reg =kvzalloc (len_padded,GFP_KERNEL );if (*reg) dump_addr = *reg;
@@ -162,7 +162,7 @@ void msm_disp_state_free(void *data)list_for_each_entry_safe (block, tmp, &disp_state->blocks, node) {list_del (&block->node); -kfree (block->state); +kvfree (block->state);kfree (block); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 27/137 net: usb: usbnet: fix race in probe failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit b62f4c186c70aa235fef2da68d07325d85ca3ade ]
The same bug as in the disconnect code path also exists in the case of a failure late during the probe process. The flag must also be set.
--- drivers/net/usb/usbnet.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/usbnet.c +1 -0
@@ -1869,6 +1869,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)* may trigger an error resubmitting itself and, worse, * schedule a timer. So we kill it all just in case. */ +usbnet_mark_going_away (dev);cancel_work_sync (&dev->kevent);del_timer_sync (&dev->delay);free_percpu (net->tstats);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 28/137 octeontx2-af: Fix potential integer overflows on integer shifts
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 637c4f6fe40befa04f19c38b5d15429cbb9191d9 ]
The left shift int 32 bit integer constants 1 is evaluated using 32 bit arithmetic and then assigned to a 64 bit unsigned integer. In the case where the shift is 32 or more this can lead to an overflow. Avoid this by shifting using the BIT_ULL macro instead.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c +2 -2
@@ -2279,7 +2279,7 @@ static int nix_smq_flush(struct rvu *rvu, int blkaddr, NIX_AF_TL3_TL2X_LINKX_CFG(tl2_tl3_link_schq, link));if (!(cfg &BIT_ULL (12 )))continue ; - bmap |= (1 << i); + bmap |=BIT_ULL (i); cfg &= ~BIT_ULL (12 );rvu_write64 (rvu, blkaddr,NIX_AF_TL3_TL2X_LINKX_CFG (tl2_tl3_link_schq, link), cfg);
@@ -2300,7 +2300,7 @@ static int nix_smq_flush(struct rvu *rvu, int blkaddr,/* Set NIX_AF_TL3_TL2_LINKX_CFG[ENA] for the TL3/TL2 queue */ for (i =0 ; i < (rvu->hw->cgx_links + rvu->hw->lbk_links); i++) { -if (!(bmap & (1 << i))) +if (!(bmap &BIT_ULL (i)))continue ; cfg =rvu_read64 (rvu, blkaddr,NIX_AF_TL3_TL2X_LINKX_CFG (tl2_tl3_link_schq, link));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 29/137 drm/amd/amdgpu: Fix double unlock in amdgpu_mes_add_ring
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit e7457532cb7167516263150ceae86f36d6ef9683 ]
This patch addresses a double unlock issue in the amdgpu_mes_add_ring function. The mutex was being unlocked twice under certain error conditions, which could lead to undefined behavior.
The fix ensures that the mutex is unlocked only once before jumping to the clean_up_memory label. The unlock operation is moved to just before the goto statement within the conditional block that checks the return value of amdgpu_ring_init. This prevents the second unlock attempt after the clean_up_memory label, which is no longer necessary as the mutex is already unlocked by this point in the code flow.
This change resolves the potential double unlock and maintains the correct mutex handling throughout the function.
Fixes below:
Commit d0c423b64765 ("drm/amdgpu/mes: use ring for kernel queue submission"), leads to the following Smatch static checker warning:
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c:1240 amdgpu_mes_add_ring() warn: double unlock '&adev->mes.mutex_hidden' (orig line 1213)
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
1143 int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id,
1144 int queue_type, int idx,
1145 struct amdgpu_mes_ctx_data *ctx_data,
1146 struct amdgpu_ring **out)
1147 {
1148 struct amdgpu_ring *ring;
1149 struct amdgpu_mes_gang *gang;
1150 struct amdgpu_mes_queue_properties qprops = {0};
1151 int r, queue_id, pasid;
1152
1153 /*
1154 * Avoid taking any other locks under MES lock to avoid circular
1155 * lock dependencies.
1156 */
1157 amdgpu_mes_lock(&adev->mes);
1158 gang = idr_find(&adev->mes.gang_id_idr, gang_id);
1159 if (!gang) {
1160 DRM_ERROR("gang id %d doesn't exist\n", gang_id);
1161 amdgpu_mes_unlock(&adev->mes);
1162 return -EINVAL;
1163 }
1164 pasid = gang->process->pasid;
1165
1166 ring = kzalloc(sizeof(struct amdgpu_ring), GFP_KERNEL);
1167 if (!ring) {
1168 amdgpu_mes_unlock(&adev->mes);
1169 return -ENOMEM;
1170 }
1171
1172 ring->ring_obj = NULL;
1173 ring->use_doorbell = true;
1174 ring->is_mes_queue = true;
1175 ring->mes_ctx = ctx_data;
1176 ring->idx = idx;
1177 ring->no_scheduler = true;
1178
1179 if (queue_type == AMDGPU_RING_TYPE_COMPUTE) {
1180 int offset = offsetof(struct amdgpu_mes_ctx_meta_data,
1181 compute[ring->idx].mec_hpd);
1182 ring->eop_gpu_addr =
1183 amdgpu_mes_ctx_get_offs_gpu_addr(ring, offset);
1184 }
1185
1186 switch (queue_type) {
1187 case AMDGPU_RING_TYPE_GFX:
1188 ring->funcs = adev->gfx.gfx_ring[0].funcs;
1189 ring->me = adev->gfx.gfx_ring[0].me;
1190 ring->pipe = adev->gfx.gfx_ring[0].pipe;
1191 break;
1192 case AMDGPU_RING_TYPE_COMPUTE:
1193 ring->funcs = adev->gfx.compute_ring[0].funcs;
1194 ring->me = adev->gfx.compute_ring[0].me;
1195 ring->pipe = adev->gfx.compute_ring[0].pipe;
1196 break;
1197 case AMDGPU_RING_TYPE_SDMA:
1198 ring->funcs = adev->sdma.instance[0].ring.funcs;
1199 break;
1200 default:
1201 BUG();
1202 }
1203
1204 r = amdgpu_ring_init(adev, ring, 1024, NULL, 0,
1205 AMDGPU_RING_PRIO_DEFAULT, NULL);
1206 if (r)
1207 goto clean_up_memory;
1208
1209 amdgpu_mes_ring_to_queue_props(adev, ring, &qprops);
1210
1211 dma_fence_wait(gang->process->vm->last_update, false);
1212 dma_fence_wait(ctx_data->meta_data_va->last_pt_update, false);
1213 amdgpu_mes_unlock(&adev->mes);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1214
1215 r = amdgpu_mes_add_hw_queue(adev, gang_id, &qprops, &queue_id);
1216 if (r)
1217 goto clean_up_ring;
^^^^^^^^^^^^^^^^^^
1218
1219 ring->hw_queue_id = queue_id;
1220 ring->doorbell_index = qprops.doorbell_off;
1221
1222 if (queue_type == AMDGPU_RING_TYPE_GFX)
1223 sprintf(ring->name, "gfx_%d.%d.%d", pasid, gang_id, queue_id);
1224 else if (queue_type == AMDGPU_RING_TYPE_COMPUTE)
1225 sprintf(ring->name, "compute_%d.%d.%d", pasid, gang_id,
1226 queue_id);
1227 else if (queue_type == AMDGPU_RING_TYPE_SDMA)
1228 sprintf(ring->name, "sdma_%d.%d.%d", pasid, gang_id,
1229 queue_id);
1230 else
1231 BUG();
1232
1233 *out = ring;
1234 return 0;
1235
1236 clean_up_ring:
1237 amdgpu_ring_fini(ring);
1238 clean_up_memory:
1239 kfree(ring);
--> 1240 amdgpu_mes_unlock(&adev->mes);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1241 return r;
1242 }Reported by: Dan Carpenter <[email protected]>
--- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +3 -2
@@ -1038,8 +1038,10 @@ int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id, r =amdgpu_ring_init (adev, ring,1024 ,NULL ,0 ,AMDGPU_RING_PRIO_DEFAULT ,NULL ); -if (r) +if (r) { +amdgpu_mes_unlock (&adev->mes); goto clean_up_memory; + }amdgpu_mes_ring_to_queue_props (adev, ring, &qprops);
@@ -1072,7 +1074,6 @@ int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id,amdgpu_ring_fini (ring); clean_up_memory:kfree (ring); -amdgpu_mes_unlock (&adev->mes);return r; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 30/137 macsec: dont increment counters for an unrelated SA
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sabrina Dubroca <[email protected]>
[ Upstream commit cf58aefb1332db322060cad4a330d5f9292b0f41 ]
On RX, we shouldn't be incrementing the stats for an arbitrary SA in case the actual SA hasn't been set up. Those counters are intended to track packets for their respective AN when the SA isn't currently configured. Due to the way MACsec is implemented, we don't keep counters unless the SA is configured, so we can't track those packets, and those counters will remain at 0.
The RXSC's stats keeps track of those packets without telling us which AN they belonged to. We could add counters for non-existent SAs, and then find a way to integrate them in the dump to userspace, but I don't think it's worth the effort.
--- drivers/net/macsec.c | 18 ------------------ 1 file changed, 18 deletions(-)
drivers/net/macsec.c +0 -18
@@ -151,19 +151,6 @@ static struct macsec_rx_sa *macsec_rxsa_get(struct macsec_rx_sa __rcu *ptr)return sa; } -static struct macsec_rx_sa *macsec_active_rxsa_get (struct macsec_rx_sc *rx_sc) -{ -struct macsec_rx_sa *sa =NULL ; -int an; - -for (an =0 ; an <MACSEC_NUM_AN ; an++) { - sa =macsec_rxsa_get (rx_sc->sa[an]); -if (sa) -break ; - } -return sa; -} -static void free_rx_sc_rcu (struct rcu_head *head) { struct macsec_rx_sc *rx_sc = container_of(head, struct macsec_rx_sc, rcu_head);
@@ -1210,15 +1197,12 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)/* If validateFrames is Strict or the C bit in the * SecTAG is set, discard */ -struct macsec_rx_sa *active_rx_sa =macsec_active_rxsa_get (rx_sc);if (hdr->tci_an &MACSEC_TCI_C || secy->validate_frames ==MACSEC_VALIDATE_STRICT ) {u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsNotUsingSA++;u64_stats_update_end (&rxsc_stats->syncp);DEV_STATS_INC (secy->netdev, rx_errors); -if (active_rx_sa) -this_cpu_inc (active_rx_sa->stats->InPktsNotUsingSA); goto drop_nosa; }
@@ -1228,8 +1212,6 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb)u64_stats_update_begin (&rxsc_stats->syncp); rxsc_stats->stats.InPktsUnusedSA++;u64_stats_update_end (&rxsc_stats->syncp); -if (active_rx_sa) -this_cpu_inc (active_rx_sa->stats->InPktsUnusedSA); goto deliver; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 31/137 netdevsim: use cond_resched() in nsim_dev_trap_report_work()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a1494d532e28598bde7a5544892ef9c7dbfafa93 ]
I am still seeing many syzbot reports hinting that syzbot might fool nsim_dev_trap_report_work() with hundreds of ports [1]
Lets use cond_resched(), and system_unbound_wq
instead of implicit system_wq.
[1]
INFO: task syz-executor:20633 blocked for more than 143 seconds.
Not tainted 6.12.0-rc2-syzkaller-00205-g1d227fcc7222 #0"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
task:syz-executor state:D stack:25856 pid:20633 tgid:20633 ppid:1 flags:0x00004006
...
NMI backtrace for cpu 1
CPU: 1 UID: 0 PID: 16760 Comm: kworker/1:0 Not tainted 6.12.0-rc2-syzkaller-00205-g1d227fcc7222 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Workqueue: events nsim_dev_trap_report_work RIP: 0010:__sanitizer_cov_trace_pc+0x0/0x70 kernel/kcov.c:210 Code: 89 fb e8 23 00 00 00 48 8b 3d 04 fb 9c 0c 48 89 de 5b e9 c3 c7 5d 00 0f 1f 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 <f3> 0f 1e fa 48 8b 04 24 65 48 8b 0c 25 c0 d7 03 00 65 8b 15 60 f0 RSP: 0018:ffffc90000a187e8 EFLAGS: 00000246 RAX: 0000000000000100 RBX: ffffc90000a188e0 RCX: ffff888027d3bc00 RDX: ffff888027d3bc00 RSI: 0000000000000000 RDI: 0000000000000000 RBP: ffff88804a2e6000 R08: ffffffff8a4bc495 R09: ffffffff89da3577 R10: 0000000000000004 R11: ffffffff8a4bc2b0 R12: dffffc0000000000 R13: ffff88806573b503 R14: dffffc0000000000 R15: ffff8880663cca00 FS: 0000000000000000(0000) GS:ffff8880b8700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fc90a747f98 CR3: 000000000e734000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 000000000000002b DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Call Trace: <NMI> </NMI> <TASK> __local_bh_enable_ip+0x1bb/0x200 kernel/softirq.c:382 spin_unlock_bh include/linux/spinlock.h:396 [inline] nsim_dev_trap_report drivers/net/netdevsim/dev.c:820 [inline] nsim_dev_trap_report_work+0x75d/0xaa0 drivers/net/netdevsim/dev.c:850 process_one_work kernel/workqueue.c:3229 [inline] process_scheduled_works+0xa63/0x1850 kernel/workqueue.c:3310 worker_thread+0x870/0xd30 kernel/workqueue.c:3391 kthread+0x2f0/0x390 kernel/kthread.c:389 ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244 </TASK>
--- drivers/net/netdevsim/dev.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/net/netdevsim/dev.c +9 -6
@@ -836,7 +836,8 @@ static void nsim_dev_trap_report_work(struct work_struct *work) nsim_dev = nsim_trap_data->nsim_dev;if (!devl_trylock (priv_to_devlink (nsim_dev))) { -schedule_delayed_work (&nsim_dev->trap_data->trap_report_dw,1 ); +queue_delayed_work (system_unbound_wq, + &nsim_dev->trap_data->trap_report_dw,1 );return ; }
@@ -848,11 +849,12 @@ static void nsim_dev_trap_report_work(struct work_struct *work)continue ;nsim_dev_trap_report (nsim_dev_port); +cond_resched (); }devl_unlock (priv_to_devlink (nsim_dev)); - -schedule_delayed_work (&nsim_dev->trap_data->trap_report_dw, -msecs_to_jiffies (NSIM_TRAP_REPORT_INTERVAL_MS )); +queue_delayed_work (system_unbound_wq, + &nsim_dev->trap_data->trap_report_dw, +msecs_to_jiffies (NSIM_TRAP_REPORT_INTERVAL_MS )); }static int nsim_dev_traps_init (struct devlink *devlink)
@@ -907,8 +909,9 @@ static int nsim_dev_traps_init(struct devlink *devlink)INIT_DELAYED_WORK (&nsim_dev->trap_data->trap_report_dw, nsim_dev_trap_report_work); -schedule_delayed_work (&nsim_dev->trap_data->trap_report_dw, -msecs_to_jiffies (NSIM_TRAP_REPORT_INTERVAL_MS )); +queue_delayed_work (system_unbound_wq, + &nsim_dev->trap_data->trap_report_dw, +msecs_to_jiffies (NSIM_TRAP_REPORT_INTERVAL_MS ));return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 32/137 net: ethernet: aeroflex: fix potential memory leak in greth_start_xmit_gbit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit cf57b5d7a2aad456719152ecd12007fe031628a3 ]
The greth_start_xmit_gbit() returns NETDEV_TX_OK without freeing skb in case of skb->len being too long, add dev_kfree_skb() to fix it.
--- drivers/net/ethernet/aeroflex/greth.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/aeroflex/greth.c +2 -1
@@ -484,7 +484,7 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev)if (unlikely (skb->len >MAX_FRAME_SIZE )) { dev->stats.tx_errors++; - goto out; + goto len_error; }/* Save skb pointer. */
@@ -575,6 +575,7 @@ greth_start_xmit_gbit(struct sk_buff *skb, struct net_device *dev) map_error:if (net_ratelimit ())dev_warn (greth->dev,"Could not create TX DMA mapping\n" ); +len_error:dev_kfree_skb (skb); out:return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 33/137 net/smc: Fix searching in list of known pnetids in smc_pnet_add_pnetid
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li RongQing <[email protected]>
[ Upstream commit 82ac39ebd6db0c9f7a97a934bda1e3e101a9d201 ]
pnetid of pi (not newly allocated pe) should be compared
--- net/smc/smc_pnet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/smc/smc_pnet.c +1 -1
@@ -749,7 +749,7 @@ static int smc_pnet_add_pnetid(struct net *net, u8 *pnetid)write_lock (&sn->pnetids_ndev.lock);list_for_each_entry (pi, &sn->pnetids_ndev.list, list) { -if (smc_pnet_match (pnetid, pe->pnetid)) { +if (smc_pnet_match (pnetid, pi->pnetid)) {refcount_inc (&pi->refcnt);kfree (pe); goto unlock;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 34/137 net: xilinx: axienet: fix potential memory leak in axienet_start_xmit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit 99714e37e8333bbc22496fe80f241d5b35380e83 ]
The axienet_start_xmit() returns NETDEV_TX_OK without freeing skb in case of dma_map_single() fails, add dev_kfree_skb_any() to fix it.
--- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/xilinx/xilinx_axienet_main.c +2 -0
@@ -844,6 +844,7 @@ axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)if (net_ratelimit ())netdev_err (ndev,"TX DMA mapping error\n" ); ndev->stats.tx_dropped++; +dev_kfree_skb_any (skb);return NETDEV_TX_OK ; }desc_set_phys_addr (lp, phys, cur_p);
@@ -864,6 +865,7 @@ axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) ndev->stats.tx_dropped++;axienet_free_tx_chain (lp, orig_tail_ptr, ii +1 , true,NULL ,0 ); +dev_kfree_skb_any (skb);return NETDEV_TX_OK ; }desc_set_phys_addr (lp, phys, cur_p);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/137 net: systemport: fix potential memory leak in bcm_sysport_xmit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit c401ed1c709948e57945485088413e1bb5e94bd1 ]
The bcm_sysport_xmit() returns NETDEV_TX_OK without freeing skb in case of dma_map_single() fails, add dev_kfree_skb() to fix it.
--- drivers/net/ethernet/broadcom/bcmsysport.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/broadcom/bcmsysport.c +1 -0
@@ -1348,6 +1348,7 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb,netif_err (priv, tx_err, dev,"DMA map failed at %p (len=%d)\n" , skb->data, skb_len); ret =NETDEV_TX_OK ; +dev_kfree_skb_any (skb); goto out; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/137 irqchip/renesas-rzg2l: Align struct member names to tabs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 02f6507640173addeeb3af035d2c6f0b3cff1567 ]
Align struct member names to tabs to follow the requirements from maintainer-tip file. 3 tabs were used at the moment as the next commits will add a new member which requires 3 tabs for a better view.
Stable-dep-of: d038109ac1c6 ("irqchip/renesas-rzg2l: Fix missing put_device")
--- drivers/irqchip/irq-renesas-rzg2l.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/irqchip/irq-renesas-rzg2l.c +3 -3
@@ -56,9 +56,9 @@#define TINT_EXTRACT_GPIOINT (x) FIELD_GET(GENMASK(31, 16), (x))struct rzg2l_irqc_priv { -void __iomem *base; -struct irq_fwspec fwspec[IRQC_NUM_IRQ ]; -raw_spinlock_t lock; +void __iomem *base; +struct irq_fwspec fwspec[IRQC_NUM_IRQ ]; +raw_spinlock_t lock; };static struct rzg2l_irqc_priv *irq_data_to_priv (struct irq_data *data)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/137 irqchip/renesas-rzg2l: Document structure members
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit b94f455372ad6e6b4da8e8ed9864d9c7daaf54b8 ]
Document structure members to follow the requirements specified in maintainer-tip, section 4.3.7. Struct declarations and initializers.
Stable-dep-of: d038109ac1c6 ("irqchip/renesas-rzg2l: Fix missing put_device")
--- drivers/irqchip/irq-renesas-rzg2l.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/irqchip/irq-renesas-rzg2l.c +6 -0
@@ -55,6 +55,12 @@#define TINT_EXTRACT_HWIRQ (x) FIELD_GET(GENMASK(15, 0), (x))#define TINT_EXTRACT_GPIOINT (x) FIELD_GET(GENMASK(31, 16), (x)) +/** +* struct rzg2l_irqc_priv - IRQ controller private data structure +* @base: Controller's base address +* @fwspec: IRQ firmware specific data +* @lock: Lock to serialize access to hardware registers +*/ struct rzg2l_irqc_priv {void __iomem *base;struct irq_fwspec fwspec[IRQC_NUM_IRQ ];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/137 irqchip/renesas-rzg2l: Add support for suspend to RAM
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 74d2ef5f6f4b2437e6292ab2502400e8048db4aa ]
The irqchip-renesas-rzg2l driver is used on RZ/G3S SoC. RZ/G3S can go into deep sleep states where power to different SoC's parts is cut off and RAM is switched to self-refresh. The resume from these states is done with the help of the bootloader.
The IA55 IRQ controller needs to be reconfigured when resuming from deep sleep state. For this the IA55 registers are cached in suspend and restored in resume.
The IA55 IRQ controller is connected to GPIO controller and GIC as follows:
┌──────────┐ ┌──────────┐
│ │ SPIX │ │
│ ├─────────►│ │
│ │ │ │
│ │ │ │
┌────────┐IRQ0-7 │ IA55 │ │ GIC │
Pin0 ───────►│ ├─────────────►│ │ │ │
│ │ │ │ PPIY │ │
... │ GPIO │ │ ├─────────►│ │
│ │GPIOINT0-127 │ │ │ │
PinN ───────►│ ├─────────────►│ │ │ │
└────────┘ └──────────┘ └──────────┘where:
- Pin0 is the first GPIO controller pin
- PinN is the last GPIO controller pin
- SPIX is the SPI interrupt with identifier X
- PPIY is the PPI interrupt with identifier Y
Implement suspend/resume functionality with syscore_ops to be able to cache/restore the registers after/before the GPIO controller suspend/resume functions are invoked.
As the syscore_ops suspend/resume functions do not take any argument make the driver private data static so it can be accessed from the suspend/resume functions.
The IA55 interrupt controller is resumed before the GPIO controller. As GPIO pins could be in an a state which causes spurious interrupts, the reconfiguration of the interrupt controller is restricted to restore the interrupt type and leave them disabled.
An eventually required interrupt enable operation will be done as part of the GPIO controller resume function after restoring the GPIO state.
[ tglx: Massaged changelog ]
Stable-dep-of: d038109ac1c6 ("irqchip/renesas-rzg2l: Fix missing put_device")
--- drivers/irqchip/irq-renesas-rzg2l.c | 68 ++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 11 deletions(-)
drivers/irqchip/irq-renesas-rzg2l.c +57 -11
@@ -18,6 +18,7 @@#include <linux/pm_runtime.h> #include <linux/reset.h> #include <linux/spinlock.h> +#include <linux/syscore_ops.h> #define IRQC_IRQ_START 1#define IRQC_IRQ_COUNT 8
@@ -55,17 +56,29 @@#define TINT_EXTRACT_HWIRQ (x) FIELD_GET(GENMASK(15, 0), (x))#define TINT_EXTRACT_GPIOINT (x) FIELD_GET(GENMASK(31, 16), (x)) +/** +* struct rzg2l_irqc_reg_cache - registers cache (necessary for suspend/resume) +* @iitsr: IITSR register +* @titsr: TITSR registers +*/ +struct rzg2l_irqc_reg_cache { +u32 iitsr; +u32 titsr[2 ]; +}; +/** * struct rzg2l_irqc_priv - IRQ controller private data structure * @base: Controller's base address * @fwspec: IRQ firmware specific data * @lock: Lock to serialize access to hardware registers +* @cache: Registers cache for suspend/resume */ -struct rzg2l_irqc_priv { +static struct rzg2l_irqc_priv {void __iomem *base;struct irq_fwspec fwspec[IRQC_NUM_IRQ ];raw_spinlock_t lock; -}; +struct rzg2l_irqc_reg_cache cache; +} *rzg2l_irqc_data;static struct rzg2l_irqc_priv *irq_data_to_priv (struct irq_data *data) {
@@ -282,6 +295,38 @@ static int rzg2l_irqc_set_type(struct irq_data *d, unsigned int type)return irq_chip_set_type_parent (d,IRQ_TYPE_LEVEL_HIGH ); } +static int rzg2l_irqc_irq_suspend (void ) +{ +struct rzg2l_irqc_reg_cache *cache = &rzg2l_irqc_data->cache; +void __iomem *base = rzg2l_irqc_data->base; + + cache->iitsr =readl_relaxed (base +IITSR ); +for (u8 i =0 ; i <2 ; i++) + cache->titsr[i] =readl_relaxed (base +TITSR (i)); + +return 0 ; +} + +static void rzg2l_irqc_irq_resume (void ) +{ +struct rzg2l_irqc_reg_cache *cache = &rzg2l_irqc_data->cache; +void __iomem *base = rzg2l_irqc_data->base; + +/* +* Restore only interrupt type. TSSRx will be restored at the +* request of pin controller to avoid spurious interrupts due +* to invalid PIN states. +*/ +for (u8 i =0 ; i <2 ; i++) +writel_relaxed (cache->titsr[i], base +TITSR (i)); +writel_relaxed (cache->iitsr, base +IITSR ); +} + +static struct syscore_ops rzg2l_irqc_syscore_ops = { + .suspend = rzg2l_irqc_irq_suspend, + .resume = rzg2l_irqc_irq_resume, +}; +static const struct irq_chip irqc_chip = { .name ="rzg2l-irqc" , .irq_eoi = rzg2l_irqc_eoi,
@@ -366,7 +411,6 @@ static int rzg2l_irqc_init(struct device_node *node, struct device_node *parent)struct irq_domain *irq_domain, *parent_domain;struct platform_device *pdev;struct reset_control *resetn; -struct rzg2l_irqc_priv *priv;int ret; pdev =of_find_device_by_node (node);
@@ -379,15 +423,15 @@ static int rzg2l_irqc_init(struct device_node *node, struct device_node *parent)return -ENODEV ; } - priv =devm_kzalloc (&pdev->dev,sizeof (*priv),GFP_KERNEL ); -if (!priv) + rzg2l_irqc_data =devm_kzalloc (&pdev->dev,sizeof (*rzg2l_irqc_data),GFP_KERNEL ); +if (!rzg2l_irqc_data)return -ENOMEM ; - priv->base =devm_of_iomap (&pdev->dev, pdev->dev.of_node,0 ,NULL ); -if (IS_ERR (priv->base)) -return PTR_ERR (priv->base); + rzg2l_irqc_data->base =devm_of_iomap (&pdev->dev, pdev->dev.of_node,0 ,NULL ); +if (IS_ERR (rzg2l_irqc_data->base)) +return PTR_ERR (rzg2l_irqc_data->base); - ret =rzg2l_irqc_parse_interrupts (priv, node); + ret =rzg2l_irqc_parse_interrupts (rzg2l_irqc_data, node);if (ret) {dev_err (&pdev->dev,"cannot parse interrupts: %d\n" , ret);return ret;
@@ -410,17 +454,19 @@ static int rzg2l_irqc_init(struct device_node *node, struct device_node *parent) goto pm_disable; } -raw_spin_lock_init (&priv->lock); +raw_spin_lock_init (&rzg2l_irqc_data->lock); irq_domain =irq_domain_add_hierarchy (parent_domain,0 ,IRQC_NUM_IRQ , node, &rzg2l_irqc_domain_ops, - priv); + rzg2l_irqc_data);if (!irq_domain) {dev_err (&pdev->dev,"failed to add irq domain\n" ); ret = -ENOMEM ; goto pm_put; } +register_syscore_ops (&rzg2l_irqc_syscore_ops); +return 0 ; pm_put:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/137 irqchip/renesas-rzg2l: Fix missing put_device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabrizio Castro <[email protected]>
[ Upstream commit d038109ac1c6bf619473dda03a16a6de58170f7f ]
rzg2l_irqc_common_init() calls of_find_device_by_node(), but the corresponding put_device() call is missing. This also gets reported by make coccicheck.
Make use of the cleanup interfaces from cleanup.h to call into __free_put_device(), which in turn calls into put_device when leaving function rzg2l_irqc_common_init() and variable "dev" goes out of scope.
To prevent that the device is put on successful completion, assign NULL to "dev" to prevent __free_put_device() from calling into put_device() within the successful path.
"make coccicheck" will still complain about missing put_device() calls, but those are false positives now.
--- drivers/irqchip/irq-renesas-rzg2l.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/irqchip/irq-renesas-rzg2l.c +14 -2
@@ -8,6 +8,7 @@*/ #include <linux/bitfield.h> +#include <linux/cleanup.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/io.h>
@@ -408,12 +409,12 @@ static int rzg2l_irqc_parse_interrupts(struct rzg2l_irqc_priv *priv,static int rzg2l_irqc_init (struct device_node *node,struct device_node *parent) { +struct platform_device *pdev =of_find_device_by_node (node); + struct device *dev __free(put_device) = pdev ? &pdev->dev : NULL;struct irq_domain *irq_domain, *parent_domain; -struct platform_device *pdev;struct reset_control *resetn;int ret; - pdev =of_find_device_by_node (node);if (!pdev)return -ENODEV ;
@@ -467,6 +468,17 @@ static int rzg2l_irqc_init(struct device_node *node, struct device_node *parent)register_syscore_ops (&rzg2l_irqc_syscore_ops); +/* +* Prevent the cleanup function from invoking put_device by assigning +* NULL to dev. +* +* make coccicheck will complain about missing put_device calls, but +* those are false positives, as dev will be automatically "put" via +* __free_put_device on the failing path. +* On the successful path we don't actually want to "put" dev. +*/ + dev =NULL ; +return 0 ; pm_put:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/137 drm/msm/dpu: Wire up DSC mask for active CTL configuration
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marijn Suijten <[email protected]>
[ Upstream commit cda3774c242e156cdcc279bd36b404af89f744c6 ]
Active CTLs have to configure what DSC block(s) have to be enabled, and what DSC block(s) have to be flushed; this value was initialized to zero resulting in the necessary register writes to never happen (or would write zero otherwise). This seems to have gotten lost in the DSC v4->v5 series while refactoring how the combination with merge_3d was handled.
Patchwork: https://patchwork.freedesktop.org/patch/515693/
Stable-dep-of: f87f3b80abaf ("drm/msm/dpu: don't always program merge_3d block")
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 1 + drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 1 + 2 files changed, 2 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c +1 -0
@@ -61,6 +61,7 @@ static void _dpu_encoder_phys_cmd_update_intf_cfg( intf_cfg.intf_mode_sel =DPU_CTL_MODE_SEL_CMD ; intf_cfg.stream_sel = cmd_enc->stream_sel; intf_cfg.mode_3d =dpu_encoder_helper_get_3d_blend_mode (phys_enc); + intf_cfg.dsc =dpu_encoder_helper_get_dsc (phys_enc); ctl->ops.setup_intf_cfg (ctl, &intf_cfg);/* setup which pp blk will connect to this intf */
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +1 -0
@@ -276,6 +276,7 @@ static void dpu_encoder_phys_vid_setup_timing_engine( intf_cfg.intf_mode_sel =DPU_CTL_MODE_SEL_VID ; intf_cfg.stream_sel =0 ;/* Don't care value for video mode */ intf_cfg.mode_3d =dpu_encoder_helper_get_3d_blend_mode (phys_enc); + intf_cfg.dsc =dpu_encoder_helper_get_dsc (phys_enc);if (phys_enc->hw_pp->merge_3d) intf_cfg.merge_3d = phys_enc->hw_pp->merge_3d->idx;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/137 drm/msm/dpu: dont always program merge_3d block
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jessica Zhang <[email protected]>
[ Upstream commit f87f3b80abaf7949e638dd17dfdc267066eb52d5 ]
Only program the merge_3d block for the video phys encoder when the 3d blend mode is not NONE
Patchwork: https://patchwork.freedesktop.org/patch/619095/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +1 -1
@@ -277,7 +277,7 @@ static void dpu_encoder_phys_vid_setup_timing_engine( intf_cfg.stream_sel =0 ;/* Don't care value for video mode */ intf_cfg.mode_3d =dpu_encoder_helper_get_3d_blend_mode (phys_enc); intf_cfg.dsc =dpu_encoder_helper_get_dsc (phys_enc); -if (phys_enc->hw_pp->merge_3d) +if (intf_cfg.mode_3d && phys_enc->hw_pp->merge_3d) intf_cfg.merge_3d = phys_enc->hw_pp->merge_3d->idx;spin_lock_irqsave (phys_enc->enc_spinlock, lock_flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/137 tcp/dccp: Dont use timer_pending() in reqsk_queue_unlink().
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit e8c526f2bdf1845bedaf6a478816a3d06fa78b8f ]
Martin KaFai Lau reported use-after-free [0] in reqsk_timer_handler().
"""
We are seeing a use-after-free from a bpf prog attached to trace_tcp_retransmit_synack. The program passes the req->sk to the bpf_sk_storage_get_tracing kernel helper which does check for null before using it.
"""
The commit 83fccfc3940c ("inet: fix potential deadlock in reqsk_queue_unlink()") added timer_pending() in reqsk_queue_unlink() not to call del_timer_sync() from reqsk_timer_handler(), but it introduced a small race window.
Before the timer is called, expire_timers() calls detach_timer(timer, true) to clear timer->entry.pprev and marks it as not pending.
If reqsk_queue_unlink() checks timer_pending() just after expire_timers() calls detach_timer(), TCP will miss del_timer_sync(); the reqsk timer will continue running and send multiple SYN+ACKs until it expires.
The reported UAF could happen if req->sk is close()d earlier than the timer expiration, which is 63s by default.
The scenario would be
1. inet_csk_complete_hashdance() calls inet_csk_reqsk_queue_drop(), but del_timer_sync() is missed
2. reqsk timer is executed and scheduled again
3. req->sk is accept()ed and reqsk_put() decrements rsk_refcnt, but reqsk timer still has another one, and inet_csk_accept() does not clear req->sk for non-TFO sockets
4. sk is close()d
5. reqsk timer is executed again, and BPF touches req->sk
Let's not use timer_pending() by passing the caller context to __inet_csk_reqsk_queue_drop().
Note that reqsk timer is pinned, so the issue does not happen in most use cases. [1]
[0]
BUG: KFENCE: use-after-free read in bpf_sk_storage_get_tracing+0x2e/0x1b0
Use-after-free read at 0x00000000a891fb3a (in kfence-#1):
bpf_sk_storage_get_tracing+0x2e/0x1b0 bpf_prog_5ea3e95db6da0438_tcp_retransmit_synack+0x1d20/0x1dda bpf_trace_run2+0x4c/0xc0 tcp_rtx_synack+0xf9/0x100 reqsk_timer_handler+0xda/0x3d0 run_timer_softirq+0x292/0x8a0 irq_exit_rcu+0xf5/0x320 sysvec_apic_timer_interrupt+0x6d/0x80 asm_sysvec_apic_timer_interrupt+0x16/0x20 intel_idle_irq+0x5a/0xa0 cpuidle_enter_state+0x94/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb
kfence-#1: 0x00000000a72cc7b6-0x00000000d97616d9, size=2376, cache=TCPv6
allocated by task 0 on cpu 9 at 260507.901592s:
sk_prot_alloc+0x35/0x140 sk_clone_lock+0x1f/0x3f0 inet_csk_clone_lock+0x15/0x160 tcp_create_openreq_child+0x1f/0x410 tcp_v6_syn_recv_sock+0x1da/0x700 tcp_check_req+0x1fb/0x510 tcp_v6_rcv+0x98b/0x1420 ipv6_list_rcv+0x2258/0x26e0 napi_complete_done+0x5b1/0x2990 mlx5e_napi_poll+0x2ae/0x8d0 net_rx_action+0x13e/0x590 irq_exit_rcu+0xf5/0x320 common_interrupt+0x80/0x90 asm_common_interrupt+0x22/0x40 cpuidle_enter_state+0xfb/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb
freed by task 0 on cpu 9 at 260507.927527s:
rcu_core_si+0x4ff/0xf10 irq_exit_rcu+0xf5/0x320 sysvec_apic_timer_interrupt+0x6d/0x80 asm_sysvec_apic_timer_interrupt+0x16/0x20 cpuidle_enter_state+0xfb/0x273 cpu_startup_entry+0x15e/0x260 start_secondary+0x8a/0x90 secondary_startup_64_no_verify+0xfa/0xfb
--- net/ipv4/inet_connection_sock.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
net/ipv4/inet_connection_sock.c +16 -5
@@ -977,21 +977,31 @@ static bool reqsk_queue_unlink(struct request_sock *req) found =__sk_nulls_del_node_init_rcu (sk);spin_unlock (lock); } -if (timer_pending (&req->rsk_timer) &&del_timer_sync (&req->rsk_timer)) -reqsk_put (req); +return found; } -bool inet_csk_reqsk_queue_drop (struct sock *sk,struct request_sock *req) +static bool __inet_csk_reqsk_queue_drop (struct sock *sk, +struct request_sock *req, +bool from_timer) {bool unlinked =reqsk_queue_unlink (req); +if (!from_timer &&timer_delete_sync (&req->rsk_timer)) +reqsk_put (req); +if (unlinked) {reqsk_queue_removed (&inet_csk (sk)->icsk_accept_queue, req);reqsk_put (req); } +return unlinked; } + +bool inet_csk_reqsk_queue_drop (struct sock *sk,struct request_sock *req) +{ +return __inet_csk_reqsk_queue_drop (sk, req, false); +}EXPORT_SYMBOL (inet_csk_reqsk_queue_drop);void inet_csk_reqsk_queue_drop_and_put (struct sock *sk,struct request_sock *req)
@@ -1084,7 +1094,7 @@ static void reqsk_timer_handler(struct timer_list *t)if (!inet_ehash_insert (req_to_sk (nreq),req_to_sk (oreq),NULL )) {/* delete timer */ -inet_csk_reqsk_queue_drop (sk_listener, nreq); +__inet_csk_reqsk_queue_drop (sk_listener, nreq, true); goto no_ownership; }
@@ -1110,7 +1120,8 @@ static void reqsk_timer_handler(struct timer_list *t) } drop: -inet_csk_reqsk_queue_drop_and_put (oreq->rsk_listener, oreq); +__inet_csk_reqsk_queue_drop (sk_listener, oreq, true); +reqsk_put (req); } static bool reqsk_queue_hash_req(struct request_sock *req,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/137 genetlink: hold RCU in genlmsg_mcast()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 56440d7ec28d60f8da3bfa09062b3368ff9b16db ]
While running net selftests with CONFIG_PROVE_RCU_LIST=y I saw one lockdep splat [1].
genlmsg_mcast() uses for_each_net_rcu(), and must therefore hold RCU.
Instead of letting all callers guard genlmsg_multicast_allns() with a rcu_read_lock()/rcu_read_unlock() pair, do it in genlmsg_mcast().
This also means the @flags parameter is useless, we need to always use GFP_ATOMIC.
[1]
[10882.424136] ============================= [10882.424166] WARNING: suspicious RCU usage [10882.424309] 6.12.0-rc2-virtme #1156 Not tainted [10882.424400] ----------------------------- [10882.424423] net/netlink/genetlink.c:1940 RCU-list traversed in non-reader section!! [10882.424469]
other info that might help us debug this:
[10882.424500]
rcu_scheduler_active = 2, debug_locks = 1
[10882.424744] 2 locks held by ip/15677:
[10882.424791] #0: ffffffffb6b491b0 (cb_lock){++++}-{3:3}, at: genl_rcv (net/netlink/genetlink.c:1219)
[10882.426334] #1: ffffffffb6b49248 (genl_mutex){+.+.}-{3:3}, at: genl_rcv_msg (net/netlink/genetlink.c:61 net/netlink/genetlink.c:57 net/netlink/genetlink.c:1209)
[10882.426465]
stack backtrace:
[10882.426805] CPU: 14 UID: 0 PID: 15677 Comm: ip Not tainted 6.12.0-rc2-virtme #1156
[10882.426919] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[10882.427046] Call Trace:
[10882.427131] <TASK>
[10882.427244] dump_stack_lvl (lib/dump_stack.c:123)
[10882.427335] lockdep_rcu_suspicious (kernel/locking/lockdep.c:6822)
[10882.427387] genlmsg_multicast_allns (net/netlink/genetlink.c:1940 (discriminator 7) net/netlink/genetlink.c:1977 (discriminator 7))
[10882.427436] l2tp_tunnel_notify.constprop.0 (net/l2tp/l2tp_netlink.c:119) l2tp_netlink
[10882.427683] l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:253) l2tp_netlink
[10882.427748] genl_family_rcv_msg_doit (net/netlink/genetlink.c:1115)
[10882.427834] genl_rcv_msg (net/netlink/genetlink.c:1195 net/netlink/genetlink.c:1210)
[10882.427877] ? __pfx_l2tp_nl_cmd_tunnel_create (net/l2tp/l2tp_netlink.c:186) l2tp_netlink
[10882.427927] ? __pfx_genl_rcv_msg (net/netlink/genetlink.c:1201)
[10882.427959] netlink_rcv_skb (net/netlink/af_netlink.c:2551)
[10882.428069] genl_rcv (net/netlink/genetlink.c:1220)
[10882.428095] netlink_unicast (net/netlink/af_netlink.c:1332 net/netlink/af_netlink.c:1357)
[10882.428140] netlink_sendmsg (net/netlink/af_netlink.c:1901)
[10882.428210] ____sys_sendmsg (net/socket.c:729 (discriminator 1) net/socket.c:744 (discriminator 1) net/socket.c:2607 (discriminator 1))--- drivers/target/target_core_user.c | 2 +- include/net/genetlink.h | 3 +-- net/l2tp/l2tp_netlink.c | 4 ++-- net/netlink/genetlink.c | 28 ++++++++++++++-------------- net/wireless/nl80211.c | 8 ++------ 5 files changed, 20 insertions(+), 25 deletions(-)
drivers/target/target_core_user.c +1 -1
@@ -2130,7 +2130,7 @@ static int tcmu_netlink_event_send(struct tcmu_dev *udev, } ret =genlmsg_multicast_allns (&tcmu_genl_family, skb,0 , -TCMU_MCGRP_CONFIG ,GFP_KERNEL ); +TCMU_MCGRP_CONFIG );/* Wait during an add as the listener may not be up yet */ if (ret == 0 ||
include/net/genetlink.h +1 -2
@@ -355,13 +355,12 @@ static inline int genlmsg_multicast(const struct genl_family *family,* @skb: netlink message as socket buffer * @portid: own netlink portid to avoid sending to yourself * @group: offset of multicast group in groups array -* @flags: allocation flags * * This function must hold the RTNL or rcu_read_lock(). */ int genlmsg_multicast_allns (const struct genl_family *family,struct sk_buff *skb,u32 portid, -unsigned int group,gfp_t flags); +unsigned int group);/** * genlmsg_unicast - unicast a netlink message
net/l2tp/l2tp_netlink.c +2 -2
@@ -115,7 +115,7 @@ static int l2tp_tunnel_notify(struct genl_family *family, NLM_F_ACK, tunnel, cmd);if (ret >=0 ) { - ret =genlmsg_multicast_allns (family, msg,0 ,0 ,GFP_ATOMIC ); + ret =genlmsg_multicast_allns (family, msg,0 ,0 );/* We don't care if no one is listening */ if (ret == -ESRCH ) ret =0 ;
@@ -143,7 +143,7 @@ static int l2tp_session_notify(struct genl_family *family, NLM_F_ACK, session, cmd);if (ret >=0 ) { - ret =genlmsg_multicast_allns (family, msg,0 ,0 ,GFP_ATOMIC ); + ret =genlmsg_multicast_allns (family, msg,0 ,0 );/* We don't care if no one is listening */ if (ret == -ESRCH ) ret =0 ;
net/netlink/genetlink.c +14 -14
@@ -1147,15 +1147,11 @@ static int genl_ctrl_event(int event, const struct genl_family *family,if (IS_ERR (msg))return PTR_ERR (msg); -if (!family->netnsok) { +if (!family->netnsok)genlmsg_multicast_netns (&genl_ctrl, &init_net, msg,0 ,0 ,GFP_KERNEL ); - }else { -rcu_read_lock (); -genlmsg_multicast_allns (&genl_ctrl, msg,0 , -0 ,GFP_ATOMIC ); -rcu_read_unlock (); - } +else +genlmsg_multicast_allns (&genl_ctrl, msg,0 ,0 );return 0 ; }
@@ -1500,23 +1496,23 @@ static int __init genl_init(void)core_initcall (genl_init); -static int genlmsg_mcast (struct sk_buff *skb,u32 portid,unsigned long group, -gfp_t flags) +static int genlmsg_mcast (struct sk_buff *skb,u32 portid,unsigned long group) {struct sk_buff *tmp;struct net *net, *prev =NULL ;bool delivered = false;int err; +rcu_read_lock ();for_each_net_rcu (net) {if (prev) { - tmp =skb_clone (skb, flags); + tmp =skb_clone (skb,GFP_ATOMIC );if (!tmp) { err = -ENOMEM ; goto error; } err =nlmsg_multicast (prev->genl_sock, tmp, - portid, group, flags); + portid, group,GFP_ATOMIC );if (!err) delivered = true;else if (err != -ESRCH )
@@ -1525,27 +1521,31 @@ static int genlmsg_mcast(struct sk_buff *skb, u32 portid, unsigned long group, prev = net; } + err =nlmsg_multicast (prev->genl_sock, skb, portid, group,GFP_ATOMIC ); + +rcu_read_unlock (); - err =nlmsg_multicast (prev->genl_sock, skb, portid, group, flags);if (!err) delivered = true;else if (err != -ESRCH )return err;return delivered ?0 : -ESRCH ; error: +rcu_read_unlock (); +kfree_skb (skb);return err; }int genlmsg_multicast_allns (const struct genl_family *family,struct sk_buff *skb,u32 portid, -unsigned int group,gfp_t flags) +unsigned int group) {if (WARN_ON_ONCE (group >= family->n_mcgrps))return -EINVAL ; group = family->mcgrp_offset + group; -return genlmsg_mcast (skb, portid, group, flags); +return genlmsg_mcast (skb, portid, group); }EXPORT_SYMBOL (genlmsg_multicast_allns);
net/wireless/nl80211.c +2 -6
@@ -17616,10 +17616,8 @@ void nl80211_common_reg_change_event(enum nl80211_commands cmd_id,genlmsg_end (msg, hdr); -rcu_read_lock ();genlmsg_multicast_allns (&nl80211_fam, msg,0 , -NL80211_MCGRP_REGULATORY ,GFP_ATOMIC ); -rcu_read_unlock (); +NL80211_MCGRP_REGULATORY );return ;
@@ -18237,10 +18235,8 @@ void nl80211_send_beacon_hint_event(struct wiphy *wiphy,genlmsg_end (msg, hdr); -rcu_read_lock ();genlmsg_multicast_allns (&nl80211_fam, msg,0 , -NL80211_MCGRP_REGULATORY ,GFP_ATOMIC ); -rcu_read_unlock (); +NL80211_MCGRP_REGULATORY );return ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/137 ravb: Remove setting of RX software timestamp
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gal Pressman <[email protected]>
[ Upstream commit 277901ee3a2620679e2c8797377d2a72f4358068 ]
The responsibility for reporting of RX software timestamp has moved to the core layer (see __ethtool_get_ts_info()), remove usage from the device drivers.
Stable-dep-of: 126e799602f4 ("net: ravb: Only advertise Rx/Tx timestamps if hardware supports it")
--- drivers/net/ethernet/renesas/ravb_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/renesas/ravb_main.c +2 -2
@@ -1691,8 +1691,6 @@ static int ravb_get_ts_info(struct net_device *ndev, info->so_timestamping =SOF_TIMESTAMPING_TX_SOFTWARE | -SOF_TIMESTAMPING_RX_SOFTWARE | -SOF_TIMESTAMPING_SOFTWARE |SOF_TIMESTAMPING_TX_HARDWARE |SOF_TIMESTAMPING_RX_HARDWARE |SOF_TIMESTAMPING_RAW_HARDWARE ;
@@ -1703,6 +1701,8 @@ static int ravb_get_ts_info(struct net_device *ndev, (1 <<HWTSTAMP_FILTER_ALL );if (hw_info->gptp || hw_info->ccc_gac) info->phc_index =ptp_clock_index (priv->ptp.clock); +else + info->phc_index =0 ;return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 45/137 net: ravb: Only advertise Rx/Tx timestamps if hardware supports it
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 126e799602f45e9ce1ded03ee9eadda68bf470e0 ]
Recent work moving the reporting of Rx software timestamps to the core
[1] highlighted an issue where hardware time stamping was advertised for the platforms where it is not supported.
Fix this by covering advertising support for hardware timestamps only if the hardware supports it. Due to the Tx implementation in RAVB software Tx timestamping is also only considered if the hardware supports hardware timestamps. This should be addressed in future, but this fix only reflects what the driver currently implements.
1. Commit 277901ee3a26 ("ravb: Remove setting of RX software timestamp")
--- drivers/net/ethernet/renesas/ravb_main.c | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-)
drivers/net/ethernet/renesas/ravb_main.c +12 -13
@@ -1689,20 +1689,19 @@ static int ravb_get_ts_info(struct net_device *ndev,struct ravb_private *priv =netdev_priv (ndev);const struct ravb_hw_info *hw_info = priv->info; - info->so_timestamping = -SOF_TIMESTAMPING_TX_SOFTWARE | -SOF_TIMESTAMPING_TX_HARDWARE | -SOF_TIMESTAMPING_RX_HARDWARE | -SOF_TIMESTAMPING_RAW_HARDWARE ; - info->tx_types = (1 <<HWTSTAMP_TX_OFF ) | (1 <<HWTSTAMP_TX_ON ); - info->rx_filters = - (1 <<HWTSTAMP_FILTER_NONE ) | - (1 <<HWTSTAMP_FILTER_PTP_V2_L2_EVENT ) | - (1 <<HWTSTAMP_FILTER_ALL ); -if (hw_info->gptp || hw_info->ccc_gac) +if (hw_info->gptp || hw_info->ccc_gac) { + info->so_timestamping = +SOF_TIMESTAMPING_TX_SOFTWARE | +SOF_TIMESTAMPING_TX_HARDWARE | +SOF_TIMESTAMPING_RX_HARDWARE | +SOF_TIMESTAMPING_RAW_HARDWARE ; + info->tx_types = (1 <<HWTSTAMP_TX_OFF ) | (1 <<HWTSTAMP_TX_ON ); + info->rx_filters = + (1 <<HWTSTAMP_FILTER_NONE ) | + (1 <<HWTSTAMP_FILTER_PTP_V2_L2_EVENT ) | + (1 <<HWTSTAMP_FILTER_ALL ); info->phc_index =ptp_clock_index (priv->ptp.clock); -else - info->phc_index =0 ; + }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/137 scsi: target: core: Fix null-ptr-deref in target_alloc_device()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit fca6caeb4a61d240f031914413fcc69534f6dc03 ]
There is a null-ptr-deref issue reported by KASAN:
BUG: KASAN: null-ptr-deref in target_alloc_device+0xbc4/0xbe0 [target_core_mod] ... kasan_report+0xb9/0xf0 target_alloc_device+0xbc4/0xbe0 [target_core_mod] core_dev_setup_virtual_lun0+0xef/0x1f0 [target_core_mod] target_core_init_configfs+0x205/0x420 [target_core_mod] do_one_initcall+0xdd/0x4e0
...
entry_SYSCALL_64_after_hwframe+0x76/0x7e
In target_alloc_device(), if allocing memory for dev queues fails, then dev will be freed by dev->transport->free_device(), but dev->transport is not initialized at that time, which will lead to a null pointer reference problem.
Fixing this bug by freeing dev with hba->backend->ops->free_device().
--- drivers/target/target_core_device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/target/target_core_device.c +1 -1
@@ -733,7 +733,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) dev->queues =kcalloc (nr_cpu_ids,sizeof (*dev->queues),GFP_KERNEL );if (!dev->queues) { - dev->transport->free_device (dev); + hba->backend->ops->free_device (dev);return NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/137 smb: client: fix OOBs when building SMB2_IOCTL request
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paulo Alcantara <[email protected]>
[ Upstream commit 1ab60323c5201bef25f2a3dc0ccc404d9aca77f1 ]
When using encryption, either enforced by the server or when using 'seal' mount option, the client will squash all compound request buffers down for encryption into a single iov in smb2_set_next_command().
SMB2_ioctl_init() allocates a small buffer (448 bytes) to hold the SMB2_IOCTL request in the first iov, and if the user passes an input buffer that is greater than 328 bytes, smb2_set_next_command() will end up writing off the end of @rqst->iov[0].iov_base as shown below:
mount.cifs //srv/share /mnt -o ...,seal
ln -s $(perl -e "print('a')for 1..1024") /mnt/linkBUG: KASAN: slab-out-of-bounds in smb2_set_next_command.cold+0x1d6/0x24c [cifs] Write of size 4116 at addr ffff8881148fcab8 by task ln/859 CPU: 1 UID: 0 PID: 859 Comm: ln Not tainted 6.12.0-rc3 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-2.fc40 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x5d/0x80 ? smb2_set_next_command.cold+0x1d6/0x24c [cifs] print_report+0x156/0x4d9 ? smb2_set_next_command.cold+0x1d6/0x24c [cifs] ? __virt_addr_valid+0x145/0x310 ? __phys_addr+0x46/0x90 ? smb2_set_next_command.cold+0x1d6/0x24c [cifs] kasan_report+0xda/0x110 ? smb2_set_next_command.cold+0x1d6/0x24c [cifs] kasan_check_range+0x10f/0x1f0 __asan_memcpy+0x3c/0x60 smb2_set_next_command.cold+0x1d6/0x24c [cifs] smb2_compound_op+0x238c/0x3840 [cifs] ? kasan_save_track+0x14/0x30 ? kasan_save_free_info+0x3b/0x70 ? vfs_symlink+0x1a1/0x2c0 ? do_symlinkat+0x108/0x1c0 ? __pfx_smb2_compound_op+0x10/0x10 [cifs] ? kmem_cache_free+0x118/0x3e0 ? cifs_get_writable_path+0xeb/0x1a0 [cifs] smb2_get_reparse_inode+0x423/0x540 [cifs] ? __pfx_smb2_get_reparse_inode+0x10/0x10 [cifs] ? rcu_is_watching+0x20/0x50 ? __kmalloc_noprof+0x37c/0x480 ? smb2_create_reparse_symlink+0x257/0x490 [cifs] ? smb2_create_reparse_symlink+0x38f/0x490 [cifs] smb2_create_reparse_symlink+0x38f/0x490 [cifs] ? __pfx_smb2_create_reparse_symlink+0x10/0x10 [cifs] ? find_held_lock+0x8a/0xa0 ? hlock_class+0x32/0xb0 ? __build_path_from_dentry_optional_prefix+0x19d/0x2e0 [cifs] cifs_symlink+0x24f/0x960 [cifs] ? __pfx_make_vfsuid+0x10/0x10 ? __pfx_cifs_symlink+0x10/0x10 [cifs] ? make_vfsgid+0x6b/0xc0 ? generic_permission+0x96/0x2d0 vfs_symlink+0x1a1/0x2c0 do_symlinkat+0x108/0x1c0 ? __pfx_do_symlinkat+0x10/0x10 ? strncpy_from_user+0xaa/0x160 __x64_sys_symlinkat+0xb9/0xf0 do_syscall_64+0xbb/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f08d75c13bb
--- fs/smb/client/smb2pdu.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/smb/client/smb2pdu.c +9 -0
@@ -3131,6 +3131,15 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,return rc;if (indatalen) { +unsigned int len; + +if (WARN_ON_ONCE (smb3_encryption_required (tcon) && + (check_add_overflow (total_len -1 , +ALIGN (indatalen,8 ), &len) || + len >MAX_CIFS_SMALL_BUFFER_SIZE ))) { +cifs_small_buf_release (req); +return -EIO ; + }/* * indatalen is usually small at a couple of bytes max, so * just allocate through generic pool
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/137 usb: typec: altmode should keep reference to parent
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
[ Upstream commit befab3a278c59db0cc88c8799638064f6d3fd6f8 ]
The altmode device release refers to its parent device, but without keeping a reference to it.
When registering the altmode, get a reference to the parent and put it in the release function.
Before this fix, when using CONFIG_DEBUG_KOBJECT_RELEASE, we see issues like this:
[ 43.572860] kobject: 'port0.0' (ffff8880057ba008): kobject_release, parent 0000000000000000 (delayed 3000) [ 43.573532] kobject: 'port0.1' (ffff8880057bd008): kobject_release, parent 0000000000000000 (delayed 1000) [ 43.574407] kobject: 'port0' (ffff8880057b9008): kobject_release, parent 0000000000000000 (delayed 3000) [ 43.575059] kobject: 'port1.0' (ffff8880057ca008): kobject_release, parent 0000000000000000 (delayed 4000) [ 43.575908] kobject: 'port1.1' (ffff8880057c9008): kobject_release, parent 0000000000000000 (delayed 4000) [ 43.576908] kobject: 'typec' (ffff8880062dbc00): kobject_release, parent 0000000000000000 (delayed 4000) [ 43.577769] kobject: 'port1' (ffff8880057bf008): kobject_release, parent 0000000000000000 (delayed 3000) [ 46.612867] ================================================================== [ 46.613402] BUG: KASAN: slab-use-after-free in typec_altmode_release+0x38/0x129 [ 46.614003] Read of size 8 at addr ffff8880057b9118 by task kworker/2:1/48 [ 46.614538] [ 46.614668] CPU: 2 UID: 0 PID: 48 Comm: kworker/2:1 Not tainted 6.12.0-rc1-00138-gedbae730ad31 #535 [ 46.615391] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014 [ 46.616042] Workqueue: events kobject_delayed_cleanup [ 46.616446] Call Trace: [ 46.616648] <TASK> [ 46.616820] dump_stack_lvl+0x5b/0x7c [ 46.617112] ? typec_altmode_release+0x38/0x129 [ 46.617470] print_report+0x14c/0x49e [ 46.617769] ? rcu_read_unlock_sched+0x56/0x69 [ 46.618117] ? __virt_addr_valid+0x19a/0x1ab [ 46.618456] ? kmem_cache_debug_flags+0xc/0x1d [ 46.618807] ? typec_altmode_release+0x38/0x129 [ 46.619161] kasan_report+0x8d/0xb4 [ 46.619447] ? typec_altmode_release+0x38/0x129 [ 46.619809] ? process_scheduled_works+0x3cb/0x85f [ 46.620185] typec_altmode_release+0x38/0x129 [ 46.620537] ? process_scheduled_works+0x3cb/0x85f [ 46.620907] device_release+0xaf/0xf2 [ 46.621206] kobject_delayed_cleanup+0x13b/0x17a [ 46.621584] process_scheduled_works+0x4f6/0x85f [ 46.621955] ? __pfx_process_scheduled_works+0x10/0x10 [ 46.622353] ? hlock_class+0x31/0x9a [ 46.622647] ? lock_acquired+0x361/0x3c3 [ 46.622956] ? move_linked_works+0x46/0x7d [ 46.623277] worker_thread+0x1ce/0x291 [ 46.623582] ? __kthread_parkme+0xc8/0xdf [ 46.623900] ? __pfx_worker_thread+0x10/0x10 [ 46.624236] kthread+0x17e/0x190 [ 46.624501] ? kthread+0xfb/0x190 [ 46.624756] ? __pfx_kthread+0x10/0x10 [ 46.625015] ret_from_fork+0x20/0x40 [ 46.625268] ? __pfx_kthread+0x10/0x10 [ 46.625532] ret_from_fork_asm+0x1a/0x30 [ 46.625805] </TASK> [ 46.625953] [ 46.626056] Allocated by task 678: [ 46.626287] kasan_save_stack+0x24/0x44 [ 46.626555] kasan_save_track+0x14/0x2d [ 46.626811] __kasan_kmalloc+0x3f/0x4d [ 46.627049] __kmalloc_noprof+0x1bf/0x1f0 [ 46.627362] typec_register_port+0x23/0x491 [ 46.627698] cros_typec_probe+0x634/0xbb6 [ 46.628026] platform_probe+0x47/0x8c [ 46.628311] really_probe+0x20a/0x47d [ 46.628605] device_driver_attach+0x39/0x72 [ 46.628940] bind_store+0x87/0xd7 [ 46.629213] kernfs_fop_write_iter+0x1aa/0x218 [ 46.629574] vfs_write+0x1d6/0x29b [ 46.629856] ksys_write+0xcd/0x13b [ 46.630128] do_syscall_64+0xd4/0x139 [ 46.630420] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 46.630820] [ 46.630946] Freed by task 48: [ 46.631182] kasan_save_stack+0x24/0x44 [ 46.631493] kasan_save_track+0x14/0x2d [ 46.631799] kasan_save_free_info+0x3f/0x4d [ 46.632144] __kasan_slab_free+0x37/0x45 [ 46.632474] kfree+0x1d4/0x252 [ 46.632725] device_release+0xaf/0xf2 [ 46.633017] kobject_delayed_cleanup+0x13b/0x17a [ 46.633388] process_scheduled_works+0x4f6/0x85f [ 46.633764] worker_thread+0x1ce/0x291 [ 46.634065] kthread+0x17e/0x190 [ 46.634324] ret_from_fork+0x20/0x40 [ 46.634621] ret_from_fork_asm+0x1a/0x30
--- drivers/usb/typec/class.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/typec/class.c +3 -0
@@ -503,6 +503,7 @@ static void typec_altmode_release(struct device *dev)typec_altmode_put_partner (alt);altmode_id_remove (alt->adev.dev.parent, alt->id); +put_device (alt->adev.dev.parent);kfree (alt); }
@@ -552,6 +553,8 @@ typec_register_altmode(struct device *parent, alt->adev.dev.type = &typec_altmode_dev_type;dev_set_name (&alt->adev.dev,"%s.%u" ,dev_name (parent), id); +get_device (alt->adev.dev.parent); +/* Link partners and plugs with the ports */ if (!is_port)typec_altmode_set_partner (alt);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/137 s390: Initialize psw mask in perf_arch_fetch_caller_regs()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit 223e7fb979fa06934f1595b6ad0ae1d4ead1147f ]
Also initialize regs->psw.mask in perf_arch_fetch_caller_regs(). This way user_mode(regs) will return false, like it should.
It looks like all current users initialize regs to zero, so that this doesn't fix a bug currently. However it is better to not rely on callers to do this.
--- arch/s390/include/asm/perf_event.h | 1 + 1 file changed, 1 insertion(+)
arch/s390/include/asm/perf_event.h +1 -0
@@ -75,6 +75,7 @@ struct perf_sf_sde_regs {#define SAMPLE_FREQ_MODE (hwc) (SAMPL_FLAGS(hwc) & PERF_CPUM_SF_FREQ_MODE)#define perf_arch_fetch_caller_regs (regs, __ip) do { \ + (regs)->psw.mask = 0; \ (regs)->psw.addr = (__ip); \ (regs)->gprs[15] = (unsigned long)__builtin_frame_address(0) - \ offsetof(struct stack_frame, back_chain); \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/137 Bluetooth: bnep: fix wild-memory-access in proto_unregister
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit 64a90991ba8d4e32e3173ddd83d0b24167a5668c ]
There's issue as follows:
KASAN: maybe wild-memory-access in range [0xdead...108-0xdead...10f] CPU: 3 UID: 0 PID: 2805 Comm: rmmod Tainted: G W RIP: 0010:proto_unregister+0xee/0x400 Call Trace: <TASK> __do_sys_delete_module+0x318/0x580 do_syscall_64+0xc1/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f
As bnep_init() ignore bnep_sock_init()'s return value, and bnep_sock_init() will cleanup all resource. Then when remove bnep module will call bnep_sock_cleanup() to cleanup sock's resource.
To solve above issue just return bnep_sock_init()'s return value in bnep_exit().
--- net/bluetooth/bnep/core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/bluetooth/bnep/core.c +1 -2
@@ -745,8 +745,7 @@ static int __init bnep_init(void)if (flt[0 ])BT_INFO ("BNEP filters: %s" , flt); -bnep_sock_init (); -return 0 ; +return bnep_sock_init (); } static void __exit bnep_exit(void)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/137 net/mlx5: Remove redundant cmdif revision check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit 0714ec9ea1f291447a925657e0808f34b8fbce2b ]
mlx5 is checking the cmdif revision twice, for no reason. Remove the latter check.
Stable-dep-of: d62b14045c65 ("net/mlx5: Fix command bitmask initialization")
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +3 -12
@@ -2216,16 +2216,15 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)int align =roundup_pow_of_two (size);struct mlx5_cmd *cmd = &dev->cmd;u32 cmd_h, cmd_l; -u16 cmd_if_rev;int err;int i;memset (cmd,0 ,sizeof (*cmd)); - cmd_if_rev =cmdif_rev (dev); -if (cmd_if_rev !=CMD_IF_REV ) { + cmd->vars.cmdif_rev =cmdif_rev (dev); +if (cmd->vars.cmdif_rev !=CMD_IF_REV ) {mlx5_core_err (dev,"Driver cmdif rev(%d) differs from firmware's(%d)\n" , -CMD_IF_REV , cmd_if_rev); +CMD_IF_REV , cmd->vars.cmdif_rev);return -EINVAL ; }
@@ -2258,14 +2257,6 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) cmd->vars.max_reg_cmds = (1 << cmd->vars.log_sz) -1 ; cmd->vars.bitmask = (1UL << cmd->vars.max_reg_cmds) -1 ; - cmd->vars.cmdif_rev =ioread32be (&dev->iseg->cmdif_rev_fw_sub) >>16 ; -if (cmd->vars.cmdif_rev >CMD_IF_REV ) { -mlx5_core_err (dev,"driver does not support command interface version. driver %d, firmware %d\n" , -CMD_IF_REV , cmd->vars.cmdif_rev); - err = -EOPNOTSUPP ; - goto err_free_page; - } -spin_lock_init (&cmd->alloc_lock);spin_lock_init (&cmd->token_lock);for (i =0 ; i <MLX5_CMD_OP_MAX ; i++)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/137 net/mlx5: split mlx5_cmd_init() to probe and reload routines
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit 06cd555f73caec515a14d42ef052221fa2587ff9 ]
There is no need to destroy and allocate cmd SW structs during reload, this is time consuming for no reason.
Hence, split mlx5_cmd_init() to probe and reload routines.
Stable-dep-of: d62b14045c65 ("net/mlx5: Fix command bitmask initialization")
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 121 ++++++++++-------- .../net/ethernet/mellanox/mlx5/core/main.c | 15 ++- .../ethernet/mellanox/mlx5/core/mlx5_core.h | 2 + 3 files changed, 82 insertions(+), 56 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +68 -53
@@ -1570,7 +1570,6 @@ static void clean_debug_files(struct mlx5_core_dev *dev)if (!mlx5_debugfs_root)return ; -mlx5_cmdif_debugfs_cleanup (dev);debugfs_remove_recursive (dbg->dbg_root); }
@@ -1585,8 +1584,6 @@ static void create_debugfs_files(struct mlx5_core_dev *dev)debugfs_create_file ("out_len" ,0600 , dbg->dbg_root, dev, &olfops);debugfs_create_u8 ("status" ,0600 , dbg->dbg_root, &dbg->status);debugfs_create_file ("run" ,0200 , dbg->dbg_root, dev, &fops); - -mlx5_cmdif_debugfs_init (dev); }void mlx5_cmd_allowed_opcode (struct mlx5_core_dev *dev,u16 opcode)
@@ -2215,19 +2212,10 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)int size =sizeof (struct mlx5_cmd_prot_block );int align =roundup_pow_of_two (size);struct mlx5_cmd *cmd = &dev->cmd; -u32 cmd_h, cmd_l; +u32 cmd_l;int err;int i; -memset (cmd,0 ,sizeof (*cmd)); - cmd->vars.cmdif_rev =cmdif_rev (dev); -if (cmd->vars.cmdif_rev !=CMD_IF_REV ) { -mlx5_core_err (dev, -"Driver cmdif rev(%d) differs from firmware's(%d)\n" , -CMD_IF_REV , cmd->vars.cmdif_rev); -return -EINVAL ; - } - cmd->pool =dma_pool_create ("mlx5_cmd" ,mlx5_core_dma_dev (dev), size, align,0 );if (!cmd->pool)return -ENOMEM ;
@@ -2236,43 +2224,93 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)if (err) goto err_free_pool; + cmd_l = (u32)(cmd->dma); +if (cmd_l &0xfff ) { +mlx5_core_err (dev,"invalid command queue address\n" ); + err = -ENOMEM ; + goto err_cmd_page; + } + cmd->checksum_disabled =1 ; + +spin_lock_init (&cmd->alloc_lock); +spin_lock_init (&cmd->token_lock); +for (i =0 ; i <MLX5_CMD_OP_MAX ; i++) +spin_lock_init (&cmd->stats[i].lock); + +create_msg_cache (dev); + +set_wqname (dev); + cmd->wq =create_singlethread_workqueue (cmd->wq_name); +if (!cmd->wq) { +mlx5_core_err (dev,"failed to create command workqueue\n" ); + err = -ENOMEM ; + goto err_cache; + } + +mlx5_cmdif_debugfs_init (dev); + +return 0 ; + +err_cache: +destroy_msg_cache (dev); +err_cmd_page: +free_cmd_page (dev, cmd); +err_free_pool: +dma_pool_destroy (cmd->pool); +return err; +} + +void mlx5_cmd_cleanup (struct mlx5_core_dev *dev) +{ +struct mlx5_cmd *cmd = &dev->cmd; + +mlx5_cmdif_debugfs_cleanup (dev); +destroy_workqueue (cmd->wq); +destroy_msg_cache (dev); +free_cmd_page (dev, cmd); +dma_pool_destroy (cmd->pool); +} + +int mlx5_cmd_enable (struct mlx5_core_dev *dev) +{ +struct mlx5_cmd *cmd = &dev->cmd; +u32 cmd_h, cmd_l; + +memset (&cmd->vars,0 ,sizeof (cmd->vars)); + cmd->vars.cmdif_rev =cmdif_rev (dev); +if (cmd->vars.cmdif_rev !=CMD_IF_REV ) { +mlx5_core_err (dev, +"Driver cmdif rev(%d) differs from firmware's(%d)\n" , +CMD_IF_REV , cmd->vars.cmdif_rev); +return -EINVAL ; + } + cmd_l =ioread32be (&dev->iseg->cmdq_addr_l_sz) &0xff ; cmd->vars.log_sz = cmd_l >>4 &0xf ; cmd->vars.log_stride = cmd_l &0xf ;if (1 << cmd->vars.log_sz >MLX5_MAX_COMMANDS ) {mlx5_core_err (dev,"firmware reports too many outstanding commands %d\n" ,1 << cmd->vars.log_sz); - err = -EINVAL ; - goto err_free_page; +return -EINVAL ; }if (cmd->vars.log_sz + cmd->vars.log_stride >MLX5_ADAPTER_PAGE_SHIFT ) {mlx5_core_err (dev,"command queue size overflow\n" ); - err = -EINVAL ; - goto err_free_page; +return -EINVAL ; } cmd->state =MLX5_CMDIF_STATE_DOWN ; - cmd->checksum_disabled =1 ; cmd->vars.max_reg_cmds = (1 << cmd->vars.log_sz) -1 ; cmd->vars.bitmask = (1UL << cmd->vars.max_reg_cmds) -1 ; -spin_lock_init (&cmd->alloc_lock); -spin_lock_init (&cmd->token_lock); -for (i =0 ; i <MLX5_CMD_OP_MAX ; i++) -spin_lock_init (&cmd->stats[i].lock); -sema_init (&cmd->vars.sem, cmd->vars.max_reg_cmds);sema_init (&cmd->vars.pages_sem,1 );sema_init (&cmd->vars.throttle_sem,DIV_ROUND_UP (cmd->vars.max_reg_cmds,2 )); cmd_h = (u32)((u64)(cmd->dma) >>32 ); cmd_l = (u32)(cmd->dma); -if (cmd_l &0xfff ) { -mlx5_core_err (dev,"invalid command queue address\n" ); - err = -ENOMEM ; - goto err_free_page; - } +if (WARN_ON (cmd_l &0xfff )) +return -EINVAL ;iowrite32be (cmd_h, &dev->iseg->cmdq_addr_h);iowrite32be (cmd_l, &dev->iseg->cmdq_addr_l_sz);
@@ -2285,40 +2323,17 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev) cmd->mode =CMD_MODE_POLLING ; cmd->allowed_opcode =CMD_ALLOWED_OPCODE_ALL ; -create_msg_cache (dev); - -set_wqname (dev); - cmd->wq =create_singlethread_workqueue (cmd->wq_name); -if (!cmd->wq) { -mlx5_core_err (dev,"failed to create command workqueue\n" ); - err = -ENOMEM ; - goto err_cache; - } -create_debugfs_files (dev);return 0 ; - -err_cache: -destroy_msg_cache (dev); - -err_free_page: -free_cmd_page (dev, cmd); - -err_free_pool: -dma_pool_destroy (cmd->pool); -return err; } -void mlx5_cmd_cleanup (struct mlx5_core_dev *dev) +void mlx5_cmd_disable (struct mlx5_core_dev *dev) {struct mlx5_cmd *cmd = &dev->cmd;clean_debug_files (dev); -destroy_workqueue (cmd->wq); -destroy_msg_cache (dev); -free_cmd_page (dev, cmd); -dma_pool_destroy (cmd->pool); +flush_workqueue (cmd->wq); } void mlx5_cmd_set_state(struct mlx5_core_dev *dev,
drivers/net/ethernet/mellanox/mlx5/core/main.c +12 -3
@@ -1114,7 +1114,7 @@ static int mlx5_function_enable(struct mlx5_core_dev *dev, bool boot, u64 timeoureturn err; } - err =mlx5_cmd_init (dev); + err =mlx5_cmd_enable (dev);if (err) {mlx5_core_err (dev,"Failed initializing command interface, aborting\n" );return err;
@@ -1168,7 +1168,7 @@ static int mlx5_function_enable(struct mlx5_core_dev *dev, bool boot, u64 timeoumlx5_stop_health_poll (dev, boot); err_cmd_cleanup:mlx5_cmd_set_state (dev,MLX5_CMDIF_STATE_DOWN ); -mlx5_cmd_cleanup (dev); +mlx5_cmd_disable (dev);return err; }
@@ -1179,7 +1179,7 @@ static void mlx5_function_disable(struct mlx5_core_dev *dev, bool boot)mlx5_core_disable_hca (dev,0 );mlx5_stop_health_poll (dev, boot);mlx5_cmd_set_state (dev,MLX5_CMDIF_STATE_DOWN ); -mlx5_cmd_cleanup (dev); +mlx5_cmd_disable (dev); }static int mlx5_function_open (struct mlx5_core_dev *dev)
@@ -1644,6 +1644,12 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx) mlx5_debugfs_root);INIT_LIST_HEAD (&priv->traps); + err =mlx5_cmd_init (dev); +if (err) { +mlx5_core_err (dev,"Failed initializing cmdif SW structs, aborting\n" ); + goto err_cmd_init; + } + err =mlx5_tout_init (dev);if (err) {mlx5_core_err (dev,"Failed initializing timeouts, aborting\n" );
@@ -1689,6 +1695,8 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx) err_health_init:mlx5_tout_cleanup (dev); err_timeout_init: +mlx5_cmd_cleanup (dev); +err_cmd_init:debugfs_remove (dev->priv.dbg.dbg_root);mutex_destroy (&priv->pgdir_mutex);mutex_destroy (&priv->alloc_mutex);
@@ -1711,6 +1719,7 @@ void mlx5_mdev_uninit(struct mlx5_core_dev *dev)mlx5_pagealloc_cleanup (dev);mlx5_health_cleanup (dev);mlx5_tout_cleanup (dev); +mlx5_cmd_cleanup (dev);debugfs_remove_recursive (dev->priv.dbg.dbg_root);mutex_destroy (&priv->pgdir_mutex);mutex_destroy (&priv->alloc_mutex);
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +2 -0
@@ -177,6 +177,8 @@ int mlx5_query_hca_caps(struct mlx5_core_dev *dev);int mlx5_query_board_id (struct mlx5_core_dev *dev);int mlx5_cmd_init (struct mlx5_core_dev *dev);void mlx5_cmd_cleanup (struct mlx5_core_dev *dev); +int mlx5_cmd_enable (struct mlx5_core_dev *dev); +void mlx5_cmd_disable (struct mlx5_core_dev *dev);void mlx5_cmd_set_state (struct mlx5_core_dev *dev,enum mlx5_cmdif_state cmdif_state);int mlx5_cmd_init_hca (struct mlx5_core_dev *dev,uint32_t *sw_owner_id);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/137 net/mlx5: Fix command bitmask initialization
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Drory <[email protected]>
[ Upstream commit d62b14045c6511a7b2d4948d1a83a4e592deeb05 ]
Command bitmask have a dedicated bit for MANAGE_PAGES command, this bit isn't Initialize during command bitmask Initialization, only during MANAGE_PAGES.
In addition, mlx5_cmd_trigger_completions() is trying to trigger completion for MANAGE_PAGES command as well.
Hence, in case health error occurred before any MANAGE_PAGES command have been invoke (for example, during mlx5_enable_hca()), mlx5_cmd_trigger_completions() will try to trigger completion for MANAGE_PAGES command, which will result in null-ptr-deref error.[1]
Fix it by Initialize command bitmask correctly.
While at it, re-write the code for better understanding.
[1]
BUG: KASAN: null-ptr-deref in mlx5_cmd_trigger_completions+0x1db/0x600 [mlx5_core] Write of size 4 at addr 0000000000000214 by task kworker/u96:2/12078 CPU: 10 PID: 12078 Comm: kworker/u96:2 Not tainted 6.9.0-rc2_for_upstream_debug_2024_04_07_19_01 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Workqueue: mlx5_health0000:08:00.0 mlx5_fw_fatal_reporter_err_work [mlx5_core] Call Trace: <TASK> dump_stack_lvl+0x7e/0xc0 kasan_report+0xb9/0xf0 kasan_check_range+0xec/0x190 mlx5_cmd_trigger_completions+0x1db/0x600 [mlx5_core] mlx5_cmd_flush+0x94/0x240 [mlx5_core] enter_error_state+0x6c/0xd0 [mlx5_core] mlx5_fw_fatal_reporter_err_work+0xf3/0x480 [mlx5_core] process_one_work+0x787/0x1490 ? lockdep_hardirqs_on_prepare+0x400/0x400 ? pwq_dec_nr_in_flight+0xda0/0xda0 ? assign_work+0x168/0x240 worker_thread+0x586/0xd30 ? rescuer_thread+0xae0/0xae0 kthread+0x2df/0x3b0 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork+0x2d/0x70 ? kthread_complete_and_exit+0x20/0x20 ret_from_fork_asm+0x11/0x20 </TASK>
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +6 -2
@@ -1755,6 +1755,10 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force } } +#define MLX5_MAX_MANAGE_PAGES_CMD_ENT 1 +#define MLX5_CMD_MASK ((1UL << (cmd->vars.max_reg_cmds + \ + MLX5_MAX_MANAGE_PAGES_CMD_ENT)) - 1) +static void mlx5_cmd_trigger_completions (struct mlx5_core_dev *dev) {struct mlx5_cmd *cmd = &dev->cmd;
@@ -1766,7 +1770,7 @@ static void mlx5_cmd_trigger_completions(struct mlx5_core_dev *dev)/* wait for pending handlers to complete */ mlx5_eq_synchronize_cmd_irq (dev);spin_lock_irqsave (&dev->cmd.alloc_lock, flags); - vector = ~dev->cmd.vars.bitmask & ((1ul << (1 << dev->cmd.vars.log_sz)) -1 ); + vector = ~dev->cmd.vars.bitmask &MLX5_CMD_MASK ;if (!vector) goto no_trig;
@@ -2301,7 +2305,7 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev) cmd->state =MLX5_CMDIF_STATE_DOWN ; cmd->vars.max_reg_cmds = (1 << cmd->vars.log_sz) -1 ; - cmd->vars.bitmask = (1UL << cmd->vars.max_reg_cmds) -1 ; + cmd->vars.bitmask =MLX5_CMD_MASK ;sema_init (&cmd->vars.sem, cmd->vars.max_reg_cmds);sema_init (&cmd->vars.pages_sem,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/137 net/mlx5: Unregister notifier on eswitch init failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cosmin Ratiu <[email protected]>
[ Upstream commit 1da9cfd6c41c2e6bbe624d0568644e1521c33e12 ]
It otherwise remains registered and a subsequent attempt at eswitch enabling might trigger warnings of the sort:
[ 682.589148] ------------[ cut here ]------------ [ 682.590204] notifier callback eswitch_vport_event [mlx5_core] already registered [ 682.590256] WARNING: CPU: 13 PID: 2660 at kernel/notifier.c:31 notifier_chain_register+0x3e/0x90 [...snipped] [ 682.610052] Call Trace: [ 682.610369] <TASK> [ 682.610663] ? __warn+0x7c/0x110 [ 682.611050] ? notifier_chain_register+0x3e/0x90 [ 682.611556] ? report_bug+0x148/0x170 [ 682.611977] ? handle_bug+0x36/0x70 [ 682.612384] ? exc_invalid_op+0x13/0x60 [ 682.612817] ? asm_exc_invalid_op+0x16/0x20 [ 682.613284] ? notifier_chain_register+0x3e/0x90 [ 682.613789] atomic_notifier_chain_register+0x25/0x40 [ 682.614322] mlx5_eswitch_enable_locked+0x1d4/0x3b0 [mlx5_core] [ 682.614965] mlx5_eswitch_enable+0xc9/0x100 [mlx5_core] [ 682.615551] mlx5_device_enable_sriov+0x25/0x340 [mlx5_core] [ 682.616170] mlx5_core_sriov_configure+0x50/0x170 [mlx5_core] [ 682.616789] sriov_numvfs_store+0xb0/0x1b0 [ 682.617248] kernfs_fop_write_iter+0x117/0x1a0 [ 682.617734] vfs_write+0x231/0x3f0 [ 682.618138] ksys_write+0x63/0xe0 [ 682.618536] do_syscall_64+0x4c/0x100 [ 682.618958] entry_SYSCALL_64_after_hwframe+0x4b/0x53
--- drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +3 -2
@@ -1279,7 +1279,7 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs) }if (err) - goto abort; + goto err_esw_enable; esw->fdb_table.flags |=MLX5_ESW_FDB_CREATED ;
@@ -1293,7 +1293,8 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs)return 0 ; -abort: +err_esw_enable: +mlx5_eq_notifier_unregister (esw->dev, &esw->nb);mlx5_esw_acls_ns_cleanup (esw);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/137 riscv, bpf: Make BPF_CMPXCHG fully ordered
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrea Parri <[email protected]>
[ Upstream commit e59db0623f6955986d1be0880b351a1f56e7fd6d ]
According to the prototype formal BPF memory consistency model discussed e.g. in [1] and following the ordering properties of the C/in-kernel macro atomic_cmpxchg(), a BPF atomic operation with the BPF_CMPXCHG modifier is fully ordered. However, the current RISC-V JIT lowerings fail to meet such memory ordering property. This is illustrated by the following litmus test:
BPF BPF__MP+success_cmpxchg+fence
{
0:r1=x; 0:r3=y; 0:r5=1;
1:r2=y; 1:r4=f; 1:r7=x;
}
P0 | P1 ;
*(u64 *)(r1 + 0) = 1 | r1 = *(u64 *)(r2 + 0) ;
r2 = cmpxchg_64 (r3 + 0, r4, r5) | r3 = atomic_fetch_add((u64 *)(r4 + 0), r5) ;
| r6 = *(u64 *)(r7 + 0) ;exists (1:r1=1 /\ 1:r6=0)
whose "exists" clause is not satisfiable according to the BPF memory model. Using the current RISC-V JIT lowerings, the test can be mapped to the following RISC-V litmus test:
RISCV RISCV__MP+success_cmpxchg+fence
{
0:x1=x; 0:x3=y; 0:x5=1;
1:x2=y; 1:x4=f; 1:x7=x;
}
P0 | P1 ; sd x5, 0(x1) | ld x1, 0(x2) ; L00: | amoadd.d.aqrl x3, x5, 0(x4) ; lr.d x2, 0(x3) | ld x6, 0(x7) ; bne x2, x4, L01 | ; sc.d x6, x5, 0(x3) | ; bne x6, x4, L00 | ; fence rw, rw | ; L01: | ;
exists (1:x1=1 /\ 1:x6=0)
where the two stores in P0 can be reordered. Update the RISC-V JIT lowerings/implementation of BPF_CMPXCHG to emit an SC with RELEASE ("rl") annotation in order to meet the expected memory ordering guarantees. The resulting RISC-V JIT lowerings of BPF_CMPXCHG match the RISC-V lowerings of the C atomic_cmpxchg().
Other lowerings were fixed via 20a759df3bba ("riscv, bpf: make some atomic operations fully ordered").
--- arch/riscv/net/bpf_jit_comp64.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/riscv/net/bpf_jit_comp64.c +2 -2
@@ -542,8 +542,8 @@ static void emit_atomic(u8 rd, u8 rs, s16 off, s32 imm, bool is64, rv_lr_w(r0, 0, rd, 0, 0), ctx); jmp_offset =ninsns_rvoff (8 );emit (rv_bne (RV_REG_T2 , r0, jmp_offset >>1 ), ctx); -emit (is64 ?rv_sc_d (RV_REG_T3 , rs, rd,0 ,0 ) : -rv_sc_w (RV_REG_T3 , rs, rd,0 ,0 ), ctx); +emit (is64 ?rv_sc_d (RV_REG_T3 , rs, rd,0 ,1 ) : +rv_sc_w (RV_REG_T3 , rs, rd,0 ,1 ), ctx); jmp_offset =ninsns_rvoff (-6 );emit (rv_bne (RV_REG_T3 ,0 , jmp_offset >>1 ), ctx);emit (rv_fence (0x3 ,0x3 ), ctx);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/137 bpf: Fix iter/task tid filtering
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordan Rome <[email protected]>
[ Upstream commit 9495a5b731fcaf580448a3438d63601c88367661 ]
In userspace, you can add a tid filter by setting the "task.tid" field for "bpf_iter_link_info". However, get_pid_task when called for the BPF_TASK_ITER_TID type should have been using PIDTYPE_PID (tid) instead of PIDTYPE_TGID (pid).
--- kernel/bpf/task_iter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/bpf/task_iter.c +1 -1
@@ -119,7 +119,7 @@ static struct task_struct *task_seq_get_next(struct bpf_iter_seq_task_common *corcu_read_lock (); pid =find_pid_ns (common->pid, common->ns);if (pid) { - task =get_pid_task (pid,PIDTYPE_TGID ); + task =get_pid_task (pid,PIDTYPE_PID ); *tid = common->pid; }rcu_read_unlock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 57/137 arm64:uprobe fix the uprobe SWBP_INSN in big-endian
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: junhua huang <[email protected]>
[ Upstream commit 60f07e22a73d318cddaafa5ef41a10476807cc07 ]
We use uprobe in aarch64_be, which we found the tracee task would exit due to SIGILL when we enable the uprobe trace.
We can see the replace inst from uprobe is not correct in aarch big-endian. As in Armv8-A, instruction fetches are always treated as little-endian, we should treat the UPROBE_SWBP_INSN as little-endian。
The test case is as following。
bash-4.4# ./mqueue_test_aarchbe 1 1 2 1 10 > /dev/null & bash-4.4# cd /sys/kernel/debug/tracing/
bash-4.4# echo 'p:test /mqueue_test_aarchbe:0xc30 %x0 %x1' > uprobe_events bash-4.4# echo 1 > events/uprobes/enable
bash-4.4#
bash-4.4# ps
PID TTY TIME CMD
140 ? 00:00:01 bash
237 ? 00:00:00 ps
[1]+ Illegal instruction ./mqueue_test_aarchbe 1 1 2 1 100 > /dev/null
which we debug use gdb as following:
bash-4.4# gdb attach 155
(gdb) disassemble send
Dump of assembler code for function send:
0x0000000000400c30 <+0>: .inst 0xa00020d4 ; undefined 0x0000000000400c34 <+4>: mov x29, sp 0x0000000000400c38 <+8>: str w0, [sp, #28] 0x0000000000400c3c <+12>: strb w1, [sp, #27] 0x0000000000400c40 <+16>: str xzr, [sp, #40] 0x0000000000400c44 <+20>: str xzr, [sp, #48] 0x0000000000400c48 <+24>: add x0, sp, #0x1b 0x0000000000400c4c <+28>: mov w3, #0x0 // #0 0x0000000000400c50 <+32>: mov x2, #0x1 // #1 0x0000000000400c54 <+36>: mov x1, x0 0x0000000000400c58 <+40>: ldr w0, [sp, #28] 0x0000000000400c5c <+44>: bl 0x405e10 <mq_send> 0x0000000000400c60 <+48>: str w0, [sp, #60] 0x0000000000400c64 <+52>: ldr w0, [sp, #60] 0x0000000000400c68 <+56>: ldp x29, x30, [sp], #64 0x0000000000400c6c <+60>: ret
End of assembler dump.
(gdb) info b
No breakpoints or watchpoints.
(gdb) c
Continuing.
Program received signal SIGILL, Illegal instruction. 0x0000000000400c30 in send ()
(gdb) x/10x 0x400c30
0x400c30 <send>: 0xd42000a0 0xfd030091 0xe01f00b9 0xe16f0039 0x400c40 <send+16>: 0xff1700f9 0xff1b00f9 0xe06f0091 0x03008052 0x400c50 <send+32>: 0x220080d2 0xe10300aa (gdb) disassemble 0x400c30 Dump of assembler code for function send: => 0x0000000000400c30 <+0>: .inst 0xa00020d4 ; undefined 0x0000000000400c34 <+4>: mov x29, sp 0x0000000000400c38 <+8>: str w0, [sp, #28] 0x0000000000400c3c <+12>: strb w1, [sp, #27] 0x0000000000400c40 <+16>: str xzr, [sp, #40]
Stable-dep-of: 13f8f1e05f1d ("arm64: probes: Fix uprobes for big-endian kernels")
--- arch/arm64/include/asm/uprobes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/include/asm/uprobes.h +1 -1
@@ -12,7 +12,7 @@#define MAX_UINSN_BYTES AARCH64_INSN_SIZE -#define UPROBE_SWBP_INSN BRK64_OPCODE_UPROBES +#define UPROBE_SWBP_INSN cpu_to_le32(BRK64_OPCODE_UPROBES)#define UPROBE_SWBP_INSN_SIZE AARCH64_INSN_SIZE#define UPROBE_XOL_SLOT_BYTES MAX_UINSN_BYTES
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/137 arm64: probes: Fix uprobes for big-endian kernels
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 13f8f1e05f1dc36dbba6cba0ae03354c0dafcde7 ]
The arm64 uprobes code is broken for big-endian kernels as it doesn't convert the in-memory instruction encoding (which is always little-endian) into the kernel's native endianness before analyzing and simulating instructions. This may result in a few distinct problems:
* The kernel may may erroneously reject probing an instruction which can safely be probed.
* The kernel may erroneously erroneously permit stepping an instruction out-of-line when that instruction cannot be stepped out-of-line safely.
* The kernel may erroneously simulate instruction incorrectly dur to interpretting the byte-swapped encoding.
The endianness mismatch isn't caught by the compiler or sparse because:
* The arch_uprobe::{insn,ixol} fields are encoded as arrays of u8, so the compiler and sparse have no idea these contain a little-endian 32-bit value. The core uprobes code populates these with a memcpy() which similarly does not handle endianness.
* While the uprobe_opcode_t type is an alias for __le32, both arch_uprobe_analyze_insn() and arch_uprobe_skip_sstep() cast from u8[] to the similarly-named probe_opcode_t, which is an alias for u32. Hence there is no endianness conversion warning.
Fix this by changing the arch_uprobe::{insn,ixol} fields to __le32 and adding the appropriate __le32_to_cpu() conversions prior to consuming the instruction encoding. The core uprobes copies these fields as opaque ranges of bytes, and so is unaffected by this change.
At the same time, remove MAX_UINSN_BYTES and consistently use AARCH64_INSN_SIZE for clarity.
Tested with the following:
| #include <stdio.h>
| #include <stdbool.h>
|
| #define noinline __attribute__((noinline))
|
| static noinline void *adrp_self(void)
| {
| void *addr;
|
| asm volatile(
| " adrp %x0, adrp_self\n"
| " add %x0, %x0, :lo12:adrp_self\n"
| : "=r" (addr));
| }
|
|
| int main(int argc, char *argv)
| {
| void *ptr = adrp_self();
| bool equal = (ptr == adrp_self);
|
| printf("adrp_self => %p\n"
| "adrp_self() => %p\n"
| "%s\n",
| adrp_self, ptr, equal ? "EQUAL" : "NOT EQUAL");
|
| return 0;
| }.... where the adrp_self() function was compiled to:
| 00000000004007e0 <adrp_self>: | 4007e0: 90000000 adrp x0, 400000 <__ehdr_start> | 4007e4: 911f8000 add x0, x0, #0x7e0 | 4007e8: d65f03c0 ret
Before this patch, the ADRP is not recognized, and is assumed to be steppable, resulting in corruption of the result:
| # ./adrp-self | adrp_self => 0x4007e0 | adrp_self() => 0x4007e0 | EQUAL | # echo 'p /root/adrp-self:0x007e0' > /sys/kernel/tracing/uprobe_events | # echo 1 > /sys/kernel/tracing/events/uprobes/enable | # ./adrp-self | adrp_self => 0x4007e0 | adrp_self() => 0xffffffffff7e0 | NOT EQUAL
After this patch, the ADRP is correctly recognized and simulated:
| # ./adrp-self | adrp_self => 0x4007e0 | adrp_self() => 0x4007e0 | EQUAL | # | # echo 'p /root/adrp-self:0x007e0' > /sys/kernel/tracing/uprobe_events | # echo 1 > /sys/kernel/tracing/events/uprobes/enable | # ./adrp-self | adrp_self => 0x4007e0 | adrp_self() => 0x4007e0 | EQUAL
--- arch/arm64/include/asm/uprobes.h | 8 +++----- arch/arm64/kernel/probes/uprobes.c | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-)
arch/arm64/include/asm/uprobes.h +3 -5
@@ -10,11 +10,9 @@#include <asm/insn.h> #include <asm/probes.h> -#define MAX_UINSN_BYTES AARCH64_INSN_SIZE -#define UPROBE_SWBP_INSN cpu_to_le32(BRK64_OPCODE_UPROBES)#define UPROBE_SWBP_INSN_SIZE AARCH64_INSN_SIZE -#define UPROBE_XOL_SLOT_BYTES MAX_UINSN_BYTES +#define UPROBE_XOL_SLOT_BYTES AARCH64_INSN_SIZEtypedef u32 uprobe_opcode_t ;
@@ -23,8 +21,8 @@ struct arch_uprobe_task {struct arch_uprobe {union { -u8 insn[MAX_UINSN_BYTES ]; -u8 ixol[MAX_UINSN_BYTES ]; +__le32 insn; +__le32 ixol; };struct arch_probe_insn api;bool simulate;
arch/arm64/kernel/probes/uprobes.c +2 -2
@@ -42,7 +42,7 @@ int arch_uprobe_analyze_insn(struct arch_uprobe *auprobe, struct mm_struct *mm,else if (!IS_ALIGNED (addr,AARCH64_INSN_SIZE ))return -EINVAL ; - insn = *(probe_opcode_t *)(&auprobe->insn[0 ]); + insn =le32_to_cpu (auprobe->insn);switch (arm_probe_decode_insn (insn, &auprobe->api)) {case INSN_REJECTED :
@@ -108,7 +108,7 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, struct pt_regs *regs)if (!auprobe->simulate)return false; - insn = *(probe_opcode_t *)(&auprobe->insn[0 ]); + insn =le32_to_cpu (auprobe->insn); addr =instruction_pointer (regs);if (auprobe->api.handler)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/137 xhci: dbgtty: remove kfifo_out() wrapper
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Slaby (SUSE) <[email protected]>
[ Upstream commit 2b217514436744dd98c4d9fa48d60610f9f67d61 ]
There is no need to check against kfifo_len() before kfifo_out(). Just ask the latter for data and it tells how much it retrieved. Or returns 0 in case there are no more.
Stable-dep-of: 30c9ae5ece8e ("xhci: dbc: honor usb transfer size boundaries.")
--- drivers/usb/host/xhci-dbgtty.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-)
drivers/usb/host/xhci-dbgtty.c +1 -14
@@ -24,19 +24,6 @@ static inline struct dbc_port *dbc_to_port(struct xhci_dbc *dbc)return dbc->priv; } -static unsigned int -dbc_send_packet (struct dbc_port *port,char *packet,unsigned int size) -{ -unsigned int len; - - len =kfifo_len (&port->write_fifo); -if (len < size) - size = len; -if (size !=0 ) - size =kfifo_out (&port->write_fifo, packet, size); -return size; -} - static int dbc_start_tx(struct dbc_port *port) __releases(&port->port_lock) __acquires(&port->port_lock)
@@ -49,7 +36,7 @@ static int dbc_start_tx(struct dbc_port *port)while (!list_empty (pool)) { req = list_entry(pool->next, struct dbc_request, list_pool); - len =dbc_send_packet (port, req->buf,DBC_MAX_PACKET ); + len =kfifo_out (&port->write_fifo, req->buf,DBC_MAX_PACKET );if (len ==0 )break ; do_tty_wake = true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/137 xhci: dbgtty: use kfifo from tty_port struct
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Slaby (SUSE) <[email protected]>
[ Upstream commit 866025f0237609532bc8e4af5ef4d7252d3b55b6 ]
There is no need to define one in a custom structure. The tty_port one is free to use.
Stable-dep-of: 30c9ae5ece8e ("xhci: dbc: honor usb transfer size boundaries.")
--- drivers/usb/host/xhci-dbgcap.h | 1 - drivers/usb/host/xhci-dbgtty.c | 17 +++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-)
drivers/usb/host/xhci-dbgcap.h +0 -1
@@ -108,7 +108,6 @@ struct dbc_port {struct tasklet_struct push;struct list_head write_pool; -struct kfifo write_fifo;bool registered; };
drivers/usb/host/xhci-dbgtty.c +9 -8
@@ -36,7 +36,7 @@ static int dbc_start_tx(struct dbc_port *port)while (!list_empty (pool)) { req = list_entry(pool->next, struct dbc_request, list_pool); - len =kfifo_out (&port->write_fifo, req->buf,DBC_MAX_PACKET ); + len =kfifo_out (&port->port.xmit_fifo, req->buf,DBC_MAX_PACKET );if (len ==0 )break ; do_tty_wake = true;
@@ -204,7 +204,7 @@ static int dbc_tty_write(struct tty_struct *tty,spin_lock_irqsave (&port->port_lock, flags);if (count) - count =kfifo_in (&port->write_fifo, buf, count); + count =kfifo_in (&port->port.xmit_fifo, buf, count);dbc_start_tx (port);spin_unlock_irqrestore (&port->port_lock, flags);
@@ -218,7 +218,7 @@ static int dbc_tty_put_char(struct tty_struct *tty, unsigned char ch)int status;spin_lock_irqsave (&port->port_lock, flags); - status =kfifo_put (&port->write_fifo, ch); + status =kfifo_put (&port->port.xmit_fifo, ch);spin_unlock_irqrestore (&port->port_lock, flags);return status;
@@ -241,7 +241,7 @@ static unsigned int dbc_tty_write_room(struct tty_struct *tty)unsigned int room;spin_lock_irqsave (&port->port_lock, flags); - room =kfifo_avail (&port->write_fifo); + room =kfifo_avail (&port->port.xmit_fifo);spin_unlock_irqrestore (&port->port_lock, flags);return room;
@@ -254,7 +254,7 @@ static unsigned int dbc_tty_chars_in_buffer(struct tty_struct *tty)unsigned int chars;spin_lock_irqsave (&port->port_lock, flags); - chars =kfifo_len (&port->write_fifo); + chars =kfifo_len (&port->port.xmit_fifo);spin_unlock_irqrestore (&port->port_lock, flags);return chars;
@@ -412,7 +412,8 @@ static int xhci_dbc_tty_register_device(struct xhci_dbc *dbc) goto err_idr; } - ret =kfifo_alloc (&port->write_fifo,DBC_WRITE_BUF_SIZE ,GFP_KERNEL ); + ret =kfifo_alloc (&port->port.xmit_fifo,DBC_WRITE_BUF_SIZE , +GFP_KERNEL );if (ret) goto err_exit_port;
@@ -441,7 +442,7 @@ static int xhci_dbc_tty_register_device(struct xhci_dbc *dbc)xhci_dbc_free_requests (&port->read_pool);xhci_dbc_free_requests (&port->write_pool); err_free_fifo: -kfifo_free (&port->write_fifo); +kfifo_free (&port->port.xmit_fifo); err_exit_port:idr_remove (&dbc_tty_minors, port->minor); err_idr:
@@ -466,7 +467,7 @@ static void xhci_dbc_tty_unregister_device(struct xhci_dbc *dbc)idr_remove (&dbc_tty_minors, port->minor);mutex_unlock (&dbc_tty_minors_lock); -kfifo_free (&port->write_fifo); +kfifo_free (&port->port.xmit_fifo);xhci_dbc_free_requests (&port->read_pool);xhci_dbc_free_requests (&port->read_queue);xhci_dbc_free_requests (&port->write_pool);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/137 xhci: dbc: honor usb transfer size boundaries.
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit 30c9ae5ece8ecd69d36e6912c2c0896418f2468c ]
Treat each completed full size write to /dev/ttyDBC0 as a separate usb transfer. Make sure the size of the TRBs matches the size of the tty write by first queuing as many max packet size TRBs as possible up to the last TRB which will be cut short to match the size of the tty write.
This solves an issue where userspace writes several transfers back to back via /dev/ttyDBC0 into a kfifo before dbgtty can find available request to turn that kfifo data into TRBs on the transfer ring.
The boundary between transfer was lost as xhci-dbgtty then turned everyting in the kfifo into as many 'max packet size' TRBs as possible.
DbC would then send more data to the host than intended for that transfer, causing host to issue a babble error.
Refuse to write more data to kfifo until previous tty write data is turned into properly sized TRBs with data size boundaries matching tty write size
--- drivers/usb/host/xhci-dbgcap.h | 1 + drivers/usb/host/xhci-dbgtty.c | 55 ++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 5 deletions(-)
drivers/usb/host/xhci-dbgcap.h +1 -0
@@ -108,6 +108,7 @@ struct dbc_port {struct tasklet_struct push;struct list_head write_pool; +unsigned int tx_boundary;bool registered; };
drivers/usb/host/xhci-dbgtty.c +50 -5
83 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/137 usb: gadget: f_uac2: Replace snprintf() with the safer scnprintf() variant
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lee Jones <[email protected]>
[ Upstream commit 60034e0aedf507888c4a880f57011bb7f5d7700c ]
There is a general misunderstanding amongst engineers that {v}snprintf() returns the length of the data *actually* encoded into the destination array. However, as per the C99 standard {v}snprintf() really returns the length of the data that *would have been* written if there were enough space for it. This misunderstanding has led to buffer-overruns in the past. It's generally considered safer to use the {v}scnprintf() variants in their place (or even sprintf() in simple cases). So let's do that.
Stable-dep-of: 9499327714de ("usb: gadget: f_uac2: fix return value for UAC2_ATTRIBUTE_STRING store")
--- drivers/usb/gadget/function/f_uac2.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_uac2.c +3 -3
@@ -2042,7 +2042,7 @@ static ssize_t f_uac2_opts_##name##_show(struct config_item *item, \int result; \ \mutex_lock (&opts->lock); \ - result =snprintf (page,sizeof (opts->name),"%s" , opts->name); \ + result =scnprintf (page,sizeof (opts->name),"%s" , opts->name); \mutex_unlock (&opts->lock); \ \return result; \
@@ -2060,7 +2060,7 @@ static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \ goto end; \ } \ \ - ret =snprintf (opts->name,min (sizeof (opts->name), len), \ + ret =scnprintf (opts->name,min (sizeof (opts->name), len), \"%s" , page); \ \ end: \
@@ -2178,7 +2178,7 @@ static struct usb_function_instance *afunc_alloc_inst(void) opts->req_number =UAC2_DEF_REQ_NUM ; opts->fb_max =FBACK_FAST_MAX ; -snprintf (opts->function_name,sizeof (opts->function_name),"Source/Sink" ); +scnprintf (opts->function_name,sizeof (opts->function_name),"Source/Sink" );return &opts->func_inst; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/137 usb: gadget: f_uac2: fix non-newline-terminated function name
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Keeping <[email protected]>
[ Upstream commit e60284b63245b84c3ae352427ed5ff8b79266b91 ]
Most writes to configfs handle an optional newline, but do not require it. By using the number of bytes written as the limit for scnprintf() it is guaranteed that the final character in the buffer will be overwritten.
This is expected if it is a newline but is undesirable when a string is written "as-is" (as libusbgx does, for example).
Update the store function to strip an optional newline, matching the behaviour of usb_string_copy().
Stable-dep-of: 9499327714de ("usb: gadget: f_uac2: fix return value for UAC2_ATTRIBUTE_STRING store")
--- drivers/usb/gadget/function/f_uac2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/gadget/function/f_uac2.c +4 -1
@@ -2060,7 +2060,10 @@ static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \ goto end; \ } \ \ - ret =scnprintf (opts->name,min (sizeof (opts->name), len), \ +if (len && page[len -1 ] =='\n' ) \ + len--; \ + \ + ret =scnprintf (opts->name,min (sizeof (opts->name), len +1 ), \"%s" , page); \ \ end: \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/137 usb: gadget: f_uac2: fix return value for UAC2_ATTRIBUTE_STRING store
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kevin Groeneveld <[email protected]>
[ Upstream commit 9499327714de7bc5cf6c792112c1474932d8ad31 ]
The configfs store callback should return the number of bytes consumed not the total number of bytes we actually stored. These could differ if for example the passed in string had a newline we did not store.
If the returned value does not match the number of bytes written the writer might assume a failure or keep trying to write the remaining bytes.
For example the following command will hang trying to write the final newline over and over again (tested on bash 2.05b):
echo foo > function_name
--- drivers/usb/gadget/function/f_uac2.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_uac2.c +3 -3
@@ -2052,7 +2052,7 @@ static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \ const char *page, size_t len) \ { \struct f_uac2_opts *opts =to_f_uac2_opts (item); \ -int ret =0 ; \ +int ret = len; \ \mutex_lock (&opts->lock); \if (opts->refcnt) { \
@@ -2063,8 +2063,8 @@ static ssize_t f_uac2_opts_##name##_store(struct config_item *item, \if (len && page[len -1 ] =='\n' ) \ len--; \ \ - ret =scnprintf (opts->name,min (sizeof (opts->name), len +1 ), \ -"%s" , page); \ +scnprintf (opts->name,min (sizeof (opts->name), len +1 ), \ +"%s" , page); \ \ end: \mutex_unlock (&opts->lock); \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/137 usb: gadget: Add function wakeup support
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Elson Roy Serrao <[email protected]>
[ Upstream commit f0db885fb05d35befa81896db6b19eb3ee9ccdfe ]
USB3.2 spec section 9.2.5.4 quotes that a function may signal that it wants to exit from Function Suspend by sending a Function Wake Notification to the host if it is enabled for function remote wakeup. Add an api in composite layer that can be used by the function drivers to support this feature. Also expose a gadget op so that composite layer can trigger a wakeup request to the UDC driver.
Stable-dep-of: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms")
--- drivers/usb/gadget/composite.c | 40 ++++++++++++++++++++++++++++++++++ include/linux/usb/composite.h | 6 +++++ include/linux/usb/gadget.h | 1 + 3 files changed, 47 insertions(+)
drivers/usb/gadget/composite.c +40 -0
@@ -490,6 +490,46 @@ int usb_interface_id(struct usb_configuration *config, }EXPORT_SYMBOL_GPL (usb_interface_id); +/** +* usb_func_wakeup - sends function wake notification to the host. +* @func: function that sends the remote wakeup notification. +* +* Applicable to devices operating at enhanced superspeed when usb +* functions are put in function suspend state and armed for function +* remote wakeup. On completion, function wake notification is sent. If +* the device is in low power state it tries to bring the device to active +* state before sending the wake notification. Since it is a synchronous +* call, caller must take care of not calling it in interrupt context. +* For devices operating at lower speeds returns negative errno. +* +* Returns zero on success, else negative errno. +*/ +int usb_func_wakeup (struct usb_function *func) +{ +struct usb_gadget *gadget = func->config->cdev->gadget; +int id; + +if (!gadget->ops->func_wakeup) +return -EOPNOTSUPP ; + +if (!func->func_wakeup_armed) { +ERROR (func->config->cdev,"not armed for func remote wakeup\n" ); +return -EINVAL ; + } + +for (id =0 ; id <MAX_CONFIG_INTERFACES ; id++) +if (func->config->interface[id] == func) +break ; + +if (id ==MAX_CONFIG_INTERFACES ) { +ERROR (func->config->cdev,"Invalid function\n" ); +return -EINVAL ; + } + +return gadget->ops->func_wakeup (gadget, id); +} +EXPORT_SYMBOL_GPL (usb_func_wakeup); +static u8 encode_bMaxPower (enum usb_device_speed speed,struct usb_configuration *c) {
include/linux/usb/composite.h +6 -0
@@ -149,6 +149,9 @@ struct usb_os_desc_table {* GetStatus() request when the recipient is Interface. * @func_suspend: callback to be called when * SetFeature(FUNCTION_SUSPEND) is reseived +* @func_suspended: Indicates whether the function is in function suspend state. +* @func_wakeup_armed: Indicates whether the function is armed by the host for +* wakeup signaling. * * A single USB function uses one or more interfaces, and should in most * cases support operation at both full and high speeds. Each function is
@@ -219,6 +222,8 @@ struct usb_function {int (*get_status)(struct usb_function *);int (*func_suspend)(struct usb_function *,u8 suspend_opt); +bool func_suspended; +bool func_wakeup_armed;/* private: */ /* internals */ struct list_head list;
@@ -240,6 +245,7 @@ int config_ep_by_speed_and_alt(struct usb_gadget *g, struct usb_function *f,int config_ep_by_speed (struct usb_gadget *g,struct usb_function *f,struct usb_ep *_ep); +int usb_func_wakeup (struct usb_function *func);#define MAX_CONFIG_INTERFACES 16/* arbitrary; max 255 */
include/linux/usb/gadget.h +1 -0
@@ -309,6 +309,7 @@ struct usb_udc;struct usb_gadget_ops {int (*get_frame)(struct usb_gadget *);int (*wakeup)(struct usb_gadget *); +int (*func_wakeup)(struct usb_gadget *gadget,int intf_id);int (*set_remote_wakeup)(struct usb_gadget *,int set);int (*set_selfpowered) (struct usb_gadget *,int is_selfpowered);int (*vbus_session) (struct usb_gadget *,int is_active);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/137 XHCI: Separate PORT and CAPs macros into dedicated file
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank Li <[email protected]>
[ Upstream commit c35ba0ac48355df1d11fcce85945f76c42d250ac ]
Split the PORT and CAPs macro definitions into a separate file to facilitate sharing with other files without the need to include the entire xhci.h.
Stable-dep-of: 705e3ce37bcc ("usb: dwc3: core: Fix system suspend on TI AM62 platforms")
--- drivers/usb/host/xhci-caps.h | 85 ++++++++++++ drivers/usb/host/xhci-port.h | 176 +++++++++++++++++++++++ drivers/usb/host/xhci.h | 262 +---------------------------------- 3 files changed, 264 insertions(+), 259 deletions(-) create mode 100644 drivers/usb/host/xhci-caps.h create mode 100644 drivers/usb/host/xhci-port.h
drivers/usb/host/xhci-caps.h new file +85 -0
@@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* hc_capbase bitmasks */ +/* bits 7:0 - how long is the Capabilities register */ +#define HC_LENGTH (p) XHCI_HC_LENGTH(p) +/* bits 31:16 */ +#define HC_VERSION (p) (((p) >> 16) & 0xffff) + +/* HCSPARAMS1 - hcs_params1 - bitmasks */ +/* bits 0:7, Max Device Slots */ +#define HCS_MAX_SLOTS (p) (((p) >> 0) & 0xff) +#define HCS_SLOTS_MASK 0xff +/* bits 8:18, Max Interrupters */ +#define HCS_MAX_INTRS (p) (((p) >> 8) & 0x7ff) +/* bits 24:31, Max Ports - max value is 0x7F = 127 ports */ +#define HCS_MAX_PORTS (p) (((p) >> 24) & 0x7f) + +/* HCSPARAMS2 - hcs_params2 - bitmasks */ +/* bits 0:3, frames or uframes that SW needs to queue transactions +* ahead of the HW to meet periodic deadlines */ +#define HCS_IST (p) (((p) >> 0) & 0xf) +/* bits 4:7, max number of Event Ring segments */ +#define HCS_ERST_MAX (p) (((p) >> 4) & 0xf) +/* bits 21:25 Hi 5 bits of Scratchpad buffers SW must allocate for the HW */ +/* bit 26 Scratchpad restore - for save/restore HW state - not used yet */ +/* bits 27:31 Lo 5 bits of Scratchpad buffers SW must allocate for the HW */ +#define HCS_MAX_SCRATCHPAD (p) ((((p) >> 16) & 0x3e0) | (((p) >> 27) & 0x1f)) + +/* HCSPARAMS3 - hcs_params3 - bitmasks */ +/* bits 0:7, Max U1 to U0 latency for the roothub ports */ +#define HCS_U1_LATENCY (p) (((p) >> 0) & 0xff) +/* bits 16:31, Max U2 to U0 latency for the roothub ports */ +#define HCS_U2_LATENCY (p) (((p) >> 16) & 0xffff) + +/* HCCPARAMS - hcc_params - bitmasks */ +/* true: HC can use 64-bit address pointers */ +#define HCC_64BIT_ADDR (p) ((p) & (1 << 0)) +/* true: HC can do bandwidth negotiation */ +#define HCC_BANDWIDTH_NEG (p) ((p) & (1 << 1)) +/* true: HC uses 64-byte Device Context structures +* FIXME 64-byte context structures aren't supported yet. +*/ +#define HCC_64BYTE_CONTEXT (p) ((p) & (1 << 2)) +/* true: HC has port power switches */ +#define HCC_PPC (p) ((p) & (1 << 3)) +/* true: HC has port indicators */ +#define HCS_INDICATOR (p) ((p) & (1 << 4)) +/* true: HC has Light HC Reset Capability */ +#define HCC_LIGHT_RESET (p) ((p) & (1 << 5)) +/* true: HC supports latency tolerance messaging */ +#define HCC_LTC (p) ((p) & (1 << 6)) +/* true: no secondary Stream ID Support */ +#define HCC_NSS (p) ((p) & (1 << 7)) +/* true: HC supports Stopped - Short Packet */ +#define HCC_SPC (p) ((p) & (1 << 9)) +/* true: HC has Contiguous Frame ID Capability */ +#define HCC_CFC (p) ((p) & (1 << 11)) +/* Max size for Primary Stream Arrays - 2^(n+1), where n is bits 12:15 */ +#define HCC_MAX_PSA (p) (1 << ((((p) >> 12) & 0xf) + 1)) +/* Extended Capabilities pointer from PCI base - section 5.3.6 */ +#define HCC_EXT_CAPS (p) XHCI_HCC_EXT_CAPS(p) + +#define CTX_SIZE (_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32) + +/* db_off bitmask - bits 0:1 reserved */ +#define DBOFF_MASK (~0x3) + +/* run_regs_off bitmask - bits 0:4 reserved */ +#define RTSOFF_MASK (~0x1f) + +/* HCCPARAMS2 - hcc_params2 - bitmasks */ +/* true: HC supports U3 entry Capability */ +#define HCC2_U3C (p) ((p) & (1 << 0)) +/* true: HC supports Configure endpoint command Max exit latency too large */ +#define HCC2_CMC (p) ((p) & (1 << 1)) +/* true: HC supports Force Save context Capability */ +#define HCC2_FSC (p) ((p) & (1 << 2)) +/* true: HC supports Compliance Transition Capability */ +#define HCC2_CTC (p) ((p) & (1 << 3)) +/* true: HC support Large ESIT payload Capability > 48k */ +#define HCC2_LEC (p) ((p) & (1 << 4)) +/* true: HC support Configuration Information Capability */ +#define HCC2_CIC (p) ((p) & (1 << 5)) +/* true: HC support Extended TBC Capability, Isoc burst count > 65535 */ +#define HCC2_ETC (p) ((p) & (1 << 6))
drivers/usb/host/xhci-port.h new file +176 -0
176 lines not on this page · raw message
drivers/usb/host/xhci.h +3 -259
280 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/137 usb: dwc3: core: Fix system suspend on TI AM62 platforms
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roger Quadros <[email protected]>
[ Upstream commit 705e3ce37bccdf2ed6f848356ff355f480d51a91 ]
Since commit 6d735722063a ("usb: dwc3: core: Prevent phy suspend during init"), system suspend is broken on AM62 TI platforms.
Before that commit, both DWC3_GUSB3PIPECTL_SUSPHY and DWC3_GUSB2PHYCFG_SUSPHY bits (hence forth called 2 SUSPHY bits) were being set during core initialization and even during core re-initialization after a system suspend/resume.
These bits are required to be set for system suspend/resume to work correctly on AM62 platforms.
Since that commit, the 2 SUSPHY bits are not set for DEVICE/OTG mode if gadget driver is not loaded and started.
For Host mode, the 2 SUSPHY bits are set before the first system suspend but get cleared at system resume during core re-init and are never set again.
This patch resovles these two issues by ensuring the 2 SUSPHY bits are set before system suspend and restored to the original state during system resume.
--- drivers/usb/dwc3/core.c | 19 +++++++++++++++++++ drivers/usb/dwc3/core.h | 3 +++ 2 files changed, 22 insertions(+)
drivers/usb/dwc3/core.c +19 -0
@@ -2131,6 +2131,11 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) {u32 reg; + dwc->susphy_state = (dwc3_readl (dwc->regs,DWC3_GUSB2PHYCFG (0 )) & +DWC3_GUSB2PHYCFG_SUSPHY ) || + (dwc3_readl (dwc->regs,DWC3_GUSB3PIPECTL (0 )) & +DWC3_GUSB3PIPECTL_SUSPHY ); +switch (dwc->current_dr_role) {case DWC3_GCTL_PRTCAP_DEVICE :if (pm_runtime_suspended (dwc->dev))
@@ -2178,6 +2183,15 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)break ; } +if (!PMSG_IS_AUTO (msg)) { +/* +* TI AM62 platform requires SUSPHY to be +* enabled for system suspend to work. +*/ +if (!dwc->susphy_state) +dwc3_enable_susphy (dwc, true); + } +return 0 ; }
@@ -2240,6 +2254,11 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)break ; } +if (!PMSG_IS_AUTO (msg)) { +/* restore SUSPHY state to that before system suspend. */ +dwc3_enable_susphy (dwc, dwc->susphy_state); + } +return 0 ; }
drivers/usb/dwc3/core.h +3 -0
@@ -1118,6 +1118,8 @@ struct dwc3_scratchpad_array {* @dis_metastability_quirk: set to disable metastability quirk. * @dis_split_quirk: set to disable split boundary. * @suspended: set to track suspend event due to U3/L2. +* @susphy_state: state of DWC3_GUSB2PHYCFG_SUSPHY + DWC3_GUSB3PIPECTL_SUSPHY +* before PM suspend. * @imod_interval: set the interrupt moderation interval in 250ns * increments or 0 to disable. * @max_cfg_eps: current max number of IN eps used across all USB configs.
@@ -1341,6 +1343,7 @@ struct dwc3 { unsigned dis_split_quirk:1; unsigned async_callbacks:1; unsigned suspended:1; + unsigned susphy_state:1;u16 imod_interval;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/137 tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 0388a152fc5544be82e736343496f99c4eef8d62 ]
Convert status parameter for ->dcd_change() and uart_handle_dcd_change() to bool which matches to how the parameter is used.
Rename status to active to better describe what the parameter means.
Stable-dep-of: 40d7903386df ("serial: imx: Update mctrl old_status on RTSD interrupt")
--- drivers/pps/clients/pps-ldisc.c | 6 +++--- drivers/tty/serial/serial_core.c | 8 ++++---- drivers/tty/serial/sunhv.c | 8 ++++---- include/linux/serial_core.h | 3 +-- include/linux/tty_ldisc.h | 4 ++-- 5 files changed, 14 insertions(+), 15 deletions(-)
drivers/pps/clients/pps-ldisc.c +3 -3
@@ -13,7 +13,7 @@#include <linux/pps_kernel.h> #include <linux/bug.h> -static void pps_tty_dcd_change (struct tty_struct *tty,unsigned int status) +static void pps_tty_dcd_change (struct tty_struct *tty,bool active) {struct pps_device *pps;struct pps_event_time ts;
@@ -29,11 +29,11 @@ static void pps_tty_dcd_change(struct tty_struct *tty, unsigned int status)return ;/* Now do the PPS event report */ -pps_event (pps, &ts, status ?PPS_CAPTUREASSERT : +pps_event (pps, &ts, active ?PPS_CAPTUREASSERT :PPS_CAPTURECLEAR ,NULL );dev_dbg (pps->dev,"PPS %s at %lu\n" , - status ?"assert" :"clear" , jiffies); + active ?"assert" :"clear" , jiffies); }static int (*alias_n_tty_open)(struct tty_struct *tty);
drivers/tty/serial/serial_core.c +4 -4
@@ -3290,11 +3290,11 @@ EXPORT_SYMBOL(uart_match_port);/** * uart_handle_dcd_change - handle a change of carrier detect state * @uport: uart_port structure for the open port -* @status: new carrier detect status, nonzero if active +* @active: new carrier detect status * * Caller must hold uport->lock. */ -void uart_handle_dcd_change (struct uart_port *uport,unsigned int status) +void uart_handle_dcd_change (struct uart_port *uport,bool active) {struct tty_port *port = &uport->state->port;struct tty_struct *tty = port->tty;
@@ -3306,7 +3306,7 @@ void uart_handle_dcd_change(struct uart_port *uport, unsigned int status) ld =tty_ldisc_ref (tty);if (ld) {if (ld->ops->dcd_change) - ld->ops->dcd_change (tty, status); + ld->ops->dcd_change (tty, active);tty_ldisc_deref (ld); } }
@@ -3314,7 +3314,7 @@ void uart_handle_dcd_change(struct uart_port *uport, unsigned int status) uport->icount.dcd++;if (uart_dcd_enabled (uport)) { -if (status) +if (active)wake_up_interruptible (&port->open_wait);else if (tty)tty_hangup (tty);
drivers/tty/serial/sunhv.c +4 -4
@@ -89,10 +89,10 @@ static int receive_chars_getchar(struct uart_port *port)if (c ==CON_HUP ) { hung_up =1 ; -uart_handle_dcd_change (port,0 ); +uart_handle_dcd_change (port, false); }else if (hung_up) { hung_up =0 ; -uart_handle_dcd_change (port,1 ); +uart_handle_dcd_change (port, true); }if (port->state ==NULL ) {
@@ -135,7 +135,7 @@ static int receive_chars_read(struct uart_port *port) bytes_read =1 ; }else if (stat ==CON_HUP ) { hung_up =1 ; -uart_handle_dcd_change (port,0 ); +uart_handle_dcd_change (port, false);continue ; }else {/* HV_EWOULDBLOCK, etc. */
@@ -145,7 +145,7 @@ static int receive_chars_read(struct uart_port *port)if (hung_up) { hung_up =0 ; -uart_handle_dcd_change (port,1 ); +uart_handle_dcd_change (port, true); }if (port->sysrq !=0 && *con_read_page) {
include/linux/serial_core.h +1 -2
@@ -890,8 +890,7 @@ static inline bool uart_softcts_mode(struct uart_port *uport)* The following are helper functions for the low level drivers. */ -extern void uart_handle_dcd_change (struct uart_port *uport, -unsigned int status); +extern void uart_handle_dcd_change (struct uart_port *uport,bool active);extern void uart_handle_cts_change (struct uart_port *uport,unsigned int status);
include/linux/tty_ldisc.h +2 -2
@@ -170,7 +170,7 @@ int ldsem_down_write_nested(struct ld_semaphore *sem, int subclass,* send, please arise a tasklet or workqueue to do the real data transfer. * Do not send data in this hook, it may lead to a deadlock. * -* @dcd_change: [DRV] ``void ()(struct tty_struct *tty, unsigned int status)`` +* @dcd_change: [DRV] ``void ()(struct tty_struct *tty, bool active)`` * * Tells the discipline that the DCD pin has changed its status. Used * exclusively by the %N_PPS (Pulse-Per-Second) line discipline.
@@ -238,7 +238,7 @@ struct tty_ldisc_ops {void (*receive_buf)(struct tty_struct *tty,const unsigned char *cp,const char *fp,int count);void (*write_wakeup)(struct tty_struct *tty); -void (*dcd_change)(struct tty_struct *tty,unsigned int status); +void (*dcd_change)(struct tty_struct *tty,bool active);int (*receive_buf2)(struct tty_struct *tty,const unsigned char *cp,const char *fp,int count); void (*lookahead_buf)(struct tty_struct *tty, const unsigned char *cp,
Signature · 1 line
2.43.0
Re: [PATCH 6.1 068/137] tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
Quoted 12 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit
0388a152fc5544be82e736343496f99c4eef8d62]Convert status parameter for ->dcd_change() and
uart_handle_dcd_change()to bool which matches to how the parameter is used.
Quoted 8 lines
Rename status to active to better describe what the parameter means.
Acked-by Rodolfo Giometti <[email protected]>Reviewed-by Jiri Slaby <[email protected]>Signed-off-by Ilpo Järvinen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Stable-dep-of:
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")
As I wrote earlier, why is this Stable-dep-of that one?
thanks,
Signature · 2 lines
js suse labs
Sasha Levin
maintainerRe: [PATCH 6.1 068/137] tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
Quoted 15 lines · Jiri Slaby
Quoted 14 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit
0388a152fc5544be82e736343496f99c4eef8d62]Convert status parameter for ->dcd_change() and
uart_handle_dcd_change()to bool which matches to how the parameter is used.Rename status to active to better describe what the parameter means.
Quoted 8 lines
Quoted 6 lines
Acked-by Rodolfo Giometti <[email protected]>Reviewed-by Jiri Slaby <[email protected]>Signed-off-by Ilpo Järvinen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Stable-dep-of:
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")As I wrote earlier, why is this Stable-dep-of that one?
Here's the dependency chain:
40d7903386df ("serial: imx: Update mctrl old_status on RTSD interrupt") 968d64578ec9 ("serial: Make uart_handle_cts_change() status param bool active") 0388a152fc55 ("tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active")
If you go to 6.1.y, and try to apply them in that order you'll see that it applies cleanly. If you try to apply just the last one you'll hit a conflict.
Signature · 2 lines
Thanks, Sasha
Re: [PATCH 6.1 068/137] tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
Quoted 27 lines · Sasha Levin
Quoted 15 lines · Jiri Slaby
Quoted 14 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit
0388a152fc5544be82e736343496f99c4eef8d62]Convert status parameter for ->dcd_change() and
uart_handle_dcd_change()to bool which matches to how the parameter is used.Rename status to active to better describe what the parameter means.
Quoted 8 lines
Quoted 6 lines
Acked-by Rodolfo Giometti <[email protected]>Reviewed-by Jiri Slaby <[email protected]>Signed-off-by Ilpo Järvinen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Stable-dep-of:
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")As I wrote earlier, why is this Stable-dep-of that one?
Here's the dependency chain:
Quoted 7 lines
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")968d64578ec9("serial: Makeuart_handle_cts_change()status param bool active")0388a152fc55("tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active")If you go to 6.1.y, and try to apply them in that order you'll see that it applies cleanly. If you try to apply just the last one you'll hit a conflict.
Oh, well, so instead of taking two irrelevant and potentially dangerous patches (0388a152fc55 + 968d64578ec9), this simple context fix should have been in place:
- uart_handle_cts_change(&sport->port, !!usr1);
+ uart_handle_cts_change(&sport->port, usr1);
Right?
thanks,
Signature · 2 lines
js suse labs
Sasha Levin
maintainerRe: [PATCH 6.1 068/137] tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active
Quoted 41 lines · Jiri Slaby
Quoted 27 lines · Sasha Levin
Quoted 15 lines · Jiri Slaby
Quoted 14 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit
0388a152fc5544be82e736343496f99c4eef8d62]Convert status parameter for ->dcd_change() and
uart_handle_dcd_change()to bool which matches to how the parameter is used.Rename status to active to better describe what the parameter means.
Quoted 8 lines
Quoted 6 lines
Acked-by Rodolfo Giometti <[email protected]>Reviewed-by Jiri Slaby <[email protected]>Signed-off-by Ilpo Järvinen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Stable-dep-of:
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")As I wrote earlier, why is this Stable-dep-of that one?
Here's the dependency chain:
Quoted 8 lines
40d7903386df("serial: imx: Update mctrlold_statuson RTSD interrupt")968d64578ec9("serial: Makeuart_handle_cts_change()status param bool active")0388a152fc55("tty/serial: Make ->dcd_change()+uart_handle_dcd_change() status bool active")If you go to 6.1.y, and try to apply them in that order you'll see that it applies cleanly. If you try to apply just the last one you'll hit a conflict.
Oh, well, so instead of taking two irrelevant and potentially dangerous patches (
0388a152fc55+968d64578ec9), this simple context fix should have been in place:(quoted diff) +1
-1- uart_handle_cts_change(&sport->port, !!usr1); + uart_handle_cts_change(&sport->port, usr1);
Quoted 1 line
Right?
No :)
1. If we make changes like the above, future patches that touch that code simply fail to backport, no one cares enough to fix them up, and older trees stop getting those fixes. Staying aligned with upstream means less work in the longer term.
2. Is that everything that's needed for the fix? Maybe? I don't know... I'm not a TTY expert, I'm not sure that that fix is correct, nor do I have no way to test that. Do you really trust me that much around your subsystem? :)
3. We simply don't scale to doing this for every conflict over the (too many) trees we support. At some point we need to trust our automation, CI, and testers to catch issues with the "extra" patches we backport.
Signature · 2 lines
Thanks, Sasha
Greg Kroah-Hartman
maintainerPATCH 69/137 serial: Make uart_handle_cts_change() status param bool active
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 968d64578ec92968e8c79d766eb966efd1f68d7e ]
Convert uart_handle_cts_change() to bool which is more appropriate than unsigned int.
Rename status to active to better describe what the parameter means. While at it, make the comment about the active parameter easier to parse.
Cleanup callsites from operations that are not necessary with bool.
Stable-dep-of: 40d7903386df ("serial: imx: Update mctrl old_status on RTSD interrupt")
--- drivers/tty/serial/imx.c | 2 +- drivers/tty/serial/max3100.c | 2 +- drivers/tty/serial/max310x.c | 3 +-- drivers/tty/serial/serial_core.c | 8 ++++---- include/linux/serial_core.h | 3 +-- 5 files changed, 8 insertions(+), 10 deletions(-)
drivers/tty/serial/imx.c +1 -1
@@ -801,7 +801,7 @@ static irqreturn_t __imx_uart_rtsint(int irq, void *dev_id)imx_uart_writel (sport,USR1_RTSD ,USR1 ); usr1 =imx_uart_readl (sport,USR1 ) &USR1_RTSS ; -uart_handle_cts_change (&sport->port, !!usr1); +uart_handle_cts_change (&sport->port, usr1);wake_up_interruptible (&sport->port.state->port.delta_msr_wait);return IRQ_HANDLED ;
drivers/tty/serial/max3100.c +1 -1
@@ -250,7 +250,7 @@ static int max3100_handlerx_unlocked(struct max3100_port *s, u16 rx) cts = (rx &MAX3100_CTS ) >0 ;if (s->cts != cts) { s->cts = cts; -uart_handle_cts_change (&s->port, cts ?TIOCM_CTS :0 ); +uart_handle_cts_change (&s->port, cts); }return ret;
drivers/tty/serial/max310x.c +1 -2
@@ -843,8 +843,7 @@ static irqreturn_t max310x_port_irq(struct max310x_port *s, int portno)if (ists &MAX310X_IRQ_CTS_BIT ) { lsr =max310x_port_read (port,MAX310X_LSR_IRQSTS_REG ); -uart_handle_cts_change (port, - !!(lsr &MAX310X_LSR_CTS_BIT )); +uart_handle_cts_change (port, lsr &MAX310X_LSR_CTS_BIT ); }if (rxlen)max310x_handle_rx (port, rxlen);
drivers/tty/serial/serial_core.c +4 -4
@@ -3325,11 +3325,11 @@ EXPORT_SYMBOL_GPL(uart_handle_dcd_change);/** * uart_handle_cts_change - handle a change of clear-to-send state * @uport: uart_port structure for the open port -* @status: new clear to send status, nonzero if active +* @active: new clear-to-send status * * Caller must hold uport->lock. */ -void uart_handle_cts_change (struct uart_port *uport,unsigned int status) +void uart_handle_cts_change (struct uart_port *uport,bool active) {lockdep_assert_held_once (&uport->lock);
@@ -3337,13 +3337,13 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)if (uart_softcts_mode (uport)) {if (uport->hw_stopped) { -if (status) { +if (active) { uport->hw_stopped =0 ; uport->ops->start_tx (uport);uart_write_wakeup (uport); } }else { -if (!status) { +if (!active) { uport->hw_stopped =1 ; uport->ops->stop_tx (uport); }
include/linux/serial_core.h +1 -2
@@ -891,8 +891,7 @@ static inline bool uart_softcts_mode(struct uart_port *uport)*/ extern void uart_handle_dcd_change (struct uart_port *uport,bool active); -extern void uart_handle_cts_change (struct uart_port *uport, -unsigned int status); +extern void uart_handle_cts_change (struct uart_port *uport,bool active);extern void uart_insert_char (struct uart_port *port,unsigned int status,unsigned int overrun,unsigned int ch,unsigned int flag);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/137 serial: imx: Update mctrl old_status on RTSD interrupt
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Vasut <[email protected]>
[ Upstream commit 40d7903386df4d18f04d90510ba90eedee260085 ]
When sending data using DMA at high baudrate (4 Mbdps in local test case) to a device with small RX buffer which keeps asserting RTS after every received byte, it is possible that the iMX UART driver would not recognize the falling edge of RTS input signal and get stuck, unable to transmit any more data.
This condition happens when the following sequence of events occur:
- imx_uart_mctrl_check() is called at some point and takes a snapshot of UART control signal status into sport->old_status using imx_uart_get_hwmctrl(). The RTSS/TIOCM_CTS bit is of interest here (*).
- DMA transfer occurs, the remote device asserts RTS signal after each byte. The i.MX UART driver recognizes each such RTS signal change, raises an interrupt with USR1 register RTSD bit set, which leads to invocation of __imx_uart_rtsint(), which calls uart_handle_cts_change().
- If the RTS signal is deasserted, uart_handle_cts_change() clears
port->hw_stopped and unblocks the port for further data transfers.
- If the RTS is asserted, uart_handle_cts_change() sets port->hw_stopped and blocks the port for further data transfers. This may occur as the last interrupt of a transfer, which means port->hw_stopped remains set and the port remains blocked (**).
- Any further data transfer attempts will trigger imx_uart_mctrl_check(), which will read current status of UART control signals by calling imx_uart_get_hwmctrl() (***) and compare it with sport->old_status .
- If current status differs from sport->old_status for RTS signal, uart_handle_cts_change() is called and possibly unblocks the port by clearing port->hw_stopped .
- If current status does not differ from sport->old_status for RTS signal, no action occurs. This may occur in case prior snapshot (*) was taken before any transfer so the RTS is deasserted, current snapshot (***) was taken after a transfer and therefore RTS is deasserted again, which means current status and sport->old_status are identical. In case (**) triggered when RTS got asserted, and made port->hw_stopped set, the port->hw_stopped will remain set because no change on RTS line is recognized by this driver and uart_handle_cts_change() is not called from here to unblock the port->hw_stopped.
Update sport->old_status in __imx_uart_rtsint() accordingly to make imx_uart_mctrl_check() detect such RTS change. Note that TIOCM_CAR and TIOCM_RI bits in sport->old_status do not suffer from this problem.
--- drivers/tty/serial/imx.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/tty/serial/imx.c +15 -0
@@ -801,6 +801,21 @@ static irqreturn_t __imx_uart_rtsint(int irq, void *dev_id)imx_uart_writel (sport,USR1_RTSD ,USR1 ); usr1 =imx_uart_readl (sport,USR1 ) &USR1_RTSS ; +/* +* Update sport->old_status here, so any follow-up calls to +* imx_uart_mctrl_check() will be able to recognize that RTS +* state changed since last imx_uart_mctrl_check() call. +* +* In case RTS has been detected as asserted here and later on +* deasserted by the time imx_uart_mctrl_check() was called, +* imx_uart_mctrl_check() can detect the RTS state change and +* trigger uart_handle_cts_change() to unblock the port for +* further TX transfers. +*/ +if (usr1 &USR1_RTSS ) + sport->old_status |=TIOCM_CTS ; +else + sport->old_status &= ~TIOCM_CTS ;uart_handle_cts_change (&sport->port, usr1);wake_up_interruptible (&sport->port.state->port.delta_msr_wait);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/137 block, bfq: fix procress reference leakage for bfqq in merge chain
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu Kuai <[email protected]>
[ Upstream commit 73aeab373557fa6ee4ae0b742c6211ccd9859280 ]
Original state:
Process 1 Process 2 Process 3 Process 4
(BIC1) (BIC2) (BIC3) (BIC4)
Λ | | |
\--------------\ \-------------\ \-------------\|
V V V
bfqq1--------->bfqq2---------->bfqq3----------->bfqq4
ref 0 1 2 4
After commit 0e456dba86c7 ("block, bfq: choose the last bfqq from merge chain in bfq_setup_cooperator()"), if P1 issues a new IO:
Without the patch:
Process 1 Process 2 Process 3 Process 4
(BIC1) (BIC2) (BIC3) (BIC4)
Λ | | |
\------------------------------\ \-------------\|
V V
bfqq1--------->bfqq2---------->bfqq3----------->bfqq4
ref 0 0 2 4
bfqq3 will be used to handle IO from P1, this is not expected, IO should be redirected to bfqq4;
With the patch:
-------------------------------------------
| |
Process 1 Process 2 Process 3 | Process 4
(BIC1) (BIC2) (BIC3) | (BIC4)
| | | |
\-------------\ \-------------\|
V V
bfqq1--------->bfqq2---------->bfqq3----------->bfqq4
ref 0 0 2 4
IO is redirected to bfqq4, however, procress reference of bfqq3 is still 2, while there is only P2 using it.
Fix the problem by calling bfq_merge_bfqqs() for each bfqq in the merge chain. Also change bfqq_merge_bfqqs() to return new_bfqq to simplify code.
--- block/bfq-iosched.c | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-)
block/bfq-iosched.c +17 -20
@@ -3117,10 +3117,12 @@ void bfq_release_process_ref(struct bfq_data *bfqd, struct bfq_queue *bfqq)bfq_put_queue (bfqq); } -static void -bfq_merge_bfqqs (struct bfq_data *bfqd,struct bfq_io_cq *bic, -struct bfq_queue *bfqq,struct bfq_queue *new_bfqq) +static struct bfq_queue *bfq_merge_bfqqs (struct bfq_data *bfqd, +struct bfq_io_cq *bic, +struct bfq_queue *bfqq) { +struct bfq_queue *new_bfqq = bfqq->new_bfqq; +bfq_log_bfqq (bfqd, bfqq,"merging with queue %lu" , (unsigned long )new_bfqq->pid);/* Save weight raising and idle window of the merged queues */
@@ -3214,6 +3216,8 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic,bfq_reassign_last_bfqq (bfqq, new_bfqq);bfq_release_process_ref (bfqd, bfqq); + +return new_bfqq; } static bool bfq_allow_bio_merge(struct request_queue *q, struct request *rq,
@@ -3249,14 +3253,8 @@ static bool bfq_allow_bio_merge(struct request_queue *q, struct request *rq,* fulfilled, i.e., bic can be redirected to new_bfqq * and bfqq can be put. */ -bfq_merge_bfqqs (bfqd, bfqd->bio_bic, bfqq, - new_bfqq); -/* -* If we get here, bio will be queued into new_queue, -* so use new_bfqq to decide whether bio and rq can be -* merged. -*/ - bfqq = new_bfqq; +while (bfqq != new_bfqq) + bfqq =bfq_merge_bfqqs (bfqd, bfqd->bio_bic, bfqq);/* * Change also bqfd->bio_bfqq, as
@@ -5616,9 +5614,7 @@ bfq_do_early_stable_merge(struct bfq_data *bfqd, struct bfq_queue *bfqq,* state before killing it. */ bfqq->bic = bic; -bfq_merge_bfqqs (bfqd, bic, bfqq, new_bfqq); - -return new_bfqq; +return bfq_merge_bfqqs (bfqd, bic, bfqq); }/*
@@ -6066,6 +6062,7 @@ static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)bool waiting, idle_timer_disabled = false;if (new_bfqq) { +struct bfq_queue *old_bfqq = bfqq;/* * Release the request's reference to the old bfqq * and make sure one is taken to the shared queue.
@@ -6081,18 +6078,18 @@ static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)* then complete the merge and redirect it to * new_bfqq. */ -if (bic_to_bfqq (RQ_BIC (rq),1 ) == bfqq) -bfq_merge_bfqqs (bfqd,RQ_BIC (rq), - bfqq, new_bfqq); +if (bic_to_bfqq (RQ_BIC (rq),1 ) == bfqq) { +while (bfqq != new_bfqq) + bfqq =bfq_merge_bfqqs (bfqd,RQ_BIC (rq), bfqq); + } -bfq_clear_bfqq_just_created (bfqq); +bfq_clear_bfqq_just_created (old_bfqq);/* * rq is about to be enqueued into new_bfqq, * release rq reference on bfqq */ -bfq_put_queue (bfqq); +bfq_put_queue (old_bfqq); rq->elv.priv[1 ] = new_bfqq; - bfqq = new_bfqq; }bfq_update_io_thinktime (bfqd, bfqq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/137 exec: dont WARN for racy path_noexec check
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Guzik <[email protected]>
[ Upstream commit 0d196e7589cefe207d5d41f37a0a28a1fdeeb7c6 ]
Both i_mode and noexec checks wrapped in WARN_ON stem from an artifact of the previous implementation. They used to legitimately check for the condition, but that got moved up in two commits:633fb6ac3980 ("exec: move S_ISREG() check earlier") 0fd338b2d2cd ("exec: move path_noexec() check earlier")
Instead of being removed said checks are WARN_ON'ed instead, which has some debug value.
However, the spurious path_noexec check is racy, resulting in unwarranted warnings should someone race with setting the noexec flag.
One can note there is more to perm-checking whether execve is allowed and none of the conditions are guaranteed to still hold after they were tested for.
Additionally this does not validate whether the code path did any perm checking to begin with -- it will pass if the inode happens to be regular.
Keep the redundant path_noexec() check even though it's mindless nonsense checking for guarantee that isn't given so drop the WARN.
Reword the commentary and do small tidy ups while here.
--- fs/exec.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-)
fs/exec.c +9 -12
@@ -141,13 +141,11 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) goto out;/* -* may_open() has already checked for this, so it should be -* impossible to trip now. But we need to be extra cautious -* and check again at the very end too. +* Check do_open_execat() for an explanation. */ error = -EACCES ; -if (WARN_ON_ONCE (!S_ISREG (file_inode (file)->i_mode) || -path_noexec (&file->f_path))) +if (WARN_ON_ONCE (!S_ISREG (file_inode (file)->i_mode)) || +path_noexec (&file->f_path)) goto exit;fsnotify_open (file);
@@ -927,16 +925,16 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) file =do_filp_open (fd, name, &open_exec_flags);if (IS_ERR (file)) - goto out; +return file;/* -* may_open() has already checked for this, so it should be -* impossible to trip now. But we need to be extra cautious -* and check again at the very end too. +* In the past the regular type check was here. It moved to may_open() in +* 633fb6ac3980 ("exec: move S_ISREG() check earlier"). Since then it is +* an invariant that all non-regular files error out before we get here. */ err = -EACCES ; -if (WARN_ON_ONCE (!S_ISREG (file_inode (file)->i_mode) || -path_noexec (&file->f_path))) +if (WARN_ON_ONCE (!S_ISREG (file_inode (file)->i_mode)) || +path_noexec (&file->f_path)) goto exit; err =deny_write_access (file);
@@ -946,7 +944,6 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags)if (name->name[0 ] !='\0' )fsnotify_open (file); -out:return file; exit:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 73/137 fs/ntfs3: Add more attributes checks in mi_enum_attr()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Komarov <[email protected]>
[ Upstream commit 013ff63b649475f0ee134e2c8d0c8e65284ede50 ]
CVE: CVE-2023-45896
--- fs/ntfs3/record.c | 67 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 13 deletions(-)
fs/ntfs3/record.c +54 -13
@@ -193,8 +193,9 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr) {const struct MFT_REC *rec = mi->mrec;u32 used =le32_to_cpu (rec->used); -u32 t32, off, asize; +u32 t32, off, asize, prev_type;u16 t16; +u64 data_size, alloc_size, tot_size;if (!attr) {u32 total =le32_to_cpu (rec->total);
@@ -213,6 +214,7 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr)if (!is_rec_inuse (rec))return NULL ; + prev_type =0 ; attr =Add2Ptr (rec, off); }else {/* Check if input attr inside record. */
@@ -226,6 +228,11 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr)return NULL ; } +/* Overflow check. */ +if (off + asize < off) +return NULL ; + + prev_type =le32_to_cpu (attr->type); attr =Add2Ptr (attr, asize); off += asize; }
@@ -245,7 +252,11 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr)/* 0x100 is last known attribute for now. */ t32 =le32_to_cpu (attr->type); -if ((t32 &0xf ) || (t32 >0x100 )) +if (!t32 || (t32 &0xf ) || (t32 >0x100 )) +return NULL ; + +/* attributes in record must be ordered by type */ +if (t32 < prev_type)return NULL ;/* Check overflow and boundary. */
@@ -254,16 +265,15 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr)/* Check size of attribute. */ if (!attr->non_res) { +/* Check resident fields. */ if (asize <SIZEOF_RESIDENT )return NULL ; t16 =le16_to_cpu (attr->res.data_off); -if (t16 > asize)return NULL ; - t32 =le32_to_cpu (attr->res.data_size); -if (t16 + t32 > asize) +if (t16 +le32_to_cpu (attr->res.data_size) > asize)return NULL ; if (attr->name_len &&
@@ -274,21 +284,52 @@ struct ATTRIB *mi_enum_attr(struct mft_inode *mi, struct ATTRIB *attr)return attr; } -/* Check some nonresident fields. */ -if (attr->name_len && -le16_to_cpu (attr->name_off) +sizeof (short ) * attr->name_len > -le16_to_cpu (attr->nres.run_off)) { +/* Check nonresident fields. */ +if (attr->non_res !=1 )return NULL ; - } -if (attr->nres.svcn || !is_attr_ext (attr)) { + t16 =le16_to_cpu (attr->nres.run_off); +if (t16 > asize) +return NULL ; + + t32 =sizeof (short ) * attr->name_len; +if (t32 &&le16_to_cpu (attr->name_off) + t32 > t16) +return NULL ; + +/* Check start/end vcn. */ +if (le64_to_cpu (attr->nres.svcn) >le64_to_cpu (attr->nres.evcn) +1 ) +return NULL ; + + data_size =le64_to_cpu (attr->nres.data_size); +if (le64_to_cpu (attr->nres.valid_size) > data_size) +return NULL ; + + alloc_size =le64_to_cpu (attr->nres.alloc_size); +if (data_size > alloc_size) +return NULL ; + + t32 = mi->sbi->cluster_mask; +if (alloc_size & t32) +return NULL ; + +if (!attr->nres.svcn &&is_attr_ext (attr)) { +/* First segment of sparse/compressed attribute */ +if (asize +8 <SIZEOF_NONRESIDENT_EX ) +return NULL ; + + tot_size =le64_to_cpu (attr->nres.total_size); +if (tot_size & t32) +return NULL ; + +if (tot_size > alloc_size) +return NULL ; + }else {if (asize +8 <SIZEOF_NONRESIDENT )return NULL ;if (attr->nres.c_unit)return NULL ; - }else if (asize +8 <SIZEOF_NONRESIDENT_EX ) -return NULL ; + }return attr; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/137 drm/vboxvideo: Replace fake VLA at end of vbva_mouse_pointer_shape with real VLA
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit d92b90f9a54d9300a6e883258e79f36dab53bfae ]
Replace the fake VLA at end of the vbva_mouse_pointer_shape shape with a real VLA to fix a "memcpy: detected field-spanning write error" warning:
[ 13.319813] memcpy: detected field-spanning write (size 16896) of single field "p->data" at drivers/gpu/drm/vboxvideo/hgsmi_base.c:154 (size 4) [ 13.319841] WARNING: CPU: 0 PID: 1105 at drivers/gpu/drm/vboxvideo/hgsmi_base.c:154 hgsmi_update_pointer_shape+0x192/0x1c0 [vboxvideo] [ 13.320038] Call Trace: [ 13.320173] hgsmi_update_pointer_shape [vboxvideo] [ 13.320184] vbox_cursor_atomic_update [vboxvideo]
Note as mentioned in the added comment it seems the original length calculation for the allocated and send hgsmi buffer is 4 bytes too large. Changing this is not the goal of this patch, so this behavior is kept.
--- drivers/gpu/drm/vboxvideo/hgsmi_base.c | 10 +++++++++- drivers/gpu/drm/vboxvideo/vboxvideo.h | 4 +--- 2 files changed, 10 insertions(+), 4 deletions(-)
drivers/gpu/drm/vboxvideo/hgsmi_base.c +9 -1
@@ -139,7 +139,15 @@ int hgsmi_update_pointer_shape(struct gen_pool *ctx, u32 flags, flags |=VBOX_MOUSE_POINTER_VISIBLE ; } - p =hgsmi_buffer_alloc (ctx,sizeof (*p) + pixel_len,HGSMI_CH_VBVA , +/* +* The 4 extra bytes come from switching struct vbva_mouse_pointer_shape +* from having a 4 bytes fixed array at the end to using a proper VLA +* at the end. These 4 extra bytes were not subtracted from sizeof(*p) +* before the switch to the VLA, so this way the behavior is unchanged. +* Chances are these 4 extra bytes are not necessary but they are kept +* to avoid regressions. +*/ + p =hgsmi_buffer_alloc (ctx,sizeof (*p) + pixel_len +4 ,HGSMI_CH_VBVA ,VBVA_MOUSE_POINTER_SHAPE );if (!p)return -ENOMEM ;
drivers/gpu/drm/vboxvideo/vboxvideo.h +1 -3
@@ -351,10 +351,8 @@ struct vbva_mouse_pointer_shape {* Bytes in the gap between the AND and the XOR mask are undefined. * XOR mask scanlines have no gap between them and size of XOR mask is: * xor_len = width * 4 * height. -* -* Preallocate 4 bytes for accessing actual data as p->data. */ -u8 data[4 ]; +u8 data[]; } __packed;/* pointer is visible */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/137 ASoC: codecs: lpass-rx-macro: add missing CDC_RX_BCL_VBAT_RF_PROC2 to default regs values
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Klimov <[email protected]>
[ Upstream commit e249786b2188107a7c50e7174d35f955a60988a1 ]
CDC_RX_BCL_VBAT_RF_PROC1 is listed twice and its default value is 0x2a which is overwriten by its next occurence in rx_defaults[]. The second one should be missing CDC_RX_BCL_VBAT_RF_PROC2 instead and its default value is expected 0x0.
--- sound/soc/codecs/lpass-rx-macro.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/lpass-rx-macro.c +1 -1
@@ -909,7 +909,7 @@ static const struct reg_default rx_defaults[] = { { CDC_RX_BCL_VBAT_PK_EST2, 0x01 }, { CDC_RX_BCL_VBAT_PK_EST3, 0x40 }, { CDC_RX_BCL_VBAT_RF_PROC1, 0x2A }, - { CDC_RX_BCL_VBAT_RF_PROC1, 0x00 }, + { CDC_RX_BCL_VBAT_RF_PROC2, 0x00 }, { CDC_RX_BCL_VBAT_TAC1, 0x00 }, { CDC_RX_BCL_VBAT_TAC2, 0x18 }, { CDC_RX_BCL_VBAT_TAC3, 0x18 },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/137 ASoC: fsl_sai: Enable FIFO continue on error FCONT bit
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 72455e33173c1a00c0ce93d2b0198eb45d5f4195 ]
FCONT=1 means On FIFO error, the SAI will continue from the same word that caused the FIFO error to set after the FIFO warning flag has been cleared.
Set FCONT bit in control register to avoid the channel swap issue after SAI xrun.
--- sound/soc/fsl/fsl_sai.c | 5 ++++- sound/soc/fsl/fsl_sai.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
sound/soc/fsl/fsl_sai.c +4 -1
@@ -604,6 +604,9 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream, val_cr4 |=FSL_SAI_CR4_FRSZ (slots); +/* Set to avoid channel swap */ + val_cr4 |=FSL_SAI_CR4_FCONT ; +/* Set to output mode to avoid tri-stated data pins */ if (tx) val_cr4 |=FSL_SAI_CR4_CHMOD ;
@@ -690,7 +693,7 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,regmap_update_bits (sai->regmap,FSL_SAI_xCR4 (tx, ofs),FSL_SAI_CR4_SYWD_MASK |FSL_SAI_CR4_FRSZ_MASK | -FSL_SAI_CR4_CHMOD_MASK , +FSL_SAI_CR4_CHMOD_MASK |FSL_SAI_CR4_FCONT_MASK , val_cr4); regmap_update_bits(sai->regmap, FSL_SAI_xCR5(tx, ofs), FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
sound/soc/fsl/fsl_sai.h +1 -0
@@ -137,6 +137,7 @@/* SAI Transmit and Receive Configuration 4 Register */ +#define FSL_SAI_CR4_FCONT_MASK BIT(28)#define FSL_SAI_CR4_FCONT BIT(28)#define FSL_SAI_CR4_FCOMB_SHIFT BIT(26)#define FSL_SAI_CR4_FCOMB_SOFT BIT(27)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/137 arm64: Force position-independent veneers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 9abe390e689f4f5c23c5f507754f8678431b4f72 ]
Certain portions of code always need to be position-independent regardless of CONFIG_RELOCATABLE, including code which is executed in an idmap or which is executed before relocations are applied. In some kernel configurations the LLD linker generates position-dependent veneers for such code, and when executed these result in early boot-time failures.
Marc Zyngier encountered a boot failure resulting from this when building a (particularly cursed) configuration with LLVM, as he reported to the list:
https://lore.kernel.org/linux-arm-kernel/[email protected]/
In Marc's kernel configuration, the .head.text and .rodata.text sections end up more than 128MiB apart, requiring a veneer to branch between the two:
| [mark@lakrids:~/src/linux]% usekorg 14.1.0 aarch64-linux-objdump -t vmlinux | grep -w _text | ffff800080000000 g .head.text 0000000000000000 _text | [mark@lakrids:~/src/linux]% usekorg 14.1.0 aarch64-linux-objdump -t vmlinux | grep -w primary_entry | ffff8000889df0e0 g .rodata.text 000000000000006c primary_entry,
... consequently, LLD inserts a position-dependent veneer for the branch from _stext (in .head.text) to primary_entry (in .rodata.text):
| ffff800080000000 <_text>: | ffff800080000000: fa405a4d ccmp x18, #0x0, #0xd, pl // pl = nfrst | ffff800080000004: 14003fff b ffff800080010000 <__AArch64AbsLongThunk_primary_entry> ... | ffff800080010000 <__AArch64AbsLongThunk_primary_entry>: | ffff800080010000: 58000050 ldr x16, ffff800080010008 <__AArch64AbsLongThunk_primary_entry+0x8> | ffff800080010004: d61f0200 br x16 | ffff800080010008: 889df0e0 .word 0x889df0e0 | ffff80008001000c: ffff8000 .word 0xffff8000
... and as this is executed early in boot before the kernel is mapped in TTBR1 this results in a silent boot failure.
Fix this by passing '--pic-veneer' to the linker, which will cause the linker to use position-independent veneers, e.g.
| ffff800080000000 <_text>: | ffff800080000000: fa405a4d ccmp x18, #0x0, #0xd, pl // pl = nfrst | ffff800080000004: 14003fff b ffff800080010000 <__AArch64ADRPThunk_primary_entry> ... | ffff800080010000 <__AArch64ADRPThunk_primary_entry>: | ffff800080010000: f004e3f0 adrp x16, ffff800089c8f000 <__idmap_text_start> | ffff800080010004: 91038210 add x16, x16, #0xe0 | ffff800080010008: d61f0200 br x16
I've opted to pass '--pic-veneer' unconditionally, as:
* In addition to solving the boot failure, these sequences are generally nicer as they require fewer instructions and don't need to perform data accesses.
* While the position-independent veneer sequences have a limited +/-2GiB range, this is not a new restriction. Even kernels built with CONFIG_RELOCATABLE=n are limited to 2GiB in size as we have several structues using 32-bit relative offsets and PPREL32 relocations, which are similarly limited to +/-2GiB in range. These include extable entries, jump table entries, and alt_instr entries.
* GNU LD defaults to using position-independent veneers, and supports the same '--pic-veneer' option, so this change is not expected to adversely affect GNU LD.
I've tested with GNU LD 2.30 to 2.42 inclusive and LLVM 13.0.1 to 19.1.0 inclusive, using the kernel.org binaries from:
* https://mirrors.edge.kernel.org/pub/tools/crosstool/
* https://mirrors.edge.kernel.org/pub/tools/llvm/
--- arch/arm64/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/Makefile +1 -1
@@ -10,7 +10,7 @@ # # Copyright (C) 1995-2001 by Russell King -LDFLAGS_vmlinux :=--no-undefined -X +LDFLAGS_vmlinux :=--no-undefined -X --pic-veneer ifeq ($(CONFIG_RELOCATABLE), y) # Pass --no-apply-dynamic-relocs to restore pre-binutils-2.27 behaviour
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/137 udf: refactor udf_current_aext() to handle error
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhao Mengmeng <[email protected]>
[ Upstream commit ee703a7068f95764cfb62b57db1d36e465cb9b26 ]
As Jan suggested in links below, refactor udf_current_aext() to differentiate between error, hit EOF and success, it now takes pointer to etype to store the extent type, return 1 when getting etype success, return 0 when hitting EOF and return -errno when err.
--- fs/udf/inode.c | 40 ++++++++++++++++++++++++++-------------- fs/udf/truncate.c | 10 ++++++++-- fs/udf/udfdecl.h | 5 +++-- 3 files changed, 37 insertions(+), 18 deletions(-)
fs/udf/inode.c +26 -14
@@ -1838,6 +1838,7 @@ int udf_setup_indirect_aext(struct inode *inode, udf_pblk_t block,struct extent_position nepos;struct kernel_lb_addr neloc;int ver, adsize; +int err =0 ;if (UDF_I (inode)->i_alloc_type ==ICBTAG_FLAG_AD_SHORT ) adsize =sizeof (struct short_ad );
@@ -1882,10 +1883,12 @@ int udf_setup_indirect_aext(struct inode *inode, udf_pblk_t block,if (epos->offset + adsize > sb->s_blocksize) {struct kernel_lb_addr cp_loc;uint32_t cp_len; -int cp_type; +int8_t cp_type; epos->offset -= adsize; - cp_type =udf_current_aext (inode, epos, &cp_loc, &cp_len,0 ); + err =udf_current_aext (inode, epos, &cp_loc, &cp_len, &cp_type,0 ); +if (err <=0 ) + goto err_out; cp_len |= ((uint32_t )cp_type) <<30 ;__udf_add_aext (inode, &nepos, &cp_loc, cp_len,1 );
@@ -1900,6 +1903,9 @@ int udf_setup_indirect_aext(struct inode *inode, udf_pblk_t block, *epos = nepos;return 0 ; +err_out: +brelse (bh); +return err; }/*
@@ -2050,9 +2056,12 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, {int8_t etype;unsigned int indirections =0 ; +int ret =0 ; -while ((etype =udf_current_aext (inode, epos, eloc, elen, inc)) == - (EXT_NEXT_EXTENT_ALLOCDESCS >>30 )) { +while ((ret =udf_current_aext (inode, epos, eloc, elen, + &etype, inc)) >0 ) { +if (etype != (EXT_NEXT_EXTENT_ALLOCDESCS >>30 )) +break ;udf_pblk_t block;if (++indirections >UDF_MAX_INDIR_EXTS ) {
@@ -2073,14 +2082,17 @@ int8_t udf_next_aext(struct inode *inode, struct extent_position *epos, } } -return etype; +return ret >0 ? etype :-1 ; } -int8_t udf_current_aext (struct inode *inode,struct extent_position *epos, -struct kernel_lb_addr *eloc,uint32_t *elen,int inc) +/* +* Returns 1 on success, -errno on error, 0 on hit EOF. +*/ +int udf_current_aext (struct inode *inode,struct extent_position *epos, +struct kernel_lb_addr *eloc,uint32_t *elen,int8_t *etype, +int inc) {int alen; -int8_t etype;uint8_t *ptr;struct short_ad *sad;struct long_ad *lad;
@@ -2107,8 +2119,8 @@ int8_t udf_current_aext(struct inode *inode, struct extent_position *epos,case ICBTAG_FLAG_AD_SHORT : sad =udf_get_fileshortad (ptr, alen, &epos->offset, inc);if (!sad) -return -1 ; - etype =le32_to_cpu (sad->extLength) >>30 ; +return 0 ; + *etype =le32_to_cpu (sad->extLength) >>30 ; eloc->logicalBlockNum =le32_to_cpu (sad->extPosition); eloc->partitionReferenceNum = iinfo->i_location.partitionReferenceNum;
@@ -2117,17 +2129,17 @@ int8_t udf_current_aext(struct inode *inode, struct extent_position *epos,case ICBTAG_FLAG_AD_LONG : lad =udf_get_filelongad (ptr, alen, &epos->offset, inc);if (!lad) -return -1 ; - etype =le32_to_cpu (lad->extLength) >>30 ; +return 0 ; + *etype =le32_to_cpu (lad->extLength) >>30 ; *eloc =lelb_to_cpu (lad->extLocation); *elen =le32_to_cpu (lad->extLength) &UDF_EXTENT_LENGTH_MASK ;break ;default :udf_debug ("alloc_type = %u unsupported\n" , iinfo->i_alloc_type); -return -1 ; +return -EINVAL ; } -return etype; +return 1 ; } static int udf_insert_aext(struct inode *inode, struct extent_position epos,
fs/udf/truncate.c +8 -2
@@ -192,6 +192,7 @@ int udf_truncate_extents(struct inode *inode)loff_t byte_offset;int adsize;struct udf_inode_info *iinfo =UDF_I (inode); +int ret =0 ;if (iinfo->i_alloc_type ==ICBTAG_FLAG_AD_SHORT ) adsize =sizeof (struct short_ad );
@@ -221,8 +222,8 @@ int udf_truncate_extents(struct inode *inode)else lenalloc -=sizeof (struct allocExtDesc ); -while ((etype =udf_current_aext (inode, &epos, &eloc, - &elen,0 )) !=-1 ) { +while ((ret =udf_current_aext (inode, &epos, &eloc, + &elen, &etype,0 )) >0 ) {if (etype == (EXT_NEXT_EXTENT_ALLOCDESCS >>30 )) {udf_write_aext (inode, &epos, &neloc, nelen,0 );if (indirect_ext_len) {
@@ -257,6 +258,11 @@ int udf_truncate_extents(struct inode *inode) } } +if (ret <0 ) { +brelse (epos.bh); +return ret; + } +if (indirect_ext_len) {BUG_ON (!epos.bh);udf_free_blocks (sb,NULL , &epos.block,0 , indirect_ext_len);
fs/udf/udfdecl.h +3 -2
@@ -174,8 +174,9 @@ extern void udf_write_aext(struct inode *, struct extent_position *,extern int8_t udf_delete_aext (struct inode *,struct extent_position );extern int8_t udf_next_aext (struct inode *,struct extent_position *,struct kernel_lb_addr *,uint32_t *,int ); -extern int8_t udf_current_aext (struct inode *,struct extent_position *, -struct kernel_lb_addr *,uint32_t *,int ); +extern int udf_current_aext (struct inode *inode,struct extent_position *epos, +struct kernel_lb_addr *eloc,uint32_t *elen, +int8_t *etype,int inc);extern void udf_update_extra_perms (struct inode *inode,umode_t mode);/* misc.c */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/137 udf: fix uninit-value use in udf_get_fileshortad
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gianfranco Trad <[email protected]>
[ Upstream commit 264db9d666ad9a35075cc9ed9ec09d021580fbb1 ]
Check for overflow when computing alen in udf_current_aext to mitigate later uninit-value use in udf_get_fileshortad KMSAN bug[1]. After applying the patch reproducer did not trigger any issue[2].
[1] https://syzkaller.appspot.com/bug?extid=8901c4560b7ab5c2f9df
[2] https://syzkaller.appspot.com/x/log.txt?x=10242227980000
--- fs/udf/inode.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
fs/udf/inode.c +6 -3
@@ -2107,12 +2107,15 @@ int udf_current_aext(struct inode *inode, struct extent_position *epos, alen =udf_file_entry_alloc_offset (inode) + iinfo->i_lenAlloc; }else { +struct allocExtDesc *header = + (struct allocExtDesc *)epos->bh->b_data; +if (!epos->offset) epos->offset =sizeof (struct allocExtDesc ); ptr = epos->bh->b_data + epos->offset; - alen =sizeof (struct allocExtDesc ) + -le32_to_cpu (((struct allocExtDesc *)epos->bh->b_data)-> - lengthAllocDescs); +if (check_add_overflow (sizeof (struct allocExtDesc ), +le32_to_cpu (header->lengthAllocDescs), &alen)) +return -1 ; }switch (iinfo->i_alloc_type) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/137 ASoC: qcom: sm8250: add qrb4210-rb2-sndcard compatible string
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Klimov <[email protected]>
[ Upstream commit b97bc0656a66f89f78098d4d72dc04fa9518ab11 ]
Add "qcom,qrb4210-rb2-sndcard" to the list of recognizable devices.
--- sound/soc/qcom/sm8250.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/qcom/sm8250.c +1 -0
@@ -153,6 +153,7 @@ static int sm8250_platform_probe(struct platform_device *pdev)static const struct of_device_id snd_sm8250_dt_match[] = { {.compatible ="qcom,sm8250-sndcard" }, + {.compatible ="qcom,qrb4210-rb2-sndcard" }, {.compatible ="qcom,qrb5165-rb5-sndcard" }, {} };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/137 platform/x86: dell-sysman: add support for alienware products
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Crag Wang <[email protected]>
[ Upstream commit a561509b4187a8908eb7fbb2d1bf35bbc20ec74b ]
Alienware supports firmware-attributes and has its own OEM string.
--- drivers/platform/x86/dell/dell-wmi-sysman/sysman.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/dell/dell-wmi-sysman/sysman.c +1 -0
@@ -524,6 +524,7 @@ static int __init sysman_init(void)int ret =0 ;if (!dmi_find_device (DMI_DEV_TYPE_OEM_STRING ,"Dell System" ,NULL ) && + !dmi_find_device (DMI_DEV_TYPE_OEM_STRING ,"Alienware" ,NULL ) && !dmi_find_device (DMI_DEV_TYPE_OEM_STRING ,"www.dell.com" ,NULL )) {pr_err ("Unable to run on non-Dell system\n" );return -ENODEV ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/137 LoongArch: Add support to clone a time namespace
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
[ Upstream commit aa5e65dc0818bbf676bf06927368ec46867778fd ]
We can see that "Time namespaces are not supported" on LoongArch:
(1) clone3 test
# cd tools/testing/selftests/clone3 && make && ./clone3 ... # Time namespaces are not supported ok 18 # SKIP Skipping clone3() with CLONE_NEWTIME # Totals: pass:17 fail:0 xfail:0 xpass:0 skip:1 error:0
(2) timens test
# cd tools/testing/selftests/timens && make && ./timens ... 1..0 # SKIP Time namespaces are not supported
On LoongArch the current kernel does not support CONFIG_TIME_NS which depends on GENERIC_VDSO_TIME_NS, select GENERIC_VDSO_TIME_NS to enable CONFIG_TIME_NS to build kernel/time/namespace.c.
Additionally, it needs to define some arch-dependent functions for the timens, such as __arch_get_timens_vdso_data(), arch_get_vdso_data() and vdso_join_timens().
At the same time, modify the layout of vvar to use one page size for generic vdso data, expand another page size for timens vdso data and assign LOONGARCH_VDSO_DATA_SIZE (maybe exceeds a page size if expand in the future) for loongarch vdso data, at last add the callback function vvar_fault() and modify stack_top().
With this patch under CONFIG_TIME_NS:
(1) clone3 test
# cd tools/testing/selftests/clone3 && make && ./clone3 ... ok 18 [739] Result (0) matches expectation (0) # Totals: pass:18 fail:0 xfail:0 xpass:0 skip:0 error:0
(2) timens test
# cd tools/testing/selftests/timens && make && ./timens ... # Totals: pass:10 fail:0 xfail:0 xpass:0 skip:0 error:0
Stable-dep-of: 134475a9ab84 ("LoongArch: Don't crash in stack_top() for tasks without vDSO")
--- arch/loongarch/Kconfig | 1 + arch/loongarch/include/asm/page.h | 1 + .../loongarch/include/asm/vdso/gettimeofday.h | 9 +- arch/loongarch/include/asm/vdso/vdso.h | 32 +++++- arch/loongarch/kernel/process.c | 2 +- arch/loongarch/kernel/vdso.c | 98 ++++++++++++++++--- arch/loongarch/vdso/vgetcpu.c | 2 +- 7 files changed, 121 insertions(+), 24 deletions(-)
arch/loongarch/Kconfig +1 -0
@@ -78,6 +78,7 @@ config LOONGARCH select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD select GENERIC_TIME_VSYSCALL + select GENERIC_VDSO_TIME_NS select GPIOLIB select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_MMAP_RND_BITS if MMU
arch/loongarch/include/asm/page.h +1 -0
@@ -81,6 +81,7 @@ typedef struct { unsigned long pgprot; } pgprot_t;#define __va (x) ((void *)((unsigned long)(x) + PAGE_OFFSET - PHYS_OFFSET))#define pfn_to_kaddr (pfn) __va((pfn) << PAGE_SHIFT) +#define sym_to_pfn (x) __phys_to_pfn(__pa_symbol(x))#ifdef CONFIG_FLATMEM
arch/loongarch/include/asm/vdso/gettimeofday.h +8 -1
@@ -91,9 +91,16 @@ static inline bool loongarch_vdso_hres_capable(void) static __always_inline const struct vdso_data *__arch_get_vdso_data(void) { -return get_vdso_data (); +return (const struct vdso_data *)get_vdso_data (); } +#ifdef CONFIG_TIME_NS +static __always_inline +const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd) +{ +return (const struct vdso_data *)(get_vdso_data () +VVAR_TIMENS_PAGE_OFFSET *PAGE_SIZE ); +} +#endif #endif /* !__ASSEMBLY__ */ #endif /* __ASM_VDSO_GETTIMEOFDAY_H */
arch/loongarch/include/asm/vdso/vdso.h +27 -5
@@ -16,10 +16,33 @@ struct vdso_pcpu_data {struct loongarch_vdso_data {struct vdso_pcpu_data pdata[NR_CPUS ]; -struct vdso_data data[CS_BASES ];/* Arch-independent data */ }; -#define VDSO_DATA_SIZE PAGE_ALIGN(sizeof(struct loongarch_vdso_data)) +/* +* The layout of vvar: +* +* high +* +---------------------+--------------------------+ +* | loongarch vdso data | LOONGARCH_VDSO_DATA_SIZE | +* +---------------------+--------------------------+ +* | time-ns vdso data | PAGE_SIZE | +* +---------------------+--------------------------+ +* | generic vdso data | PAGE_SIZE | +* +---------------------+--------------------------+ +* low +*/ +#define LOONGARCH_VDSO_DATA_SIZE PAGE_ALIGN(sizeof(struct loongarch_vdso_data)) +#define LOONGARCH_VDSO_DATA_PAGES (LOONGARCH_VDSO_DATA_SIZE >> PAGE_SHIFT) + +enum vvar_pages { +VVAR_GENERIC_PAGE_OFFSET , +VVAR_TIMENS_PAGE_OFFSET , +VVAR_LOONGARCH_PAGES_START , +VVAR_LOONGARCH_PAGES_END =VVAR_LOONGARCH_PAGES_START +LOONGARCH_VDSO_DATA_PAGES -1 , +VVAR_NR_PAGES , +}; + +#define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT)static inline unsigned long get_vdso_base (void ) {
@@ -34,10 +57,9 @@ static inline unsigned long get_vdso_base(void) return addr; } -static inline const struct vdso_data *get_vdso_data (void ) +static inline unsigned long get_vdso_data (void ) { -return (const struct vdso_data *)(get_vdso_base () - -VDSO_DATA_SIZE +SMP_CACHE_BYTES *NR_CPUS ); +return get_vdso_base () -VVAR_SIZE ; }#endif /* __ASSEMBLY__ */
arch/loongarch/kernel/process.c +1 -1
@@ -273,7 +273,7 @@ unsigned long stack_top(void)/* Space for the VDSO & data page */ top -=PAGE_ALIGN (current->thread.vdso->size); - top -=PAGE_SIZE ; + top -=VVAR_SIZE ;/* Space to randomize the VDSO base */ if (current->flags &PF_RANDOMIZE )
arch/loongarch/kernel/vdso.c +82 -16
157 lines not on this page · raw message
arch/loongarch/vdso/vgetcpu.c +1 -1
@@ -21,7 +21,7 @@ static __always_inline int read_cpu_id(void) static __always_inline const struct vdso_pcpu_data *get_pcpu_data(void) { -return (struct vdso_pcpu_data *)(get_vdso_base () -VDSO_DATA_SIZE ); +return (struct vdso_pcpu_data *)(get_vdso_data () +VVAR_LOONGARCH_PAGES_START *PAGE_SIZE ); } extern
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/137 LoongArch: Dont crash in stack_top() for tasks without vDSO
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 134475a9ab8487527238d270639a8cb74c10aab2 ]
Not all tasks have a vDSO mapped, for example kthreads never do. If such a task ever ends up calling stack_top(), it will derefence the NULL vdso pointer and crash.
This can for example happen when using kunit:
[<9000000000203874>] stack_top+0x58/0xa8 [<90000000002956cc>] arch_pick_mmap_layout+0x164/0x220 [<90000000003c284c>] kunit_vm_mmap_init+0x108/0x12c [<90000000003c1fbc>] __kunit_add_resource+0x38/0x8c [<90000000003c2704>] kunit_vm_mmap+0x88/0xc8 [<9000000000410b14>] usercopy_test_init+0xbc/0x25c [<90000000003c1db4>] kunit_try_run_case+0x5c/0x184 [<90000000003c3d54>] kunit_generic_run_threadfn_adapter+0x24/0x48 [<900000000022e4bc>] kthread+0xc8/0xd4 [<9000000000200ce8>] ret_from_kernel_thread+0xc/0xa4
--- arch/loongarch/kernel/process.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
arch/loongarch/kernel/process.c +9 -7
@@ -271,13 +271,15 @@ unsigned long stack_top(void) {unsigned long top =TASK_SIZE &PAGE_MASK ; -/* Space for the VDSO & data page */ - top -=PAGE_ALIGN (current->thread.vdso->size); - top -=VVAR_SIZE ; - -/* Space to randomize the VDSO base */ -if (current->flags &PF_RANDOMIZE ) - top -=VDSO_RANDOMIZE_SIZE ; +if (current->thread.vdso) { +/* Space for the VDSO & data page */ + top -=PAGE_ALIGN (current->thread.vdso->size); + top -=VVAR_SIZE ; + +/* Space to randomize the VDSO base */ +if (current->flags &PF_RANDOMIZE ) + top -=VDSO_RANDOMIZE_SIZE ; + }return top; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/137 jfs: Fix sanity check in dbMount
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Kleikamp <[email protected]>
[ Upstream commit 67373ca8404fe57eb1bb4b57f314cff77ce54932 ]
MAXAG is a legitimate value for bmp->db_numag
--- fs/jfs/jfs_dmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/jfs/jfs_dmap.c +1 -1
@@ -187,7 +187,7 @@ int dbMount(struct inode *ipbmap) } bmp->db_numag =le32_to_cpu (dbmp_le->dn_numag); -if (!bmp->db_numag || bmp->db_numag >=MAXAG ) { +if (!bmp->db_numag || bmp->db_numag >MAXAG ) { err = -EINVAL ; goto err_release_metapage; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/137 tracing: Consider the NULL character when validating the event length
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Yan <[email protected]>
[ Upstream commit 0b6e2e22cb23105fcb171ab92f0f7516c69c8471 ]
strlen() returns a string length excluding the null byte. If the string length equals to the maximum buffer length, the buffer will have no space for the NULL terminating character.
This commit checks this condition and returns failure for it.
--- kernel/trace/trace_probe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_probe.c +1 -1
@@ -265,7 +265,7 @@ int traceprobe_parse_event_name(const char **pevent, const char **pgroup, }trace_probe_log_err (offset,NO_EVENT_NAME );return -EINVAL ; - }else if (len >MAX_EVENT_NAME_LEN ) { + }else if (len >=MAX_EVENT_NAME_LEN ) {trace_probe_log_err (offset,EVENT_TOO_LONG );return -EINVAL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/137 xfrm: extract dst lookup parameters into a struct
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eyal Birger <[email protected]>
[ Upstream commit e509996b16728e37d5a909a5c63c1bd64f23b306 ]
Preparation for adding more fields to dst lookup functions without changing their signatures.
Stable-dep-of: b84697210343 ("xfrm: respect ip protocols rules criteria when performing dst lookups")
--- include/net/xfrm.h | 26 +++++++++++++------------- net/ipv4/xfrm4_policy.c | 38 ++++++++++++++++---------------------- net/ipv6/xfrm6_policy.c | 28 +++++++++++++--------------- net/xfrm/xfrm_device.c | 11 ++++++++--- net/xfrm/xfrm_policy.c | 35 +++++++++++++++++++++++------------ 5 files changed, 73 insertions(+), 65 deletions(-)
include/net/xfrm.h +13 -13
@@ -326,20 +326,23 @@ struct xfrm_if_cb {void xfrm_if_register_cb (const struct xfrm_if_cb *ifcb);void xfrm_if_unregister_cb (void ); +struct xfrm_dst_lookup_params { +struct net *net; +int tos; +int oif; +xfrm_address_t *saddr; +xfrm_address_t *daddr; +u32 mark; +}; +struct net_device ;struct xfrm_type ;struct xfrm_dst ;struct xfrm_policy_afinfo {struct dst_ops *dst_ops; -struct dst_entry *(*dst_lookup)(struct net *net, -int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -u32 mark); -int (*get_saddr)(struct net *net,int oif, -xfrm_address_t *saddr, -xfrm_address_t *daddr, -u32 mark); +struct dst_entry *(*dst_lookup)(const struct xfrm_dst_lookup_params *params); +int (*get_saddr)(xfrm_address_t *saddr, +const struct xfrm_dst_lookup_params *params);int (*fill_dst)(struct xfrm_dst *xdst,struct net_device *dev,const struct flowi *fl);
@@ -1659,10 +1662,7 @@ static inline int xfrm_user_policy(struct sock *sk, int optname, }#endif -struct dst_entry *__xfrm_dst_lookup (struct net *net,int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -int family,u32 mark); +struct dst_entry *__xfrm_dst_lookup (int family,const struct xfrm_dst_lookup_params *params);struct xfrm_policy *xfrm_policy_alloc (struct net *net,gfp_t gfp);
net/ipv4/xfrm4_policy.c +16 -22
@@ -17,47 +17,41 @@#include <net/ip.h> #include <net/l3mdev.h> -static struct dst_entry *__xfrm4_dst_lookup (struct net *net,struct flowi4 *fl4, -int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -u32 mark) +static struct dst_entry *__xfrm4_dst_lookup (struct flowi4 *fl4, +const struct xfrm_dst_lookup_params *params) {struct rtable *rt;memset (fl4,0 ,sizeof (*fl4)); - fl4->daddr = daddr->a4; - fl4->flowi4_tos = tos; - fl4->flowi4_l3mdev =l3mdev_master_ifindex_by_index (net, oif); - fl4->flowi4_mark = mark; -if (saddr) - fl4->saddr = saddr->a4; - - rt =__ip_route_output_key (net, fl4); + fl4->daddr = params->daddr->a4; + fl4->flowi4_tos = params->tos; + fl4->flowi4_l3mdev =l3mdev_master_ifindex_by_index (params->net, + params->oif); + fl4->flowi4_mark = params->mark; +if (params->saddr) + fl4->saddr = params->saddr->a4; + + rt =__ip_route_output_key (params->net, fl4);if (!IS_ERR (rt))return &rt->dst;return ERR_CAST (rt); } -static struct dst_entry *xfrm4_dst_lookup (struct net *net,int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -u32 mark) +static struct dst_entry *xfrm4_dst_lookup (const struct xfrm_dst_lookup_params *params) {struct flowi4 fl4; -return __xfrm4_dst_lookup (net, &fl4, tos, oif, saddr, daddr, mark); +return __xfrm4_dst_lookup (&fl4, params); } -static int xfrm4_get_saddr (struct net *net,int oif, -xfrm_address_t *saddr,xfrm_address_t *daddr, -u32 mark) +static int xfrm4_get_saddr (xfrm_address_t *saddr, +const struct xfrm_dst_lookup_params *params) {struct dst_entry *dst;struct flowi4 fl4; - dst =__xfrm4_dst_lookup (net, &fl4,0 , oif,NULL , daddr, mark); + dst =__xfrm4_dst_lookup (&fl4, params);if (IS_ERR (dst))return -EHOSTUNREACH ;
net/ipv6/xfrm6_policy.c +13 -15
@@ -23,23 +23,21 @@#include <net/ip6_route.h> #include <net/l3mdev.h> -static struct dst_entry *xfrm6_dst_lookup (struct net *net,int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -u32 mark) +static struct dst_entry *xfrm6_dst_lookup (const struct xfrm_dst_lookup_params *params) {struct flowi6 fl6;struct dst_entry *dst;int err;memset (&fl6,0 ,sizeof (fl6)); - fl6.flowi6_l3mdev =l3mdev_master_ifindex_by_index (net, oif); - fl6.flowi6_mark = mark; -memcpy (&fl6.daddr, daddr,sizeof (fl6.daddr)); -if (saddr) -memcpy (&fl6.saddr, saddr,sizeof (fl6.saddr)); + fl6.flowi6_l3mdev =l3mdev_master_ifindex_by_index (params->net, + params->oif); + fl6.flowi6_mark = params->mark; +memcpy (&fl6.daddr, params->daddr,sizeof (fl6.daddr)); +if (params->saddr) +memcpy (&fl6.saddr, params->saddr,sizeof (fl6.saddr)); - dst =ip6_route_output (net,NULL , &fl6); + dst =ip6_route_output (params->net,NULL , &fl6); err = dst->error;if (dst->error) {
@@ -50,15 +48,14 @@ static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,return dst; } -static int xfrm6_get_saddr (struct net *net,int oif, -xfrm_address_t *saddr,xfrm_address_t *daddr, -u32 mark) +static int xfrm6_get_saddr (xfrm_address_t *saddr, +const struct xfrm_dst_lookup_params *params) {struct dst_entry *dst;struct net_device *dev;struct inet6_dev *idev; - dst =xfrm6_dst_lookup (net,0 , oif,NULL , daddr, mark); + dst =xfrm6_dst_lookup (params);if (IS_ERR (dst))return -EHOSTUNREACH ;
@@ -68,7 +65,8 @@ static int xfrm6_get_saddr(struct net *net, int oif,return -EHOSTUNREACH ; } dev = idev->dev; -ipv6_dev_get_saddr (dev_net (dev), dev, &daddr->in6,0 , &saddr->in6); +ipv6_dev_get_saddr (dev_net (dev), dev, ¶ms->daddr->in6,0 , + &saddr->in6);dst_release (dst);return 0 ; }
net/xfrm/xfrm_device.c +8 -3
@@ -248,6 +248,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, dev =dev_get_by_index (net, xuo->ifindex);if (!dev) { +struct xfrm_dst_lookup_params params; +if (!(xuo->flags &XFRM_OFFLOAD_INBOUND )) { saddr = &x->props.saddr; daddr = &x->id.daddr;
@@ -256,9 +258,12 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x, daddr = &x->props.saddr; } - dst =__xfrm_dst_lookup (net,0 ,0 , saddr, daddr, - x->props.family, -xfrm_smark_get (0 , x)); +memset (¶ms,0 ,sizeof (params)); + params.net = net; + params.saddr = saddr; + params.daddr = daddr; + params.mark =xfrm_smark_get (0 , x); + dst =__xfrm_dst_lookup (x->props.family, ¶ms);if (IS_ERR (dst))return 0 ;
net/xfrm/xfrm_policy.c +23 -12
@@ -251,10 +251,8 @@ static const struct xfrm_if_cb *xfrm_if_get_cb(void)return rcu_dereference (xfrm_if_cb); } -struct dst_entry *__xfrm_dst_lookup (struct net *net,int tos,int oif, -const xfrm_address_t *saddr, -const xfrm_address_t *daddr, -int family,u32 mark) +struct dst_entry *__xfrm_dst_lookup (int family, +const struct xfrm_dst_lookup_params *params) {const struct xfrm_policy_afinfo *afinfo;struct dst_entry *dst;
@@ -263,7 +261,7 @@ struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,if (unlikely (afinfo ==NULL ))return ERR_PTR (-EAFNOSUPPORT ); - dst = afinfo->dst_lookup (net, tos, oif, saddr, daddr, mark); + dst = afinfo->dst_lookup (params);rcu_read_unlock ();
@@ -277,6 +275,7 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,xfrm_address_t *prev_daddr, int family, u32 mark) { + struct xfrm_dst_lookup_params params;struct net *net =xs_net (x);xfrm_address_t *saddr = &x->props.saddr;xfrm_address_t *daddr = &x->id.daddr;
@@ -291,7 +290,14 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x, daddr = x->coaddr; } - dst =__xfrm_dst_lookup (net, tos, oif, saddr, daddr, family, mark); + params.net = net; + params.saddr = saddr; + params.daddr = daddr; + params.tos = tos; + params.oif = oif; + params.mark = mark; + + dst =__xfrm_dst_lookup (family, ¶ms);if (!IS_ERR (dst)) {if (prev_saddr != saddr)
@@ -2346,15 +2352,15 @@ int __xfrm_sk_clone_policy(struct sock *sk, const struct sock *osk) }static int -xfrm_get_saddr (struct net *net,int oif,xfrm_address_t *local, -xfrm_address_t *remote,unsigned short family,u32 mark) +xfrm_get_saddr (unsigned short family,xfrm_address_t *saddr, +const struct xfrm_dst_lookup_params *params) {int err;const struct xfrm_policy_afinfo *afinfo =xfrm_policy_get_afinfo (family);if (unlikely (afinfo ==NULL ))return -EINVAL ; - err = afinfo->get_saddr (net, oif, local, remote, mark); + err = afinfo->get_saddr (saddr, params);rcu_read_unlock ();return err; }
@@ -2383,9 +2389,14 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, const struct flowi *fl, remote = &tmpl->id.daddr; local = &tmpl->saddr;if (xfrm_addr_any (local, tmpl->encap_family)) { - error =xfrm_get_saddr (net, fl->flowi_oif, - &tmp, remote, - tmpl->encap_family,0 ); +struct xfrm_dst_lookup_params params; + +memset (¶ms,0 ,sizeof (params)); + params.net = net; + params.oif = fl->flowi_oif; + params.daddr = remote; + error =xfrm_get_saddr (tmpl->encap_family, &tmp, + ¶ms);if (error) goto fail; local = &tmp;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/137 xfrm: respect ip protocols rules criteria when performing dst lookups
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eyal Birger <[email protected]>
[ Upstream commit b8469721034300bbb6dec5b4bf32492c95e16a0c ]
The series in the "fixes" tag added the ability to consider L4 attributes in routing rules.
The dst lookup on the outer packet of encapsulated traffic in the xfrm code was not adapted to this change, thus routing behavior that relies on L4 information is not respected.
Pass the ip protocol information when performing dst lookups.
--- include/net/xfrm.h | 2 ++ net/ipv4/xfrm4_policy.c | 2 ++ net/ipv6/xfrm6_policy.c | 3 +++ net/xfrm/xfrm_policy.c | 15 +++++++++++++++ 4 files changed, 22 insertions(+)
include/net/xfrm.h +2 -0
@@ -333,6 +333,8 @@ struct xfrm_dst_lookup_params {xfrm_address_t *saddr;xfrm_address_t *daddr;u32 mark; +__u8 ipproto; +union flowi_uli uli; };struct net_device ;
net/ipv4/xfrm4_policy.c +2 -0
@@ -30,6 +30,8 @@ static struct dst_entry *__xfrm4_dst_lookup(struct flowi4 *fl4, fl4->flowi4_mark = params->mark;if (params->saddr) fl4->saddr = params->saddr->a4; + fl4->flowi4_proto = params->ipproto; + fl4->uli = params->uli; rt =__ip_route_output_key (params->net, fl4);if (!IS_ERR (rt))
net/ipv6/xfrm6_policy.c +3 -0
@@ -37,6 +37,9 @@ static struct dst_entry *xfrm6_dst_lookup(const struct xfrm_dst_lookup_params *pif (params->saddr)memcpy (&fl6.saddr, params->saddr,sizeof (fl6.saddr)); + fl6.flowi4_proto = params->ipproto; + fl6.uli = params->uli; + dst =ip6_route_output (params->net,NULL , &fl6); err = dst->error;
net/xfrm/xfrm_policy.c +15 -0
@@ -296,6 +296,21 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x, params.tos = tos; params.oif = oif; params.mark = mark; + params.ipproto = x->id.proto; +if (x->encap) { +switch (x->encap->encap_type) { +case UDP_ENCAP_ESPINUDP : + params.ipproto =IPPROTO_UDP ; + params.uli.ports.sport = x->encap->encap_sport; + params.uli.ports.dport = x->encap->encap_dport; +break ; +case TCP_ENCAP_ESPINTCP : + params.ipproto =IPPROTO_TCP ; + params.uli.ports.sport = x->encap->encap_sport; + params.uli.ports.dport = x->encap->encap_dport; +break ; + } + } dst =__xfrm_dst_lookup (family, ¶ms);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/137 net/sun3_82586: fix potential memory leak in sun3_82586_send_packet()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit 2cb3f56e827abb22c4168ad0c1bbbf401bb2f3b8 ]
The sun3_82586_send_packet() returns NETDEV_TX_OK without freeing skb in case of skb->len being too long, add dev_kfree_skb() to fix it.
Message-ID: <[email protected]>
--- drivers/net/ethernet/i825xx/sun3_82586.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/i825xx/sun3_82586.c +1 -0
@@ -1011,6 +1011,7 @@ sun3_82586_send_packet(struct sk_buff *skb, struct net_device *dev)if (skb->len >XMIT_BUFF_SIZE ) {printk ("%s: Sorry, max. framelength is %d bytes. The length of your frame is %d bytes.\n" ,dev->name,XMIT_BUFF_SIZE ,skb->len); +dev_kfree_skb (skb);return NETDEV_TX_OK ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/137 be2net: fix potential memory leak in be_xmit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Hai <[email protected]>
[ Upstream commit e4dd8bfe0f6a23acd305f9b892c00899089bd621 ]
The be_xmit() returns NETDEV_TX_OK without freeing skb
in case of be_xmit_enqueue() fails, add dev_kfree_skb_any() to fix it.
Message-ID: <[email protected]>
--- drivers/net/ethernet/emulex/benet/be_main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/ethernet/emulex/benet/be_main.c +5 -5
@@ -1382,10 +1382,8 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)be_get_wrb_params_from_skb (adapter, skb, &wrb_params); wrb_cnt =be_xmit_enqueue (adapter, txo, skb, &wrb_params); -if (unlikely (!wrb_cnt)) { -dev_kfree_skb_any (skb); - goto drop; - } +if (unlikely (!wrb_cnt)) + goto drop_skb;/* if os2bmc is enabled and if the pkt is destined to bmc, * enqueue the pkt a 2nd time with mgmt bit set.
@@ -1394,7 +1392,7 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)BE_WRB_F_SET (wrb_params.features,OS2BMC ,1 ); wrb_cnt =be_xmit_enqueue (adapter, txo, skb, &wrb_params);if (unlikely (!wrb_cnt)) - goto drop; + goto drop_skb;else skb_get (skb); }
@@ -1408,6 +1406,8 @@ static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev)be_xmit_flush (adapter, txo);return NETDEV_TX_OK ; +drop_skb: +dev_kfree_skb_any (skb); drop:tx_stats (txo)->tx_drv_drops++;/* Flush the already enqueued tx requests */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/137 net: plip: fix break; causing plip to never transmit
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Boehm <[email protected]>
[ Upstream commit f99cf996ba5a315f8b9f13cc21dff0604a0eb749 ]
Since commit
71ae2cb30531 ("net: plip: Fix fall-through warnings for Clang")
plip was not able to send any packets, this patch replaces one unintended break; with fallthrough; which was originally missed by commit 9525d69a3667 ("net: plip: mark expected switch fall-throughs").
I have verified with a real hardware PLIP connection that everything works once again after applying this patch.
Message-ID: <[email protected]>
--- drivers/net/plip/plip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/plip/plip.c +1 -1
@@ -815,7 +815,7 @@ plip_send_packet(struct net_device *dev, struct net_local *nl,return HS_TIMEOUT ; } } -break ; + fallthrough;case PLIP_PK_LENGTH_LSB : if (plip_send(nibble_timeout, dev,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/137 octeon_ep: Implement helper for iterating packets in Rx queue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksandr Mishin <[email protected]>
[ Upstream commit bd28df26197b2bd0913bf1b36770836481975143 ]
The common code with some packet and index manipulations is extracted and moved to newly implemented helper to make the code more readable and avoid duplication. This is a preparation for skb allocation failure handling.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
Stable-dep-of: eb592008f79b ("octeon_ep: Add SKB allocation failures handling in __octep_oq_process_rx()")
--- .../net/ethernet/marvell/octeon_ep/octep_rx.c | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-)
drivers/net/ethernet/marvell/octeon_ep/octep_rx.c +32 -23
@@ -336,6 +336,30 @@ static int octep_oq_check_hw_for_pkts(struct octep_device *oct,return new_pkts; } +/** +* octep_oq_next_pkt() - Move to the next packet in Rx queue. +* +* @oq: Octeon Rx queue data structure. +* @buff_info: Current packet buffer info. +* @read_idx: Current packet index in the ring. +* @desc_used: Current packet descriptor number. +* +* Free the resources associated with a packet. +* Increment packet index in the ring and packet descriptor number. +*/ +static void octep_oq_next_pkt (struct octep_oq *oq, +struct octep_rx_buffer *buff_info, +u32 *read_idx,u32 *desc_used) +{ +dma_unmap_page (oq->dev, oq->desc_ring[*read_idx].buffer_ptr, +PAGE_SIZE ,DMA_FROM_DEVICE ); + buff_info->page =NULL ; + (*read_idx)++; + (*desc_used)++; +if (*read_idx == oq->max_count) + *read_idx =0 ; +} +/** * __octep_oq_process_rx() - Process hardware Rx queue and push to stack. *
@@ -365,10 +389,7 @@ static int __octep_oq_process_rx(struct octep_device *oct, desc_used =0 ;for (pkt =0 ; pkt < pkts_to_process; pkt++) { buff_info = (struct octep_rx_buffer *)&oq->buff_info[read_idx]; -dma_unmap_page (oq->dev, oq->desc_ring[read_idx].buffer_ptr, -PAGE_SIZE ,DMA_FROM_DEVICE ); resp_hw =page_address (buff_info->page); - buff_info->page =NULL ;/* Swap the length field that is in Big-Endian to CPU */ buff_info->len =be64_to_cpu (resp_hw->length);
@@ -390,36 +411,27 @@ static int __octep_oq_process_rx(struct octep_device *oct,*/ data_offset =OCTEP_OQ_RESP_HW_SIZE ; } + +octep_oq_next_pkt (oq, buff_info, &read_idx, &desc_used); + + skb =build_skb ((void *)resp_hw,PAGE_SIZE ); +skb_reserve (skb, data_offset); + rx_bytes += buff_info->len;if (buff_info->len <= oq->max_single_buffer_size) { - skb =build_skb ((void *)resp_hw,PAGE_SIZE ); -skb_reserve (skb, data_offset);skb_put (skb, buff_info->len); - read_idx++; - desc_used++; -if (read_idx == oq->max_count) - read_idx =0 ; }else {struct skb_shared_info *shinfo;u16 data_len; - skb =build_skb ((void *)resp_hw,PAGE_SIZE ); -skb_reserve (skb, data_offset);/* Head fragment includes response header(s); * subsequent fragments contains only data. */ skb_put (skb, oq->max_single_buffer_size); - read_idx++; - desc_used++; -if (read_idx == oq->max_count) - read_idx =0 ; - shinfo =skb_shinfo (skb); data_len = buff_info->len - oq->max_single_buffer_size;while (data_len) { -dma_unmap_page (oq->dev, oq->desc_ring[read_idx].buffer_ptr, -PAGE_SIZE ,DMA_FROM_DEVICE ); buff_info = (struct octep_rx_buffer *) &oq->buff_info[read_idx];if (data_len < oq->buffer_size) {
@@ -434,11 +446,8 @@ static int __octep_oq_process_rx(struct octep_device *oct, buff_info->page,0 , buff_info->len, buff_info->len); - buff_info->page =NULL ; - read_idx++; - desc_used++; -if (read_idx == oq->max_count) - read_idx =0 ; + +octep_oq_next_pkt (oq, buff_info, &read_idx, &desc_used); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/137 octeon_ep: Add SKB allocation failures handling in __octep_oq_process_rx()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksandr Mishin <[email protected]>
[ Upstream commit eb592008f79be52ccef88cd9a5249b3fc0367278 ]
build_skb() returns NULL in case of a memory allocation failure so handle it inside __octep_oq_process_rx() to avoid NULL pointer dereference.
__octep_oq_process_rx() is called during NAPI polling by the driver. If skb allocation fails, keep on pulling packets out of the Rx DMA queue: we shouldn't break the polling immediately and thus falsely indicate to the octep_napi_poll() that the Rx pressure is going down. As there is no associated skb in this case, don't process the packets and don't push them up the network stack - they are skipped.
Helper function is implemented to unmmap/flush all the fragment buffers used by the dropped packet. 'alloc_failures' counter is incremented to mark the skb allocation error in driver statistics.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- .../net/ethernet/marvell/octeon_ep/octep_rx.c | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/net/ethernet/marvell/octeon_ep/octep_rx.c +27 -0
@@ -360,6 +360,27 @@ static void octep_oq_next_pkt(struct octep_oq *oq, *read_idx =0 ; } +/** +* octep_oq_drop_rx() - Free the resources associated with a packet. +* +* @oq: Octeon Rx queue data structure. +* @buff_info: Current packet buffer info. +* @read_idx: Current packet index in the ring. +* @desc_used: Current packet descriptor number. +* +*/ +static void octep_oq_drop_rx (struct octep_oq *oq, +struct octep_rx_buffer *buff_info, +u32 *read_idx,u32 *desc_used) +{ +int data_len = buff_info->len - oq->max_single_buffer_size; + +while (data_len >0 ) { +octep_oq_next_pkt (oq, buff_info, read_idx, desc_used); + data_len -= oq->buffer_size; + }; +} +/** * __octep_oq_process_rx() - Process hardware Rx queue and push to stack. *
@@ -415,6 +436,12 @@ static int __octep_oq_process_rx(struct octep_device *oct,octep_oq_next_pkt (oq, buff_info, &read_idx, &desc_used); skb =build_skb ((void *)resp_hw,PAGE_SIZE ); +if (!skb) { +octep_oq_drop_rx (oq, buff_info, + &read_idx, &desc_used); + oq->stats.alloc_failures++; +continue ; + }skb_reserve (skb, data_offset); rx_bytes += buff_info->len;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/137 net: dsa: mv88e6xxx: Fix error when setting port policy on mv88e6393x
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Rashleigh <[email protected]>
[ Upstream commit 12bc14949c4a7272b509af0f1022a0deeb215fd8 ]
mv88e6393x_port_set_policy doesn't correctly shift the ptr value when converting the policy format between the old and new styles, so the target register ends up with the ptr being written over the data bits.
Shift the pointer to align with the format expected by mv88e6393x_port_policy_write().
Message-ID: <[email protected]>
--- drivers/net/dsa/mv88e6xxx/port.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/dsa/mv88e6xxx/port.c +1 -0
@@ -1728,6 +1728,7 @@ int mv88e6393x_port_set_policy(struct mv88e6xxx_chip *chip, int port, ptr = shift /8 ; shift %=8 ; mask >>= ptr *8 ; + ptr <<=8 ; err =mv88e6393x_port_policy_read (chip, port, ptr, ®);if (err)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/137 netfilter: xtables: fix typo causing some targets not to load on IPv6
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 306ed1728e8438caed30332e1ab46b28c25fe3d8 ]
- There is no NFPROTO_IPV6 family for mark and NFLOG.
- TRACE is also missing module autoload with NFPROTO_IPV6.
This results in ip6tables failing to restore a ruleset. This issue has been reported by several users providing incomplete patches.
Very similar to Ilya Katsnelson's patch including a missing chunk in the TRACE extension.
--- net/netfilter/xt_NFLOG.c | 2 +- net/netfilter/xt_TRACE.c | 1 + net/netfilter/xt_mark.c | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-)
net/netfilter/xt_NFLOG.c +1 -1
@@ -79,7 +79,7 @@ static struct xt_target nflog_tg_reg[] __read_mostly = { { .name = "NFLOG", .revision = 0, - .family = NFPROTO_IPV4, + .family = NFPROTO_IPV6, .checkentry = nflog_tg_check, .destroy = nflog_tg_destroy, .target = nflog_tg,
net/netfilter/xt_TRACE.c +1 -0
@@ -49,6 +49,7 @@ static struct xt_target trace_tg_reg[] __read_mostly = { .target = trace_tg, .checkentry = trace_tg_check, .destroy = trace_tg_destroy, + .me = THIS_MODULE, },#endif };
net/netfilter/xt_mark.c +1 -1
@@ -62,7 +62,7 @@ static struct xt_target mark_tg_reg[] __read_mostly = { { .name = "MARK", .revision = 2, - .family = NFPROTO_IPV4, + .family = NFPROTO_IPV6, .target = mark_tg, .targetsize = sizeof(struct xt_mark_tginfo2), .me = THIS_MODULE,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/137 net: wwan: fix global oob in wwan_rtnl_policy
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lin Ma <[email protected]>
[ Upstream commit 47dd5447cab8ce30a847a0337d5341ae4c7476a7 ]
The variable wwan_rtnl_link_ops assign a *bigger* maxtype which leads to a global out-of-bounds read when parsing the netlink attributes. Exactly same bug cause as the oob fixed in commit b33fb5b801c6 ("net: qualcomm:
rmnet: fix global oob in rmnet_policy").
==================================================================
BUG: KASAN: global-out-of-bounds in validate_nla lib/nlattr.c:388 [inline] BUG: KASAN: global-out-of-bounds in __nla_validate_parse+0x19d7/0x29a0 lib/nlattr.c:603 Read of size 1 at addr ffffffff8b09cb60 by task syz.1.66276/323862 CPU: 0 PID: 323862 Comm: syz.1.66276 Not tainted 6.1.70 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x177/0x231 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:284 [inline] print_report+0x14f/0x750 mm/kasan/report.c:395 kasan_report+0x139/0x170 mm/kasan/report.c:495 validate_nla lib/nlattr.c:388 [inline] __nla_validate_parse+0x19d7/0x29a0 lib/nlattr.c:603 __nla_parse+0x3c/0x50 lib/nlattr.c:700 nla_parse_nested_deprecated include/net/netlink.h:1269 [inline] __rtnl_newlink net/core/rtnetlink.c:3514 [inline] rtnl_newlink+0x7bc/0x1fd0 net/core/rtnetlink.c:3623 rtnetlink_rcv_msg+0x794/0xef0 net/core/rtnetlink.c:6122 netlink_rcv_skb+0x1de/0x420 net/netlink/af_netlink.c:2508 netlink_unicast_kernel net/netlink/af_netlink.c:1326 [inline] netlink_unicast+0x74b/0x8c0 net/netlink/af_netlink.c:1352 netlink_sendmsg+0x882/0xb90 net/netlink/af_netlink.c:1874 sock_sendmsg_nosec net/socket.c:716 [inline] __sock_sendmsg net/socket.c:728 [inline] ____sys_sendmsg+0x5cc/0x8f0 net/socket.c:2499 ___sys_sendmsg+0x21c/0x290 net/socket.c:2553 __sys_sendmsg net/socket.c:2582 [inline] __do_sys_sendmsg net/socket.c:2591 [inline] __se_sys_sendmsg+0x19e/0x270 net/socket.c:2589 do_syscall_x64 arch/x86/entry/common.c:51 [inline] do_syscall_64+0x45/0x90 arch/x86/entry/common.c:81 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f67b19a24ad RSP: 002b:00007f67b17febb8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e RAX: ffffffffffffffda RBX: 00007f67b1b45f80 RCX: 00007f67b19a24ad RDX: 0000000000000000 RSI: 0000000020005e40 RDI: 0000000000000004 RBP: 00007f67b1a1e01d R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 R13: 00007ffd2513764f R14: 00007ffd251376e0 R15: 00007f67b17fed40 </TASK> The buggy address belongs to the variable: wwan_rtnl_policy+0x20/0x40 The buggy address belongs to the physical page: page:ffffea00002c2700 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0xb09c flags: 0xfff00000001000(reserved|node=0|zone=1|lastcpupid=0x7ff) raw: 00fff00000001000 ffffea00002c2708 ffffea00002c2708 0000000000000000 raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected
page_owner info is not present (never set?)
Memory state around the buggy address:
ffffffff8b09ca00: 05 f9 f9 f9 05 f9 f9 f9 00 01 f9 f9 00 01 f9 f9
ffffffff8b09ca80: 00 00 00 05 f9 f9 f9 f9 00 00 03 f9 f9 f9 f9 f9
>ffffffff8b09cb00: 00 00 00 00 05 f9 f9 f9 00 00 00 00 f9 f9 f9 f9
^
ffffffff8b09cb80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================According to the comment of nla_parse_nested_deprecated, use correct size IFLA_WWAN_MAX here to fix this issue.
--- drivers/net/wwan/wwan_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wwan/wwan_core.c +1 -1
@@ -994,7 +994,7 @@ static const struct nla_policy wwan_rtnl_policy[IFLA_WWAN_MAX + 1] = {static struct rtnl_link_ops wwan_rtnl_link_ops__read_mostly = { .kind ="wwan" , - .maxtype = __IFLA_WWAN_MAX, + .maxtype =IFLA_WWAN_MAX , .alloc = wwan_rtnl_alloc, .validate = wwan_rtnl_validate, .newlink = wwan_rtnl_newlink,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/137 docs: net: reformat driver.rst from a list to sections
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit d2f5c68e3f7157e874a759e382a5eaffa775b869 ]
driver.rst had a historical form of list of common problems. In the age os Sphinx and rendered documentation it's better to use the more usual title + text format.
This will allow us to render kdoc into the output more naturally.
No changes to the actual text.
Stable-dep-of: 95ecba62e2fd ("net: fix races in netdev_tx_sent_queue()/dev_watchdog()")
--- Documentation/networking/driver.rst | 91 ++++++++++++++++++----------- 1 file changed, 56 insertions(+), 35 deletions(-)
Documentation/networking/driver.rst +56 -35
@@ -4,15 +4,19 @@ Softnet Driver Issues ===================== -Transmit path guidelines: +Transmit path guidelines +======================== -1) The ndo_start_xmit method must not return NETDEV_TX_BUSY under - any normal circumstances. It is considered a hard error unless - there is no way your device can tell ahead of time when its - transmit function will become busy. +Stop queues in advance +---------------------- - Instead it must maintain the queue properly. For example, - for a driver implementing scatter-gather this means:: +The ndo_start_xmit method must not return NETDEV_TX_BUSY under +any normal circumstances. It is considered a hard error unless +there is no way your device can tell ahead of time when its +transmit function will become busy. + +Instead it must maintain the queue properly. For example, +for a driver implementing scatter-gather this means:: static netdev_tx_t drv_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
@@ -42,56 +46,73 @@ Transmit path guidelines: return NETDEV_TX_OK; } - And then at the end of your TX reclamation event handling:: +And then at the end of your TX reclamation event handling:: if (netif_queue_stopped(dp->dev) && TX_BUFFS_AVAIL(dp) > (MAX_SKB_FRAGS + 1)) netif_wake_queue(dp->dev); - For a non-scatter-gather supporting card, the three tests simply become:: +For a non-scatter-gather supporting card, the three tests simply become:: /* This is a hard error log it. */ if (TX_BUFFS_AVAIL(dp) <= 0) - and:: +and:: if (TX_BUFFS_AVAIL(dp) == 0) - and:: +and:: if (netif_queue_stopped(dp->dev) && TX_BUFFS_AVAIL(dp) > 0) netif_wake_queue(dp->dev); -2) An ndo_start_xmit method must not modify the shared parts of a - cloned SKB. +No exclusive ownership +---------------------- + +An ndo_start_xmit method must not modify the shared parts of a +cloned SKB. + +Timely completions +------------------ + +Do not forget that once you return NETDEV_TX_OK from your +ndo_start_xmit method, it is your driver's responsibility to free +up the SKB and in some finite amount of time. -3) Do not forget that once you return NETDEV_TX_OK from your - ndo_start_xmit method, it is your driver's responsibility to free - up the SKB and in some finite amount of time. +For example, this means that it is not allowed for your TX +mitigation scheme to let TX packets "hang out" in the TX +ring unreclaimed forever if no new TX packets are sent. +This error can deadlock sockets waiting for send buffer room +to be freed up. - For example, this means that it is not allowed for your TX - mitigation scheme to let TX packets "hang out" in the TX - ring unreclaimed forever if no new TX packets are sent. - This error can deadlock sockets waiting for send buffer room - to be freed up. +If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you +must not keep any reference to that SKB and you must not attempt +to free it up. - If you return NETDEV_TX_BUSY from the ndo_start_xmit method, you - must not keep any reference to that SKB and you must not attempt - to free it up. +Probing guidelines +================== -Probing guidelines: +Address validation +------------------ + +Any hardware layer address you obtain for your device should +be verified. For example, for ethernet check it with +linux/etherdevice.h:is_valid_ether_addr() + +Close/stop guidelines +===================== -1) Any hardware layer address you obtain for your device should - be verified. For example, for ethernet check it with - linux/etherdevice.h:is_valid_ether_addr() +Quiescence +---------- -Close/stop guidelines: +After the ndo_stop routine has been called, the hardware must +not receive or transmit any data. All in flight packets must +be aborted. If necessary, poll or wait for completion of +any reset commands. -1) After the ndo_stop routine has been called, the hardware must - not receive or transmit any data. All in flight packets must - be aborted. If necessary, poll or wait for completion of - any reset commands. +Auto-close +---------- -2) The ndo_stop routine will be called by unregister_netdevice - if device is still UP. +The ndo_stop routine will be called by unregister_netdevice +if device is still UP.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/137 net: provide macros for commonly copied lockless queue stop/wake code
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit c91c46de6bbc1147ae5dfe046b87f5f3d6593215 ]
A lot of drivers follow the same scheme to stop / start queues without introducing locks between xmit and NAPI tx completions. I'm guessing they all copy'n'paste each other's code. The original code dates back all the way to e1000 and Linux 2.6.19.
Smaller drivers shy away from the scheme and introduce a lock which may cause deadlocks in netpoll.
Provide macros which encapsulate the necessary logic.
The macros do not prevent false wake ups, the extra barrier required to close that race is not worth it. See discussion in:
https://lore.kernel.org/all/[email protected]/
Stable-dep-of: 95ecba62e2fd ("net: fix races in netdev_tx_sent_queue()/dev_watchdog()")
--- Documentation/networking/driver.rst | 6 ++ include/linux/netdevice.h | 1 + include/net/netdev_queues.h | 144 ++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 include/net/netdev_queues.h
Documentation/networking/driver.rst +6 -0
@@ -67,6 +67,12 @@ and:: TX_BUFFS_AVAIL(dp) > 0) netif_wake_queue(dp->dev); +Lockless queue stop / wake helper macros +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. kernel-doc:: include/net/netdev_queues.h + :doc: Lockless queue stopping / waking helpers. + No exclusive ownership ----------------------
include/linux/netdevice.h +1 -0
@@ -3274,6 +3274,7 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) static __always_inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) { +/* Must be an atomic op see netif_txq_try_stop() */ set_bit (__QUEUE_STATE_DRV_XOFF, &dev_queue->state); }
include/net/netdev_queues.h new file +144 -0
144 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/137 net/sched: adjust device watchdog timer to detect stopped queue at right time
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Praveen Kumar Kannoju <[email protected]>
[ Upstream commit 33fb988b67050d9bb512f77f08453fa00088943c ]
Applications are sensitive to long network latency, particularly heartbeat monitoring ones. Longer the tx timeout recovery higher the risk with such applications on a production machines. This patch remedies, yet honoring device set tx timeout.
Modify watchdog next timeout to be shorter than the device specified. Compute the next timeout be equal to device watchdog timeout less the how long ago queue stop had been done. At next watchdog timeout tx timeout handler is called into if still in stopped state. Either called or not called, restore the watchdog timeout back to device specified.
Stable-dep-of: 95ecba62e2fd ("net: fix races in netdev_tx_sent_queue()/dev_watchdog()")
--- net/sched/sch_generic.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/sched/sch_generic.c +7 -4
@@ -505,19 +505,22 @@ static void dev_watchdog(struct timer_list *t)unsigned int timedout_ms =0 ;unsigned int i;unsigned long trans_start; +unsigned long oldest_start = jiffies;for (i =0 ; i < dev->num_tx_queues; i++) {struct netdev_queue *txq; txq =netdev_get_tx_queue (dev, i); trans_start =READ_ONCE (txq->trans_start); -if (netif_xmit_stopped (txq) && -time_after (jiffies, (trans_start + - dev->watchdog_timeo))) { +if (!netif_xmit_stopped (txq)) +continue ; +if (time_after (jiffies, trans_start + dev->watchdog_timeo)) { timedout_ms =jiffies_to_msecs (jiffies - trans_start);atomic_long_inc (&txq->trans_timeout);break ; } +if (time_after (oldest_start, trans_start)) + oldest_start = trans_start; }if (unlikely (timedout_ms)) {
@@ -530,7 +533,7 @@ static void dev_watchdog(struct timer_list *t)netif_unfreeze_queues (dev); }if (!mod_timer (&dev->watchdog_timer, -round_jiffies (jiffies + +round_jiffies (oldest_start + dev->watchdog_timeo))) release = false; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/137 net: fix races in netdev_tx_sent_queue()/dev_watchdog()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 95ecba62e2fd201bcdcca636f5d774f1cd4f1458 ]
Some workloads hit the infamous dev_watchdog() message:
"NETDEV WATCHDOG: eth0 (xxxx): transmit queue XX timed out"
It seems possible to hit this even for perfectly normal BQL enabled drivers:
1) Assume a TX queue was idle for more than dev->watchdog_timeo (5 seconds unless changed by the driver)
2) Assume a big packet is sent, exceeding current BQL limit.
3) Driver ndo_start_xmit() puts the packet in TX ring, and netdev_tx_sent_queue() is called.
4) QUEUE_STATE_STACK_XOFF could be set from netdev_tx_sent_queue() before txq->trans_start has been written.
5) txq->trans_start is written later, from netdev_start_xmit()
if (rc == NETDEV_TX_OK)
txq_trans_update(txq)dev_watchdog() running on another cpu could read the old txq->trans_start, and then see QUEUE_STATE_STACK_XOFF, because 5) did not happen yet.
To solve the issue, write txq->trans_start right before one XOFF bit is set :
- _QUEUE_STATE_DRV_XOFF from netif_tx_stop_queue()
- __QUEUE_STATE_STACK_XOFF from netdev_tx_sent_queue()
Quoted 1 line
From
dev_watchdog(), we have to readtxq->statebeforetxq->trans_start.
Add memory barriers to enforce correct ordering.
In the future, we could avoid writing over txq->trans_start for normal operations, and rename this field to txq->xoff_start_time.
--- include/linux/netdevice.h | 12 ++++++++++++ net/sched/sch_generic.c | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-)
include/linux/netdevice.h +12 -0
@@ -3274,6 +3274,12 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) static __always_inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) { +/* Paired with READ_ONCE() from dev_watchdog() */ +WRITE_ONCE (dev_queue->trans_start, jiffies); + +/* This barrier is paired with smp_mb() from dev_watchdog() */ +smp_mb__before_atomic (); +/* Must be an atomic op see netif_txq_try_stop() */ set_bit (__QUEUE_STATE_DRV_XOFF, &dev_queue->state); }
@@ -3390,6 +3396,12 @@ static inline void netdev_tx_sent_queue(struct netdev_queue *dev_queue,if (likely (dql_avail (&dev_queue->dql) >=0 ))return ; +/* Paired with READ_ONCE() from dev_watchdog() */ +WRITE_ONCE (dev_queue->trans_start, jiffies); + +/* This barrier is paired with smp_mb() from dev_watchdog() */ +smp_mb__before_atomic (); +set_bit (__QUEUE_STATE_STACK_XOFF, &dev_queue->state);/*
net/sched/sch_generic.c +7 -1
@@ -511,9 +511,15 @@ static void dev_watchdog(struct timer_list *t)struct netdev_queue *txq; txq =netdev_get_tx_queue (dev, i); - trans_start =READ_ONCE (txq->trans_start);if (!netif_xmit_stopped (txq))continue ; + +/* Paired with WRITE_ONCE() + smp_mb...() in +* netdev_tx_sent_queue() and netif_tx_stop_queue(). +*/ +smp_mb (); + trans_start =READ_ONCE (txq->trans_start); +if (time_after (jiffies, trans_start + dev->watchdog_timeo)) { timedout_ms =jiffies_to_msecs (jiffies - trans_start);atomic_long_inc (&txq->trans_timeout);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 100/137 net: usb: usbnet: fix name regression
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit 8a7d12d674ac6f2147c18f36d1e15f1a48060edf ]
The fix for MAC addresses broke detection of the naming convention because it gave network devices no random MAC before bind() was called. This means that the check for the local assignment bit was always negative as the address was zeroed from allocation, instead of from overwriting the MAC with a unique hardware address.
The correct check for whether bind() has altered the MAC is done with is_zero_ether_addr
--- drivers/net/usb/usbnet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/usb/usbnet.c +2 -1
@@ -1766,7 +1766,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)// can rename the link if it knows better. if ((dev->driver_info->flags &FLAG_ETHER ) !=0 && ((dev->driver_info->flags &FLAG_POINTTOPOINT ) ==0 || - (net->dev_addr [0 ] &0x02 ) ==0 )) +/* somebody touched it*/ + !is_zero_ether_addr (net->dev_addr)))strscpy (net->name,"eth%d" ,sizeof (net->name));/* WLAN devices should always be named "wlan%d" */ if ((dev->driver_info->flags &FLAG_WLAN ) !=0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 101/137 net/sched: act_api: deny mismatched skip_sw/skip_hw flags for actions created by classifiers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 34d35b4edbbe890a91bec939bfd29ad92517a52b ]
tcf_action_init() has logic for checking mismatches between action and filter offload flags (skip_sw/skip_hw). AFAIU, this is intended to run on the transition between the new tc_act_bind(flags) returning true (aka now gets bound to classifier) and tc_act_bind(act->tcfa_flags) returning false (aka action was not bound to classifier before). Otherwise, the check is skipped.
For the case where an action is not standalone, but rather it was created by a classifier and is bound to it, tcf_action_init() skips the check entirely, and this means it allows mismatched flags to occur.
Taking the matchall classifier code path as an example (with mirred as an action), the reason is the following:
1 | mall_change() 2 | -> mall_replace_hw_filter() 3 | -> tcf_exts_validate_ex() 4 | -> flags |= TCA_ACT_FLAGS_BIND; 5 | -> tcf_action_init() 6 | -> tcf_action_init_1() 7 | -> a_o->init() 8 | -> tcf_mirred_init() 9 | -> tcf_idr_create_from_flags() 10 | -> tcf_idr_create() 11 | -> p->tcfa_flags = flags; 12 | -> tc_act_bind(flags)) 13 | -> tc_act_bind(act->tcfa_flags)
When invoked from tcf_exts_validate_ex() like matchall does (but other classifiers validate their extensions as well), tcf_action_init() runs in a call path where "flags" always contains TCA_ACT_FLAGS_BIND (set by line 4). So line 12 is always true, and line 13 is always true as well. No transition ever takes place, and the check is skipped.
The code was added in this form in commit c86e0209dc77 ("flow_offload:
validate flags of filter and actions"), but I'm attributing the blame even earlier in that series, to when TCA_ACT_FLAGS_SKIP_HW and TCA_ACT_FLAGS_SKIP_SW were added to the UAPI.
Following the development process of this change, the check did not always exist in this form. A change took place between v3 [1] and v4 [2], AFAIU due to review feedback that it doesn't make sense for action flags to be different than classifier flags. I think I agree with that feedback, but it was translated into code that omits enforcing this for "classic" actions created at the same time with the filters themselves.
There are 3 more important cases to discuss. First there is this command:
$ tc qdisc add dev eth0 clasct $ tc filter add dev eth0 ingress matchall skip_sw \ action mirred ingress mirror dev eth1
which should be allowed, because prior to the concept of dedicated action flags, it used to work and it used to mean the action inherited the skip_sw/skip_hw flags from the classifier. It's not a mismatch.
Then we have this command:
$ tc qdisc add dev eth0 clasct $ tc filter add dev eth0 ingress matchall skip_sw \ action mirred ingress mirror dev eth1 skip_hw
where there is a mismatch and it should be rejected.
Finally, we have:
$ tc qdisc add dev eth0 clasct $ tc filter add dev eth0 ingress matchall skip_sw \ action mirred ingress mirror dev eth1 skip_sw
where the offload flags coincide, and this should be treated the same as the first command based on inheritance, and accepted.
[1]: https://lore.kernel.org/netdev/[email protected]/
[2]: https://lore.kernel.org/netdev/[email protected]/
--- net/sched/act_api.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
net/sched/act_api.c +22 -1
@@ -1493,8 +1493,29 @@ int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,bool skip_sw =tc_skip_sw (fl_flags);bool skip_hw =tc_skip_hw (fl_flags); -if (tc_act_bind (act->tcfa_flags)) +if (tc_act_bind (act->tcfa_flags)) { +/* Action is created by classifier and is not +* standalone. Check that the user did not set +* any action flags different than the +* classifier flags, and inherit the flags from +* the classifier for the compatibility case +* where no flags were specified at all. +*/ +if ((tc_act_skip_sw (act->tcfa_flags) && !skip_sw) || + (tc_act_skip_hw (act->tcfa_flags) && !skip_hw)) { +NL_SET_ERR_MSG (extack, +"Mismatch between action and filter offload flags" ); + err = -EINVAL ; + goto err; + } +if (skip_sw) + act->tcfa_flags |=TCA_ACT_FLAGS_SKIP_SW ; +if (skip_hw) + act->tcfa_flags |=TCA_ACT_FLAGS_SKIP_HW ;continue ; + } + +/* Action is standalone */ if (skip_sw !=tc_act_skip_sw (act->tcfa_flags) || skip_hw !=tc_act_skip_hw (act->tcfa_flags)) { NL_SET_ERR_MSG(extack,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 102/137 net: sched: fix use-after-free in taprio_change()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit f504465970aebb2467da548f7c1efbbf36d0f44b ]
In 'taprio_change()', 'admin' pointer may become dangling due to sched switch / removal caused by 'advance_sched()', and critical section protected by 'q->current_entry_lock' is too small to prevent from such a scenario (which causes use-after-free detected by KASAN). Fix this by prefer 'rcu_replace_pointer()' over 'rcu_assign_pointer()' to update 'admin' immediately before an attempt to schedule freeing.
--- net/sched/sch_taprio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sched/sch_taprio.c +2 -1
@@ -1681,7 +1681,8 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,taprio_start_sched (sch, start, new_admin); -rcu_assign_pointer (q->admin_sched, new_admin); + admin =rcu_replace_pointer (q->admin_sched, new_admin, +lockdep_rtnl_is_held ());if (admin)call_rcu (&admin->rcu, taprio_free_sched_cb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 103/137 r8169: avoid unsolicited interrupts
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 10ce0db787004875f4dba068ea952207d1d8abeb ]
It was reported that after resume from suspend a PCI error is logged and connectivity is broken. Error message is:
PCI error (cmd = 0x0407, status_errs = 0x0000)
The message seems to be a red herring as none of the error bits is set, and the PCI command register value also is normal. Exception handling for a PCI error includes a chip reset what apparently brakes connectivity here. The interrupt status bit triggering the PCI error handling isn't actually used on PCIe chip versions, so it's not clear why this bit is set by the chip. Fix this by ignoring this bit on PCIe chip versions.
--- drivers/net/ethernet/realtek/r8169_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/realtek/r8169_main.c +3 -1
@@ -4617,7 +4617,9 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)if ((status &0xffff ) ==0xffff || !(status & tp->irq_mask))return IRQ_NONE ; -if (unlikely (status & SYSErr)) { +/* At least RTL8168fp may unexpectedly set the SYSErr bit */ +if (unlikely (status & SYSErr && + tp->mac_version <=RTL_GIGA_MAC_VER_06 )) {rtl8169_pcierr_interrupt (tp->dev); goto out; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 104/137 posix-clock: posix-clock: Fix unbalanced locking in pc_clock_settime()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 6e62807c7fbb3c758d233018caf94dfea9c65dbd ]
If get_clock_desc() succeeds, it calls fget() for the clockid's fd, and get the clk->rwsem read lock, so the error path should release the lock to make the lock balance and fput the clockid's fd to make the refcount balance and release the fd related resource.
However the below commit left the error path locked behind resulting in unbalanced locking. Check timespec64_valid_strict() before get_clock_desc() to fix it, because the "ts" is not changed after that.
--- kernel/time/posix-clock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/time/posix-clock.c +3 -3
@@ -290,6 +290,9 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts)struct posix_clock_desc cd;int err; +if (!timespec64_valid_strict (ts)) +return -EINVAL ; + err =get_clock_desc (id, &cd);if (err)return err;
@@ -299,9 +302,6 @@ static int pc_clock_settime(clockid_t id, const struct timespec64 *ts) goto out; } -if (!timespec64_valid_strict (ts)) -return -EINVAL ; -if (cd.clk->ops.clock_settime) err = cd.clk->ops.clock_settime (cd.clk, ts);else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 105/137 Bluetooth: SCO: Fix UAF on sco_sock_timeout
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 1bf4470a3939c678fb822073e9ea77a0560bc6bb ]
conn->sk maybe have been unlinked/freed while waiting for sco_conn_lock so this checks if the conn->sk is still valid by checking if it part of sco_sk_list.
--- include/net/bluetooth/bluetooth.h | 1 + net/bluetooth/af_bluetooth.c | 22 ++++++++++++++++++++++ net/bluetooth/sco.c | 18 ++++++++++++------ 3 files changed, 35 insertions(+), 6 deletions(-)
include/net/bluetooth/bluetooth.h +1 -0
@@ -383,6 +383,7 @@ int bt_sock_register(int proto, const struct net_proto_family *ops);void bt_sock_unregister (int proto);void bt_sock_link (struct bt_sock_list *l,struct sock *s);void bt_sock_unlink (struct bt_sock_list *l,struct sock *s); +bool bt_sock_linked (struct bt_sock_list *l,struct sock *s);struct sock *bt_sock_alloc (struct net *net,struct socket *sock,struct proto *prot,int proto,gfp_t prio,int kern); int bt_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
net/bluetooth/af_bluetooth.c +22 -0
@@ -177,6 +177,28 @@ void bt_sock_unlink(struct bt_sock_list *l, struct sock *sk) }EXPORT_SYMBOL (bt_sock_unlink); +bool bt_sock_linked (struct bt_sock_list *l,struct sock *s) +{ +struct sock *sk; + +if (!l || !s) +return false; + +read_lock (&l->lock); + +sk_for_each (sk, &l->head) { +if (s == sk) { +read_unlock (&l->lock); +return true; + } + } + +read_unlock (&l->lock); + +return false; +} +EXPORT_SYMBOL (bt_sock_linked); +void bt_accept_enqueue (struct sock *parent,struct sock *sk,bool bh) {BT_DBG ("parent %p, sk %p" , parent, sk);
net/bluetooth/sco.c +12 -6
@@ -77,6 +77,16 @@ struct sco_pinfo {#define SCO_CONN_TIMEOUT (HZ * 40)#define SCO_DISCONN_TIMEOUT (HZ * 2) +static struct sock *sco_sock_hold (struct sco_conn *conn) +{ +if (!conn || !bt_sock_linked (&sco_sk_list, conn->sk)) +return NULL ; + +sock_hold (conn->sk); + +return conn->sk; +} +static void sco_sock_timeout (struct work_struct *work) { struct sco_conn *conn = container_of(work, struct sco_conn,
@@ -88,9 +98,7 @@ static void sco_sock_timeout(struct work_struct *work)sco_conn_unlock (conn);return ; } - sk = conn->sk; -if (sk) -sock_hold (sk); + sk =sco_sock_hold (conn);sco_conn_unlock (conn);if (!sk)
@@ -195,9 +203,7 @@ static void sco_conn_del(struct hci_conn *hcon, int err)/* Kill socket */ sco_conn_lock (conn); - sk = conn->sk; -if (sk) -sock_hold (sk); + sk =sco_sock_hold (conn);sco_conn_unlock (conn);if (sk) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 106/137 Bluetooth: ISO: Fix UAF on iso_sock_timeout
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit 246b435ad668596aa0e2bbb9d491b6413861211a ]
conn->sk maybe have been unlinked/freed while waiting for iso_conn_lock so this checks if the conn->sk is still valid by checking if it part of iso_sk_list.
--- net/bluetooth/iso.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
net/bluetooth/iso.c +12 -6
@@ -68,6 +68,16 @@ struct iso_pinfo {#define ISO_CONN_TIMEOUT (HZ * 40)#define ISO_DISCONN_TIMEOUT (HZ * 2) +static struct sock *iso_sock_hold (struct iso_conn *conn) +{ +if (!conn || !bt_sock_linked (&iso_sk_list, conn->sk)) +return NULL ; + +sock_hold (conn->sk); + +return conn->sk; +} +static void iso_sock_timeout (struct work_struct *work) { struct iso_conn *conn = container_of(work, struct iso_conn,
@@ -75,9 +85,7 @@ static void iso_sock_timeout(struct work_struct *work)struct sock *sk;iso_conn_lock (conn); - sk = conn->sk; -if (sk) -sock_hold (sk); + sk =iso_sock_hold (conn);iso_conn_unlock (conn);if (!sk)
@@ -184,9 +192,7 @@ static void iso_conn_del(struct hci_conn *hcon, int err)/* Kill socket */ iso_conn_lock (conn); - sk = conn->sk; -if (sk) -sock_hold (sk); + sk =iso_sock_hold (conn);iso_conn_unlock (conn);if (sk) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 107/137 bpf,perf: Fix perf_event_detach_bpf_prog error handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 0ee288e69d033850bc87abe0f9cc3ada24763d7f ]
Peter reported that perf_event_detach_bpf_prog might skip to release the bpf program for -ENOENT error from bpf_prog_array_copy.
This can't happen because bpf program is stored in perf event and is detached and released only when perf event is freed.
Let's drop the -ENOENT check and make sure the bpf program is released in any case.
--- kernel/trace/bpf_trace.c | 2 -- 1 file changed, 2 deletions(-)
kernel/trace/bpf_trace.c +0 -2
@@ -2179,8 +2179,6 @@ void perf_event_detach_bpf_prog(struct perf_event *event) old_array =bpf_event_rcu_dereference (event->tp_event->prog_array); ret =bpf_prog_array_copy (old_array, event->prog,NULL ,0 , &new_array); -if (ret == -ENOENT ) - goto unlock;if (ret <0 ) {bpf_prog_array_delete_safe (old_array, event->prog); }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 108/137 ASoC: dt-bindings: davinci-mcasp: Fix interrupts property
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
[ Upstream commit 17d8adc4cd5181c13c1041b197b76efc09eaf8a8 ]
My understanding of the interrupts property is that it can either be:
1/ - TX
2/ - TX
- RX
3/ - Common/combined.
There are very little chances that either:
- TX
- Common/combined
or even
- TX
- RX
- Common/combined
could be a thing.
Looking at the interrupt-names definition (which uses oneOf instead of anyOf), it makes indeed little sense to use anyOf in the interrupts definition. I believe this is just a mistake, hence let's fix it.
--- .../devicetree/bindings/sound/davinci-mcasp-audio.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml +1 -1
@@ -102,7 +102,7 @@ properties: default: 2 interrupts: - anyOf: + oneOf: - minItems: 1 items: - description: TX interrupt
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 109/137 ASoC: dt-bindings: davinci-mcasp: Fix interrupt properties
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
[ Upstream commit 8380dbf1b9ef66e3ce6c1d660fd7259637c2a929 ]
Combinations of "tx" alone, "rx" alone and "tx", "rx" together are supposedly valid (see link below), which is not the case today as "rx" alone is not accepted by the current binding.
Let's rework the two interrupt properties to expose all correct possibilities.
--- .../bindings/sound/davinci-mcasp-audio.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml +9 -9
@@ -102,21 +102,21 @@ properties: default: 2 interrupts: - oneOf: - - minItems: 1 - items: - - description: TX interrupt - - description: RX interrupt - - items: - - description: common/combined interrupt + minItems: 1 + maxItems: 2 interrupt-names: oneOf: - - minItems: 1 + - description: TX interrupt + const: tx + - description: RX interrupt + const: rx + - description: TX and RX interrupts items: - const: tx - const: rx - - const: common + - description: Common/combined interrupt + const: common fck_parent: $ref: /schemas/types.yaml#/definitions/string
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 110/137 ALSA: firewire-lib: Avoid division by zero in apply_constraint_to_size()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Shumilin <[email protected]>
[ Upstream commit 72cafe63b35d06b5cfbaf807e90ae657907858da ]
The step variable is initialized to zero. It is changed in the loop, but if it's not changed it will remain zero. Add a variable check before the division.
The observed behavior was introduced by commit 826b5de90c0b ("ALSA: firewire-lib: fix insufficient PCM rule for period/buffer size"), and it is difficult to show that any of the interval parameters will satisfy the snd_interval_test() condition with data from the amdtp_rate_table[] table.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- sound/firewire/amdtp-stream.c | 3 +++ 1 file changed, 3 insertions(+)
sound/firewire/amdtp-stream.c +3 -0
@@ -172,6 +172,9 @@ static int apply_constraint_to_size(struct snd_pcm_hw_params *params, step =max (step, amdtp_syt_intervals[i]); } +if (step ==0 ) +return -EINVAL ; + t.min =roundup (s->min, step); t.max =rounddown (s->max, step); t.integer =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 111/137 powercap: dtpm_devfreq: Fix error check against dev_pm_qos_add_request()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Can <[email protected]>
[ Upstream commit 5209d1b654f1db80509040cc694c7814a1b547e3 ]
The caller of the function dev_pm_qos_add_request() checks again a non zero value but dev_pm_qos_add_request() can return '1' if the request already exists. Therefore, the setup function fails while the QoS request actually did not failed.
Fix that by changing the check against a negative value like all the other callers of the function.
--- drivers/powercap/dtpm_devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/powercap/dtpm_devfreq.c +1 -1
@@ -166,7 +166,7 @@ static int __dtpm_devfreq_setup(struct devfreq *devfreq, struct dtpm *parent) ret =dev_pm_qos_add_request (dev, &dtpm_devfreq->qos_req,DEV_PM_QOS_MAX_FREQUENCY ,PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE ); -if (ret) { +if (ret <0 ) {pr_err ("Failed to add QoS request: %d\n" , ret); goto out_dtpm_unregister; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 112/137 ALSA: hda/realtek: Update default depop procedure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
[ Upstream commit e3ea2757c312e51bbf62ebc434a6f7df1e3a201f ]
Old procedure has a chance to meet Headphone no output.
--- sound/pci/hda/patch_realtek.c | 38 ++++++++++++++++------------------- 1 file changed, 17 insertions(+), 21 deletions(-)
sound/pci/hda/patch_realtek.c +17 -21
@@ -3854,20 +3854,18 @@ static void alc_default_init(struct hda_codec *codec) hp_pin_sense =snd_hda_jack_detect (codec, hp_pin); -if (hp_pin_sense) +if (hp_pin_sense) {msleep (2 ); -snd_hda_codec_write (codec, hp_pin,0 , -AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); - -if (hp_pin_sense) -msleep (85 ); +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_PIN_WIDGET_CONTROL ,PIN_OUT ); -snd_hda_codec_write (codec, hp_pin,0 , -AC_VERB_SET_PIN_WIDGET_CONTROL ,PIN_OUT ); +msleep (75 ); -if (hp_pin_sense) -msleep (100 ); +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_UNMUTE ); +msleep (75 ); + } }static void alc_default_shutup (struct hda_codec *codec)
@@ -3883,22 +3881,20 @@ static void alc_default_shutup(struct hda_codec *codec) hp_pin_sense =snd_hda_jack_detect (codec, hp_pin); -if (hp_pin_sense) +if (hp_pin_sense) {msleep (2 ); -snd_hda_codec_write (codec, hp_pin,0 , -AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); - -if (hp_pin_sense) -msleep (85 ); - -if (!spec->no_shutup_pins)snd_hda_codec_write (codec, hp_pin,0 , -AC_VERB_SET_PIN_WIDGET_CONTROL ,0x0 ); +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); -if (hp_pin_sense) -msleep (100 ); +msleep (75 ); +if (!spec->no_shutup_pins) +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_PIN_WIDGET_CONTROL ,0x0 ); + +msleep (75 ); + }alc_auto_setup_eapd (codec, false);alc_shutup_pins (codec); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 113/137 cpufreq/cppc: Move and rename cppc_cpufreq_{perf_to_khz|khz_to_perf}()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vincent Guittot <[email protected]>
[ Upstream commit 50b813b147e9eb6546a1fc49d4e703e6d23691f2 ]
Move and rename cppc_cpufreq_perf_to_khz() and cppc_cpufreq_khz_to_perf() to use them outside cppc_cpufreq in topology_init_cpu_capacity_cppc().
Modify the interface to use struct cppc_perf_caps *caps instead of struct cppc_cpudata *cpu_data as we only use the fields of cppc_perf_caps.
cppc_cpufreq was converting the lowest and nominal freq from MHz to kHz before using them. We move this conversion inside cppc_perf_to_khz and cppc_khz_to_perf to make them generic and usable outside cppc_cpufreq.
No functional change
Stable-dep-of: d93df29bdab1 ("cpufreq: CPPC: fix perf_to_khz/khz_to_perf conversion exception")
--- drivers/acpi/cppc_acpi.c | 104 ++++++++++++++++++++++++ drivers/cpufreq/cppc_cpufreq.c | 139 ++++----------------------------- include/acpi/cppc_acpi.h | 2 + 3 files changed, 123 insertions(+), 122 deletions(-)
drivers/acpi/cppc_acpi.c +104 -0
@@ -39,6 +39,9 @@#include <linux/rwsem.h> #include <linux/wait.h> #include <linux/topology.h> +#include <linux/dmi.h> +#include <linux/units.h> +#include <asm/unaligned.h> #include <acpi/cppc_acpi.h>
@@ -1664,3 +1667,104 @@ unsigned int cppc_get_transition_latency(int cpu_num)return latency_ns; }EXPORT_SYMBOL_GPL (cppc_get_transition_latency); + +/* Minimum struct length needed for the DMI processor entry we want */ +#define DMI_ENTRY_PROCESSOR_MIN_LENGTH 48 + +/* Offset in the DMI processor structure for the max frequency */ +#define DMI_PROCESSOR_MAX_SPEED 0x14 + +/* Callback function used to retrieve the max frequency from DMI */ +static void cppc_find_dmi_mhz (const struct dmi_header *dm,void *private) +{ +const u8 *dmi_data = (const u8 *)dm; +u16 *mhz = (u16 *)private; + +if (dm->type ==DMI_ENTRY_PROCESSOR && + dm->length >=DMI_ENTRY_PROCESSOR_MIN_LENGTH ) { +u16 val = (u16 )get_unaligned ((const u16 *) + (dmi_data +DMI_PROCESSOR_MAX_SPEED )); + *mhz = val > *mhz ? val : *mhz; + } +} + +/* Look up the max frequency in DMI */ +static u64 cppc_get_dmi_max_khz (void ) +{ +u16 mhz =0 ; + +dmi_walk (cppc_find_dmi_mhz, &mhz); + +/* +* Real stupid fallback value, just in case there is no +* actual value set. +*/ + mhz = mhz ? mhz :1 ; + +return KHZ_PER_MHZ * mhz; +} + +/* +* If CPPC lowest_freq and nominal_freq registers are exposed then we can +* use them to convert perf to freq and vice versa. The conversion is +* extrapolated as an affine function passing by the 2 points: +* - (Low perf, Low freq) +* - (Nominal perf, Nominal freq) +*/ +unsigned int cppc_perf_to_khz (struct cppc_perf_caps *caps,unsigned int perf) +{ +s64 retval, offset =0 ; +static u64 max_khz; +u64 mul, div; + +if (caps->lowest_freq && caps->nominal_freq) { + mul = caps->nominal_freq - caps->lowest_freq; + mul *=KHZ_PER_MHZ ; + div = caps->nominal_perf - caps->lowest_perf; + offset = caps->nominal_freq *KHZ_PER_MHZ - +div64_u64 (caps->nominal_perf * mul, div); + }else { +if (!max_khz) + max_khz =cppc_get_dmi_max_khz (); + mul = max_khz; + div = caps->highest_perf; + } + + retval = offset +div64_u64 (perf * mul, div); +if (retval >=0 ) +return retval; +return 0 ; +} +EXPORT_SYMBOL_GPL (cppc_perf_to_khz); + +unsigned int cppc_khz_to_perf (struct cppc_perf_caps *caps,unsigned int freq) +{ +s64 retval, offset =0 ; +static u64 max_khz; +u64 mul, div; + +if (caps->lowest_freq && caps->nominal_freq) { + mul = caps->nominal_perf - caps->lowest_perf; + div = caps->nominal_freq - caps->lowest_freq; +/* +* We don't need to convert to kHz for computing offset and can +* directly use nominal_freq and lowest_freq as the div64_u64 +* will remove the frequency unit. +*/ + offset = caps->nominal_perf - +div64_u64 (caps->nominal_freq * mul, div); +/* But we need it for computing the perf level. */ + div *=KHZ_PER_MHZ ; + }else { +if (!max_khz) + max_khz =cppc_get_dmi_max_khz (); + mul = caps->highest_perf; + div = max_khz; + } + + retval = offset +div64_u64 (freq * mul, div); +if (retval >=0 ) +return retval; +return 0 ; +} +EXPORT_SYMBOL_GPL (cppc_khz_to_perf);
drivers/cpufreq/cppc_cpufreq.c +17 -122
239 lines not on this page · raw message
include/acpi/cppc_acpi.h +2 -0
@@ -143,6 +143,8 @@ extern int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls);extern int cppc_set_enable (int cpu,bool enable);extern int cppc_get_perf_caps (int cpu,struct cppc_perf_caps *caps);extern bool cppc_perf_ctrs_in_pcc (void ); +extern unsigned int cppc_perf_to_khz (struct cppc_perf_caps *caps,unsigned int perf); +extern unsigned int cppc_khz_to_perf (struct cppc_perf_caps *caps,unsigned int freq);extern bool acpi_cpc_valid (void );extern bool cppc_allow_fast_switch (void );extern int acpi_get_psd_map (unsigned int cpu,struct cppc_cpudata *cpu_data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 114/137 cpufreq: CPPC: fix perf_to_khz/khz_to_perf conversion exception
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: liwei <[email protected]>
[ Upstream commit d93df29bdab133b85e94b3c328e7fe26a0ebd56c ]
When the nominal_freq recorded by the kernel is equal to the lowest_freq, and the frequency adjustment operation is triggered externally, there is a logic error in cppc_perf_to_khz()/cppc_khz_to_perf(), resulting in perf and khz conversion errors.
Fix this by adding a branch processing logic when nominal_freq is equal to lowest_freq.
--- drivers/acpi/cppc_acpi.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/acpi/cppc_acpi.c +17 -5
@@ -1718,9 +1718,15 @@ unsigned int cppc_perf_to_khz(struct cppc_perf_caps *caps, unsigned int perf)u64 mul, div;if (caps->lowest_freq && caps->nominal_freq) { - mul = caps->nominal_freq - caps->lowest_freq; +/* Avoid special case when nominal_freq is equal to lowest_freq */ +if (caps->lowest_freq == caps->nominal_freq) { + mul = caps->nominal_freq; + div = caps->nominal_perf; + }else { + mul = caps->nominal_freq - caps->lowest_freq; + div = caps->nominal_perf - caps->lowest_perf; + } mul *=KHZ_PER_MHZ ; - div = caps->nominal_perf - caps->lowest_perf; offset = caps->nominal_freq *KHZ_PER_MHZ -div64_u64 (caps->nominal_perf * mul, div); }else {
@@ -1741,11 +1747,17 @@ unsigned int cppc_khz_to_perf(struct cppc_perf_caps *caps, unsigned int freq) {s64 retval, offset =0 ;static u64 max_khz; -u64 mul, div; +u64 mul, div;if (caps->lowest_freq && caps->nominal_freq) { - mul = caps->nominal_perf - caps->lowest_perf; - div = caps->nominal_freq - caps->lowest_freq; +/* Avoid special case when nominal_freq is equal to lowest_freq */ +if (caps->lowest_freq == caps->nominal_freq) { + mul = caps->nominal_perf; + div = caps->nominal_freq; + }else { + mul = caps->nominal_perf - caps->lowest_perf; + div = caps->nominal_freq - caps->lowest_freq; + }/* * We don't need to convert to kHz for computing offset and can * directly use nominal_freq and lowest_freq as the div64_u64
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 115/137 btrfs: fix passing 0 to ERR_PTR in btrfs_search_dir_index_item()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yue Haibing <[email protected]>
commit 75f49c3dc7b7423d3734f2e4dabe3dac8d064338 upstream.
The ret may be zero in btrfs_search_dir_index_item() and should not passed to ERR_PTR(). Now btrfs_unlink_subvol() is the only caller to this, reconstructed it to check ERR_PTR(-ENOENT) while ret >= 0.
This fixes smatch warnings:
fs/btrfs/dir-item.c:353
btrfs_search_dir_index_item() warn: passing zero to 'ERR_PTR'
--- fs/btrfs/dir-item.c | 4 ++-- fs/btrfs/inode.c | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-)
fs/btrfs/dir-item.c +2 -2
@@ -341,8 +341,8 @@ btrfs_search_dir_index_item(struct btrfsreturn di; }/* Adjust return code if the key was not found in the next leaf. */ -if (ret >0 ) - ret =0 ; +if (ret >=0 ) + ret = -ENOENT ;return ERR_PTR (ret); }
fs/btrfs/inode.c +2 -5
@@ -4532,11 +4532,8 @@ static int btrfs_unlink_subvol(struct bt*/ if (btrfs_ino (inode) ==BTRFS_EMPTY_SUBVOL_DIR_OBJECTID ) { di =btrfs_search_dir_index_item (root, path, dir_ino, &fname.disk_name); -if (IS_ERR_OR_NULL (di)) { -if (!di) - ret = -ENOENT ; -else - ret =PTR_ERR (di); +if (IS_ERR (di)) { + ret =PTR_ERR (di);btrfs_abort_transaction (trans, ret); goto out; }
Greg Kroah-Hartman
maintainerPATCH 116/137 btrfs: zoned: fix zone unusable accounting for freed reserved extent
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Naohiro Aota <[email protected]>
commit bf9821ba4792a0d9a2e72803ae7b4341faf3d532 upstream.
When btrfs reserves an extent and does not use it (e.g, by an error), it calls btrfs_free_reserved_extent() to free the reserved extent. In the process, it calls btrfs_add_free_space() and then it accounts the region bytes as block_group->zone_unusable.
However, it leaves the space_info->bytes_zone_unusable side not updated. As a result, ENOSPC can happen while a space_info reservation succeeded. The reservation is fine because the freed region is not added in space_info->bytes_zone_unusable, leaving that space as "free". OTOH, corresponding block group counts it as zone_unusable and its allocation pointer is not rewound, we cannot allocate an extent from that block group. That will also negate space_info's async/sync reclaim process, and cause an ENOSPC error from the extent allocation process.
Fix that by returning the space to space_info->bytes_zone_unusable. Ideally, since a bio is not submitted for this reserved region, we should return the space to free space and rewind the allocation pointer. But, it needs rework on extent allocation handling, so let it work in this way for now.
--- fs/btrfs/block-group.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/block-group.c +2 -0
@@ -3562,6 +3562,8 @@ void btrfs_free_reserved_bytes(struct btspin_lock (&cache->lock);if (cache->ro) space_info->bytes_readonly += num_bytes; +else if (btrfs_is_zoned (cache->fs_info)) + space_info->bytes_zone_unusable += num_bytes; cache->reserved -= num_bytes; space_info->bytes_reserved -= num_bytes; space_info->max_extent_size =0 ;
Greg Kroah-Hartman
maintainerPATCH 117/137 drm/amd: Guard against bad data for ATIF ACPI method
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
commit bf58f03931fdcf7b3c45cb76ac13244477a60f44 upstream.
If a BIOS provides bad data in response to an ATIF method call this causes a NULL pointer dereference in the caller.
``` ? show_regs (arch/x86/kernel/dumpstack.c:478 (discriminator 1)) ? __die (arch/x86/kernel/dumpstack.c:423 arch/x86/kernel/dumpstack.c:434) ? page_fault_oops (arch/x86/mm/fault.c:544 (discriminator 2) arch/x86/mm/fault.c:705 (discriminator 2)) ? do_user_addr_fault (arch/x86/mm/fault.c:440 (discriminator 1) arch/x86/mm/fault.c:1232 (discriminator 1)) ? acpi_ut_update_object_reference (drivers/acpi/acpica/utdelete.c:642) ? exc_page_fault (arch/x86/mm/fault.c:1542) ? asm_exc_page_fault (./arch/x86/include/asm/idtentry.h:623) ? amdgpu_atif_query_backlight_caps.constprop.0 (drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c:387 (discriminator 2)) amdgpu ? amdgpu_atif_query_backlight_caps.constprop.0 (drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c:386 (discriminator 1)) amdgpu ```
It has been encountered on at least one system, so guard for it.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +12 -3
@@ -107,6 +107,7 @@ static union acpi_object *amdgpu_atif_ca struct acpi_buffer *params) {acpi_status status; +union acpi_object *obj;union acpi_object atif_arg_elements[2 ];struct acpi_object_list atif_arg;struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER ,NULL };
@@ -129,16 +130,24 @@ static union acpi_object *amdgpu_atif_ca status =acpi_evaluate_object (atif->handle,NULL , &atif_arg, &buffer); + obj = (union acpi_object *)buffer.pointer; -/* Fail only if calling the method fails and ATIF is supported */ +/* Fail if calling the method fails and ATIF is supported */ if (ACPI_FAILURE (status) && status !=AE_NOT_FOUND ) {DRM_DEBUG_DRIVER ("failed to evaluate ATIF got %s\n" ,acpi_format_exception (status)); -kfree (buffer.pointer); +kfree (obj);return NULL ; } -return buffer.pointer; +if (obj->type !=ACPI_TYPE_BUFFER ) { +DRM_DEBUG_DRIVER ("bad object returned from ATIF: %d\n" , + obj->type); +kfree (obj); +return NULL ; + } + +return obj; }/**
Greg Kroah-Hartman
maintainerPATCH 118/137 ACPI: resource: Add LG 16T90SP to irq1_level_low_skip_override[]
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Heusel <[email protected]>
commit 53f1a907d36fb3aa02a4d34073bcec25823a6c74 upstream.
The LG Gram Pro 16 2-in-1 (2024) the 16T90SP has its keybopard IRQ (1) described as ActiveLow in the DSDT, which the kernel overrides to EdgeHigh which breaks the keyboard.
Add the 16T90SP to the irq1_level_low_skip_override[] quirk table to fix this.
--- drivers/acpi/resource.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/acpi/resource.c +7 -0
@@ -502,6 +502,13 @@ static const struct dmi_system_id tongfa DMI_MATCH(DMI_BOARD_NAME, "GMxRGxx"), }, }, + { + /* LG Electronics 16T90SP */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), + DMI_MATCH(DMI_BOARD_NAME, "16T90SP"), + }, + }, { } };
Greg Kroah-Hartman
maintainerPATCH 119/137 ACPI: PRM: Find EFI_MEMORY_RUNTIME block for PRM handler and context
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Koba Ko <[email protected]>
commit 088984c8d54c0053fc4ae606981291d741c5924b upstream.
PRMT needs to find the correct type of block to translate the PA-VA mapping for EFI runtime services.
The issue arises because the PRMT is finding a block of type EFI_CONVENTIONAL_MEMORY, which is not appropriate for runtime services as described in Section 2.2.2 (Runtime Services) of the UEFI Specification [1]. Since the PRM handler is a type of runtime service, this causes an exception when the PRM handler is called.
[Firmware Bug]: Unable to handle paging request in EFI runtime service
WARNING: CPU: 22 PID: 4330 at drivers/firmware/efi/runtime-wrappers.c:341
__efi_queue_work+0x11c/0x170
Call trace:
Let PRMT find a block with EFI_MEMORY_RUNTIME for PRM handler and PRM context.
If no suitable block is found, a warning message will be printed, but the procedure continues to manage the next PRM handler.
However, if the PRM handler is actually called without proper allocation, it would result in a failure during error handling.
By using the correct memory types for runtime services, ensure that the PRM handler and the context are properly mapped in the virtual address space during runtime, preventing the paging request error.
The issue is really that only memory that has been remapped for runtime by the firmware can be used by the PRM handler, and so the region needs to have the EFI_MEMORY_RUNTIME attribute.
--- drivers/acpi/prmt.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-)
drivers/acpi/prmt.c +22 -5
@@ -72,17 +72,21 @@ struct prm_module_info {struct prm_handler_info handlers[]; }; -static u64 efi_pa_va_lookup (u64 pa) +static u64 efi_pa_va_lookup (efi_guid_t *guid,u64 pa) {efi_memory_desc_t *md;u64 pa_offset = pa & ~PAGE_MASK ;u64 page = pa &PAGE_MASK ;for_each_efi_memory_desc (md) { -if (md->phys_addr < pa && pa < md->phys_addr +PAGE_SIZE * md->num_pages) +if ((md->attribute &EFI_MEMORY_RUNTIME ) && + (md->phys_addr < pa && pa < md->phys_addr +PAGE_SIZE * md->num_pages)) {return pa_offset + md->virt_addr + page - md->phys_addr; + } } +pr_warn ("Failed to find VA for GUID: %pUL, PA: 0x%llx" , guid, pa); +return 0 ; }
@@ -148,9 +152,15 @@ acpi_parse_prmt(union acpi_subtable_head th = &tm->handlers[cur_handler];guid_copy (&th->guid, (guid_t *)handler_info->handler_guid); - th->handler_addr = (void *)efi_pa_va_lookup (handler_info->handler_address); - th->static_data_buffer_addr =efi_pa_va_lookup (handler_info->static_data_buffer_address); - th->acpi_param_buffer_addr =efi_pa_va_lookup (handler_info->acpi_param_buffer_address); + th->handler_addr = + (void *)efi_pa_va_lookup (&th->guid, handler_info->handler_address); + + th->static_data_buffer_addr = +efi_pa_va_lookup (&th->guid, handler_info->static_data_buffer_address); + + th->acpi_param_buffer_addr = +efi_pa_va_lookup (&th->guid, handler_info->acpi_param_buffer_address); + }while (++cur_handler < tm->handler_count && (handler_info =get_next_handler (handler_info)));return 0 ;
@@ -253,6 +263,13 @@ static acpi_status acpi_platformrt_spaceif (!handler || !module) goto invalid_guid; +if (!handler->handler_addr || + !handler->static_data_buffer_addr || + !handler->acpi_param_buffer_addr) { + buffer->prm_status =PRM_HANDLER_ERROR ; +return AE_OK ; + } +ACPI_COPY_NAMESEG (context.signature,"PRMC" ); context.revision =0x0 ; context.reserved =0x0 ;
Greg Kroah-Hartman
maintainerPATCH 120/137 ACPI: button: Add DMI quirk for Samsung Galaxy Book2 to fix initial lid detection issue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shubham Panwar <[email protected]>
commit 8fa73ee44daefc884c53a25158c25a4107eb5a94 upstream.
Add a DMI quirk for Samsung Galaxy Book2 to fix an initial lid state detection issue.
The _LID device incorrectly returns the lid status as "closed" during boot, causing the system to enter a suspend loop right after booting.
The quirk ensures that the correct lid state is reported initially, preventing the system from immediately suspending after startup. It only addresses the initial lid state detection and ensures proper system behavior upon boot.
--- drivers/acpi/button.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/acpi/button.c +11 -0
@@ -121,6 +121,17 @@ static const struct dmi_system_id dmi_li }, .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, }, + { + /* + * Samsung galaxybook2 ,initial _LID device notification returns + * lid closed. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "750XED"), + }, + .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, + }, {} };
Greg Kroah-Hartman
maintainerPATCH 121/137 nilfs2: fix kernel bug due to missing clearing of buffer delay flag
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 6ed469df0bfbef3e4b44fca954a781919db9f7ab upstream.
Syzbot reported that after nilfs2 reads a corrupted file system image and degrades to read-only, the BUG_ON check for the buffer delay flag in submit_bh_wbc() may fail, causing a kernel bug.
This is because the buffer delay flag is not cleared when clearing the buffer state flags to discard a page/folio or a buffer head. So, fix this.
This became necessary when the use of nilfs2's own page clear routine was expanded. This state inconsistency does not occur if the buffer is written normally by log writing.
--- fs/nilfs2/page.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nilfs2/page.c +4 -2
@@ -77,7 +77,8 @@ void nilfs_forget_buffer(struct buffer_hconst unsigned long clear_bits = (BIT (BH_Uptodate) |BIT (BH_Dirty) |BIT (BH_Mapped) |BIT (BH_Async_Write) |BIT (BH_NILFS_Volatile) | -BIT (BH_NILFS_Checked) |BIT (BH_NILFS_Redirected)); +BIT (BH_NILFS_Checked) |BIT (BH_NILFS_Redirected) | +BIT (BH_Delay));lock_buffer (bh);set_mask_bits (&bh->b_state, clear_bits,0 );
@@ -409,7 +410,8 @@ void nilfs_clear_dirty_page(struct pageconst unsigned long clear_bits = (BIT (BH_Uptodate) |BIT (BH_Dirty) |BIT (BH_Mapped) |BIT (BH_Async_Write) |BIT (BH_NILFS_Volatile) | -BIT (BH_NILFS_Checked) |BIT (BH_NILFS_Redirected)); +BIT (BH_NILFS_Checked) |BIT (BH_NILFS_Redirected) | +BIT (BH_Delay)); bh = head =page_buffers (page); do {
Greg Kroah-Hartman
maintainerPATCH 122/137 openat2: explicitly return -E2BIG for (usize > PAGE_SIZE)
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksa Sarai <[email protected]>
commit f92f0a1b05698340836229d791b3ffecc71b265a upstream.
While we do currently return -EFAULT in this case, it seems prudent to follow the behaviour of other syscalls like clone3. It seems quite unlikely that anyone depends on this error code being EFAULT, but we can always revert this if it turns out to be an issue.
--- fs/open.c | 2 ++ 1 file changed, 2 insertions(+)
fs/open.c +2 -0
@@ -1361,6 +1361,8 @@ SYSCALL_DEFINE4(openat2, int, dfd, constif (unlikely (usize <OPEN_HOW_SIZE_VER0 ))return -EINVAL ; +if (unlikely (usize >PAGE_SIZE )) +return -E2BIG ; err =copy_struct_from_user (&tmp,sizeof (tmp), how, usize);if (err)
Greg Kroah-Hartman
maintainerPATCH 123/137 KVM: nSVM: Ignore nCR3[4:0] when loading PDPTEs from memory
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Christopherson <[email protected]>
commit f559b2e9c5c5308850544ab59396b7d53cfc67bd upstream.
Ignore nCR3[4:0] when loading PDPTEs from memory for nested SVM, as bits 4:0 of CR3 are ignored when PAE paging is used, and thus VMRUN doesn't enforce 32-byte alignment of nCR3.
In the absolute worst case scenario, failure to ignore bits 4:0 can result in an out-of-bounds read, e.g. if the target page is at the end of a memslot, and the VMM isn't using guard pages.
Per the APM:
The CR3 register points to the base address of the page-directory-pointer table. The page-directory-pointer table is aligned on a 32-byte boundary, with the low 5 address bits 4:0 assumed to be 0.
And the SDM's much more explicit:
4:0 Ignored
Note, KVM gets this right when loading PDPTRs, it's only the nSVM flow that is broken.
Message-ID: <[email protected]>
--- arch/x86/kvm/svm/nested.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/x86/kvm/svm/nested.c +5 -1
@@ -62,8 +62,12 @@ static u64 nested_svm_get_tdp_pdptr(struu64 pdpte;int ret; +/* +* Note, nCR3 is "assumed" to be 32-byte aligned, i.e. the CPU ignores +* nCR3[4:0] when loading PDPTEs from memory. +*/ ret =kvm_vcpu_read_guest_page (vcpu,gpa_to_gfn (cr3), &pdpte, -offset_in_page (cr3) + index *8 ,8 ); + (cr3 &GENMASK (11 ,5 )) + index *8 ,8 );if (ret)return 0 ;return pdpte;
Greg Kroah-Hartman
maintainerPATCH 124/137 KVM: arm64: Dont eagerly teardown the vgic on init error
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
commit df5fd75ee305cb5927e0b1a0b46cc988ad8db2b1 upstream.
As there is very little ordering in the KVM API, userspace can instanciate a half-baked GIC (missing its memory map, for example) at almost any time.
This means that, with the right timing, a thread running vcpu-0 can enter the kernel without a GIC configured and get a GIC created behind its back by another thread. Amusingly, it will pick up that GIC and start messing with the data structures without the GIC having been fully initialised.
Similarly, a thread running vcpu-1 can enter the kernel, and try to init the GIC that was previously created. Since this GIC isn't properly configured (no memory map), it fails to correctly initialise.
And that's the point where we decide to teardown the GIC, freeing all its resources. Behind vcpu-0's back. Things stop pretty abruptly, with a variety of symptoms. Clearly, this isn't good, we should be a bit more careful about this.
It is obvious that this guest is not viable, as it is missing some important part of its configuration. So instead of trying to tear bits of it down, let's just mark it as *dead*. It means that any further interaction from userspace will result in -EIO. The memory will be released on the "normal" path, when userspace gives up.
--- arch/arm64/kvm/arm.c | 3 +++ arch/arm64/kvm/vgic/vgic-init.c | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-)
arch/arm64/kvm/arm.c +3 -0
@@ -750,6 +750,9 @@ static int kvm_vcpu_suspend(struct kvm_vstatic int check_vcpu_requests (struct kvm_vcpu *vcpu) {if (kvm_request_pending (vcpu)) { +if (kvm_check_request (KVM_REQ_VM_DEAD , vcpu)) +return -EIO ; +if (kvm_check_request (KVM_REQ_SLEEP , vcpu))kvm_vcpu_sleep (vcpu);
arch/arm64/kvm/vgic/vgic-init.c +3 -3
@@ -494,10 +494,10 @@ int kvm_vgic_map_resources(struct kvm *k out:mutex_unlock (&kvm->arch.config_lock); out_slots: -mutex_unlock (&kvm->slots_lock); -if (ret) -kvm_vgic_destroy (kvm); +kvm_vm_dead (kvm); + +mutex_unlock (&kvm->slots_lock);return ret; }
Greg Kroah-Hartman
maintainerPATCH 125/137 ALSA: hda/realtek: Add subwoofer quirk for Acer Predator G9-593
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: José Relvas <[email protected]>
commit 35fdc6e1c16099078bcbd73a6c8f1733ae7f1909 upstream.
The Acer Predator G9-593 has a 2+1 speaker system which isn't probed correctly.
This patch adds a quirk with the proper pin connections.
Note that I do not own this laptop, so I cannot guarantee that this fixes the issue.
Testing was done by other users here:
https://discussion.fedoraproject.org/t/-/118482
This model appears to have two different dev IDs...
- 0x1177 (as seen on the forum link above)
- 0x1178 (as seen on https://linux-hardware.org/?probe=127df9999f)
I don't think the audio system was changed between model revisions, so the patch applies for both IDs.
--- sound/pci/hda/patch_realtek.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
sound/pci/hda/patch_realtek.c +10 -0
@@ -7283,6 +7283,7 @@ enum {ALC286_FIXUP_ACER_AIO_HEADSET_MIC ,ALC256_FIXUP_ASUS_HEADSET_MIC ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE , +ALC255_FIXUP_PREDATOR_SUBWOOFER ,ALC299_FIXUP_PREDATOR_SPK ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE , ALC289_FIXUP_DELL_SPK2,
@@ -8603,6 +8604,13 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC256_FIXUP_ASUS_HEADSET_MODE }, + [ALC255_FIXUP_PREDATOR_SUBWOOFER] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x17 ,0x90170151 },/* use as internal speaker (LFE) */ + {0x1b ,0x90170152 }/* use as internal speaker (back) */ + } + }, [ALC299_FIXUP_PREDATOR_SPK] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -9535,6 +9543,8 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1025 ,0x110e ,"Acer Aspire ES1-432" ,ALC255_FIXUP_ACER_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1025 ,0x1166 ,"Acer Veriton N4640G" ,ALC269_FIXUP_LIFEBOOK ),SND_PCI_QUIRK (0x1025 ,0x1167 ,"Acer Veriton N6640G" ,ALC269_FIXUP_LIFEBOOK ), +SND_PCI_QUIRK (0x1025 ,0x1177 ,"Acer Predator G9-593" ,ALC255_FIXUP_PREDATOR_SUBWOOFER ), +SND_PCI_QUIRK (0x1025 ,0x1178 ,"Acer Predator G9-593" ,ALC255_FIXUP_PREDATOR_SUBWOOFER ),SND_PCI_QUIRK (0x1025 ,0x1246 ,"Acer Predator Helios 500" ,ALC299_FIXUP_PREDATOR_SPK ),SND_PCI_QUIRK (0x1025 ,0x1247 ,"Acer vCopperbox" ,ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS ), SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
Greg Kroah-Hartman
maintainerPATCH 126/137 LoongArch: Get correct cores_per_package for SMT systems
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit b7296f9d5bf99330063d4bbecc43c9b33fed0137 upstream.
In loongson_sysconf, The "core" of cores_per_node and cores_per_package stands for a logical core, which means in a SMT system it stands for a thread indeed. This information is gotten from SMBIOS Type4 Structure, so in order to get a correct cores_per_package for both SMT and non-SMT systems in parse_cpu_table() we should use SMBIOS_THREAD_PACKAGE_OFFSET instead of SMBIOS_CORE_PACKAGE_OFFSET.
--- arch/loongarch/include/asm/bootinfo.h | 4 ++++ arch/loongarch/kernel/setup.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-)
arch/loongarch/include/asm/bootinfo.h +4 -0
@@ -25,6 +25,10 @@ struct loongson_board_info {const char *board_vendor; }; +/* +* The "core" of cores_per_node and cores_per_package stands for a +* logical core, which means in a SMT system it stands for a thread. +*/ struct loongson_system_configuration {int nr_cpus;int nr_nodes;
arch/loongarch/kernel/setup.c +2 -1
@@ -49,6 +49,7 @@#define SMBIOS_FREQHIGH_OFFSET 0x17#define SMBIOS_FREQLOW_MASK 0xFF#define SMBIOS_CORE_PACKAGE_OFFSET 0x23 +#define SMBIOS_THREAD_PACKAGE_OFFSET 0x25#define LOONGSON_EFI_ENABLE (1 << 3) struct screen_info screen_info __section(".data");
@@ -115,7 +116,7 @@ static void __init parse_cpu_table(const cpu_clock_freq = freq_temp *1000000 ; loongson_sysconf.cpuname = (void *)dmi_string_parse (dm, dmi_data[16 ]); - loongson_sysconf.cores_per_package = *(dmi_data +SMBIOS_CORE_PACKAGE_OFFSET ); + loongson_sysconf.cores_per_package = *(dmi_data +SMBIOS_THREAD_PACKAGE_OFFSET );pr_info ("CpuClock = %llu\n" , cpu_clock_freq); }
Greg Kroah-Hartman
maintainerPATCH 127/137 xfrm: fix one more kernel-infoleak in algo dumping
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Vaganov <[email protected]>
commit 6889cd2a93e1e3606b3f6e958aa0924e836de4d2 upstream.
During fuzz testing, the following issue was discovered:
BUG: KMSAN: kernel-infoleak in _copy_to_iter+0x598/0x2a30 _copy_to_iter+0x598/0x2a30 __skb_datagram_iter+0x168/0x1060 skb_copy_datagram_iter+0x5b/0x220 netlink_recvmsg+0x362/0x1700 sock_recvmsg+0x2dc/0x390 __sys_recvfrom+0x381/0x6d0 __x64_sys_recvfrom+0x130/0x200 x64_sys_call+0x32c8/0x3cc0 do_syscall_64+0xd8/0x1c0 entry_SYSCALL_64_after_hwframe+0x79/0x81
Uninit was stored to memory at:
copy_to_user_state_extra+0xcc1/0x1e00 dump_one_state+0x28c/0x5f0 xfrm_state_walk+0x548/0x11e0 xfrm_dump_sa+0x1e0/0x840 netlink_dump+0x943/0x1c40 __netlink_dump_start+0x746/0xdb0 xfrm_user_rcv_msg+0x429/0xc00 netlink_rcv_skb+0x613/0x780 xfrm_netlink_rcv+0x77/0xc0 netlink_unicast+0xe90/0x1280 netlink_sendmsg+0x126d/0x1490 __sock_sendmsg+0x332/0x3d0 ____sys_sendmsg+0x863/0xc30 ___sys_sendmsg+0x285/0x3e0 __x64_sys_sendmsg+0x2d6/0x560 x64_sys_call+0x1316/0x3cc0 do_syscall_64+0xd8/0x1c0 entry_SYSCALL_64_after_hwframe+0x79/0x81
Uninit was created at:
__kmalloc+0x571/0xd30 attach_auth+0x106/0x3e0 xfrm_add_sa+0x2aa0/0x4230 xfrm_user_rcv_msg+0x832/0xc00 netlink_rcv_skb+0x613/0x780 xfrm_netlink_rcv+0x77/0xc0 netlink_unicast+0xe90/0x1280 netlink_sendmsg+0x126d/0x1490 __sock_sendmsg+0x332/0x3d0 ____sys_sendmsg+0x863/0xc30 ___sys_sendmsg+0x285/0x3e0 __x64_sys_sendmsg+0x2d6/0x560 x64_sys_call+0x1316/0x3cc0 do_syscall_64+0xd8/0x1c0 entry_SYSCALL_64_after_hwframe+0x79/0x81
Bytes 328-379 of 732 are uninitialized Memory access of size 732 starts at ffff88800e18e000 Data copied to user address 00007ff30f48aff0
CPU: 2 PID: 18167 Comm: syz-executor.0 Not tainted 6.8.11 #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
Fixes copying of xfrm algorithms where some random
data of the structure fields can end up in userspace. Padding in structures may be filled with random (possibly sensitve) data and should never be given directly to user-space.
A similar issue was resolved in the commit 8222d5910dae ("xfrm: Zero padding when dumping algos and encap")
Found by Linux Verification Center (linuxtesting.org) with Syzkaller.
--- net/xfrm/xfrm_user.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/xfrm/xfrm_user.c +3 -1
@@ -978,7 +978,9 @@ static int copy_to_user_auth(struct xfrmif (!nla)return -EMSGSIZE ; ap =nla_data (nla); -memcpy (ap, auth,sizeof (struct xfrm_algo_auth )); +strscpy_pad (ap->alg_name, auth->alg_name,sizeof (ap->alg_name)); + ap->alg_key_len = auth->alg_key_len; + ap->alg_trunc_len = auth->alg_trunc_len;if (redact_secret && auth->alg_key_len)memset (ap->alg_key,0 , (auth->alg_key_len +7 ) /8 );else
Greg Kroah-Hartman
maintainerPATCH 128/137 hv_netvsc: Fix VF namespace also in synthetic NIC NETDEV_REGISTER event
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haiyang Zhang <[email protected]>
commit 4c262801ea60c518b5bebc22a09f5b78b3147da2 upstream.
The existing code moves VF to the same namespace as the synthetic NIC during netvsc_register_vf(). But, if the synthetic device is moved to a new namespace after the VF registration, the VF won't be moved together.
To make the behavior more consistent, add a namespace check for synthetic NIC's NETDEV_REGISTER event (generated during its move), and move the VF if it is not in the same namespace.
--- drivers/net/hyperv/netvsc_drv.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/net/hyperv/netvsc_drv.c +30 -0
@@ -2791,6 +2791,31 @@ static struct hv_driver netvsc_drv = { }, }; +/* Set VF's namespace same as the synthetic NIC */ +static void netvsc_event_set_vf_ns (struct net_device *ndev) +{ +struct net_device_context *ndev_ctx =netdev_priv (ndev); +struct net_device *vf_netdev; +int ret; + + vf_netdev =rtnl_dereference (ndev_ctx->vf_netdev); +if (!vf_netdev) +return ; + +if (!net_eq (dev_net (ndev),dev_net (vf_netdev))) { + ret =dev_change_net_namespace (vf_netdev,dev_net (ndev), +"eth%d" ); +if (ret) +netdev_err (vf_netdev, +"Cannot move to same namespace as %s: %d\n" , + ndev->name, ret); +else +netdev_info (vf_netdev, +"Moved VF to namespace with: %s\n" , + ndev->name); + } +} +/* * On Hyper-V, every VF interface is matched with a corresponding * synthetic interface. The synthetic interface is presented first
@@ -2803,6 +2828,11 @@ static int netvsc_netdev_event(struct nostruct net_device *event_dev =netdev_notifier_info_to_dev (ptr);int ret =0 ; +if (event_dev->netdev_ops == &device_ops && event ==NETDEV_REGISTER ) { +netvsc_event_set_vf_ns (event_dev); +return NOTIFY_DONE ; + } + ret =check_dev_is_matching_vf (event_dev);if (ret !=0 )return NOTIFY_DONE ;
Greg Kroah-Hartman
maintainerPATCH 129/137 drm/amd/display: Disable PSR-SU on Parade 08-01 TCON too
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
commit ba1959f71117b27f3099ee789e0815360b4081dd upstream.
Stuart Hayhurst has found that both at bootup and fullscreen VA-API video is leading to black screens for around 1 second and kernel WARNING [1] traces when calling dmub_psr_enable() with Parade 08-01 TCON.
These symptoms all go away with PSR-SU disabled for this TCON, so disable it for now while DMUB traces [2] from the failure can be analyzed and the failure state properly root caused.
--- drivers/gpu/drm/amd/display/modules/power/power_helpers.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/display/modules/power/power_helpers.c +2 -0
@@ -818,6 +818,8 @@ bool is_psr_su_specific_panel(struct dc_ isPSRSUSupported = false; else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) isPSRSUSupported = false; + else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x01) + isPSRSUSupported = false; else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1) isPSRSUSupported = true; }
Greg Kroah-Hartman
maintainerPATCH 130/137 selinux: improve error checking in sel_write_load()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Moore <[email protected]>
[ Upstream commit 42c773238037c90b3302bf37a57ae3b5c3f6004a ]
Move our existing input sanity checking to the top of sel_write_load() and add a check to ensure the buffer size is non-zero.
Move a local variable initialization from the declaration to before it is used.
Minor style adjustments.
--- security/selinux/selinuxfs.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
security/selinux/selinuxfs.c +14 -13
@@ -621,6 +621,13 @@ static ssize_t sel_write_load(struct file *file, const char __user *buf,ssize_t length;void *data =NULL ; +/* no partial writes */ +if (*ppos) +return -EINVAL ; +/* no empty policies */ +if (!count) +return -EINVAL ; +mutex_lock (&fsi->state->policy_mutex); length = avc_has_perm(&selinux_state,
@@ -629,26 +636,21 @@ static ssize_t sel_write_load(struct file *file, const char __user *buf,if (length) goto out; -/* No partial writes. */ - length = -EINVAL ; -if (*ppos !=0 ) - goto out; - - length = -ENOMEM ; data =vmalloc (count); -if (!data) +if (!data) { + length = -ENOMEM ; goto out; - - length = -EFAULT ; -if (copy_from_user (data, buf, count) !=0 ) + } +if (copy_from_user (data, buf, count) !=0 ) { + length = -EFAULT ; goto out; + } length =security_load_policy (fsi->state, data, count, &load_state);if (length) {pr_warn_ratelimited ("SELinux: failed to load policy\n" ); goto out; } - length =sel_make_policy_nodes (fsi, load_state.policy);if (length) {pr_warn_ratelimited ("SELinux: failed to initialize selinuxfs\n" );
@@ -657,13 +659,12 @@ static ssize_t sel_write_load(struct file *file, const char __user *buf, }selinux_policy_commit (fsi->state, &load_state); - length = count; -audit_log (audit_context (),GFP_KERNEL ,AUDIT_MAC_POLICY_LOAD ,"auid=%u ses=%u lsm=selinux res=1" ,from_kuid (&init_user_ns,audit_get_loginuid (current)),audit_get_sessionid (current)); + out:mutex_unlock (&fsi->state->policy_mutex);vfree (data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 131/137 serial: protect uart_port_dtr_rts() in uart_shutdown() too
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Slaby (SUSE) <[email protected]>
[ Upstream commit 602babaa84d627923713acaf5f7e9a4369e77473 ]
Commit af224ca2df29 (serial: core: Prevent unsafe uart port access, part
3) added few uport == NULL checks. It added one to uart_shutdown(), so the commit assumes, uport can be NULL in there. But right after that protection, there is an unprotected "uart_port_dtr_rts(uport, false);" call. That is invoked only if HUPCL is set, so I assume that is the reason why we do not see lots of these reports.
Or it cannot be NULL at this point at all for some reason :P.
Until the above is investigated, stay on the safe side and move this dereference to the if too.
I got this inconsistency from Coverity under CID 1585130. Thanks.
[Adapted over commit 5701cb8bf50e ("tty: Call ->dtr_rts() parameter active consistently") not in the tree]
--- drivers/tty/serial/serial_core.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/tty/serial/serial_core.c +9 -7
@@ -339,14 +339,16 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)/* * Turn off DTR and RTS early. */ -if (uport &&uart_console (uport) && tty) { - uport->cons->cflag = tty->termios.c_cflag; - uport->cons->ispeed = tty->termios.c_ispeed; - uport->cons->ospeed = tty->termios.c_ospeed; - } +if (uport) { +if (uart_console (uport) && tty) { + uport->cons->cflag = tty->termios.c_cflag; + uport->cons->ispeed = tty->termios.c_ispeed; + uport->cons->ospeed = tty->termios.c_ospeed; + } -if (!tty ||C_HUPCL (tty)) -uart_port_dtr_rts (uport,0 ); +if (!tty ||C_HUPCL (tty)) +uart_port_dtr_rts (uport,0 ); + }uart_port_shutdown (port); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 132/137 net: phy: dp83822: Fix reset pin definitions
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michel Alex <[email protected]>
commit de96f6a3003513c796bbe4e23210a446913f5c00 upstream.
This change fixes a rare issue where the PHY fails to detect a link due to incorrect reset behavior.
The SW_RESET definition was incorrectly assigned to bit 14, which is the Digital Restart bit according to the datasheet. This commit corrects SW_RESET to bit 15 and assigns DIG_RESTART to bit 14 as per the datasheet specifications.
The SW_RESET define is only used in the phy_reset function, which fully re-initializes the PHY after the reset is performed. The change in the bit definitions should not have any negative impact on the functionality of the PHY.
v2:
- added Fixes tag
- improved commit message
Message-ID: <AS1P250MB0608A798661549BF83C4B43EA9462@AS1P250MB0608.EURP250.PROD.OUTLOOK.COM>
--- drivers/net/phy/dp83822.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/phy/dp83822.c +2 -2
@@ -40,8 +40,8 @@/* Control Register 2 bits */ #define DP83822_FX_ENABLE BIT(14) -#define DP83822_HW_RESET BIT(15) -#define DP83822_SW_RESET BIT(14) +#define DP83822_SW_RESET BIT(15) +#define DP83822_DIG_RESTART BIT(14)/* PHY STS bits */ #define DP83822_PHYSTS_DUPLEX BIT(2)
Greg Kroah-Hartman
maintainerPATCH 133/137 block: fix sanity checks in blk_rq_map_user_bvec
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xinyu Zhang <[email protected]>
commit 2ff949441802a8d076d9013c7761f63e8ae5a9bd upstream.
blk_rq_map_user_bvec contains a check bytes + bv->bv_len > nr_iter which causes unnecessary failures in NVMe passthrough I/O, reproducible as follows:
- register a 2 page, page-aligned buffer against a ring
- use that buffer to do a 1 page io_uring NVMe passthrough read
The second (i = 1) iteration of the loop in blk_rq_map_user_bvec will then have nr_iter == 1 page, bytes == 1 page, bv->bv_len == 1 page, so the check bytes + bv->bv_len > nr_iter will succeed, causing the I/O to fail. This failure is unnecessary, as when the check succeeds, it means we've checked the entire buffer that will be used by the request - i.e. blk_rq_map_user_bvec should complete successfully. Therefore, terminate the loop early and return successfully when the check bytes + bv->bv_len
Quoted 1 line
nr_itersucceeds.
While we're at it, also remove the check that all segments in the bvec are single-page. While this seems to be true for all users of the function, it doesn't appear to be required anywhere downstream.
--- block/blk-map.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
block/blk-map.c +1 -3
@@ -597,9 +597,7 @@ static int blk_rq_map_user_bvec(struct rif (nsegs >= nr_segs || bytes >UINT_MAX - bv->bv_len) goto put_bio;if (bytes + bv->bv_len > nr_iter) - goto put_bio; -if (bv->bv_offset + bv->bv_len >PAGE_SIZE ) - goto put_bio; +break ; nsegs++; bytes += bv->bv_len;
Greg Kroah-Hartman
maintainerPATCH 134/137 ASoC: qcom: Fix NULL Dereference in asoc_qcom_lpass_cpu_platform_probe()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zichen Xie <[email protected]>
commit 49da1463c9e3d2082276c3e0e2a8b65a88711cd2 upstream.
A devm_kzalloc() in asoc_qcom_lpass_cpu_platform_probe() could possibly return NULL pointer. NULL Pointer Dereference may be triggerred without addtional check.
Add a NULL check for the returned pointer.
--- sound/soc/qcom/lpass-cpu.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/qcom/lpass-cpu.c +2 -0
@@ -1236,6 +1236,8 @@ int asoc_qcom_lpass_cpu_platform_probe(s/* Allocation for i2sctl regmap fields */ drvdata->i2sctl =devm_kzalloc (&pdev->dev,sizeof (struct lpaif_i2sctl ),GFP_KERNEL ); +if (!drvdata->i2sctl) +return -ENOMEM ;/* Initialize bitfields for dai I2SCTL register */ ret = lpass_cpu_init_i2sctl_bitfields(dev, drvdata->i2sctl,
Greg Kroah-Hartman
maintainerPATCH 135/137 platform/x86: dell-wmi: Ignore suspend notifications
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
commit a7990957fa53326fe9b47f0349373ed99bb69aaa upstream.
Some machines like the Dell G15 5155 emit WMI events when suspending/resuming. Ignore those WMI events.
--- drivers/platform/x86/dell/dell-wmi-base.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/platform/x86/dell/dell-wmi-base.c +9 -0
@@ -264,6 +264,15 @@ static const struct key_entry dell_wmi_k/*Speaker Mute*/ { KE_KEY, 0x109, { KEY_MUTE} }, +/* S2Idle screen off */ + { KE_IGNORE, 0x120, { KEY_RESERVED }}, + +/* Leaving S4 or S2Idle suspend */ + { KE_IGNORE, 0x130, { KEY_RESERVED }}, + +/* Entering S2Idle suspend */ + { KE_IGNORE, 0x140, { KEY_RESERVED }}, +/* Mic mute */ { KE_KEY, 0x150, { KEY_MICMUTE } },
Greg Kroah-Hartman
maintainerPATCH 136/137 ACPI: PRM: Clean up guid type in struct prm_handler_info
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 3d1c651272cf1df8aac7d9b6d92d836d27bed50f upstream.
Clang 19 prints a warning when we pass &th->guid to efi_pa_va_lookup():
drivers/acpi/prmt.c:156:29: error: passing 1-byte aligned argument to 4-byte aligned parameter 1 of 'efi_pa_va_lookup' may result in an unaligned pointer access [-Werror,-Walign-mismatch]
156 | (void *)efi_pa_va_lookup(&th->guid, handler_info->handler_address);
| ^
The problem is that efi_pa_va_lookup() takes a efi_guid_t and &th->guid is a regular guid_t. The difference between the two types is the alignment. efi_guid_t is a typedef.
typedef guid_t efi_guid_t __aligned(__alignof__(u32));
It's possible that this a bug in Clang 19. Even though the alignment of &th->guid is not explicitly specified, it will still end up being aligned at 4 or 8 bytes.
Anyway, as Ard points out, it's cleaner to change guid to efi_guid_t type and that also makes the warning go away.
--- drivers/acpi/prmt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/prmt.c +1 -1
@@ -52,7 +52,7 @@ struct prm_context_buffer {static LIST_HEAD (prm_module_list);struct prm_handler_info { -guid_t guid; +efi_guid_t guid;void *handler_addr;u64 static_data_buffer_addr;u64 acpi_param_buffer_addr;
Greg Kroah-Hartman
maintainerPATCH 137/137 arm64/uprobes: change the uprobe_opcode_t typedef to fix the sparse warning
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: junhua huang <[email protected]>
commit ef08c0fadd8a17ebe429b85e23952dac3263ad34 upstream.
After we fixed the uprobe inst endian in aarch_be, the sparse check report the following warning info:
sparse warnings: (new ones prefixed by >>)
Quoted 2 lines
Quoted 2 lines
kernel/events/uprobes.c:223:25: sparse: sparse: restricted__le32degrades to integerkernel/events/uprobes.c:574:56: sparse: sparse: incorrect type in argument 4 (different base types)
@@ expected unsigned int [addressable] [usertype] opcode @@ got restricted __le32 [usertype] @@
kernel/events/uprobes.c:574:56: sparse: expected unsigned int [addressable] [usertype] opcode
kernel/events/uprobes.c:574:56: sparse: got restricted __le32 [usertype]
Quoted 1 line
Quoted 1 line
kernel/events/uprobes.c:1483:32: sparse: sparse: incorrect type in initializer (different base types)
@@ expected unsigned int [usertype] insn @@ got restricted __le32 [usertype] @@
kernel/events/uprobes.c:1483:32: sparse: expected unsigned int [usertype] insn
kernel/events/uprobes.c:1483:32: sparse: got restricted __le32 [usertype]
use the __le32 to u32 for uprobe_opcode_t, to keep the same.
--- arch/arm64/include/asm/uprobes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/include/asm/uprobes.h +1 -1
@@ -14,7 +14,7 @@#define UPROBE_SWBP_INSN_SIZE AARCH64_INSN_SIZE#define UPROBE_XOL_SLOT_BYTES AARCH64_INSN_SIZE -typedef u32 uprobe_opcode_t ; +typedef __le32 uprobe_opcode_t ;struct arch_uprobe_task { };
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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.
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +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.1.115-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.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.1.115-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git commit: eeea9e03a3d455b443e3b05c856570c610582ba1
* git describe: v6.1.113-232-geeea9e03a3d4
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.1.y/build/v6.1.113-232-geeea9e03a3d4
## Test Regressions (compared to v6.1.113-92-g6a7f9259c323)
## Metric Regressions (compared to v6.1.113-92-g6a7f9259c323)
## Test Fixes (compared to v6.1.113-92-g6a7f9259c323)
## Metric Fixes (compared to v6.1.113-92-g6a7f9259c323)
## Test result summary
total: 96964, pass: 77844, fail: 1736, skip: 17299, xfail: 85
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 135 total, 135 passed, 0 failed
* arm64: 41 total, 41 passed, 0 failed
* i386: 28 total, 26 passed, 2 failed
* mips: 26 total, 25 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 36 total, 35 passed, 1 failed
* riscv: 11 total, 11 passed, 0 failed
* s390: 14 total, 14 passed, 0 failed
* sh: 10 total, 10 passed, 0 failed
* sparc: 7 total, 7 passed, 0 failed
* x86_64: 33 total, 33 passed, 0 failed
## Test suites summary
* boot
* commands
* 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-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-syscalls
* ltp-tracing
* perf
* rcutorture
--
Linaro LKFT
https://lkft.linaro.org
Hello,
Quoted 7 lines · On Mon, 28 Oct 2024 07:23:57 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +0000. Anything received after that time might be too late.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/damonitor/damon-tests/tree/next/corr
[2] eeea9e03a3d4 ("Linux 6.1.115-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh
ok 2 selftests: damon: debugfs_schemes.sh
ok 3 selftests: damon: debugfs_target_ids.sh
ok 4 selftests: damon: debugfs_empty_targets.sh
ok 5 selftests: damon: debugfs_huge_count_read_write.sh
ok 6 selftests: damon: debugfs_duplicate_context_creation.sh
ok 7 selftests: damon: sysfs.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh # SKIP
ok 12 selftests: damon-tests: build_m68k.sh # SKIP
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Am 28.10.2024 um 07:23 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +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.1.115-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.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_GENERIC:
Signature · 1 line
Florian
Thanks,
Hardik
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +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.1.115-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
Hi,
Please find the KernelCI report below :-
OVERVIEW
Builds: 24 passed, 0 failed
Boot tests: 42 passed, 0 failed
CI systems: maestro
REVISION
Commit
name: 6.1.115-rc1
hash: 1efe597b37dcd665c9f44a5633eaf6572e74c6e2
Checked out from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-6.1.yBUILDS
No new build failures found
BOOT TESTS
No new boot failures found
See complete and up-to-date report at:
https://kcidb.kernelci.org/d/revision/revision?orgId=1&var-datasource=edquppk2ghfcwc&var-git_commit_hash=1efe597b37dcd665c9f44a5633eaf6572e74c6e2&var-patchset_hash=&var-origin=maestro&var-build_architecture=All&var-build_config_name=All&var-test_path=boot
Thanks,
KernelCI team
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.1.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +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.1.115-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +0000. Anything received after that time might be too late.
[ ... ]
Quoted 3 lines
Tiezhu Yang <[email protected]>
LoongArch: Add support to clone a time namespace
This patch triggers:
Building loongarch:defconfig ... failed
--------------
Error log:arch/loongarch/kernel/vdso.c: In function 'vvar_fault':arch/loongarch/kernel/vdso.c:54:36: error: implicit declaration of function 'find_timens_vvar_page'
because the missing function is not generic in v6.1.y.
Reverting the patch on its own does not work because commit a67d4a02bf43 ("LoongArch: Don't crash in stack_top() for tasks without vDSO") depends on it. Reverting both patches fixes the problem.
Copying the authors of both patches for advice.
Guenter
Hi Guenter,
Nov 2, 2024 10:46:38 Guenter Roeck <[email protected]>:
Quoted 23 lines · Greg Kroah-Hartman
Quoted 7 lines
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +0000. Anything received after that time might be too late.[ ... ]
Quoted 3 lines
Tiezhu Yang <[email protected]>
LoongArch: Add support to clone a time namespaceThis patch triggers:
Building loongarch:defconfig ... failed
--------------
Error log:arch/loongarch/kernel/vdso.c: In function 'vvar_fault':arch/loongarch/kernel/vdso.c:54:36: error: implicit declaration of function 'find_timens_vvar_page'
Quoted 7 lines
because the missing function is not generic in v6.1.y.
Reverting the patch on its own does not work because commit
a67d4a02bf43("LoongArch: Don't crash instack_top()for tasks without vDSO") depends on it. Reverting both patches fixes the problem.Copying the authors of both patches for advice.
Thanks for the heads-up.
FYI there seems to be another patch fixing the build failure for 6.1. [0]
FWIW my patch "LoongArch: Don't crash in stack_top() for tasks without vDSO " is not critical and can be reverted if that is the chosen path to handle this.
Thomas
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.115 release. There are 137 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 Wed, 30 Oct 2024 06:22:39 +0000. Anything received after that time might be too late.
No action expected, just a FYI.
perf no longer builds in v6.1.y with Ubuntu 24.04 (glibc 2.39). The error is:
tests/bpf.c: In function ‘epoll_pwait_loop’:tests/bpf.c:36:17: error: argument 2 null where non-null expected [-Werror=nonnull]
36 | epoll_pwait(-(i + 1), NULL, 0, 0, NULL);
| ^~~~~~~~~~~In file included from tests/bpf.c:5:/usr/include/x86_64-linux-gnu/sys/epoll.h:134:12: note: in a call to function ‘epoll_pwait’ declared ‘nonnull’
134 | extern int epoll_pwait (int __epfd, struct epoll_event *__events,
The offending file was removed in v6.6+, so the problem is not seen there.
Again, this is just a FYI, with no action expected, just in case someone tries to build this version of perf if glibc 2.39+ is installed.
Guenter