6.1.33-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 6.1.33-rc1 review
This is the start of the stable review cycle for the 6.1.33 release. There are 225 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 09 Jun 2023 20:07:31 +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.33-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.33-rc1
Theodore Ts'o <[email protected]>
ext4: enable the lazy init thread when remounting read/write
Matthieu Baerts <[email protected]>
selftests: mptcp: join: avoid using 'cmp --bytes'
Matthieu Baerts <[email protected]>
selftests: mptcp: simult flows: skip if MPTCP is not supported
Matthieu Baerts <[email protected]>
selftests: mptcp: diag: skip if MPTCP is not supported
Ard Biesheuvel <[email protected]>
arm64: efi: Use SMBIOS processor version to key off Ampere quirk
Jakub Kicinski <[email protected]>
tls: rx: strp: don't use GFP_KERNEL in softirq context
Darrick J. Wong <[email protected]>
xfs: verify buffer contents when we skip log replay
Fangzhi Zuo <[email protected]>
drm/amd/display: Have Payload Properly Created After Resume
Vasant Hegde <[email protected]>
iommu/amd/pgtbl_v2: Fix domain max address
Lino Sanfilippo <[email protected]>
tpm, tpm_tis: Request threaded interrupt handler
Jim Wylder <[email protected]>
regmap: Account for register length when chunking
Edward Lo <[email protected]>
fs/ntfs3: Validate MFT flags before replaying logs
Roberto Sassu <[email protected]>
KEYS: asymmetric: Copy sig and digest in public_key_verify_signature()
Kuan-Ting Chen <[email protected]>
ksmbd: fix multiple out-of-bounds read during context decoding
Kuan-Ting Chen <[email protected]>
ksmbd: fix slab-out-of-bounds read in smb2_handle_negotiate
Namjae Jeon <[email protected]>
ksmbd: fix incorrect AllocationSize set in smb2_get_info
Namjae Jeon <[email protected]>
ksmbd: fix UAF issue from opinfo->conn
Namjae Jeon <[email protected]>
ksmbd: fix credit count leakage
Sean Christopherson <[email protected]>
KVM: x86: Account fastpath-only VM-Exits in vCPU stats
Akihiko Odaki <[email protected]>
KVM: arm64: Populate fault info for watchpoint
Mirsad Goran Todorovac <[email protected]>
test_firmware: fix the memory leak of the allocated firmware buffer
Mirsad Goran Todorovac <[email protected]>
test_firmware: fix a memory leak with reqs buffer
Maninder Singh <[email protected]>
powerpc/xmon: Use KSYM_NAME_LEN in array size
Herve Codina <[email protected]>
serial: cpm_uart: Fix a COMPILE_TEST dependency
Christophe JAILLET <[email protected]>
serial: 8250_tegra: Fix an error handling path in tegra_uart_probe()
Helge Deller <[email protected]>
fbcon: Fix null-ptr-deref in soft_cursor
Theodore Ts'o <[email protected]>
ext4: add lockdep annotations for i_data_sem for ea_inode's
Theodore Ts'o <[email protected]>
ext4: disallow ea_inodes with extended attributes
Theodore Ts'o <[email protected]>
ext4: set lockdep subclass for the ea_inode in ext4_xattr_inode_cache_find()
Theodore Ts'o <[email protected]>
ext4: add EA_INODE checking to ext4_iget()
Paolo Abeni <[email protected]>
mptcp: fix active subflow finalization
Paolo Abeni <[email protected]>
mptcp: fix connect timeout handling
Matthieu Baerts <[email protected]>
selftests: mptcp: userspace pm: skip if MPTCP is not supported
Matthieu Baerts <[email protected]>
selftests: mptcp: sockopt: skip if MPTCP is not supported
Matthieu Baerts <[email protected]>
selftests: mptcp: join: skip if MPTCP is not supported
Matthieu Baerts <[email protected]>
selftests: mptcp: pm nl: skip if MPTCP is not supported
Matthieu Baerts <[email protected]>
selftests: mptcp: connect: skip if MPTCP is not supported
Pietro Borrello <[email protected]>
tracing/probe: trace_probe_primary_from_call(): checked list_first_entry
Steven Rostedt (Google) <[email protected]>
tracing/histograms: Allow variables to have some modifiers
Daniel Bristot de Oliveira <[email protected]>
tracing/timerlat: Always wakeup the timerlat thread
Arnd Bergmann <[email protected]>
mtdchar: mark bits of ioctl handler noinline
Paul Moore <[email protected]>
selinux: don't use make's grouped targets feature yet
Ben Noordhuis <[email protected]>
io_uring: undeprecate epoll_ctl support
Ism Hong <[email protected]>
riscv: perf: Fix callchain parse error with kernel tracepoint events
Lino Sanfilippo <[email protected]>
tpm, tpm_tis: correct tpm_tis_flags enumeration values
Jon Pan-Doh <[email protected]>
iommu/amd: Fix domain flush size when syncing iotlb
Gaurav Batra <[email protected]>
powerpc/iommu: Limit number of TCEs to 512 for H_STUFF_TCE hcall
Damien Le Moal <[email protected]>
block: fix revalidate performance regression
Johan Hovold <[email protected]>
phy: qcom-qmp-pcie-msm8996: fix init-count imbalance
Johan Hovold <[email protected]>
phy: qcom-qmp-combo: fix init-count imbalance
pengfuyuan <[email protected]>
btrfs: fix csum_tree_block page iteration to avoid tripping on -Werror=array-bounds
Sherry Sun <[email protected]>
tty: serial: fsl_lpuart: use UARTCTRL_TXINV to send break instead of UARTCTRL_SBK
Marek Vasut <[email protected]>
mmc: pwrseq: sd8787: Fix WILC CHIP_EN and RESETN toggling order
Deren Wu <[email protected]>
mmc: vub300: fix invalid response handling
Juergen Gross <[email protected]>
x86/mtrr: Revert 90b926e68f50 ("x86/pat: Fix pat_x_mtrr_type() for MTRR disabled case")Tim Huang <[email protected]>
drm/amd/pm: reverse mclk and fclk clocks levels for renoir
Tim Huang <[email protected]>
drm/amd/pm: reverse mclk and fclk clocks levels for yellow carp
Tim Huang <[email protected]>
drm/amd/pm: reverse mclk clocks levels for SMU v13.0.5
Guchun Chen <[email protected]>
drm/amd/pm: resolve reboot exception for si oland
Tim Huang <[email protected]>
drm/amd/pm: reverse mclk and fclk clocks levels for vangogh
Tim Huang <[email protected]>
drm/amd/pm: reverse mclk and fclk clocks levels for SMU v13.0.4
Ikshwaku Chauhan <[email protected]>
drm/amdgpu: enable tmz by default for GC 11.0.1
Damien Le Moal <[email protected]>
ata: libata-scsi: Use correct device no in ata_find_dev()
Bart Van Assche <[email protected]>
scsi: stex: Fix gcc 13 warnings
Richard Acayan <[email protected]>
misc: fastrpc: reject new invocations during device removal
Richard Acayan <[email protected]>
misc: fastrpc: return -EPIPE to invocations on device removal
Yu Kuai <[email protected]>
md/raid5: fix miscalculation of 'end_sector' in raid5_read_one_chunk()
Uttkarsh Aggarwal <[email protected]>
usb: gadget: f_fs: Add unbind event before functionfs_unbind
Frank Li <[email protected]>
usb: cdns3: fix NCM gadget RX speed 20x slow than expection at iMX8QM
Marek Vasut <[email protected]>
dt-bindings: usb: snps,dwc3: Fix "snps,hsphy_interface" type
Sebastian Krzyszkowiak <[email protected]>
net: usb: qmi_wwan: Set DTR quirk for BroadMobi BM818
Lukas Bulwahn <[email protected]>
iio: dac: build ad5758 driver when AD5758 is selected
Sean Nyekjaer <[email protected]>
iio: adc: stm32-adc: skip adc-diff-channels setup if none is present
Paul Cercueil <[email protected]>
iio: adc: ad7192: Change "shorted" channels to differential
Rasmus Villemoes <[email protected]>
iio: addac: ad74413: fix resistance input processing
Marek Vasut <[email protected]>
iio: dac: mcp4725: Fix i2c_master_send() return value handling
Masahiro Honda <[email protected]>
iio: adc: ad_sigma_delta: Fix IRQ issue by setting IRQ_DISABLE_UNLAZY flag
Sean Nyekjaer <[email protected]>
iio: adc: stm32-adc: skip adc-channels setup if none is present
Frank Li <[email protected]>
iio: light: vcnl4035: fixed chip ID check
Geert Uytterhoeven <[email protected]>
dt-bindings: iio: adc: renesas,rcar-gyroadc: Fix adi,ad7476 compatible value
Jean-Baptiste Maneyrol <[email protected]>
iio: imu: inv_icm42600: fix timestamp reset
Nikita Zhandarovich <[email protected]>
HID: wacom: avoid integer overflow in wacom_intuos_inout()
Sung-Chi Li <[email protected]>
HID: google: add jewel USB id
Jiakai Luo <[email protected]>
iio: adc: mxs-lradc: fix the order of two cleanup operations
Hans de Goede <[email protected]>
iio: accel: st_accel: Fix invalid mount_matrix on devices without ACPI _ONT method
Laurent Pinchart <[email protected]>
media: uvcvideo: Don't expose unsupported formats to userspace
K Prateek Nayak <[email protected]>
drivers: base: cacheinfo: Fix shared_cpu_map changes in event of CPU hotplug
Dan Carpenter <[email protected]>
mailbox: mailbox-test: fix a locking issue in mbox_test_message_write()
Pin-yen Lin <[email protected]>
media: mediatek: vcodec: Only apply 4K frame sizes on decoder formats
Jean-Philippe Brucker <[email protected]>
KVM: arm64: vgic: Fix locking comment
Jean-Philippe Brucker <[email protected]>
KVM: arm64: vgic: Wrap vgic_its_create() with config_lock
Jean-Philippe Brucker <[email protected]>
KVM: arm64: vgic: Fix a circular locking issue
Loic Poulain <[email protected]>
block: Deny writable memory mapping if block is read-only
Daniel Smith <[email protected]>
nvme-pci: Add quirk for Teamgroup MP33 SSD
Ming Lei <[email protected]>
ublk: fix AB-BA lockdep warning
Guchun Chen <[email protected]>
drm/amdgpu: skip disabling fence driver src_irqs when device is unplugged
Xiubo Li <[email protected]>
ceph: silence smatch warning in reconnect_caps_cb()
Arnd Bergmann <[email protected]>
atm: hide unused procfs functions
Rob Clark <[email protected]>
drm/msm: Be more shouty if per-process pgtables aren't working
Arnd Bergmann <[email protected]>
ALSA: oss: avoid missing-prototype warnings
Maurizio Lombardi <[email protected]>
nvme: do not let the user delete a ctrl before a complete initialization
Christoph Hellwig <[email protected]>
nvme-multipath: don't call blk_mark_disk_dead in nvme_mpath_remove_disk
Tom Rix <[email protected]>
netfilter: conntrack: define variables exp_nat_nla_policy and any_addr with CONFIG_NF_NAT
Kai-Heng Feng <[email protected]>
net: wwan: t7xx: Ensure init is completed before system sleep
Arnd Bergmann <[email protected]>
wifi: b43: fix incorrect __packed annotation
Wenchao Hao <[email protected]>
scsi: core: Decrease scsi_device's iorequest_cnt if dispatch failed
Ariel Malamud <[email protected]>
wifi: iwlwifi: mvm: Add locking to the rate read flow
Johannes Berg <[email protected]>
wifi: mac80211: recalc chanctx mindef before assigning
Johannes Berg <[email protected]>
wifi: mac80211: consider reserved chanctx for mindef
Johannes Berg <[email protected]>
wifi: mac80211: simplify chanctx allocation
Linus Walleij <[email protected]>
arm64: vdso: Pass (void *) to virt_to_page()
Min-Hua Chen <[email protected]>
arm64/mm: mark private VM_FAULT_X defines as vm_fault_t
Dario Binacchi <[email protected]>
ARM: dts: stm32: add pin map for CAN controller on stm32f7
Yun Lu <[email protected]>
wifi: rtl8xxxu: fix authentication timeout due to incorrect RCR value
Rubén Gómez <[email protected]>
ACPI: resource: Add IRQ override quirk for LG UltraPC 17U70P
Alexander Gordeev <[email protected]>
s390/topology: honour nr_cpu_ids when adding CPUs
Holger Dengler <[email protected]>
s390/pkey: zeroize key blobs
Kai Vehmanen <[email protected]>
ASoC: SOF: pm: save io region state in case of errors in resume
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: sof-client-probes: fix pm_runtime imbalance in error handling
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: pcm: fix pm_runtime imbalance in error handling
Pierre-Louis Bossart <[email protected]>
ASoC: SOF: debug: conditionally bump runtime_pm counter on exceptions
Hyunwoo Kim <[email protected]>
media: dvb-core: Fix use-after-free due to race condition at dvb_ca_en50221
Takashi Iwai <[email protected]>
media: dvb-core: Fix kernel WARNING for blocking operation in wait_event*()
Hyunwoo Kim <[email protected]>
media: dvb-core: Fix use-after-free due to race at dvb_register_device()
Hyunwoo Kim <[email protected]>
media: dvb-core: Fix use-after-free due on race condition at dvb_net
Krzysztof Kozlowski <[email protected]>
media: mn88443x: fix !CONFIG_OF error by drop of_match_ptr from ID table
Hyunwoo Kim <[email protected]>
media: ttusb-dec: fix memory leak in ttusb_dec_exit_dvb()
YongSu Yoo <[email protected]>
media: dvb_ca_en50221: fix a size write bug
Wei Chen <[email protected]>
media: netup_unidvb: fix irq init by register it at the end of probe
Wei Chen <[email protected]>
media: dvb-usb: dw2102: fix uninit-value in su3000_read_mac_address
Wei Chen <[email protected]>
media: dvb-usb: digitv: fix null-ptr-deref in digitv_i2c_xfer()
Zhang Shurong <[email protected]>
media: dvb-usb-v2: rtl28xxu: fix null-ptr-deref in rtl28xxu_i2c_xfer
Wei Chen <[email protected]>
media: dvb-usb-v2: ce6230: fix null-ptr-deref in ce6230_i2c_master_xfer()
Wei Chen <[email protected]>
media: dvb-usb-v2: ec168: fix null-ptr-deref in ec168_i2c_xfer()
Wei Chen <[email protected]>
media: dvb-usb: az6027: fix three null-ptr-deref in az6027_i2c_xfer()
YongSu Yoo <[email protected]>
media: dvb_demux: fix a bug for the continuity counter
Paweł Anikiel <[email protected]>
ASoC: ssm2602: Add workaround for playback distortions
Alexandru Sorodoc <[email protected]>
ALSA: hda/realtek: Add quirks for ASUS GU604V and GU603V
Martin Povišer <[email protected]>
ASoC: dt-bindings: Adjust #sound-dai-cells on TI's single-DAI codecs
Benedict Wong <[email protected]>
xfrm: Check if_id in inbound policy/secpath match
Johannes Berg <[email protected]>
um: harddog: fix modular build
Maxim Kochetkov <[email protected]>
ASoC: dwc: limit the number of overrun messages
Jeremy Soller <[email protected]>
ASoC: amd: yc: Add DMI entry to support System76 Pangolin 12
Hristo Venev <[email protected]>
nvme-pci: add quirk for missing secondary temperature thresholds
Sagi Grimberg <[email protected]>
nvme-pci: add NVME_QUIRK_BOGUS_NID for HS-SSD-FUTURE 2048G
Guoqing Jiang <[email protected]>
block/rnbd: replace REQ_OP_FLUSH with REQ_OP_WRITE
Ivan Orlov <[email protected]>
nbd: Fix debugfs_create_dir error checking
Helge Deller <[email protected]>
fbdev: stifb: Fix info entry in sti_struct on error path
Helge Deller <[email protected]>
fbdev: modedb: Add 1920x1080 at 60 Hz video mode
Zheng Wang <[email protected]>
fbdev: imsttfb: Fix use after free bug in imsttfb_probe
Yifan Zhang <[email protected]>
drm/amdgpu: set gfx9 onwards APU atomics support to be true
Bob Peterson <[email protected]>
gfs2: Don't deref jdesc in evict
Liming Sun <[email protected]>
platform/mellanox: fix potential race in mlxbf-tmfifo driver
Julian Winkler <[email protected]>
platform/x86: intel_scu_pcidrv: Add back PCI ID for Medfield
Niklas Söderlund <[email protected]>
media: rcar-vin: Select correct interrupt mode for V4L2_FIELD_ALTERNATE
Mario Limonciello <[email protected]>
hwmon: (k10temp) Add PCI ID for family 19, model 78h
Haibo Li <[email protected]>
ARM: 9295/1: unwind:fix unwind abort for uleb128 case
Filipe Manana <[email protected]>
btrfs: abort transaction when sibling keys check fails for leaves
Jammy Huang <[email protected]>
drm/ast: Fix ARM compatibility
Lee Jones <[email protected]>
mailbox: mailbox-test: Fix potential double-free in mbox_test_message_write()
lyndonli <[email protected]>
drm/amdgpu: Use the default reset when loading or reloading the driver
Hans de Goede <[email protected]>
ASoC: Intel: soc-acpi-cht: Add quirk for Nextbook Ares 8A tablet
WANG Xuerui <[email protected]>
LoongArch: Relay BCE exceptions to userland as SIGSEGV with si_code=SEGV_BNDERR
jasontao <[email protected]>
ALSA: hda: Glenfly: add HD Audio PCI IDs and HDMI Codec Vendor IDs.
Johannes Thumshirn <[email protected]>
watchdog: menz069_wdt: fix watchdog initialisation
Chong Li <[email protected]>
drm/amdgpu: release gpu full access after "amdgpu_device_ip_late_init"
Paolo Abeni <[email protected]>
mptcp: add annotations around sk->sk_shutdown accesses
Paolo Abeni <[email protected]>
mptcp: fix data race around msk->first access
Paolo Abeni <[email protected]>
mptcp: consolidate passive msk socket initialization
Paolo Abeni <[email protected]>
mptcp: simplify subflow_syn_recv_sock()
Paolo Abeni <[email protected]>
mptcp: avoid unneeded address copy
Paolo Abeni <[email protected]>
mptcp: add annotations around msk->subflow accesses
Paolo Abeni <[email protected]>
mptcp: avoid unneeded __mptcp_nmpc_socket() usage
Xin Long <[email protected]>
rtnetlink: call validate_linkmsg in rtnl_create_link
Chris Packham <[email protected]>
mtd: rawnand: marvell: don't set the NAND frequency select
Chris Packham <[email protected]>
mtd: rawnand: marvell: ensure timing values are written
Andreas Svensson <[email protected]>
net: dsa: mv88e6xxx: Increase wait after reset deactivation
fuyuanli <[email protected]>
tcp: fix mishandling when the sack compression is deferred.
Hangyu Hua <[email protected]>
net/sched: flower: fix possible OOB write in fl_set_geneve_opt()
Chen-Yu Tsai <[email protected]>
iommu/mediatek: Flush IOTLB completely only if domain has been attached
Moshe Shemesh <[email protected]>
net/mlx5: Read embedded cpu after init bit cleared
Saeed Mahameed <[email protected]>
net/mlx5e: Fix error handling in mlx5e_refresh_tirs
Christoph Hellwig <[email protected]>
nvme: fix the name of Zone Append for verbose logging
Dan Carpenter <[email protected]>
nfsd: fix double fget() bug in __write_ports_addfd()
Vladislav Efanov <[email protected]>
udp6: Fix race condition in udp6_sendmsg & connect
Pedro Tammela <[email protected]>
net/netlink: fix NETLINK_LIST_MEMBERSHIPS length report
Zhengchao Shao <[email protected]>
net: sched: fix NULL pointer dereference in mq_attach
Peilin Ye <[email protected]>
net/sched: Prohibit regrafting ingress or clsact Qdiscs
Peilin Ye <[email protected]>
net/sched: Reserve TC_H_INGRESS (TC_H_CLSACT) for ingress (clsact) Qdiscs
Peilin Ye <[email protected]>
net/sched: sch_clsact: Only create under TC_H_CLSACT
Peilin Ye <[email protected]>
net/sched: sch_ingress: Only create under TC_H_INGRESS
Wen Gu <[email protected]>
net/smc: Don't use RMBs not mapped to new link in SMCRv2 ADD LINK
Wen Gu <[email protected]>
net/smc: Scan from current RMB list when no position specified
Cambda Zhu <[email protected]>
tcp: Return user_mss for TCP_MAXSEG in CLOSE/LISTEN state if user_mss set
Eric Dumazet <[email protected]>
tcp: deny tcp_disconnect() when threads are waiting
Eric Dumazet <[email protected]>
af_packet: do not use READ_ONCE() in packet_bind()
Mustafa Ismail <[email protected]>
RDMA/irdma: Fix Local Invalidate fencing
Mustafa Ismail <[email protected]>
RDMA/irdma: Prevent QP use after free
Arnd Bergmann <[email protected]>
mtd: rawnand: ingenic: fix empty stub helper definitions
Namhyung Kim <[email protected]>
perf ftrace latency: Remove unnecessary "--" from --use-nsec option
Raju Rangoju <[email protected]>
amd-xgbe: fix the false linkup in xgbe_phy_status
Jakub Kicinski <[email protected]>
tls: improve lockless access safety of tls_err_abort()
Kuniyuki Iwashima <[email protected]>
af_packet: Fix data-races of pkt_sk(sk)->num.
Eric Dumazet <[email protected]>
netrom: fix info-leak in nr_write_internal()
Thomas Bogendoerfer <[email protected]>
net: mellanox: mlxbf_gige: Fix skb_panic splat under memory pressure
Dmytro Linkin <[email protected]>
net/mlx5e: Don't attach netdev profile while handling internal error
Shay Drory <[email protected]>
net/mlx5: fw_tracer, Fix event handling
Shay Drory <[email protected]>
net/mlx5: SF, Drain health before removing device
Shay Drory <[email protected]>
net/mlx5: Drain health before unregistering devlink
Alexandre Ghiti <[email protected]>
riscv: Fix unused variable warning when BUILTIN_DTB is set
Randy Dunlap <[email protected]>
dmaengine: pl330: rename _start to prevent build error
Jeff Layton <[email protected]>
nfsd: make a copy of struct iattr before calling notify_change
Jerry Snitselaar <[email protected]>
iommu/amd: Fix up merge conflict resolution
Joao Martins <[email protected]>
iommu/amd: Handle GALog overflows
Joao Martins <[email protected]>
iommu/amd: Don't block updates to GATag if guest mode is on
Chao Wang <[email protected]>
iommu/rockchip: Fix unwind goto issue
Kalesh AP <[email protected]>
RDMA/bnxt_re: Fix return value of bnxt_re_process_raw_qp_pkt_rx
Kalesh AP <[email protected]>
RDMA/bnxt_re: Fix a possible memory leak
Dan Carpenter <[email protected]>
dmaengine: at_xdmac: fix potential Oops in at_xdmac_prep_interleaved()
Yangyang Li <[email protected]>
RDMA/hns: Modify the value of long message loopback slice
Chengchang Tang <[email protected]>
RDMA/hns: Fix base address table allocation
Chengchang Tang <[email protected]>
RDMA/hns: Fix timeout attr in query qp for HIP08
Yonatan Nachum <[email protected]>
RDMA/efa: Fix unsupported page sizes in device
Neil Armstrong <[email protected]>
phy: amlogic: phy-meson-g12a-mipi-dphy-analog: fix CNTL2_DIF_TX_CTL0 value
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix the page_size used during the MR creation
-------------
Diffstat:
.../bindings/iio/adc/renesas,rcar-gyroadc.yaml | 2 +- .../devicetree/bindings/sound/tas2562.yaml | 6 +- .../devicetree/bindings/sound/tas2770.yaml | 6 +- .../devicetree/bindings/sound/tas27xx.yaml | 6 +- .../devicetree/bindings/usb/snps,dwc3.yaml | 2 +- Makefile | 4 +- arch/arm/boot/dts/stm32f7-pinctrl.dtsi | 82 ++++++++++++ arch/arm/kernel/unwind.c | 25 +++- arch/arm64/kernel/vdso.c | 2 +- arch/arm64/kvm/hyp/include/hyp/switch.h | 8 +- arch/arm64/kvm/hyp/nvhe/switch.c | 2 + arch/arm64/kvm/hyp/vhe/switch.c | 1 + arch/arm64/kvm/vgic/vgic-init.c | 25 +++- arch/arm64/kvm/vgic/vgic-its.c | 14 +- arch/arm64/kvm/vgic/vgic-kvm-device.c | 10 +- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 31 +++-- arch/arm64/kvm/vgic/vgic-mmio.c | 9 +- arch/arm64/kvm/vgic/vgic-v2.c | 6 - arch/arm64/kvm/vgic/vgic-v3.c | 7 - arch/arm64/kvm/vgic/vgic-v4.c | 3 +- arch/arm64/mm/fault.c | 4 +- arch/loongarch/include/asm/inst.h | 26 ++++ arch/loongarch/kernel/genex.S | 1 + arch/loongarch/kernel/traps.c | 92 +++++++++++++ arch/powerpc/platforms/pseries/iommu.c | 13 +- arch/powerpc/xmon/xmon.c | 2 +- arch/riscv/include/asm/perf_event.h | 7 + arch/riscv/mm/init.c | 2 +- arch/s390/kernel/topology.c | 32 ++--- arch/um/drivers/Makefile | 4 +- arch/um/drivers/harddog.h | 9 ++ arch/um/drivers/harddog_kern.c | 7 +- arch/um/drivers/harddog_user.c | 1 + arch/um/drivers/harddog_user_exp.c | 9 ++ arch/x86/kvm/x86.c | 3 + arch/x86/mm/pat/memtype.c | 3 +- block/blk-settings.c | 3 +- block/fops.c | 12 +- crypto/asymmetric_keys/public_key.c | 38 +++--- drivers/acpi/resource.c | 12 ++ drivers/ata/libata-scsi.c | 34 +++-- drivers/base/cacheinfo.c | 20 +++ drivers/base/regmap/regmap.c | 6 +- drivers/block/nbd.c | 4 +- drivers/block/rnbd/rnbd-proto.h | 2 +- drivers/block/ublk_drv.c | 9 +- drivers/char/tpm/tpm_tis_core.c | 7 +- drivers/char/tpm/tpm_tis_core.h | 8 +- drivers/dma/at_xdmac.c | 7 +- drivers/dma/pl330.c | 8 +- drivers/firmware/efi/libstub/arm64-stub.c | 39 ++++-- drivers/firmware/efi/libstub/efistub.h | 41 +++++- drivers/firmware/efi/libstub/smbios.c | 13 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 45 ++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 3 +- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 3 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 4 +- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 29 ----- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 10 +- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 5 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c | 5 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c | 5 +- .../gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c | 5 +- drivers/gpu/drm/ast/ast_main.c | 9 +- drivers/gpu/drm/msm/msm_iommu.c | 7 +- drivers/hid/hid-google-hammer.c | 2 + drivers/hid/hid-ids.h | 1 + drivers/hid/wacom_wac.c | 2 +- drivers/hwmon/k10temp.c | 1 + drivers/iio/accel/st_accel_core.c | 4 +- drivers/iio/adc/ad7192.c | 8 +- drivers/iio/adc/ad_sigma_delta.c | 4 + drivers/iio/adc/mxs-lradc-adc.c | 10 +- drivers/iio/adc/stm32-adc.c | 61 ++++----- drivers/iio/addac/ad74413r.c | 2 +- drivers/iio/dac/Makefile | 2 +- drivers/iio/dac/mcp4725.c | 16 ++- drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c | 10 +- drivers/iio/light/vcnl4035.c | 3 + drivers/infiniband/hw/bnxt_re/ib_verbs.c | 4 +- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 +- drivers/infiniband/hw/bnxt_re/qplib_res.c | 12 +- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 7 +- drivers/infiniband/hw/efa/efa_verbs.c | 2 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 25 ++-- drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 2 + drivers/infiniband/hw/hns/hns_roce_mr.c | 43 +++++++ drivers/infiniband/hw/irdma/verbs.c | 12 +- drivers/iommu/amd/amd_iommu.h | 4 +- drivers/iommu/amd/init.c | 24 ++++ drivers/iommu/amd/iommu.c | 25 +++- drivers/iommu/mtk_iommu.c | 3 +- drivers/iommu/rockchip-iommu.c | 14 +- drivers/mailbox/mailbox-test.c | 13 +- drivers/md/raid5.c | 2 +- drivers/media/dvb-core/dvb_ca_en50221.c | 49 ++++++- drivers/media/dvb-core/dvb_demux.c | 4 +- drivers/media/dvb-core/dvb_frontend.c | 16 ++- drivers/media/dvb-core/dvb_net.c | 38 +++++- drivers/media/dvb-core/dvbdev.c | 84 +++++++++--- drivers/media/dvb-frontends/mn88443x.c | 2 +- drivers/media/pci/netup_unidvb/netup_unidvb_core.c | 17 +-- .../mediatek/vcodec/mtk_vcodec_dec_stateful.c | 3 + drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 4 +- drivers/media/usb/dvb-usb-v2/ce6230.c | 8 ++ drivers/media/usb/dvb-usb-v2/ec168.c | 12 ++ drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 20 +++ drivers/media/usb/dvb-usb/az6027.c | 12 ++ drivers/media/usb/dvb-usb/digitv.c | 4 + drivers/media/usb/dvb-usb/dw2102.c | 2 +- drivers/media/usb/ttusb-dec/ttusb_dec.c | 3 +- drivers/media/usb/uvc/uvc_driver.c | 16 ++- drivers/misc/fastrpc.c | 7 +- drivers/mmc/core/pwrseq_sd8787.c | 34 +++-- drivers/mmc/host/vub300.c | 3 + drivers/mtd/mtdchar.c | 8 +- drivers/mtd/nand/raw/ingenic/ingenic_ecc.h | 8 +- drivers/mtd/nand/raw/marvell_nand.c | 10 +- drivers/net/dsa/mv88e6xxx/chip.c | 2 +- drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 12 +- .../ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 2 +- .../net/ethernet/mellanox/mlx5/core/en_common.c | 11 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 35 ++++- drivers/net/ethernet/mellanox/mlx5/core/main.c | 9 +- .../ethernet/mellanox/mlx5/core/sf/dev/driver.c | 1 + .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c | 13 +- drivers/net/usb/qmi_wwan.c | 2 +- drivers/net/wireless/broadcom/b43/b43.h | 2 +- .../net/wireless/broadcom/b43legacy/b43legacy.h | 2 +- drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 3 + drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 + .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 +- drivers/net/wwan/t7xx/t7xx_pci.c | 18 +++ drivers/net/wwan/t7xx/t7xx_pci.h | 1 + drivers/nvme/host/constants.c | 2 +- drivers/nvme/host/core.c | 6 +- drivers/nvme/host/hwmon.c | 4 +- drivers/nvme/host/multipath.c | 1 - drivers/nvme/host/nvme.h | 5 + drivers/nvme/host/pci.c | 6 + .../phy/amlogic/phy-meson-g12a-mipi-dphy-analog.c | 2 +- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 5 +- drivers/phy/qualcomm/phy-qcom-qmp-pcie-msm8996.c | 5 +- drivers/platform/mellanox/mlxbf-tmfifo.c | 11 +- drivers/platform/x86/intel_scu_pcidrv.c | 1 + drivers/s390/crypto/pkey_api.c | 3 + drivers/scsi/scsi_lib.c | 2 + drivers/scsi/stex.c | 4 + drivers/tty/serial/8250/8250_tegra.c | 4 +- drivers/tty/serial/Kconfig | 2 +- drivers/tty/serial/cpm_uart/cpm_uart.h | 2 - drivers/tty/serial/fsl_lpuart.c | 44 ++++--- drivers/usb/cdns3/cdns3-gadget.c | 13 ++ drivers/usb/gadget/function/f_fs.c | 2 +- drivers/video/fbdev/core/bitblit.c | 3 + drivers/video/fbdev/core/modedb.c | 5 + drivers/video/fbdev/imsttfb.c | 15 ++- drivers/video/fbdev/stifb.c | 1 + drivers/watchdog/menz69_wdt.c | 16 +-- fs/btrfs/ctree.c | 2 + fs/btrfs/disk-io.c | 2 +- fs/ceph/mds_client.c | 3 +- fs/ext4/ext4.h | 5 +- fs/ext4/inode.c | 34 ++++- fs/ext4/super.c | 24 ++-- fs/ext4/xattr.c | 41 ++---- fs/gfs2/super.c | 8 ++ fs/ksmbd/oplock.c | 72 +++++++---- fs/ksmbd/smb2pdu.c | 90 +++++++------ fs/nfsd/nfsctl.c | 7 +- fs/nfsd/vfs.c | 10 +- fs/ntfs3/inode.c | 6 + fs/xfs/xfs_buf_item_recover.c | 10 ++ include/linux/sunrpc/svcsock.h | 7 +- include/media/dvb_net.h | 4 + include/media/dvbdev.h | 15 +++ include/net/sock.h | 4 + include/net/tcp.h | 1 + io_uring/epoll.c | 4 - kernel/trace/trace_events_hist.c | 23 +++- kernel/trace/trace_osnoise.c | 2 + kernel/trace/trace_probe.h | 2 +- lib/test_firmware.c | 29 ++++- net/atm/resources.c | 2 + net/core/rtnetlink.c | 8 +- net/core/sock.c | 2 +- net/ipv4/af_inet.c | 2 + net/ipv4/inet_connection_sock.c | 1 + net/ipv4/tcp.c | 9 +- net/ipv4/tcp_input.c | 2 +- net/ipv4/tcp_timer.c | 16 ++- net/mac80211/chan.c | 75 +++++++---- net/mac80211/ieee80211_i.h | 3 +- net/mac80211/util.c | 2 +- net/mptcp/protocol.c | 143 ++++++++++++--------- net/mptcp/protocol.h | 15 ++- net/mptcp/subflow.c | 63 ++------- net/netfilter/nf_conntrack_netlink.c | 4 + net/netlink/af_netlink.c | 2 +- net/netrom/nr_subr.c | 7 +- net/packet/af_packet.c | 8 +- net/packet/diag.c | 2 +- net/sched/cls_flower.c | 3 + net/sched/sch_api.c | 16 ++- net/sched/sch_ingress.c | 16 ++- net/smc/smc_llc.c | 9 +- net/sunrpc/svcsock.c | 24 +--- net/tls/tls_strp.c | 4 +- net/tls/tls_sw.c | 8 +- net/xfrm/xfrm_policy.c | 11 +- security/selinux/Makefile | 6 +- sound/core/oss/pcm_plugin.h | 16 +-- sound/pci/hda/hda_intel.c | 21 +++ sound/pci/hda/patch_hdmi.c | 22 ++++ sound/pci/hda/patch_realtek.c | 20 +++ sound/soc/amd/yc/acp6x-mach.c | 7 + sound/soc/codecs/ssm2602.c | 15 +++ sound/soc/dwc/dwc-i2s.c | 4 +- sound/soc/intel/common/soc-acpi-intel-cht-match.c | 26 ++++ sound/soc/sof/debug.c | 4 +- sound/soc/sof/pcm.c | 17 +-- sound/soc/sof/pm.c | 14 +- sound/soc/sof/sof-client-probes.c | 14 +- tools/perf/builtin-ftrace.c | 2 +- tools/testing/selftests/net/mptcp/Makefile | 2 +- tools/testing/selftests/net/mptcp/diag.sh | 4 + tools/testing/selftests/net/mptcp/mptcp_connect.sh | 4 + tools/testing/selftests/net/mptcp/mptcp_join.sh | 17 ++- tools/testing/selftests/net/mptcp/mptcp_lib.sh | 40 ++++++ tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 4 + tools/testing/selftests/net/mptcp/pm_netlink.sh | 4 + tools/testing/selftests/net/mptcp/simult_flows.sh | 4 + tools/testing/selftests/net/mptcp/userspace_pm.sh | 4 + 233 files changed, 2115 insertions(+), 852 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/225 RDMA/bnxt_re: Fix the page_size used during the MR creation
From: Selvin Xavier <[email protected]>
[ Upstream commit 08c7f09356e45d093d1867c7a3c6ac6526e2f98b ]
Driver populates the list of pages used for Memory region wrongly when page size is more than system page size. This is causing a failure when some of the applications that creates MR with page size as 2M. Since HW can support multiple page sizes, pass the correct page size while creating the MR.
Also, driver need not adjust the number of pages when HW Queues are created with user memory. It should work with the number of dma blocks returned by ib_umem_num_dma_blocks. Fix this calculation also.
--- drivers/infiniband/hw/bnxt_re/qplib_res.c | 12 ++---------- drivers/infiniband/hw/bnxt_re/qplib_sp.c | 7 +++---- 2 files changed, 5 insertions(+), 14 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_res.c +2 -10
@@ -215,17 +215,9 @@ int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq,return -EINVAL ; hwq_attr->sginfo->npages = npages; }else { -unsigned long sginfo_num_pages =ib_umem_num_dma_blocks ( - hwq_attr->sginfo->umem, hwq_attr->sginfo->pgsize); - + npages =ib_umem_num_dma_blocks (hwq_attr->sginfo->umem, + hwq_attr->sginfo->pgsize); hwq->is_user = true; - npages = sginfo_num_pages; - npages = (npages *PAGE_SIZE ) / -BIT_ULL (hwq_attr->sginfo->pgshft); -if ((sginfo_num_pages *PAGE_SIZE ) % -BIT_ULL (hwq_attr->sginfo->pgshft)) -if (!npages) - npages++; }if (npages ==MAX_PBL_LVL_0_PGS && !hwq_attr->sginfo->nopte) {
drivers/infiniband/hw/bnxt_re/qplib_sp.c +3 -4
@@ -584,16 +584,15 @@ int bnxt_qplib_reg_mr(struct bnxt_qplib_res *res, struct bnxt_qplib_mrw *mr,/* Free the hwq if it already exist, must be a rereg */ if (mr->hwq.max_elements)bnxt_qplib_free_hwq (res, &mr->hwq); -/* Use system PAGE_SIZE */ hwq_attr.res = res; hwq_attr.depth = pages; - hwq_attr.stride = buf_pg_size; + hwq_attr.stride =sizeof (dma_addr_t); hwq_attr.type =HWQ_TYPE_MR ; hwq_attr.sginfo = &sginfo; hwq_attr.sginfo->umem = umem; hwq_attr.sginfo->npages = pages; - hwq_attr.sginfo->pgsize =PAGE_SIZE ; - hwq_attr.sginfo->pgshft =PAGE_SHIFT ; + hwq_attr.sginfo->pgsize = buf_pg_size; + hwq_attr.sginfo->pgshft =ilog2 (buf_pg_size); rc =bnxt_qplib_alloc_init_hwq (&mr->hwq, &hwq_attr);if (rc) { dev_err(&res->pdev->dev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 2/225 phy: amlogic: phy-meson-g12a-mipi-dphy-analog: fix CNTL2_DIF_TX_CTL0 value
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit b949193011540bb17cf1da7795ec42af1b875203 ]
Use the same CNTL2_DIF_TX_CTL0 value used by the vendor, it was reported fixing timings issues.
--- drivers/phy/amlogic/phy-meson-g12a-mipi-dphy-analog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/amlogic/phy-meson-g12a-mipi-dphy-analog.c +1 -1
@@ -70,7 +70,7 @@ static int phy_g12a_mipi_dphy_analog_power_on(struct phy *phy) HHI_MIPI_CNTL1_BANDGAP);regmap_write (priv->regmap,HHI_MIPI_CNTL2 , -FIELD_PREP (HHI_MIPI_CNTL2_DIF_TX_CTL0 ,0x459 ) | +FIELD_PREP (HHI_MIPI_CNTL2_DIF_TX_CTL0 ,0x45a ) |FIELD_PREP (HHI_MIPI_CNTL2_DIF_TX_CTL1 ,0x2680 )); reg =DSI_LANE_CLK ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 3/225 RDMA/efa: Fix unsupported page sizes in device
In reply to Greg Kroah-HartmanFrom: Yonatan Nachum <[email protected]>
[ Upstream commit 866422cdddcdf59d8c68e9472d49ba1be29b5fcf ]
Device uses 4KB size blocks for user pages indirect list while the driver creates those blocks with the size of PAGE_SIZE of the kernel. On kernels with PAGE_SIZE different than 4KB (ARM RHEL), this leads to a failure on register MR with indirect list because of the miss communication between driver and device.
--- drivers/infiniband/hw/efa/efa_verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/efa/efa_verbs.c +1 -1
@@ -1397,7 +1397,7 @@ static int pbl_continuous_initialize(struct efa_dev *dev,*/ static int pbl_indirect_initialize (struct efa_dev *dev,struct pbl_context *pbl) { -u32 size_in_pages =DIV_ROUND_UP (pbl->pbl_buf_size_in_bytes,PAGE_SIZE ); +u32 size_in_pages =DIV_ROUND_UP (pbl->pbl_buf_size_in_bytes,EFA_CHUNK_PAYLOAD_SIZE );struct scatterlist *sgl;int sg_dma_cnt, err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 4/225 RDMA/hns: Fix timeout attr in query qp for HIP08
In reply to Greg Kroah-HartmanFrom: Chengchang Tang <[email protected]>
[ Upstream commit 58caa2a51ad4fd21763696cc6c4defc9fc1b4b4f ]
On HIP08, the queried timeout attr is different from the timeout attr configured by the user.
It is found by rdma-core testcase test_rdmacm_async_traffic:
======================================================================
FAIL: test_rdmacm_async_traffic (tests.test_rdmacm.CMTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "./tests/test_rdmacm.py", line 33, in test_rdmacm_async_traffic
self.two_nodes_rdmacm_traffic(CMAsyncConnection, self.rdmacm_traffic,
File "./tests/base.py", line 382, in two_nodes_rdmacm_traffic
raise(res)
AssertionError
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 17 ++++++++++++++--- drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +14 -3
@@ -5136,7 +5136,6 @@ static int hns_roce_v2_set_abs_fields(struct ib_qp *ibqp,static bool check_qp_timeout_cfg_range (struct hns_roce_dev *hr_dev,u8 *timeout) {#define QP_ACK_TIMEOUT_MAX_HIP08 20 -#define QP_ACK_TIMEOUT_OFFSET 10#define QP_ACK_TIMEOUT_MAX 31if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) {
@@ -5145,7 +5144,7 @@ static bool check_qp_timeout_cfg_range(struct hns_roce_dev *hr_dev, u8 *timeout) "local ACK timeout shall be 0 to 20.\n");return false; } - *timeout +=QP_ACK_TIMEOUT_OFFSET ; + *timeout +=HNS_ROCE_V2_QP_ACK_TIMEOUT_OFS_HIP08 ; }else if (hr_dev->pci_dev->revision >PCI_REVISION_ID_HIP08 ) {if (*timeout >QP_ACK_TIMEOUT_MAX ) { ibdev_warn(&hr_dev->ib_dev,
@@ -5431,6 +5430,18 @@ static int hns_roce_v2_query_qpc(struct hns_roce_dev *hr_dev, u32 qpn,return ret; } +static u8 get_qp_timeout_attr (struct hns_roce_dev *hr_dev, +struct hns_roce_v2_qp_context *context) +{ +u8 timeout; + + timeout = (u8 )hr_reg_read (context,QPC_AT ); +if (hr_dev->pci_dev->revision ==PCI_REVISION_ID_HIP08 ) + timeout -=HNS_ROCE_V2_QP_ACK_TIMEOUT_OFS_HIP08 ; + +return timeout; +} +static int hns_roce_v2_query_qp (struct ib_qp *ibqp,struct ib_qp_attr *qp_attr,int qp_attr_mask,struct ib_qp_init_attr *qp_init_attr)
@@ -5508,7 +5519,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, qp_attr->max_dest_rd_atomic =1 <<hr_reg_read (&context,QPC_RR_MAX ); qp_attr->min_rnr_timer = (u8 )hr_reg_read (&context,QPC_MIN_RNR_TIME ); - qp_attr->timeout = (u8 )hr_reg_read (&context,QPC_AT ); + qp_attr->timeout =get_qp_timeout_attr (hr_dev, &context); qp_attr->retry_cnt =hr_reg_read (&context,QPC_RETRY_NUM_INIT ); qp_attr->rnr_retry =hr_reg_read (&context,QPC_RNR_NUM_INIT );
drivers/infiniband/hw/hns/hns_roce_hw_v2.h +2 -0
@@ -72,6 +72,8 @@#define HNS_ROCE_V2_IDX_ENTRY_SZ 4#define HNS_ROCE_V2_SCCC_SZ 32 +#define HNS_ROCE_V2_QP_ACK_TIMEOUT_OFS_HIP08 10 +#define HNS_ROCE_V3_SCCC_SZ 64#define HNS_ROCE_V3_GMV_ENTRY_SZ 32
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 5/225 RDMA/hns: Fix base address table allocation
In reply to Greg Kroah-HartmanFrom: Chengchang Tang <[email protected]>
[ Upstream commit 7f3969b14f356dd65fa95b3528eb05c32e68bc06 ]
For hns, the specification of an entry like resource (E.g. WQE/CQE/EQE) depends on BT page size, buf page size and hopnum. For user mode, the buf page size depends on UMEM. Therefore, the actual specification is controlled by BT page size and hopnum.
The current BT page size and hopnum are obtained from firmware. This makes the driver inflexible and introduces unnecessary constraints. Resource allocation failures occur in many scenarios.
This patch will calculate whether the BT page size set by firmware is sufficient before allocating BT, and increase the BT page size if it is insufficient.
--- drivers/infiniband/hw/hns/hns_roce_mr.c | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+)
drivers/infiniband/hw/hns/hns_roce_mr.c +43 -0
@@ -33,6 +33,7 @@#include <linux/vmalloc.h> #include <rdma/ib_umem.h> +#include <linux/math.h> #include "hns_roce_device.h" #include "hns_roce_cmd.h" #include "hns_roce_hem.h"
@@ -909,6 +910,44 @@ static int mtr_init_buf_cfg(struct hns_roce_dev *hr_dev,return page_cnt; } +static u64 cal_pages_per_l1ba (unsigned int ba_per_bt,unsigned int hopnum) +{ +return int_pow (ba_per_bt, hopnum -1 ); +} + +static unsigned int cal_best_bt_pg_sz (struct hns_roce_dev *hr_dev, +struct hns_roce_mtr *mtr, +unsigned int pg_shift) +{ +unsigned long cap = hr_dev->caps.page_size_cap; +struct hns_roce_buf_region *re; +unsigned int pgs_per_l1ba; +unsigned int ba_per_bt; +unsigned int ba_num; +int i; + +for_each_set_bit_from (pg_shift, &cap,sizeof (cap) *BITS_PER_BYTE ) { +if (!(BIT (pg_shift) & cap)) +continue ; + + ba_per_bt =BIT (pg_shift) /BA_BYTE_LEN ; + ba_num =0 ; +for (i =0 ; i < mtr->hem_cfg.region_count; i++) { + re = &mtr->hem_cfg.region[i]; +if (re->hopnum ==0 ) +continue ; + + pgs_per_l1ba =cal_pages_per_l1ba (ba_per_bt, re->hopnum); + ba_num +=DIV_ROUND_UP (re->count, pgs_per_l1ba); + } + +if (ba_num <= ba_per_bt) +return pg_shift; + } + +return 0 ; +} +static int mtr_alloc_mtt (struct hns_roce_dev *hr_dev,struct hns_roce_mtr *mtr,unsigned int ba_page_shift) {
@@ -917,6 +956,10 @@ static int mtr_alloc_mtt(struct hns_roce_dev *hr_dev, struct hns_roce_mtr *mtr,hns_roce_hem_list_init (&mtr->hem_list);if (!cfg->is_direct) { + ba_page_shift =cal_best_bt_pg_sz (hr_dev, mtr, ba_page_shift); +if (!ba_page_shift) +return -ERANGE ; + ret =hns_roce_hem_list_request (hr_dev, &mtr->hem_list, cfg->region, cfg->region_count, ba_page_shift);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 6/225 RDMA/hns: Modify the value of long message loopback slice
In reply to Greg Kroah-HartmanFrom: Yangyang Li <[email protected]>
[ Upstream commit 56518a603fd2bf74762d176ac980572db84a3e14 ]
Long message loopback slice is used for achieving traffic balance between QPs. It prevents the problem that QPs with large traffic occupying the hardware pipeline for a long time and QPs with small traffic cannot be scheduled.
Currently, its maximum value is set to 16K, which means only after a QP sends 16K will the second QP be scheduled. This value is too large, which will lead to unbalanced traffic scheduling, and thus it needs to be modified.
The setting range of the long message loopback slice is modified to be from 1024 (the lower limit supported by hardware) to mtu. Actual testing shows that this value can significantly reduce error in hardware traffic scheduling.
This solution is compatible with both HIP08 and HIP09. The modified lp_pktn_ini has a maximum value of 2 (when mtu is 256), so the range checking code for lp_pktn_ini is no longer necessary and needs to be deleted.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -5
@@ -4728,11 +4728,9 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp, mtu =ib_mtu_enum_to_int (ib_mtu);if (WARN_ON (mtu <=0 ))return -EINVAL ; -#define MAX_LP_MSG_LEN 16384 -/* MTU * (2 ^ LP_PKTN_INI) shouldn't be bigger than 16KB */ - lp_pktn_ini =ilog2 (MAX_LP_MSG_LEN / mtu); -if (WARN_ON (lp_pktn_ini >=0xF )) -return -EINVAL ; +#define MIN_LP_MSG_LEN 1024 +/* mtu * (2 ^ lp_pktn_ini) should be in the range of 1024 to mtu */ + lp_pktn_ini =ilog2 (max (mtu,MIN_LP_MSG_LEN ) / mtu);if (attr_mask &IB_QP_PATH_MTU ) {hr_reg_write (context,QPC_MTU , ib_mtu);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 7/225 dmaengine: at_xdmac: fix potential Oops in at_xdmac_prep_interleaved()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 4d43acb145c363626d76f49febb4240c488cd1cf ]
There are two place if the at_xdmac_interleaved_queue_desc() fails which could lead to a NULL dereference where "first" is NULL and we call list_add_tail(&first->desc_node, ...). In the first caller, the return is not checked so add a check for that. In the next caller, the return is checked but if it fails on the first iteration through the loop then it will lead to a NULL pointer dereference.
--- drivers/dma/at_xdmac.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/dma/at_xdmac.c +5 -2
@@ -1026,6 +1026,8 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,NULL , src_addr, dst_addr, xt, xt->sgl); +if (!first) +return NULL ;/* Length of the block is (BLEN+1) microblocks. */ for (i =0 ; i < xt->numf -1 ; i++)
@@ -1056,8 +1058,9 @@ at_xdmac_prep_interleaved(struct dma_chan *chan, src_addr, dst_addr, xt, chunk);if (!desc) { -list_splice_tail_init (&first->descs_list, - &atchan->free_descs_list); +if (first) +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list);return NULL ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 8/225 RDMA/bnxt_re: Fix a possible memory leak
In reply to Greg Kroah-HartmanFrom: Kalesh AP <[email protected]>
[ Upstream commit 349e3c0cf239cc01d58a1e6c749e171de014cd6a ]
Inside bnxt_qplib_create_cq(), when the check for NULL DPI fails, driver returns directly without freeing the memory allocated inside bnxt_qplib_alloc_init_hwq() routine.
Fixed this by moving the check for NULL DPI before invoking bnxt_qplib_alloc_init_hwq().
--- drivers/infiniband/hw/bnxt_re/qplib_fp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/infiniband/hw/bnxt_re/qplib_fp.c +6 -5
@@ -2043,6 +2043,12 @@ int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq)u32 pg_sz_lvl;int rc; +if (!cq->dpi) { +dev_err (&rcfw->pdev->dev, +"FP: CREATE_CQ failed due to NULL DPI\n" ); +return -EINVAL ; + } + hwq_attr.res = res; hwq_attr.depth = cq->max_wqe; hwq_attr.stride =sizeof (struct cq_base );
@@ -2054,11 +2060,6 @@ int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq)RCFW_CMD_PREP (req,CREATE_CQ , cmd_flags); -if (!cq->dpi) { -dev_err (&rcfw->pdev->dev, -"FP: CREATE_CQ failed due to NULL DPI\n" ); -return -EINVAL ; - } req.dpi =cpu_to_le32 (cq->dpi->dpi); req.cq_handle =cpu_to_le64 (cq->cq_handle); req.cq_size =cpu_to_le32 (cq->hwq.max_elements);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 9/225 RDMA/bnxt_re: Fix return value of bnxt_re_process_raw_qp_pkt_rx
In reply to Greg Kroah-HartmanFrom: Kalesh AP <[email protected]>
[ Upstream commit 0fa0d520e2a878cb4c94c4dc84395905d3f14f54 ]
bnxt_re_process_raw_qp_pkt_rx() always return 0 and ignores the return value of bnxt_re_post_send_shadow_qp().
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -3
@@ -3241,9 +3241,7 @@ static int bnxt_re_process_raw_qp_pkt_rx(struct bnxt_re_qp *gsi_qp, udwr.remote_qkey = gsi_sqp->qplib_qp.qkey;/* post data received in the send queue */ - rc =bnxt_re_post_send_shadow_qp (rdev, gsi_sqp, swr); - -return 0 ; +return bnxt_re_post_send_shadow_qp (rdev, gsi_sqp, swr); } static void bnxt_re_process_res_rawqp1_wc(struct ib_wc *wc,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 10/225 iommu/rockchip: Fix unwind goto issue
In reply to Greg Kroah-HartmanFrom: Chao Wang <[email protected]>
[ Upstream commit ec014683c564fb74fc68e8f5e84691d3b3839d24 ]
Smatch complains thatdrivers/iommu/rockchip-iommu.c:1306 rk_iommu_probe() warn: missing unwind goto?
The rk_iommu_probe function, after obtaining the irq value through platform_get_irq, directly returns an error if the returned value is negative, without releasing any resources.
Fix this by adding a new error handling label "err_pm_disable" and use a goto statement to redirect to the error handling process. In order to preserve the original semantics, set err to the value of irq.
--- drivers/iommu/rockchip-iommu.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/iommu/rockchip-iommu.c +8 -6
@@ -1303,20 +1303,22 @@ static int rk_iommu_probe(struct platform_device *pdev)for (i =0 ; i < iommu->num_irq; i++) {int irq =platform_get_irq (pdev, i); -if (irq <0 ) -return irq; +if (irq <0 ) { + err = irq; + goto err_pm_disable; + } err =devm_request_irq (iommu->dev, irq, rk_iommu_irq,IRQF_SHARED ,dev_name (dev), iommu); -if (err) { -pm_runtime_disable (dev); - goto err_remove_sysfs; - } +if (err) + goto err_pm_disable; }dma_set_mask_and_coherent (dev, rk_ops->dma_bit_mask);return 0 ; +err_pm_disable: +pm_runtime_disable (dev); err_remove_sysfs:iommu_device_sysfs_remove (&iommu->iommu); err_put_group:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 11/225 iommu/amd: Dont block updates to GATag if guest mode is on
In reply to Greg Kroah-HartmanFrom: Joao Martins <[email protected]>
[ Upstream commit ed8a2f4ddef2eaaf864ab1efbbca9788187036ab ]
On KVM GSI routing table updates, specially those where they have vIOMMUs with interrupt remapping enabled (to boot >255vcpus setups without relying on KVM_FEATURE_MSI_EXT_DEST_ID), a VMM may update the backing VF MSIs with a new VCPU affinity.
On AMD with AVIC enabled, the new vcpu affinity info is updated via:
avic_pi_update_irte()
irq_set_vcpu_affinity()
amd_ir_set_vcpu_affinity()
amd_iommu_{de}activate_guest_mode()
Where the IRTE[GATag] is updated with the new vcpu affinity. The GATag contains VM ID and VCPU ID, and is used by IOMMU hardware to signal KVM (via GALog) when interrupt cannot be delivered due to vCPU is in blocking state.
The issue is that amd_iommu_activate_guest_mode() will essentially only change IRTE fields on transitions from non-guest-mode to guest-mode and otherwise returns *with no changes to IRTE* on already configured guest-mode interrupts. To the guest this means that the VF interrupts remain affined to the first vCPU they were first configured, and guest will be unable to issue VF interrupts and receive messages like this from spurious interrupts (e.g. from waking the wrong vCPU in GALog):
[ 167.759472] __common_interrupt: 3.34 No irq handler for vector [ 230.680927] mlx5_core 0000:00:02.0: mlx5_cmd_eq_recover:247:(pid 3122): Recovered 1 EQEs on cmd_eq [ 230.681799] mlx5_core 0000:00:02.0: wait_func_handle_exec_timeout:1113:(pid 3122): cmd[0]: CREATE_CQ(0x400) recovered after timeout [ 230.683266] __common_interrupt: 3.34 No irq handler for vector
Given the fact that amd_ir_set_vcpu_affinity() uses amd_iommu_activate_guest_mode() underneath it essentially means that VCPU affinity changes of IRTEs are nops. Fix it by dropping the check for guest-mode at amd_iommu_activate_guest_mode(). Same thing is applicable to amd_iommu_deactivate_guest_mode() although, even if the IRTE doesn't change underlying DestID on the host, the VFIO IRQ handler will still be able to poke at the right guest-vCPU.
--- drivers/iommu/amd/iommu.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/iommu/amd/iommu.c +1 -2
@@ -3504,8 +3504,7 @@ int amd_iommu_activate_guest_mode(void *data)struct irte_ga *entry = (struct irte_ga *) ir_data->entry;u64 valid; -if (!AMD_IOMMU_GUEST_IR_VAPIC (amd_iommu_guest_ir) || - !entry || entry->lo.fields_vapic.guest_mode) +if (!AMD_IOMMU_GUEST_IR_VAPIC (amd_iommu_guest_ir) || !entry)return 0 ; valid = entry->lo.fields_vapic.valid;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 12/225 iommu/amd: Handle GALog overflows
In reply to Greg Kroah-HartmanFrom: Joao Martins <[email protected]>
[ Upstream commit af47b0a24058e56e983881993752f88288ca6511 ]
GALog exists to propagate interrupts into all vCPUs in the system when interrupts are marked as non running (e.g. when vCPUs aren't running). A GALog overflow happens when there's in no space in the log to record the GATag of the interrupt. So when the GALOverflow condition happens, the GALog queue is processed and the GALog is restarted, as the IOMMU manual indicates in section "2.7.4 Guest Virtual APIC Log Restart Procedure":
| * Wait until MMIO Offset 2020h[GALogRun]=0b so that all request | entries are completed as circumstances allow. GALogRun must be 0b to | modify the guest virtual APIC log registers safely. | * Write MMIO Offset 0018h[GALogEn]=0b. | * As necessary, change the following values (e.g., to relocate or | resize the guest virtual APIC event log): | - the Guest Virtual APIC Log Base Address Register | [MMIO Offset 00E0h], | - the Guest Virtual APIC Log Head Pointer Register | [MMIO Offset 2040h][GALogHead], and | - the Guest Virtual APIC Log Tail Pointer Register | [MMIO Offset 2048h][GALogTail]. | * Write MMIO Offset 2020h[GALOverflow] = 1b to clear the bit (W1C). | * Write MMIO Offset 0018h[GALogEn] = 1b, and either set | MMIO Offset 0018h[GAIntEn] to enable the GA log interrupt or clear | the bit to disable it.
Failing to handle the GALog overflow means that none of the VFs (in any guest) will work with IOMMU AVIC forcing the user to power cycle the host. When handling the event it resumes the GALog without resizing much like how it is done in the event handler overflow. The [MMIO Offset 2020h][GALOverflow] bit might be set in status register without the [MMIO Offset 2020h][GAInt] bit, so when deciding to poll for GA events (to clear space in the galog), also check the overflow bit.
[suravee: Check for GAOverflow without GAInt, toggle CONTROL_GAINT_EN]
Stable-dep-of: 8ec4e2befef1 ("iommu/amd: Fix up merge conflict resolution")
--- drivers/iommu/amd/amd_iommu.h | 1 + drivers/iommu/amd/init.c | 24 ++++++++++++++++++++++++ drivers/iommu/amd/iommu.c | 9 ++++++++- 3 files changed, 33 insertions(+), 1 deletion(-)
drivers/iommu/amd/amd_iommu.h +1 -0
@@ -15,6 +15,7 @@ extern irqreturn_t amd_iommu_int_thread(int irq, void *data);extern irqreturn_t amd_iommu_int_handler (int irq,void *data);extern void amd_iommu_apply_erratum_63 (struct amd_iommu *iommu,u16 devid);extern void amd_iommu_restart_event_logging (struct amd_iommu *iommu); +extern void amd_iommu_restart_ga_log (struct amd_iommu *iommu);extern int amd_iommu_init_devices (void );extern void amd_iommu_uninit_devices (void );extern void amd_iommu_init_notifier (void );
drivers/iommu/amd/init.c +24 -0
@@ -751,6 +751,30 @@ void amd_iommu_restart_event_logging(struct amd_iommu *iommu)iommu_feature_enable (iommu,CONTROL_EVT_LOG_EN ); } +/* +* This function restarts event logging in case the IOMMU experienced +* an GA log overflow. +*/ +void amd_iommu_restart_ga_log (struct amd_iommu *iommu) +{ +u32 status; + + status =readl (iommu->mmio_base +MMIO_STATUS_OFFSET ); +if (status &MMIO_STATUS_GALOG_RUN_MASK ) +return ; + +pr_info_ratelimited ("IOMMU GA Log restarting\n" ); + +iommu_feature_disable (iommu,CONTROL_GALOG_EN ); +iommu_feature_disable (iommu,CONTROL_GAINT_EN ); + +writel (MMIO_STATUS_GALOG_OVERFLOW_MASK , + iommu->mmio_base +MMIO_STATUS_OFFSET ); + +iommu_feature_enable (iommu,CONTROL_GAINT_EN ); +iommu_feature_enable (iommu,CONTROL_GALOG_EN ); +} +/* * This function resets the command buffer if the IOMMU stopped fetching * commands from it.
drivers/iommu/amd/iommu.c +8 -1
@@ -836,6 +836,7 @@ amd_iommu_set_pci_msi_domain(struct device *dev, struct amd_iommu *iommu) { } (MMIO_STATUS_EVT_OVERFLOW_INT_MASK | \MMIO_STATUS_EVT_INT_MASK | \MMIO_STATUS_PPR_INT_MASK | \ +MMIO_STATUS_GALOG_OVERFLOW_MASK | \ MMIO_STATUS_GALOG_INT_MASK)irqreturn_t amd_iommu_int_thread (int irq,void *data)
@@ -859,10 +860,16 @@ irqreturn_t amd_iommu_int_thread(int irq, void *data) }#ifdef CONFIG_IRQ_REMAP -if (status &MMIO_STATUS_GALOG_INT_MASK ) { +if (status & (MMIO_STATUS_GALOG_INT_MASK | +MMIO_STATUS_GALOG_OVERFLOW_MASK )) {pr_devel ("Processing IOMMU GA Log\n" );iommu_poll_ga_log (iommu); } + +if (status &MMIO_STATUS_GALOG_OVERFLOW_MASK ) { +pr_info_ratelimited ("IOMMU GA Log overflow\n" ); +amd_iommu_restart_ga_log (iommu); + }#endif if (status &MMIO_STATUS_EVT_OVERFLOW_INT_MASK ) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 13/225 iommu/amd: Fix up merge conflict resolution
In reply to Greg Kroah-HartmanFrom: Jerry Snitselaar <[email protected]>
[ Upstream commit 8ec4e2befef10c7679cd59251956a428e783c0b5 ]
Merge commit e17c6debd4b2 ("Merge branches 'arm/mediatek', 'arm/msm', 'arm/renesas', 'arm/rockchip', 'arm/smmu', 'x86/vt-d' and 'x86/amd' into next") added amd_iommu_init_devices, amd_iommu_uninit_devices,
and amd_iommu_init_notifier back to drivers/iommu/amd/amd_iommu.h.
The only references to them are here, so clean them up.
--- drivers/iommu/amd/amd_iommu.h | 3 --- 1 file changed, 3 deletions(-)
drivers/iommu/amd/amd_iommu.h +0 -3
@@ -16,9 +16,6 @@ extern irqreturn_t amd_iommu_int_handler(int irq, void *data);extern void amd_iommu_apply_erratum_63 (struct amd_iommu *iommu,u16 devid);extern void amd_iommu_restart_event_logging (struct amd_iommu *iommu);extern void amd_iommu_restart_ga_log (struct amd_iommu *iommu); -extern int amd_iommu_init_devices (void ); -extern void amd_iommu_uninit_devices (void ); -extern void amd_iommu_init_notifier (void );extern void amd_iommu_set_rlookup_table (struct amd_iommu *iommu,u16 devid);#ifdef CONFIG_AMD_IOMMU_DEBUGFS
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 14/225 nfsd: make a copy of struct iattr before calling notify_change
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit d53d70084d27f56bcdf5074328f2c9ec861be596 ]
notify_change can modify the iattr structure. In particular it can end up setting ATTR_MODE when ATTR_KILL_SUID is already set, causing a BUG() if the same iattr is passed to notify_change more than once.
Make a copy of the struct iattr before calling notify_change.
--- fs/nfsd/vfs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
fs/nfsd/vfs.c +9 -1
@@ -469,7 +469,15 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,inode_lock (inode);for (retries =1 ;;) { - host_err =__nfsd_setattr (dentry, iap); +struct iattr attrs; + +/* +* notify_change() can alter its iattr argument, making +* @iap unsuitable for submission multiple times. Make a +* copy for every loop iteration. +*/ + attrs = *iap; + host_err =__nfsd_setattr (dentry, &attrs);if (host_err != -EAGAIN || !retries--)break ;if (!nfsd_wait_for_delegreturn (rqstp, inode))
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 15/225 dmaengine: pl330: rename _start to prevent build error
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit a1a5f2c887252dec161c1e12e04303ca9ba56fa9 ]
"_start" is used in several arches and proably should be reserved for ARCH usage. Using it in a driver for a private symbol can cause a build error when it conflicts with ARCH usage of the same symbol.
Therefore rename pl330's "_start" to "pl330_start_thread" so that there is no conflict and no build error.
drivers/dma/pl330.c:1053:13: error: '_start' redeclared as different kind of symbol
1053 | static bool _start(struct pl330_thread *thrd)
| ^~~~~~
In file included from ../include/linux/interrupt.h:21,
from ../drivers/dma/pl330.c:18:
arch/riscv/include/asm/sections.h:11:13: note: previous declaration of '_start' with type 'char[]'
11 | extern char _start[];
| ^~~~~~--- drivers/dma/pl330.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/dma/pl330.c +4 -4
@@ -1050,7 +1050,7 @@ static bool _trigger(struct pl330_thread *thrd)return true; } -static bool _start (struct pl330_thread *thrd) +static bool pl330_start_thread (struct pl330_thread *thrd) {switch (_state (thrd)) {case PL330_STATE_FAULT_COMPLETING :
@@ -1702,7 +1702,7 @@ static int pl330_update(struct pl330_dmac *pl330) thrd->req_running =-1 ;/* Get going again ASAP */ -_start (thrd); +pl330_start_thread (thrd);/* For now, just make a list of callbacks to be done */ list_add_tail (&descdone->rqd, &pl330->req_done);
@@ -2089,7 +2089,7 @@ static void pl330_tasklet(struct tasklet_struct *t) }else {/* Make sure the PL330 Channel thread is active */ spin_lock (&pch->thread->dmac->lock); -_start (pch->thread); +pl330_start_thread (pch->thread);spin_unlock (&pch->thread->dmac->lock); }
@@ -2107,7 +2107,7 @@ static void pl330_tasklet(struct tasklet_struct *t)if (power_down) { pch->active = true;spin_lock (&pch->thread->dmac->lock); -_start (pch->thread); +pl330_start_thread (pch->thread);spin_unlock (&pch->thread->dmac->lock); power_down = false; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 16/225 riscv: Fix unused variable warning when BUILTIN_DTB is set
In reply to Greg Kroah-HartmanFrom: Alexandre Ghiti <[email protected]>
[ Upstream commit 33d418da6f476b15e4510e0a590062583f63cd36 ]
commit ef69d2559fe9 ("riscv: Move early dtb mapping into the fixmap region") wrongly moved the #ifndef CONFIG_BUILTIN_DTB surrounding the pa variable definition in create_fdt_early_page_table(), so move it back to its right place to quiet the following warning:
../arch/riscv/mm/init.c: In function ‘create_fdt_early_page_table’:../arch/riscv/mm/init.c:925:12: warning: unused variable ‘pa’ [-Wunused-variable]
925 | uintptr_t pa = dtb_pa & ~(PMD_SIZE - 1);
--- arch/riscv/mm/init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/mm/init.c +1 -1
@@ -845,9 +845,9 @@ static void __init create_kernel_page_table(pgd_t *pgdir, bool early)static void __init create_fdt_early_page_table (uintptr_t fix_fdt_va,uintptr_t dtb_pa) { +#ifndef CONFIG_BUILTIN_DTB uintptr_t pa = dtb_pa & ~(PMD_SIZE -1 ); -#ifndef CONFIG_BUILTIN_DTB /* Make sure the fdt fixmap address is always aligned on PMD size */ BUILD_BUG_ON (FIX_FDT % (PMD_SIZE /PAGE_SIZE ));
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 17/225 net/mlx5: Drain health before unregistering devlink
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit 824c8dc4a470040bf0e56ba716543839c2498d49 ]
mlx5 health mechanism is using devlink APIs, which are using devlink notify APIs. After the cited patch, using devlink notify APIs after devlink is unregistered triggers a WARN_ON().
Hence, drain health WQ before devlink is unregistered.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +4 -3
@@ -1753,14 +1753,15 @@ static void remove_one(struct pci_dev *pdev)struct devlink *devlink =priv_to_devlink (dev);set_bit (MLX5_BREAK_FW_WAIT , &dev->intf_state); -/* mlx5_drain_fw_reset() is using devlink APIs. Hence, we must drain -* fw_reset before unregistering the devlink. +/* mlx5_drain_fw_reset() and mlx5_drain_health_wq() are using +* devlink notify APIs. +* Hence, we must drain them before unregistering the devlink. */ mlx5_drain_fw_reset (dev); +mlx5_drain_health_wq (dev);devlink_unregister (devlink);mlx5_sriov_disable (pdev);mlx5_crdump_disable (dev); -mlx5_drain_health_wq (dev);mlx5_uninit_one (dev);mlx5_pci_close (dev);mlx5_mdev_uninit (dev);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 18/225 net/mlx5: SF, Drain health before removing device
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit b4646da0573fae9dfa2b8f1f10936cb6eedd7230 ]
There is no point in recovery during device removal. Also, if health work started need to wait for it to avoid races and NULL pointer access.
Hence, drain health WQ before removing device.
--- drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/sf/dev/driver.c +1 -0
@@ -63,6 +63,7 @@ static void mlx5_sf_dev_remove(struct auxiliary_device *adev) struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);struct devlink *devlink =priv_to_devlink (sf_dev->mdev); +mlx5_drain_health_wq (sf_dev->mdev);devlink_unregister (devlink);mlx5_uninit_one (sf_dev->mdev);iounmap (sf_dev->mdev->iseg);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 19/225 net/mlx5: fw_tracer, Fix event handling
In reply to Greg Kroah-HartmanFrom: Shay Drory <[email protected]>
[ Upstream commit 341a80de2468f481b1f771683709b5649cbfe513 ]
mlx5 driver needs to parse traces with event_id inside the range of first_string_trace and num_string_trace. However, mlx5 is parsing all events with event_id >= first_string_trace.
Fix it by checking for the correct range.
--- drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +1 -1
@@ -483,7 +483,7 @@ static void poll_trace(struct mlx5_fw_tracer *tracer, (u64 )timestamp_low;break ;default : -if (tracer_event->event_id >= tracer->str_db.first_string_trace || +if (tracer_event->event_id >= tracer->str_db.first_string_trace && tracer_event->event_id <= tracer->str_db.first_string_trace + tracer->str_db.num_string_trace) { tracer_event->type =TRACER_EVENT_TYPE_STRING ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 20/225 net/mlx5e: Dont attach netdev profile while handling internal error
In reply to Greg Kroah-HartmanFrom: Dmytro Linkin <[email protected]>
[ Upstream commit bdf274750fca17b289404ef03453c4070725302c ]
As part of switchdev mode disablement, driver changes port netdevice profile from uplink to nic. If this process is triggered by health recovery flow (PCI reset, for ex.) profile attach would fail because all fw commands aborted when internal error flag is set. As a result, nic netdevice profile is not attached and driver fails to rollback to uplink profile, which leave driver in broken state and cause crash later.
To handle broken state do netdevice profile initialization only instead of full attachment and release mdev resources on driver suspend as expected. Actual netdevice attachment is done during driver load.
--- .../net/ethernet/mellanox/mlx5/core/en_main.c | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +31 -4
@@ -5745,8 +5745,8 @@ void mlx5e_detach_netdev(struct mlx5e_priv *priv) }static int -mlx5e_netdev_attach_profile (struct net_device *netdev,struct mlx5_core_dev *mdev, -const struct mlx5e_profile *new_profile,void *new_ppriv) +mlx5e_netdev_init_profile (struct net_device *netdev,struct mlx5_core_dev *mdev, +const struct mlx5e_profile *new_profile,void *new_ppriv) {struct mlx5e_priv *priv =netdev_priv (netdev);int err;
@@ -5762,6 +5762,25 @@ mlx5e_netdev_attach_profile(struct net_device *netdev, struct mlx5_core_dev *mde err = new_profile->init (priv->mdev, priv->netdev);if (err) goto priv_cleanup; + +return 0 ; + +priv_cleanup: +mlx5e_priv_cleanup (priv); +return err; +} + +static int +mlx5e_netdev_attach_profile (struct net_device *netdev,struct mlx5_core_dev *mdev, +const struct mlx5e_profile *new_profile,void *new_ppriv) +{ +struct mlx5e_priv *priv =netdev_priv (netdev); +int err; + + err =mlx5e_netdev_init_profile (netdev, mdev, new_profile, new_ppriv); +if (err) +return err; + err =mlx5e_attach_netdev (priv);if (err) goto profile_cleanup;
@@ -5769,7 +5788,6 @@ mlx5e_netdev_attach_profile(struct net_device *netdev, struct mlx5_core_dev *mde profile_cleanup: new_profile->cleanup (priv); -priv_cleanup:mlx5e_priv_cleanup (priv);return err; }
@@ -5788,6 +5806,12 @@ int mlx5e_netdev_change_profile(struct mlx5e_priv *priv, priv->profile->cleanup (priv);mlx5e_priv_cleanup (priv); +if (mdev->state ==MLX5_DEVICE_STATE_INTERNAL_ERROR ) { +mlx5e_netdev_init_profile (netdev, mdev, new_profile, new_ppriv); +set_bit (MLX5E_STATE_DESTROYING , &priv->state); +return -EIO ; + } + err =mlx5e_netdev_attach_profile (netdev, mdev, new_profile, new_ppriv);if (err) {/* roll back to original profile */ netdev_warn (netdev,"%s: new profile init failed, %d\n" , __func__, err);
@@ -5847,8 +5871,11 @@ static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state)struct net_device *netdev = priv->netdev;struct mlx5_core_dev *mdev = priv->mdev; -if (!netif_device_present (netdev)) +if (!netif_device_present (netdev)) { +if (test_bit (MLX5E_STATE_DESTROYING , &priv->state)) +mlx5e_destroy_mdev_resources (mdev);return -ENODEV ; + }mlx5e_detach_netdev (priv);mlx5e_destroy_mdev_resources (mdev);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 21/225 net: mellanox: mlxbf_gige: Fix skb_panic splat under memory pressure
In reply to Greg Kroah-HartmanFrom: Thomas Bogendoerfer <[email protected]>
[ Upstream commit d68cb7cf1fd0ef4287bc0ecd1ed0b6ae8e05fc70 ]
Do skb_put() after a new skb has been successfully allocated otherwise the reused skb leads to skb_panics or incorrect packet sizes.
--- .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c +7 -6
@@ -245,12 +245,6 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts) skb = priv->rx_skb[rx_pi_rem]; -skb_put (skb, datalen); - - skb->ip_summed =CHECKSUM_NONE ;/* device did not checksum packet */ - - skb->protocol =eth_type_trans (skb, netdev); -/* Alloc another RX SKB for this same index */ rx_skb =mlxbf_gige_alloc_skb (priv,MLXBF_GIGE_DEFAULT_BUF_SZ , &rx_buf_dma,DMA_FROM_DEVICE );
@@ -259,6 +253,13 @@ static bool mlxbf_gige_rx_packet(struct mlxbf_gige *priv, int *rx_pkts) priv->rx_skb[rx_pi_rem] = rx_skb;dma_unmap_single (priv->dev, *rx_wqe_addr,MLXBF_GIGE_DEFAULT_BUF_SZ ,DMA_FROM_DEVICE ); + +skb_put (skb, datalen); + + skb->ip_summed =CHECKSUM_NONE ;/* device did not checksum packet */ + + skb->protocol =eth_type_trans (skb, netdev); + *rx_wqe_addr = rx_buf_dma; }else if (rx_cqe &MLXBF_GIGE_RX_CQE_PKT_STATUS_MAC_ERR ) { priv->stats.rx_mac_errors++;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 22/225 netrom: fix info-leak in nr_write_internal()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 31642e7089df8fd3f54ca7843f7ee2952978cad1 ]
Simon Kapadia reported the following issue:
<quote>
The Online Amateur Radio Community (OARC) has recently been experimenting with building a nationwide packet network in the UK.
As part of our experimentation, we have been testing out packet on 300bps HF, and playing with net/rom. For HF packet at this baud rate you really need to make sure that your MTU is relatively low; AX.25 suggests a PACLEN of 60, and a net/rom PACLEN of 40 to go with that.
However the Linux net/rom support didn't work with a low PACLEN;
the mkiss module would truncate packets if you set the PACLEN below about 200 or so, e.g.:
Apr 19 14:00:51 radio kernel: [12985.747310] mkiss: ax1: truncating oversized transmit packet!
This didn't make any sense to me (if the packets are smaller why would they be truncated?) so I started investigating.
I looked at the packets using ethereal, and found that many were just huge compared to what I would expect.
A simple net/rom connection request packet had the request and then a bunch of what appeared to be random data following it:
</quote>
Simon provided a patch that I slightly revised:
Not only we must not use skb_tailroom(), we also do not want to count NR_NETWORK_LEN twice.
--- net/netrom/nr_subr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/netrom/nr_subr.c +4 -3
@@ -123,7 +123,7 @@ void nr_write_internal(struct sock *sk, int frametype)unsigned char *dptr;int len, timeout; - len =NR_NETWORK_LEN +NR_TRANSPORT_LEN ; + len =NR_TRANSPORT_LEN ;switch (frametype &0x0F ) {case NR_CONNREQ :
@@ -141,7 +141,8 @@ void nr_write_internal(struct sock *sk, int frametype)return ; } -if ((skb =alloc_skb (len,GFP_ATOMIC )) ==NULL ) + skb =alloc_skb (NR_NETWORK_LEN + len,GFP_ATOMIC ); +if (!skb)return ;/*
@@ -149,7 +150,7 @@ void nr_write_internal(struct sock *sk, int frametype)*/ skb_reserve (skb,NR_NETWORK_LEN ); - dptr =skb_put (skb,skb_tailroom (skb)); + dptr =skb_put (skb, len);switch (frametype &0x0F ) {case NR_CONNREQ :
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 23/225 af_packet: Fix data-races of pkt_sk(sk)->num.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 822b5a1c17df7e338b9f05d1cfe5764e37c7f74f ]
syzkaller found a data race of pkt_sk(sk)->num.
The value is changed under lock_sock() and po->bind_lock, so we need READ_ONCE() to access pkt_sk(sk)->num without these locks in packet_bind_spkt(), packet_bind(), and sk_diag_fill().
Note that WRITE_ONCE() is already added by commit c7d2ef5dd4b0 ("net/packet: annotate accesses to po->bind").
BUG: KCSAN: data-race in packet_bind / packet_do_bind
write (marked) to 0xffff88802ffd1cee of 2 bytes by task 7322 on cpu 0:
packet_do_bind+0x446/0x640 net/packet/af_packet.c:3236 packet_bind+0x99/0xe0 net/packet/af_packet.c:3321 __sys_bind+0x19b/0x1e0 net/socket.c:1803 __do_sys_bind net/socket.c:1814 [inline] __se_sys_bind net/socket.c:1812 [inline] __x64_sys_bind+0x40/0x50 net/socket.c:1812 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc
read to 0xffff88802ffd1cee of 2 bytes by task 7318 on cpu 1:
packet_bind+0xbf/0xe0 net/packet/af_packet.c:3322 __sys_bind+0x19b/0x1e0 net/socket.c:1803 __do_sys_bind net/socket.c:1814 [inline] __se_sys_bind net/socket.c:1812 [inline] __x64_sys_bind+0x40/0x50 net/socket.c:1812 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x72/0xdc
value changed: 0x0300 -> 0x0000
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 7318 Comm: syz-executor.4 Not tainted 6.3.0-13380-g7fddb5b5300c #4 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
--- net/packet/af_packet.c | 4 ++-- net/packet/diag.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
net/packet/af_packet.c +2 -2
@@ -3291,7 +3291,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,memcpy (name, uaddr->sa_data,sizeof (uaddr->sa_data)); name[sizeof (uaddr->sa_data)] =0 ; -return packet_do_bind (sk, name,0 ,pkt_sk (sk)->num); +return packet_do_bind (sk, name,0 ,READ_ONCE (pkt_sk (sk)->num)); }static int packet_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len)
@@ -3309,7 +3309,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_lenreturn -EINVAL ;return packet_do_bind (sk,NULL , sll->sll_ifindex, - sll->sll_protocol ? :pkt_sk (sk)->num); + sll->sll_protocol ? :READ_ONCE (pkt_sk (sk)->num)); }static struct proto packet_proto = {
net/packet/diag.c +1 -1
@@ -143,7 +143,7 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, rp =nlmsg_data (nlh); rp->pdiag_family =AF_PACKET ; rp->pdiag_type = sk->sk_type; - rp->pdiag_num =ntohs (po->num); + rp->pdiag_num =ntohs (READ_ONCE (po->num)); rp->pdiag_ino = sk_ino;sock_diag_save_cookie (sk, rp->pdiag_cookie);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 24/225 tls: improve lockless access safety of tls_err_abort()
In reply to Greg Kroah-HartmanFrom: Jakub Kicinski <[email protected]>
[ Upstream commit 8a0d57df8938e9fd2e99d47a85b7f37d86f91097 ]
Most protos' poll() methods insert a memory barrier between writes to sk_err and sk_error_report(). This dates back to commit a4d258036ed9 ("tcp: Fix race in tcp_poll").
I guess we should do the same thing in TLS, tcp_poll() does not hold the socket lock.
--- net/tls/tls_strp.c | 4 +++- net/tls/tls_sw.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-)
net/tls/tls_strp.c +3 -1
@@ -20,7 +20,9 @@ static void tls_strp_abort_strp(struct tls_strparser *strp, int err) strp->stopped =1 ;/* Report an error on the lower socket */ - strp->sk->sk_err = -err; +WRITE_ONCE (strp->sk->sk_err, -err); +/* Paired with smp_rmb() in tcp_poll() */ +smp_wmb ();sk_error_report (strp->sk); }
net/tls/tls_sw.c +3 -1
@@ -67,7 +67,9 @@ noinline void tls_err_abort(struct sock *sk, int err) {WARN_ON_ONCE (err >=0 );/* sk->sk_err should contain a positive error code. */ - sk->sk_err = -err; +WRITE_ONCE (sk->sk_err, -err); +/* Paired with smp_rmb() in tcp_poll() */ +smp_wmb ();sk_error_report (sk); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 25/225 amd-xgbe: fix the false linkup in xgbe_phy_status
In reply to Greg Kroah-HartmanFrom: Raju Rangoju <[email protected]>
[ Upstream commit dc362e20cd6ab7a93d1b09669730c406f0910c35 ]
In the event of a change in XGBE mode, the current auto-negotiation needs to be reset and the AN cycle needs to be re-triggerred. However, the current code ignores the return value of xgbe_set_mode(), leading to false information as the link is declared without checking the status register.
Fix this by propagating the mode switch status information to xgbe_phy_status().
--- drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +9 -3
@@ -1312,7 +1312,7 @@ static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata)return pdata->phy_if.phy_impl.an_outcome (pdata); } -static void xgbe_phy_status_result (struct xgbe_prv_data *pdata) +static bool xgbe_phy_status_result (struct xgbe_prv_data *pdata) {struct ethtool_link_ksettings *lks = &pdata->phy.lks;enum xgbe_mode mode;
@@ -1347,8 +1347,13 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) pdata->phy.duplex =DUPLEX_FULL ; -if (xgbe_set_mode (pdata, mode) && pdata->an_again) +if (!xgbe_set_mode (pdata, mode)) +return false; + +if (pdata->an_again)xgbe_phy_reconfig_aneg (pdata); + +return true; }static void xgbe_phy_status (struct xgbe_prv_data *pdata)
@@ -1378,7 +1383,8 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)return ; } -xgbe_phy_status_result (pdata); +if (xgbe_phy_status_result (pdata)) +return ;if (test_bit (XGBE_LINK_INIT , &pdata->dev_state))clear_bit (XGBE_LINK_INIT , &pdata->dev_state);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 26/225 perf ftrace latency: Remove unnecessary "--" from --use-nsec option
In reply to Greg Kroah-HartmanFrom: Namhyung Kim <[email protected]>
[ Upstream commit 8d73259ef23f449329294dc187932f7470268126 ]
The option name should not have the dashes. Current version shows four dashes for the option.
$ perf ftrace latency -h
Usage: perf ftrace [<options>] [<command>]
or: perf ftrace [<options>] -- [<command>] [<options>]
or: perf ftrace {trace|latency} [<options>] [<command>]
or: perf ftrace {trace|latency} [<options>] -- [<command>] [<options>]
-b, --use-bpf Use BPF to measure function latency
-n, ----use-nsec Use nano-second histogram
-T, --trace-funcs <func>
Show latency of given function
--- tools/perf/builtin-ftrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-ftrace.c +1 -1
@@ -1175,7 +1175,7 @@ int cmd_ftrace(int argc, const char **argv)OPT_BOOLEAN ('b' ,"use-bpf" , &ftrace.target.use_bpf,"Use BPF to measure function latency" ), #endif -OPT_BOOLEAN ('n' ,"--use-nsec" , &ftrace.use_nsec, +OPT_BOOLEAN ('n' ,"use-nsec" , &ftrace.use_nsec,"Use nano-second histogram" ), OPT_PARENT(common_options), };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 27/225 mtd: rawnand: ingenic: fix empty stub helper definitions
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 650a8884a364ff2568b51cde9009cfd43cdae6ad ]
A few functions provide an empty interface definition when CONFIG_MTD_NAND_INGENIC_ECC is disabled, but they are accidentally defined as global functions in the header:
drivers/mtd/nand/raw/ingenic/ingenic_ecc.h:39:5: error: no previous prototype for 'ingenic_ecc_calculate' drivers/mtd/nand/raw/ingenic/ingenic_ecc.h:46:5: error: no previous prototype for 'ingenic_ecc_correct' drivers/mtd/nand/raw/ingenic/ingenic_ecc.h:53:6: error: no previous prototype for 'ingenic_ecc_release' drivers/mtd/nand/raw/ingenic/ingenic_ecc.h:57:21: error: no previous prototype for 'of_ingenic_ecc_get'
Turn them into 'static inline' definitions instead.
--- drivers/mtd/nand/raw/ingenic/ingenic_ecc.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mtd/nand/raw/ingenic/ingenic_ecc.h +4 -4
@@ -36,25 +36,25 @@ int ingenic_ecc_correct(struct ingenic_ecc *ecc,void ingenic_ecc_release (struct ingenic_ecc *ecc);struct ingenic_ecc *of_ingenic_ecc_get (struct device_node *np);#else /* CONFIG_MTD_NAND_INGENIC_ECC */ -int ingenic_ecc_calculate (struct ingenic_ecc *ecc, +static inline int ingenic_ecc_calculate (struct ingenic_ecc *ecc,struct ingenic_ecc_params *params,const u8 *buf,u8 *ecc_code) {return -ENODEV ; } -int ingenic_ecc_correct (struct ingenic_ecc *ecc, +static inline int ingenic_ecc_correct (struct ingenic_ecc *ecc,struct ingenic_ecc_params *params,u8 *buf,u8 *ecc_code) {return -ENODEV ; } -void ingenic_ecc_release (struct ingenic_ecc *ecc) +static inline void ingenic_ecc_release (struct ingenic_ecc *ecc) { } -struct ingenic_ecc *of_ingenic_ecc_get (struct device_node *np) +static inline struct ingenic_ecc *of_ingenic_ecc_get (struct device_node *np) {return ERR_PTR (-ENODEV ); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 28/225 RDMA/irdma: Prevent QP use after free
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
[ Upstream commit c8f304d75f6c6cc679a73f89591f9a915da38f09 ]
There is a window where the poll cq may use a QP that has been freed. This can happen if a CQE is polled before irdma_clean_cqes() can clear the CQE's related to the QP and the destroy QP races to free the QP memory. then the QP structures are used in irdma_poll_cq. Fix this by moving the clearing of CQE's before the reference is removed and the QP is destroyed.
--- drivers/infiniband/hw/irdma/verbs.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/infiniband/hw/irdma/verbs.c +6 -5
@@ -522,11 +522,6 @@ static int irdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)if (!iwqp->user_mode)cancel_delayed_work_sync (&iwqp->dwork_flush); -irdma_qp_rem_ref (&iwqp->ibqp); -wait_for_completion (&iwqp->free_qp); -irdma_free_lsmm_rsrc (iwqp); -irdma_cqp_qp_destroy_cmd (&iwdev->rf->sc_dev, &iwqp->sc_qp); -if (!iwqp->user_mode) {if (iwqp->iwscq) {irdma_clean_cqes (iwqp, iwqp->iwscq);
@@ -534,6 +529,12 @@ static int irdma_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)irdma_clean_cqes (iwqp, iwqp->iwrcq); } } + +irdma_qp_rem_ref (&iwqp->ibqp); +wait_for_completion (&iwqp->free_qp); +irdma_free_lsmm_rsrc (iwqp); +irdma_cqp_qp_destroy_cmd (&iwdev->rf->sc_dev, &iwqp->sc_qp); +irdma_remove_push_mmap_entries (iwqp);irdma_free_qp_rsrc (iwqp);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 29/225 RDMA/irdma: Fix Local Invalidate fencing
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
[ Upstream commit 5842d1d9c1b0d17e0c29eae65ae1f245f83682dd ]
If the local invalidate fence is indicated in the WR, only the read fence is currently being set in WQE. Fix this to set both the read and local fence in the WQE.
--- drivers/infiniband/hw/irdma/verbs.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/irdma/verbs.c +1 -0
@@ -3191,6 +3191,7 @@ static int irdma_post_send(struct ib_qp *ibqp,break ;case IB_WR_LOCAL_INV : info.op_type =IRDMA_OP_TYPE_INV_STAG ; + info.local_fence = info.read_fence; info.op.inv_local_stag.target_stag = ib_wr->ex.invalidate_rkey; err =irdma_uk_stag_local_invalidate (ukqp, &info, true);break ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 30/225 af_packet: do not use READ_ONCE() in packet_bind()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 6ffc57ea004234d9373c57b204fd10370a69f392 ]
A recent patch added READ_ONCE() in packet_bind() and packet_bind_spkt()
This is better handled by reading pkt_sk(sk)->num later in packet_do_bind() while appropriate lock is held.
READ_ONCE() in writers are often an evidence of something being wrong.
--- net/packet/af_packet.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/packet/af_packet.c +5 -3
@@ -3193,6 +3193,9 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,lock_sock (sk);spin_lock (&po->bind_lock); +if (!proto) + proto = po->num; +rcu_read_lock ();if (po->fanout) {
@@ -3291,7 +3294,7 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr,memcpy (name, uaddr->sa_data,sizeof (uaddr->sa_data)); name[sizeof (uaddr->sa_data)] =0 ; -return packet_do_bind (sk, name,0 ,READ_ONCE (pkt_sk (sk)->num)); +return packet_do_bind (sk, name,0 ,0 ); }static int packet_bind (struct socket *sock,struct sockaddr *uaddr,int addr_len)
@@ -3308,8 +3311,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_lenif (sll->sll_family !=AF_PACKET )return -EINVAL ; -return packet_do_bind (sk,NULL , sll->sll_ifindex, - sll->sll_protocol ? :READ_ONCE (pkt_sk (sk)->num)); +return packet_do_bind (sk,NULL , sll->sll_ifindex, sll->sll_protocol); }static struct proto packet_proto = {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 31/225 tcp: deny tcp_disconnect() when threads are waiting
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 4faeee0cf8a5d88d63cdbc3bab124fb0e6aed08c ]
Historically connect(AF_UNSPEC) has been abused by syzkaller and other fuzzers to trigger various bugs.
A recent one triggers a divide-by-zero [1], and Paolo Abeni was able to diagnose the issue.
tcp_recvmsg_locked() has tests about sk_state being not TCP_LISTEN and TCP REPAIR mode being not used.
Then later if socket lock is released in sk_wait_data(), another thread can call connect(AF_UNSPEC), then make this socket a TCP listener.
When recvmsg() is resumed, it can eventually call tcp_cleanup_rbuf() and attempt a divide by 0 in tcp_rcv_space_adjust() [1]
This patch adds a new socket field, counting number of threads blocked in sk_wait_event() and inet_wait_for_connect().
If this counter is not zero, tcp_disconnect() returns an error.
This patch adds code in blocking socket system calls, thus should not hurt performance of non blocking ones.
Note that we probably could revert commit 499350a5a6e7 ("tcp:
initialize rcv_mss to TCP_MIN_MSS instead of 0") to restore original tcpi_rcv_mss meaning (was 0 if no payload was ever received on a socket)
[1]
divide error: 0000 [#1] PREEMPT SMP KASAN
CPU: 0 PID: 13832 Comm: syz-executor.5 Not tainted 6.3.0-rc4-syzkaller-00224-g00c7b5f4ddc5 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 03/02/2023 RIP: 0010:tcp_rcv_space_adjust+0x36e/0x9d0 net/ipv4/tcp_input.c:740 Code: 00 00 00 00 fc ff df 4c 89 64 24 48 8b 44 24 04 44 89 f9 41 81 c7 80 03 00 00 c1 e1 04 44 29 f0 48 63 c9 48 01 e9 48 0f af c1 <49> f7 f6 48 8d 04 41 48 89 44 24 40 48 8b 44 24 30 48 c1 e8 03 48 RSP: 0018:ffffc900033af660 EFLAGS: 00010206 RAX: 4a66b76cbade2c48 RBX: ffff888076640cc0 RCX: 00000000c334e4ac RDX: 0000000000000000 RSI: dffffc0000000000 RDI: 0000000000000001 RBP: 00000000c324e86c R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8880766417f8 R13: ffff888028fbb980 R14: 0000000000000000 R15: 0000000000010344 FS: 00007f5bffbfe700(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000001b32f25000 CR3: 000000007ced0000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> tcp_recvmsg_locked+0x100e/0x22e0 net/ipv4/tcp.c:2616 tcp_recvmsg+0x117/0x620 net/ipv4/tcp.c:2681 inet6_recvmsg+0x114/0x640 net/ipv6/af_inet6.c:670 sock_recvmsg_nosec net/socket.c:1017 [inline] sock_recvmsg+0xe2/0x160 net/socket.c:1038 ____sys_recvmsg+0x210/0x5a0 net/socket.c:2720 ___sys_recvmsg+0xf2/0x180 net/socket.c:2762 do_recvmmsg+0x25e/0x6e0 net/socket.c:2856 __sys_recvmmsg net/socket.c:2935 [inline] __do_sys_recvmmsg net/socket.c:2958 [inline] __se_sys_recvmmsg net/socket.c:2951 [inline] __x64_sys_recvmmsg+0x20f/0x260 net/socket.c:2951 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x39/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f5c0108c0f9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 f1 19 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f5bffbfe168 EFLAGS: 00000246 ORIG_RAX: 000000000000012b RAX: ffffffffffffffda RBX: 00007f5c011ac050 RCX: 00007f5c0108c0f9 RDX: 0000000000000001 RSI: 0000000020000bc0 RDI: 0000000000000003 RBP: 00007f5c010e7b39 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000122 R11: 0000000000000246 R12: 0000000000000000 R13: 00007f5c012cfb1f R14: 00007f5bffbfe300 R15: 0000000000022000 </TASK>
--- include/net/sock.h | 4 ++++ net/ipv4/af_inet.c | 2 ++ net/ipv4/inet_connection_sock.c | 1 + net/ipv4/tcp.c | 6 ++++++ 4 files changed, 13 insertions(+)
include/net/sock.h +4 -0
@@ -333,6 +333,7 @@ struct sk_filter;* @sk_cgrp_data: cgroup data for this cgroup * @sk_memcg: this socket's memory cgroup association * @sk_write_pending: a write to stream socket waits to start +* @sk_wait_pending: number of threads blocked on this socket * @sk_state_change: callback to indicate change in the state of the sock * @sk_data_ready: callback to indicate there is data to be processed * @sk_write_space: callback to indicate there is bf sending space available
@@ -425,6 +426,7 @@ struct sock {unsigned int sk_napi_id;#endif int sk_rcvbuf; +int sk_wait_pending;struct sk_filter __rcu *sk_filter;union {
@@ -1170,6 +1172,7 @@ static inline void sock_rps_reset_rxhash(struct sock *sk)#define sk_wait_event (__sk, __timeo, __condition, __wait) \ ({ int __rc; \ + __sk->sk_wait_pending++; \ release_sock(__sk); \ __rc = __condition; \ if (!__rc) { \
@@ -1179,6 +1182,7 @@ static inline void sock_rps_reset_rxhash(struct sock *sk) } \sched_annotate_sleep (); \lock_sock (__sk); \ + __sk->sk_wait_pending--; \ __rc = __condition; \ __rc; \ })
net/ipv4/af_inet.c +2 -0
@@ -589,6 +589,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias)add_wait_queue (sk_sleep (sk), &wait); sk->sk_write_pending += writebias; + sk->sk_wait_pending++;/* Basic assumption: if someone sets sk->sk_err, he _must_ * change state of the socket from TCP_SYN_*.
@@ -604,6 +605,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) }remove_wait_queue (sk_sleep (sk), &wait); sk->sk_write_pending -= writebias; + sk->sk_wait_pending--;return timeo; }
net/ipv4/inet_connection_sock.c +1 -0
@@ -1143,6 +1143,7 @@ struct sock *inet_csk_clone_lock(const struct sock *sk,if (newsk) {struct inet_connection_sock *newicsk =inet_csk (newsk); + newsk->sk_wait_pending =0 ;inet_sk_set_state (newsk,TCP_SYN_RECV ); newicsk->icsk_bind_hash =NULL ; newicsk->icsk_bind2_hash =NULL ;
net/ipv4/tcp.c +6 -0
@@ -3079,6 +3079,12 @@ int tcp_disconnect(struct sock *sk, int flags)int old_state = sk->sk_state;u32 seq; +/* Deny disconnect if other threads are blocked in sk_wait_event() +* or inet_wait_for_connect(). +*/ +if (sk->sk_wait_pending) +return -EBUSY ; +if (old_state !=TCP_CLOSE )tcp_set_state (sk,TCP_CLOSE );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 32/225 tcp: Return user_mss for TCP_MAXSEG in CLOSE/LISTEN state if user_mss set
In reply to Greg Kroah-HartmanFrom: Cambda Zhu <[email protected]>
[ Upstream commit 34dfde4ad87b84d21278a7e19d92b5b2c68e6c4d ]
This patch replaces the tp->mss_cache check in getting TCP_MAXSEG with tp->rx_opt.user_mss check for CLOSE/LISTEN sock. Since tp->mss_cache is initialized with TCP_MSS_DEFAULT, checking if it's zero is probably a bug.
With this change, getting TCP_MAXSEG before connecting will return default MSS normally, and return user_mss if user_mss is set.
--- net/ipv4/tcp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/tcp.c +2 -1
@@ -4071,7 +4071,8 @@ int do_tcp_getsockopt(struct sock *sk, int level,switch (optname) {case TCP_MAXSEG : val = tp->mss_cache; -if (!val && ((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN ))) +if (tp->rx_opt.user_mss && + ((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN ))) val = tp->rx_opt.user_mss;if (tp->repair) val = tp->rx_opt.mss_clamp;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 33/225 net/smc: Scan from current RMB list when no position specified
In reply to Greg Kroah-HartmanFrom: Wen Gu <[email protected]>
[ Upstream commit b24aa141c2ff26c919237aee61ea1818fc6780d9 ]
When finding the first RMB of link group, it should start from the current RMB list whose index is 0. So fix it.
--- net/smc/smc_llc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/smc/smc_llc.c +4 -1
@@ -578,7 +578,10 @@ static struct smc_buf_desc *smc_llc_get_next_rmb(struct smc_link_group *lgr, {struct smc_buf_desc *buf_next; -if (!buf_pos ||list_is_last (&buf_pos->list, &lgr->rmbs[*buf_lst])) { +if (!buf_pos) +return _smc_llc_get_next_rmb (lgr, buf_lst); + +if (list_is_last (&buf_pos->list, &lgr->rmbs[*buf_lst])) { (*buf_lst)++;return _smc_llc_get_next_rmb (lgr, buf_lst); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 34/225 net/smc: Dont use RMBs not mapped to new link in SMCRv2 ADD LINK
In reply to Greg Kroah-HartmanFrom: Wen Gu <[email protected]>
[ Upstream commit 71c6aa0305e3d2365d3bfd0134b4025d9e7ba388 ]
We encountered a crash when using SMCRv2. It is caused by a logical error in smc_llc_fill_ext_v2().
BUG: kernel NULL pointer dereference, address: 0000000000000014 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 7 PID: 453 Comm: kworker/7:4 Kdump: loaded Tainted: G W E 6.4.0-rc3+ #44 Workqueue: events smc_llc_add_link_work [smc] RIP: 0010:smc_llc_fill_ext_v2+0x117/0x280 [smc] RSP: 0018:ffffacb5c064bd88 EFLAGS: 00010282 RAX: ffff9a6bc1c3c02c RBX: ffff9a6be3558000 RCX: 0000000000000000 RDX: 0000000000000002 RSI: 0000000000000002 RDI: 000000000000000a RBP: ffffacb5c064bdb8 R08: 0000000000000040 R09: 000000000000000c R10: ffff9a6bc0910300 R11: 0000000000000002 R12: 0000000000000000 R13: 0000000000000002 R14: ffff9a6bc1c3c02c R15: ffff9a6be3558250 FS: 0000000000000000(0000) GS:ffff9a6eefdc0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000014 CR3: 000000010b078003 CR4: 00000000003706e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> smc_llc_send_add_link+0x1ae/0x2f0 [smc] smc_llc_srv_add_link+0x2c9/0x5a0 [smc] ? cc_mkenc+0x40/0x60 smc_llc_add_link_work+0xb8/0x140 [smc] process_one_work+0x1e5/0x3f0 worker_thread+0x4d/0x2f0 ? __pfx_worker_thread+0x10/0x10 kthread+0xe5/0x120 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x2c/0x50 </TASK>
When an alernate RNIC is available in system, SMC will try to add a new link based on the RNIC for resilience. All the RMBs in use will be mapped to the new link. Then the RMBs' MRs corresponding to the new link will be filled into SMCRv2 LLC ADD LINK messages.
However, smc_llc_fill_ext_v2() mistakenly accesses to unused RMBs which haven't been mapped to the new link and have no valid MRs, thus causing a crash. So this patch fixes the logic.
--- net/smc/smc_llc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/smc/smc_llc.c +2 -2
@@ -617,6 +617,8 @@ static int smc_llc_fill_ext_v2(struct smc_llc_msg_add_link_v2_ext *ext, goto out; buf_pos =smc_llc_get_first_rmb (lgr, &buf_lst);for (i =0 ; i < ext->num_rkeys; i++) { +while (buf_pos && !(buf_pos)->used) + buf_pos =smc_llc_get_next_rmb (lgr, &buf_lst, buf_pos);if (!buf_pos)break ; rmb = buf_pos;
@@ -626,8 +628,6 @@ static int smc_llc_fill_ext_v2(struct smc_llc_msg_add_link_v2_ext *ext, cpu_to_be64((uintptr_t)rmb->cpu_addr) :cpu_to_be64 ((u64 )sg_dma_address (rmb->sgt[lnk_idx].sgl)); buf_pos =smc_llc_get_next_rmb (lgr, &buf_lst, buf_pos); -while (buf_pos && !(buf_pos)->used) - buf_pos =smc_llc_get_next_rmb (lgr, &buf_lst, buf_pos); } len += i *sizeof (ext->rt[0 ]); out:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 35/225 net/sched: sch_ingress: Only create under TC_H_INGRESS
In reply to Greg Kroah-HartmanFrom: Peilin Ye <[email protected]>
[ Upstream commit c7cfbd115001f94de9e4053657946a383147e803 ]
ingress Qdiscs are only supposed to be created under TC_H_INGRESS. Return -EOPNOTSUPP if 'parent' is not TC_H_INGRESS, similar to mq_init().
--- net/sched/sch_ingress.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/sched/sch_ingress.c +6 -0
@@ -80,6 +80,9 @@ static int ingress_init(struct Qdisc *sch, struct nlattr *opt,struct net_device *dev =qdisc_dev (sch);int err; +if (sch->parent !=TC_H_INGRESS ) +return -EOPNOTSUPP ; +net_inc_ingress_queue ();mini_qdisc_pair_init (&q->miniqp, sch, &dev->miniq_ingress);
@@ -101,6 +104,9 @@ static void ingress_destroy(struct Qdisc *sch) {struct ingress_sched_data *q =qdisc_priv (sch); +if (sch->parent !=TC_H_INGRESS ) +return ; +tcf_block_put_ext (q->block, sch, &q->block_info);net_dec_ingress_queue (); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 36/225 net/sched: sch_clsact: Only create under TC_H_CLSACT
In reply to Greg Kroah-HartmanFrom: Peilin Ye <[email protected]>
[ Upstream commit 5eeebfe6c493192b10d516abfd72742900f2a162 ]
clsact Qdiscs are only supposed to be created under TC_H_CLSACT (which equals TC_H_INGRESS). Return -EOPNOTSUPP if 'parent' is not TC_H_CLSACT.
--- net/sched/sch_ingress.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/sched/sch_ingress.c +6 -0
@@ -225,6 +225,9 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt,struct net_device *dev =qdisc_dev (sch);int err; +if (sch->parent !=TC_H_CLSACT ) +return -EOPNOTSUPP ; +net_inc_ingress_queue ();net_inc_egress_queue ();
@@ -254,6 +257,9 @@ static void clsact_destroy(struct Qdisc *sch) {struct clsact_sched_data *q =qdisc_priv (sch); +if (sch->parent !=TC_H_CLSACT ) +return ; +tcf_block_put_ext (q->egress_block, sch, &q->egress_block_info);tcf_block_put_ext (q->ingress_block, sch, &q->ingress_block_info);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 37/225 net/sched: Reserve TC_H_INGRESS (TC_H_CLSACT) for ingress (clsact) Qdiscs
In reply to Greg Kroah-HartmanFrom: Peilin Ye <[email protected]>
[ Upstream commit f85fa45d4a9408d98c46c8fa45ba2e3b2f4bf219 ]
Currently it is possible to add e.g. an HTB Qdisc under ffff:fff1 (TC_H_INGRESS, TC_H_CLSACT):
$ ip link add name ifb0 type ifb $ tc qdisc add dev ifb0 parent ffff:fff1 htb $ tc qdisc add dev ifb0 clsact Error: Exclusivity flag on, cannot modify. $ drgn ...
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
ifb0 =
netdev_get_by_name(prog, "ifb0")
qdisc = ifb0.ingress_queue.qdisc_sleeping
print(qdisc.ops.id.string_().decode())
htb
Quoted 1 line
Quoted 1 line
Quoted 1 line
qdisc.flags.value_()#TCQ_F_INGRESS
2
Only allow ingress and clsact Qdiscs under ffff:fff1. Return -EINVAL for everything else. Make TCQ_F_INGRESS a static flag of ingress and clsact Qdiscs.
--- net/sched/sch_api.c | 7 ++++++- net/sched/sch_ingress.c | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-)
net/sched/sch_api.c +6 -1
@@ -1241,7 +1241,12 @@ static struct Qdisc *qdisc_create(struct net_device *dev, sch->parent = parent;if (handle ==TC_H_INGRESS ) { - sch->flags |=TCQ_F_INGRESS ; +if (!(sch->flags &TCQ_F_INGRESS )) { +NL_SET_ERR_MSG (extack, +"Specified parent ID is reserved for ingress and clsact Qdiscs" ); + err = -EINVAL ; + goto err_out3; + } handle =TC_H_MAKE (TC_H_INGRESS ,0 ); }else {if (handle ==0 ) {
net/sched/sch_ingress.c +2 -2
@@ -140,7 +140,7 @@ static struct Qdisc_ops ingress_qdisc_ops __read_mostly = { .cl_ops = &ingress_class_ops, .id = "ingress", .priv_size = sizeof(struct ingress_sched_data), - .static_flags = TCQ_F_CPUSTATS, + .static_flags = TCQ_F_INGRESS | TCQ_F_CPUSTATS, .init = ingress_init, .destroy = ingress_destroy, .dump = ingress_dump,
@@ -281,7 +281,7 @@ static struct Qdisc_ops clsact_qdisc_ops __read_mostly = { .cl_ops = &clsact_class_ops, .id = "clsact", .priv_size = sizeof(struct clsact_sched_data), - .static_flags = TCQ_F_CPUSTATS, + .static_flags = TCQ_F_INGRESS | TCQ_F_CPUSTATS, .init = clsact_init, .destroy = clsact_destroy, .dump = ingress_dump,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 38/225 net/sched: Prohibit regrafting ingress or clsact Qdiscs
In reply to Greg Kroah-HartmanFrom: Peilin Ye <[email protected]>
[ Upstream commit 9de95df5d15baa956c2b70b9e794842e790a8a13 ]
Currently, after creating an ingress (or clsact) Qdisc and grafting it under TC_H_INGRESS (TC_H_CLSACT), it is possible to graft it again under e.g. a TBF Qdisc:
$ ip link add ifb0 type ifb
$ tc qdisc add dev ifb0 handle 1: root tbf rate 20kbit buffer 1600 limit 3000
$ tc qdisc add dev ifb0 clsact
$ tc qdisc link dev ifb0 handle ffff: parent 1:1
$ tc qdisc show dev ifb0
qdisc tbf 1: root refcnt 2 rate 20Kbit burst 1600b lat 560.0ms
qdisc clsact ffff: parent ffff:fff1 refcnt 2
^^^^^^^^clsact's refcount has increased: it is now grafted under both TC_H_CLSACT and 1:1.
ingress and clsact Qdiscs should only be used under TC_H_INGRESS (TC_H_CLSACT). Prohibit regrafting them.
--- net/sched/sch_api.c | 5 +++++ 1 file changed, 5 insertions(+)
net/sched/sch_api.c +5 -0
@@ -1591,6 +1591,11 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n,NL_SET_ERR_MSG (extack,"Invalid qdisc name" );return -EINVAL ; } +if (q->flags &TCQ_F_INGRESS ) { +NL_SET_ERR_MSG (extack, +"Cannot regraft ingress or clsact Qdiscs" ); +return -EINVAL ; + }if (q == p || (p &&check_loop (q, p,0 ))) {NL_SET_ERR_MSG (extack,"Qdisc parent/child loop detected" );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 39/225 net: sched: fix NULL pointer dereference in mq_attach
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 36eec020fab668719b541f34d97f44e232ffa165 ]
When use the following command to test:
1)ip link add bond0 type bond
2)ip link set bond0 up
3)tc qdisc add dev bond0 root handle ffff: mq
4)tc qdisc replace dev bond0 parent ffff:fff1 handle ffff: mq
The kernel reports NULL pointer dereference issue. The stack information is as follows:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 Internal error: Oops: 0000000096000006 [#1] SMP Modules linked in: pstate: 20000005 (nzCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : mq_attach+0x44/0xa0 lr : qdisc_graft+0x20c/0x5cc
sp : ffff80000e2236a0
x29: ffff80000e2236a0 x28: ffff0000c0e59d80 x27: ffff0000c0be19c0
x26: ffff0000cae3e800 x25: 0000000000000010 x24: 00000000fffffff1
x23: 0000000000000000 x22: ffff0000cae3e800 x21: ffff0000c9df4000
x20: ffff0000c9df4000 x19: 0000000000000000 x18: ffff80000a934000
x17: ffff8000f5b56000 x16: ffff80000bb08000 x15: 0000000000000000
x14: 0000000000000000 x13: 6b6b6b6b6b6b6b6b x12: 6b6b6b6b00000001
x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000 x8 : ffff0000c0be0730 x7 : bbbbbbbbbbbbbbbb x6 : 0000000000000008 x5 : ffff0000cae3e864 x4 : 0000000000000000 x3 : 0000000000000001 x2 : 0000000000000001 x1 : ffff8000090bc23c x0 : 0000000000000000
Call trace: mq_attach+0x44/0xa0 qdisc_graft+0x20c/0x5cc tc_modify_qdisc+0x1c4/0x664 rtnetlink_rcv_msg+0x354/0x440 netlink_rcv_skb+0x64/0x144 rtnetlink_rcv+0x28/0x34 netlink_unicast+0x1e8/0x2a4 netlink_sendmsg+0x308/0x4a0 sock_sendmsg+0x64/0xac ____sys_sendmsg+0x29c/0x358 ___sys_sendmsg+0x90/0xd0 __sys_sendmsg+0x7c/0xd0 __arm64_sys_sendmsg+0x2c/0x38 invoke_syscall+0x54/0x114 el0_svc_common.constprop.1+0x90/0x174 do_el0_svc+0x3c/0xb0 el0_svc+0x24/0xec el0t_64_sync_handler+0x90/0xb4 el0t_64_sync+0x174/0x178
This is because when mq is added for the first time, qdiscs in mq is set to NULL in mq_attach(). Therefore, when replacing mq after adding mq, we need to initialize qdiscs in the mq before continuing to graft. Otherwise, it will couse NULL pointer dereference issue in mq_attach(). And the same issue will occur in the attach functions of mqprio, taprio and htb. ffff:fff1 means that the repalce qdisc is ingress. Ingress does not allow any qdisc to be attached. Therefore, ffff:fff1 is incorrectly used, and the command should be dropped.
--- net/sched/sch_api.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sched/sch_api.c +4 -0
@@ -1601,6 +1601,10 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n,NL_SET_ERR_MSG (extack,"Qdisc parent/child loop detected" );return -ELOOP ; } +if (clid ==TC_H_INGRESS ) { +NL_SET_ERR_MSG (extack,"Ingress cannot graft directly" ); +return -EINVAL ; + }qdisc_refcount_inc (q); goto graft; }else {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 40/225 net/netlink: fix NETLINK_LIST_MEMBERSHIPS length report
In reply to Greg Kroah-HartmanFrom: Pedro Tammela <[email protected]>
[ Upstream commit f4e4534850a9d18c250a93f8d7fbb51310828110 ]
The current code for the length calculation wrongly truncates the reported length of the groups array, causing an under report of the subscribed groups. To fix this, use 'BITS_TO_BYTES()' which rounds up the division by 8.
--- net/netlink/af_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netlink/af_netlink.c +1 -1
@@ -1768,7 +1768,7 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname,break ; } } -if (put_user (ALIGN (nlk->ngroups /8 ,sizeof (u32)), optlen)) +if (put_user (ALIGN (BITS_TO_BYTES (nlk->ngroups),sizeof (u32)), optlen)) err = -EFAULT ;netlink_unlock_table ();return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 41/225 udp6: Fix race condition in udp6_sendmsg & connect
In reply to Greg Kroah-HartmanFrom: Vladislav Efanov <[email protected]>
[ Upstream commit 448a5ce1120c5bdbce1f1ccdabcd31c7d029f328 ]
Syzkaller got the following report:
BUG: KASAN: use-after-free in sk_setup_caps+0x621/0x690 net/core/sock.c:2018 Read of size 8 at addr ffff888027f82780 by task syz-executor276/3255
The function sk_setup_caps (called by ip6_sk_dst_store_flow-> ip6_dst_store) referenced already freed memory as this memory was freed by parallel task in udpv6_sendmsg->ip6_sk_dst_lookup_flow-> sk_dst_check.
task1 (connect) task2 (udp6_sendmsg)
sk_setup_caps->sk_dst_set |
| sk_dst_check->
| sk_dst_set
| dst_release
sk_setup_caps references |
to already freed dst_entry|
The reason for this race condition is: sk_setup_caps() keeps using the dst after transferring the ownership to the dst cache.
Found by Linux Verification Center (linuxtesting.org) with syzkaller.
--- net/core/sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/sock.c +1 -1
@@ -2370,7 +2370,6 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) {u32 max_segs =1 ; -sk_dst_set (sk, dst); sk->sk_route_caps = dst->dev->features;if (sk_is_tcp (sk)) sk->sk_route_caps |=NETIF_F_GSO ;
@@ -2392,6 +2391,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) } } sk->sk_gso_max_segs = max_segs; +sk_dst_set (sk, dst); }EXPORT_SYMBOL_GPL (sk_setup_caps);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 42/225 nfsd: fix double fget() bug in __write_ports_addfd()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit c034203b6a9dae6751ef4371c18cb77983e30c28 ]
The bug here is that you cannot rely on getting the same socket from multiple calls to fget() because userspace can influence that. This is a kind of double fetch bug.
The fix is to delete the svc_alien_sock() function and instead do the checking inside the svc_addsock() function.
--- fs/nfsd/nfsctl.c | 7 +------ include/linux/sunrpc/svcsock.h | 7 +++---- net/sunrpc/svcsock.c | 24 ++++++------------------ 3 files changed, 10 insertions(+), 28 deletions(-)
fs/nfsd/nfsctl.c +1 -6
@@ -710,16 +710,11 @@ static ssize_t __write_ports_addfd(char *buf, struct net *net, const struct credif (err !=0 || fd <0 )return -EINVAL ; -if (svc_alien_sock (net, fd)) { -printk (KERN_ERR "%s: socket net is different to NFSd's one\n" , __func__); -return -EINVAL ; - } - err =nfsd_create_serv (net);if (err !=0 )return err; - err =svc_addsock (nn->nfsd_serv, fd, buf,SIMPLE_TRANSACTION_LIMIT , cred); + err =svc_addsock (nn->nfsd_serv, net, fd, buf,SIMPLE_TRANSACTION_LIMIT , cred);if (err >=0 && !nn->nfsd_serv->sv_nrthreads && !xchg (&nn->keep_active,1 ))
include/linux/sunrpc/svcsock.h +3 -4
@@ -59,10 +59,9 @@ int svc_recv(struct svc_rqst *, long);int svc_send (struct svc_rqst *);void svc_drop (struct svc_rqst *);void svc_sock_update_bufs (struct svc_serv *serv); -bool svc_alien_sock (struct net *net,int fd); -int svc_addsock (struct svc_serv *serv,const int fd, -char *name_return,const size_t len, -const struct cred *cred); +int svc_addsock (struct svc_serv *serv,struct net *net, +const int fd,char *name_return,const size_t len, +const struct cred *cred);void svc_init_xprt_sock (void );void svc_cleanup_xprt_sock (void );struct svc_xprt *svc_sock_create (struct svc_serv *serv,int prot);
net/sunrpc/svcsock.c +6 -18
@@ -1338,25 +1338,10 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,return svsk; } -bool svc_alien_sock (struct net *net,int fd) -{ -int err; -struct socket *sock =sockfd_lookup (fd, &err); -bool ret = false; - -if (!sock) - goto out; -if (sock_net (sock->sk) != net) - ret = true; -sockfd_put (sock); -out: -return ret; -} -EXPORT_SYMBOL_GPL (svc_alien_sock); -/** * svc_addsock - add a listener socket to an RPC service * @serv: pointer to RPC service to which to add a new listener +* @net: caller's network namespace * @fd: file descriptor of the new listener * @name_return: pointer to buffer to fill in with name of listener * @len: size of the buffer
@@ -1366,8 +1351,8 @@ EXPORT_SYMBOL_GPL(svc_alien_sock);* Name is terminated with '\n'. On error, returns a negative errno * value. */ -int svc_addsock (struct svc_serv *serv,const int fd,char *name_return, -const size_t len,const struct cred *cred) +int svc_addsock (struct svc_serv *serv,struct net *net,const int fd, +char *name_return,const size_t len,const struct cred *cred) {int err =0 ;struct socket *so =sockfd_lookup (fd, &err);
@@ -1378,6 +1363,9 @@ int svc_addsock(struct svc_serv *serv, const int fd, char *name_return,if (!so)return err; + err = -EINVAL ; +if (sock_net (so->sk) != net) + goto out; err = -EAFNOSUPPORT ;if ((so->sk->sk_family !=PF_INET ) && (so->sk->sk_family !=PF_INET6 )) goto out;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 43/225 nvme: fix the name of Zone Append for verbose logging
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 856303797724d28f1d65b702f0eadcee1ea7abf5 ]
No Management involved in Zone Appened.
--- drivers/nvme/host/constants.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/constants.c +1 -1
@@ -21,7 +21,7 @@ static const char * const nvme_ops[] = { [nvme_cmd_resv_release] = "Reservation Release", [nvme_cmd_zone_mgmt_send] = "Zone Management Send", [nvme_cmd_zone_mgmt_recv] = "Zone Management Receive", - [nvme_cmd_zone_append] = "Zone Management Append", + [nvme_cmd_zone_append] = "Zone Append", };static const char *const nvme_admin_ops[] = {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 44/225 net/mlx5e: Fix error handling in mlx5e_refresh_tirs
In reply to Greg Kroah-HartmanFrom: Saeed Mahameed <[email protected]>
[ Upstream commit b6193d7030e3c59f1d4c75648c9c8fa40cad2bcd ]
Allocation failure is outside the critical lock section and should return immediately rather than jumping to the unlock section.
Also unlock as soon as required and remove the now redundant jump label.
--- drivers/net/ethernet/mellanox/mlx5/core/en_common.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_common.c +4 -7
@@ -139,10 +139,8 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb, inlen =MLX5_ST_SZ_BYTES (modify_tir_in); in =kvzalloc (inlen,GFP_KERNEL ); -if (!in) { - err = -ENOMEM ; - goto out; - } +if (!in) +return -ENOMEM ;if (enable_uc_lb) lb_flags =MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST ;
@@ -160,14 +158,13 @@ int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb, tirn = tir->tirn; err =mlx5_core_modify_tir (mdev, tirn, in);if (err) - goto out; +break ; } +mutex_unlock (&mdev->mlx5e_res.hw_objs.td.list_lock); -out:kvfree (in);if (err)netdev_err (priv->netdev,"refresh tir(0x%x) failed, %d\n" , tirn, err); -mutex_unlock (&mdev->mlx5e_res.hw_objs.td.list_lock);return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 45/225 net/mlx5: Read embedded cpu after init bit cleared
In reply to Greg Kroah-HartmanFrom: Moshe Shemesh <[email protected]>
[ Upstream commit bbfa4b58997e3d38ba629c9f6fc0bd1c163aaf43 ]
During driver load it reads embedded_cpu bit from initialization segment, but the initialization segment is readable only after initialization bit is cleared.
Move the call to mlx5_read_embedded_cpu() right after initialization bit cleared.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +1 -1
@@ -896,7 +896,6 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct pci_dev *pdev, }mlx5_pci_vsc_init (dev); - dev->caps.embedded_cpu =mlx5_read_embedded_cpu (dev);return 0 ; err_clr_master:
@@ -1130,6 +1129,7 @@ static int mlx5_function_setup(struct mlx5_core_dev *dev, bool boot, u64 timeout goto err_cmd_cleanup; } + dev->caps.embedded_cpu =mlx5_read_embedded_cpu (dev);mlx5_cmd_set_state (dev,MLX5_CMDIF_STATE_UP );mlx5_start_health_poll (dev);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 46/225 iommu/mediatek: Flush IOTLB completely only if domain has been attached
In reply to Greg Kroah-HartmanFrom: Chen-Yu Tsai <[email protected]>
[ Upstream commit b3fc95709c54ffbe80f16801e0a792a4d2b3d55e ]
If an IOMMU domain was never attached, it lacks any linkage to the actual IOMMU hardware. Attempting to do flush_iotlb_all() on it will result in a NULL pointer dereference. This seems to happen after the recent IOMMU core rework in v6.4-rc1.
Unable to handle kernel read from unreadable memory at virtual address 0000000000000018
Call trace:
mtk_iommu_flush_iotlb_all+0x20/0x80
iommu_create_device_direct_mappings.part.0+0x13c/0x230
iommu_setup_default_domain+0x29c/0x4d0
iommu_probe_device+0x12c/0x190
of_iommu_configure+0x140/0x208
of_dma_configure_id+0x19c/0x3c0
platform_dma_configure+0x38/0x88
really_probe+0x78/0x2c0Check if the "bank" field has been filled in before actually attempting the IOTLB flush to avoid it. The IOTLB is also flushed when the device comes out of runtime suspend, so it should have a clean initial state.
--- drivers/iommu/mtk_iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iommu/mtk_iommu.c +2 -1
@@ -737,7 +737,8 @@ static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain) {struct mtk_iommu_domain *dom =to_mtk_domain (domain); -mtk_iommu_tlb_flush_all (dom->bank->parent_data); +if (dom->bank) +mtk_iommu_tlb_flush_all (dom->bank->parent_data); } static void mtk_iommu_iotlb_sync(struct iommu_domain *domain,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 47/225 net/sched: flower: fix possible OOB write in fl_set_geneve_opt()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit 4d56304e5827c8cc8cc18c75343d283af7c4825c ]
If we send two TCA_FLOWER_KEY_ENC_OPTS_GENEVE packets and their total size is 252 bytes(key->enc_opts.len = 252) then key->enc_opts.len = opt->length = data_len / 4 = 0 when the third TCA_FLOWER_KEY_ENC_OPTS_GENEVE packet enters fl_set_geneve_opt. This bypasses the next bounds check and results in an out-of-bounds.
--- net/sched/cls_flower.c | 3 +++ 1 file changed, 3 insertions(+)
net/sched/cls_flower.c +3 -0
@@ -1147,6 +1147,9 @@ static int fl_set_geneve_opt(const struct nlattr *nla, struct fl_flow_key *key,if (option_len >sizeof (struct geneve_opt )) data_len = option_len -sizeof (struct geneve_opt ); +if (key->enc_opts.len >FLOW_DIS_TUN_OPTS_MAX -4 ) +return -ERANGE ; + opt = (struct geneve_opt *)&key->enc_opts.data[key->enc_opts.len];memset (opt,0xff , option_len); opt->length = data_len /4 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 48/225 tcp: fix mishandling when the sack compression is deferred.
In reply to Greg Kroah-HartmanFrom: fuyuanli <[email protected]>
[ Upstream commit 30c6f0bf9579debce27e45fac34fdc97e46acacc ]
In this patch, we mainly try to handle sending a compressed ack correctly if it's deferred.
Here are more details in the old logic:
When sack compression is triggered in the tcp_compressed_ack_kick(), if the sock is owned by user, it will set TCP_DELACK_TIMER_DEFERRED and then defer to the release cb phrase. Later once user releases the sock, tcp_delack_timer_handler() should send a ack as expected, which, however, cannot happen due to lack of ICSK_ACK_TIMER flag. Therefore, the receiver would not sent an ack until the sender's retransmission timeout. It definitely increases unnecessary latency.
--- include/net/tcp.h | 1 + net/ipv4/tcp_input.c | 2 +- net/ipv4/tcp_timer.c | 16 +++++++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-)
include/net/tcp.h +1 -0
@@ -632,6 +632,7 @@ void tcp_reset(struct sock *sk, struct sk_buff *skb);void tcp_skb_mark_lost_uncond_verify (struct tcp_sock *tp,struct sk_buff *skb);void tcp_fin (struct sock *sk);void tcp_check_space (struct sock *sk); +void tcp_sack_compress_send_ack (struct sock *sk);/* tcp_timer.c */ void tcp_init_xmit_timers (struct sock *);
net/ipv4/tcp_input.c +1 -1
@@ -4529,7 +4529,7 @@ static void tcp_sack_maybe_coalesce(struct tcp_sock *tp) } } -static void tcp_sack_compress_send_ack (struct sock *sk) +void tcp_sack_compress_send_ack (struct sock *sk) {struct tcp_sock *tp =tcp_sk (sk);
net/ipv4/tcp_timer.c +13 -3
@@ -290,9 +290,19 @@ static int tcp_write_timeout(struct sock *sk)void tcp_delack_timer_handler (struct sock *sk) {struct inet_connection_sock *icsk =inet_csk (sk); +struct tcp_sock *tp =tcp_sk (sk); -if (((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN )) || - !(icsk->icsk_ack.pending &ICSK_ACK_TIMER )) +if ((1 << sk->sk_state) & (TCPF_CLOSE |TCPF_LISTEN )) +return ; + +/* Handling the sack compression case */ +if (tp->compressed_ack) { +tcp_mstamp_refresh (tp); +tcp_sack_compress_send_ack (sk); +return ; + } + +if (!(icsk->icsk_ack.pending &ICSK_ACK_TIMER ))return ;if (time_after (icsk->icsk_ack.timeout, jiffies)) {
@@ -312,7 +322,7 @@ void tcp_delack_timer_handler(struct sock *sk)inet_csk_exit_pingpong_mode (sk); icsk->icsk_ack.ato =TCP_ATO_MIN ; } -tcp_mstamp_refresh (tcp_sk (sk)); +tcp_mstamp_refresh (tp);tcp_send_ack (sk);__NET_INC_STATS (sock_net (sk),LINUX_MIB_DELAYEDACKS ); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 49/225 net: dsa: mv88e6xxx: Increase wait after reset deactivation
In reply to Greg Kroah-HartmanFrom: Andreas Svensson <[email protected]>
[ Upstream commit 3c27f3d53d588618d81d30d6712459a3cc9489b8 ]
A switch held in reset by default needs to wait longer until we can reliably detect it.
An issue was observed when testing on the Marvell 88E6393X (Link Street). The driver failed to detect the switch on some upstarts. Increasing the wait time after reset deactivation solves this issue.
The updated wait time is now also the same as the wait time in the mv88e6xxx_hardware_reset function.
--- drivers/net/dsa/mv88e6xxx/chip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/mv88e6xxx/chip.c +1 -1
@@ -7067,7 +7067,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) goto out; }if (chip->reset) -usleep_range (1000 ,2000 ); +usleep_range (10000 ,20000 );/* Detect if the device is configured in single chip addressing mode, * otherwise continue with address specific smi init/detection.
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 50/225 mtd: rawnand: marvell: ensure timing values are written
In reply to Greg Kroah-HartmanFrom: Chris Packham <[email protected]>
[ Upstream commit 8a6f4d346f3bad9c68b4a87701eb3f7978542d57 ]
When new timing values are calculated in marvell_nfc_setup_interface() ensure that they will be applied in marvell_nfc_select_target() by clearing the selected_chip pointer.
--- drivers/mtd/nand/raw/marvell_nand.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/mtd/nand/raw/marvell_nand.c +6 -0
@@ -2449,6 +2449,12 @@ static int marvell_nfc_setup_interface(struct nand_chip *chip, int chipnr,NDTR1_WAIT_MODE ; } +/* +* Reset nfc->selected_chip so the next command will cause the timing +* registers to be updated in marvell_nfc_select_target(). +*/ + nfc->selected_chip =NULL ; +return 0 ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 51/225 mtd: rawnand: marvell: dont set the NAND frequency select
In reply to Greg Kroah-HartmanFrom: Chris Packham <[email protected]>
[ Upstream commit c4d28e30a8d0b979e4029465ab8f312ab6ce2644 ]
marvell_nfc_setup_interface() uses the frequency retrieved from the clock associated with the nand interface to determine the timings that will be used. By changing the NAND frequency select without reflecting this in the clock configuration this means that the timings calculated don't correctly meet the requirements of the NAND chip. This hasn't been an issue up to now because of a different bug that was stopping the timings being updated after they were initially set.
--- drivers/mtd/nand/raw/marvell_nand.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/mtd/nand/raw/marvell_nand.c +0 -4
@@ -2891,10 +2891,6 @@ static int marvell_nfc_init(struct marvell_nfc *nfc)regmap_update_bits (sysctrl_base,GENCONF_CLK_GATING_CTRL ,GENCONF_CLK_GATING_CTRL_ND_GATE ,GENCONF_CLK_GATING_CTRL_ND_GATE ); - -regmap_update_bits (sysctrl_base,GENCONF_ND_CLK_CTRL , -GENCONF_ND_CLK_CTRL_EN , -GENCONF_ND_CLK_CTRL_EN ); }/* Configure the DMA if appropriate */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 52/225 rtnetlink: call validate_linkmsg in rtnl_create_link
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
commit b0ad3c179059089d809b477a1d445c1183a7b8fe upstream.
validate_linkmsg() was introduced by commit 1840bb13c22f5b ("[RTNL]:
Validate hardware and broadcast address attribute for RTM_NEWLINK") to validate tb[IFLA_ADDRESS/BROADCAST] for existing links. The same check should also be done for newly created links.
This patch adds validate_linkmsg() call in rtnl_create_link(), to avoid the invalid address set when creating some devices like:
# ip link add dummy0 type dummy # ip link add link dummy0 name mac0 address 01:02 type macsec
--- net/core/rtnetlink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/core/rtnetlink.c +7 -1
@@ -3212,6 +3212,7 @@ struct net_device *rtnl_create_link(strustruct net_device *dev;unsigned int num_tx_queues =1 ;unsigned int num_rx_queues =1 ; +int err;if (tb[IFLA_NUM_TX_QUEUES ]) num_tx_queues =nla_get_u32 (tb[IFLA_NUM_TX_QUEUES ]);
@@ -3247,13 +3248,18 @@ struct net_device *rtnl_create_link(struif (!dev)return ERR_PTR (-ENOMEM ); + err =validate_linkmsg (dev, tb, extack); +if (err <0 ) { +free_netdev (dev); +return ERR_PTR (err); + } +dev_net_set (dev, net); dev->rtnl_link_ops = ops; dev->rtnl_link_state =RTNL_LINK_INITIALIZING ;if (tb[IFLA_MTU ]) {u32 mtu =nla_get_u32 (tb[IFLA_MTU ]); -int err; err =dev_validate_mtu (dev, mtu, extack);if (err) {
Greg Kroah-Hartman
maintainerPATCH 53/225 mptcp: avoid unneeded __mptcp_nmpc_socket() usage
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 617612316953093bc859890e405e1b550c27d840 ]
In a few spots, the mptcp code invokes the __mptcp_nmpc_socket() helper multiple times under the same socket lock scope. Additionally, in such places, the socket status ensures that there is no MP capable handshake running.
Under the above condition we can replace the later __mptcp_nmpc_socket() helper invocation with direct access to the msk->subflow pointer and better document such access is not supposed to fail with WARN().
Stable-dep-of: 5b825727d087 ("mptcp: add annotations around msk->subflow accesses")
--- net/mptcp/protocol.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/mptcp/protocol.c +6 -3
@@ -3172,7 +3172,7 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,struct socket *listener;struct sock *newsk; - listener =__mptcp_nmpc_socket (msk); + listener = msk->subflow;if (WARN_ON_ONCE (!listener)) { *err = -EINVAL ;return NULL ;
@@ -3398,7 +3398,7 @@ static int mptcp_get_port(struct sock *sk, unsigned short snum)struct mptcp_sock *msk =mptcp_sk (sk);struct socket *ssock; - ssock =__mptcp_nmpc_socket (msk); + ssock = msk->subflow;pr_debug ("msk=%p, subflow=%p" , msk, ssock);if (WARN_ON_ONCE (!ssock))return -EINVAL ;
@@ -3746,7 +3746,10 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,pr_debug ("msk=%p" , msk); - ssock =__mptcp_nmpc_socket (msk); +/* buggy applications can call accept on socket states other then LISTEN +* but no need to allocate the first subflow just to error out. +*/ + ssock = msk->subflow;if (!ssock)return -EINVAL ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 54/225 mptcp: add annotations around msk->subflow accesses
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 5b825727d0871b23e8867f6371183e61628b4a26 ]
The MPTCP can access the first subflow socket in a few spots outside the socket lock scope. That is actually safe, as MPTCP will delete the socket itself only after the msk sock close().
Still the such accesses causes a few KCSAN splats, as reported by Christoph. Silence the harmless warning adding a few annotation around the relevant accesses.
--- net/mptcp/protocol.c | 18 ++++++++++-------- net/mptcp/protocol.h | 6 +++++- 2 files changed, 15 insertions(+), 9 deletions(-)
net/mptcp/protocol.c +10 -8
@@ -112,7 +112,7 @@ static int __mptcp_socket_create(struct mptcp_sock *msk)return err; msk->first = ssock->sk; - msk->subflow = ssock; +WRITE_ONCE (msk->subflow, ssock); subflow =mptcp_subflow_ctx (ssock->sk);list_add (&subflow->node, &msk->conn_list);sock_hold (ssock->sk);
@@ -2269,7 +2269,7 @@ static void mptcp_dispose_initial_subflow(struct mptcp_sock *msk) {if (msk->subflow) {iput (SOCK_INODE (msk->subflow)); - msk->subflow =NULL ; +WRITE_ONCE (msk->subflow,NULL ); } }
@@ -3115,7 +3115,7 @@ struct sock *mptcp_sk_clone(const struct sock *sk, msk =mptcp_sk (nsk); msk->local_key = subflow_req->local_key; msk->token = subflow_req->token; - msk->subflow =NULL ; +WRITE_ONCE (msk->subflow,NULL ); msk->in_accept_queue =1 ;WRITE_ONCE (msk->fully_established, false);if (mp_opt->suboptions &OPTION_MPTCP_CSUMREQD )
@@ -3172,7 +3172,7 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,struct socket *listener;struct sock *newsk; - listener = msk->subflow; + listener =READ_ONCE (msk->subflow);if (WARN_ON_ONCE (!listener)) { *err = -EINVAL ;return NULL ;
@@ -3746,10 +3746,10 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,pr_debug ("msk=%p" , msk); -/* buggy applications can call accept on socket states other then LISTEN +/* Buggy applications can call accept on socket states other then LISTEN * but no need to allocate the first subflow just to error out. */ - ssock = msk->subflow; + ssock =READ_ONCE (msk->subflow);if (!ssock)return -EINVAL ;
@@ -3822,10 +3822,12 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock, state =inet_sk_state_load (sk);pr_debug ("msk=%p state=%d flags=%lx" , msk, state, msk->flags);if (state ==TCP_LISTEN ) { -if (WARN_ON_ONCE (!msk->subflow || !msk->subflow->sk)) +struct socket *ssock =READ_ONCE (msk->subflow); + +if (WARN_ON_ONCE (!ssock || !ssock->sk))return 0 ; -return inet_csk_listen_poll (msk->subflow->sk); +return inet_csk_listen_poll (ssock->sk); }if (state !=TCP_SYN_SENT && state !=TCP_SYN_RECV ) {
net/mptcp/protocol.h +5 -1
@@ -297,7 +297,11 @@ struct mptcp_sock {struct list_head rtx_queue;struct mptcp_data_frag *first_pending;struct list_head join_list; -struct socket *subflow;/* outgoing connect/listener/!mp_capable */ +struct socket *subflow;/* outgoing connect/listener/!mp_capable +* The mptcp ops can safely dereference, using suitable +* ONCE annotation, the subflow outside the socket +* lock as such sock is freed after close(). +*/ struct sock *first;struct mptcp_pm_data pm;struct {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 55/225 mptcp: avoid unneeded address copy
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 2bb9a37f0e194ed95c70603b0efc7898a5a0d9b4 ]
In the syn_recv fallback path, the msk is unused. We can skip setting the socket address.
Stable-dep-of: 7e8b88ec35ee ("mptcp: consolidate passive msk socket initialization")
--- net/mptcp/subflow.c | 2 -- 1 file changed, 2 deletions(-)
net/mptcp/subflow.c +0 -2
@@ -759,8 +759,6 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, goto dispose_child; } -if (new_msk) -mptcp_copy_inaddrs (new_msk, child);mptcp_subflow_drop_ctx (child); goto out; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 56/225 mptcp: simplify subflow_syn_recv_sock()
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit a88d0092b24b8cddce57fe0e88e60a9e29e0b515 ]
Postpone the msk cloning to the child process creation so that we can avoid a bunch of conditionals.
Stable-dep-of: 7e8b88ec35ee ("mptcp: consolidate passive msk socket initialization")
--- net/mptcp/subflow.c | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-)
net/mptcp/subflow.c +13 -28
@@ -633,14 +633,6 @@ static bool subflow_hmac_valid(const struct request_sock *req,return !crypto_memneq (hmac, mp_opt->hmac,MPTCPOPT_HMAC_LEN ); } -static void mptcp_force_close (struct sock *sk) -{ -/* the msk is not yet exposed to user-space, and refcount is 2 */ -inet_sk_state_store (sk,TCP_CLOSE ); -sk_common_release (sk); -sock_put (sk); -} -static void subflow_ulp_fallback (struct sock *sk,struct mptcp_subflow_context *old_ctx) {
@@ -693,7 +685,6 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,struct mptcp_subflow_request_sock *subflow_req;struct mptcp_options_received mp_opt;bool fallback, fallback_is_fatal; -struct sock *new_msk =NULL ;struct mptcp_sock *owner;struct sock *child;
@@ -722,14 +713,9 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,* options. */ mptcp_get_options (skb, &mp_opt); -if (!(mp_opt.suboptions &OPTIONS_MPTCP_MPC )) { +if (!(mp_opt.suboptions &OPTIONS_MPTCP_MPC )) fallback = true; - goto create_child; - } - new_msk =mptcp_sk_clone (listener->conn, &mp_opt, req); -if (!new_msk) - fallback = true; }else if (subflow_req->mp_join) {mptcp_get_options (skb, &mp_opt); if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ) ||
@@ -758,21 +744,23 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,subflow_add_reset_reason (skb,MPTCP_RST_EMPTCP ); goto dispose_child; } - -mptcp_subflow_drop_ctx (child); - goto out; + goto fallback; }/* ssk inherits options of listener sk */ ctx->setsockopt_seq = listener->setsockopt_seq;if (ctx->mp_capable) { - owner =mptcp_sk (new_msk); + ctx->conn =mptcp_sk_clone (listener->conn, &mp_opt, req); +if (!ctx->conn) + goto fallback; + + owner =mptcp_sk (ctx->conn);/* this can't race with mptcp_close(), as the msk is * not yet exposted to user-space */ -inet_sk_state_store ((void *)new_msk,TCP_ESTABLISHED ); +inet_sk_state_store (ctx->conn,TCP_ESTABLISHED );/* record the newly created socket as the first msk * subflow, but don't link it yet into conn_list
@@ -782,11 +770,9 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,/* new mpc subflow takes ownership of the newly * created mptcp socket */ -mptcp_sk (new_msk)->setsockopt_seq = ctx->setsockopt_seq; + owner->setsockopt_seq = ctx->setsockopt_seq;mptcp_pm_new_connection (owner, child,1 );mptcp_token_accept (subflow_req, owner); - ctx->conn = new_msk; - new_msk =NULL ;/* set msk addresses early to ensure mptcp_pm_get_local_id() * uses the correct data
@@ -836,11 +822,6 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, } } -out: -/* dispose of the left over mptcp master, if any */ -if (unlikely (new_msk)) -mptcp_force_close (new_msk); -/* check for expected invariant - should never trigger, just help * catching eariler subtle bugs */
@@ -858,6 +839,10 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,/* The last child reference will be released by the caller */ return child; + +fallback: +mptcp_subflow_drop_ctx (child); +return child; }static struct inet_connection_sock_af_ops subflow_specific__ro_after_init ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 57/225 mptcp: consolidate passive msk socket initialization
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 7e8b88ec35eef363040e08d99536d2bebef83774 ]
When the msk socket is cloned at MPC handshake time, a few fields are initialized in a racy way outside mptcp_sk_clone() and the msk socket lock.
The above is due historical reasons: before commit a88d0092b24b ("mptcp: simplify subflow_syn_recv_sock()") as the first subflow socket carrying all the needed date was not available yet at msk creation time
We can now refactor the code moving the missing initialization bit under the socket lock, removing the init race and avoiding some code duplication.
This will also simplify the next patch, as all msk->first write access are now under the msk socket lock.
--- net/mptcp/protocol.c | 35 ++++++++++++++++++++++++++++------- net/mptcp/protocol.h | 8 ++++---- net/mptcp/subflow.c | 28 +--------------------------- 3 files changed, 33 insertions(+), 38 deletions(-)
net/mptcp/protocol.c +28 -7
@@ -3017,7 +3017,7 @@ static void mptcp_close(struct sock *sk, long timeout)sock_put (sk); } -void mptcp_copy_inaddrs (struct sock *msk,const struct sock *ssk) +static void mptcp_copy_inaddrs (struct sock *msk,const struct sock *ssk) {#if IS_ENABLED (CONFIG_MPTCP_IPV6 )const struct ipv6_pinfo *ssk6 =inet6_sk (ssk);
@@ -3093,9 +3093,10 @@ static struct ipv6_pinfo *mptcp_inet6_sk(const struct sock *sk) }#endif -struct sock *mptcp_sk_clone (const struct sock *sk, -const struct mptcp_options_received *mp_opt, -struct request_sock *req) +struct sock *mptcp_sk_clone_init (const struct sock *sk, +const struct mptcp_options_received *mp_opt, +struct sock *ssk, +struct request_sock *req) {struct mptcp_subflow_request_sock *subflow_req =mptcp_subflow_rsk (req);struct sock *nsk =sk_clone_lock (sk,GFP_ATOMIC );
@@ -3137,10 +3138,30 @@ struct sock *mptcp_sk_clone(const struct sock *sk, }sock_reset_flag (nsk,SOCK_RCU_FREE ); -/* will be fully established after successful MPC subflow creation */ -inet_sk_state_store (nsk,TCP_SYN_RECV ); -security_inet_csk_clone (nsk, req); + +/* this can't race with mptcp_close(), as the msk is +* not yet exposted to user-space +*/ +inet_sk_state_store (nsk,TCP_ESTABLISHED ); + +/* The msk maintain a ref to each subflow in the connections list */ +WRITE_ONCE (msk->first, ssk); +list_add (&mptcp_subflow_ctx (ssk)->node, &msk->conn_list); +sock_hold (ssk); + +/* new mpc subflow takes ownership of the newly +* created mptcp socket +*/ +mptcp_token_accept (subflow_req, msk); + +/* set msk addresses early to ensure mptcp_pm_get_local_id() +* uses the correct data +*/ +mptcp_copy_inaddrs (nsk, ssk); +mptcp_propagate_sndbuf (nsk, ssk); + +mptcp_rcv_space_init (msk, ssk);bh_unlock_sock (nsk);/* note: the newly allocated socket refcount is 2 now */
net/mptcp/protocol.h +4 -4
@@ -606,7 +606,6 @@ int mptcp_is_checksum_enabled(const struct net *net);int mptcp_allow_join_id0 (const struct net *net);unsigned int mptcp_stale_loss_cnt (const struct net *net);int mptcp_get_pm_type (const struct net *net); -void mptcp_copy_inaddrs (struct sock *msk,const struct sock *ssk);void mptcp_subflow_fully_established (struct mptcp_subflow_context *subflow,struct mptcp_options_received *mp_opt);bool __mptcp_retransmit_pending_data (struct sock *sk);
@@ -675,9 +674,10 @@ void __init mptcp_proto_init(void);int __init mptcp_proto_v6_init (void );#endif -struct sock *mptcp_sk_clone (const struct sock *sk, -const struct mptcp_options_received *mp_opt, -struct request_sock *req); +struct sock *mptcp_sk_clone_init (const struct sock *sk, +const struct mptcp_options_received *mp_opt, +struct sock *ssk, +struct request_sock *req);void mptcp_get_options (const struct sk_buff *skb,struct mptcp_options_received *mp_opt);
net/mptcp/subflow.c +1 -27
@@ -751,38 +751,12 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, ctx->setsockopt_seq = listener->setsockopt_seq;if (ctx->mp_capable) { - ctx->conn =mptcp_sk_clone (listener->conn, &mp_opt, req); + ctx->conn =mptcp_sk_clone_init (listener->conn, &mp_opt, child, req);if (!ctx->conn) goto fallback; owner =mptcp_sk (ctx->conn); - -/* this can't race with mptcp_close(), as the msk is -* not yet exposted to user-space -*/ -inet_sk_state_store (ctx->conn,TCP_ESTABLISHED ); - -/* record the newly created socket as the first msk -* subflow, but don't link it yet into conn_list -*/ -WRITE_ONCE (owner->first, child); - -/* new mpc subflow takes ownership of the newly -* created mptcp socket -*/ - owner->setsockopt_seq = ctx->setsockopt_seq;mptcp_pm_new_connection (owner, child,1 ); -mptcp_token_accept (subflow_req, owner); - -/* set msk addresses early to ensure mptcp_pm_get_local_id() -* uses the correct data -*/ -mptcp_copy_inaddrs (ctx->conn, child); -mptcp_propagate_sndbuf (ctx->conn, child); - -mptcp_rcv_space_init (owner, child); -list_add (&ctx->node, &owner->conn_list); -sock_hold (child);/* with OoO packets we can reach here without ingress * mpc option
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 58/225 mptcp: fix data race around msk->first access
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 1b1b43ee7a208096ecd79e626f2fc90d4a321111 ]
The first subflow socket is accessed outside the msk socket lock by mptcp_subflow_fail(), we need to annotate each write access with WRITE_ONCE, but a few spots still lacks it.
--- net/mptcp/protocol.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/mptcp/protocol.c +3 -3
@@ -111,7 +111,7 @@ static int __mptcp_socket_create(struct mptcp_sock *msk)if (err)return err; - msk->first = ssock->sk; +WRITE_ONCE (msk->first, ssock->sk);WRITE_ONCE (msk->subflow, ssock); subflow =mptcp_subflow_ctx (ssock->sk);list_add (&subflow->node, &msk->conn_list);
@@ -2405,7 +2405,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,sock_put (ssk);if (ssk == msk->first) - msk->first =NULL ; +WRITE_ONCE (msk->first,NULL ); out:if (ssk == msk->last_snd)
@@ -2706,7 +2706,7 @@ static int __mptcp_init_sock(struct sock *sk)WRITE_ONCE (msk->rmem_released,0 ); msk->timer_ival =TCP_RTO_MIN ; - msk->first =NULL ; +WRITE_ONCE (msk->first,NULL );inet_csk (sk)->icsk_sync_mss = mptcp_sync_mss;WRITE_ONCE (msk->csum_enabled,mptcp_is_checksum_enabled (sock_net (sk)));WRITE_ONCE (msk->allow_infinite_fallback, true);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 59/225 mptcp: add annotations around sk->sk_shutdown accesses
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 6b9831bfd9322b297eb6d44257808cc055fdc586 ]
Christoph reported the mptcp variant of a recently addressed plain TCP issue. Similar to commit e14cadfd80d7 ("tcp: add annotations around sk->sk_shutdown accesses") add READ/WRITE ONCE annotations to silence KCSAN reports around lockless sk_shutdown access.
--- net/mptcp/protocol.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
net/mptcp/protocol.c +16 -13
@@ -599,7 +599,7 @@ static bool mptcp_check_data_fin(struct sock *sk)WRITE_ONCE (msk->ack_seq, msk->ack_seq +1 );WRITE_ONCE (msk->rcv_data_fin,0 ); - sk->sk_shutdown |=RCV_SHUTDOWN ; +WRITE_ONCE (sk->sk_shutdown, sk->sk_shutdown |RCV_SHUTDOWN );smp_mb__before_atomic ();/* SHUTDOWN must be visible first */ switch (sk->sk_state) {
@@ -906,7 +906,7 @@ static void mptcp_check_for_eof(struct mptcp_sock *msk)/* hopefully temporary hack: propagate shutdown status * to msk, when all subflows agree on it */ - sk->sk_shutdown |=RCV_SHUTDOWN ; +WRITE_ONCE (sk->sk_shutdown, sk->sk_shutdown |RCV_SHUTDOWN );smp_mb__before_atomic ();/* SHUTDOWN must be visible first */ sk->sk_data_ready (sk);
@@ -2512,7 +2512,7 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk) }inet_sk_state_store (sk,TCP_CLOSE ); - sk->sk_shutdown =SHUTDOWN_MASK ; +WRITE_ONCE (sk->sk_shutdown,SHUTDOWN_MASK );smp_mb__before_atomic ();/* SHUTDOWN must be visible first */ set_bit (MPTCP_WORK_CLOSE_SUBFLOW , &msk->flags);
@@ -2941,7 +2941,7 @@ bool __mptcp_close(struct sock *sk, long timeout)bool do_cancel_work = false;int subflows_alive =0 ; - sk->sk_shutdown =SHUTDOWN_MASK ; +WRITE_ONCE (sk->sk_shutdown,SHUTDOWN_MASK );if ((1 << sk->sk_state) & (TCPF_LISTEN |TCPF_CLOSE )) {inet_sk_state_store (sk,TCP_CLOSE );
@@ -3079,7 +3079,7 @@ static int mptcp_disconnect(struct sock *sk, int flags)mptcp_pm_data_reset (msk);mptcp_ca_reset (sk); - sk->sk_shutdown =0 ; +WRITE_ONCE (sk->sk_shutdown,0 );sk_error_report (sk);return 0 ; }
@@ -3815,9 +3815,6 @@ static __poll_t mptcp_check_writeable(struct mptcp_sock *msk) {struct sock *sk = (struct sock *)msk; -if (unlikely (sk->sk_shutdown &SEND_SHUTDOWN )) -return EPOLLOUT |EPOLLWRNORM ; -if (sk_stream_is_writeable (sk))return EPOLLOUT |EPOLLWRNORM ;
@@ -3835,6 +3832,7 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,struct sock *sk = sock->sk;struct mptcp_sock *msk;__poll_t mask =0 ; +u8 shutdown;int state; msk =mptcp_sk (sk);
@@ -3851,17 +3849,22 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,return inet_csk_listen_poll (ssock->sk); } + shutdown =READ_ONCE (sk->sk_shutdown); +if (shutdown ==SHUTDOWN_MASK || state ==TCP_CLOSE ) + mask |=EPOLLHUP ; +if (shutdown &RCV_SHUTDOWN ) + mask |=EPOLLIN |EPOLLRDNORM |EPOLLRDHUP ; +if (state !=TCP_SYN_SENT && state !=TCP_SYN_RECV ) { mask |=mptcp_check_readable (msk); - mask |=mptcp_check_writeable (msk); +if (shutdown &SEND_SHUTDOWN ) + mask |=EPOLLOUT |EPOLLWRNORM ; +else + mask |=mptcp_check_writeable (msk); }else if (state ==TCP_SYN_SENT &&inet_sk (sk)->defer_connect) {/* cf tcp_poll() note about TFO */ mask |=EPOLLOUT |EPOLLWRNORM ; } -if (sk->sk_shutdown ==SHUTDOWN_MASK || state ==TCP_CLOSE ) - mask |=EPOLLHUP ; -if (sk->sk_shutdown &RCV_SHUTDOWN ) - mask |=EPOLLIN |EPOLLRDNORM |EPOLLRDHUP ;/* This barrier is coupled with smp_wmb() in __mptcp_error_report() */ smp_rmb ();
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 60/225 drm/amdgpu: release gpu full access after "amdgpu_device_ip_late_init"
In reply to Greg Kroah-HartmanFrom: Chong Li <[email protected]>
[ Upstream commit 38eecbe086a4e52f54b2bbda8feba65d44addbef ]
[WHY]
Function "amdgpu_irq_update()" called by "amdgpu_device_ip_late_init()" is an atomic context. We shouldn't access registers through KIQ since "msleep()" may be called in "amdgpu_kiq_rreg()".
[HOW]
Move function "amdgpu_virt_release_full_gpu()" after function "amdgpu_device_ip_late_init()", to ensure that registers be accessed through RLCG instead of KIQ.
Call Trace: <TASK> show_stack+0x52/0x69 dump_stack_lvl+0x49/0x6d dump_stack+0x10/0x18 __schedule_bug.cold+0x4f/0x6b __schedule+0x473/0x5d0 ? __wake_up_klogd.part.0+0x40/0x70 ? vprintk_emit+0xbe/0x1f0 schedule+0x68/0x110 schedule_timeout+0x87/0x160 ? timer_migration_handler+0xa0/0xa0 msleep+0x2d/0x50 amdgpu_kiq_rreg+0x18d/0x1f0 [amdgpu] amdgpu_device_rreg.part.0+0x59/0xd0 [amdgpu] amdgpu_device_rreg+0x3a/0x50 [amdgpu] amdgpu_sriov_rreg+0x3c/0xb0 [amdgpu] gfx_v10_0_set_gfx_eop_interrupt_state.constprop.0+0x16c/0x190 [amdgpu] gfx_v10_0_set_eop_interrupt_state+0xa5/0xb0 [amdgpu] amdgpu_irq_update+0x53/0x80 [amdgpu] amdgpu_irq_get+0x7c/0xb0 [amdgpu] amdgpu_fence_driver_hw_init+0x58/0x90 [amdgpu] amdgpu_device_init.cold+0x16b7/0x2022 [amdgpu]
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +17 -15
@@ -2512,8 +2512,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)amdgpu_fru_get_product_info (adev); init_failed: -if (amdgpu_sriov_vf (adev)) -amdgpu_virt_release_full_gpu (adev, true);return r; }
@@ -3838,18 +3836,6 @@ int amdgpu_device_init(struct amdgpu_device *adev, r =amdgpu_device_ip_init (adev);if (r) { -/* failed in exclusive mode due to timeout */ -if (amdgpu_sriov_vf (adev) && - !amdgpu_sriov_runtime (adev) && -amdgpu_virt_mmio_blocked (adev) && - !amdgpu_virt_wait_reset (adev)) { -dev_err (adev->dev,"VF exclusive mode timeout\n" ); -/* Don't send request since VF is inactive. */ - adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME ; - adev->virt.ops =NULL ; - r = -EAGAIN ; - goto release_ras_con; - }dev_err (adev->dev,"amdgpu_device_ip_init failed\n" );amdgpu_vf_error_put (adev,AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL ,0 ,0 ); goto release_ras_con;
@@ -3921,8 +3907,10 @@ int amdgpu_device_init(struct amdgpu_device *adev, msecs_to_jiffies(AMDGPU_RESUME_MS)); } -if (amdgpu_sriov_vf (adev)) +if (amdgpu_sriov_vf (adev)) { +amdgpu_virt_release_full_gpu (adev, true);flush_delayed_work (&adev->delayed_init_work); + } r =sysfs_create_files (&adev->dev->kobj, amdgpu_dev_attributes);if (r)
@@ -3962,6 +3950,20 @@ int amdgpu_device_init(struct amdgpu_device *adev,return 0 ; release_ras_con: +if (amdgpu_sriov_vf (adev)) +amdgpu_virt_release_full_gpu (adev, true); + +/* failed in exclusive mode due to timeout */ +if (amdgpu_sriov_vf (adev) && + !amdgpu_sriov_runtime (adev) && +amdgpu_virt_mmio_blocked (adev) && + !amdgpu_virt_wait_reset (adev)) { +dev_err (adev->dev,"VF exclusive mode timeout\n" ); +/* Don't send request since VF is inactive. */ + adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME ; + adev->virt.ops =NULL ; + r = -EAGAIN ; + }amdgpu_release_ras_context (adev); failed:
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 61/225 watchdog: menz069_wdt: fix watchdog initialisation
In reply to Greg Kroah-HartmanFrom: Johannes Thumshirn <[email protected]>
[ Upstream commit 87b22656ca6a896d0378e9e60ffccb0c82f48b08 ]
Doing a 'cat /dev/watchdog0' with menz069_wdt as watchdog0 will result in a NULL pointer dereference.
This happens because we're passing the wrong pointer to watchdog_register_device(). Fix this by getting rid of the static watchdog_device structure and use the one embedded into the driver's per-instance private data.
--- drivers/watchdog/menz69_wdt.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)
drivers/watchdog/menz69_wdt.c +6 -10
@@ -98,14 +98,6 @@ static const struct watchdog_ops men_z069_ops = { .set_timeout = men_z069_wdt_set_timeout, }; -static struct watchdog_device men_z069_wdt = { - .info = &men_z069_info, - .ops = &men_z069_ops, - .timeout =MEN_Z069_DEFAULT_TIMEOUT , - .min_timeout =1 , - .max_timeout =MEN_Z069_WDT_COUNTER_MAX /MEN_Z069_TIMER_FREQ , -}; -static int men_z069_probe (struct mcb_device *dev,const struct mcb_device_id *id) {
@@ -125,15 +117,19 @@ static int men_z069_probe(struct mcb_device *dev, goto release_mem; drv->mem = mem; + drv->wdt.info = &men_z069_info; + drv->wdt.ops = &men_z069_ops; + drv->wdt.timeout =MEN_Z069_DEFAULT_TIMEOUT ; + drv->wdt.min_timeout =1 ; + drv->wdt.max_timeout =MEN_Z069_WDT_COUNTER_MAX /MEN_Z069_TIMER_FREQ ; - drv->wdt = men_z069_wdt;watchdog_init_timeout (&drv->wdt,0 , &dev->dev);watchdog_set_nowayout (&drv->wdt, nowayout);watchdog_set_drvdata (&drv->wdt, drv); drv->wdt.parent = &dev->dev;mcb_set_drvdata (dev, drv); -return watchdog_register_device (&men_z069_wdt); +return watchdog_register_device (&drv->wdt); release_mem:mcb_release_mem (mem);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 62/225 ALSA: hda: Glenfly: add HD Audio PCI IDs and HDMI Codec Vendor IDs.
In reply to Greg Kroah-HartmanFrom: jasontao <[email protected]>
[ Upstream commit c51e431052e2eacfb23fbf6b39bc6c8770d9827a ]
Add a set of HD Audio PCI IDS, and the HDMI codec vendor IDs for Glenfly Gpus.
- In default_bdl_pos_adj, set bdl to 128 as Glenfly Gpus have hardware limitation, need to increase hdac interrupt interval.
- In azx_first_init, enable polling mode for Glenfly Gpu. When the codec complete the command, it sends interrupt and writes response entries to memory, howerver, the write requests sometimes are not actually synchronized to memory when driver handle hdac interrupt on Glenfly Gpus. If the RIRB status is not updated in the interrupt handler, azx_rirb_get_response keeps trying to recevie a response from rirb until 1s timeout. Enabling polling mode for Glenfly Gpu can fix the issue.
- In patch_gf_hdmi, set Glenlfy Gpu Codec's no_sticky_stream as it need driver to do actual clean-ups for the linked codec when switch from one codec to another.
--- sound/pci/hda/hda_intel.c | 21 +++++++++++++++++++++ sound/pci/hda/patch_hdmi.c | 22 ++++++++++++++++++++++ 2 files changed, 43 insertions(+)
sound/pci/hda/hda_intel.c +21 -0
@@ -227,6 +227,7 @@ enum {AZX_DRIVER_ATI ,AZX_DRIVER_ATIHDMI ,AZX_DRIVER_ATIHDMI_NS , +AZX_DRIVER_GFHDMI ,AZX_DRIVER_VIA ,AZX_DRIVER_SIS , AZX_DRIVER_ULI,
@@ -349,6 +350,7 @@ static const char * const driver_short_names[] = { [AZX_DRIVER_ATI] = "HDA ATI SB", [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI", [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI", + [AZX_DRIVER_GFHDMI] = "HDA GF HDMI", [AZX_DRIVER_VIA] = "HDA VIA VT82xx", [AZX_DRIVER_SIS] = "HDA SIS966", [AZX_DRIVER_ULI] = "HDA ULI M5461",
@@ -1743,6 +1745,12 @@ static int default_bdl_pos_adj(struct azx *chip) }switch (chip->driver_type) { +/* +* increase the bdl size for Glenfly Gpus for hardware +* limitation on hdac interrupt interval +*/ +case AZX_DRIVER_GFHDMI : +return 128 ;case AZX_DRIVER_ICH :case AZX_DRIVER_PCH :return 1 ;
@@ -1858,6 +1866,12 @@ static int azx_first_init(struct azx *chip) pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0); }#endif +/* +* Fix response write request not synced to memory when handle +* hdac interrupt on Glenfly Gpus +*/ +if (chip->driver_type ==AZX_DRIVER_GFHDMI ) + bus->polling_mode =1 ; err =pcim_iomap_regions (pci,1 <<0 ,"ICH HD audio" );if (err <0 )
@@ -1959,6 +1973,7 @@ static int azx_first_init(struct azx *chip) chip->playback_streams =ATIHDMI_NUM_PLAYBACK ; chip->capture_streams =ATIHDMI_NUM_CAPTURE ;break ; +case AZX_DRIVER_GFHDMI :case AZX_DRIVER_GENERIC :default : chip->playback_streams =ICH6_NUM_PLAYBACK ;
@@ -2727,6 +2742,12 @@ static const struct pci_device_id azx_ids[] = { { PCI_DEVICE(0x1002, 0xab38), .driver_data =AZX_DRIVER_ATIHDMI_NS |AZX_DCAPS_PRESET_ATI_HDMI_NS | AZX_DCAPS_PM_RUNTIME }, + /* GLENFLY */ + { PCI_DEVICE(0x6766, PCI_ANY_ID), + .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, + .class_mask = 0xffffff, + .driver_data =AZX_DRIVER_GFHDMI |AZX_DCAPS_POSFIX_LPIB | + AZX_DCAPS_NO_MSI | AZX_DCAPS_NO_64BIT }, /* VIA VT8251/VT8237A */ { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA },/* VIA GFX VT7122/VX900 */
sound/pci/hda/patch_hdmi.c +22 -0
@@ -4489,6 +4489,22 @@ static int patch_via_hdmi(struct hda_codec *codec)return patch_simple_hdmi (codec,VIAHDMI_CVT_NID ,VIAHDMI_PIN_NID ); } +static int patch_gf_hdmi (struct hda_codec *codec) +{ +int err; + + err =patch_generic_hdmi (codec); +if (err) +return err; + +/* +* Glenfly GPUs have two codecs, stream switches from one codec to +* another, need to do actual clean-ups in codec_cleanup_stream +*/ + codec->no_sticky_stream =1 ; +return 0 ; +} +/* * patch entries */
@@ -4584,6 +4600,12 @@ HDA_CODEC_ENTRY(0x10de00a6, "GPU a6 HDMI/DP", patch_nvhdmi),HDA_CODEC_ENTRY (0x10de00a7 ,"GPU a7 HDMI/DP" , patch_nvhdmi),HDA_CODEC_ENTRY (0x10de8001 ,"MCP73 HDMI" , patch_nvhdmi_2ch),HDA_CODEC_ENTRY (0x10de8067 ,"MCP67/68 HDMI" , patch_nvhdmi_2ch), +HDA_CODEC_ENTRY (0x67663d82 ,"Arise 82 HDMI/DP" , patch_gf_hdmi), +HDA_CODEC_ENTRY (0x67663d83 ,"Arise 83 HDMI/DP" , patch_gf_hdmi), +HDA_CODEC_ENTRY (0x67663d84 ,"Arise 84 HDMI/DP" , patch_gf_hdmi), +HDA_CODEC_ENTRY (0x67663d85 ,"Arise 85 HDMI/DP" , patch_gf_hdmi), +HDA_CODEC_ENTRY (0x67663d86 ,"Arise 86 HDMI/DP" , patch_gf_hdmi), +HDA_CODEC_ENTRY (0x67663d87 ,"Arise 87 HDMI/DP" , patch_gf_hdmi),HDA_CODEC_ENTRY (0x11069f80 ,"VX900 HDMI/DP" , patch_via_hdmi),HDA_CODEC_ENTRY (0x11069f81 ,"VX900 HDMI/DP" , patch_via_hdmi), HDA_CODEC_ENTRY(0x11069f84, "VX11 HDMI/DP", patch_generic_hdmi),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 63/225 LoongArch: Relay BCE exceptions to userland as SIGSEGV with si_code=SEGV_BNDERR
In reply to Greg Kroah-HartmanFrom: WANG Xuerui <[email protected]>
[ Upstream commit c23e7f01cf621290770069d968ca4c8356a50d00 ]
SEGV_BNDERR was introduced initially for supporting the Intel MPX, but fell into disuse after the MPX support was removed. The LoongArch bounds-checking instructions behave very differently than MPX, but overall the interface is still kind of suitable for conveying the information to userland when bounds-checking assertions trigger, so we wouldn't have to invent more UAPI. Specifically, when the BCE triggers, a SEGV_BNDERR is sent to userland, with si_addr set to the out-of-bounds address or value (in asrt{gt,le}'s case), and one of si_lower or si_upper set to the configured bound depending on the faulting instruction. The other bound is set to either 0 or ULONG_MAX to resemble a range with both lower and upper bounds.
Note that it is possible to have si_addr == si_lower in case of a failing asrtgt or {ld,st}gt, because those instructions test for strict greater-than relationship. This should not pose a problem for userland, though, because the faulting PC is available for the application to associate back to the exact instruction for figuring out the expectation.
Example exception context generated by a faulting asrtgt.d t0, t1 (assert t0 > t1 or BCE) with t0=100 and t1=200:
Quoted 8 lines
pc
00005555558206a4ra00007ffff2d854fctp00007ffff2f2f180sp00007ffffbf9fb80a0 0000000000000002 a100007ffffbf9fce8a200007ffffbf9fd00a300007ffff2ed4558a4 0000000000000000 a500007ffff2f044c8a600007ffffbf9fce0a7fffffffffffff000t0 0000000000000064 t100000000000000c8t200007ffffbfa2d5et300007ffff2f12aa0t400007ffff2ed6158t500007ffff2ed6158t6000000000000002et70000000003d8f538t8 0000000000000005 u0 0000000000000000 s9 0000000000000000 s000007ffffbf9fce8s1 0000000000000002 s2 0000000000000000 s300007ffff2f2c038s4 0000555555820610 s500007ffff2ed5000s60000555555827e38s700007ffffbf9fd00s80000555555827e38
Quoted 8 lines
ra:
00007ffff2d854fc
ERA:00005555558206a4
CRMD:000000b0(PLV0 -IE -DA +PG DACF=CC DACM=CC -WE)
PRMD: 00000007 (PPLV3 +PIE -PWE)
EUEN: 00000000 (-FPE -SXE -ASXE -BTE)
ECFG:0007181c(LIE=2-4,11-12 VS=7)
ESTAT:000a0000[BCE] (IS= ECode=10 EsubCode=0)
PRID:0014c010(Loongson-64bit, Loongson-3A5000)
--- arch/loongarch/include/asm/inst.h | 26 +++++++++ arch/loongarch/kernel/genex.S | 1 + arch/loongarch/kernel/traps.c | 92 +++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+)
arch/loongarch/include/asm/inst.h +26 -0
@@ -105,6 +105,8 @@ enum reg2bstrd_op { };enum reg3_op { + asrtle_op =0x02 , + asrtgt_op =0x03 , addw_op =0x20 , addd_op =0x21 , subw_op =0x22 ,
@@ -156,6 +158,30 @@ enum reg3_op { amord_op =0x70c7 , amxorw_op =0x70c8 , amxord_op =0x70c9 , + fldgts_op =0x70e8 , + fldgtd_op =0x70e9 , + fldles_op =0x70ea , + fldled_op =0x70eb , + fstgts_op =0x70ec , + fstgtd_op =0x70ed , + fstles_op =0x70ee , + fstled_op =0x70ef , + ldgtb_op =0x70f0 , + ldgth_op =0x70f1 , + ldgtw_op =0x70f2 , + ldgtd_op =0x70f3 , + ldleb_op =0x70f4 , + ldleh_op =0x70f5 , + ldlew_op =0x70f6 , + ldled_op =0x70f7 , + stgtb_op =0x70f8 , + stgth_op =0x70f9 , + stgtw_op =0x70fa , + stgtd_op =0x70fb , + stleb_op =0x70fc , + stleh_op =0x70fd , + stlew_op =0x70fe , + stled_op = 0x70ff, }; enum reg3sa2_op {
arch/loongarch/kernel/genex.S +1 -0
@@ -79,6 +79,7 @@ SYM_FUNC_END(except_vec_cex) BUILD_HANDLER ade ade badv BUILD_HANDLER ale ale badv + BUILD_HANDLER bce bce none BUILD_HANDLER bp bp none BUILD_HANDLER fpe fpe fcsr BUILD_HANDLER fpu fpu none
arch/loongarch/kernel/traps.c +92 -0
116 lines not on this page · raw message
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 64/225 ASoC: Intel: soc-acpi-cht: Add quirk for Nextbook Ares 8A tablet
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit ec6f82b4c63cc68f8dc03316e725106d242706be ]
The Nextbook Ares 8A tablet which has Android as factory OS, has a buggy DSDT with both ESSX8316 and 10EC5651 ACPI devices.
This tablet actually uses an rt5651 codec, but the matching code ends up picking the ESSX8316 device, add a quirk to ignote the ESSX8316 device on this tablet.
Message-Id: <[email protected]>
--- .../intel/common/soc-acpi-intel-cht-match.c | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+)
sound/soc/intel/common/soc-acpi-intel-cht-match.c +26 -0
@@ -50,6 +50,31 @@ static struct snd_soc_acpi_mach *cht_quirk(void *arg)return mach; } +/* +* Some tablets with Android factory OS have buggy DSDTs with an ESSX8316 device +* in the ACPI tables. While they are not using an ESS8316 codec. These DSDTs +* also have an ACPI device for the correct codec, ignore the ESSX8316. +*/ +static const struct dmi_system_id cht_ess8316_not_present_table[] = { + { +/* Nextbook Ares 8A */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Insyde" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"CherryTrail" ), +DMI_MATCH (DMI_BIOS_VERSION ,"M882" ), + }, + }, + { } +}; + +static struct snd_soc_acpi_mach *cht_ess8316_quirk (void *arg) +{ +if (dmi_check_system (cht_ess8316_not_present_table)) +return NULL ; + +return arg; +} +static const struct snd_soc_acpi_codecs rt5640_comp_ids = { .num_codecs =2 , .codecs = {"10EC5640" ,"10EC3276" },
@@ -113,6 +138,7 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cherrytrail_machines[] = { .drv_name = "bytcht_es8316", .fw_filename = "intel/fw_sst_22a8.bin", .board = "bytcht_es8316", + .machine_quirk = cht_ess8316_quirk, .sof_tplg_filename = "sof-cht-es8316.tplg", },/* some CHT-T platforms rely on RT5640, use Baytrail machine driver */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 65/225 drm/amdgpu: Use the default reset when loading or reloading the driver
In reply to Greg Kroah-HartmanFrom: lyndonli <[email protected]>
[ Upstream commit 4eea7fb980dc44545a32eec92e2662053b34cd9d ]
Below call trace and errors are observed when reloading amdgpu driver with the module parameter reset_method=3.
It should do a default reset when loading or reloading the driver, regardless of the module parameter reset_method.
v2: add comments inside and modify commit messages.
[ +2.180243] [drm] psp gfx command ID_LOAD_TOC(0x20) failed and response status is (0x0)
[ +0.000011] [drm:psp_hw_start [amdgpu]] *ERROR* Failed to load toc [ +0.000890] [drm:psp_hw_start [amdgpu]] *ERROR* PSP tmr init failed! [ +0.020683] [drm:amdgpu_fill_buffer [amdgpu]] *ERROR* Trying to clear memory with ring turned off. [ +0.000003] RIP: 0010:amdgpu_bo_release_notify+0x1ef/0x210 [amdgpu] [ +0.000004] Call Trace: [ +0.000003] <TASK> [ +0.000008] ttm_bo_release+0x2c4/0x330 [amdttm] [ +0.000026] amdttm_bo_put+0x3c/0x70 [amdttm] [ +0.000020] amdgpu_bo_free_kernel+0xe6/0x140 [amdgpu] [ +0.000728] psp_v11_0_ring_destroy+0x34/0x60 [amdgpu] [ +0.000826] psp_hw_init+0xe7/0x2f0 [amdgpu] [ +0.000813] amdgpu_device_fw_loading+0x1ad/0x2d0 [amdgpu] [ +0.000731] amdgpu_device_init.cold+0x108e/0x2002 [amdgpu] [ +0.001071] ? do_pci_enable_device+0xe1/0x110 [ +0.000011] amdgpu_driver_load_kms+0x1a/0x160 [amdgpu] [ +0.000729] amdgpu_pci_probe+0x179/0x3a0 [amdgpu]
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +7 -0
@@ -3555,6 +3555,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,int r, i;bool px = false;u32 max_MBps; +int tmp; adev->shutdown = false; adev->flags = flags;
@@ -3776,7 +3777,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, } } }else { + tmp = amdgpu_reset_method; +/* It should do a default reset when loading or reloading the driver, +* regardless of the module parameter reset_method. +*/ + amdgpu_reset_method =AMD_RESET_METHOD_NONE ; r =amdgpu_asic_reset (adev); + amdgpu_reset_method = tmp;if (r) {dev_err (adev->dev,"asic reset on init failed\n" ); goto failed;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 66/225 mailbox: mailbox-test: Fix potential double-free in mbox_test_message_write()
In reply to Greg Kroah-HartmanFrom: Lee Jones <[email protected]>
[ Upstream commit 2d1e952a2b8e5e92d8d55ac88a7cf7ca5ea591ad ]
If a user can make copy_from_user() fail, there is a potential for UAF/DF due to a lack of locking around the allocation, use and freeing of the data buffers.
This issue is not theoretical. I managed to author a POC for it:
BUG: KASAN: double-free in kfree+0x5c/0xac
Free of addr ffff29280be5de00 by task poc/356
CPU: 1 PID: 356 Comm: poc Not tainted 6.1.0-00001-g961aa6552c04-dirty #20
Hardware name: linux,dummy-virt (DT)
Call trace:
dump_backtrace.part.0+0xe0/0xf0
show_stack+0x18/0x40
dump_stack_lvl+0x64/0x80
print_report+0x188/0x48c
kasan_report_invalid_free+0xa0/0xc0
____kasan_slab_free+0x174/0x1b0
__kasan_slab_free+0x18/0x24
__kmem_cache_free+0x130/0x2e0
kfree+0x5c/0xac
mbox_test_message_write+0x208/0x29c
full_proxy_write+0x90/0xf0
vfs_write+0x154/0x440
ksys_write+0xcc/0x180
__arm64_sys_write+0x44/0x60
invoke_syscall+0x60/0x190
el0_svc_common.constprop.0+0x7c/0x160
do_el0_svc+0x40/0xf0
el0_svc+0x2c/0x6c
el0t_64_sync_handler+0xf4/0x120
el0t_64_sync+0x18c/0x190
Allocated by task 356:
kasan_save_stack+0x3c/0x70
kasan_set_track+0x2c/0x40
kasan_save_alloc_info+0x24/0x34
__kasan_kmalloc+0xb8/0xc0
kmalloc_trace+0x58/0x70
mbox_test_message_write+0x6c/0x29c
full_proxy_write+0x90/0xf0
vfs_write+0x154/0x440
ksys_write+0xcc/0x180
__arm64_sys_write+0x44/0x60
invoke_syscall+0x60/0x190
el0_svc_common.constprop.0+0x7c/0x160
do_el0_svc+0x40/0xf0
el0_svc+0x2c/0x6c
el0t_64_sync_handler+0xf4/0x120
el0t_64_sync+0x18c/0x190
Freed by task 357:
kasan_save_stack+0x3c/0x70
kasan_set_track+0x2c/0x40
kasan_save_free_info+0x38/0x5c
____kasan_slab_free+0x13c/0x1b0
__kasan_slab_free+0x18/0x24
__kmem_cache_free+0x130/0x2e0
kfree+0x5c/0xac
mbox_test_message_write+0x208/0x29c
full_proxy_write+0x90/0xf0
vfs_write+0x154/0x440
ksys_write+0xcc/0x180
__arm64_sys_write+0x44/0x60
invoke_syscall+0x60/0x190
el0_svc_common.constprop.0+0x7c/0x160
do_el0_svc+0x40/0xf0
el0_svc+0x2c/0x6c
el0t_64_sync_handler+0xf4/0x120
el0t_64_sync+0x18c/0x190--- drivers/mailbox/mailbox-test.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/mailbox/mailbox-test.c +7 -0
@@ -12,6 +12,7 @@#include <linux/kernel.h> #include <linux/mailbox_client.h> #include <linux/module.h> +#include <linux/mutex.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/poll.h>
@@ -38,6 +39,7 @@ struct mbox_test_device {char *signal;char *message;spinlock_t lock; +struct mutex mutex;wait_queue_head_t waitq;struct fasync_struct *async_queue;struct dentry *root_debugfs_dir;
@@ -110,6 +112,8 @@ static ssize_t mbox_test_message_write(struct file *filp,return -EINVAL ; } +mutex_lock (&tdev->mutex); + tdev->message =kzalloc (MBOX_MAX_MSG_LEN ,GFP_KERNEL );if (!tdev->message)return -ENOMEM ;
@@ -144,6 +148,8 @@ static ssize_t mbox_test_message_write(struct file *filp,kfree (tdev->message); tdev->signal =NULL ; +mutex_unlock (&tdev->mutex); +return ret <0 ? ret : count; }
@@ -392,6 +398,7 @@ static int mbox_test_probe(struct platform_device *pdev)platform_set_drvdata (pdev, tdev);spin_lock_init (&tdev->lock); +mutex_init (&tdev->mutex);if (tdev->rx_channel) { tdev->rx_buffer = devm_kzalloc(&pdev->dev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 67/225 drm/ast: Fix ARM compatibility
In reply to Greg Kroah-HartmanFrom: Jammy Huang <[email protected]>
[ Upstream commit 4327a6137ed43a091d900b1ac833345d60f32228 ]
ARM architecture only has 'memory', so all devices are accessed by MMIO if possible.
--- drivers/gpu/drm/ast/ast_main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/gpu/drm/ast/ast_main.c +5 -4
@@ -427,11 +427,12 @@ struct ast_private *ast_device_create(const struct drm_driver *drv,return ERR_PTR (-EIO );/* -* If we don't have IO space at all, use MMIO now and -* assume the chip has MMIO enabled by default (rev 0x20 -* and higher). +* After AST2500, MMIO is enabled by default, and it should be adopted +* to be compatible with Arm. */ -if (!(pci_resource_flags (pdev,2 ) &IORESOURCE_IO )) { +if (pdev->revision >=0x40 ) { + ast->ioregs = ast->regs +AST_IO_MM_OFFSET ; + }else if (!(pci_resource_flags (pdev,2 ) &IORESOURCE_IO )) {drm_info (dev,"platform has no IO space, trying MMIO\n" ); ast->ioregs = ast->regs +AST_IO_MM_OFFSET ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 68/225 btrfs: abort transaction when sibling keys check fails for leaves
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 9ae5afd02a03d4e22a17a9609b19400b77c36273 ]
If the sibling keys check fails before we move keys from one sibling leaf to another, we are not aborting the transaction - we leave that to some higher level caller of btrfs_search_slot() (or anything else that uses it to insert items into a b+tree).
This means that the transaction abort will provide a stack trace that omits the b+tree modification call chain. So change this to immediately abort the transaction and therefore get a more useful stack trace that shows us the call chain in the bt+tree modification code.
It's also important to immediately abort the transaction just in case some higher level caller is not doing it, as this indicates a very serious corruption and we should stop the possibility of doing further damage.
--- fs/btrfs/ctree.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/ctree.c +2 -0
@@ -3118,6 +3118,7 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_rootif (check_sibling_keys (left, right)) { ret = -EUCLEAN ; +btrfs_abort_transaction (trans, ret);btrfs_tree_unlock (right);free_extent_buffer (right);return ret;
@@ -3348,6 +3349,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_rootif (check_sibling_keys (left, right)) { ret = -EUCLEAN ; +btrfs_abort_transaction (trans, ret); goto out; } return __push_leaf_left(path, min_data_size,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 69/225 ARM: 9295/1: unwind:fix unwind abort for uleb128 case
In reply to Greg Kroah-HartmanFrom: Haibo Li <[email protected]>
[ Upstream commit fa3eeb638de0c1a9d2d860e5b48259facdd65176 ]
When unwind instruction is 0xb2,the subsequent instructions are uleb128 bytes.
For now,it uses only the first uleb128 byte in code.
For vsp increments of 0x204~0x400,use one uleb128 byte like below:0xc06a00e4 <unwind_test_work>: 0x80b27fac
Compact model index: 0
0xb2 0x7f vsp = vsp + 1024
0xac pop {r4, r5, r6, r7, r8, r14}
For vsp increments larger than 0x400,use two uleb128 bytes like below:0xc06a00e4 <unwind_test_work>: @0xc0cc9e0c
Compact model index: 1
0xb2 0x81 0x01 vsp = vsp + 1032
0xac pop {r4, r5, r6, r7, r8, r14}
The unwind works well since the decoded uleb128 byte is also 0x81.
For vsp increments larger than 0x600,use two uleb128 bytes like below:0xc06a00e4 <unwind_test_work>: @0xc0cc9e0c
Compact model index: 1
0xb2 0x81 0x02 vsp = vsp + 1544
0xac pop {r4, r5, r6, r7, r8, r14}
In this case,the decoded uleb128 result is 0x101(vsp=0x204+(0x101<<2)). While the uleb128 used in code is 0x81(vsp=0x204+(0x81<<2)). The unwind aborts at this frame since it gets incorrect vsp.
To fix this,add uleb128 decode to cover all the above case.
--- arch/arm/kernel/unwind.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
arch/arm/kernel/unwind.c +24 -1
@@ -307,6 +307,29 @@ static int unwind_exec_pop_subset_r0_to_r3(struct unwind_ctrl_block *ctrl,return URC_OK ; } +static unsigned long unwind_decode_uleb128 (struct unwind_ctrl_block *ctrl) +{ +unsigned long bytes =0 ; +unsigned long insn; +unsigned long result =0 ; + +/* +* unwind_get_byte() will advance `ctrl` one instruction at a time, so +* loop until we get an instruction byte where bit 7 is not set. +* +* Note: This decodes a maximum of 4 bytes to output 28 bits data where +* max is 0xfffffff: that will cover a vsp increment of 1073742336, hence +* it is sufficient for unwinding the stack. +*/ +do { + insn =unwind_get_byte (ctrl); + result |= (insn &0x7f ) << (bytes *7 ); + bytes++; + }while (!!(insn &0x80 ) && (bytes !=sizeof (result))); + +return result; +} +/* * Execute the current unwind instruction. */
@@ -360,7 +383,7 @@ static int unwind_exec_insn(struct unwind_ctrl_block *ctrl)if (ret) goto error; }else if (insn ==0xb2 ) { -unsigned long uleb128 =unwind_get_byte (ctrl); +unsigned long uleb128 =unwind_decode_uleb128 (ctrl); ctrl->vrs[SP ] +=0x204 + (uleb128 <<2 ); }else {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 70/225 hwmon: (k10temp) Add PCI ID for family 19, model 78h
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
[ Upstream commit 7d8accfaa0ab65e4282c8e58950f7d688342cd86 ]
Enable k10temp on this system.
[ bp: Massage. ]
--- drivers/hwmon/k10temp.c | 1 + 1 file changed, 1 insertion(+)
drivers/hwmon/k10temp.c +1 -0
@@ -507,6 +507,7 @@ static const struct pci_device_id k10temp_id_table[] = { { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M50H_DF_F3) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M60H_DF_F3) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M70H_DF_F3) }, + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M78H_DF_F3) }, { PCI_VDEVICE(HYGON, PCI_DEVICE_ID_AMD_17H_DF_F3) }, {} };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 71/225 media: rcar-vin: Select correct interrupt mode for V4L2_FIELD_ALTERNATE
In reply to Greg Kroah-HartmanFrom: Niklas Söderlund <[email protected]>
[ Upstream commit e10707d5865c90d3dfe4ef589ce02ff4287fef85 ]
When adding proper support for V4L2_FIELD_ALTERNATE it was missed that this field format should trigger an interrupt for each field, not just for the whole frame. Fix this by marking it as progressive in the capture setup, which will then select the correct interrupt mode.
Tested on both Gen2 and Gen3 with the result of a doubling of the frame rate for V4L2_FIELD_ALTERNATE. From a PAL video source the frame rate is now 50, which is expected for alternate field capture.
--- drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/media/platform/renesas/rcar-vin/rcar-dma.c +1 -3
@@ -651,11 +651,9 @@ static int rvin_setup(struct rvin_dev *vin)case V4L2_FIELD_SEQ_TB :case V4L2_FIELD_SEQ_BT :case V4L2_FIELD_NONE : - vnmc =VNMC_IM_ODD_EVEN ; - progressive = true; -break ;case V4L2_FIELD_ALTERNATE : vnmc =VNMC_IM_ODD_EVEN ; + progressive = true;break ;default : vnmc =VNMC_IM_ODD ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 72/225 platform/x86: intel_scu_pcidrv: Add back PCI ID for Medfield
In reply to Greg Kroah-HartmanFrom: Julian Winkler <[email protected]>
[ Upstream commit 4a9b6850c794e4394cad99e2b863d75f5bc8e92f ]
This id was removed in commit b47018a778c1 ("platform/x86: intel_scu_ipc:
Remove Lincroft support"), saying it is only used on Moorestown, but apparently the same id is also used on Medfield.
Tested on the Medfield based Motorola RAZR i smartphone.
--- drivers/platform/x86/intel_scu_pcidrv.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/intel_scu_pcidrv.c +1 -0
@@ -34,6 +34,7 @@ static int intel_scu_pci_probe(struct pci_dev *pdev,static const struct pci_device_id pci_ids[] = { {PCI_VDEVICE (INTEL ,0x080e ) }, + {PCI_VDEVICE (INTEL ,0x082a ) }, {PCI_VDEVICE (INTEL ,0x08ea ) }, {PCI_VDEVICE (INTEL ,0x0a94 ) }, {PCI_VDEVICE (INTEL ,0x11a0 ) },
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 73/225 platform/mellanox: fix potential race in mlxbf-tmfifo driver
In reply to Greg Kroah-HartmanFrom: Liming Sun <[email protected]>
[ Upstream commit 3d43f9f639542fadfb28f40b509bf147a6624d48 ]
This commit adds memory barrier for the 'vq' update in function mlxbf_tmfifo_virtio_find_vqs() to avoid potential race due to out-of-order memory write. It also adds barrier for the 'is_ready' flag to make sure the initializations are visible before this flag is checked.
--- drivers/platform/mellanox/mlxbf-tmfifo.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/platform/mellanox/mlxbf-tmfifo.c +9 -2
@@ -765,7 +765,7 @@ static void mlxbf_tmfifo_rxtx(struct mlxbf_tmfifo_vring *vring, bool is_rx) fifo = vring->fifo;/* Return if vdev is not ready. */ -if (!fifo->vdev[devid]) +if (!fifo || !fifo->vdev[devid])return ;/* Return if another vring is running. */
@@ -961,9 +961,13 @@ static int mlxbf_tmfifo_virtio_find_vqs(struct virtio_device *vdev, vq->num_max = vring->num; + vq->priv = vring; + +/* Make vq update visible before using it. */ +virtio_mb (false); + vqs[i] = vq; vring->vq = vq; - vq->priv = vring; }return 0 ;
@@ -1260,6 +1264,9 @@ static int mlxbf_tmfifo_probe(struct platform_device *pdev)mod_timer (&fifo->timer, jiffies +MLXBF_TMFIFO_TIMER_INTERVAL ); +/* Make all updates visible before setting the 'is_ready' flag. */ +virtio_mb (false); + fifo->is_ready = true;return 0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 74/225 gfs2: Dont deref jdesc in evict
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit 504a10d9e46bc37b23d0a1ae2f28973c8516e636 ]
On corrupt gfs2 file systems the evict code can try to reference the journal descriptor structure, jdesc, after it has been freed and set to NULL. The sequence of events is:
init_journal()
...fail_jindex:
gfs2_jindex_free(sdp); <------frees journals, sets jdesc = NULL
if (gfs2_holder_initialized(&ji_gh))
gfs2_glock_dq_uninit(&ji_gh);
fail:
iput(sdp->sd_jindex); <--references jdesc in evict_linked_inode
evict()
gfs2_evict_inode()
evict_linked_inode()
ret = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks);<------references the now freed/zeroed sd_jdesc pointer.
The call to gfs2_trans_begin is done because the truncate_inode_pages call can cause gfs2 events that require a transaction, such as removing journaled data (jdata) blocks from the journal.
This patch fixes the problem by adding a check for sdp->sd_jdesc to function gfs2_evict_inode. In theory, this should only happen to corrupt gfs2 file systems, when gfs2 detects the problem, reports it, then tries to evict all the system inodes it has read in up to that point.
--- fs/gfs2/super.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/gfs2/super.c +8 -0
@@ -1380,6 +1380,14 @@ static void gfs2_evict_inode(struct inode *inode)if (inode->i_nlink ||sb_rdonly (sb)) goto out; +/* +* In case of an incomplete mount, gfs2_evict_inode() may be called for +* system files without having an active journal to write to. In that +* case, skip the filesystem evict. +*/ +if (!sdp->sd_jdesc) + goto out; +gfs2_holder_mark_uninitialized (&gh); ret =evict_should_delete (inode, &gh);if (ret ==SHOULD_DEFER_EVICTION )
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 75/225 drm/amdgpu: set gfx9 onwards APU atomics support to be true
In reply to Greg Kroah-HartmanFrom: Yifan Zhang <[email protected]>
[ Upstream commit af7828fbceed4f9e503034111066a0adef3db383 ]
APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is internal path w/ native atomic support. Set have_atomics_support to true.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +6 -0
@@ -3734,6 +3734,12 @@ int amdgpu_device_init(struct amdgpu_device *adev, adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *) adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags == (PCI_EXP_DEVCAP2_ATOMIC_COMP32 |PCI_EXP_DEVCAP2_ATOMIC_COMP64 ); +/* APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is a +* internal path natively support atomics, set have_atomics_support to true. +*/ + else if ((adev->flags & AMD_IS_APU) && + (adev->ip_versions[GC_HWIP][0] > IP_VERSION(9, 0, 0))) + adev->have_atomics_support = true; else adev->have_atomics_support = !pci_enable_atomic_ops_to_root(adev->pdev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 76/225 fbdev: imsttfb: Fix use after free bug in imsttfb_probe
In reply to Greg Kroah-HartmanFrom: Zheng Wang <[email protected]>
[ Upstream commit c75f5a55061091030a13fef71b9995b89bc86213 ]
A use-after-free bug may occur if init_imstt invokes framebuffer_release and free the info ptr. The caller, imsttfb_probe didn't notice that and still keep the ptr as private data in pdev.
If we remove the driver which will call imsttfb_remove to make cleanup, UAF happens.
Fix it by return error code if bad case happens in init_imstt.
--- drivers/video/fbdev/imsttfb.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/video/fbdev/imsttfb.c +8 -7
@@ -1347,7 +1347,7 @@ static const struct fb_ops imsttfb_ops = { .fb_ioctl = imsttfb_ioctl, }; -static void init_imstt (struct fb_info *info) +static int init_imstt (struct fb_info *info) {struct imstt_par *par = info->par;__u32 i, tmp, *ip, *end;
@@ -1420,7 +1420,7 @@ static void init_imstt(struct fb_info *info) || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) {printk ("imsttfb: %ux%ux%u not supported\n" , info->var.xres, info->var.yres, info->var.bits_per_pixel);framebuffer_release (info); -return ; +return -ENODEV ; }sprintf (info->fix.id,"IMS TT (%s)" , par->ramdac ==IBM ?"IBM" :"TVP" );
@@ -1456,12 +1456,13 @@ static void init_imstt(struct fb_info *info)if (register_framebuffer (info) <0 ) {framebuffer_release (info); -return ; +return -ENODEV ; } tmp = (read_reg_le32 (par->dc_regs,SSTATUS ) &0x0f00 ) >>8 ;fb_info (info,"%s frame buffer; %uMB vram; chip version %u\n" , info->fix.id, info->fix.smem_len >>20 , tmp); +return 0 ; }static int imsttfb_probe (struct pci_dev *pdev,const struct pci_device_id *ent)
@@ -1529,10 +1530,10 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)if (!par->cmap_regs) goto error; info->pseudo_palette = par->palette; -init_imstt (info); - -pci_set_drvdata (pdev, info); -return 0 ; + ret =init_imstt (info); +if (!ret) +pci_set_drvdata (pdev, info); +return ret; error:if (par->dc_regs)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 77/225 fbdev: modedb: Add 1920x1080 at 60 Hz video mode
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
[ Upstream commit c8902258b2b8ecaa1b8d88c312853c5b14c2553d ]
Add typical resolution for Full-HD monitors.
--- drivers/video/fbdev/core/modedb.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/video/fbdev/core/modedb.c +5 -0
@@ -257,6 +257,11 @@ static const struct fb_videomode modedb[] = { {NULL ,72 ,480 ,300 ,33386 ,40 ,24 ,11 ,19 ,80 ,3 ,0 , FB_VMODE_DOUBLE }, +/* 1920x1080 @ 60 Hz, 67.3 kHz hsync */ + { NULL, 60, 1920, 1080, 6734, 148, 88, 36, 4, 44, 5, 0, +FB_SYNC_HOR_HIGH_ACT |FB_SYNC_VERT_HIGH_ACT , + FB_VMODE_NONINTERLACED }, +/* 1920x1200 @ 60 Hz, 74.5 Khz hsync */ { NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 78/225 fbdev: stifb: Fix info entry in sti_struct on error path
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
[ Upstream commit 0bdf1ad8d10bd4e50a8b1a2c53d15984165f7fea ]
Minor fix to reset the info field to NULL in case of error.
--- drivers/video/fbdev/stifb.c | 1 + 1 file changed, 1 insertion(+)
drivers/video/fbdev/stifb.c +1 -0
@@ -1413,6 +1413,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)iounmap (info->screen_base); out_err0:kfree (fb); + sti->info =NULL ;return -ENXIO ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 79/225 nbd: Fix debugfs_create_dir error checking
In reply to Greg Kroah-HartmanFrom: Ivan Orlov <[email protected]>
[ Upstream commit 4913cfcf014c95f0437db2df1734472fd3e15098 ]
The debugfs_create_dir function returns ERR_PTR in case of error, and the only correct way to check if an error occurred is 'IS_ERR' inline function. This patch will replace the null-comparison with IS_ERR.
--- drivers/block/nbd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/block/nbd.c +2 -2
@@ -1665,7 +1665,7 @@ static int nbd_dev_dbg_init(struct nbd_device *nbd)return -EIO ; dir =debugfs_create_dir (nbd_name (nbd), nbd_dbg_dir); -if (!dir) { +if (IS_ERR (dir)) {dev_err (nbd_to_dev (nbd),"Failed to create debugfs dir for '%s'\n" ,nbd_name (nbd));return -EIO ;
@@ -1691,7 +1691,7 @@ static int nbd_dbg_init(void)struct dentry *dbg_dir; dbg_dir =debugfs_create_dir ("nbd" ,NULL ); -if (!dbg_dir) +if (IS_ERR (dbg_dir))return -EIO ; nbd_dbg_dir = dbg_dir;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 80/225 block/rnbd: replace REQ_OP_FLUSH with REQ_OP_WRITE
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
[ Upstream commit 5e6e08087a4acb4ee3574cea32dbff0f63c7f608 ]
Since flush bios are implemented as writes with no data and the preflush flag per Christoph's comment [1].
And we need to change it in rnbd accordingly. Otherwise, I got splatting when create fs from rnbd client.
[ 464.028545] ------------[ cut here ]------------ [ 464.028553] WARNING: CPU: 0 PID: 65 at block/blk-core.c:751 submit_bio_noacct+0x32c/0x5d0 [ ... ] [ 464.028668] CPU: 0 PID: 65 Comm: kworker/0:1H Tainted: G OE 6.4.0-rc1 #9 [ 464.028671] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.15.0-0-g2dd4b9b-rebuilt.opensuse.org 04/01/2014 [ 464.028673] Workqueue: ib-comp-wq ib_cq_poll_work [ib_core] [ 464.028717] RIP: 0010:submit_bio_noacct+0x32c/0x5d0 [ 464.028720] Code: 03 0f 85 51 fe ff ff 48 8b 43 18 8b 88 04 03 00 00 85 c9 0f 85 3f fe ff ff e9 be fd ff ff 0f b6 d0 3c 0d 74 26 83 fa 01 74 21 <0f> 0b b8 0a 00 00 00 e9 56 fd ff ff 4c 89 e7 e8 70 a1 03 00 84 c0 [ 464.028722] RSP: 0018:ffffaf3680b57c68 EFLAGS: 00010202 [ 464.028724] RAX: 0000000000060802 RBX: ffffa09dcc18bf00 RCX: 0000000000000000 [ 464.028726] RDX: 0000000000000002 RSI: 0000000000000000 RDI: ffffa09dde081d00 [ 464.028727] RBP: ffffaf3680b57c98 R08: ffffa09dde081d00 R09: ffffa09e38327200 [ 464.028729] R10: 0000000000000000 R11: 0000000000000000 R12: ffffa09dde081d00 [ 464.028730] R13: ffffa09dcb06e1e8 R14: 0000000000000000 R15: 0000000000200000 [ 464.028733] FS: 0000000000000000(0000) GS:ffffa09e3bc00000(0000) knlGS:0000000000000000 [ 464.028735] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 464.028736] CR2: 000055a4e8206c40 CR3: 0000000119f06000 CR4: 00000000003506f0 [ 464.028738] Call Trace: [ 464.028740] <TASK> [ 464.028746] submit_bio+0x1b/0x80 [ 464.028748] rnbd_srv_rdma_ev+0x50d/0x10c0 [rnbd_server] [ 464.028754] ? percpu_ref_get_many.constprop.0+0x55/0x140 [rtrs_server] [ 464.028760] ? __this_cpu_preempt_check+0x13/0x20 [ 464.028769] process_io_req+0x1dc/0x450 [rtrs_server] [ 464.028775] rtrs_srv_inv_rkey_done+0x67/0xb0 [rtrs_server] [ 464.028780] __ib_process_cq+0xbc/0x1f0 [ib_core] [ 464.028793] ib_cq_poll_work+0x2b/0xa0 [ib_core] [ 464.028804] process_one_work+0x2a9/0x580
[1]. https://lore.kernel.org/all/[email protected]/
--- drivers/block/rnbd/rnbd-proto.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/rnbd/rnbd-proto.h +1 -1
@@ -241,7 +241,7 @@ static inline blk_opf_t rnbd_to_bio_flags(u32 rnbd_opf) bio_opf =REQ_OP_WRITE ;break ;case RNBD_OP_FLUSH : - bio_opf =REQ_OP_FLUSH |REQ_PREFLUSH ; + bio_opf =REQ_OP_WRITE |REQ_PREFLUSH ;break ;case RNBD_OP_DISCARD : bio_opf =REQ_OP_DISCARD ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 81/225 nvme-pci: add NVME_QUIRK_BOGUS_NID for HS-SSD-FUTURE 2048G
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 1616d6c3717bae9041a4240d381ec56ccdaafedc ]
Add a quirk to fix HS-SSD-FUTURE 2048G SSD drives reporting duplicate nsids.
--- drivers/nvme/host/pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/nvme/host/pci.c +2 -0
@@ -3554,6 +3554,8 @@ static const struct pci_device_id nvme_id_table[] = { NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x10ec, 0x5763), /* TEAMGROUP T-FORCE CARDEA ZERO Z330 SSD */ .driver_data = NVME_QUIRK_BOGUS_NID, }, + { PCI_DEVICE(0x1e4b, 0x1602), /* HS-SSD-FUTURE 2048G */ + .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061), .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, }, { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 82/225 nvme-pci: add quirk for missing secondary temperature thresholds
In reply to Greg Kroah-HartmanFrom: Hristo Venev <[email protected]>
[ Upstream commit bd375feeaf3408ed00e08c3bc918d6be15f691ad ]
On Kingston KC3000 and Kingston FURY Renegade (both have the same PCI IDs) accessing temp3_{min,max} fails with an invalid field error (note that there is no problem setting the thresholds for temp1).
This contradicts the NVM Express Base Specification 2.0b, page 292:
The over temperature threshold and under temperature threshold features shall be implemented for all implemented temperature sensors (i.e., all Temperature Sensor fields that report a non-zero value).
Define NVME_QUIRK_NO_SECONDARY_TEMP_THRESH that disables the thresholds for all but the composite temperature and set it for this device.
--- drivers/nvme/host/hwmon.c | 4 +++- drivers/nvme/host/nvme.h | 5 +++++ drivers/nvme/host/pci.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-)
drivers/nvme/host/hwmon.c +3 -1
@@ -163,7 +163,9 @@ static umode_t nvme_hwmon_is_visible(const void *_data,case hwmon_temp_max:case hwmon_temp_min:if ((!channel && data->ctrl->wctemp) || - (channel && data->log->temp_sensor[channel -1 ])) { + (channel && data->log->temp_sensor[channel -1 ] && + !(data->ctrl->quirks & +NVME_QUIRK_NO_SECONDARY_TEMP_THRESH ))) {if (data->ctrl->quirks &NVME_QUIRK_NO_TEMP_THRESH_CHANGE )return 0444 ;
drivers/nvme/host/nvme.h +5 -0
@@ -149,6 +149,11 @@ enum nvme_quirks {* Reports garbage in the namespace identifiers (eui64, nguid, uuid). */ NVME_QUIRK_BOGUS_NID = (1 <<18 ), + +/* +* No temperature thresholds for channels other than 0 (Composite). +*/ + NVME_QUIRK_NO_SECONDARY_TEMP_THRESH = (1 << 19), };/*
drivers/nvme/host/pci.c +2 -0
@@ -3515,6 +3515,8 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, { PCI_DEVICE(0x2646, 0x2263), /* KINGSTON A2000 NVMe SSD */ .driver_data = NVME_QUIRK_NO_DEEPEST_PS, }, + { PCI_DEVICE(0x2646, 0x5013), /* Kingston KC3000, Kingston FURY Renegade */ + .driver_data = NVME_QUIRK_NO_SECONDARY_TEMP_THRESH, }, { PCI_DEVICE(0x2646, 0x5018), /* KINGSTON OM8SFP4xxxxP OS21012 NVMe SSD */ .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, }, { PCI_DEVICE(0x2646, 0x5016), /* KINGSTON OM3PGP4xxxxP OS21011 NVMe SSD */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 83/225 ASoC: amd: yc: Add DMI entry to support System76 Pangolin 12
In reply to Greg Kroah-HartmanFrom: Jeremy Soller <[email protected]>
[ Upstream commit 7b9891ad25246b18b5ccc19518da7abc7763aa0a ]
Add pang12 quirk to enable the internal microphone.
--- sound/soc/amd/yc/acp6x-mach.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/amd/yc/acp6x-mach.c +7 -0
@@ -297,6 +297,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = { DMI_MATCH(DMI_BOARD_NAME, "8A22"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "System76"), + DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"), + } + }, {} };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 84/225 ASoC: dwc: limit the number of overrun messages
In reply to Greg Kroah-HartmanFrom: Maxim Kochetkov <[email protected]>
[ Upstream commit ab6ecfbf40fccf74b6ec2ba7ed6dd2fc024c3af2 ]
On slow CPU (FPGA/QEMU emulated) printing overrun messages from interrupt handler to uart console may leads to more overrun errors. So use dev_err_ratelimited to limit the number of error messages.
--- sound/soc/dwc/dwc-i2s.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/dwc/dwc-i2s.c +2 -2
@@ -132,13 +132,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)/* Error Handling: TX */ if (isr[i] &ISR_TXFO ) { -dev_err (dev->dev,"TX overrun (ch_id=%d)\n" , i); +dev_err_ratelimited (dev->dev,"TX overrun (ch_id=%d)\n" , i); irq_valid = true; }/* Error Handling: TX */ if (isr[i] &ISR_RXFO ) { -dev_err (dev->dev,"RX overrun (ch_id=%d)\n" , i); +dev_err_ratelimited (dev->dev,"RX overrun (ch_id=%d)\n" , i); irq_valid = true; } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 85/225 um: harddog: fix modular build
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit 73a23d7710331a530e972903318528b75e5a5f58 ]
Since we no longer (want to) export any libc symbols the _user portions of any drivers need to be built into image rather than the module. I missed this for the watchdog. Fix the watchdog accordingly.
--- arch/um/drivers/Makefile | 4 +++- arch/um/drivers/harddog.h | 9 +++++++++ arch/um/drivers/harddog_kern.c | 7 +------ arch/um/drivers/harddog_user.c | 1 + arch/um/drivers/harddog_user_exp.c | 9 +++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 arch/um/drivers/harddog.h create mode 100644 arch/um/drivers/harddog_user_exp.c
arch/um/drivers/Makefile +3 -1
@@ -16,7 +16,8 @@ mconsole-objs := mconsole_kern.o mconsole_user.o hostaudio-objs := hostaudio_kern.o ubd-objs := ubd_kern.o ubd_user.o port-objs := port_kern.o port_user.o -harddog-objs := harddog_kern.o harddog_user.o +harddog-objs := harddog_kern.o +harddog-builtin-$(CONFIG_UML_WATCHDOG) := harddog_user.o harddog_user_exp.o rtc-objs := rtc_kern.o rtc_user.o LDFLAGS_pcap.o = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a)
@@ -60,6 +61,7 @@ obj-$(CONFIG_PTY_CHAN) += pty.o obj-$(CONFIG_TTY_CHAN) += tty.o obj-$(CONFIG_XTERM_CHAN) += xterm.o xterm_kern.o obj-$(CONFIG_UML_WATCHDOG) += harddog.o +obj-y += $(harddog-builtin-y) $(harddog-builtin-m) obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o obj-$(CONFIG_UML_RANDOM) += random.o obj-$(CONFIG_VIRTIO_UML) += virtio_uml.o
arch/um/drivers/harddog.h new file +9 -0
@@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef UM_WATCHDOG_H +#define UM_WATCHDOG_H + +int start_watchdog (int *in_fd_ret,int *out_fd_ret,char *sock); +void stop_watchdog (int in_fd,int out_fd); +int ping_watchdog (int fd); + +#endif /* UM_WATCHDOG_H */
arch/um/drivers/harddog_kern.c +1 -6
@@ -47,6 +47,7 @@#include <linux/spinlock.h> #include <linux/uaccess.h> #include "mconsole.h" +#include "harddog.h" MODULE_LICENSE ("GPL" );
@@ -60,8 +61,6 @@ static int harddog_out_fd = -1;* Allow only one person to hold it open */ -extern int start_watchdog (int *in_fd_ret,int *out_fd_ret,char *sock); -static int harddog_open (struct inode *inode,struct file *file) {int err = -EBUSY ;
@@ -92,8 +91,6 @@ static int harddog_open(struct inode *inode, struct file *file)return err; } -extern void stop_watchdog (int in_fd,int out_fd); -static int harddog_release (struct inode *inode,struct file *file) {/*
@@ -112,8 +109,6 @@ static int harddog_release(struct inode *inode, struct file *file)return 0 ; } -extern int ping_watchdog (int fd); -static ssize_t harddog_write (struct file *file,const char __user *data,size_t len,loff_t *ppos) {
arch/um/drivers/harddog_user.c +1 -0
@@ -7,6 +7,7 @@#include <unistd.h> #include <errno.h> #include <os.h> +#include "harddog.h" struct dog_data {int stdin_fd;
arch/um/drivers/harddog_user_exp.c new file +9 -0
@@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/export.h> +#include "harddog.h" + +#if IS_MODULE (CONFIG_UML_WATCHDOG ) +EXPORT_SYMBOL (start_watchdog); +EXPORT_SYMBOL (stop_watchdog); +EXPORT_SYMBOL (ping_watchdog); +#endif
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 86/225 xfrm: Check if_id in inbound policy/secpath match
In reply to Greg Kroah-HartmanFrom: Benedict Wong <[email protected]>
[ Upstream commit 8680407b6f8f5fba59e8f1d63c869abc280f04df ]
This change ensures that if configured in the policy, the if_id set in the policy and secpath states match during the inbound policy check. Without this, there is potential for ambiguity where entries in the secpath differing by only the if_id could be mismatched.
Notably, this is checked in the outbound direction when resolving templates to SAs, but not on the inbound path when matching SAs and policies.
Test: Tested against Android kernel unit tests & CTS
--- net/xfrm/xfrm_policy.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
net/xfrm/xfrm_policy.c +6 -5
@@ -3237,7 +3237,7 @@ xfrm_secpath_reject(int idx, struct sk_buff *skb, const struct flowi *fl)static inline int xfrm_state_ok (const struct xfrm_tmpl *tmpl,const struct xfrm_state *x, -unsigned short family) +unsigned short family,u32 if_id) {if (xfrm_state_kern (x))return tmpl->optional && !xfrm_state_addr_cmp (tmpl, x, tmpl->encap_family);
@@ -3248,7 +3248,8 @@ xfrm_state_ok(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, (tmpl->allalgs || (tmpl->aalgos & (1 <<x->props.aalgo)) || !(xfrm_id_proto_match (tmpl->id.proto,IPSEC_PROTO_ANY ))) && !(x->props.mode !=XFRM_MODE_TRANSPORT && -xfrm_state_addr_cmp (tmpl, x, family)); +xfrm_state_addr_cmp (tmpl, x, family)) && + (if_id ==0 || if_id == x->if_id); }/*
@@ -3260,7 +3261,7 @@ xfrm_state_ok(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x,*/ static inline int xfrm_policy_ok (const struct xfrm_tmpl *tmpl,const struct sec_path *sp,int start, -unsigned short family) +unsigned short family,u32 if_id) {int idx = start;
@@ -3270,7 +3271,7 @@ xfrm_policy_ok(const struct xfrm_tmpl *tmpl, const struct sec_path *sp, int star }else start =-1 ;for (; idx < sp->len; idx++) { -if (xfrm_state_ok (tmpl, sp->xvec[idx], family)) +if (xfrm_state_ok (tmpl, sp->xvec[idx], family, if_id))return ++idx;if (sp->xvec[idx]->props.mode !=XFRM_MODE_TRANSPORT ) {if (start ==-1 )
@@ -3649,7 +3650,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,* are implied between each two transformations. */ for (i = xfrm_nr-1 , k =0 ; i >=0 ; i--) { - k =xfrm_policy_ok (tpp[i], sp, k, family); + k =xfrm_policy_ok (tpp[i], sp, k, family, if_id);if (k <0 ) {if (k <-1 )/* "-2 - errored_index" returned */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 87/225 ASoC: dt-bindings: Adjust #sound-dai-cells on TIs single-DAI codecs
In reply to Greg Kroah-HartmanFrom: Martin Povišer <[email protected]>
[ Upstream commit efb2bfd7b3d210c479b9361c176d7426e5eb8663 ]
A bunch of TI's codecs have binding schemas which force #sound-dai-cells to one despite those codecs only having a single DAI. Allow for bindings with zero DAI cells and deprecate the former non-zero value.
--- Documentation/devicetree/bindings/sound/tas2562.yaml | 6 ++++-- Documentation/devicetree/bindings/sound/tas2770.yaml | 6 ++++-- Documentation/devicetree/bindings/sound/tas27xx.yaml | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-)
Documentation/devicetree/bindings/sound/tas2562.yaml +4 -2
@@ -52,7 +52,9 @@ properties: description: TDM TX current sense time slot. '#sound-dai-cells': - const: 1 + # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward + # compatibility but is deprecated. + enum: [0, 1] required: - compatible
@@ -69,7 +71,7 @@ examples: codec: codec@4c { compatible = "ti,tas2562"; reg = <0x4c>; - #sound-dai-cells = <1>; + #sound-dai-cells = <0>; interrupt-parent = <&gpio1>; interrupts = <14>; shutdown-gpios = <&gpio1 15 0>;
Documentation/devicetree/bindings/sound/tas2770.yaml +4 -2
@@ -54,7 +54,9 @@ properties: - 1 # Falling edge '#sound-dai-cells': - const: 1 + # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward + # compatibility but is deprecated. + enum: [0, 1] required: - compatible
@@ -71,7 +73,7 @@ examples: codec: codec@41 { compatible = "ti,tas2770"; reg = <0x41>; - #sound-dai-cells = <1>; + #sound-dai-cells = <0>; interrupt-parent = <&gpio1>; interrupts = <14>; reset-gpio = <&gpio1 15 0>;
Documentation/devicetree/bindings/sound/tas27xx.yaml +4 -2
@@ -47,7 +47,9 @@ properties: description: TDM TX voltage sense time slot. '#sound-dai-cells': - const: 1 + # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward + # compatibility but is deprecated. + enum: [0, 1] required: - compatible
@@ -64,7 +66,7 @@ examples: codec: codec@38 { compatible = "ti,tas2764"; reg = <0x38>; - #sound-dai-cells = <1>; + #sound-dai-cells = <0>; interrupt-parent = <&gpio1>; interrupts = <14>; reset-gpios = <&gpio1 15 0>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 88/225 ALSA: hda/realtek: Add quirks for ASUS GU604V and GU603V
In reply to Greg Kroah-HartmanFrom: Alexandru Sorodoc <[email protected]>
[ Upstream commit 4b963ae1df6426f0e51de64133d379d9bde50c48 ]
These models use 2 CS35L41 amplifiers using SPI for down-facing speakers.
alc285_fixup_speaker2_to_dac1 is needed to fix volume control of the down-facing speakers.
Pin configs are needed to enable headset mic detection.
Note that these models lack the ACPI _DSD properties needed to initialize the amplifiers. They can be added during boot to get working sound out of the speakers:
https://gist.github.com/lamperez/862763881c0e1c812392b5574727f6ff
--- sound/pci/hda/patch_realtek.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
sound/pci/hda/patch_realtek.c +20 -0
@@ -7063,6 +7063,8 @@ enum {ALC225_FIXUP_DELL1_MIC_NO_PRESENCE ,ALC295_FIXUP_DISABLE_DAC3 ,ALC285_FIXUP_SPEAKER2_TO_DAC1 , +ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1 , +ALC285_FIXUP_ASUS_HEADSET_MIC ,ALC280_FIXUP_HP_HEADSET_MIC ,ALC221_FIXUP_HP_FRONT_MIC , ALC292_FIXUP_TPT460,
@@ -8033,6 +8035,22 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC269_FIXUP_THINKPAD_ACPI }, + [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc285_fixup_speaker2_to_dac1, + .chained = true, + .chain_id =ALC245_FIXUP_CS35L41_SPI_2 + }, + [ALC285_FIXUP_ASUS_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x03a11050 }, + {0x1b ,0x03a11c30 }, + { } + }, + .chained = true, + .chain_id =ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1 + }, [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl []) {
@@ -9507,6 +9525,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x1313 ,"Asus K42JZ" ,ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x1427 ,"Asus Zenbook UX31E" ,ALC269VB_FIXUP_ASUS_ZENBOOK ), +SND_PCI_QUIRK (0x1043 ,0x1473 ,"ASUS GU604V" ,ALC285_FIXUP_ASUS_HEADSET_MIC ), +SND_PCI_QUIRK (0x1043 ,0x1483 ,"ASUS GU603V" ,ALC285_FIXUP_ASUS_HEADSET_MIC ),SND_PCI_QUIRK (0x1043 ,0x1517 ,"Asus Zenbook UX31A" ,ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A ),SND_PCI_QUIRK (0x1043 ,0x1662 ,"ASUS GV301QH" ,ALC294_FIXUP_ASUS_DUAL_SPK ), SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 89/225 ASoC: ssm2602: Add workaround for playback distortions
In reply to Greg Kroah-HartmanFrom: Paweł Anikiel <[email protected]>
[ Upstream commit f63550e2b165208a2f382afcaf5551df9569e1d4 ]
Apply a workaround for what appears to be a hardware quirk.
The problem seems to happen when enabling "whole chip power" (bit D7 register R6) for the very first time after the chip receives power. If either "output" (D4) or "DAC" (D3) aren't powered on at that time, playback becomes very distorted later on.
This happens on the Google Chameleon v3, as well as on a ZYBO Z7-10:
https://ez.analog.com/audio/f/q-a/543726/solved-ssm2603-right-output-offset-issue/480229
I suspect this happens only when using an external MCLK signal (which is the case for both of these boards).
Here are some experiments run on a Google Chameleon v3. These were run in userspace using a wrapper around the i2cset utility:
ssmset() {
i2cset -y 0 0x1a $(($1*2)) $2
}For each of the following sequences, we apply power to the ssm2603 chip, set the configuration registers R0-R5 and R7-R8, run the selected sequence, and check for distortions on playback.
ssmset 0x09 0x01 # core
ssmset 0x06 0x07 # chip, out, dac
OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x87 # out, dac
ssmset 0x06 0x07 # chip
OK
(disable MCLK)
ssmset 0x09 0x01 # core
ssmset 0x06 0x1f # chip
ssmset 0x06 0x07 # out, dac
(enable MCLK)
OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x1f # chip
ssmset 0x06 0x07 # out, dac
NOT OK
ssmset 0x06 0x1f # chip
ssmset 0x09 0x01 # core
ssmset 0x06 0x07 # out, dac
NOT OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x0f # chip, out
ssmset 0x06 0x07 # dac
NOT OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x17 # chip, dac
ssmset 0x06 0x07 # out
NOT OK
For each of the following sequences, we apply power to the ssm2603 chip, run the selected sequence, issue a reset with R15, configure R0-R5 and R7-R8, run one of the NOT OK sequences from above, and check for distortions.
ssmset 0x09 0x01 # core
ssmset 0x06 0x07 # chip, out, dac
OK
(disable MCLK)
ssmset 0x09 0x01 # core
ssmset 0x06 0x07 # chip, out, dac
(enable MCLK after reset)
NOT OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x17 # chip, dac
NOT OK
ssmset 0x09 0x01 # core
ssmset 0x06 0x0f # chip, out
NOT OK
ssmset 0x06 0x07 # chip, out, dac
NOT OK
--- sound/soc/codecs/ssm2602.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
sound/soc/codecs/ssm2602.c +15 -0
@@ -53,6 +53,18 @@ static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = { { .reg = 0x09, .def = 0x0000 } }; +/* +* ssm2602 register patch +* Workaround for playback distortions after power up: activates digital +* core, and then powers on output, DAC, and whole chip at the same time +*/ + +static const struct reg_sequence ssm2602_patch[] = { + {SSM2602_ACTIVE ,0x01 }, + {SSM2602_PWR ,0x07 }, + {SSM2602_RESET ,0x00 }, +}; +/*Appending several "None"s just for OSS mixer use*/ static const char *ssm2602_input_select[] = {
@@ -589,6 +601,9 @@ static int ssm260x_component_probe(struct snd_soc_component *component)return ret; } +regmap_register_patch (ssm2602->regmap, ssm2602_patch, +ARRAY_SIZE (ssm2602_patch)); +/* set the update bits */ regmap_update_bits (ssm2602->regmap,SSM2602_LINVOL ,LINVOL_LRIN_BOTH ,LINVOL_LRIN_BOTH );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 90/225 media: dvb_demux: fix a bug for the continuity counter
In reply to Greg Kroah-HartmanFrom: YongSu Yoo <[email protected]>
[ Upstream commit 7efb10d8dc70ea3000cc70dca53407c52488acd1 ]
In dvb_demux.c, some logics exist which compare the expected continuity counter and the real continuity counter. If they are not matched each other, both of the expected continuity counter and the real continuity counter should be printed. But there exists a bug that the expected continuity counter is not correctly printed. The expected continuity counter is replaced with the real countinuity counter + 1 so that the epected continuity counter is not correclty printed. This is wrong. This bug is fixed.
--- drivers/media/dvb-core/dvb_demux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/dvb-core/dvb_demux.c +2 -2
@@ -115,12 +115,12 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed, cc = buf[3 ] &0x0f ; ccok = ((feed->cc +1 ) &0x0f ) == cc; - feed->cc = cc;if (!ccok) {set_buf_flags (feed,DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED );dprintk_sect_loss ("missed packet: %d instead of %d!\n" , cc, (feed->cc +1 ) &0x0f ); } + feed->cc = cc;if (buf[1 ] &0x40 )// PUSI ? feed->peslen =0xfffa ;
@@ -300,7 +300,6 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, cc = buf[3 ] &0x0f ; ccok = ((feed->cc +1 ) &0x0f ) == cc; - feed->cc = cc;if (buf[3 ] &0x20 ) {/* adaption field present, check for discontinuity_indicator */
@@ -336,6 +335,7 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, feed->pusi_seen = false;dvb_dmx_swfilter_section_new (feed); } + feed->cc = cc;if (buf[1 ] &0x40 ) {/* PUSI=1 (is set), section boundary is here */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 91/225 media: dvb-usb: az6027: fix three null-ptr-deref in az6027_i2c_xfer()
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit 858e97d7956d17a2cb56a9413468704a4d5abfe1 ]
In az6027_i2c_xfer, msg is controlled by user. When msg[i].buf is null, commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()") fix the null-ptr-deref bug when msg[i].addr is 0x99. However, null-ptr-deref also happens when msg[i].addr is 0xd0 and 0xc0. We add check on msg[i].len to prevent null-ptr-deref.
--- drivers/media/usb/dvb-usb/az6027.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/media/usb/dvb-usb/az6027.c +12 -0
@@ -988,6 +988,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n/* write/read request */ if (i +1 < num && (msg[i +1 ].flags &I2C_M_RD )) { req =0xB9 ; +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } index = (((msg[i].buf[0 ] <<8 ) &0xff00 ) | (msg[i].buf[1 ] &0x00ff )); value = msg[i].addr + (msg[i].len <<8 ); length = msg[i +1 ].len +6 ;
@@ -1001,6 +1005,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n/* demod 16bit addr */ req =0xBD ; +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } index = (((msg[i].buf[0 ] <<8 ) &0xff00 ) | (msg[i].buf[1 ] &0x00ff )); value = msg[i].addr + (2 <<8 ); length = msg[i].len -2 ;
@@ -1026,6 +1034,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n }else { req =0xBD ; +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } index = msg[i].buf[0 ] &0x00FF ; value = msg[i].addr + (1 <<8 ); length = msg[i].len -1 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 92/225 media: dvb-usb-v2: ec168: fix null-ptr-deref in ec168_i2c_xfer()
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit a6dcefcc08eca1bf4e3d213c97c3cfb75f377935 ]
In ec168_i2c_xfer, msg is controlled by user. When msg[i].buf is null and msg[i].len is zero, former checks on msg[i].buf would be passed. If accessing msg[i].buf[0] without sanity check, null pointer deref would happen. We add check on msg[i].len to prevent crash.
Similar commit:
commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/usb/dvb-usb-v2/ec168.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/media/usb/dvb-usb-v2/ec168.c +12 -0
@@ -115,6 +115,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],while (i < num) {if (num > i +1 && (msg[i+1 ].flags &I2C_M_RD )) {if (msg[i].addr == ec168_ec100_config.demod_address) { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } req.cmd =READ_DEMOD ; req.value =0 ; req.index =0xff00 + msg[i].buf[0 ];/* reg */
@@ -131,6 +135,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], } }else {if (msg[i].addr == ec168_ec100_config.demod_address) { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } req.cmd =WRITE_DEMOD ; req.value = msg[i].buf[1 ];/* val */ req.index =0xff00 + msg[i].buf[0 ];/* reg */
@@ -139,6 +147,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ret =ec168_ctrl_msg (d, &req); i +=1 ; }else { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } req.cmd =WRITE_I2C ; req.value = msg[i].buf[0 ];/* val */ req.index =0x0100 + msg[i].addr;/* I2C addr */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 93/225 media: dvb-usb-v2: ce6230: fix null-ptr-deref in ce6230_i2c_master_xfer()
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit dff919090155fb22679869e8469168f270dcd97f ]
In ce6230_i2c_master_xfer, msg is controlled by user. When msg[i].buf is null and msg[i].len is zero, former checks on msg[i].buf would be passed. Malicious data finally reach ce6230_i2c_master_xfer. If accessing msg[i].buf[0] without sanity check, null ptr deref would happen. We add check on msg[i].len to prevent crash.
Similar commit:
commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/usb/dvb-usb-v2/ce6230.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/media/usb/dvb-usb-v2/ce6230.c +8 -0
@@ -101,6 +101,10 @@ static int ce6230_i2c_master_xfer(struct i2c_adapter *adap,if (num > i +1 && (msg[i+1 ].flags &I2C_M_RD )) {if (msg[i].addr == ce6230_zl10353_config.demod_address) { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } req.cmd =DEMOD_READ ; req.value = msg[i].addr >>1 ; req.index = msg[i].buf[0 ];
@@ -117,6 +121,10 @@ static int ce6230_i2c_master_xfer(struct i2c_adapter *adap, }else {if (msg[i].addr == ce6230_zl10353_config.demod_address) { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + } req.cmd =DEMOD_WRITE ; req.value = msg[i].addr >>1 ; req.index = msg[i].buf[0 ];
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 94/225 media: dvb-usb-v2: rtl28xxu: fix null-ptr-deref in rtl28xxu_i2c_xfer
In reply to Greg Kroah-HartmanFrom: Zhang Shurong <[email protected]>
[ Upstream commit aa4a447b81b84f69c1a89ad899df157f386d7636 ]
In rtl28xxu_i2c_xfer, msg is controlled by user. When msg[i].buf is null and msg[i].len is zero, former checks on msg[i].buf would be passed. Malicious data finally reach rtl28xxu_i2c_xfer. If accessing msg[i].buf[0] without sanity check, null ptr deref would happen. We add check on msg[i].len to prevent crash.
Similar commit:
commit 0ed554fd769a
("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/usb/dvb-usb-v2/rtl28xxu.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/media/usb/dvb-usb-v2/rtl28xxu.c +20 -0
@@ -176,6 +176,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ret = -EOPNOTSUPP ; goto err_mutex_unlock; }else if (msg[0 ].addr ==0x10 ) { +if (msg[0 ].len <1 || msg[1 ].len <1 ) { + ret = -EOPNOTSUPP ; + goto err_mutex_unlock; + }/* method 1 - integrated demod */ if (msg[0 ].buf[0 ] ==0x00 ) {/* return demod page from driver cache */
@@ -189,6 +193,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ret =rtl28xxu_ctrl_msg (d, &req); } }else if (msg[0 ].len <2 ) { +if (msg[0 ].len <1 ) { + ret = -EOPNOTSUPP ; + goto err_mutex_unlock; + }/* method 2 - old I2C */ req.value = (msg[0 ].buf[0 ] <<8 ) | (msg[0 ].addr <<1 ); req.index =CMD_I2C_RD ;
@@ -217,8 +225,16 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ret = -EOPNOTSUPP ; goto err_mutex_unlock; }else if (msg[0 ].addr ==0x10 ) { +if (msg[0 ].len <1 ) { + ret = -EOPNOTSUPP ; + goto err_mutex_unlock; + }/* method 1 - integrated demod */ if (msg[0 ].buf[0 ] ==0x00 ) { +if (msg[0 ].len <2 ) { + ret = -EOPNOTSUPP ; + goto err_mutex_unlock; + }/* save demod page for later demod access */ dev->page = msg[0 ].buf[1 ]; ret =0 ;
@@ -231,6 +247,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], ret =rtl28xxu_ctrl_msg (d, &req); } }else if ((msg[0 ].len <23 ) && (!dev->new_i2c_write)) { +if (msg[0 ].len <1 ) { + ret = -EOPNOTSUPP ; + goto err_mutex_unlock; + }/* method 2 - old I2C */ req.value = (msg[0 ].buf[0 ] <<8 ) | (msg[0 ].addr <<1 ); req.index =CMD_I2C_WR ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 95/225 media: dvb-usb: digitv: fix null-ptr-deref in digitv_i2c_xfer()
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit 9ded5bd2a49ce3015b7c936743eec0a0e6e11f0c ]
In digitv_i2c_xfer, msg is controlled by user. When msg[i].buf is null and msg[i].len is zero, former checks on msg[i].buf would be passed. Malicious data finally reach digitv_i2c_xfer. If accessing msg[i].buf[0] without sanity check, null ptr deref would happen. We add check on msg[i].len to prevent crash.
Similar commit:
commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/usb/dvb-usb/digitv.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/usb/dvb-usb/digitv.c +4 -0
@@ -63,6 +63,10 @@ static int digitv_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int numwarn ("more than 2 i2c messages at a time is not handled yet. TODO." );for (i =0 ; i < num; i++) { +if (msg[i].len <1 ) { + i = -EOPNOTSUPP ; +break ; + }/* write/read request */ if (i+1 < num && (msg[i+1 ].flags &I2C_M_RD )) { if (digitv_ctrl_msg(d, USB_READ_COFDM, msg[i].buf[0], NULL, 0,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 96/225 media: dvb-usb: dw2102: fix uninit-value in su3000_read_mac_address
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit a3fd1ef27aa686d871cefe207bd6168c4b0cd29e ]
In su3000_read_mac_address, if i2c_transfer fails to execute two messages, array mac address will not be initialized. Without handling such error, later in function dvb_usb_adapter_dvb_init, proposed_mac is accessed before initialization.
Fix this error by returning a negative value if message execution fails.
--- drivers/media/usb/dvb-usb/dw2102.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/dvb-usb/dw2102.c +1 -1
@@ -946,7 +946,7 @@ static int su3000_read_mac_address(struct dvb_usb_device *d, u8 mac[6])for (i =0 ; i <6 ; i++) { obuf[1 ] =0xf0 + i;if (i2c_transfer (&d->i2c_adap, msg,2 ) !=2 ) -break ; +return -1 ;else mac[i] = ibuf[0 ]; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 97/225 media: netup_unidvb: fix irq init by register it at the end of probe
In reply to Greg Kroah-HartmanFrom: Wei Chen <[email protected]>
[ Upstream commit e6ad6233592593079db5c8fa592c298e51bc1356 ]
IRQ handler netup_spi_interrupt() takes spinlock spi->lock. The lock is initialized in netup_spi_init(). However, irq handler is registered before initializing the lock.
Spinlock dma->lock and i2c->lock suffer from the same problem.
Fix this by registering the irq at the end of probe.
--- .../media/pci/netup_unidvb/netup_unidvb_core.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/media/pci/netup_unidvb/netup_unidvb_core.c +9 -8
@@ -887,12 +887,7 @@ static int netup_unidvb_initdev(struct pci_dev *pci_dev, ndev->lmmio0, (u32 )pci_resource_len (pci_dev,0 ), ndev->lmmio1, (u32 )pci_resource_len (pci_dev,1 ), pci_dev->irq); -if (request_irq (pci_dev->irq, netup_unidvb_isr,IRQF_SHARED , -"netup_unidvb" , pci_dev) <0 ) { -dev_err (&pci_dev->dev, -"%s(): can't get IRQ %d\n" , __func__, pci_dev->irq); - goto irq_request_err; - } + ndev->dma_size =2 *188 *NETUP_DMA_BLOCKS_COUNT *NETUP_DMA_PACKETS_COUNT ; ndev->dma_virt = dma_alloc_coherent(&pci_dev->dev,
@@ -933,6 +928,14 @@ static int netup_unidvb_initdev(struct pci_dev *pci_dev,dev_err (&pci_dev->dev,"netup_unidvb: DMA setup failed\n" ); goto dma_setup_err; } + +if (request_irq (pci_dev->irq, netup_unidvb_isr,IRQF_SHARED , +"netup_unidvb" , pci_dev) <0 ) { +dev_err (&pci_dev->dev, +"%s(): can't get IRQ %d\n" , __func__, pci_dev->irq); + goto dma_setup_err; + } +dev_info (&pci_dev->dev,"netup_unidvb: device has been initialized\n" );return 0 ;
@@ -951,8 +954,6 @@ static int netup_unidvb_initdev(struct pci_dev *pci_dev,dma_free_coherent (&pci_dev->dev, ndev->dma_size, ndev->dma_virt, ndev->dma_phys); dma_alloc_err: -free_irq (pci_dev->irq, pci_dev); -irq_request_err:iounmap (ndev->lmmio1); pci_bar1_error:iounmap (ndev->lmmio0);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 98/225 media: dvb_ca_en50221: fix a size write bug
In reply to Greg Kroah-HartmanFrom: YongSu Yoo <[email protected]>
[ Upstream commit a4315e5be7020aac9b24a8151caf4bb85224cd0e ]
The function of "dvb_ca_en50221_write_data" at source/drivers/media /dvb-core/dvb_ca_en50221.c is used for two cases.
The first case is for writing APDU data in the function of "dvb_ca_en50221_io_write" at source/drivers/media/dvb-core/ dvb_ca_en50221.c.
The second case is for writing the host link buf size on the Command Register in the function of "dvb_ca_en50221_link_init" at source/drivers/media/dvb-core/dvb_ca_en50221.c.
In the second case, there exists a bug like following. In the function of the "dvb_ca_en50221_link_init",
after a TV host calculates the host link buf_size,
the TV host writes the calculated host link buf_size on the Size Register.
Accroding to the en50221 Spec (the page 60 of
https://dvb.org/wp-content/uploads/2020/02/En50221.V1.pdf),
before this writing operation, the "SW(CMDREG_SW)" flag in the Command Register should be set. We can see this setting operation in the function of the "dvb_ca_en50221_link_init" like below.
...
if ((ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN | CMDREG_SW)) != 0) return ret;
...
But, after that, the real writing operation is implemented using the function of the "dvb_ca_en50221_write_data" in the function of "dvb_ca_en50221_link_init", and the "dvb_ca_en50221_write_data" includes the function of "ca->pub->write_cam_control", and the function of the "ca->pub->write_cam_control" in the function of the "dvb_ca_en50221_wrte_data" does not include "CMDREG_SW" flag like below.
...
if ((status = ca->pub->write_cam_control(ca->pub, slot,
CTRLIF_COMMAND, IRQEN | CMDREG_HC)) != 0)
...
In the above source code, we can see only the "IRQEN | CMDREG_HC", but we cannot see the "CMDREG_SW".
The "CMDREG_SW" flag which was set in the function of the "dvb_ca_en50221_link_init" was rollbacked by the follwoing function of the "dvb_ca_en50221_write_data".
This is a bug. and this bug causes that the calculated host link buf_size is not properly written in the CI module.
Through this patch, we fix this bug.
--- drivers/media/dvb-core/dvb_ca_en50221.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/media/dvb-core/dvb_ca_en50221.c +7 -5
@@ -187,7 +187,7 @@ static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);static int dvb_ca_en50221_read_data (struct dvb_ca_private *ca,int slot,u8 *ebuf,int ecount);static int dvb_ca_en50221_write_data (struct dvb_ca_private *ca,int slot, -u8 *ebuf,int ecount); +u8 *ebuf,int ecount,int size_write_flag);/** * findstr - Safely find needle in haystack.
@@ -370,7 +370,7 @@ static int dvb_ca_en50221_link_init(struct dvb_ca_private *ca, int slot) ret =dvb_ca_en50221_wait_if_status (ca, slot,STATUSREG_FR ,HZ /10 );if (ret)return ret; - ret =dvb_ca_en50221_write_data (ca, slot, buf,2 ); + ret =dvb_ca_en50221_write_data (ca, slot, buf,2 ,CMDREG_SW );if (ret !=2 )return -EIO ; ret = ca->pub->write_cam_control (ca->pub, slot,CTRLIF_COMMAND ,IRQEN );
@@ -778,11 +778,13 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot,* @buf: The data in this buffer is treated as a complete link-level packet to * be written. * @bytes_write: Size of ebuf. +* @size_write_flag: A flag on Command Register which says whether the link size +* information will be writen or not. * * return: Number of bytes written, or < 0 on error. */ static int dvb_ca_en50221_write_data (struct dvb_ca_private *ca,int slot, -u8 *buf,int bytes_write) +u8 *buf,int bytes_write,int size_write_flag) {struct dvb_ca_slot *sl = &ca->slot_info[slot];int status;
@@ -817,7 +819,7 @@ static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,/* OK, set HC bit */ status = ca->pub->write_cam_control (ca->pub, slot,CTRLIF_COMMAND , -IRQEN |CMDREG_HC ); +IRQEN |CMDREG_HC | size_write_flag);if (status) goto exit;
@@ -1508,7 +1510,7 @@ static ssize_t dvb_ca_en50221_io_write(struct file *file,mutex_lock (&sl->slot_lock); status =dvb_ca_en50221_write_data (ca, slot, fragbuf, - fraglen +2 ); + fraglen +2 ,0 );mutex_unlock (&sl->slot_lock);if (status == (fraglen +2 )) { written =1 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 99/225 media: ttusb-dec: fix memory leak in ttusb_dec_exit_dvb()
In reply to Greg Kroah-HartmanFrom: Hyunwoo Kim <[email protected]>
[ Upstream commit 517a281338322ff8293f988771c98aaa7205e457 ]
Since dvb_frontend_detach() is not called in ttusb_dec_exit_dvb(), which is called when the device is disconnected, dvb_frontend_free() is not finally called.
This causes a memory leak just by repeatedly plugging and unplugging the device.
Fix this issue by adding dvb_frontend_detach() to ttusb_dec_exit_dvb().
--- drivers/media/usb/ttusb-dec/ttusb_dec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/media/usb/ttusb-dec/ttusb_dec.c +1 -2
@@ -1544,8 +1544,7 @@ static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)dvb_dmx_release (&dec->demux);if (dec->fe) {dvb_unregister_frontend (dec->fe); -if (dec->fe->ops.release) - dec->fe->ops.release (dec->fe); +dvb_frontend_detach (dec->fe); }dvb_unregister_adapter (&dec->adapter); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 100/225 media: mn88443x: fix !CONFIG_OF error by drop of_match_ptr from ID table
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit ae11c0efaec32fb45130ee9886689f467232eebc ]
The driver will match mostly by DT table (even thought there is regular ID table) so there is little benefit in of_match_ptr (this also allows ACPI matching via PRP0001, even though it might not be relevant here). This also fixes !CONFIG_OF error:
drivers/media/dvb-frontends/mn88443x.c:782:34: error: ‘mn88443x_of_match’ defined but not used [-Werror=unused-const-variable=]
--- drivers/media/dvb-frontends/mn88443x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/dvb-frontends/mn88443x.c +1 -1
@@ -798,7 +798,7 @@ MODULE_DEVICE_TABLE(i2c, mn88443x_i2c_id);static struct i2c_driver mn88443x_driver = { .driver = { .name ="mn88443x" , - .of_match_table =of_match_ptr (mn88443x_of_match), + .of_match_table = mn88443x_of_match, }, .probe = mn88443x_probe, .remove = mn88443x_remove,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 101/225 media: dvb-core: Fix use-after-free due on race condition at dvb_net
In reply to Greg Kroah-HartmanFrom: Hyunwoo Kim <[email protected]>
[ Upstream commit 4172385b0c9ac366dcab78eda48c26814b87ed1a ]
A race condition may occur between the .disconnect function, which is called when the device is disconnected, and the dvb_device_open() function, which is called when the device node is open()ed. This results in several types of UAFs.
The root cause of this is that you use the dvb_device_open() function, which does not implement a conditional statement
that checks 'dvbnet->exit'.
So, add 'remove_mutex` to protect 'dvbnet->exit' and use locked_dvb_net_open() function to check 'dvbnet->exit'.
[mchehab: fix a checkpatch warning]
--- drivers/media/dvb-core/dvb_net.c | 38 +++++++++++++++++++++++++++++--- include/media/dvb_net.h | 4 ++++ 2 files changed, 39 insertions(+), 3 deletions(-)
drivers/media/dvb-core/dvb_net.c +35 -3
@@ -1564,15 +1564,43 @@ static long dvb_net_ioctl(struct file *file,return dvb_usercopy (file, cmd, arg, dvb_net_do_ioctl); } +static int locked_dvb_net_open (struct inode *inode,struct file *file) +{ +struct dvb_device *dvbdev = file->private_data; +struct dvb_net *dvbnet = dvbdev->priv; +int ret; + +if (mutex_lock_interruptible (&dvbnet->remove_mutex)) +return -ERESTARTSYS ; + +if (dvbnet->exit) { +mutex_unlock (&dvbnet->remove_mutex); +return -ENODEV ; + } + + ret =dvb_generic_open (inode, file); + +mutex_unlock (&dvbnet->remove_mutex); + +return ret; +} +static int dvb_net_close (struct inode *inode,struct file *file) {struct dvb_device *dvbdev = file->private_data;struct dvb_net *dvbnet = dvbdev->priv; +mutex_lock (&dvbnet->remove_mutex); +dvb_generic_release (inode, file); -if (dvbdev->users ==1 && dvbnet->exit ==1 ) +if (dvbdev->users ==1 && dvbnet->exit ==1 ) { +mutex_unlock (&dvbnet->remove_mutex);wake_up (&dvbdev->wait_queue); + }else { +mutex_unlock (&dvbnet->remove_mutex); + } +return 0 ; }
@@ -1580,7 +1608,7 @@ static int dvb_net_close(struct inode *inode, struct file *file)static const struct file_operations dvb_net_fops = { .owner =THIS_MODULE , .unlocked_ioctl = dvb_net_ioctl, - .open = dvb_generic_open, + .open = locked_dvb_net_open, .release = dvb_net_close, .llseek = noop_llseek, };
@@ -1599,10 +1627,13 @@ void dvb_net_release (struct dvb_net *dvbnet) {int i; +mutex_lock (&dvbnet->remove_mutex); dvbnet->exit =1 ; +mutex_unlock (&dvbnet->remove_mutex); +if (dvbnet->dvbdev->users <1 )wait_event (dvbnet->dvbdev->wait_queue, - dvbnet->dvbdev->users==1 ); + dvbnet->dvbdev->users ==1 );dvb_unregister_device (dvbnet->dvbdev);
@@ -1621,6 +1652,7 @@ int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,int i;mutex_init (&dvbnet->ioctl_mutex); +mutex_init (&dvbnet->remove_mutex); dvbnet->demux = dmx;for (i=0 ; i<DVB_NET_DEVICES_MAX ; i++)
include/media/dvb_net.h +4 -0
@@ -41,6 +41,9 @@* @exit: flag to indicate when the device is being removed. * @demux: pointer to &struct dmx_demux. * @ioctl_mutex: protect access to this struct. +* @remove_mutex: mutex that avoids a race condition between a callback +* called when the hardware is disconnected and the +* file_operations of dvb_net. * * Currently, the core supports up to %DVB_NET_DEVICES_MAX (10) network * devices.
@@ -53,6 +56,7 @@ struct dvb_net { unsigned int exit:1;struct dmx_demux *demux;struct mutex ioctl_mutex; +struct mutex remove_mutex; };/**
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 102/225 media: dvb-core: Fix use-after-free due to race at dvb_register_device()
In reply to Greg Kroah-HartmanFrom: Hyunwoo Kim <[email protected]>
[ Upstream commit 627bb528b086b4136315c25d6a447a98ea9448d3 ]
dvb_register_device() dynamically allocates fops with kmemdup() to set the fops->owner.
And these fops are registered in 'file->f_ops' using replace_fops() in the dvb_device_open() process, and kfree()d in dvb_free_device().
However, it is not common to use dynamically allocated fops instead of 'static const' fops as an argument of replace_fops(), and UAF may occur.
These UAFs can occur on any dvb type using dvb_register_device(), such as dvb_dvr, dvb_demux, dvb_frontend, dvb_net, etc.
So, instead of kfree() the fops dynamically allocated in dvb_register_device() in dvb_free_device() called during the .disconnect() process, kfree() it collectively in exit_dvbdev() called when the dvbdev.c module is removed.
--- drivers/media/dvb-core/dvbdev.c | 84 ++++++++++++++++++++++++--------- include/media/dvbdev.h | 15 ++++++ 2 files changed, 78 insertions(+), 21 deletions(-)
drivers/media/dvb-core/dvbdev.c +63 -21
@@ -27,6 +27,7 @@#include <media/tuner.h> static DEFINE_MUTEX (dvbdev_mutex); +static LIST_HEAD (dvbdevfops_list);static int dvbdev_debug;module_param (dvbdev_debug, int,0644 );
@@ -452,14 +453,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, enum dvb_device_type type, int demux_sink_pads) {struct dvb_device *dvbdev; -struct file_operations *dvbdevfops; +struct file_operations *dvbdevfops =NULL ; +struct dvbdevfops_node *node =NULL , *new_node =NULL ;struct device *clsdev;int minor;int id, ret;mutex_lock (&dvbdev_register_lock); -if ((id =dvbdev_get_free_id (adap, type)) <0 ){ +if ((id =dvbdev_get_free_id (adap, type)) <0 ) {mutex_unlock (&dvbdev_register_lock); *pdvbdev =NULL ;pr_err ("%s: couldn't find free device id\n" , __func__);
@@ -467,18 +469,45 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, } *pdvbdev = dvbdev =kzalloc (sizeof (*dvbdev),GFP_KERNEL ); -if (!dvbdev){mutex_unlock (&dvbdev_register_lock);return -ENOMEM ; } - dvbdevfops =kmemdup (template->fops,sizeof (*dvbdevfops),GFP_KERNEL ); +/* +* When a device of the same type is probe()d more than once, +* the first allocated fops are used. This prevents memory leaks +* that can occur when the same device is probe()d repeatedly. +*/ +list_for_each_entry (node, &dvbdevfops_list, list_head) { +if (node->fops->owner == adap->module && + node->type == type && + node->template == template) { + dvbdevfops = node->fops; +break ; + } + } -if (!dvbdevfops){ -kfree (dvbdev); -mutex_unlock (&dvbdev_register_lock); -return -ENOMEM ; +if (dvbdevfops ==NULL ) { + dvbdevfops =kmemdup (template->fops,sizeof (*dvbdevfops),GFP_KERNEL ); +if (!dvbdevfops) { +kfree (dvbdev); +mutex_unlock (&dvbdev_register_lock); +return -ENOMEM ; + } + + new_node =kzalloc (sizeof (struct dvbdevfops_node ),GFP_KERNEL ); +if (!new_node) { +kfree (dvbdevfops); +kfree (dvbdev); +mutex_unlock (&dvbdev_register_lock); +return -ENOMEM ; + } + + new_node->fops = dvbdevfops; + new_node->type = type; + new_node->template = template; +list_add_tail (&new_node->list_head, &dvbdevfops_list); }memcpy (dvbdev, template,sizeof (struct dvb_device ));
@@ -489,20 +518,20 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, dvbdev->priv = priv; dvbdev->fops = dvbdevfops;init_waitqueue_head (&dvbdev->wait_queue); - dvbdevfops->owner = adap->module; -list_add_tail (&dvbdev->list_head, &adap->device_list); -down_write (&minor_rwsem);#ifdef CONFIG_DVB_DYNAMIC_MINORS for (minor =0 ; minor <MAX_DVB_MINORS ; minor++)if (dvb_minors[minor] ==NULL )break ; -if (minor ==MAX_DVB_MINORS ) { +if (new_node) { +list_del (&new_node->list_head); +kfree (dvbdevfops); +kfree (new_node); + }list_del (&dvbdev->list_head); -kfree (dvbdevfops);kfree (dvbdev);up_write (&minor_rwsem);mutex_unlock (&dvbdev_register_lock);
@@ -511,41 +540,47 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,#else minor =nums2minor (adap->num, type, id);#endif - dvbdev->minor = minor; dvb_minors[minor] =dvb_device_get (dvbdev);up_write (&minor_rwsem); - ret =dvb_register_media_device (dvbdev, type, minor, demux_sink_pads);if (ret) {pr_err ("%s: dvb_register_media_device failed to create the mediagraph\n" , __func__); - +if (new_node) { +list_del (&new_node->list_head); +kfree (dvbdevfops); +kfree (new_node); + }dvb_media_device_free (dvbdev);list_del (&dvbdev->list_head); -kfree (dvbdevfops);kfree (dvbdev);mutex_unlock (&dvbdev_register_lock);return ret; } -mutex_unlock (&dvbdev_register_lock); - clsdev =device_create (dvb_class, adap->device,MKDEV (DVB_MAJOR , minor), dvbdev,"dvb%d.%s%d" , adap->num, dnames[type], id);if (IS_ERR (clsdev)) {pr_err ("%s: failed to create device dvb%d.%s%d (%ld)\n" , __func__, adap->num, dnames[type], id,PTR_ERR (clsdev)); +if (new_node) { +list_del (&new_node->list_head); +kfree (dvbdevfops); +kfree (new_node); + }dvb_media_device_free (dvbdev);list_del (&dvbdev->list_head); -kfree (dvbdevfops);kfree (dvbdev); +mutex_unlock (&dvbdev_register_lock);return PTR_ERR (clsdev); } +dprintk ("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n" , adap->num, dnames[type], id, minor, minor); +mutex_unlock (&dvbdev_register_lock);return 0 ; }EXPORT_SYMBOL (dvb_register_device);
@@ -574,7 +609,6 @@ static void dvb_free_device(struct kref *ref) { struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref); -kfree (dvbdev->fops);kfree (dvbdev); }
@@ -1080,9 +1114,17 @@ static int __init init_dvbdev(void) static void __exit exit_dvbdev(void) { +struct dvbdevfops_node *node, *next; +class_destroy (dvb_class);cdev_del (&dvb_device_cdev);unregister_chrdev_region (MKDEV (DVB_MAJOR ,0 ),MAX_DVB_MINORS ); + +list_for_each_entry_safe (node, next, &dvbdevfops_list, list_head) { +list_del (&node->list_head); +kfree (node->fops); +kfree (node); + } }subsys_initcall (init_dvbdev);
include/media/dvbdev.h +15 -0
@@ -189,6 +189,21 @@ struct dvb_device {void *priv; }; +/** +* struct dvbdevfops_node - fops nodes registered in dvbdevfops_list +* +* @fops: Dynamically allocated fops for ->owner registration +* @type: type of dvb_device +* @template: dvb_device used for registration +* @list_head: list_head for dvbdevfops_list +*/ +struct dvbdevfops_node { +struct file_operations *fops; +enum dvb_device_type type; +const struct dvb_device *template; +struct list_head list_head; +}; +/** * dvb_device_get - Increase dvb_device reference *
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 103/225 media: dvb-core: Fix kernel WARNING for blocking operation in wait_event*()
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit b8c75e4a1b325ea0a9433fa8834be97b5836b946 ]
Using a semaphore in the wait_event*() condition is no good idea. It hits a kernel WARN_ON() at prepare_to_wait_event() like:
do not call blocking ops when !TASK_RUNNING; state=1 set at prepare_to_wait_event+0x6d/0x690
For avoiding the potential deadlock, rewrite to an open-coded loop instead. Unlike the loop in wait_event*(), this uses wait_woken() after the condition check, hence the task state stays consistent.
CVE-2023-31084 was assigned to this bug.
--- drivers/media/dvb-core/dvb_frontend.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/media/dvb-core/dvb_frontend.c +12 -4
@@ -293,14 +293,22 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe, }if (events->eventw == events->eventr) { -int ret; +struct wait_queue_entry wait; +int ret =0 ;if (flags &O_NONBLOCK )return -EWOULDBLOCK ; - ret =wait_event_interruptible (events->wait_queue, -dvb_frontend_test_event (fepriv, events)); - +init_waitqueue_entry (&wait, current); +add_wait_queue (&events->wait_queue, &wait); +while (!dvb_frontend_test_event (fepriv, events)) { +wait_woken (&wait,TASK_INTERRUPTIBLE ,0 ); +if (signal_pending (current)) { + ret = -ERESTARTSYS ; +break ; + } + } +remove_wait_queue (&events->wait_queue, &wait);if (ret <0 )return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 104/225 media: dvb-core: Fix use-after-free due to race condition at dvb_ca_en50221
In reply to Greg Kroah-HartmanFrom: Hyunwoo Kim <[email protected]>
[ Upstream commit 280a8ab81733da8bc442253c700a52c4c0886ffd ]
If the device node of dvb_ca_en50221 is open() and the device is disconnected, a UAF may occur when calling close() on the device node.
The root cause is that wake_up() and wait_event() for dvbdev->wait_queue are not implemented.
So implement wait_event() function in dvb_ca_en50221_release() and add 'remove_mutex' which prevents race condition for 'ca->exit'.
[mchehab: fix a checkpatch warning]
--- drivers/media/dvb-core/dvb_ca_en50221.c | 37 ++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-)
drivers/media/dvb-core/dvb_ca_en50221.c +36 -1
@@ -151,6 +151,12 @@ struct dvb_ca_private {/* mutex serializing ioctls */ struct mutex ioctl_mutex; + +/* A mutex used when a device is disconnected */ +struct mutex remove_mutex; + +/* Whether the device is disconnected */ +int exit; };static void dvb_ca_private_free (struct dvb_ca_private *ca)
@@ -1711,12 +1717,22 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)dprintk ("%s\n" , __func__); -if (!try_module_get (ca->pub->owner)) +mutex_lock (&ca->remove_mutex); + +if (ca->exit) { +mutex_unlock (&ca->remove_mutex); +return -ENODEV ; + } + +if (!try_module_get (ca->pub->owner)) { +mutex_unlock (&ca->remove_mutex);return -EIO ; + } err =dvb_generic_open (inode, file);if (err <0 ) {module_put (ca->pub->owner); +mutex_unlock (&ca->remove_mutex);return err; }
@@ -1741,6 +1757,7 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)dvb_ca_private_get (ca); +mutex_unlock (&ca->remove_mutex);return 0 ; }
@@ -1760,6 +1777,8 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)dprintk ("%s\n" , __func__); +mutex_lock (&ca->remove_mutex); +/* mark the CA device as closed */ ca->open =0 ;dvb_ca_en50221_thread_update_delay (ca);
@@ -1770,6 +1789,13 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)dvb_ca_private_put (ca); +if (dvbdev->users ==1 && ca->exit ==1 ) { +mutex_unlock (&ca->remove_mutex); +wake_up (&dvbdev->wait_queue); + }else { +mutex_unlock (&ca->remove_mutex); + } +return err; }
@@ -1893,6 +1919,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter, }mutex_init (&ca->ioctl_mutex); +mutex_init (&ca->remove_mutex);if (signal_pending (current)) { ret = -EINTR ;
@@ -1935,6 +1962,14 @@ void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)dprintk ("%s\n" , __func__); +mutex_lock (&ca->remove_mutex); + ca->exit =1 ; +mutex_unlock (&ca->remove_mutex); + +if (ca->dvbdev->users <1 ) +wait_event (ca->dvbdev->wait_queue, + ca->dvbdev->users ==1 ); +/* shutdown the thread if there was one */ kthread_stop (ca->thread);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 105/225 ASoC: SOF: debug: conditionally bump runtime_pm counter on exceptions
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 3de975862f985f1c9e225a0d13aa3d501373f7c3 ]
When a firmware IPC error happens during a pm_runtime suspend, we ignore the error and suspend anyways. However, the code unconditionally increases the runtime_pm counter. This results in a confusing configuration where the code will suspend, resume but never suspend again due to the use of pm_runtime_get_noresume().
The intent of the counter increase was to prevent entry in D3, but if that transition to D3 is already started it cannot be stopped. In addition, there's no point in that case in trying to prevent anything, the firmware error is handled and the next resume will re-initialize the firmware completely.
This patch changes the logic to prevent suspend when the device is pm_runtime active and has a use_count > 0.
--- sound/soc/sof/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/sof/debug.c +2 -2
@@ -437,8 +437,8 @@ void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev, const char *msg)/* should we prevent DSP entering D3 ? */ if (!sdev->ipc_dump_printed)dev_info (sdev->dev, -"preventing DSP entering D3 state to preserve context\n" ); -pm_runtime_get_noresume (sdev->dev); +"Attempting to prevent DSP from entering D3 state to preserve context\n" ); +pm_runtime_get_if_in_use (sdev->dev); }/* dump vital information to the logs */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 106/225 ASoC: SOF: pcm: fix pm_runtime imbalance in error handling
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit da0fe8fd515a471d373acc3682bfb5522cca4d55 ]
When an error occurs, we need to make sure the device can pm_runtime suspend instead of keeping it active.
--- sound/soc/sof/pcm.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
sound/soc/sof/pcm.c +6 -5
@@ -619,16 +619,17 @@ static int sof_pcm_probe(struct snd_soc_component *component)"%s/%s" , plat_data->tplg_filename_prefix, plat_data->tplg_filename); -if (!tplg_filename) -return -ENOMEM ; +if (!tplg_filename) { + ret = -ENOMEM ; + goto pm_error; + } ret =snd_sof_load_topology (component, tplg_filename); -if (ret <0 ) { +if (ret <0 )dev_err (component->dev,"error: failed to load DSP topology %d\n" , ret); -return ret; - } +pm_error:pm_runtime_mark_last_busy (component->dev);pm_runtime_put_autosuspend (component->dev);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 107/225 ASoC: SOF: sof-client-probes: fix pm_runtime imbalance in error handling
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit bc424273c74c1565c459c8f2a6ed95caee368d0a ]
When an error occurs, we need to make sure the device can pm_runtime suspend instead of keeping it active.
--- sound/soc/sof/sof-client-probes.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
sound/soc/sof/sof-client-probes.c +8 -6
@@ -441,12 +441,7 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to, ret =sof_probes_points_info (cdev, &desc, &num_desc);if (ret <0 ) - goto exit; - -pm_runtime_mark_last_busy (dev); - err =pm_runtime_put_autosuspend (dev); -if (err <0 ) -dev_err_ratelimited (dev,"debugfs read failed to idle %d\n" , err); + goto pm_error;for (i =0 ; i < num_desc; i++) { offset =strlen (buf);
@@ -464,6 +459,13 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to, ret =simple_read_from_buffer (to, count, ppos, buf,strlen (buf));kfree (desc); + +pm_error: +pm_runtime_mark_last_busy (dev); + err =pm_runtime_put_autosuspend (dev); +if (err <0 ) +dev_err_ratelimited (dev,"debugfs read failed to idle %d\n" , err); + exit:kfree (buf);return ret;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 108/225 ASoC: SOF: pm: save io region state in case of errors in resume
In reply to Greg Kroah-HartmanFrom: Kai Vehmanen <[email protected]>
[ Upstream commit 171b53be635ac15d4feafeb33946035649b1ca14 ]
If there are failures in DSP runtime resume, the device state will not reach active and this makes it impossible e.g. to retrieve a possible DSP panic dump via "exception" debugfs node. If CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE=y is set, the data in cache is stale. If debugfs cache is not used, the region simply cannot be read.
To allow debugging these scenarios, update the debugfs cache contents in resume error handler. User-space can then later retrieve DSP panic and other state via debugfs (requires SOF debugfs cache to be enabled in build).
--- sound/soc/sof/pm.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
sound/soc/sof/pm.c +13 -1
@@ -159,7 +159,7 @@ static int sof_resume(struct device *dev, bool runtime_resume) ret = tplg_ops->set_up_all_pipelines (sdev, false);if (ret <0 ) {dev_err (sdev->dev,"Failed to restore pipeline after resume %d\n" , ret); -return ret; + goto setup_fail; } }
@@ -173,6 +173,18 @@ static int sof_resume(struct device *dev, bool runtime_resume)dev_err (sdev->dev,"ctx_restore IPC error during resume: %d\n" , ret); } +setup_fail: +#if IS_ENABLED (CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE ) +if (ret <0 ) { +/* +* Debugfs cannot be read in runtime suspend, so cache +* the contents upon failure. This allows to capture +* possible DSP coredump information. +*/ +sof_cache_debugfs (sdev); + } +#endif +return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 109/225 s390/pkey: zeroize key blobs
In reply to Greg Kroah-HartmanFrom: Holger Dengler <[email protected]>
[ Upstream commit 844cf829e5f33e00b279230470c8c93b58b8c16f ]
Key blobs for the IOCTLs PKEY_KBLOB2PROTK[23] may contain clear key material. Zeroize the copies of these keys in kernel memory after creating the protected key.
--- drivers/s390/crypto/pkey_api.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/s390/crypto/pkey_api.c +3 -0
@@ -1293,6 +1293,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,return PTR_ERR (kkey); rc =pkey_keyblob2pkey (kkey, ktp.keylen, &ktp.protkey);DEBUG_DBG ("%s pkey_keyblob2pkey()=%d\n" , __func__, rc); +memzero_explicit (kkey, ktp.keylen);kfree (kkey);if (rc)break ;
@@ -1426,6 +1427,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd, kkey, ktp.keylen, &ktp.protkey);DEBUG_DBG ("%s pkey_keyblob2pkey2()=%d\n" , __func__, rc);kfree (apqns); +memzero_explicit (kkey, ktp.keylen);kfree (kkey);if (rc)break ;
@@ -1552,6 +1554,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd, protkey, &protkeylen);DEBUG_DBG ("%s pkey_keyblob2pkey3()=%d\n" , __func__, rc);kfree (apqns); +memzero_explicit (kkey, ktp.keylen);kfree (kkey);if (rc) {kfree (protkey);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 110/225 s390/topology: honour nr_cpu_ids when adding CPUs
In reply to Greg Kroah-HartmanFrom: Alexander Gordeev <[email protected]>
[ Upstream commit a33239be2d38ff5a44427db1707c08787508d34a ]
When SMT thread CPUs are added to CPU masks the nr_cpu_ids limit is not checked and could be exceeded. This leads to a warning for example if CONFIG_DEBUG_PER_CPU_MAPS is set and the command line parameter nr_cpus is set to 1.
--- arch/s390/kernel/topology.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-)
arch/s390/kernel/topology.c +17 -15
@@ -95,7 +95,7 @@ static void cpu_group_map(cpumask_t *dst, struct mask_info *info, unsigned int cstatic void cpu_thread_map (cpumask_t *dst,unsigned int cpu) {static cpumask_t mask; -int i; +unsigned int max_cpu;cpumask_clear (&mask);if (!cpumask_test_cpu (cpu, &cpu_setup_mask))
@@ -104,9 +104,10 @@ static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)if (topology_mode !=TOPOLOGY_MODE_HW ) goto out; cpu -= cpu % (smp_cpu_mtid +1 ); -for (i =0 ; i <= smp_cpu_mtid; i++) { -if (cpumask_test_cpu (cpu + i, &cpu_setup_mask)) -cpumask_set_cpu (cpu + i, &mask); + max_cpu =min (cpu + smp_cpu_mtid, nr_cpu_ids -1 ); +for (; cpu <= max_cpu; cpu++) { +if (cpumask_test_cpu (cpu, &cpu_setup_mask)) +cpumask_set_cpu (cpu, &mask); } out:cpumask_copy (dst, &mask);
@@ -123,25 +124,26 @@ static void add_cpus_to_mask(struct topology_core *tl_core,unsigned int core;for_each_set_bit (core, &tl_core->mask,TOPOLOGY_CORE_BITS ) { -unsigned int rcore; -int lcpu, i; +unsigned int max_cpu, rcore; +int cpu; rcore =TOPOLOGY_CORE_BITS -1 - core + tl_core->origin; - lcpu =smp_find_processor_id (rcore << smp_cpu_mt_shift); -if (lcpu <0 ) + cpu =smp_find_processor_id (rcore << smp_cpu_mt_shift); +if (cpu <0 )continue ; -for (i =0 ; i <= smp_cpu_mtid; i++) { - topo = &cpu_topology[lcpu + i]; + max_cpu =min (cpu + smp_cpu_mtid, nr_cpu_ids -1 ); +for (; cpu <= max_cpu; cpu++) { + topo = &cpu_topology[cpu]; topo->drawer_id = drawer->id; topo->book_id = book->id; topo->socket_id = socket->id; topo->core_id = rcore; - topo->thread_id = lcpu + i; + topo->thread_id = cpu; topo->dedicated = tl_core->d; -cpumask_set_cpu (lcpu + i, &drawer->mask); -cpumask_set_cpu (lcpu + i, &book->mask); -cpumask_set_cpu (lcpu + i, &socket->mask); -smp_cpu_set_polarization (lcpu + i, tl_core->pp); +cpumask_set_cpu (cpu, &drawer->mask); +cpumask_set_cpu (cpu, &book->mask); +cpumask_set_cpu (cpu, &socket->mask); +smp_cpu_set_polarization (cpu, tl_core->pp); } } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 111/225 ACPI: resource: Add IRQ override quirk for LG UltraPC 17U70P
In reply to Greg Kroah-HartmanFrom: Rubén Gómez <[email protected]>
[ Upstream commit 71a485624c4cbb144169852d7bb8ca8c0667d7a3 ]
Add an ACPI IRQ override quirk for LG UltraPC 17U70P to address the internal keyboard problem on it.
--- drivers/acpi/resource.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/acpi/resource.c +12 -0
@@ -502,6 +502,17 @@ static const struct dmi_system_id maingear_laptop[] = { { } }; +static const struct dmi_system_id lg_laptop[] = { + { + .ident ="LG Electronics 17U70P" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LG Electronics" ), +DMI_MATCH (DMI_BOARD_NAME ,"17U70P" ), + }, + }, + { } +}; +struct irq_override_cmp {const struct dmi_system_id *system;unsigned char irq;
@@ -518,6 +529,7 @@ static const struct irq_override_cmp override_table[] = { { lenovo_laptop, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true }, { tongfang_gm_rg, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true }, { maingear_laptop, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true }, + { lg_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false }, }; static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 112/225 wifi: rtl8xxxu: fix authentication timeout due to incorrect RCR value
In reply to Greg Kroah-HartmanFrom: Yun Lu <[email protected]>
[ Upstream commit 20429444e653ee8242dfbf815c0c37866beb371b ]
When using rtl8192cu with rtl8xxxu driver to connect wifi, there is a probability of failure, which shows "authentication with ... timed out". Through debugging, it was found that the RCR register has been inexplicably modified to an incorrect value, resulting in the nic not being able to receive authenticated frames.
To fix this problem, add regrcr in rtl8xxxu_priv struct, and store the RCR value every time the register is written, and use it the next time the register need to be modified.
--- drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 + drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h +1 -0
@@ -1346,6 +1346,7 @@ struct rtl8xxxu_priv {u32 rege9c;u32 regeb4;u32 regebc; +u32 regrcr;int next_mbox;int nr_out_eps;
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +3 -1
@@ -4049,6 +4049,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)RCR_ACCEPT_MGMT_FRAME |RCR_HTC_LOC_CTRL |RCR_APPEND_PHYSTAT |RCR_APPEND_ICV |RCR_APPEND_MIC ;rtl8xxxu_write32 (priv,REG_RCR , val32); + priv->regrcr = val32;/* * Accept all multicast
@@ -6058,7 +6059,7 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw, unsigned int *total_flags, u64 multicast) {struct rtl8xxxu_priv *priv = hw->priv; -u32 rcr =rtl8xxxu_read32 (priv,REG_RCR ); +u32 rcr = priv->regrcr;dev_dbg (&priv->udev->dev,"%s: changed_flags %08x, total_flags %08x\n" , __func__, changed_flags, *total_flags);
@@ -6104,6 +6105,7 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,*/ rtl8xxxu_write32 (priv,REG_RCR , rcr); + priv->regrcr = rcr; *total_flags &= (FIF_ALLMULTI | FIF_FCSFAIL | FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL | FIF_OTHER_BSS | FIF_PSPOLL |
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 113/225 ARM: dts: stm32: add pin map for CAN controller on stm32f7
In reply to Greg Kroah-HartmanFrom: Dario Binacchi <[email protected]>
[ Upstream commit 011644249686f2675e142519cd59e81e04cfc231 ]
Add pin configurations for using CAN controller on stm32f7.
--- arch/arm/boot/dts/stm32f7-pinctrl.dtsi | 82 ++++++++++++++++++++++++++ 1 file changed, 82 insertions(+)
arch/arm/boot/dts/stm32f7-pinctrl.dtsi +82 -0
@@ -284,6 +284,88 @@ slew-rate = <2>; }; }; + + can1_pins_a: can1-0 { + pins1 { + pinmux = <STM32_PINMUX('A', 12, AF9)>; /* CAN1_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('A', 11, AF9)>; /* CAN1_RX */ + bias-pull-up; + }; + }; + + can1_pins_b: can1-1 { + pins1 { + pinmux = <STM32_PINMUX('B', 9, AF9)>; /* CAN1_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('B', 8, AF9)>; /* CAN1_RX */ + bias-pull-up; + }; + }; + + can1_pins_c: can1-2 { + pins1 { + pinmux = <STM32_PINMUX('D', 1, AF9)>; /* CAN1_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('D', 0, AF9)>; /* CAN1_RX */ + bias-pull-up; + + }; + }; + + can1_pins_d: can1-3 { + pins1 { + pinmux = <STM32_PINMUX('H', 13, AF9)>; /* CAN1_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('H', 14, AF9)>; /* CAN1_RX */ + bias-pull-up; + + }; + }; + + can2_pins_a: can2-0 { + pins1 { + pinmux = <STM32_PINMUX('B', 6, AF9)>; /* CAN2_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('B', 5, AF9)>; /* CAN2_RX */ + bias-pull-up; + }; + }; + + can2_pins_b: can2-1 { + pins1 { + pinmux = <STM32_PINMUX('B', 13, AF9)>; /* CAN2_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('B', 12, AF9)>; /* CAN2_RX */ + bias-pull-up; + }; + }; + + can3_pins_a: can3-0 { + pins1 { + pinmux = <STM32_PINMUX('A', 15, AF11)>; /* CAN3_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('A', 8, AF11)>; /* CAN3_RX */ + bias-pull-up; + }; + }; + + can3_pins_b: can3-1 { + pins1 { + pinmux = <STM32_PINMUX('B', 4, AF11)>; /* CAN3_TX */ + }; + pins2 { + pinmux = <STM32_PINMUX('B', 3, AF11)>; /* CAN3_RX */ + bias-pull-up; + }; + }; }; }; };
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 114/225 arm64/mm: mark private VM_FAULT_X defines as vm_fault_t
In reply to Greg Kroah-HartmanFrom: Min-Hua Chen <[email protected]>
[ Upstream commit d91d580878064b880f3574ac35b98d8b70ee8620 ]
This patch fixes several sparse warnings for fault.c:
arch/arm64/mm/fault.c:493:24: sparse: warning: incorrect type in return expression (different base types)arch/arm64/mm/fault.c:493:24: sparse: expected restricted vm_fault_tarch/arm64/mm/fault.c:493:24: sparse: got intarch/arm64/mm/fault.c:501:32: sparse: warning: incorrect type in return expression (different base types)arch/arm64/mm/fault.c:501:32: sparse: expected restricted vm_fault_tarch/arm64/mm/fault.c:501:32: sparse: got intarch/arm64/mm/fault.c:503:32: sparse: warning: incorrect type in return expression (different base types)arch/arm64/mm/fault.c:503:32: sparse: expected restricted vm_fault_tarch/arm64/mm/fault.c:503:32: sparse: got intarch/arm64/mm/fault.c:511:24: sparse: warning: incorrect type in return expression (different base types)arch/arm64/mm/fault.c:511:24: sparse: expected restricted vm_fault_tarch/arm64/mm/fault.c:511:24: sparse: got intarch/arm64/mm/fault.c:670:13: sparse: warning: restricted vm_fault_t degrades to integer arch/arm64/mm/fault.c:670:13: sparse: warning: restricted vm_fault_t degrades to integer arch/arm64/mm/fault.c:713:39: sparse: warning: restricted vm_fault_t degrades to integer
--- arch/arm64/mm/fault.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/mm/fault.c +2 -2
@@ -480,8 +480,8 @@ static void do_bad_area(unsigned long far, unsigned long esr, } } -#define VM_FAULT_BADMAP 0x010000 -#define VM_FAULT_BADACCESS 0x020000 +#define VM_FAULT_BADMAP ((__force vm_fault_t)0x010000) +#define VM_FAULT_BADACCESS ((__force vm_fault_t)0x020000) static vm_fault_t __do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int mm_flags, unsigned long vm_flags,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 115/225 arm64: vdso: Pass (void *) to virt_to_page()
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit b0abde80620f42d1ceb3de5e4c1a49cdd5628229 ]
Like the other calls in this function virt_to_page() expects a pointer, not an integer.
However since many architectures implement virt_to_pfn() as a macro, this function becomes polymorphic and accepts both a (unsigned long) and a (void *).
Fix this up with an explicit cast.
--- arch/arm64/kernel/vdso.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/vdso.c +1 -1
@@ -312,7 +312,7 @@ static int aarch32_alloc_kuser_vdso_page(void)memcpy ((void *)(vdso_page +0x1000 - kuser_sz), __kuser_helper_start, kuser_sz); - aarch32_vectors_page =virt_to_page (vdso_page); + aarch32_vectors_page =virt_to_page ((void *)vdso_page);return 0 ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 116/225 wifi: mac80211: simplify chanctx allocation
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit 860e1b43da94551cd1e73adc36b3c64cc3e5dc01 ]
There's no need to call ieee80211_recalc_chanctx_min_def() since it cannot and won't call the driver anyway; just use _ieee80211_recalc_chanctx_min_def() instead.
--- net/mac80211/chan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/mac80211/chan.c +1 -1
@@ -638,7 +638,7 @@ ieee80211_alloc_chanctx(struct ieee80211_local *local, ctx->conf.rx_chains_dynamic =1 ; ctx->mode = mode; ctx->conf.radar_enabled = false; -ieee80211_recalc_chanctx_min_def (local, ctx); +_ieee80211_recalc_chanctx_min_def (local, ctx);return ctx; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 117/225 wifi: mac80211: consider reserved chanctx for mindef
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit b72a455a2409fd94d6d9b4eb51d659a88213243b ]
When a chanctx is reserved for a new vif and we recalculate the minimal definition for it, we need to consider the new interface it's being reserved for before we assign it, so it can be used directly with the correct min channel width.
Fix the code to - optionally - consider that, and use that option just before doing the reassignment.
Also, when considering channel context reservations, we should only consider the one link we're currently working with. Change the boolean argument to a link pointer to do that.
--- net/mac80211/chan.c | 72 +++++++++++++++++++++++--------------- net/mac80211/ieee80211_i.h | 3 +- net/mac80211/util.c | 2 +- 3 files changed, 47 insertions(+), 30 deletions(-)
net/mac80211/chan.c +44 -28
@@ -258,7 +258,8 @@ ieee80211_get_max_required_bw(struct ieee80211_sub_if_data *sdata,static enum nl80211_chan_width ieee80211_get_chanctx_vif_max_required_bw (struct ieee80211_sub_if_data *sdata, -struct ieee80211_chanctx_conf *conf) +struct ieee80211_chanctx *ctx, +struct ieee80211_link_data *rsvd_for) {enum nl80211_chan_width max_bw =NL80211_CHAN_WIDTH_20_NOHT ;struct ieee80211_vif *vif = &sdata->vif;
@@ -267,13 +268,14 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,rcu_read_lock ();for (link_id =0 ; link_id <ARRAY_SIZE (sdata->link); link_id++) {enum nl80211_chan_width width =NL80211_CHAN_WIDTH_20_NOHT ; -struct ieee80211_bss_conf *link_conf = -rcu_dereference (sdata->vif.link_conf[link_id]); +struct ieee80211_link_data *link = +rcu_dereference (sdata->link[link_id]); -if (!link_conf) +if (!link)continue ; -if (rcu_access_pointer (link_conf->chanctx_conf) != conf) +if (link != rsvd_for && +rcu_access_pointer (link->conf->chanctx_conf) != &ctx->conf)continue ;switch (vif->type) {
@@ -287,7 +289,7 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,* point, so take the width from the chandef, but * account also for TDLS peers */ - width =max (link_conf->chandef.width, + width =max (link->conf->chandef.width,ieee80211_get_max_required_bw (sdata, link_id));break ;case NL80211_IFTYPE_P2P_DEVICE :
@@ -296,7 +298,7 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,case NL80211_IFTYPE_ADHOC :case NL80211_IFTYPE_MESH_POINT :case NL80211_IFTYPE_OCB : - width = link_conf->chandef.width; + width = link->conf->chandef.width;break ;case NL80211_IFTYPE_WDS :case NL80211_IFTYPE_UNSPECIFIED :
@@ -316,7 +318,8 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,static enum nl80211_chan_width ieee80211_get_chanctx_max_required_bw (struct ieee80211_local *local, -struct ieee80211_chanctx_conf *conf) +struct ieee80211_chanctx *ctx, +struct ieee80211_link_data *rsvd_for) {struct ieee80211_sub_if_data *sdata;enum nl80211_chan_width max_bw =NL80211_CHAN_WIDTH_20_NOHT ;
@@ -328,7 +331,8 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,if (!ieee80211_sdata_running (sdata))continue ; - width =ieee80211_get_chanctx_vif_max_required_bw (sdata, conf); + width =ieee80211_get_chanctx_vif_max_required_bw (sdata, ctx, + rsvd_for); max_bw =max (max_bw, width); }
@@ -336,8 +340,8 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,/* use the configured bandwidth in case of monitor interface */ sdata =rcu_dereference (local->monitor_sdata);if (sdata && -rcu_access_pointer (sdata->vif.bss_conf.chanctx_conf) == conf) - max_bw =max (max_bw, conf->def.width); +rcu_access_pointer (sdata->vif.bss_conf.chanctx_conf) == &ctx->conf) + max_bw =max (max_bw, ctx->conf.def.width);rcu_read_unlock ();
@@ -349,8 +353,10 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,* the max of min required widths of all the interfaces bound to this * channel context. */ -static u32 _ieee80211_recalc_chanctx_min_def (struct ieee80211_local *local, -struct ieee80211_chanctx *ctx) +static u32 +_ieee80211_recalc_chanctx_min_def (struct ieee80211_local *local, +struct ieee80211_chanctx *ctx, +struct ieee80211_link_data *rsvd_for) {enum nl80211_chan_width max_bw;struct cfg80211_chan_def min_def;
@@ -370,7 +376,7 @@ static u32 _ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,return 0 ; } - max_bw =ieee80211_get_chanctx_max_required_bw (local, &ctx->conf); + max_bw =ieee80211_get_chanctx_max_required_bw (local, ctx, rsvd_for);/* downgrade chandef up to max_bw */ min_def = ctx->conf.def;
@@ -448,9 +454,10 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local,* channel context. */ void ieee80211_recalc_chanctx_min_def (struct ieee80211_local *local, -struct ieee80211_chanctx *ctx) +struct ieee80211_chanctx *ctx, +struct ieee80211_link_data *rsvd_for) { -u32 changed =_ieee80211_recalc_chanctx_min_def (local, ctx); +u32 changed =_ieee80211_recalc_chanctx_min_def (local, ctx, rsvd_for);if (!changed)return ;
@@ -464,10 +471,11 @@ void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,ieee80211_chan_bw_change (local, ctx, false); } -static void ieee80211_change_chanctx (struct ieee80211_local *local, -struct ieee80211_chanctx *ctx, -struct ieee80211_chanctx *old_ctx, -const struct cfg80211_chan_def *chandef) +static void _ieee80211_change_chanctx (struct ieee80211_local *local, +struct ieee80211_chanctx *ctx, +struct ieee80211_chanctx *old_ctx, +const struct cfg80211_chan_def *chandef, +struct ieee80211_link_data *rsvd_for) {u32 changed;
@@ -492,7 +500,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,ieee80211_chan_bw_change (local, old_ctx, true);if (cfg80211_chandef_identical (&ctx->conf.def, chandef)) { -ieee80211_recalc_chanctx_min_def (local, ctx); +ieee80211_recalc_chanctx_min_def (local, ctx, rsvd_for);return ; }
@@ -502,7 +510,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,/* check if min chanctx also changed */ changed =IEEE80211_CHANCTX_CHANGE_WIDTH | -_ieee80211_recalc_chanctx_min_def (local, ctx); +_ieee80211_recalc_chanctx_min_def (local, ctx, rsvd_for);drv_change_chanctx (local, ctx, changed);if (!local->use_chanctx) {
@@ -514,6 +522,14 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,ieee80211_chan_bw_change (local, old_ctx, false); } +static void ieee80211_change_chanctx (struct ieee80211_local *local, +struct ieee80211_chanctx *ctx, +struct ieee80211_chanctx *old_ctx, +const struct cfg80211_chan_def *chandef) +{ +_ieee80211_change_chanctx (local, ctx, old_ctx, chandef,NULL ); +} +static struct ieee80211_chanctx * ieee80211_find_chanctx(struct ieee80211_local *local, const struct cfg80211_chan_def *chandef,
@@ -638,7 +654,7 @@ ieee80211_alloc_chanctx(struct ieee80211_local *local, ctx->conf.rx_chains_dynamic =1 ; ctx->mode = mode; ctx->conf.radar_enabled = false; -_ieee80211_recalc_chanctx_min_def (local, ctx); +_ieee80211_recalc_chanctx_min_def (local, ctx,NULL );return ctx; }
@@ -873,12 +889,12 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,ieee80211_recalc_chanctx_chantype (local, curr_ctx);ieee80211_recalc_smps_chanctx (local, curr_ctx);ieee80211_recalc_radar_chanctx (local, curr_ctx); -ieee80211_recalc_chanctx_min_def (local, curr_ctx); +ieee80211_recalc_chanctx_min_def (local, curr_ctx,NULL ); }if (new_ctx &&ieee80211_chanctx_num_assigned (local, new_ctx) >0 ) {ieee80211_recalc_txpower (sdata, false); -ieee80211_recalc_chanctx_min_def (local, new_ctx); +ieee80211_recalc_chanctx_min_def (local, new_ctx,NULL ); } if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
@@ -1270,7 +1286,7 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)ieee80211_link_update_chandef (link, &link->reserved_chandef); -ieee80211_change_chanctx (local, new_ctx, old_ctx, chandef); +_ieee80211_change_chanctx (local, new_ctx, old_ctx, chandef, link); vif_chsw[0 ].vif = &sdata->vif; vif_chsw[0 ].old_ctx = &old_ctx->conf;
@@ -1300,7 +1316,7 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)if (ieee80211_chanctx_refcount (local, old_ctx) ==0 )ieee80211_free_chanctx (local, old_ctx); -ieee80211_recalc_chanctx_min_def (local, new_ctx); +ieee80211_recalc_chanctx_min_def (local, new_ctx,NULL );ieee80211_recalc_smps_chanctx (local, new_ctx);ieee80211_recalc_radar_chanctx (local, new_ctx);
@@ -1665,7 +1681,7 @@ static int ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)ieee80211_recalc_chanctx_chantype (local, ctx);ieee80211_recalc_smps_chanctx (local, ctx);ieee80211_recalc_radar_chanctx (local, ctx); -ieee80211_recalc_chanctx_min_def (local, ctx); +ieee80211_recalc_chanctx_min_def (local, ctx,NULL );list_for_each_entry_safe (link, link_tmp, &ctx->reserved_links, reserved_chanctx_list) {
net/mac80211/ieee80211_i.h +2 -1
@@ -2475,7 +2475,8 @@ int ieee80211_chanctx_refcount(struct ieee80211_local *local,void ieee80211_recalc_smps_chanctx (struct ieee80211_local *local,struct ieee80211_chanctx *chanctx);void ieee80211_recalc_chanctx_min_def (struct ieee80211_local *local, -struct ieee80211_chanctx *ctx); +struct ieee80211_chanctx *ctx, +struct ieee80211_link_data *rsvd_for);bool ieee80211_is_radar_required (struct ieee80211_local *local);void ieee80211_dfs_cac_timer (unsigned long data);
net/mac80211/util.c +1 -1
@@ -2899,7 +2899,7 @@ void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata, chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf); -ieee80211_recalc_chanctx_min_def (local, chanctx); +ieee80211_recalc_chanctx_min_def (local, chanctx,NULL ); } unlock:mutex_unlock (&local->chanctx_mtx);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 118/225 wifi: mac80211: recalc chanctx mindef before assigning
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit 04312de4ced4b152749614e8179f3978a20a992f ]
When we allocate a new channel context, or find an existing one that is compatible, we currently assign it to a link before its mindef is updated. This leads to strange situations, especially in link switching where you switch to an 80 MHz link and expect it to be active immediately, but the mindef is still configured to 20 MHz while assigning. Also, it's strange that the chandef passed to the assign method's argument is wider than the one in the context.
Fix this by calculating the mindef with the new link considered before calling the driver.
In particular, this fixes an iwlwifi problem during link switch where the firmware would assert because the (link) station that was added for the AP is configured to transmit at a bandwidth that's wider than the channel context that it's configured on.
--- net/mac80211/chan.c | 3 +++ 1 file changed, 3 insertions(+)
net/mac80211/chan.c +3 -0
@@ -871,6 +871,9 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, }if (new_ctx) { +/* recalc considering the link we'll use it for now */ +ieee80211_recalc_chanctx_min_def (local, new_ctx, link); + ret =drv_assign_vif_chanctx (local, sdata, link->conf, new_ctx);if (ret) goto out;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 119/225 wifi: iwlwifi: mvm: Add locking to the rate read flow
In reply to Greg Kroah-HartmanFrom: Ariel Malamud <[email protected]>
[ Upstream commit a8938bc881d2a03f9b77f19fae924fe798a01285 ]
The rs_drv_get_rate flow reads the lq_sta to return the optimal rate for tx frames. This read flow is not protected thereby leaving a small window, a few instructions wide, open to contention by an asynchronous rate update. Indeed this race condition was hit and the update occurred in the middle of the read.
Fix this by locking the lq_sta struct during read.
--- drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/intel/iwlwifi/mvm/rs.c +3 -0
@@ -2692,6 +2692,8 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,return ; lq_sta = mvm_sta; + +spin_lock (&lq_sta->pers.lock);iwl_mvm_hwrate_to_tx_rate_v1 (lq_sta->last_rate_n_flags, info->band, &info->control.rates[0 ]); info->control.rates[0 ].count =1 ;
@@ -2706,6 +2708,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,iwl_mvm_hwrate_to_tx_rate_v1 (last_ucode_rate, info->band, &txrc->reported_rate); } +spin_unlock (&lq_sta->pers.lock); } static void *rs_drv_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 120/225 scsi: core: Decrease scsi_devices iorequest_cnt if dispatch failed
In reply to Greg Kroah-HartmanFrom: Wenchao Hao <[email protected]>
[ Upstream commit 09e797c8641f6ad435c33ae24c223351197ea29a ]
If scsi_dispatch_cmd() failed, the SCSI command was not sent to the target, scsi_queue_rq() would return BLK_STS_RESOURCE and the related request would be requeued. The timeout of this request would not fire, no one would increase iodone_cnt.
The above flow would result the iodone_cnt smaller than iorequest_cnt. So decrease the iorequest_cnt if dispatch failed to workaround the issue.
--- drivers/scsi/scsi_lib.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/scsi_lib.c +2 -0
@@ -1491,6 +1491,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)*/ SCSI_LOG_MLQUEUE (3 ,scmd_printk (KERN_INFO , cmd,"queuecommand : device blocked\n" )); +atomic_dec (&cmd->device->iorequest_cnt);return SCSI_MLQUEUE_DEVICE_BUSY ; }
@@ -1523,6 +1524,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)trace_scsi_dispatch_cmd_start (cmd); rtn = host->hostt->queuecommand (host, cmd);if (rtn) { +atomic_dec (&cmd->device->iorequest_cnt);trace_scsi_dispatch_cmd_error (cmd, rtn);if (rtn !=SCSI_MLQUEUE_DEVICE_BUSY && rtn !=SCSI_MLQUEUE_TARGET_BUSY )
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 121/225 wifi: b43: fix incorrect __packed annotation
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 212457ccbd60dba34f965e4ffbe62f0e4f970538 ]
clang warns about an unpacked structure inside of a packed one:
drivers/net/wireless/broadcom/b43/b43.h:654:4: error: field data within 'struct b43_iv' is less aligned than 'union (unnamed union at /home/arnd/arm-soc/drivers/net/wireless/broadcom/b43/b43.h:651:2)' and is usually due to 'struct b43_iv' being packed, which can lead to unaligned accesses [-Werror,-Wunaligned-access]
The problem here is that the anonymous union has the default alignment from its members, apparently because the original author mixed up the placement of the __packed attribute by placing it next to the struct member rather than the union definition. As the struct itself is also marked as __packed, there is no need to mark its members, so just move the annotation to the inner type instead.
As Michael noted, the same problem is present in b43legacy, so change both at the same time.
--- drivers/net/wireless/broadcom/b43/b43.h | 2 +- drivers/net/wireless/broadcom/b43legacy/b43legacy.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/broadcom/b43/b43.h +1 -1
@@ -651,7 +651,7 @@ struct b43_iv {union {__be16 d16;__be32 d32; - } data __packed; + } __packed data; } __packed;
drivers/net/wireless/broadcom/b43legacy/b43legacy.h +1 -1
@@ -379,7 +379,7 @@ struct b43legacy_iv {union {__be16 d16;__be32 d32; - } data __packed; + } __packed data; } __packed;#define B43legacy_PHYMODE (phytype) (1 << (phytype))
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 122/225 net: wwan: t7xx: Ensure init is completed before system sleep
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit ab87603b251134441a67385ecc9d3371be17b7a7 ]
When the system attempts to sleep while mtk_t7xx is not ready, the driver cannot put the device to sleep:
[ 12.472918] mtk_t7xx 0000:57:00.0: [PM] Exiting suspend, modem in invalid state [ 12.472936] mtk_t7xx 0000:57:00.0: PM: pci_pm_suspend(): t7xx_pci_pm_suspend+0x0/0x20 [mtk_t7xx] returns -14 [ 12.473678] mtk_t7xx 0000:57:00.0: PM: dpm_run_callback(): pci_pm_suspend+0x0/0x1b0 returns -14 [ 12.473711] mtk_t7xx 0000:57:00.0: PM: failed to suspend async: error -14 [ 12.764776] PM: Some devices failed to suspend, or early wake event detected
Mediatek confirmed the device can take a rather long time to complete its initialization, so wait for up to 20 seconds until init is done.
--- drivers/net/wwan/t7xx/t7xx_pci.c | 18 ++++++++++++++++++ drivers/net/wwan/t7xx/t7xx_pci.h | 1 + 2 files changed, 19 insertions(+)
drivers/net/wwan/t7xx/t7xx_pci.c +18 -0
@@ -45,6 +45,7 @@#define T7XX_PCI_IREG_BASE 0#define T7XX_PCI_EREG_BASE 2 +#define T7XX_INIT_TIMEOUT 20#define PM_SLEEP_DIS_TIMEOUT_MS 20#define PM_ACK_TIMEOUT_MS 1500#define PM_AUTOSUSPEND_MS 20000
@@ -96,6 +97,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)spin_lock_init (&t7xx_dev->md_pm_lock);init_completion (&t7xx_dev->sleep_lock_acquire);init_completion (&t7xx_dev->pm_sr_ack); +init_completion (&t7xx_dev->init_done);atomic_set (&t7xx_dev->md_pm_state,MTK_PM_INIT );device_init_wakeup (&pdev->dev, true);
@@ -124,6 +126,7 @@ void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_dev)pm_runtime_mark_last_busy (&t7xx_dev->pdev->dev);pm_runtime_allow (&t7xx_dev->pdev->dev);pm_runtime_put_noidle (&t7xx_dev->pdev->dev); +complete_all (&t7xx_dev->init_done); }static int t7xx_pci_pm_reinit (struct t7xx_pci_dev *t7xx_dev)
@@ -529,6 +532,20 @@ static void t7xx_pci_shutdown(struct pci_dev *pdev)__t7xx_pci_pm_suspend (pdev); } +static int t7xx_pci_pm_prepare (struct device *dev) +{ +struct pci_dev *pdev =to_pci_dev (dev); +struct t7xx_pci_dev *t7xx_dev; + + t7xx_dev =pci_get_drvdata (pdev); +if (!wait_for_completion_timeout (&t7xx_dev->init_done,T7XX_INIT_TIMEOUT *HZ )) { +dev_warn (dev,"Not ready for system sleep.\n" ); +return -ETIMEDOUT ; + } + +return 0 ; +} +static int t7xx_pci_pm_suspend (struct device *dev) {return __t7xx_pci_pm_suspend (to_pci_dev (dev));
@@ -555,6 +572,7 @@ static int t7xx_pci_pm_runtime_resume(struct device *dev) }static const struct dev_pm_ops t7xx_pci_pm_ops = { + .prepare = t7xx_pci_pm_prepare, .suspend = t7xx_pci_pm_suspend, .resume = t7xx_pci_pm_resume, .resume_noirq = t7xx_pci_pm_resume_noirq,
drivers/net/wwan/t7xx/t7xx_pci.h +1 -0
@@ -69,6 +69,7 @@ struct t7xx_pci_dev {struct t7xx_modem *md;struct t7xx_ccmni_ctrl *ccmni_ctlb;bool rgu_pci_irq_en; +struct completion init_done;/* Low Power Items */ struct list_head md_pm_entities;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 123/225 netfilter: conntrack: define variables exp_nat_nla_policy and any_addr with CONFIG_NF_NAT
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 224a876e37543eee111bf9b6aa4935080e619335 ]
gcc with W=1 and ! CONFIG_NF_NAT net/netfilter/nf_conntrack_netlink.c:3463:32: error:
‘exp_nat_nla_policy’ defined but not used [-Werror=unused-const-variable=]
3463 | static const struct nla_policy exp_nat_nla_policy[CTA_EXPECT_NAT_MAX+1] = {
| ^~~~~~~~~~~~~~~~~~net/netfilter/nf_conntrack_netlink.c:2979:33: error:
‘any_addr’ defined but not used [-Werror=unused-const-variable=]
2979 | static const union nf_inet_addr any_addr;
| ^~~~~~~~
These variables use is controlled by CONFIG_NF_NAT, so should their definitions.
--- net/netfilter/nf_conntrack_netlink.c | 4 ++++ 1 file changed, 4 insertions(+)
net/netfilter/nf_conntrack_netlink.c +4 -0
@@ -2976,7 +2976,9 @@ static int ctnetlink_exp_dump_mask(struct sk_buff *skb,return -1 ; } +#if IS_ENABLED (CONFIG_NF_NAT )static const union nf_inet_addr any_addr; +#endif static __be32 nf_expect_get_id (const struct nf_conntrack_expect *exp) {
@@ -3460,10 +3462,12 @@ ctnetlink_change_expect(struct nf_conntrack_expect *x,return 0 ; } +#if IS_ENABLED (CONFIG_NF_NAT )static const struct nla_policy exp_nat_nla_policy[CTA_EXPECT_NAT_MAX +1 ] = { [CTA_EXPECT_NAT_DIR ] = { .type =NLA_U32 }, [CTA_EXPECT_NAT_TUPLE ] = { .type =NLA_NESTED }, }; +#endif static int ctnetlink_parse_expect_nat(const struct nlattr *attr,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 124/225 nvme-multipath: dont call blk_mark_disk_dead in nvme_mpath_remove_disk
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 1743e5f6000901a11f4e1cd741bfa9136f3ec9b1 ]
nvme_mpath_remove_disk is called after del_gendisk, at which point a blk_mark_disk_dead call doesn't make any sense.
--- drivers/nvme/host/multipath.c | 1 - 1 file changed, 1 deletion(-)
drivers/nvme/host/multipath.c +0 -1
@@ -858,7 +858,6 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head) {if (!head->disk)return ; -blk_mark_disk_dead (head->disk);/* make sure all pending bios are cleaned up */ kblockd_schedule_work (&head->requeue_work);flush_work (&head->requeue_work);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 125/225 nvme: do not let the user delete a ctrl before a complete initialization
In reply to Greg Kroah-HartmanFrom: Maurizio Lombardi <[email protected]>
[ Upstream commit 2eb94dd56a4a4e3fe286def3e2ba207804a37345 ]
If a userspace application performes a "delete_controller" command early during the ctrl initialization, the delete operation may race against the init code and the kernel will crash.
nvme nvme5: Connect command failed: host path error nvme nvme5: failed to connect queue: 0 ret=880
PF: supervisor write access in kernel mode
PF: error_code(0x0002) - not-present page
blk_mq_quiesce_queue+0x18/0x90 nvme_tcp_delete_ctrl+0x24/0x40 [nvme_tcp] nvme_do_delete_ctrl+0x7f/0x8b [nvme_core] nvme_sysfs_delete.cold+0x8/0xd [nvme_core] kernfs_fop_write_iter+0x124/0x1b0 new_sync_write+0xff/0x190 vfs_write+0x1ef/0x280
Fix the crash by checking the NVME_CTRL_STARTED_ONCE bit; if it's not set it means that the nvme controller is still in the process of getting initialized and the kernel will return an -EBUSY error to userspace.
Set the NVME_CTRL_STARTED_ONCE later in the nvme_start_ctrl() function, after the controller start operation is completed.
--- drivers/nvme/host/core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +5 -1
@@ -3540,6 +3540,9 @@ static ssize_t nvme_sysfs_delete(struct device *dev, {struct nvme_ctrl *ctrl =dev_get_drvdata (dev); +if (!test_bit (NVME_CTRL_STARTED_ONCE , &ctrl->flags)) +return -EBUSY ; +if (device_remove_file_self (dev, attr))nvme_delete_ctrl_sync (ctrl);return count;
@@ -4980,7 +4983,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)* that were missed. We identify persistent discovery controllers by * checking that they started once before, hence are reconnecting back. */ -if (test_and_set_bit (NVME_CTRL_STARTED_ONCE , &ctrl->flags) && +if (test_bit (NVME_CTRL_STARTED_ONCE , &ctrl->flags) &&nvme_discovery_ctrl (ctrl))nvme_change_uevent (ctrl,"NVME_EVENT=rediscover" );
@@ -4991,6 +4994,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl) }nvme_change_uevent (ctrl,"NVME_EVENT=connected" ); +set_bit (NVME_CTRL_STARTED_ONCE , &ctrl->flags); }EXPORT_SYMBOL_GPL (nvme_start_ctrl);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 126/225 ALSA: oss: avoid missing-prototype warnings
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 040b5a046a9e18098580d3ccd029e2318fca7859 ]
Two functions are defined and used in pcm_oss.c but also optionally used from io.c, with an optional prototype. If CONFIG_SND_PCM_OSS_PLUGINS is disabled, this causes a warning as the functions are not static and have no prototype:
sound/core/oss/pcm_oss.c:1235:19: error: no previous prototype for 'snd_pcm_oss_write3' [-Werror=missing-prototypes] sound/core/oss/pcm_oss.c:1266:19: error: no previous prototype for 'snd_pcm_oss_read3' [-Werror=missing-prototypes]
Avoid this by making the prototypes unconditional.
--- sound/core/oss/pcm_plugin.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
sound/core/oss/pcm_plugin.h +8 -8
@@ -141,6 +141,14 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_channel,void *snd_pcm_plug_buf_alloc (struct snd_pcm_substream *plug,snd_pcm_uframes_t size);void snd_pcm_plug_buf_unlock (struct snd_pcm_substream *plug,void *ptr); +#else + +static inline snd_pcm_sframes_t snd_pcm_plug_client_size (struct snd_pcm_substream *handle,snd_pcm_uframes_t drv_size) {return drv_size; } +static inline snd_pcm_sframes_t snd_pcm_plug_slave_size (struct snd_pcm_substream *handle,snd_pcm_uframes_t clt_size) {return clt_size; } +static inline int snd_pcm_plug_slave_format (int format,const struct snd_mask *format_mask) {return format; } + +#endif +snd_pcm_sframes_t snd_pcm_oss_write3 (struct snd_pcm_substream *substream,const char *ptr,snd_pcm_uframes_t size,int in_kernel);
@@ -151,14 +159,6 @@ snd_pcm_sframes_t snd_pcm_oss_writev3(struct snd_pcm_substream *substream,snd_pcm_sframes_t snd_pcm_oss_readv3 (struct snd_pcm_substream *substream,void **bufs,snd_pcm_uframes_t frames); -#else - -static inline snd_pcm_sframes_t snd_pcm_plug_client_size (struct snd_pcm_substream *handle,snd_pcm_uframes_t drv_size) {return drv_size; } -static inline snd_pcm_sframes_t snd_pcm_plug_slave_size (struct snd_pcm_substream *handle,snd_pcm_uframes_t clt_size) {return clt_size; } -static inline int snd_pcm_plug_slave_format (int format,const struct snd_mask *format_mask) {return format; } - -#endif -#ifdef PLUGIN_DEBUG #define pdprintf(fmt, args...) printk(KERN_DEBUG "plugin: " fmt, ##args)#else
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 127/225 drm/msm: Be more shouty if per-process pgtables arent working
In reply to Greg Kroah-HartmanFrom: Rob Clark <[email protected]>
[ Upstream commit 5c054db54c43a5fcb5cc81012361f5e3fac37637 ]
Otherwise it is not always obvious if a dt or iommu change is causing us to fall back to global pgtable.
Patchwork: https://patchwork.freedesktop.org/patch/537359/
--- drivers/gpu/drm/msm/msm_iommu.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_iommu.c +6 -1
@@ -227,7 +227,12 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)/* Get the pagetable configuration from the domain */ if (adreno_smmu->cookie) ttbr1_cfg = adreno_smmu->get_ttbr1_cfg (adreno_smmu->cookie); -if (!ttbr1_cfg) + +/* +* If you hit this WARN_ONCE() you are probably missing an entry in +* qcom_smmu_impl_of_match[] in arm-smmu-qcom.c +*/ +if (WARN_ONCE (!ttbr1_cfg,"No per-process page tables" ))return ERR_PTR (-ENODEV );/*
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 128/225 atm: hide unused procfs functions
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit fb1b7be9b16c1f4626969ba4e95a97da2a452b41 ]
When CONFIG_PROC_FS is disabled, the function declarations for some procfs functions are hidden, but the definitions are still build, as shown by this compiler warning:
net/atm/resources.c:403:7: error: no previous prototype for 'atm_dev_seq_start' [-Werror=missing-prototypes] net/atm/resources.c:409:6: error: no previous prototype for 'atm_dev_seq_stop' [-Werror=missing-prototypes] net/atm/resources.c:414:7: error: no previous prototype for 'atm_dev_seq_next' [-Werror=missing-prototypes]
Add another #ifdef to leave these out of the build.
--- net/atm/resources.c | 2 ++ 1 file changed, 2 insertions(+)
net/atm/resources.c +2 -0
@@ -400,6 +400,7 @@ int atm_dev_ioctl(unsigned int cmd, void __user *buf, int __user *sioc_len,return error; } +#ifdef CONFIG_PROC_FS void *atm_dev_seq_start (struct seq_file *seq,loff_t *pos) {mutex_lock (&atm_dev_mutex);
@@ -415,3 +416,4 @@ void *atm_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) {return seq_list_next (v, &atm_devs, pos); } +#endif
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 129/225 ceph: silence smatch warning in reconnect_caps_cb()
In reply to Greg Kroah-HartmanFrom: Xiubo Li <[email protected]>
[ Upstream commit 9aaa7eb018661b2da221362d9bacb096bd596f52 ]
Smatch static checker warning:
fs/ceph/mds_client.c:3968 reconnect_caps_cb()
warn: missing error code here? '__get_cap_for_mds()' failed. 'err' = '0'
[ idryomov: Dan says that Smatch considers it intentional only if the
"ret = 0;" assignment is within 4 or 5 lines of the goto. ]
--- fs/ceph/mds_client.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/ceph/mds_client.c +2 -1
@@ -3938,7 +3938,7 @@ static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)struct dentry *dentry;struct ceph_cap *cap;char *path; -int pathlen =0 , err =0 ; +int pathlen =0 , err;u64 pathbase;u64 snap_follows;
@@ -3961,6 +3961,7 @@ static int reconnect_caps_cb(struct inode *inode, int mds, void *arg) cap =__get_cap_for_mds (ci, mds);if (!cap) {spin_unlock (&ci->i_ceph_lock); + err =0 ; goto out_err; } dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 130/225 drm/amdgpu: skip disabling fence driver src_irqs when device is unplugged
In reply to Greg Kroah-HartmanFrom: Guchun Chen <[email protected]>
[ Upstream commit c1a322a7a4a96cd0a3dde32ce37af437a78bf8cd ]
When performing device unbind or halt, we have disabled all irqs at the very begining like amdgpu_pci_remove or amdgpu_device_halt. So amdgpu_irq_put for irqs stored in fence driver should not be called any more, otherwise, below calltrace will arrive.
[ 139.114088] WARNING: CPU: 2 PID: 1550 at drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c:616 amdgpu_irq_put+0xf6/0x110 [amdgpu] [ 139.114655] Call Trace: [ 139.114655] <TASK> [ 139.114657] amdgpu_fence_driver_hw_fini+0x93/0x130 [amdgpu] [ 139.114836] amdgpu_device_fini_hw+0xb6/0x350 [amdgpu] [ 139.114955] amdgpu_driver_unload_kms+0x51/0x70 [amdgpu] [ 139.115075] amdgpu_pci_remove+0x63/0x160 [amdgpu] [ 139.115193] ? __pm_runtime_resume+0x64/0x90 [ 139.115195] pci_device_remove+0x3a/0xb0 [ 139.115197] device_remove+0x43/0x70 [ 139.115198] device_release_driver_internal+0xbd/0x140
--- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +2 -1
@@ -528,7 +528,8 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)if (r)amdgpu_fence_driver_force_completion (ring); -if (ring->fence_drv.irq_src) +if (!drm_dev_is_unplugged (adev_to_drm (adev)) && + ring->fence_drv.irq_src)amdgpu_irq_put (adev, ring->fence_drv.irq_src, ring->fence_drv.irq_type);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 131/225 ublk: fix AB-BA lockdep warning
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
[ Upstream commit ac5902f84bb546c64aea02c439c2579cbf40318f ]
When handling UBLK_IO_FETCH_REQ, ctx->uring_lock is grabbed first, then ub->mutex is acquired.
When handling UBLK_CMD_STOP_DEV or UBLK_CMD_DEL_DEV, ub->mutex is grabbed first, then calling io_uring_cmd_done() for canceling uring command, in which ctx->uring_lock may be required.
Real deadlock only happens when all the above commands are issued from same uring context, and in reality different uring contexts are often used for handing control command and IO command.
Fix the issue by using io_uring_cmd_complete_in_task() to cancel command in ublk_cancel_dev(ublk_cancel_queue).
--- drivers/block/ublk_drv.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/block/ublk_drv.c +7 -2
@@ -1045,6 +1045,11 @@ static inline bool ublk_queue_ready(struct ublk_queue *ubq)return ubq->nr_io_ready == ubq->q_depth; } +static void ublk_cmd_cancel_cb (struct io_uring_cmd *cmd,unsigned issue_flags) +{ +io_uring_cmd_done (cmd,UBLK_IO_RES_ABORT ,0 , issue_flags); +} +static void ublk_cancel_queue (struct ublk_queue *ubq) {int i;
@@ -1056,8 +1061,8 @@ static void ublk_cancel_queue(struct ublk_queue *ubq)struct ublk_io *io = &ubq->ios[i];if (io->flags &UBLK_IO_FLAG_ACTIVE ) -io_uring_cmd_done (io->cmd,UBLK_IO_RES_ABORT ,0 , -IO_URING_F_UNLOCKED ); +io_uring_cmd_complete_in_task (io->cmd, + ublk_cmd_cancel_cb); }/* all io commands are canceled */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 132/225 nvme-pci: Add quirk for Teamgroup MP33 SSD
In reply to Greg Kroah-HartmanFrom: Daniel Smith <[email protected]>
[ Upstream commit 0649728123cf6a5518e154b4e1735fc85ea4f55c ]
Add a quirk for Teamgroup MP33 that reports duplicate ids for disk.
--- drivers/nvme/host/pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/nvme/host/pci.c +2 -0
@@ -3558,6 +3558,8 @@ static const struct pci_device_id nvme_id_table[] = { .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1e4b, 0x1602), /* HS-SSD-FUTURE 2048G */ .driver_data = NVME_QUIRK_BOGUS_NID, }, + { PCI_DEVICE(0x10ec, 0x5765), /* TEAMGROUP MP33 2TB SSD */ + .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061), .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, }, { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 133/225 block: Deny writable memory mapping if block is read-only
In reply to Greg Kroah-HartmanFrom: Loic Poulain <[email protected]>
[ Upstream commit 69baa3a623fd2e58624f24f2f23d46f87b817c93 ]
User should not be able to write block device if it is read-only at block level (e.g force_ro attribute). This is ensured in the regular fops write operation (blkdev_write_iter) but not when writing via user mapping (mmap), allowing user to actually write a read-only block device via a PROT_WRITE mapping.
Example: This can lead to integrity issue of eMMC boot partition (e.g mmcblk0boot0) which is read-only by default.
To fix this issue, simply deny shared writable mapping if the block is readonly.
Note: Block remains writable if switch to read-only is performed after the initial mapping, but this is expected behavior according to commit a32e236eb93e ("Partially revert "block: fail op_is_write() requests to read-only partitions"")'.
--- block/fops.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
block/fops.c +11 -1
@@ -685,6 +685,16 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,return error; } +static int blkdev_mmap (struct file *file,struct vm_area_struct *vma) +{ +struct inode *bd_inode =bdev_file_inode (file); + +if (bdev_read_only (I_BDEV (bd_inode))) +return generic_file_readonly_mmap (file, vma); + +return generic_file_mmap (file, vma); +} +const struct file_operations def_blk_fops = { .open = blkdev_open, .release = blkdev_close,
@@ -692,7 +702,7 @@ const struct file_operations def_blk_fops = { .read_iter = blkdev_read_iter, .write_iter = blkdev_write_iter, .iopoll = iocb_bio_iopoll, - .mmap = generic_file_mmap, + .mmap = blkdev_mmap, .fsync = blkdev_fsync, .unlocked_ioctl = blkdev_ioctl,#ifdef CONFIG_COMPAT
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 134/225 KVM: arm64: vgic: Fix a circular locking issue
In reply to Greg Kroah-HartmanFrom: Jean-Philippe Brucker <[email protected]>
[ Upstream commit 59112e9c390be595224e427827475a6cd3726021 ]
Lockdep reports a circular lock dependency between the srcu and the config_lock:
[ 262.179917] -> #1 (&kvm->srcu){.+.+}-{0:0}:
[ 262.182010] __synchronize_srcu+0xb0/0x224
[ 262.183422] synchronize_srcu_expedited+0x24/0x34
[ 262.184554] kvm_io_bus_register_dev+0x324/0x50c
[ 262.185650] vgic_register_redist_iodev+0x254/0x398
[ 262.186740] vgic_v3_set_redist_base+0x3b0/0x724
[ 262.188087] kvm_vgic_addr+0x364/0x600
[ 262.189189] vgic_set_common_attr+0x90/0x544
[ 262.190278] vgic_v3_set_attr+0x74/0x9c
[ 262.191432] kvm_device_ioctl+0x2a0/0x4e4
[ 262.192515] __arm64_sys_ioctl+0x7ac/0x1ba8
[ 262.193612] invoke_syscall.constprop.0+0x70/0x1e0
[ 262.195006] do_el0_svc+0xe4/0x2d4
[ 262.195929] el0_svc+0x44/0x8c
[ 262.196917] el0t_64_sync_handler+0xf4/0x120
[ 262.198238] el0t_64_sync+0x190/0x194
[ 262.199224]
[ 262.199224] -> #0 (&kvm->arch.config_lock){+.+.}-{3:3}:
[ 262.201094] __lock_acquire+0x2b70/0x626c
[ 262.202245] lock_acquire+0x454/0x778
[ 262.203132] __mutex_lock+0x190/0x8b4
[ 262.204023] mutex_lock_nested+0x24/0x30
[ 262.205100] vgic_mmio_write_v3_misc+0x5c/0x2a0
[ 262.206178] dispatch_mmio_write+0xd8/0x258
[ 262.207498] __kvm_io_bus_write+0x1e0/0x350
[ 262.208582] kvm_io_bus_write+0xe0/0x1cc
[ 262.209653] io_mem_abort+0x2ac/0x6d8
[ 262.210569] kvm_handle_guest_abort+0x9b8/0x1f88
[ 262.211937] handle_exit+0xc4/0x39c
[ 262.212971] kvm_arch_vcpu_ioctl_run+0x90c/0x1c04
[ 262.214154] kvm_vcpu_ioctl+0x450/0x12f8
[ 262.215233] __arm64_sys_ioctl+0x7ac/0x1ba8
[ 262.216402] invoke_syscall.constprop.0+0x70/0x1e0
[ 262.217774] do_el0_svc+0xe4/0x2d4
[ 262.218758] el0_svc+0x44/0x8c
[ 262.219941] el0t_64_sync_handler+0xf4/0x120
[ 262.221110] el0t_64_sync+0x190/0x194Note that the current report, which can be triggered by the vgic_irq kselftest, is a triple chain that includes slots_lock, but after inverting the slots_lock/config_lock dependency, the actual problem reported above remains.
In several places, the vgic code calls kvm_io_bus_register_dev(), which synchronizes the srcu, while holding config_lock (#1). And the MMIO handler takes the config_lock while holding the srcu read lock (#0).
Break dependency #1, by registering the distributor and redistributors without holding config_lock. The ITS also uses kvm_io_bus_register_dev() but already relies on slots_lock to serialize calls.
The distributor iodev is created on the first KVM_RUN call. Multiple threads will race for vgic initialization, and only the first one will see !vgic_ready() under the lock. To serialize those threads, rely on slots_lock rather than config_lock.
Redistributors are created earlier, through KVM_DEV_ARM_VGIC_GRP_ADDR ioctls and vCPU creation. Similarly, serialize the iodev creation with slots_lock, and the rest with config_lock.
--- arch/arm64/kvm/vgic/vgic-init.c | 25 ++++++++++++++++----- arch/arm64/kvm/vgic/vgic-kvm-device.c | 10 +++++++-- arch/arm64/kvm/vgic/vgic-mmio-v3.c | 31 ++++++++++++++++++--------- arch/arm64/kvm/vgic/vgic-mmio.c | 9 ++------ arch/arm64/kvm/vgic/vgic-v2.c | 6 ------ arch/arm64/kvm/vgic/vgic-v3.c | 7 ------ 6 files changed, 51 insertions(+), 37 deletions(-)
arch/arm64/kvm/vgic/vgic-init.c +20 -5
@@ -235,9 +235,9 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu)* KVM io device for the redistributor that belongs to this VCPU. */ if (dist->vgic_model ==KVM_DEV_TYPE_ARM_VGIC_V3 ) { -mutex_lock (&vcpu->kvm->arch.config_lock); +mutex_lock (&vcpu->kvm->slots_lock); ret =vgic_register_redist_iodev (vcpu); -mutex_unlock (&vcpu->kvm->arch.config_lock); +mutex_unlock (&vcpu->kvm->slots_lock); }return ret; }
@@ -446,11 +446,13 @@ int vgic_lazy_init(struct kvm *kvm)int kvm_vgic_map_resources (struct kvm *kvm) {struct vgic_dist *dist = &kvm->arch.vgic; +gpa_t dist_base;int ret =0 ;if (likely (vgic_ready (kvm)))return 0 ; +mutex_lock (&kvm->slots_lock);mutex_lock (&kvm->arch.config_lock);if (vgic_ready (kvm)) goto out;
@@ -463,13 +465,26 @@ int kvm_vgic_map_resources(struct kvm *kvm)else ret =vgic_v3_map_resources (kvm); -if (ret) +if (ret) {__kvm_vgic_destroy (kvm); -else - dist->ready = true; + goto out; + } + dist->ready = true; + dist_base = dist->vgic_dist_base; +mutex_unlock (&kvm->arch.config_lock); + + ret =vgic_register_dist_iodev (kvm, dist_base, + kvm_vgic_global_state.type); +if (ret) { +kvm_err ("Unable to register VGIC dist MMIO regions\n" ); +kvm_vgic_destroy (kvm); + } +mutex_unlock (&kvm->slots_lock); +return ret; out:mutex_unlock (&kvm->arch.config_lock); +mutex_unlock (&kvm->slots_lock);return ret; }
arch/arm64/kvm/vgic/vgic-kvm-device.c +8 -2
@@ -102,7 +102,11 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_device_attr *attr, bool wriif (get_user (addr, uaddr))return -EFAULT ; -mutex_lock (&kvm->arch.config_lock); +/* +* Since we can't hold config_lock while registering the redistributor +* iodevs, take the slots_lock immediately. +*/ +mutex_lock (&kvm->slots_lock);switch (attr->attr) {case KVM_VGIC_V2_ADDR_TYPE_DIST : r =vgic_check_type (kvm,KVM_DEV_TYPE_ARM_VGIC_V2 );
@@ -182,6 +186,7 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_device_attr *attr, bool wriif (r) goto out; +mutex_lock (&kvm->arch.config_lock);if (write) { r =vgic_check_iorange (kvm, *addr_ptr, addr, alignment, size);if (!r)
@@ -189,9 +194,10 @@ static int kvm_vgic_addr(struct kvm *kvm, struct kvm_device_attr *attr, bool wri }else { addr = *addr_ptr; } +mutex_unlock (&kvm->arch.config_lock); out: -mutex_unlock (&kvm->arch.config_lock); +mutex_unlock (&kvm->slots_lock);if (!r && !write) r =put_user (addr, uaddr);
arch/arm64/kvm/vgic/vgic-mmio-v3.c +21 -10
@@ -769,10 +769,13 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev;struct vgic_redist_region *rdreg;gpa_t rd_base; -int ret; +int ret =0 ; + +lockdep_assert_held (&kvm->slots_lock); +mutex_lock (&kvm->arch.config_lock);if (!IS_VGIC_ADDR_UNDEF (vgic_cpu->rd_iodev.base_addr)) -return 0 ; + goto out_unlock;/* * We may be creating VCPUs before having set the base address for the
@@ -782,10 +785,12 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu)*/ rdreg =vgic_v3_rdist_free_slot (&vgic->rd_regions);if (!rdreg) -return 0 ; + goto out_unlock; -if (!vgic_v3_check_base (kvm)) -return -EINVAL ; +if (!vgic_v3_check_base (kvm)) { + ret = -EINVAL ; + goto out_unlock; + } vgic_cpu->rdreg = rdreg; vgic_cpu->rdreg_index = rdreg->free_index;
@@ -799,16 +804,20 @@ int vgic_register_redist_iodev(struct kvm_vcpu *vcpu) rd_dev->nr_regions =ARRAY_SIZE (vgic_v3_rd_registers); rd_dev->redist_vcpu = vcpu; -mutex_lock (&kvm->slots_lock); +mutex_unlock (&kvm->arch.config_lock); + ret =kvm_io_bus_register_dev (kvm,KVM_MMIO_BUS , rd_base,2 *SZ_64K , &rd_dev->dev); -mutex_unlock (&kvm->slots_lock); -if (ret)return ret; +/* Protected by slots_lock */ rdreg->free_index++;return 0 ; + +out_unlock: +mutex_unlock (&kvm->arch.config_lock); +return ret; }static void vgic_unregister_redist_iodev (struct kvm_vcpu *vcpu)
@@ -834,12 +843,10 @@ static int vgic_register_all_redist_iodevs(struct kvm *kvm)/* The current c failed, so iterate over the previous ones. */ int i; -mutex_lock (&kvm->slots_lock);for (i =0 ; i < c; i++) { vcpu =kvm_get_vcpu (kvm, i);vgic_unregister_redist_iodev (vcpu); } -mutex_unlock (&kvm->slots_lock); }return ret;
@@ -938,7 +945,9 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count) {int ret; +mutex_lock (&kvm->arch.config_lock); ret =vgic_v3_alloc_redist_region (kvm, index, addr, count); +mutex_unlock (&kvm->arch.config_lock);if (ret)return ret;
@@ -950,8 +959,10 @@ int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count)if (ret) {struct vgic_redist_region *rdreg; +mutex_lock (&kvm->arch.config_lock); rdreg =vgic_v3_rdist_region_from_index (kvm, index);vgic_v3_free_redist_region (rdreg); +mutex_unlock (&kvm->arch.config_lock);return ret; }
arch/arm64/kvm/vgic/vgic-mmio.c +2 -7
@@ -1093,7 +1093,6 @@ int vgic_register_dist_iodev(struct kvm *kvm, gpa_t dist_base_address, enum vgic_type type) {struct vgic_io_device *io_device = &kvm->arch.vgic.dist_iodev; -int ret =0 ;unsigned int len;switch (type) {
@@ -1111,10 +1110,6 @@ int vgic_register_dist_iodev(struct kvm *kvm, gpa_t dist_base_address, io_device->iodev_type =IODEV_DIST ; io_device->redist_vcpu =NULL ; -mutex_lock (&kvm->slots_lock); - ret =kvm_io_bus_register_dev (kvm,KVM_MMIO_BUS , dist_base_address, - len, &io_device->dev); -mutex_unlock (&kvm->slots_lock); - -return ret; +return kvm_io_bus_register_dev (kvm,KVM_MMIO_BUS , dist_base_address, + len, &io_device->dev); }
arch/arm64/kvm/vgic/vgic-v2.c +0 -6
@@ -312,12 +312,6 @@ int vgic_v2_map_resources(struct kvm *kvm)return ret; } - ret =vgic_register_dist_iodev (kvm, dist->vgic_dist_base,VGIC_V2 ); -if (ret) { -kvm_err ("Unable to register VGIC MMIO regions\n" ); -return ret; - } -if (!static_branch_unlikely (&vgic_v2_cpuif_trap)) { ret = kvm_phys_addr_ioremap(kvm, dist->vgic_cpu_base, kvm_vgic_global_state.vcpu_base,
arch/arm64/kvm/vgic/vgic-v3.c +0 -7
@@ -538,7 +538,6 @@ int vgic_v3_map_resources(struct kvm *kvm) {struct vgic_dist *dist = &kvm->arch.vgic;struct kvm_vcpu *vcpu; -int ret =0 ;unsigned long c;kvm_for_each_vcpu (c, vcpu, kvm) {
@@ -568,12 +567,6 @@ int vgic_v3_map_resources(struct kvm *kvm)return -EBUSY ; } - ret =vgic_register_dist_iodev (kvm, dist->vgic_dist_base,VGIC_V3 ); -if (ret) { -kvm_err ("Unable to register VGICv3 dist MMIO regions\n" ); -return ret; - } -if (kvm_vgic_global_state.has_gicv4_1)vgic_v4_configure_vsgis (kvm);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 135/225 KVM: arm64: vgic: Wrap vgic_its_create() with config_lock
In reply to Greg Kroah-HartmanFrom: Jean-Philippe Brucker <[email protected]>
[ Upstream commit 9cf2f840c439b6b23bd99f584f2917ca425ae406 ]
vgic_its_create() changes the vgic state without holding the config_lock, which triggers a lockdep warning in vgic_v4_init():
[ 358.667941] WARNING: CPU: 3 PID: 178 at arch/arm64/kvm/vgic/vgic-v4.c:245 vgic_v4_init+0x15c/0x7a8 ... [ 358.707410] vgic_v4_init+0x15c/0x7a8 [ 358.708550] vgic_its_create+0x37c/0x4a4 [ 358.709640] kvm_vm_ioctl+0x1518/0x2d80 [ 358.710688] __arm64_sys_ioctl+0x7ac/0x1ba8 [ 358.711960] invoke_syscall.constprop.0+0x70/0x1e0 [ 358.713245] do_el0_svc+0xe4/0x2d4 [ 358.714289] el0_svc+0x44/0x8c [ 358.715329] el0t_64_sync_handler+0xf4/0x120 [ 358.716615] el0t_64_sync+0x190/0x194
Wrap the whole of vgic_its_create() with config_lock since, in addition to calling vgic_v4_init(), it also modifies the global kvm->arch.vgic state.
--- arch/arm64/kvm/vgic/vgic-its.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
arch/arm64/kvm/vgic/vgic-its.c +10 -4
@@ -1936,6 +1936,7 @@ void vgic_lpi_translation_cache_destroy(struct kvm *kvm)static int vgic_its_create (struct kvm_device *dev,u32 type) { +int ret;struct vgic_its *its;if (type !=KVM_DEV_TYPE_ARM_VGIC_ITS )
@@ -1945,9 +1946,12 @@ static int vgic_its_create(struct kvm_device *dev, u32 type)if (!its)return -ENOMEM ; +mutex_lock (&dev->kvm->arch.config_lock); +if (vgic_initialized (dev->kvm)) { -int ret =vgic_v4_init (dev->kvm); + ret =vgic_v4_init (dev->kvm);if (ret <0 ) { +mutex_unlock (&dev->kvm->arch.config_lock);kfree (its);return ret; }
@@ -1960,12 +1964,10 @@ static int vgic_its_create(struct kvm_device *dev, u32 type)/* Yep, even more trickery for lock ordering... */ #ifdef CONFIG_LOCKDEP -mutex_lock (&dev->kvm->arch.config_lock);mutex_lock (&its->cmd_lock);mutex_lock (&its->its_lock);mutex_unlock (&its->its_lock);mutex_unlock (&its->cmd_lock); -mutex_unlock (&dev->kvm->arch.config_lock);#endif its->vgic_its_base =VGIC_ADDR_UNDEF ;
@@ -1986,7 +1988,11 @@ static int vgic_its_create(struct kvm_device *dev, u32 type) dev->private = its; -return vgic_its_set_abi (its,NR_ITS_ABIS -1 ); + ret =vgic_its_set_abi (its,NR_ITS_ABIS -1 ); + +mutex_unlock (&dev->kvm->arch.config_lock); + +return ret; }static void vgic_its_destroy (struct kvm_device *kvm_dev)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 136/225 KVM: arm64: vgic: Fix locking comment
In reply to Greg Kroah-HartmanFrom: Jean-Philippe Brucker <[email protected]>
[ Upstream commit c38b8400aef99d63be2b1ff131bb993465dcafe1 ]
It is now config_lock that must be held, not kvm lock. Replace the comment with a lockdep annotation.
--- arch/arm64/kvm/vgic/vgic-v4.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kvm/vgic/vgic-v4.c +2 -1
@@ -184,13 +184,14 @@ static void vgic_v4_disable_vsgis(struct kvm_vcpu *vcpu) } } -/* Must be called with the kvm lock held */ void vgic_v4_configure_vsgis (struct kvm *kvm) {struct vgic_dist *dist = &kvm->arch.vgic;struct kvm_vcpu *vcpu;unsigned long i; +lockdep_assert_held (&kvm->arch.config_lock); +kvm_arm_halt_guest (kvm);kvm_for_each_vcpu (i, vcpu, kvm) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 137/225 media: mediatek: vcodec: Only apply 4K frame sizes on decoder formats
In reply to Greg Kroah-HartmanFrom: Pin-yen Lin <[email protected]>
[ Upstream commit ed17f89e9502f03af493e130620a9bb74c07cf28 ]
When VCODEC_CAPABILITY_4K_DISABLED is not set in dec_capability, skip formats that are not MTK_FMT_DEC so only decoder formats is updated in mtk_init_vdec_params.
--- .../media/platform/mediatek/vcodec/mtk_vcodec_dec_stateful.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/platform/mediatek/vcodec/mtk_vcodec_dec_stateful.c +3 -0
@@ -584,6 +584,9 @@ static void mtk_init_vdec_params(struct mtk_vcodec_ctx *ctx)if (!(ctx->dev->dec_capability &VCODEC_CAPABILITY_4K_DISABLED )) {for (i =0 ; i < num_supported_formats; i++) { +if (mtk_video_formats[i].type !=MTK_FMT_DEC ) +continue ; + mtk_video_formats[i].frmsize.max_width =VCODEC_DEC_4K_CODED_WIDTH ; mtk_video_formats[i].frmsize.max_height =
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 138/225 mailbox: mailbox-test: fix a locking issue in mbox_test_message_write()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 8fe72b76db79d694858e872370df49676bc3be8c ]
There was a bug where this code forgot to unlock the tdev->mutex if the kzalloc() failed. Fix this issue, by moving the allocation outside the lock.
--- drivers/mailbox/mailbox-test.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/mailbox/mailbox-test.c +6 -4
@@ -97,6 +97,7 @@ static ssize_t mbox_test_message_write(struct file *filp, size_t count, loff_t *ppos) { struct mbox_test_device *tdev = filp->private_data; +char *message;void *data;int ret;
@@ -112,12 +113,13 @@ static ssize_t mbox_test_message_write(struct file *filp,return -EINVAL ; } -mutex_lock (&tdev->mutex); - - tdev->message =kzalloc (MBOX_MAX_MSG_LEN ,GFP_KERNEL ); -if (!tdev->message) + message =kzalloc (MBOX_MAX_MSG_LEN ,GFP_KERNEL ); +if (!message)return -ENOMEM ; +mutex_lock (&tdev->mutex); + + tdev->message = message; ret =copy_from_user (tdev->message, userbuf, count);if (ret) { ret = -EFAULT ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 139/225 drivers: base: cacheinfo: Fix shared_cpu_map changes in event of CPU hotplug
In reply to Greg Kroah-HartmanFrom: K Prateek Nayak <[email protected]>
[ Upstream commit 126310c9f669c9a8c875a3e5c2292299ca90225d ]
While building the shared_cpu_map, check if the cache level and cache type matches. On certain systems that build the cache topology based on the instance ID, there are cases where the same ID may repeat across multiple cache levels, leading inaccurate topology.
In event of CPU offlining, the cache_shared_cpu_map_remove() does not consider if IDs at same level are being compared. As a result, when same IDs repeat across different cache levels, the CPU going offline is not removed from all the shared_cpu_map.
Below is the output of cache topology of CPU8 and it's SMT sibling after CPU8 is offlined on a dual socket 3rd Generation AMD EPYC processor (2 x 64C/128T) running kernel release v6.3:
# for i in /sys/devices/system/cpu/cpu8/cache/index*/shared_cpu_list; do echo -n "$i: "; cat $i; done
/sys/devices/system/cpu/cpu8/cache/index0/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index1/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index2/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index3/shared_cpu_list: 8-15,136-143# echo 0 > /sys/devices/system/cpu/cpu8/online
# for i in /sys/devices/system/cpu/cpu136/cache/index*/shared_cpu_list; do echo -n "$i: "; cat $i; done
/sys/devices/system/cpu/cpu136/cache/index0/shared_cpu_list: 136
/sys/devices/system/cpu/cpu136/cache/index1/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu136/cache/index2/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu136/cache/index3/shared_cpu_list: 9-15,136-143CPU8 is removed from index0 (L1i) but remains in the shared_cpu_list of index1 (L1d) and index2 (L2). Since L1i, L1d, and L2 are shared by the SMT siblings, and they have the same cache instance ID, CPU 2 is only removed from the first index with matching ID which is index1 (L1i) in this case. With this fix, the results are as expected when performing the same experiment on the same system:
# for i in /sys/devices/system/cpu/cpu8/cache/index*/shared_cpu_list; do echo -n "$i: "; cat $i; done
/sys/devices/system/cpu/cpu8/cache/index0/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index1/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index2/shared_cpu_list: 8,136
/sys/devices/system/cpu/cpu8/cache/index3/shared_cpu_list: 8-15,136-143# echo 0 > /sys/devices/system/cpu/cpu8/online
# for i in /sys/devices/system/cpu/cpu136/cache/index*/shared_cpu_list; do echo -n "$i: "; cat $i; done
/sys/devices/system/cpu/cpu136/cache/index0/shared_cpu_list: 136
/sys/devices/system/cpu/cpu136/cache/index1/shared_cpu_list: 136
/sys/devices/system/cpu/cpu136/cache/index2/shared_cpu_list: 136
/sys/devices/system/cpu/cpu136/cache/index3/shared_cpu_list: 9-15,136-143When rebuilding topology, the same problem appears as cache_shared_cpu_map_setup() implements a similar logic. Consider the same 3rd Generation EPYC processor: CPUs in Core 1, that share the L1 and L2 caches, have L1 and L2 instance ID as 1. For all the CPUs on the second chiplet, the L3 ID is also 1 leading to grouping on CPUs from Core 1 (1, 17) and the entire second chiplet (8-15, 24-31) as CPUs sharing one cache domain. This went undetected since x86 processors depended on arch specific populate_cache_leaves() method to repopulate the shared_cpus_map when CPU came back online until kernel release v6.3-rc5.
--- drivers/base/cacheinfo.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/base/cacheinfo.c +20 -0
@@ -280,6 +280,16 @@ static int cache_shared_cpu_map_setup(unsigned int cpu)continue ;/* skip if itself or no cacheinfo */ for (sib_index =0 ; sib_index <cache_leaves (i); sib_index++) { sib_leaf =per_cpu_cacheinfo_idx (i, sib_index); + +/* +* Comparing cache IDs only makes sense if the leaves +* belong to the same cache level of same type. Skip +* the check if level and type do not match. +*/ +if (sib_leaf->level != this_leaf->level || + sib_leaf->type != this_leaf->type) +continue ; +if (cache_leaves_are_shared (this_leaf, sib_leaf)) {cpumask_set_cpu (cpu, &sib_leaf->shared_cpu_map);cpumask_set_cpu (i, &this_leaf->shared_cpu_map);
@@ -311,6 +321,16 @@ static void cache_shared_cpu_map_remove(unsigned int cpu)for (sib_index =0 ; sib_index <cache_leaves (sibling); sib_index++) { sib_leaf =per_cpu_cacheinfo_idx (sibling, sib_index); + +/* +* Comparing cache IDs only makes sense if the leaves +* belong to the same cache level of same type. Skip +* the check if level and type do not match. +*/ +if (sib_leaf->level != this_leaf->level || + sib_leaf->type != this_leaf->type) +continue ; +if (cache_leaves_are_shared (this_leaf, sib_leaf)) {cpumask_clear_cpu (cpu, &sib_leaf->shared_cpu_map);cpumask_clear_cpu (sibling, &this_leaf->shared_cpu_map);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 140/225 media: uvcvideo: Dont expose unsupported formats to userspace
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit 81f3affa19d6ab0c32aef46b053838219eef7e71 ]
When the uvcvideo driver encounters a format descriptor with an unknown format GUID, it creates a corresponding struct uvc_format instance with the fcc field set to 0. Since commit 50459f103edf ("media: uvcvideo:
Remove format descriptions"), the driver relies on the V4L2 core to provide the format description string, which the V4L2 core can't do without a valid 4CC. This triggers a WARN_ON.
As a format with a zero 4CC can't be selected, it is unusable for applications. Ignore the format completely without creating a uvc_format instance, which fixes the warning.
--- drivers/media/usb/uvc/uvc_driver.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/media/usb/uvc/uvc_driver.c +11 -5
@@ -251,14 +251,17 @@ static int uvc_parse_format(struct uvc_device *dev,/* Find the format descriptor from its GUID. */ fmtdesc =uvc_format_by_guid (&buffer[5 ]); -if (fmtdesc !=NULL ) { - format->fcc = fmtdesc->fcc; - }else { +if (!fmtdesc) { +/* +* Unknown video formats are not fatal errors, the +* caller will skip this descriptor. +*/ dev_info (&streaming->intf->dev,"Unknown video format %pUl\n" , &buffer[5 ]); - format->fcc =0 ; +return 0 ; } + format->fcc = fmtdesc->fcc; format->bpp = buffer[21 ];/*
@@ -675,7 +678,7 @@ static int uvc_parse_streaming(struct uvc_device *dev, interval = (u32 *)&frame[nframes]; streaming->format = format; - streaming->nformats = nformats; + streaming->nformats =0 ;/* Parse the format descriptors. */ while (buflen >2 && buffer[1 ] ==USB_DT_CS_INTERFACE ) {
@@ -689,7 +692,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, &interval, buffer, buflen);if (ret <0 ) goto error; +if (!ret) +break ; + streaming->nformats++; frame += format->nframes; format++;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 141/225 iio: accel: st_accel: Fix invalid mount_matrix on devices without ACPI _ONT method
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 79b8ded9d9c595db9bd5b2f62f5f738b36de1e22 upstream.
When apply_acpi_orientation() fails, st_accel_common_probe() will fall back to iio_read_mount_matrix(), which checks for a mount-matrix device property and if that is not set falls back to the identity matrix.
But when a sensor has no ACPI companion fwnode, or when the ACPI fwnode does not have a "_ONT" method apply_acpi_orientation() was returning 0, causing iio_read_mount_matrix() to never get called resulting in an invalid mount_matrix:
[root@fedora ~]# cat /sys/bus/iio/devices/iio\:device0/mount_matrix (null), (null), (null); (null), (null), (null); (null), (null), (null)
Fix this by making apply_acpi_orientation() always return an error when it did not set the mount_matrix.
--- drivers/iio/accel/st_accel_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/accel/st_accel_core.c +2 -2
@@ -1289,12 +1289,12 @@ static int apply_acpi_orientation(struct adev =ACPI_COMPANION (indio_dev->dev.parent);if (!adev) -return 0 ; +return -ENXIO ;/* Read _ONT data, which should be a package of 6 integers. */ status =acpi_evaluate_object (adev->handle,"_ONT" ,NULL , &buffer);if (status ==AE_NOT_FOUND ) { -return 0 ; +return -ENXIO ; }else if (ACPI_FAILURE (status)) {dev_warn (&indio_dev->dev,"failed to execute _ONT: %d\n" , status);
Greg Kroah-Hartman
maintainerPATCH 142/225 iio: adc: mxs-lradc: fix the order of two cleanup operations
In reply to Greg Kroah-HartmanFrom: Jiakai Luo <[email protected]>
commit 27b2ed5b6d53cd62fc61c3f259ae52f5cac23b66 upstream.
Smatch reports:drivers/iio/adc/mxs-lradc-adc.c:766 mxs_lradc_adc_probe() warn:
missing unwind goto?
the order of three init operation:
1.mxs_lradc_adc_trigger_init
2.iio_triggered_buffer_setup
3.mxs_lradc_adc_hw_init
thus, the order of three cleanup operation should be:
1.mxs_lradc_adc_hw_stop 2.iio_triggered_buffer_cleanup 3.mxs_lradc_adc_trigger_remove
we exchange the order of two cleanup operations, introducing the following differences:
1.if mxs_lradc_adc_trigger_init fails, returns directly; 2.if trigger_init succeeds but iio_triggered_buffer_setup fails, goto err_trig and remove the trigger.
In addition, we also reorder the unwind that goes on in the remove() callback to match the new ordering.
--- drivers/iio/adc/mxs-lradc-adc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/iio/adc/mxs-lradc-adc.c +5 -5
@@ -757,13 +757,13 @@ static int mxs_lradc_adc_probe(struct pl ret =mxs_lradc_adc_trigger_init (iio);if (ret) - goto err_trig; +return ret; ret =iio_triggered_buffer_setup (iio, &iio_pollfunc_store_time, &mxs_lradc_adc_trigger_handler, &mxs_lradc_adc_buffer_ops);if (ret) -return ret; + goto err_trig; adc->vref_mv = mxs_lradc_adc_vref_mv[lradc->soc];
@@ -801,9 +801,9 @@ static int mxs_lradc_adc_probe(struct pl err_dev:mxs_lradc_adc_hw_stop (adc); -mxs_lradc_adc_trigger_remove (iio); -err_trig:iio_triggered_buffer_cleanup (iio); +err_trig: +mxs_lradc_adc_trigger_remove (iio);return ret; }
@@ -814,8 +814,8 @@ static int mxs_lradc_adc_remove(struct piio_device_unregister (iio);mxs_lradc_adc_hw_stop (adc); -mxs_lradc_adc_trigger_remove (iio);iio_triggered_buffer_cleanup (iio); +mxs_lradc_adc_trigger_remove (iio);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 143/225 HID: google: add jewel USB id
In reply to Greg Kroah-HartmanFrom: Sung-Chi Li <[email protected]>
commit ed84c4517a5bc536e8572a01dfa11bc22a280d06 upstream.
Add 1 additional hammer-like device.
--- drivers/hid/hid-google-hammer.c | 2 ++ drivers/hid/hid-ids.h | 1 + 2 files changed, 3 insertions(+)
drivers/hid/hid-google-hammer.c +2 -0
@@ -587,6 +587,8 @@ static const struct hid_device_id hammer {HID_DEVICE (BUS_USB ,HID_GROUP_GENERIC , USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_HAMMER) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, + USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_JEWEL) }, + { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MAGNEMITE) }, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_MASTERBALL) },
drivers/hid/hid-ids.h +1 -0
@@ -523,6 +523,7 @@#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044#define USB_DEVICE_ID_GOOGLE_DON 0x5050#define USB_DEVICE_ID_GOOGLE_EEL 0x5057 +#define USB_DEVICE_ID_GOOGLE_JEWEL 0x5061#define USB_VENDOR_ID_GOTOP 0x08f2#define USB_DEVICE_ID_SUPER_Q2 0x007f
Greg Kroah-Hartman
maintainerPATCH 144/225 HID: wacom: avoid integer overflow in wacom_intuos_inout()
In reply to Greg Kroah-HartmanFrom: Nikita Zhandarovich <[email protected]>
commit bd249b91977b768ea02bf84d04625d2690ad2b98 upstream.
If high bit is set to 1 in ((data[3] & 0x0f << 28), after all arithmetic operations and integer promotions are done, high bits in wacom->serial[idx] will be filled with 1s as well.
Avoid this, albeit unlikely, issue by specifying left operand's __u64 type for the right operand.
Found by Linux Verification Center (linuxtesting.org) with static analysis tool SVACE.
--- drivers/hid/wacom_wac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/wacom_wac.c +1 -1
@@ -826,7 +826,7 @@ static int wacom_intuos_inout(struct wac/* Enter report */ if ((data[1 ] &0xfc ) ==0xc0 ) {/* serial number of the tool */ - wacom->serial[idx] = ((data[3 ] &0x0f ) <<28 ) + + wacom->serial[idx] = ((__u64)(data[3 ] &0x0f ) <<28 ) + (data[4 ] <<20 ) + (data[5 ] <<12 ) + (data[6 ] <<4 ) + (data[7 ] >>4 );
Greg Kroah-Hartman
maintainerPATCH 145/225 iio: imu: inv_icm42600: fix timestamp reset
In reply to Greg Kroah-HartmanFrom: Jean-Baptiste Maneyrol <[email protected]>
commit bbaae0c79ebd49f61ad942a8bf9e12bfc7f821bb upstream.
Timestamp reset is not done in the correct place. It must be done before enabling buffer. The reason is that interrupt timestamping is always happening when the chip is on, even if the corresponding sensor is off. When the sensor restarts, timestamp is wrong if you don't do a reset first.
--- drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c +5 -5
@@ -275,9 +275,14 @@ static int inv_icm42600_buffer_preenable {struct inv_icm42600_state *st =iio_device_get_drvdata (indio_dev);struct device *dev =regmap_get_device (st->map); +struct inv_icm42600_timestamp *ts =iio_priv (indio_dev);pm_runtime_get_sync (dev); +mutex_lock (&st->lock); +inv_icm42600_timestamp_reset (ts); +mutex_unlock (&st->lock); +return 0 ; }
@@ -375,7 +380,6 @@ static int inv_icm42600_buffer_postdisabstruct device *dev =regmap_get_device (st->map);unsigned int sensor;unsigned int *watermark; -struct inv_icm42600_timestamp *ts;struct inv_icm42600_sensor_conf conf =INV_ICM42600_SENSOR_CONF_INIT ;unsigned int sleep_temp =0 ;unsigned int sleep_sensor =0 ;
@@ -385,11 +389,9 @@ static int inv_icm42600_buffer_postdisabif (indio_dev == st->indio_gyro) { sensor =INV_ICM42600_SENSOR_GYRO ; watermark = &st->fifo.watermark.gyro; - ts =iio_priv (st->indio_gyro); }else if (indio_dev == st->indio_accel) { sensor =INV_ICM42600_SENSOR_ACCEL ; watermark = &st->fifo.watermark.accel; - ts =iio_priv (st->indio_accel); }else {return -EINVAL ; }
@@ -417,8 +419,6 @@ static int inv_icm42600_buffer_postdisabif (!st->fifo.on) ret =inv_icm42600_set_temp_conf (st, false, &sleep_temp); -inv_icm42600_timestamp_reset (ts); - out_unlock:mutex_unlock (&st->lock);
Greg Kroah-Hartman
maintainerPATCH 146/225 dt-bindings: iio: adc: renesas,rcar-gyroadc: Fix adi,ad7476 compatible value
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
commit 55720d242052e860b9fde445e302e0425722e7f1 upstream.
The conversion to json-schema accidentally dropped the "ad" part prefix from the compatible value.
--- Documentation/devicetree/bindings/iio/adc/renesas,rcar-gyroadc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/iio/adc/renesas,rcar-gyroadc.yaml +1 -1
@@ -86,7 +86,7 @@ patternProperties: of the MAX chips to the GyroADC, while MISO line of each Maxim ADC connects to a shared input pin of the GyroADC. enum: - - adi,7476 + - adi,ad7476 - fujitsu,mb88101a - maxim,max1162 - maxim,max11100
Greg Kroah-Hartman
maintainerPATCH 147/225 iio: light: vcnl4035: fixed chip ID check
In reply to Greg Kroah-HartmanFrom: Frank Li <[email protected]>
commit a551c26e8e568fad42120843521529241b9bceec upstream.
VCNL4035 register(0xE) ID_L and ID_M define as:
ID_L: 0x80
ID_H: 7:6 (0:0)
5:4 (0:0) slave address = 0x60 (7-bit)
(0:1) slave address = 0x51 (7-bit)
(1:0) slave address = 0x40 (7-bit)
(1:0) slave address = 0x41 (7-bit)
3:0 Version code default (0:0:0:0)So just check ID_L.
--- drivers/iio/light/vcnl4035.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/iio/light/vcnl4035.c +3 -0
@@ -8,6 +8,7 @@* TODO: Proximity */ #include <linux/bitops.h> +#include <linux/bitfield.h> #include <linux/i2c.h> #include <linux/module.h> #include <linux/pm_runtime.h>
@@ -42,6 +43,7 @@#define VCNL4035_ALS_PERS_MASK GENMASK(3, 2)#define VCNL4035_INT_ALS_IF_H_MASK BIT(12)#define VCNL4035_INT_ALS_IF_L_MASK BIT(13) +#define VCNL4035_DEV_ID_MASK GENMASK(7, 0)/* Default values */ #define VCNL4035_MODE_ALS_ENABLE BIT(0)
@@ -413,6 +415,7 @@ static int vcnl4035_init(struct vcnl4035return ret; } + id =FIELD_GET (VCNL4035_DEV_ID_MASK , id);if (id !=VCNL4035_DEV_ID_VAL ) {dev_err (&data->client->dev,"Wrong id, got %x, expected %x\n" , id,VCNL4035_DEV_ID_VAL );
Greg Kroah-Hartman
maintainerPATCH 148/225 iio: adc: stm32-adc: skip adc-channels setup if none is present
In reply to Greg Kroah-HartmanFrom: Sean Nyekjaer <[email protected]>
commit 3e27ef0ced49f8ae7883c25fadf76a2086e99025 upstream.
If only adc differential channels are defined driver will fail with
stm32-adc: probe of 48003000.adc:adc@0 failed with error -22
Fix this by skipping the initialization if no channels are defined.
This applies only to the legacy way of initializing adc channels.
--- drivers/iio/adc/stm32-adc.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-)
drivers/iio/adc/stm32-adc.c +23 -19
@@ -1913,6 +1913,7 @@ static int stm32_adc_legacy_chan_init(ststruct stm32_adc_diff_channel diff[STM32_ADC_CH_MAX ];struct device *dev = &indio_dev->dev;u32 num_diff = adc->num_diff; +int num_se = nchans - num_diff;int size = num_diff *sizeof (*diff) /sizeof (u32);int scan_index =0 , ret, i, c;u32 smp =0 , smps[STM32_ADC_CH_MAX ], chans[STM32_ADC_CH_MAX ];
@@ -1939,29 +1940,32 @@ static int stm32_adc_legacy_chan_init(st scan_index++; } } - - ret =device_property_read_u32_array (dev,"st,adc-channels" , chans, - nchans); -if (ret) -return ret; - -for (c =0 ; c < nchans; c++) { -if (chans[c] >= adc_info->max_channels) { -dev_err (&indio_dev->dev,"Invalid channel %d\n" , - chans[c]); -return -EINVAL ; +if (num_se >0 ) { + ret =device_property_read_u32_array (dev,"st,adc-channels" , chans, num_se); +if (ret) { +dev_err (&indio_dev->dev,"Failed to get st,adc-channels %d\n" , ret); +return ret; } -/* Channel can't be configured both as single-ended & diff */ -for (i =0 ; i < num_diff; i++) { -if (chans[c] == diff[i].vinp) { -dev_err (&indio_dev->dev,"channel %d misconfigured\n" , chans[c]); +for (c =0 ; c < num_se; c++) { +if (chans[c] >= adc_info->max_channels) { +dev_err (&indio_dev->dev,"Invalid channel %d\n" , + chans[c]);return -EINVAL ; } + +/* Channel can't be configured both as single-ended & diff */ +for (i =0 ; i < num_diff; i++) { +if (chans[c] == diff[i].vinp) { +dev_err (&indio_dev->dev,"channel %d misconfigured\n" , + chans[c]); +return -EINVAL ; + } + } +stm32_adc_chan_init_one (indio_dev, &channels[scan_index], + chans[c],0 , scan_index, false); + scan_index++; } -stm32_adc_chan_init_one (indio_dev, &channels[scan_index], - chans[c],0 , scan_index, false); - scan_index++; }if (adc->nsmps >0 ) {
@@ -2153,7 +2157,7 @@ static int stm32_adc_chan_fw_init(structif (legacy) ret =stm32_adc_legacy_chan_init (indio_dev, adc, channels, - num_channels); + timestamping ? num_channels -1 : num_channels);else ret =stm32_adc_generic_chan_init (indio_dev, adc, channels);if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 149/225 iio: adc: ad_sigma_delta: Fix IRQ issue by setting IRQ_DISABLE_UNLAZY flag
In reply to Greg Kroah-HartmanFrom: Masahiro Honda <[email protected]>
commit 626d312028bec44209d0ecd5beaa9b1aa8945f7d upstream.
The Sigma-Delta ADCs supported by this driver can use SDO as an interrupt line to indicate the completion of a conversion. However, some devices cannot properly detect the completion of a conversion by an interrupt. This is for the reason mentioned in the following commit.
commit e9849777d0e2 ("genirq: Add flag to force mask in
disable_irq[_nosync]()")
A read operation is performed by an extra interrupt before the completion of a conversion. At this time, the value read from the ADC data register is the same as the previous conversion result. This patch fixes the issue by setting IRQ_DISABLE_UNLAZY flag.
--- drivers/iio/adc/ad_sigma_delta.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/iio/adc/ad_sigma_delta.c +4 -0
@@ -584,6 +584,10 @@ static int devm_ad_sd_probe_trigger(struinit_completion (&sigma_delta->completion); sigma_delta->irq_dis = true; + +/* the IRQ core clears IRQ_DISABLE_UNLAZY flag when freeing an IRQ */ +irq_set_status_flags (sigma_delta->spi->irq,IRQ_DISABLE_UNLAZY ); + ret = devm_request_irq(dev, sigma_delta->spi->irq, ad_sd_data_rdy_trig_poll, sigma_delta->info->irq_flags | IRQF_NO_AUTOEN,
Greg Kroah-Hartman
maintainerPATCH 150/225 iio: dac: mcp4725: Fix i2c_master_send() return value handling
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
commit 09d3bec7009186bdba77039df01e5834788b3f95 upstream.
The i2c_master_send() returns number of sent bytes on success, or negative on error. The suspend/resume callbacks expect zero on success and non-zero on error. Adapt the return value of the i2c_master_send() to the expectation of the suspend and resume callbacks, including proper validation of the return value.
--- drivers/iio/dac/mcp4725.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/iio/dac/mcp4725.c +14 -2
@@ -47,12 +47,18 @@ static int mcp4725_suspend(struct devicestruct mcp4725_data *data =iio_priv (i2c_get_clientdata (to_i2c_client (dev)));u8 outbuf[2 ]; +int ret; outbuf[0 ] = (data->powerdown_mode +1 ) <<4 ; outbuf[1 ] =0 ; data->powerdown = true; -return i2c_master_send (data->client, outbuf,2 ); + ret =i2c_master_send (data->client, outbuf,2 ); +if (ret <0 ) +return ret; +else if (ret !=2 ) +return -EIO ; +return 0 ; }static int mcp4725_resume (struct device *dev)
@@ -60,13 +66,19 @@ static int mcp4725_resume(struct devicestruct mcp4725_data *data =iio_priv (i2c_get_clientdata (to_i2c_client (dev)));u8 outbuf[2 ]; +int ret;/* restore previous DAC value */ outbuf[0 ] = (data->dac_value >>8 ) &0xf ; outbuf[1 ] = data->dac_value &0xff ; data->powerdown = false; -return i2c_master_send (data->client, outbuf,2 ); + ret =i2c_master_send (data->client, outbuf,2 ); +if (ret <0 ) +return ret; +else if (ret !=2 ) +return -EIO ; +return 0 ; } static DEFINE_SIMPLE_DEV_PM_OPS(mcp4725_pm_ops, mcp4725_suspend, mcp4725_resume);
Greg Kroah-Hartman
maintainerPATCH 151/225 iio: addac: ad74413: fix resistance input processing
In reply to Greg Kroah-HartmanFrom: Rasmus Villemoes <[email protected]>
commit 24febc99ca725dcf42d57168a2f4e8a75a5ade92 upstream.
On success, ad74413r_get_single_adc_result() returns IIO_VAL_INT aka
1. So currently, the IIO_CHAN_INFO_PROCESSED case is effectively equivalent to the IIO_CHAN_INFO_RAW case, and we never call ad74413r_adc_to_resistance_result() to convert the adc measurement to ohms.
Check ret for being negative rather than non-zero.
--- drivers/iio/addac/ad74413r.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/addac/ad74413r.c +1 -1
@@ -973,7 +973,7 @@ static int ad74413r_read_raw(struct iio_ ret =ad74413r_get_single_adc_result (indio_dev, chan->channel, val); -if (ret) +if (ret <0 )return ret;ad74413r_adc_to_resistance_result (*val, val);
Greg Kroah-Hartman
maintainerPATCH 152/225 iio: adc: ad7192: Change "shorted" channels to differential
In reply to Greg Kroah-HartmanFrom: Paul Cercueil <[email protected]>
commit e55245d115bb9054cb72cdd5dda5660f4484873a upstream.
The AD7192 provides a specific channel configuration where both negative and positive inputs are connected to AIN2. This was represented in the ad7192 driver as a IIO channel with .channel = 2 and .extended_name set to "shorted".
The problem with this approach, is that the driver provided two IIO channels with the identifier .channel = 2; one "shorted" and the other not. This goes against the IIO ABI, as a channel identifier should be unique.
Address this issue by changing "shorted" channels to being differential instead, with channel 2 vs. itself, as we're actually measuring AIN2 vs. itself.
Note that the fix tag is for the commit that moved the driver out of staging. The bug existed before that, but backporting would become very complex further down and unlikely to happen.
--- drivers/iio/adc/ad7192.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/iio/adc/ad7192.c +2 -6
@@ -898,10 +898,6 @@ static const struct iio_info ad7195_info__AD719x_CHANNEL (_si, _channel1,-1 , _address,NULL ,IIO_VOLTAGE , \ BIT(IIO_CHAN_INFO_SCALE), ad7192_calibsys_ext_info) -#define AD719x_SHORTED_CHANNEL (_si, _channel1, _address) \ - __AD719x_CHANNEL(_si, _channel1, -1, _address, "shorted", IIO_VOLTAGE, \ - BIT(IIO_CHAN_INFO_SCALE), ad7192_calibsys_ext_info) -#define AD719x_TEMP_CHANNEL (_si, _address) \ __AD719x_CHANNEL(_si, 0, -1, _address, NULL, IIO_TEMP, 0, NULL)
@@ -909,7 +905,7 @@ static const struct iio_chan_spec ad7192AD719x_DIFF_CHANNEL (0 ,1 ,2 ,AD7192_CH_AIN1P_AIN2M ),AD719x_DIFF_CHANNEL (1 ,3 ,4 ,AD7192_CH_AIN3P_AIN4M ),AD719x_TEMP_CHANNEL (2 ,AD7192_CH_TEMP ), -AD719x_SHORTED_CHANNEL (3 ,2 ,AD7192_CH_AIN2P_AIN2M ), +AD719x_DIFF_CHANNEL (3 ,2 ,2 ,AD7192_CH_AIN2P_AIN2M ),AD719x_CHANNEL (4 ,1 ,AD7192_CH_AIN1 ),AD719x_CHANNEL (5 ,2 ,AD7192_CH_AIN2 ), AD719x_CHANNEL(6, 3, AD7192_CH_AIN3),
@@ -923,7 +919,7 @@ static const struct iio_chan_spec ad7193AD719x_DIFF_CHANNEL (2 ,5 ,6 ,AD7193_CH_AIN5P_AIN6M ),AD719x_DIFF_CHANNEL (3 ,7 ,8 ,AD7193_CH_AIN7P_AIN8M ),AD719x_TEMP_CHANNEL (4 ,AD7193_CH_TEMP ), -AD719x_SHORTED_CHANNEL (5 ,2 ,AD7193_CH_AIN2P_AIN2M ), +AD719x_DIFF_CHANNEL (5 ,2 ,2 ,AD7193_CH_AIN2P_AIN2M ),AD719x_CHANNEL (6 ,1 ,AD7193_CH_AIN1 ),AD719x_CHANNEL (7 ,2 ,AD7193_CH_AIN2 ), AD719x_CHANNEL(8, 3, AD7193_CH_AIN3),
Greg Kroah-Hartman
maintainerPATCH 153/225 iio: adc: stm32-adc: skip adc-diff-channels setup if none is present
In reply to Greg Kroah-HartmanFrom: Sean Nyekjaer <[email protected]>
commit 9c0d6ccd7d6bbd275e390b55a3390b4274291d95 upstream.
If no adc differential channels are defined driver will fail with EINVAL:
stm32-adc: probe of 48003000.adc:adc@0 failed with error -22
Fix this by skipping the initialization if no channels are defined.
This applies only to the legacy way of initializing adc channels.
--- drivers/iio/adc/stm32-adc.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/iio/adc/stm32-adc.c +9 -10
@@ -1882,16 +1882,15 @@ static int stm32_adc_get_legacy_chan_cou* to get the *real* number of channels. */ ret =device_property_count_u32 (dev,"st,adc-diff-channels" ); -if (ret <0 ) -return ret; - - ret /= (int )(sizeof (struct stm32_adc_diff_channel ) /sizeof (u32)); -if (ret > adc_info->max_channels) { -dev_err (&indio_dev->dev,"Bad st,adc-diff-channels?\n" ); -return -EINVAL ; - }else if (ret >0 ) { - adc->num_diff = ret; - num_channels += ret; +if (ret >0 ) { + ret /= (int )(sizeof (struct stm32_adc_diff_channel ) /sizeof (u32)); +if (ret > adc_info->max_channels) { +dev_err (&indio_dev->dev,"Bad st,adc-diff-channels?\n" ); +return -EINVAL ; + }else if (ret >0 ) { + adc->num_diff = ret; + num_channels += ret; + } }/* Optional sample time is provided either for each, or all channels */
Greg Kroah-Hartman
maintainerPATCH 154/225 iio: dac: build ad5758 driver when AD5758 is selected
In reply to Greg Kroah-HartmanFrom: Lukas Bulwahn <[email protected]>
commit a146eccb68be161ae9eab5f3f68bb0ed7c0fbaa8 upstream.
Commit 28d1a7ac2a0d ("iio: dac: Add AD5758 support") adds the config AD5758 and the corresponding driver ad5758.c. In the Makefile, the ad5758 driver is however included when AD5755 is selected, not when AD5758 is selected.
Probably, this was simply a mistake that happened by copy-and-paste and forgetting to adjust the actual line. Surprisingly, no one has ever noticed that this driver is actually only included when AD5755 is selected and that the config AD5758 has actually no effect on the build.
--- drivers/iio/dac/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/dac/Makefile +1 -1
@@ -17,7 +17,7 @@ obj-$(CONFIG_AD5592R_BASE) += ad5592r-ba obj-$(CONFIG_AD5592R) += ad5592r.o obj-$(CONFIG_AD5593R) += ad5593r.o obj-$(CONFIG_AD5755) += ad5755.o -obj-$(CONFIG_AD5755) += ad5758.o +obj-$(CONFIG_AD5758) += ad5758.o obj-$(CONFIG_AD5761) += ad5761.o obj-$(CONFIG_AD5764) += ad5764.o obj-$(CONFIG_AD5766) += ad5766.o
Greg Kroah-Hartman
maintainerPATCH 155/225 net: usb: qmi_wwan: Set DTR quirk for BroadMobi BM818
In reply to Greg Kroah-HartmanFrom: Sebastian Krzyszkowiak <[email protected]>
commit 36936a56e1814f6c526fe71fbf980beab4f5577a upstream.
BM818 is based on Qualcomm MDM9607 chipset.
--- drivers/net/usb/qmi_wwan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/qmi_wwan.c +1 -1
@@ -1324,7 +1324,7 @@ static const struct usb_device_id produc {QMI_FIXED_INTF(0x2001, 0x7e3d, 4)}, /* D-Link DWM-222 A2 */ {QMI_FIXED_INTF(0x2020, 0x2031, 4)}, /* Olicard 600 */ {QMI_FIXED_INTF(0x2020, 0x2033, 4)}, /* BroadMobi BM806U */ - {QMI_FIXED_INTF(0x2020, 0x2060, 4)}, /* BroadMobi BM818 */ + {QMI_QUIRK_SET_DTR(0x2020, 0x2060, 4)}, /* BroadMobi BM818 */ {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */
Greg Kroah-Hartman
maintainerPATCH 156/225 dt-bindings: usb: snps,dwc3: Fix "snps,hsphy_interface" type
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
commit 7b32040f6d7f885ffc09a6df7c17992d56d2eab8 upstream.
The "snps,hsphy_interface" is string, not u8. Fix the type.
--- Documentation/devicetree/bindings/usb/snps,dwc3.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/devicetree/bindings/usb/snps,dwc3.yaml +1 -1
@@ -260,7 +260,7 @@ properties: description: High-Speed PHY interface selection between UTMI+ and ULPI when the DWC_USB3_HSPHY_INTERFACE has value 3. - $ref: /schemas/types.yaml#/definitions/uint8 + $ref: /schemas/types.yaml#/definitions/string enum: [utmi, ulpi] snps,quirk-frame-length-adjustment:
Greg Kroah-Hartman
maintainerPATCH 157/225 usb: cdns3: fix NCM gadget RX speed 20x slow than expection at iMX8QM
In reply to Greg Kroah-HartmanFrom: Frank Li <[email protected]>
commit dbe678f6192f27879ac9ff6bc7a1036aad85aae9 upstream.
At iMX8QM platform, enable NCM gadget and run 'iperf3 -s'. At host, run 'iperf3 -V -c fe80::6863:98ff:feef:3e0%enxc6e147509498'
[ 5] 0.00-1.00 sec 1.55 MBytes 13.0 Mbits/sec 90 4.18 KBytes [ 5] 1.00-2.00 sec 1.44 MBytes 12.0 Mbits/sec 75 4.18 KBytes [ 5] 2.00-3.00 sec 1.48 MBytes 12.4 Mbits/sec 75 4.18 KBytes
Expected speed should be bigger than 300Mbits/sec.
The root cause of this performance drop was found to be data corruption happening at 4K borders in some Ethernet packets, leading to TCP checksum errors. This corruption occurs from the position (4K - (address & 0x7F)) to 4K. The u_ether function's allocation of skb_buff reserves 64B, meaning all RX addresses resemble 0xXXXX0040.
Force trb_burst_size to 16 can fix this problem.
--- drivers/usb/cdns3/cdns3-gadget.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/usb/cdns3/cdns3-gadget.c +13 -0
@@ -2097,6 +2097,19 @@ int cdns3_ep_config(struct cdns3_endpoinelse priv_ep->trb_burst_size =16 ; +/* +* In versions preceding DEV_VER_V2, for example, iMX8QM, there exit the bugs +* in the DMA. These bugs occur when the trb_burst_size exceeds 16 and the +* address is not aligned to 128 Bytes (which is a product of the 64-bit AXI +* and AXI maximum burst length of 16 or 0xF+1, dma_axi_ctrl0[3:0]). This +* results in data corruption when it crosses the 4K border. The corruption +* specifically occurs from the position (4K - (address & 0x7F)) to 4K. +* +* So force trb_burst_size to 16 at such platform. +*/ +if (priv_dev->dev_ver <DEV_VER_V2 ) + priv_ep->trb_burst_size =16 ; + mult =min_t (u8, mult,EP_CFG_MULT_MAX ); buffering =min_t (u8, buffering,EP_CFG_BUFFERING_MAX ); maxburst =min_t (u8, maxburst,EP_CFG_MAXBURST_MAX );
Greg Kroah-Hartman
maintainerPATCH 158/225 usb: gadget: f_fs: Add unbind event before functionfs_unbind
In reply to Greg Kroah-HartmanFrom: Uttkarsh Aggarwal <[email protected]>
commit efb6b535207395a5c7317993602e2503ca8cb4b3 upstream.
While exercising the unbind path, with the current implementation the functionfs_unbind would be calling which waits for the ffs->mutex to be available, however within the same time ffs_ep0_read is invoked & if no setup packets are pending, it will invoke function wait_event_interruptible_exclusive_locked_irq which by definition waits for the ev.count to be increased inside the same mutex for which functionfs_unbind is waiting.
This creates deadlock situation because the functionfs_unbind won't get the lock until ev.count is increased which can only happen if the caller ffs_func_unbind can proceed further.
Following is the illustration:
CPU1 CPU2
ffs_func_unbind() ffs_ep0_read()
mutex_lock(ffs->mutex) wait_event(ffs->ev.count)
functionfs_unbind()
mutex_lock(ffs->mutex)
mutex_unlock(ffs->mutex)
ffs_event_add()
<deadlock>
Fix this by moving the event unbind before functionfs_unbind to ensure the ev.count is incrased properly.
--- drivers/usb/gadget/function/f_fs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/function/f_fs.c +1 -1
@@ -3620,6 +3620,7 @@ static void ffs_func_unbind(struct usb_c/* Drain any pending AIO completions */ drain_workqueue (ffs->io_completion_wq); +ffs_event_add (ffs,FUNCTIONFS_UNBIND );if (!--opts->refcnt)functionfs_unbind (ffs);
@@ -3644,7 +3645,6 @@ static void ffs_func_unbind(struct usb_c func->function.ssp_descriptors =NULL ; func->interfaces_nums =NULL ; -ffs_event_add (ffs,FUNCTIONFS_UNBIND ); }static struct usb_function *ffs_alloc (struct usb_function_instance *fi)
Greg Kroah-Hartman
maintainerPATCH 159/225 md/raid5: fix miscalculation of end_sector in raid5_read_one_chunk()
In reply to Greg Kroah-HartmanFrom: Yu Kuai <[email protected]>
commit 8557dc27126949c702bd3aafe8a7e0b7e4fcb44c upstream.
'end_sector' is compared to 'rdev->recovery_offset', which is offset to rdev, however, commit e82ed3a4fbb5 ("md/raid6: refactor raid5_read_one_chunk") changes the calculation of 'end_sector' to offset to the array. Fix this miscalculation.
--- drivers/md/raid5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/raid5.c +1 -1
@@ -5516,7 +5516,7 @@ static int raid5_read_one_chunk(struct m sector =raid5_compute_sector (conf, raid_bio->bi_iter.bi_sector,0 , &dd_idx,NULL ); - end_sector =bio_end_sector (raid_bio); + end_sector = sector +bio_sectors (raid_bio);rcu_read_lock ();if (r5c_big_stripe_cached (conf, sector))