5.15.116-rc1 review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 5.15.116-rc1 review
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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/v5.x/stable-review/patch-5.15.116-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-5.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.15.116-rc1
Mustafa Ismail <[email protected]>
RDMA/irdma: Do not generate SW completions for NOPs
Shiraz Saleem <[email protected]>
RDMA/irdma: Fix drain SQ hang with no completion
Arnd Bergmann <[email protected]>
ARM: defconfig: drop CONFIG_DRM_RCAR_LVDS
Theodore Ts'o <[email protected]>
ext4: enable the lazy init thread when remounting read/write
Matthieu Baerts <[email protected]>
selftests: mptcp: join: skip if MPTCP is not supported
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
Bas Nieuwenhuizen <[email protected]>
drm/amdgpu/gfx10: Disable gfxoff before disabling powergating.
Ben Hutchings <[email protected]>
scsi: dpt_i2o: Do not process completions with invalid addresses
Ben Hutchings <[email protected]>
scsi: dpt_i2o: Remove broken pass-through ioctl (I2OUSERCMD)
Arnd Bergmann <[email protected]>
drm/rcar: stop using 'imply' for dependencies
Lino Sanfilippo <[email protected]>
tpm, tpm_tis: Request threaded interrupt handler
Jim Wylder <[email protected]>
regmap: Account for register length when chunking
Roberto Sassu <[email protected]>
KEYS: asymmetric: Copy sig and digest in public_key_verify_signature()
Namjae Jeon <[email protected]>
ksmbd: fix incorrect AllocationSize set in smb2_get_info
Namjae Jeon <[email protected]>
ksmbd: fix credit count leakage
Sean Christopherson <[email protected]>
KVM: x86: Account fastpath-only VM-Exits in vCPU stats
Mirsad Goran Todorovac <[email protected]>
test_firmware: fix the memory leak of the allocated firmware buffer
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()
Matthieu Baerts <[email protected]>
selftests: mptcp: sockopt: 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
Paul Moore <[email protected]>
selinux: don't use make's grouped targets feature yet
Damien Le Moal <[email protected]>
block: fix revalidate performance regression
Frank Li <[email protected]>
usb: cdns3: fix NCM gadget RX speed 20x slow than expection at iMX8QM
Frank Li <[email protected]>
usb: cdns3: allocate TX FIFO size according to composite EP number
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
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
Jiri Slaby (SUSE) <[email protected]>
block/blk-iocost (gcc13): keep large values in a new enum
Kees Cook <[email protected]>
ath6kl: Use struct_group() to avoid size-mismatched casting
Kees Cook <[email protected]>
x86/boot: Wrap literal addresses in absolute_pointer()
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 and fclk clocks levels for vangogh
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
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
Paul Cercueil <[email protected]>
iio: adc: ad7192: Change "shorted" channels to differential
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
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
Dan Carpenter <[email protected]>
mailbox: mailbox-test: fix a locking issue in mbox_test_message_write()
Daniel Smith <[email protected]>
nvme-pci: Add quirk for Teamgroup MP33 SSD
Guchun Chen <[email protected]>
drm/amdgpu: skip disabling fence driver src_irqs when device is unplugged
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
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
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
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
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
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
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
Bob Peterson <[email protected]>
gfs2: Don't deref jdesc in evict
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
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
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"
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
Hangyu Hua <[email protected]>
net/sched: flower: fix possible OOB write in fl_set_geneve_opt()
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
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
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
Mustafa Ismail <[email protected]>
RDMA/irdma: Add SW mechanism to generate completions on error
Arnd Bergmann <[email protected]>
mtd: rawnand: ingenic: fix empty stub helper definitions
Raju Rangoju <[email protected]>
amd-xgbe: fix the false linkup in xgbe_phy_status
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
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
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()
Tudor Ambarus <[email protected]>
dmaengine: at_xdmac: Move the free desc to the tail of the desc list
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
Yonatan Nachum <[email protected]>
RDMA/efa: Fix unsupported page sizes in device
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/tas2764.yaml | 6 +- .../devicetree/bindings/sound/tas2770.yaml | 6 +- .../devicetree/bindings/usb/snps,dwc3.yaml | 2 +- Makefile | 4 +- arch/arm/boot/dts/stm32f7-pinctrl.dtsi | 82 ++++++ arch/arm/configs/multi_v7_defconfig | 1 - arch/arm/kernel/unwind.c | 25 +- arch/arm64/kernel/vdso.c | 2 +- arch/arm64/mm/fault.c | 4 +- arch/powerpc/platforms/pseries/iommu.c | 13 +- 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/boot/boot.h | 36 ++- arch/x86/boot/main.c | 2 +- arch/x86/kvm/x86.c | 3 + block/blk-iocost.c | 2 + block/blk-settings.c | 3 +- crypto/asymmetric_keys/public_key.c | 38 +-- drivers/acpi/resource.c | 12 + drivers/ata/libata-scsi.c | 34 ++- drivers/base/regmap/regmap.c | 6 +- drivers/block/nbd.c | 4 +- drivers/block/rnbd/rnbd-proto.h | 2 +- drivers/char/tpm/tpm_tis_core.c | 7 +- drivers/dma/at_xdmac.c | 26 +- drivers/dma/pl330.c | 8 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 39 +-- drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 3 +- drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 8 +- 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/yellow_carp_ppt.c | 5 +- drivers/gpu/drm/ast/ast_main.c | 9 +- drivers/gpu/drm/msm/msm_iommu.c | 7 +- drivers/gpu/drm/rcar-du/Kconfig | 25 +- drivers/hid/hid-google-hammer.c | 2 + drivers/hid/hid-ids.h | 1 + drivers/hid/wacom_wac.c | 2 +- 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/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 | 8 +- drivers/infiniband/hw/hns/hns_roce_mr.c | 43 ++++ drivers/infiniband/hw/irdma/hw.c | 31 ++- drivers/infiniband/hw/irdma/utils.c | 150 +++++++++++ drivers/infiniband/hw/irdma/verbs.c | 66 +++-- drivers/infiniband/hw/irdma/verbs.h | 13 +- drivers/iommu/amd/iommu.c | 5 +- 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 +- drivers/media/platform/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/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 | 2 +- .../ethernet/mellanox/mlxbf_gige/mlxbf_gige_rx.c | 13 +- drivers/net/usb/qmi_wwan.c | 2 +- drivers/net/wireless/ath/ath6kl/htc.h | 15 +- drivers/net/wireless/ath/ath6kl/htc_mbox.c | 15 +- drivers/net/wireless/broadcom/b43/b43.h | 2 +- .../net/wireless/broadcom/b43legacy/b43legacy.h | 2 +- drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 + .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 +- drivers/nvme/host/hwmon.c | 4 +- drivers/nvme/host/multipath.c | 1 - drivers/nvme/host/nvme.h | 5 + drivers/nvme/host/pci.c | 6 + drivers/platform/x86/intel_scu_pcidrv.c | 1 + drivers/s390/crypto/pkey_api.c | 3 + drivers/scsi/Kconfig | 2 +- drivers/scsi/dpt_i2o.c | 278 +-------------------- drivers/scsi/dpti.h | 1 - drivers/scsi/scsi_lib.c | 2 + drivers/scsi/stex.c | 4 + drivers/tty/serial/8250/8250_tegra.c | 4 +- drivers/tty/serial/fsl_lpuart.c | 44 ++-- drivers/usb/cdns3/cdns3-gadget.c | 60 ++++- drivers/usb/cdns3/cdns3-gadget.h | 9 +- 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/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/smb2pdu.c | 27 +- include/media/dvb_net.h | 4 + include/media/dvbdev.h | 15 ++ include/net/sock.h | 4 + kernel/trace/trace_probe.h | 2 +- lib/test_firmware.c | 19 +- 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/mac80211/chan.c | 2 +- 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/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/soc/codecs/ssm2602.c | 15 ++ sound/soc/dwc/dwc-i2s.c | 4 +- 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 | 4 + 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 + 167 files changed, 1544 insertions(+), 779 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/159 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 ) {
drivers/infiniband/hw/bnxt_re/qplib_sp.c +3 -4
@@ -680,16 +680,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/159 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
@@ -1334,7 +1334,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 3/159 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
@@ -34,6 +34,7 @@#include <linux/platform_device.h> #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"
@@ -938,6 +939,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) {
@@ -946,6 +985,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 4/159 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
@@ -4393,11 +4393,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 5/159 dmaengine: at_xdmac: Move the free desc to the tail of the desc list
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
[ Upstream commit 801db90bf294f647b967e8d99b9ae121bea63d0d ]
Move the free desc to the tail of the list, so that the sequence of descriptors is more track-able in case of debug. One would know which descriptor should come next and could easier catch concurrency over descriptors for example. virt-dma uses list_splice_tail_init() as well, follow the core driver.
Stable-dep-of: 4d43acb145c3 ("dmaengine: at_xdmac: fix potential Oops in at_xdmac_prep_interleaved()")
--- drivers/dma/at_xdmac.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
drivers/dma/at_xdmac.c +14 -9
@@ -732,7 +732,8 @@ at_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,if (!desc) {dev_err (chan2dev (chan),"can't get descriptor\n" );if (first) -list_splice_init (&first->descs_list, &atchan->free_descs_list); +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list); goto spin_unlock; }
@@ -820,7 +821,8 @@ at_xdmac_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr,if (!desc) {dev_err (chan2dev (chan),"can't get descriptor\n" );if (first) -list_splice_init (&first->descs_list, &atchan->free_descs_list); +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list);spin_unlock_irqrestore (&atchan->lock, irqflags);return NULL ; }
@@ -1054,8 +1056,8 @@ at_xdmac_prep_interleaved(struct dma_chan *chan, src_addr, dst_addr, xt, chunk);if (!desc) { -list_splice_init (&first->descs_list, - &atchan->free_descs_list); +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list);return NULL ; }
@@ -1135,7 +1137,8 @@ at_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,if (!desc) {dev_err (chan2dev (chan),"can't get descriptor\n" );if (first) -list_splice_init (&first->descs_list, &atchan->free_descs_list); +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list);return NULL ; }
@@ -1311,8 +1314,8 @@ at_xdmac_prep_dma_memset_sg(struct dma_chan *chan, struct scatterlist *sgl,sg_dma_len (sg), value);if (!desc && first) -list_splice_init (&first->descs_list, - &atchan->free_descs_list); +list_splice_tail_init (&first->descs_list, + &atchan->free_descs_list);if (!first) first = desc;
@@ -1709,7 +1712,8 @@ static void at_xdmac_tasklet(struct tasklet_struct *t)spin_lock_irq (&atchan->lock);/* Move the xfer descriptors into the free descriptors list. */ -list_splice_init (&desc->descs_list, &atchan->free_descs_list); +list_splice_tail_init (&desc->descs_list, + &atchan->free_descs_list);at_xdmac_advance_work (atchan);spin_unlock_irq (&atchan->lock); }
@@ -1858,7 +1862,8 @@ static int at_xdmac_device_terminate_all(struct dma_chan *chan)/* Cancel all pending transfers. */ list_for_each_entry_safe (desc, _desc, &atchan->xfers_list, xfer_node) {list_del (&desc->xfer_node); -list_splice_init (&desc->descs_list, &atchan->free_descs_list); +list_splice_tail_init (&desc->descs_list, + &atchan->free_descs_list); }clear_bit (AT_XDMAC_CHAN_IS_PAUSED , &atchan->status);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 6/159 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 7/159 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
@@ -2041,6 +2041,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 );
@@ -2052,11 +2058,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 8/159 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
@@ -3235,9 +3235,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 9/159 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 10/159 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
@@ -3316,8 +3316,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 11/159 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 12/159 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
@@ -572,9 +572,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 13/159 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 14/159 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
@@ -5008,8 +5008,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;
@@ -5025,6 +5025,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;
@@ -5032,7 +5051,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; }
@@ -5051,6 +5069,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);
@@ -5110,8 +5134,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 15/159 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 16/159 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 17/159 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
@@ -3259,7 +3259,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)
@@ -3277,7 +3277,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 18/159 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 19/159 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 20/159 RDMA/irdma: Add SW mechanism to generate completions on error
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
[ Upstream commit 81091d7696ae71627ff80bbf2c6b0986d2c1cce3 ]
HW flushes after QP in error state is not reliable. This can lead to
application hang waiting on a completion for outstanding WRs. Implement a
SW mechanism to generate completions for any outstanding WR's after the QP is modified to error.
This is accomplished by starting a delayed worker after the QP is modified to error and the HW flush is performed. The worker will generate completions that will be returned to the application when it polls the CQ. This mechanism only applies to Kernel applications.
Stable-dep-of: c8f304d75f6c ("RDMA/irdma: Prevent QP use after free")
--- drivers/infiniband/hw/irdma/hw.c | 31 +++--- drivers/infiniband/hw/irdma/utils.c | 147 ++++++++++++++++++++++++++++ drivers/infiniband/hw/irdma/verbs.c | 56 ++++++----- drivers/infiniband/hw/irdma/verbs.h | 13 ++- 4 files changed, 210 insertions(+), 37 deletions(-)
drivers/infiniband/hw/irdma/hw.c +18 -13
@@ -62,7 +62,7 @@ static void irdma_iwarp_ce_handler(struct irdma_sc_cq *iwcq)struct irdma_cq *cq = iwcq->back_cq;if (!cq->user_mode) - cq->armed = false; +atomic_set (&cq->armed,0 );if (cq->ibcq.comp_handler) cq->ibcq.comp_handler (&cq->ibcq, cq->ibcq.cq_context); }
@@ -2711,24 +2711,29 @@ void irdma_flush_wqes(struct irdma_qp *iwqp, u32 flush_mask) info.sq = flush_mask &IRDMA_FLUSH_SQ ; info.rq = flush_mask &IRDMA_FLUSH_RQ ; -if (flush_mask &IRDMA_REFLUSH ) { -if (info.sq) - iwqp->sc_qp.flush_sq = false; -if (info.rq) - iwqp->sc_qp.flush_rq = false; - } -/* Generate userflush errors in CQE */ info.sq_major_code =IRDMA_FLUSH_MAJOR_ERR ; info.sq_minor_code =FLUSH_GENERAL_ERR ; info.rq_major_code =IRDMA_FLUSH_MAJOR_ERR ; info.rq_minor_code =FLUSH_GENERAL_ERR ; info.userflushcode = true; -if (flush_code) { -if (info.sq && iwqp->sc_qp.sq_flush_code) - info.sq_minor_code = flush_code; -if (info.rq && iwqp->sc_qp.rq_flush_code) - info.rq_minor_code = flush_code; + +if (flush_mask &IRDMA_REFLUSH ) { +if (info.sq) + iwqp->sc_qp.flush_sq = false; +if (info.rq) + iwqp->sc_qp.flush_rq = false; + }else { +if (flush_code) { +if (info.sq && iwqp->sc_qp.sq_flush_code) + info.sq_minor_code = flush_code; +if (info.rq && iwqp->sc_qp.rq_flush_code) + info.rq_minor_code = flush_code; + } +if (!iwqp->user_mode) +queue_delayed_work (iwqp->iwdev->cleanup_wq, + &iwqp->dwork_flush, +msecs_to_jiffies (IRDMA_FLUSH_DELAY_MS )); }/* Issue flush */
drivers/infiniband/hw/irdma/utils.c +147 -0
150 lines not on this page · raw message
drivers/infiniband/hw/irdma/verbs.c +33 -23
150 lines not on this page · raw message
drivers/infiniband/hw/irdma/verbs.h +12 -1
@@ -4,6 +4,7 @@#define IRDMA_VERBS_H #define IRDMA_MAX_SAVED_PHY_PGADDR 4 +#define IRDMA_FLUSH_DELAY_MS 20#define IRDMA_PKEY_TBL_SZ 1#define IRDMA_DEFAULT_PKEY 0xFFFF
@@ -110,7 +111,7 @@ struct irdma_cq {u16 cq_size;u16 cq_num;bool user_mode; -bool armed; +atomic_t armed;enum irdma_cmpl_notify last_notify;u32 polled_cmpls;u32 cq_mem_size;
@@ -121,6 +122,12 @@ struct irdma_cq {struct irdma_pbl *iwpbl_shadow;struct list_head resize_list;struct irdma_cq_poll_info cur_cqe; +struct list_head cmpl_generated; +}; + +struct irdma_cmpl_gen { +struct list_head list; +struct irdma_cq_poll_info cpi; };struct disconn_work {
@@ -161,6 +168,7 @@ struct irdma_qp {refcount_t refcnt;struct iw_cm_id *cm_id;struct irdma_cm_node *cm_node; +struct delayed_work dwork_flush;struct ib_mr *lsmm_mr;atomic_t hw_mod_qp_pend;enum ib_qp_state ibqp_state;
@@ -224,4 +232,7 @@ int irdma_ib_register_device(struct irdma_device *iwdev);void irdma_ib_unregister_device (struct irdma_device *iwdev);void irdma_ib_dealloc_device (struct ib_device *ibdev);void irdma_ib_qp_event (struct irdma_qp *iwqp,enum irdma_qp_event_type event); +void irdma_generate_flush_completions (struct irdma_qp *iwqp); +void irdma_remove_cmpls_list (struct irdma_cq *iwcq); +int irdma_generated_cmpls (struct irdma_cq *iwcq,struct irdma_cq_poll_info *cq_poll_info);#endif /* IRDMA_VERBS_H */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 21/159 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
@@ -509,11 +509,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);
@@ -521,6 +516,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 22/159 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
@@ -3196,6 +3196,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; ret =irdma_uk_stag_local_invalidate (ukqp, &info, true);if (ret)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 23/159 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
@@ -3159,6 +3159,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) {
@@ -3259,7 +3262,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)
@@ -3276,8 +3279,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 24/159 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
@@ -334,6 +334,7 @@ struct bpf_local_storage;* @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
@@ -418,6 +419,7 @@ struct sock {unsigned int sk_napi_id;#endif int sk_rcvbuf; +int sk_wait_pending;struct sk_filter __rcu *sk_filter;union {
@@ -1115,6 +1117,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) { \
@@ -1124,6 +1127,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
@@ -587,6 +587,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_*.
@@ -602,6 +603,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
@@ -963,6 +963,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 ;
net/ipv4/tcp.c +6 -0
@@ -2972,6 +2972,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 25/159 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
@@ -3967,7 +3967,8 @@ static 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 26/159 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 27/159 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 28/159 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
@@ -1223,7 +1223,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 29/159 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
@@ -1589,6 +1589,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 30/159 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
@@ -1599,6 +1599,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 31/159 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
@@ -1789,7 +1789,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 32/159 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
@@ -2165,7 +2165,6 @@ void sk_setup_caps(struct sock *sk, stru {u32 max_segs =1 ; -sk_dst_set (sk, dst); sk->sk_route_caps = dst->dev->features | sk->sk_route_forced_caps;if (sk->sk_route_caps &NETIF_F_GSO ) sk->sk_route_caps |=NETIF_F_GSO_SOFTWARE ;
@@ -2180,6 +2179,7 @@ void sk_setup_caps(struct sock *sk, stru } } sk->sk_gso_max_segs = max_segs; +sk_dst_set (sk, dst); }EXPORT_SYMBOL_GPL (sk_setup_caps);
Greg Kroah-Hartman
maintainerPATCH 33/159 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
@@ -140,10 +140,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 ;
@@ -161,14 +159,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 34/159 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
@@ -781,7 +781,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:
@@ -1003,6 +1002,7 @@ static int mlx5_function_setup(struct mlx5_core_dev *dev, bool boot) goto err_cmd_cleanup; } + dev->caps.embedded_cpu =mlx5_read_embedded_cpu (dev);mlx5_cmd_set_state (dev,MLX5_CMDIF_STATE_UP ); err =mlx5_core_enable_hca (dev,0 );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 35/159 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
@@ -1092,6 +1092,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 36/159 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
@@ -6432,7 +6432,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) goto out; }if (chip->reset) -usleep_range (1000 ,2000 ); +usleep_range (10000 ,20000 ); err =mv88e6xxx_detect (chip);if (err)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 37/159 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
@@ -2443,6 +2443,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 38/159 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
@@ -2885,10 +2885,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 39/159 rtnetlink: call validate_linkmsg in rtnl_create_link
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit b0ad3c179059089d809b477a1d445c1183a7b8fe ]
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
@@ -3155,6 +3155,7 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname,struct 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 ]);
@@ -3190,13 +3191,18 @@ struct net_device *rtnl_create_link(struct net *net, const char *ifname,if (!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) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 40/159 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
@@ -2509,8 +2509,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; }
@@ -3755,18 +3753,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;
@@ -3845,8 +3831,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)
@@ -3881,6 +3869,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 41/159 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 42/159 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
@@ -230,6 +230,7 @@ enum {AZX_DRIVER_ATI ,AZX_DRIVER_ATIHDMI ,AZX_DRIVER_ATIHDMI_NS , +AZX_DRIVER_GFHDMI ,AZX_DRIVER_VIA ,AZX_DRIVER_SIS , AZX_DRIVER_ULI,
@@ -352,6 +353,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",
@@ -1742,6 +1744,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 ;
@@ -1857,6 +1865,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 )
@@ -1957,6 +1971,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 ;
@@ -2694,6 +2709,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
@@ -4298,6 +4298,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 */
@@ -4392,6 +4408,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 43/159 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
@@ -3494,6 +3494,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;
@@ -3693,7 +3694,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 44/159 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 45/159 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
@@ -423,11 +423,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 46/159 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
@@ -2907,6 +2907,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;
@@ -3150,6 +3151,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 47/159 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
@@ -301,6 +301,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. */
@@ -354,7 +377,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 48/159 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/rcar-vin/rcar-dma.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/media/platform/rcar-vin/rcar-dma.c +1 -3
@@ -644,11 +644,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 49/159 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 50/159 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
@@ -1381,6 +1381,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 51/159 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
@@ -1346,7 +1346,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;
@@ -1419,7 +1419,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" );
@@ -1455,12 +1455,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)
@@ -1523,10 +1524,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 52/159 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 53/159 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 54/159 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
@@ -1605,7 +1605,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 ;
@@ -1631,7 +1631,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 55/159 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 u32 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 56/159 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
@@ -3403,6 +3403,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 57/159 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
@@ -3368,6 +3368,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 58/159 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 59/159 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 60/159 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
@@ -3238,7 +3238,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);
@@ -3249,7 +3249,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); }/*
@@ -3261,7 +3262,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;
@@ -3271,7 +3272,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 )
@@ -3648,7 +3649,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 61/159 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/tas2764.yaml | 6 ++++-- Documentation/devicetree/bindings/sound/tas2770.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/tas2764.yaml +4 -2
@@ -46,7 +46,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
@@ -63,7 +65,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>;
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>;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 62/159 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 63/159 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
@@ -125,12 +125,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 ;
@@ -310,7 +310,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 */
@@ -346,6 +345,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 64/159 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 65/159 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 66/159 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 67/159 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 68/159 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 69/159 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 70/159 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 71/159 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 72/159 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 73/159 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
@@ -800,7 +800,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 74/159 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 75/159 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
@@ -37,6 +37,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 );
@@ -462,14 +463,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__);
@@ -477,18 +479,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 ));
@@ -499,20 +528,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);
@@ -521,41 +550,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);
@@ -584,7 +619,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); }
@@ -1090,9 +1124,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 76/159 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 77/159 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 78/159 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
@@ -1286,6 +1286,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 ;
@@ -1419,6 +1420,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 ;
@@ -1545,6 +1547,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 79/159 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
@@ -96,7 +96,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))
@@ -105,9 +105,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);
@@ -124,25 +125,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 80/159 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
@@ -470,6 +470,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;
@@ -486,6 +497,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 81/159 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
@@ -4045,6 +4045,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
@@ -6000,7 +6001,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);
@@ -6046,6 +6047,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 82/159 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 83/159 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
@@ -473,8 +473,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 84/159 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
@@ -314,7 +314,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 85/159 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
@@ -563,7 +563,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 86/159 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
@@ -1476,6 +1476,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 ; }
@@ -1508,6 +1509,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 87/159 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 88/159 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
@@ -2992,7 +2992,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) {
@@ -3471,10 +3473,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 89/159 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
@@ -821,7 +821,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 90/159 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 91/159 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
@@ -157,7 +157,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 92/159 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 93/159 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
@@ -561,7 +561,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 94/159 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
@@ -3407,6 +3407,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 95/159 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 96/159 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
@@ -530,14 +530,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 ];/* Some devices report a format that doesn't match what they
@@ -945,7 +948,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 ) {
@@ -959,7 +962,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 97/159 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
@@ -1212,12 +1212,12 @@ static int apply_acpi_orientation(struct adev =ACPI_COMPANION (adata->dev);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 98/159 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 99/159 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
@@ -590,6 +590,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
@@ -502,6 +502,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 100/159 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
@@ -831,7 +831,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 101/159 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 102/159 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 103/159 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 104/159 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
@@ -490,6 +490,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 105/159 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 __maybe_unused mcp4725_suspenstruct 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 __maybe_unused mcp4725_resume (struct device *dev)
@@ -60,13 +66,19 @@ static int __maybe_unused mcp4725_resumestruct 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 SIMPLE_DEV_PM_OPS(mcp4725_pm_ops, mcp4725_suspend, mcp4725_resume);
Greg Kroah-Hartman
maintainerPATCH 106/159 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
@@ -835,10 +835,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)
@@ -846,7 +842,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),
@@ -860,7 +856,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 107/159 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
@@ -16,7 +16,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 108/159 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
@@ -1321,7 +1321,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 109/159 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
@@ -240,7 +240,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 110/159 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 111/159 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
@@ -5408,7 +5408,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))
Greg Kroah-Hartman
maintainerPATCH 112/159 misc: fastrpc: return -EPIPE to invocations on device removal
In reply to Greg Kroah-HartmanFrom: Richard Acayan <[email protected]>
commit b6a062853ddf6b4f653af2d8b75ba45bb9a036ad upstream.
The return value is initialized as -1, or -EPERM. The completion of an invocation implies that the return value is set appropriately, but "Permission denied" does not accurately describe the outcome of the invocation. Set the invocation's return value to a more appropriate "Broken pipe", as the cleanup breaks the driver's connection with rpmsg.
--- drivers/misc/fastrpc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/misc/fastrpc.c +3 -1
@@ -1677,8 +1677,10 @@ static void fastrpc_notify_users(structstruct fastrpc_invoke_ctx *ctx;spin_lock (&user->lock); -list_for_each_entry (ctx, &user->pending, node) +list_for_each_entry (ctx, &user->pending, node) { + ctx->retval = -EPIPE ;complete (&ctx->work); + }spin_unlock (&user->lock); }
Greg Kroah-Hartman
maintainerPATCH 113/159 misc: fastrpc: reject new invocations during device removal
In reply to Greg Kroah-HartmanFrom: Richard Acayan <[email protected]>
commit 46248400d81e2aa0b65cd659d6f40188192a58b6 upstream.
The channel's rpmsg object allows new invocations to be made. After old invocations are already interrupted, the driver shouldn't try to invoke anymore. Invalidating the rpmsg at the end of the driver removal function makes it easy to cause a race condition in userspace. Even closing a file descriptor before the driver finishes its cleanup can cause an invocation via fastrpc_release_current_dsp_process() and subsequent timeout.
Invalidate the channel before the invocations are interrupted to make sure that no invocations can be created to hang after the device closes.
--- drivers/misc/fastrpc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/misc/fastrpc.c +2 -1
@@ -1690,7 +1690,9 @@ static void fastrpc_rpmsg_remove(structstruct fastrpc_user *user;unsigned long flags; +/* No invocations past this point */ spin_lock_irqsave (&cctx->lock, flags); + cctx->rpdev =NULL ;list_for_each_entry (user, &cctx->users, user)fastrpc_notify_users (user);spin_unlock_irqrestore (&cctx->lock, flags);
@@ -1698,7 +1700,6 @@ static void fastrpc_rpmsg_remove(structmisc_deregister (&cctx->miscdev);of_platform_depopulate (&rpdev->dev); - cctx->rpdev =NULL ;fastrpc_channel_ctx_put (cctx); }
Greg Kroah-Hartman
maintainerPATCH 114/159 scsi: stex: Fix gcc 13 warnings
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
commit 6d074ce231772c66e648a61f6bd2245e7129d1f5 upstream.
gcc 13 may assign another type to enumeration constants than gcc 12. Split the large enum at the top of source file stex.c such that the type of the constants used in time expressions is changed back to the same type chosen by gcc 12. This patch suppresses compiler warnings like this one:
In file included from ./include/linux/bitops.h:7,
from ./include/linux/kernel.h:22,
from drivers/scsi/stex.c:13:drivers/scsi/stex.c: In function ‘stex_common_handshake’:./include/linux/typecheck.h:12:25: error: comparison of distinct pointer types lacks a cast [-Werror]
12 | (void)(&__dummy == &__dummy2); \
| ^~./include/linux/jiffies.h:106:10: note: in expansion of macro ‘typecheck’
106 | typecheck(unsigned long, b) && \
| ^~~~~~~~~
drivers/scsi/stex.c:1035:29: note: in expansion of macro ‘time_after’
1035 | if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) {
| ^~~~~~~~~~See also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107405.
--- drivers/scsi/stex.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/scsi/stex.c +4 -0
@@ -109,7 +109,9 @@ enum {TASK_ATTRIBUTE_HEADOFQUEUE =0x1 ,TASK_ATTRIBUTE_ORDERED =0x2 , TASK_ATTRIBUTE_ACA = 0x4, +}; +enum {SS_STS_NORMAL =0x80000000 ,SS_STS_DONE =0x40000000 , SS_STS_HANDSHAKE = 0x20000000,
@@ -121,7 +123,9 @@ enum {SS_I2H_REQUEST_RESET =0x2000 , SS_MU_OPERATIONAL = 0x80000000, +}; +enum {STEX_CDB_LENGTH =16 , STATUS_VAR_LEN = 128,
Greg Kroah-Hartman
maintainerPATCH 115/159 ata: libata-scsi: Use correct device no in ata_find_dev()
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
commit 7f875850f20a42f488840c9df7af91ef7db2d576 upstream.
For devices not attached to a port multiplier and managed directly by libata, the device number passed to ata_find_dev() must always be lower than the maximum number of devices returned by ata_link_max_devices(). That is 1 for SATA devices or 2 for an IDE link with master+slave devices. This device number is the SCSI device ID which matches these constraints as the IDs are generated per port and so never exceed the maximum number of devices for the link being used.
However, for libsas managed devices, SCSI device IDs are assigned per struct scsi_host, leading to device IDs for SATA devices that can be well in excess of libata per-link maximum number of devices. This results in ata_find_dev() to always return NULL for libsas managed devices except for the first device of the target scsi_host with ID (device number) equal to 0. This issue is visible by executing the hdparm utility, which fails. E.g.:
hdparm -i /dev/sdX/dev/sdX:
HDIO_GET_IDENTITY failed: No message of desired type
Fix this by rewriting ata_find_dev() to ignore the device number for non-PMP attached devices with a link with at most 1 device, that is SATA devices. For these, the device number 0 is always used to return the correct pointer to the struct ata_device of the port link. This change excludes IDE master/slave setups (maximum number of devices per link is 2) and port-multiplier attached devices. Also, to be consistant with the fact that SCSI device IDs and channel numbers used as device numbers are both unsigned int, change the devno argument of ata_find_dev() to unsigned int.
--- drivers/ata/libata-scsi.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-)
drivers/ata/libata-scsi.c +26 -8
@@ -2698,18 +2698,36 @@ static unsigned int atapi_xlat(struct atreturn 0 ; } -static struct ata_device *ata_find_dev (struct ata_port *ap,int devno) +static struct ata_device *ata_find_dev (struct ata_port *ap,unsigned int devno) { -if (!sata_pmp_attached (ap)) { -if (likely (devno >=0 && - devno <ata_link_max_devices (&ap->link))) +/* +* For the non-PMP case, ata_link_max_devices() returns 1 (SATA case), +* or 2 (IDE master + slave case). However, the former case includes +* libsas hosted devices which are numbered per scsi host, leading +* to devno potentially being larger than 0 but with each struct +* ata_device having its own struct ata_port and struct ata_link. +* To accommodate these, ignore devno and always use device number 0. +*/ +if (likely (!sata_pmp_attached (ap))) { +int link_max_devices =ata_link_max_devices (&ap->link); + +if (link_max_devices ==1 ) +return &ap->link.device[0 ]; + +if (devno < link_max_devices)return &ap->link.device[devno]; - }else { -if (likely (devno >=0 && - devno < ap->nr_pmp_links)) -return &ap->pmp_link[devno].device[0 ]; + +return NULL ; } +/* +* For PMP-attached devices, the device number corresponds to C +* (channel) of SCSI [H:C:I:L], indicating the port pmp link +* for the device. +*/ +if (devno < ap->nr_pmp_links) +return &ap->pmp_link[devno].device[0 ]; +return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 116/159 drm/amd/pm: reverse mclk and fclk clocks levels for vangogh
In reply to Greg Kroah-HartmanFrom: Tim Huang <[email protected]>
commit bfc03568d9d81332382c73a1985a90c4506bd36c upstream.
This patch reverses the DPM clocks levels output of pp_dpm_mclk and pp_dpm_fclk.
On dGPUs and older APUs we expose the levels from lowest clocks to highest clocks. But for some APUs, the clocks levels that from the DFPstateTable are given the reversed orders by PMFW. Like the memory DPM clocks that are exposed by pp_dpm_mclk.
It's not intuitive that they are reversed on these APUs. All tools and software that talks to the driver then has to know different ways to interpret the data depending on the asic.
So we need to reverse them to expose the clocks levels from the driver consistently.
--- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +6 -4
@@ -579,7 +579,7 @@ static int vangogh_print_legacy_clk_leveDpmClocks_t *clk_table = smu->smu_table.clocks_table;SmuMetrics_legacy_t metrics;struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); -int i, size =0 , ret =0 ; +int i, idx, size =0 , ret =0 ;uint32_t cur_value =0 , value =0 , count =0 ;bool cur_value_match_level = false;
@@ -653,7 +653,8 @@ static int vangogh_print_legacy_clk_levecase SMU_MCLK :case SMU_FCLK :for (i =0 ; i < count; i++) { - ret =vangogh_get_dpm_clk_limited (smu, clk_type, i, &value); + idx = (clk_type ==SMU_FCLK || clk_type ==SMU_MCLK ) ? (count - i -1 ) : i; + ret =vangogh_get_dpm_clk_limited (smu, clk_type, idx, &value);if (ret)return ret;if (!value)
@@ -680,7 +681,7 @@ static int vangogh_print_clk_levels(struDpmClocks_t *clk_table = smu->smu_table.clocks_table;SmuMetrics_t metrics;struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm); -int i, size =0 , ret =0 ; +int i, idx, size =0 , ret =0 ;uint32_t cur_value =0 , value =0 , count =0 ;bool cur_value_match_level = false;
@@ -754,7 +755,8 @@ static int vangogh_print_clk_levels(strucase SMU_MCLK :case SMU_FCLK :for (i =0 ; i < count; i++) { - ret =vangogh_get_dpm_clk_limited (smu, clk_type, i, &value); + idx = (clk_type ==SMU_FCLK || clk_type ==SMU_MCLK ) ? (count - i -1 ) : i; + ret =vangogh_get_dpm_clk_limited (smu, clk_type, idx, &value);if (ret)return ret;if (!value)
Greg Kroah-Hartman
maintainerPATCH 117/159 drm/amd/pm: reverse mclk and fclk clocks levels for yellow carp
In reply to Greg Kroah-HartmanFrom: Tim Huang <[email protected]>
commit f1373a97a41f429e0095d4be388092ffa3c1a157 upstream.
This patch reverses the DPM clocks levels output of pp_dpm_mclk and pp_dpm_fclk.
On dGPUs and older APUs we expose the levels from lowest clocks to highest clocks. But for some APUs, the clocks levels that from the DFPstateTable are given the reversed orders by PMFW. Like the memory DPM clocks that are exposed by pp_dpm_mclk.
It's not intuitive that they are reversed on these APUs. All tools and software that talks to the driver then has to know different ways to interpret the data depending on the asic.
So we need to reverse them to expose the clocks levels from the driver consistently.
--- drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c +3 -2
@@ -1074,7 +1074,7 @@ out:static int yellow_carp_print_clk_levels (struct smu_context *smu,enum smu_clk_type clk_type,char *buf) { -int i, size =0 , ret =0 ; +int i, idx, size =0 , ret =0 ;uint32_t cur_value =0 , value =0 , count =0 ;smu_cmn_get_sysfs_buf (&buf, &size);
@@ -1106,7 +1106,8 @@ static int yellow_carp_print_clk_levels( goto print_clk_out;for (i =0 ; i < count; i++) { - ret =yellow_carp_get_dpm_freq_by_index (smu, clk_type, i, &value); + idx = (clk_type ==SMU_FCLK || clk_type ==SMU_MCLK ) ? (count - i -1 ) : i; + ret =yellow_carp_get_dpm_freq_by_index (smu, clk_type, idx, &value);if (ret) goto print_clk_out;
Greg Kroah-Hartman
maintainerPATCH 118/159 drm/amd/pm: reverse mclk and fclk clocks levels for renoir
In reply to Greg Kroah-HartmanFrom: Tim Huang <[email protected]>
commit 55e02c14f9b5fd973ba32a16a715baa42617f9c6 upstream.
This patch reverses the DPM clocks levels output of pp_dpm_mclk and pp_dpm_fclk for renoir.
On dGPUs and older APUs we expose the levels from lowest clocks to highest clocks. But for some APUs, the clocks levels are given the reversed orders by PMFW. Like the memory DPM clocks that are exposed by pp_dpm_mclk.
It's not intuitive that they are reversed on these APUs. All tools and software that talks to the driver then has to know different ways to interpret the data depending on the asic.
So we need to reverse them to expose the clocks levels from the driver consistently.
--- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c +3 -2
@@ -485,7 +485,7 @@ static int renoir_set_fine_grain_gfx_frestatic int renoir_print_clk_levels (struct smu_context *smu,enum smu_clk_type clk_type,char *buf) { -int i, size =0 , ret =0 ; +int i, idx, size =0 , ret =0 ;uint32_t cur_value =0 , value =0 , count =0 , min =0 , max =0 ;SmuMetrics_t metrics;struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
@@ -585,7 +585,8 @@ static int renoir_print_clk_levels(struccase SMU_VCLK :case SMU_DCLK :for (i =0 ; i < count; i++) { - ret =renoir_get_dpm_clk_limited (smu, clk_type, i, &value); + idx = (clk_type ==SMU_FCLK || clk_type ==SMU_MCLK ) ? (count - i -1 ) : i; + ret =renoir_get_dpm_clk_limited (smu, clk_type, idx, &value);if (ret)return ret;if (!value)
Greg Kroah-Hartman
maintainerPATCH 119/159 x86/boot: Wrap literal addresses in absolute_pointer()
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit aeb84412037b89e06f45e382f044da6f200e12f8 upstream.
GCC 11 (incorrectly[1]) assumes that literal values cast to (void *) should be treated like a NULL pointer with an offset, and raises diagnostics when doing bounds checking under -Warray-bounds. GCC 12 got "smarter" about finding these:
In function 'rdfs8',
inlined from 'vga_recalc_vertical' at /srv/code/arch/x86/boot/video-mode.c:124:29,
inlined from 'set_mode' at /srv/code/arch/x86/boot/video-mode.c:163:3:
/srv/code/arch/x86/boot/boot.h:114:9: warning: array subscript 0 is outside array bounds of 'u8[0]' {aka 'unsigned char[]'} [-Warray-bounds]
114 | asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));
| ^~~This has been solved in other places[2] already by using the recently added absolute_pointer() macro. Do the same here.
[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578
[2] https://lore.kernel.org/all/[email protected]/
--- arch/x86/boot/boot.h | 36 ++++++++++++++++++++++++------------ arch/x86/boot/main.c | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-)
arch/x86/boot/boot.h +24 -12
@@ -110,66 +110,78 @@ typedef unsigned int addr_t;static inline u8 rdfs8 (addr_t addr) { +u8 *ptr = (u8 *)absolute_pointer (addr);u8 v; - asmvolatile ("movb %%fs:%1,%0" :"=q" (v) :"m" (*(u8 *)addr)); + asmvolatile ("movb %%fs:%1,%0" :"=q" (v) :"m" (*ptr));return v; }static inline u16 rdfs16 (addr_t addr) { +u16 *ptr = (u16 *)absolute_pointer (addr);u16 v; - asmvolatile ("movw %%fs:%1,%0" :"=r" (v) :"m" (*(u16 *)addr)); + asmvolatile ("movw %%fs:%1,%0" :"=r" (v) :"m" (*ptr));return v; }static inline u32 rdfs32 (addr_t addr) { +u32 *ptr = (u32 *)absolute_pointer (addr);u32 v; - asmvolatile ("movl %%fs:%1,%0" :"=r" (v) :"m" (*(u32 *)addr)); + asmvolatile ("movl %%fs:%1,%0" :"=r" (v) :"m" (*ptr));return v; }static inline void wrfs8 (u8 v,addr_t addr) { - asmvolatile ("movb %1,%%fs:%0" :"+m" (*(u8 *)addr) :"qi" (v)); +u8 *ptr = (u8 *)absolute_pointer (addr); + asmvolatile ("movb %1,%%fs:%0" :"+m" (*ptr) :"qi" (v)); }static inline void wrfs16 (u16 v,addr_t addr) { - asmvolatile ("movw %1,%%fs:%0" :"+m" (*(u16 *)addr) :"ri" (v)); +u16 *ptr = (u16 *)absolute_pointer (addr); + asmvolatile ("movw %1,%%fs:%0" :"+m" (*ptr) :"ri" (v)); }static inline void wrfs32 (u32 v,addr_t addr) { - asmvolatile ("movl %1,%%fs:%0" :"+m" (*(u32 *)addr) :"ri" (v)); +u32 *ptr = (u32 *)absolute_pointer (addr); + asmvolatile ("movl %1,%%fs:%0" :"+m" (*ptr) :"ri" (v)); }static inline u8 rdgs8 (addr_t addr) { +u8 *ptr = (u8 *)absolute_pointer (addr);u8 v; - asmvolatile ("movb %%gs:%1,%0" :"=q" (v) :"m" (*(u8 *)addr)); + asmvolatile ("movb %%gs:%1,%0" :"=q" (v) :"m" (*ptr));return v; }static inline u16 rdgs16 (addr_t addr) { +u16 *ptr = (u16 *)absolute_pointer (addr);u16 v; - asmvolatile ("movw %%gs:%1,%0" :"=r" (v) :"m" (*(u16 *)addr)); + asmvolatile ("movw %%gs:%1,%0" :"=r" (v) :"m" (*ptr));return v; }static inline u32 rdgs32 (addr_t addr) { +u32 *ptr = (u32 *)absolute_pointer (addr);u32 v; - asmvolatile ("movl %%gs:%1,%0" :"=r" (v) :"m" (*(u32 *)addr)); + asmvolatile ("movl %%gs:%1,%0" :"=r" (v) :"m" (*ptr));return v; }static inline void wrgs8 (u8 v,addr_t addr) { - asmvolatile ("movb %1,%%gs:%0" :"+m" (*(u8 *)addr) :"qi" (v)); +u8 *ptr = (u8 *)absolute_pointer (addr); + asmvolatile ("movb %1,%%gs:%0" :"+m" (*ptr) :"qi" (v)); }static inline void wrgs16 (u16 v,addr_t addr) { - asmvolatile ("movw %1,%%gs:%0" :"+m" (*(u16 *)addr) :"ri" (v)); +u16 *ptr = (u16 *)absolute_pointer (addr); + asmvolatile ("movw %1,%%gs:%0" :"+m" (*ptr) :"ri" (v)); }static inline void wrgs32 (u32 v,addr_t addr) { - asmvolatile ("movl %1,%%gs:%0" :"+m" (*(u32 *)addr) :"ri" (v)); +u32 *ptr = (u32 *)absolute_pointer (addr); + asmvolatile ("movl %1,%%gs:%0" :"+m" (*ptr) :"ri" (v)); }/* Note: these only return true/false, not a signed return value! */
arch/x86/boot/main.c +1 -1
@@ -33,7 +33,7 @@ static void copy_boot_params(void)u16 cl_offset; };const struct old_cmdline *const oldcmd = - (const struct old_cmdline *)OLD_CL_ADDRESS ; +absolute_pointer (OLD_CL_ADDRESS );BUILD_BUG_ON (sizeof (boot_params) !=4096 );memcpy (&boot_params.hdr, &hdr,sizeof (hdr));
Greg Kroah-Hartman
maintainerPATCH 120/159 ath6kl: Use struct_group() to avoid size-mismatched casting
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit e3128a9d482cff9cc2a826adec5e1f7acb922b8f upstream.
In builds with -Warray-bounds, casts from smaller objects to larger objects will produce warnings. These can be overly conservative, but since -Warray-bounds has been finding legitimate bugs, it is desirable to turn it on globally. Instead of casting a u32 to a larger object, redefine the u32 portion of the header to a separate struct that can be used for both u32 operations and the distinct header fields. Silences this warning:
drivers/net/wireless/ath/ath6kl/htc_mbox.c: In function 'htc_wait_for_ctrl_msg':drivers/net/wireless/ath/ath6kl/htc_mbox.c:2275:20: error: array subscript 'struct htc_frame_hdr[0]' is partly outside array bounds of 'u32[1]' {aka 'unsigned int[1]'} [-Werror=array-bounds]
2275 | if (htc_hdr->eid != ENDPOINT_0)
| ^~drivers/net/wireless/ath/ath6kl/htc_mbox.c:2264:13: note: while referencing 'look_ahead'
2264 | u32 look_ahead;
| ^~~~~~~~~~This change results in no executable instruction differences.
--- drivers/net/wireless/ath/ath6kl/htc.h | 15 +++++++++++---- drivers/net/wireless/ath/ath6kl/htc_mbox.c | 15 ++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-)
drivers/net/wireless/ath/ath6kl/htc.h +11 -4
@@ -153,12 +153,19 @@* implementations. */ struct htc_frame_hdr { -u8 eid; -u8 flags; + struct_group_tagged(htc_frame_look_ahead, header, +union { +struct { +u8 eid; +u8 flags; -/* length of data (including trailer) that follows the header */ -__le16 payld_len; +/* length of data (including trailer) that follows the header */ +__le16 payld_len; + }; +u32 word; + }; + );/* end of 4-byte lookahead */ u8 ctrl[2 ];
drivers/net/wireless/ath/ath6kl/htc_mbox.c +6 -9
@@ -2260,19 +2260,16 @@ int ath6kl_htc_rxmsg_pending_handler(strstatic struct htc_packet *htc_wait_for_ctrl_msg (struct htc_target *target) {struct htc_packet *packet =NULL ; -struct htc_frame_hdr *htc_hdr; -u32 look_ahead; +struct htc_frame_look_ahead look_ahead; -if (ath6kl_hif_poll_mboxmsg_rx (target->dev, &look_ahead, +if (ath6kl_hif_poll_mboxmsg_rx (target->dev, &look_ahead.word,HTC_TARGET_RESPONSE_TIMEOUT ))return NULL ;ath6kl_dbg (ATH6KL_DBG_HTC , -"htc rx wait ctrl look_ahead 0x%X\n" , look_ahead); +"htc rx wait ctrl look_ahead 0x%X\n" , look_ahead.word); - htc_hdr = (struct htc_frame_hdr *)&look_ahead; - -if (htc_hdr->eid !=ENDPOINT_0 ) +if (look_ahead.eid !=ENDPOINT_0 )return NULL ; packet =htc_get_control_buf (target, false);
@@ -2281,8 +2278,8 @@ static struct htc_packet *htc_wait_for_creturn NULL ; packet->info.rx.rx_flags =0 ; - packet->info.rx.exp_hdr = look_ahead; - packet->act_len =le16_to_cpu (htc_hdr->payld_len) +HTC_HDR_LENGTH ; + packet->info.rx.exp_hdr = look_ahead.word; + packet->act_len =le16_to_cpu (look_ahead.payld_len) +HTC_HDR_LENGTH ;if (packet->act_len > packet->buf_len) goto fail_ctrl_rx;
Greg Kroah-Hartman
maintainerPATCH 121/159 block/blk-iocost (gcc13): keep large values in a new enum
In reply to Greg Kroah-HartmanFrom: Jiri Slaby (SUSE) <[email protected]>
commit ff1cc97b1f4c10db224f276d9615b22835b8c424 upstream.
Since gcc13, each member of an enum has the same type as the enum [1]. And that is inherited from its members. Provided:
VTIME_PER_SEC_SHIFT = 37,
VTIME_PER_SEC = 1LLU << VTIME_PER_SEC_SHIFT,
...
AUTOP_CYCLE_NSEC = 10LLU * NSEC_PER_SEC,
the named type is unsigned long.
This generates warnings with gcc-13:
block/blk-iocost.c: In function 'ioc_weight_prfill':
block/blk-iocost.c:3037:37: error: format '%u' expects argument of type 'unsigned int', but argument 4 has type 'long unsigned int'
block/blk-iocost.c: In function 'ioc_weight_show':
block/blk-iocost.c:3047:34: error: format '%u' expects argument of type 'unsigned int', but argument 3 has type 'long unsigned int'
So split the anonymous enum with large values to a separate enum, so that they don't affect other members.
[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36113
--- block/blk-iocost.c | 2 ++ 1 file changed, 2 insertions(+)
block/blk-iocost.c +2 -0
@@ -232,7 +232,9 @@ enum {/* 1/64k is granular enough and can easily be handled w/ u32 */ WEIGHT_ONE = 1 << 16, +}; +enum {/* * As vtime is used to calculate the cost of each IO, it needs to * be fairly high precision. For example, it should be able to
Greg Kroah-Hartman
maintainerPATCH 122/159 mmc: vub300: fix invalid response handling
In reply to Greg Kroah-HartmanFrom: Deren Wu <[email protected]>
commit a99d21cefd351c8aaa20b83a3c942340e5789d45 upstream.
We may get an empty response with zero length at the beginning of the driver start and get following UBSAN error. Since there is no content(SDRT_NONE) for the response, just return and skip the response handling to avoid this problem.
Test pass : SDIO wifi throughput test with this patch
[ 126.980684] UBSAN: array-index-out-of-bounds in drivers/mmc/host/vub300.c:1719:12 [ 126.980709] index -1 is out of range for type 'u32 [4]' [ 126.980729] CPU: 4 PID: 9 Comm: kworker/u16:0 Tainted: G E 6.3.0-rc4-mtk-local-202304272142 #1 [ 126.980754] Hardware name: Intel(R) Client Systems NUC8i7BEH/NUC8BEB, BIOS BECFL357.86A.0081.2020.0504.1834 05/04/2020 [ 126.980770] Workqueue: kvub300c vub300_cmndwork_thread [vub300] [ 126.980833] Call Trace: [ 126.980845] <TASK> [ 126.980860] dump_stack_lvl+0x48/0x70 [ 126.980895] dump_stack+0x10/0x20 [ 126.980916] ubsan_epilogue+0x9/0x40 [ 126.980944] __ubsan_handle_out_of_bounds+0x70/0x90 [ 126.980979] vub300_cmndwork_thread+0x58e7/0x5e10 [vub300] [ 126.981018] ? _raw_spin_unlock+0x18/0x40 [ 126.981042] ? finish_task_switch+0x175/0x6f0 [ 126.981070] ? __switch_to+0x42e/0xda0 [ 126.981089] ? __switch_to_asm+0x3a/0x80 [ 126.981129] ? __pfx_vub300_cmndwork_thread+0x10/0x10 [vub300] [ 126.981174] ? __kasan_check_read+0x11/0x20 [ 126.981204] process_one_work+0x7ee/0x13d0 [ 126.981246] worker_thread+0x53c/0x1240 [ 126.981291] kthread+0x2b8/0x370 [ 126.981312] ? __pfx_worker_thread+0x10/0x10 [ 126.981336] ? __pfx_kthread+0x10/0x10 [ 126.981359] ret_from_fork+0x29/0x50 [ 126.981400] </TASK>
--- drivers/mmc/host/vub300.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mmc/host/vub300.c +3 -0
@@ -1715,6 +1715,9 @@ static void construct_request_response(sint bytes =3 & less_cmd;int words = less_cmd >>2 ;u8 *r = vub300->resp.response.command_response; + +if (!resp_len) +return ;if (bytes ==3 ) { cmd->resp[words] = (r[1 + (words <<2 )] <<24 ) | (r[2 + (words <<2 )] <<16 )
Greg Kroah-Hartman
maintainerPATCH 123/159 mmc: pwrseq: sd8787: Fix WILC CHIP_EN and RESETN toggling order
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
commit 0b5d5c436a5c572a45f976cfd34a6741e143e5d9 upstream.
Chapter "5.3 Power-Up/Down Sequence" of WILC1000 [1] and WILC3000 [2] states that CHIP_EN must be pulled HIGH first, RESETN second. Fix the order of these signals in the driver.
Use the mmc_pwrseq_ops as driver data as the delay between signals is specific to SDIO card type anyway.
[1] https://ww1.microchip.com/downloads/aemDocuments/documents/WSG/ProductDocuments/DataSheets/ATWILC1000-MR110XB-IEEE-802.11-b-g-n-Link-Controller-Module-DS70005326E.pdf
[2] https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/IEEE-802.11-b-g-n-Link-Controller-Module-with-Integrated-Bluetooth-5.0-DS70005327B.pdf
--- drivers/mmc/core/pwrseq_sd8787.c | 34 ++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-)
drivers/mmc/core/pwrseq_sd8787.c +26 -8
@@ -28,7 +28,6 @@ struct mmc_pwrseq_sd8787 {struct mmc_pwrseq pwrseq;struct gpio_desc *reset_gpio;struct gpio_desc *pwrdn_gpio; -u32 reset_pwrdwn_delay_ms; };#define to_pwrseq_sd8787 (p) container_of(p, struct mmc_pwrseq_sd8787, pwrseq)
@@ -39,7 +38,7 @@ static void mmc_pwrseq_sd8787_pre_power_on(struct mmc_host *host)gpiod_set_value_cansleep (pwrseq->reset_gpio,1 ); -msleep (pwrseq->reset_pwrdwn_delay_ms); +msleep (300 );gpiod_set_value_cansleep (pwrseq->pwrdn_gpio,1 ); }
@@ -51,17 +50,37 @@ static void mmc_pwrseq_sd8787_power_off(struct mmc_host *host)gpiod_set_value_cansleep (pwrseq->reset_gpio,0 ); } +static void mmc_pwrseq_wilc1000_pre_power_on (struct mmc_host *host) +{ +struct mmc_pwrseq_sd8787 *pwrseq =to_pwrseq_sd8787 (host->pwrseq); + +/* The pwrdn_gpio is really CHIP_EN, reset_gpio is RESETN */ +gpiod_set_value_cansleep (pwrseq->pwrdn_gpio,1 ); +msleep (5 ); +gpiod_set_value_cansleep (pwrseq->reset_gpio,1 ); +} + +static void mmc_pwrseq_wilc1000_power_off (struct mmc_host *host) +{ +struct mmc_pwrseq_sd8787 *pwrseq =to_pwrseq_sd8787 (host->pwrseq); + +gpiod_set_value_cansleep (pwrseq->reset_gpio,0 ); +gpiod_set_value_cansleep (pwrseq->pwrdn_gpio,0 ); +} +static const struct mmc_pwrseq_ops mmc_pwrseq_sd8787_ops = { .pre_power_on = mmc_pwrseq_sd8787_pre_power_on, .power_off = mmc_pwrseq_sd8787_power_off, }; -static const u32 sd8787_delay_ms =300 ; -static const u32 wilc1000_delay_ms =5 ; +static const struct mmc_pwrseq_ops mmc_pwrseq_wilc1000_ops = { + .pre_power_on = mmc_pwrseq_wilc1000_pre_power_on, + .power_off = mmc_pwrseq_wilc1000_power_off, +};static const struct of_device_id mmc_pwrseq_sd8787_of_match[] = { - { .compatible ="mmc-pwrseq-sd8787" , .data = &sd8787_delay_ms }, - { .compatible ="mmc-pwrseq-wilc1000" , .data = &wilc1000_delay_ms }, + { .compatible ="mmc-pwrseq-sd8787" , .data = &mmc_pwrseq_sd8787_ops }, + { .compatible ="mmc-pwrseq-wilc1000" , .data = &mmc_pwrseq_wilc1000_ops }, {/* sentinel */ }, };MODULE_DEVICE_TABLE (of, mmc_pwrseq_sd8787_of_match);
@@ -77,7 +96,6 @@ static int mmc_pwrseq_sd8787_probe(struct platform_device *pdev)return -ENOMEM ; match =of_match_node (mmc_pwrseq_sd8787_of_match, pdev->dev.of_node); - pwrseq->reset_pwrdwn_delay_ms = *(u32 *)match->data; pwrseq->pwrdn_gpio =devm_gpiod_get (dev,"powerdown" ,GPIOD_OUT_LOW );if (IS_ERR (pwrseq->pwrdn_gpio))
@@ -88,7 +106,7 @@ static int mmc_pwrseq_sd8787_probe(struct platform_device *pdev)return PTR_ERR (pwrseq->reset_gpio); pwrseq->pwrseq.dev = dev; - pwrseq->pwrseq.ops = &mmc_pwrseq_sd8787_ops; + pwrseq->pwrseq.ops = match->data; pwrseq->pwrseq.owner =THIS_MODULE ;platform_set_drvdata (pdev, pwrseq);
Signature · 1 line
2.41.0
Greg Kroah-Hartman
maintainerPATCH 124/159 tty: serial: fsl_lpuart: use UARTCTRL_TXINV to send break instead of UARTCTRL_SBK
In reply to Greg Kroah-HartmanFrom: Sherry Sun <[email protected]>
commit 2474e05467c00f7d51af3039b664de6886325257 upstream.
LPUART IP now has two known bugs, one is that CTS has higher priority than the break signal, which causes the break signal sending through UARTCTRL_SBK may impacted by the CTS input if the HW flow control is enabled. It exists on all platforms we support in this driver. So we add a workaround patch for this issue: commit c4c81db5cf8b ("tty: serial: fsl_lpuart: disable the CTS when send break signal").
Another IP bug is i.MX8QM LPUART may have an additional break character being sent after SBK was cleared. It may need to add some delay between clearing SBK and re-enabling CTS to ensure that the SBK latch are completely cleared.
But we found that during the delay period before CTS is enabled, there is still a risk that Bluetooth data in TX FIFO may be sent out during this period because of break off and CTS disabled(even if BT sets CTS line deasserted, data is still sent to BT).
Due to this risk, we have to drop the CTS-disabling workaround for SBK bugs, use TXINV seems to be a better way to replace SBK feature and avoid above risk. Also need to disable the transmitter to prevent any data from being sent out during break, then invert the TX line to send break. Then disable the TXINV when turn off break and re-enable transmitter.
--- drivers/tty/serial/fsl_lpuart.c | 44 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-)
drivers/tty/serial/fsl_lpuart.c +23 -21
@@ -1491,34 +1491,36 @@ static void lpuart_break_ctl(struct uartstatic void lpuart32_break_ctl (struct uart_port *port,int break_state) { -unsigned long temp, modem; -struct tty_struct *tty; -unsigned int cflag =0 ; +unsigned long temp; - tty =tty_port_tty_get (&port->state->port); -if (tty) { - cflag = tty->termios.c_cflag; -tty_kref_put (tty); - } - - temp =lpuart32_read (port,UARTCTRL ) & ~UARTCTRL_SBK ; - modem =lpuart32_read (port,UARTMODIR ); + temp =lpuart32_read (port,UARTCTRL ); +/* +* LPUART IP now has two known bugs, one is CTS has higher priority than the +* break signal, which causes the break signal sending through UARTCTRL_SBK +* may impacted by the CTS input if the HW flow control is enabled. It +* exists on all platforms we support in this driver. +* Another bug is i.MX8QM LPUART may have an additional break character +* being sent after SBK was cleared. +* To avoid above two bugs, we use Transmit Data Inversion function to send +* the break signal instead of UARTCTRL_SBK. +*/ if (break_state !=0 ) { - temp |=UARTCTRL_SBK ;/* -* LPUART CTS has higher priority than SBK, need to disable CTS before -* asserting SBK to avoid any interference if flow control is enabled. +* Disable the transmitter to prevent any data from being sent out +* during break, then invert the TX line to send break. */ -if (cflag &CRTSCTS && modem &UARTMODIR_TXCTSE ) -lpuart32_write (port, modem & ~UARTMODIR_TXCTSE ,UARTMODIR ); + temp &= ~UARTCTRL_TE ; +lpuart32_write (port, temp,UARTCTRL ); + temp |=UARTCTRL_TXINV ; +lpuart32_write (port, temp,UARTCTRL ); }else { -/* Re-enable the CTS when break off. */ -if (cflag &CRTSCTS && !(modem &UARTMODIR_TXCTSE )) -lpuart32_write (port, modem |UARTMODIR_TXCTSE ,UARTMODIR ); +/* Disable the TXINV to turn off break and re-enable transmitter. */ + temp &= ~UARTCTRL_TXINV ; +lpuart32_write (port, temp,UARTCTRL ); + temp |=UARTCTRL_TE ; +lpuart32_write (port, temp,UARTCTRL ); } - -lpuart32_write (port, temp,UARTCTRL ); }static void lpuart_setup_watermark (struct lpuart_port *sport)
Greg Kroah-Hartman
maintainerPATCH 125/159 btrfs: fix csum_tree_block page iteration to avoid tripping on -Werror=array-bounds
In reply to Greg Kroah-HartmanFrom: pengfuyuan <[email protected]>
commit 5ad9b4719fc9bc4715c7e19875a962095b0577e7 upstream.
When compiling on a MIPS 64-bit machine we get these warnings:
In file included from ./arch/mips/include/asm/cacheflush.h:13,
from ./include/linux/cacheflush.h:5,
from ./include/linux/highmem.h:8,
from ./include/linux/bvec.h:10,
from ./include/linux/blk_types.h:10,
from ./include/linux/blkdev.h:9,
from fs/btrfs/disk-io.c:7:
fs/btrfs/disk-io.c: In function ‘csum_tree_block’:
fs/btrfs/disk-io.c:100:34: error: array subscript 1 is above array bounds of ‘struct page *[1]’ [-Werror=array-bounds]
100 | kaddr = page_address(buf->pages[i]);
| ~~~~~~~~~~^~~
./include/linux/mm.h:2135:48: note: in definition of macro ‘page_address’
2135 | #define page_address(page) lowmem_page_address(page)
| ^~~~
cc1: all warnings being treated as errors
We can check if i overflows to solve the problem. However, this doesn't make much sense, since i == 1 and num_pages == 1 doesn't execute the body of the loop. In addition, i < num_pages can also ensure that buf->pages[i] will not cross the boundary. Unfortunately, this doesn't help with the problem observed here:
gcc still complains.
To fix this add a compile-time condition for the extent buffer page array size limit, which would eventually lead to eliminating the whole for loop.
--- fs/btrfs/disk-io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/disk-io.c +1 -1
@@ -139,7 +139,7 @@ static void csum_tree_block(struct extencrypto_shash_update (shash, kaddr +BTRFS_CSUM_SIZE , first_page_part -BTRFS_CSUM_SIZE ); -for (i =1 ; i < num_pages; i++) { +for (i =1 ; i < num_pages &&INLINE_EXTENT_BUFFER_PAGES >1 ; i++) { kaddr =page_address (buf->pages[i]);crypto_shash_update (shash, kaddr,PAGE_SIZE ); }
Greg Kroah-Hartman
maintainerPATCH 126/159 powerpc/iommu: Limit number of TCEs to 512 for H_STUFF_TCE hcall
In reply to Greg Kroah-HartmanFrom: Gaurav Batra <[email protected]>
commit 9d2ccf00bddc268045e3d65a8108d61ada0e4b4e upstream.
Currently in tce_freemulti_pSeriesLP() there is no limit on how many TCEs are passed to the H_STUFF_TCE hcall. This has not caused an issue until now, but newer firmware releases have started enforcing a limit of 512 TCEs per call.
The limit is correct per the specification (PAPR v2.12 § 14.5.4.2.3).
The code has been in it's current form since it was initially merged.
--- arch/powerpc/platforms/pseries/iommu.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
arch/powerpc/platforms/pseries/iommu.c +11 -2
@@ -311,13 +311,22 @@ static void tce_free_pSeriesLP(unsignedstatic void tce_freemulti_pSeriesLP (struct iommu_table *tbl,long tcenum,long npages) {u64 rc; +long rpages = npages; +unsigned long limit;if (!firmware_has_feature (FW_FEATURE_STUFF_TCE ))return tce_free_pSeriesLP (tbl->it_index, tcenum, tbl->it_page_shift, npages); - rc =plpar_tce_stuff ((u64 )tbl->it_index, - (u64 )tcenum << tbl->it_page_shift,0 , npages); +do { + limit = min_t(unsigned long, rpages, 512); + + rc =plpar_tce_stuff ((u64 )tbl->it_index, + (u64 )tcenum << tbl->it_page_shift,0 , limit); + + rpages -= limit; + tcenum += limit; + }while (rpages >0 && !rc);if (rc &&printk_ratelimit ()) {printk ("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n" );
Greg Kroah-Hartman
maintainerPATCH 127/159 iommu/amd: Fix domain flush size when syncing iotlb
In reply to Greg Kroah-HartmanFrom: Jon Pan-Doh <[email protected]>
commit 2212fc2acf3f6ee690ea36506fb882a19d1bfcab upstream.
When running on an AMD vIOMMU, we observed multiple invalidations (of decreasing power of 2 aligned sizes) when unmapping a single page.
Domain flush takes gather bounds (end-start) as size param. However, gather->end is defined as the last inclusive address (start + size - 1). This leads to an off by 1 error.
With this patch, verified that 1 invalidation occurs when unmapping a single page.
--- drivers/iommu/amd/iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/amd/iommu.c +1 -1
@@ -2222,7 +2222,7 @@ static void amd_iommu_iotlb_sync(structunsigned long flags;spin_lock_irqsave (&dom->lock, flags); -domain_flush_pages (dom, gather->start, gather->end - gather->start,1 ); +domain_flush_pages (dom, gather->start, gather->end - gather->start +1 ,1 );amd_iommu_domain_flush_complete (dom);spin_unlock_irqrestore (&dom->lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 128/159 usb: cdns3: allocate TX FIFO size according to composite EP number
In reply to Greg Kroah-HartmanFrom: Frank Li <[email protected]>
[ Upstream commit dce49449e04ff150838a31386ee65917beb9ebb5 ]
Some devices have USB compositions which may require multiple endpoints. To get better performance, need bigger CDNS3_EP_BUF_SIZE.
But bigger CDNS3_EP_BUF_SIZE may exceed total hardware FIFO size when multiple endpoints.
By introducing the check_config() callback, calculate CDNS3_EP_BUF_SIZE.
Move CDNS3_EP_BUF_SIZE into cnds3_device: ep_buf_size Combine CDNS3_EP_ISO_SS_BURST and CDNS3_EP_ISO_HS_MULT into cnds3_device:ep_iso_burst
Using a simple algorithm to calculate ep_buf_size. ep_buf_size = ep_iso_burst = (onchip_buffers - 2k) / (number of IN EP + 1).
Test at 8qxp:
Gadget ep_buf_size RNDIS: 5 RNDIS+ACM: 3 Mass Storage + NCM + ACM 2
Previous CDNS3_EP_BUF_SIZE is 4, RNDIS + ACM will be failure because exceed FIFO memory.
Stable-dep-of: dbe678f6192f ("usb: cdns3: fix NCM gadget RX speed 20x slow than expection at iMX8QM")
--- drivers/usb/cdns3/cdns3-gadget.c | 47 +++++++++++++++++++++++++++++--- drivers/usb/cdns3/cdns3-gadget.h | 9 ++++-- 2 files changed, 49 insertions(+), 7 deletions(-)
drivers/usb/cdns3/cdns3-gadget.c +43 -4
@@ -2040,7 +2040,7 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable)u8 mult =0 ;int ret; - buffering =CDNS3_EP_BUF_SIZE -1 ; + buffering = priv_dev->ep_buf_size -1 ;cdns3_configure_dmult (priv_dev, priv_ep);
@@ -2059,7 +2059,7 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable)break ;default : ep_cfg =EP_CFG_EPTYPE (USB_ENDPOINT_XFER_ISOC ); - mult =CDNS3_EP_ISO_HS_MULT -1 ; + mult = priv_dev->ep_iso_burst -1 ; buffering = mult +1 ; }
@@ -2075,14 +2075,14 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable) mult =0 ; max_packet_size =1024 ;if (priv_ep->type ==USB_ENDPOINT_XFER_ISOC ) { - maxburst =CDNS3_EP_ISO_SS_BURST -1 ; + maxburst = priv_dev->ep_iso_burst -1 ; buffering = (mult +1 ) * (maxburst +1 );if (priv_ep->interval >1 ) buffering++; }else { - maxburst =CDNS3_EP_BUF_SIZE -1 ; + maxburst = priv_dev->ep_buf_size -1 ; }break ;default :
@@ -2097,6 +2097,10 @@ int cdns3_ep_config(struct cdns3_endpoint *priv_ep, bool enable)else 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 ); +/* onchip buffer is only allocated before configuration */ if (!priv_dev->hw_configured_flag) { ret = cdns3_ep_onchip_buffer_reserve(priv_dev, buffering + 1,
@@ -2982,6 +2986,40 @@ static int cdns3_gadget_udc_stop(struct usb_gadget *gadget)return 0 ; } +/** +* cdns3_gadget_check_config - ensure cdns3 can support the USB configuration +* @gadget: pointer to the USB gadget +* +* Used to record the maximum number of endpoints being used in a USB composite +* device. (across all configurations) This is to be used in the calculation +* of the TXFIFO sizes when resizing internal memory for individual endpoints. +* It will help ensured that the resizing logic reserves enough space for at +* least one max packet. +*/ +static int cdns3_gadget_check_config (struct usb_gadget *gadget) +{ +struct cdns3_device *priv_dev =gadget_to_cdns3_device (gadget); +struct usb_ep *ep; +int n_in =0 ; +int total; + +list_for_each_entry (ep, &gadget->ep_list, ep_list) { +if (ep->claimed && (ep->address &USB_DIR_IN )) + n_in++; + } + +/* 2KB are reserved for EP0, 1KB for out*/ + total =2 + n_in +1 ; + +if (total > priv_dev->onchip_buffers) +return -ENOMEM ; + + priv_dev->ep_buf_size = priv_dev->ep_iso_burst = + (priv_dev->onchip_buffers -2 ) / (n_in +1 ); + +return 0 ; +} +static const struct usb_gadget_ops cdns3_gadget_ops = { .get_frame = cdns3_gadget_get_frame, .wakeup = cdns3_gadget_wakeup,
@@ -2990,6 +3028,7 @@ static const struct usb_gadget_ops cdns3_gadget_ops = { .udc_start = cdns3_gadget_udc_start, .udc_stop = cdns3_gadget_udc_stop, .match_ep = cdns3_gadget_match_ep, + .check_config = cdns3_gadget_check_config, };static void cdns3_free_all_eps (struct cdns3_device *priv_dev)
drivers/usb/cdns3/cdns3-gadget.h +6 -3
@@ -562,15 +562,18 @@ struct cdns3_usb_regs {/* Max burst size (used only in SS mode). */ #define EP_CFG_MAXBURST_MASK GENMASK(11, 8)#define EP_CFG_MAXBURST (p) (((p) << 8) & EP_CFG_MAXBURST_MASK) +#define EP_CFG_MAXBURST_MAX 15/* ISO max burst. */ #define EP_CFG_MULT_MASK GENMASK(15, 14)#define EP_CFG_MULT (p) (((p) << 14) & EP_CFG_MULT_MASK) +#define EP_CFG_MULT_MAX 2/* ISO max burst. */ #define EP_CFG_MAXPKTSIZE_MASK GENMASK(26, 16)#define EP_CFG_MAXPKTSIZE (p) (((p) << 16) & EP_CFG_MAXPKTSIZE_MASK)/* Max number of buffered packets. */ #define EP_CFG_BUFFERING_MASK GENMASK(31, 27)#define EP_CFG_BUFFERING (p) (((p) << 27) & EP_CFG_BUFFERING_MASK) +#define EP_CFG_BUFFERING_MAX 15/* EP_CMD - bitmasks */ /* Endpoint reset. */
@@ -1094,9 +1097,6 @@ struct cdns3_trb {#define CDNS3_ENDPOINTS_MAX_COUNT 32#define CDNS3_EP_ZLP_BUF_SIZE 1024 -#define CDNS3_EP_BUF_SIZE 4/* KB */ -#define CDNS3_EP_ISO_HS_MULT 3 -#define CDNS3_EP_ISO_SS_BURST 3#define CDNS3_MAX_NUM_DESCMISS_BUF 32#define CDNS3_DESCMIS_BUF_SIZE 2048/* Bytes */ #define CDNS3_WA2_NUM_BUFFERS 128
@@ -1333,6 +1333,9 @@ struct cdns3_device {/*in KB */ u16 onchip_buffers;u16 onchip_used_size; + +u16 ep_buf_size; +u16 ep_iso_burst; };void cdns3_set_register_bit (void __iomem *ptr,u32 mask);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 129/159 usb: cdns3: fix NCM gadget RX speed 20x slow than expection at iMX8QM
In reply to Greg Kroah-HartmanFrom: Frank Li <[email protected]>
[ Upstream commit dbe678f6192f27879ac9ff6bc7a1036aad85aae9 ]
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_endpoint *priv_ep, bool enable)else 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 );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 130/159 block: fix revalidate performance regression
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
commit 47fe1c3064c6bc1bfa3c032ff78e603e5dd6e5bc upstream.
The scsi driver function sd_read_block_characteristics() always calls disk_set_zoned() to a disk zoned model correctly, in case the device model changed. This is done even for regular disks to set the zoned model to BLK_ZONED_NONE and free any zone related resources if the drive previously was zoned.
This behavior significantly impact the time it takes to revalidate disks on a large system as the call to disk_clear_zone_settings() done from disk_set_zoned() for the BLK_ZONED_NONE case results in the device request queued to be frozen, even if there are no zone resources to free.
Avoid this overhead for non-zoned devices by not calling disk_clear_zone_settings() in disk_set_zoned() if the device model was already set to BLK_ZONED_NONE, which is always the case for regular devices.
Reported by: Brian Bunker <[email protected]>
--- block/blk-settings.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
block/blk-settings.c +2 -1
@@ -875,6 +875,7 @@ static bool disk_has_partitions(struct gvoid blk_queue_set_zoned (struct gendisk *disk,enum blk_zoned_model model) {struct request_queue *q = disk->queue; +unsigned int old_model = q->limits.zoned;switch (model) {case BLK_ZONED_HM :
@@ -912,7 +913,7 @@ void blk_queue_set_zoned(struct gendisk*/ blk_queue_zone_write_granularity (q,queue_logical_block_size (q)); - }else { + }else if (old_model !=BLK_ZONED_NONE ) {blk_queue_clear_zone_settings (q); } }
Greg Kroah-Hartman
maintainerPATCH 131/159 selinux: dont use makes grouped targets feature yet
In reply to Greg Kroah-HartmanFrom: Paul Moore <[email protected]>
commit 42c4e97e06a839b07d834f640a10911ad84ec8b3 upstream.
The Linux Kernel currently only requires make v3.82 while the grouped target functionality requires make v4.3. Removed the grouped target introduced in 4ce1f694eb5d ("selinux: ensure av_permissions.h is built when needed") as well as the multiple header file targets in the make rule. This effectively reverts the problem commit.
We will revisit this change when make >= 4.3 is required by the rest of the kernel.
--- security/selinux/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
security/selinux/Makefile +5 -1
@@ -26,5 +26,9 @@ quiet_cmd_flask = GEN $(obj)/flask.h cmd_flask = $< $(obj)/flask.h $(obj)/av_permissions.h targets += flask.h av_permissions.h -$(obj)/flask.h $(obj)/av_permissions.h &: scripts/selinux/genheaders/genheaders FORCE +# once make >= 4.3 is required, we can use grouped targets in the rule below, +# which basically involves adding both headers and a '&' before the colon, see +# the example below: +# $(obj)/flask.h $(obj)/av_permissions.h &: scripts/selinux/... +$(obj)/flask.h: scripts/selinux/genheaders/genheaders FORCE $(call if_changed,flask)
Greg Kroah-Hartman
maintainerPATCH 132/159 tracing/probe: trace_probe_primary_from_call(): checked list_first_entry
In reply to Greg Kroah-HartmanFrom: Pietro Borrello <[email protected]>
commit 81d0fa4cb4fc0e1a49c2b22f92c43d9fe972ebcf upstream.
All callers of trace_probe_primary_from_call() check the return value to be non NULL. However, the function returns list_first_entry(&tpe->probes, ...) which can never be NULL. Additionally, it does not check for the list being possibly empty, possibly causing a type confusion on empty lists.
Use list_first_entry_or_null() which solves both problems.
--- kernel/trace/trace_probe.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace_probe.h +1 -1
@@ -303,7 +303,7 @@ trace_probe_primary_from_call(struct tra {struct trace_probe_event *tpe =trace_probe_event_from_call (call); - return list_first_entry(&tpe->probes, struct trace_probe, list); + return list_first_entry_or_null(&tpe->probes, struct trace_probe, list); }static inline struct list_head *trace_probe_probe_list (struct trace_probe *tp)
Greg Kroah-Hartman
maintainerPATCH 133/159 selftests: mptcp: connect: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit d83013bdf90a7994a474b0e650a7fc94b0d4ded6 upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped". Note that this check can also mark the test as failed if 'SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES' env var is set to 1: by doing that, we can make sure a test is not being skipped by mistake.
A new shared file is added here to be able to re-used the same check in the different selftests we have.
--- tools/testing/selftests/net/mptcp/Makefile | 2 - tools/testing/selftests/net/mptcp/mptcp_connect.sh | 4 ++ tools/testing/selftests/net/mptcp/mptcp_lib.sh | 40 +++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/net/mptcp/mptcp_lib.sh
tools/testing/selftests/net/mptcp/Makefile +1 -1
@@ -10,7 +10,7 @@ TEST_PROGS := mptcp_connect.sh pm_netlin TEST_GEN_FILES = mptcp_connect pm_nl_ctl -TEST_FILES := settings +TEST_FILES := mptcp_lib.sh settings EXTRA_CLEAN := *.pcap
tools/testing/selftests/net/mptcp/mptcp_connect.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + time_start=$(date +%s) optstring="S:R:d:e:l:r:h4cm:f:tC"
@@ -138,6 +140,8 @@ cleanup() done } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
tools/testing/selftests/net/mptcp/mptcp_lib.sh new file +40 -0
@@ -0,0 +1,40 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 + +readonly KSFT_FAIL=1 +readonly KSFT_SKIP=4 + +# SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all +# features using the last version of the kernel and the selftests to make sure +# a test is not being skipped by mistake. +mptcp_lib_expect_all_features() { + [ "${SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES:-}" = "1" ] +} + +# $1: msg +mptcp_lib_fail_if_expected_feature() { + if mptcp_lib_expect_all_features; then + echo "ERROR: missing feature: ${*}" + exit ${KSFT_FAIL} + fi + + return 1 +} + +# $1: file +mptcp_lib_has_file() { + local f="${1}" + + if [ -f "${f}" ]; then + return 0 + fi + + mptcp_lib_fail_if_expected_feature "${f} file not found" +} + +mptcp_lib_check_mptcp() { + if ! mptcp_lib_has_file "/proc/sys/net/mptcp/enabled"; then + echo "SKIP: MPTCP support is not available" + exit ${KSFT_SKIP} + fi +}
Greg Kroah-Hartman
maintainerPATCH 134/159 selftests: mptcp: pm nl: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 0f4955a40dafe18a1122e3714d8173e4b018e869 upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped".
--- tools/testing/selftests/net/mptcp/pm_netlink.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/net/mptcp/pm_netlink.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + ksft_skip=4 ret=0
@@ -34,6 +36,8 @@ cleanup() ip netns del $ns1 } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
Greg Kroah-Hartman
maintainerPATCH 135/159 selftests: mptcp: sockopt: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit cf6f0fda7af7e8e016070bfee6b189e671a0c776 upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped".
--- tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + ret=0 sin="" sout=""
@@ -80,6 +82,8 @@ cleanup() rm -f "$sin" "$sout" } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
Greg Kroah-Hartman
maintainerPATCH 136/159 ext4: add EA_INODE checking to ext4_iget()
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit b3e6bcb94590dea45396b9481e47b809b1be4afa upstream.
Add a new flag, EXT4_IGET_EA_INODE which indicates whether the inode is expected to have the EA_INODE flag or not. If the flag is not set/clear as expected, then fail the iget() operation and mark the file system as corrupted.
This commit also makes the ext4_iget() always perform the is_bad_inode() check even when the inode is already inode cache. This allows us to remove the is_bad_inode() check from the callers of ext4_iget() in the ea_inode code.
--- fs/ext4/ext4.h | 3 ++- fs/ext4/inode.c | 31 ++++++++++++++++++++++++++----- fs/ext4/xattr.c | 36 +++++++----------------------------- 3 files changed, 35 insertions(+), 35 deletions(-)
fs/ext4/ext4.h +2 -1
@@ -2999,7 +2999,8 @@ typedef enum {EXT4_IGET_NORMAL =0 ,EXT4_IGET_SPECIAL =0x0001 ,/* OK to iget a system inode */ EXT4_IGET_HANDLE =0x0002 ,/* Inode # is from a handle */ - EXT4_IGET_BAD = 0x0004 /* Allow to iget a bad inode */ +EXT4_IGET_BAD =0x0004 ,/* Allow to iget a bad inode */ + EXT4_IGET_EA_INODE = 0x0008 /* Inode should contain an EA value */ } ext4_iget_flags; extern struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,
fs/ext4/inode.c +26 -5
@@ -4592,6 +4592,21 @@ static inline u64 ext4_inode_peek_iversireturn inode_peek_iversion (inode); } +static const char *check_igot_inode (struct inode *inode,ext4_iget_flags flags) + +{ +if (flags &EXT4_IGET_EA_INODE ) { +if (!(EXT4_I (inode)->i_flags &EXT4_EA_INODE_FL )) +return "missing EA_INODE flag" ; + }else { +if ((EXT4_I (inode)->i_flags &EXT4_EA_INODE_FL )) +return "unexpected EA_INODE flag" ; + } +if (is_bad_inode (inode) && !(flags &EXT4_IGET_BAD )) +return "unexpected bad inode w/o EXT4_IGET_BAD" ; +return NULL ; +} +struct inode *__ext4_iget (struct super_block *sb,unsigned long ino,ext4_iget_flags flags,const char *function,unsigned int line)
@@ -4601,6 +4616,7 @@ struct inode *__ext4_iget(struct super_bstruct ext4_inode_info *ei;struct ext4_super_block *es =EXT4_SB (sb)->s_es;struct inode *inode; +const char *err_str;journal_t *journal =EXT4_SB (sb)->s_journal;long ret;loff_t size;
@@ -4628,8 +4644,14 @@ struct inode *__ext4_iget(struct super_b inode =iget_locked (sb, ino);if (!inode)return ERR_PTR (-ENOMEM ); -if (!(inode->i_state &I_NEW )) +if (!(inode->i_state &I_NEW )) { +if ((err_str =check_igot_inode (inode, flags)) !=NULL ) { +ext4_error_inode (inode, function, line,0 , err_str); +iput (inode); +return ERR_PTR (-EFSCORRUPTED ); + }return inode; + } ei =EXT4_I (inode); iloc.bh =NULL ;
@@ -4898,10 +4920,9 @@ struct inode *__ext4_iget(struct super_bif (IS_CASEFOLDED (inode) && !ext4_has_feature_casefold (inode->i_sb))ext4_error_inode (inode, function, line,0 ,"casefold flag without casefold feature" ); -if (is_bad_inode (inode) && !(flags &EXT4_IGET_BAD )) { -ext4_error_inode (inode, function, line,0 , -"bad inode without EXT4_IGET_BAD flag" ); - ret = -EUCLEAN ; +if ((err_str =check_igot_inode (inode, flags)) !=NULL ) { +ext4_error_inode (inode, function, line,0 , err_str); + ret = -EFSCORRUPTED ; goto bad_inode; }
fs/ext4/xattr.c +7 -29
@@ -397,7 +397,7 @@ static int ext4_xattr_inode_iget(structreturn -EFSCORRUPTED ; } - inode =ext4_iget (parent->i_sb, ea_ino,EXT4_IGET_NORMAL ); + inode =ext4_iget (parent->i_sb, ea_ino,EXT4_IGET_EA_INODE );if (IS_ERR (inode)) { err =PTR_ERR (inode); ext4_error(parent->i_sb,
@@ -405,23 +405,6 @@ static int ext4_xattr_inode_iget(struct err);return err; } - -if (is_bad_inode (inode)) { -ext4_error (parent->i_sb, -"error while reading EA inode %lu is_bad_inode" , - ea_ino); - err = -EIO ; - goto error; - } - -if (!(EXT4_I (inode)->i_flags &EXT4_EA_INODE_FL )) { -ext4_error (parent->i_sb, -"EA inode %lu does not have EXT4_EA_INODE_FL flag" , - ea_ino); - err = -EINVAL ; - goto error; - } -ext4_xattr_inode_set_class (inode);/*
@@ -442,9 +425,6 @@ static int ext4_xattr_inode_iget(struct *ea_inode = inode;return 0 ; -error: -iput (inode); -return err; }/* Remove entry from mbcache when EA inode is getting evicted */
@@ -1507,11 +1487,10 @@ ext4_xattr_inode_cache_find(struct inodewhile (ce) { ea_inode =ext4_iget (inode->i_sb, ce->e_value, -EXT4_IGET_NORMAL ); - if (!IS_ERR(ea_inode) && - !is_bad_inode(ea_inode) && - (EXT4_I(ea_inode)->i_flags & EXT4_EA_INODE_FL) && - i_size_read(ea_inode) == value_len && +EXT4_IGET_EA_INODE ); +if (IS_ERR (ea_inode)) + goto next_entry; + if (i_size_read(ea_inode) == value_len && !ext4_xattr_inode_read(ea_inode, ea_data, value_len) && !ext4_xattr_inode_verify_hashes(ea_inode, NULL, ea_data, value_len) &&
@@ -1521,9 +1500,8 @@ ext4_xattr_inode_cache_find(struct inodekvfree (ea_data);return ea_inode; } - -if (!IS_ERR (ea_inode)) -iput (ea_inode); +iput (ea_inode); + next_entry: ce =mb_cache_entry_find_next (ea_inode_cache, ce); }kvfree (ea_data);
Greg Kroah-Hartman
maintainerPATCH 137/159 ext4: set lockdep subclass for the ea_inode in ext4_xattr_inode_cache_find()
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit b928dfdcb27d8fa59917b794cfba53052a2f050f upstream.
If the ea_inode has been pushed out of the inode cache while there is still a reference in the mb_cache, the lockdep subclass will not be set on the inode, which can lead to some lockdep false positives.
--- fs/ext4/xattr.c | 1 + 1 file changed, 1 insertion(+)
fs/ext4/xattr.c +1 -0
@@ -1490,6 +1490,7 @@ ext4_xattr_inode_cache_find(struct inode EXT4_IGET_EA_INODE);if (IS_ERR (ea_inode)) goto next_entry; +ext4_xattr_inode_set_class (ea_inode);if (i_size_read (ea_inode) == value_len && !ext4_xattr_inode_read (ea_inode, ea_data, value_len) && !ext4_xattr_inode_verify_hashes(ea_inode, NULL, ea_data,
Greg Kroah-Hartman
maintainerPATCH 138/159 ext4: disallow ea_inodes with extended attributes
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit 2bc7e7c1a3bc9bd0cbf0f71006f6fe7ef24a00c2 upstream.
An ea_inode stores the value of an extended attribute; it can not have extended attributes itself, or this will cause recursive nightmares. Add a check in ext4_iget() to make sure this is the case.
--- fs/ext4/inode.c | 3 +++ 1 file changed, 3 insertions(+)
fs/ext4/inode.c +3 -0
@@ -4598,6 +4598,9 @@ static const char *check_igot_inode(struif (flags &EXT4_IGET_EA_INODE ) {if (!(EXT4_I (inode)->i_flags &EXT4_EA_INODE_FL ))return "missing EA_INODE flag" ; +if (ext4_test_inode_state (inode,EXT4_STATE_XATTR ) || +EXT4_I (inode)->i_file_acl) +return "ea_inode with extended attributes" ; }else {if ((EXT4_I (inode)->i_flags &EXT4_EA_INODE_FL ))return "unexpected EA_INODE flag" ;
Greg Kroah-Hartman
maintainerPATCH 139/159 ext4: add lockdep annotations for i_data_sem for ea_inodes
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit aff3bea95388299eec63440389b4545c8041b357 upstream.
Treat i_data_sem for ea_inodes as being in their own lockdep class to avoid lockdep complaints about ext4_setattr's use of inode_lock() on normal inodes potentially causing lock ordering with i_data_sem on ea_inodes in ext4_xattr_inode_write(). However, ea_inodes will be operated on by ext4_setattr(), so this isn't a problem.
--- fs/ext4/ext4.h | 2 ++ fs/ext4/xattr.c | 4 ++++ 2 files changed, 6 insertions(+)
fs/ext4/ext4.h +2 -0
@@ -995,11 +995,13 @@ do { \* where the second inode has larger inode number * than the first * I_DATA_SEM_QUOTA - Used for quota inodes only +* I_DATA_SEM_EA - Used for ea_inodes only */ enum {I_DATA_SEM_NORMAL =0 ,I_DATA_SEM_OTHER ,I_DATA_SEM_QUOTA , +I_DATA_SEM_EA };
fs/ext4/xattr.c +4 -0
@@ -123,7 +123,11 @@ ext4_expand_inode_array(struct ext4_xatt#ifdef CONFIG_LOCKDEP void ext4_xattr_inode_set_class (struct inode *ea_inode) { +struct ext4_inode_info *ei =EXT4_I (ea_inode); +lockdep_set_subclass (&ea_inode->i_rwsem,1 ); + (void ) ei;/* shut up clang warning if !CONFIG_LOCKDEP */ +lockdep_set_subclass (&ei->i_data_sem,I_DATA_SEM_EA ); }#endif
Greg Kroah-Hartman
maintainerPATCH 140/159 fbcon: Fix null-ptr-deref in soft_cursor
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit d78bd6cc68276bd57f766f7cb98bfe32c23ab327 upstream.
syzbot repored this bug in the softcursor code:
BUG: KASAN: null-ptr-deref in soft_cursor+0x384/0x6b4 drivers/video/fbdev/core/softcursor.c:70 Read of size 16 at addr 0000000000000200 by task kworker/u4:1/12 CPU: 0 PID: 12 Comm: kworker/u4:1 Not tainted 6.4.0-rc3-syzkaller-geb0f1697d729 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/28/2023 Workqueue: events_power_efficient fb_flashcursor Call trace: dump_backtrace+0x1b8/0x1e4 arch/arm64/kernel/stacktrace.c:233 show_stack+0x2c/0x44 arch/arm64/kernel/stacktrace.c:240 __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd0/0x124 lib/dump_stack.c:106 print_report+0xe4/0x514 mm/kasan/report.c:465 kasan_report+0xd4/0x130 mm/kasan/report.c:572 kasan_check_range+0x264/0x2a4 mm/kasan/generic.c:187 __asan_memcpy+0x3c/0x84 mm/kasan/shadow.c:105 soft_cursor+0x384/0x6b4 drivers/video/fbdev/core/softcursor.c:70 bit_cursor+0x113c/0x1a64 drivers/video/fbdev/core/bitblit.c:377 fb_flashcursor+0x35c/0x54c drivers/video/fbdev/core/fbcon.c:380 process_one_work+0x788/0x12d4 kernel/workqueue.c:2405 worker_thread+0x8e0/0xfe8 kernel/workqueue.c:2552 kthread+0x288/0x310 kernel/kthread.c:379 ret_from_fork+0x10/0x20 arch/arm64/kernel/entry.S:853
This fix let bit_cursor() bail out early when a font bitmap isn't available yet.
--- drivers/video/fbdev/core/bitblit.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/video/fbdev/core/bitblit.c +3 -0
@@ -247,6 +247,9 @@ static void bit_cursor(struct vc_data *v cursor.set =0 ; +if (!vc->vc_font.data) +return ; + c =scr_readw ((u16 *) vc->vc_pos); attribute =get_attribute (info, c); src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
Greg Kroah-Hartman
maintainerPATCH 141/159 serial: 8250_tegra: Fix an error handling path in tegra_uart_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
commit 134f49dec0b6aca3259cd8259de4c572048bd207 upstream.
If an error occurs after reset_control_deassert(), it must be re-asserted, as already done in the .remove() function.
--- drivers/tty/serial/8250/8250_tegra.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/tty/serial/8250/8250_tegra.c +3 -1
@@ -112,13 +112,15 @@ static int tegra_uart_probe(struct platf ret =serial8250_register_8250_port (&port8250);if (ret <0 ) - goto err_clkdisable; + goto err_ctrl_assert;platform_set_drvdata (pdev, uart); uart->line = ret;return 0 ; +err_ctrl_assert: +reset_control_assert (uart->rst); err_clkdisable:clk_disable_unprepare (uart->clk);
Greg Kroah-Hartman
maintainerPATCH 142/159 test_firmware: fix the memory leak of the allocated firmware buffer
In reply to Greg Kroah-HartmanFrom: Mirsad Goran Todorovac <[email protected]>
commit 48e156023059e57a8fc68b498439832f7600ffff upstream.
The following kernel memory leak was noticed after running tools/testing/selftests/firmware/fw_run_tests.sh:
[root@pc-mtodorov firmware]# cat /sys/kernel/debug/kmemleak .
.
.
unreferenced object 0xffff955389bc3400 (size 1024):
comm "test_firmware-0", pid 5451, jiffies 4294944822 (age 65.652s) hex dump (first 32 bytes):
47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00 GH4567..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
[<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
[<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
[<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
[<ffffffff95fd813b>] kthread+0x10b/0x140
[<ffffffff95e033e9>] ret_from_fork+0x29/0x50
unreferenced object 0xffff9553c334b400 (size 1024):
comm "test_firmware-1", pid 5452, jiffies 4294944822 (age 65.652s)
hex dump (first 32 bytes):
47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00 GH4567..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
[<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
[<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
[<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
[<ffffffff95fd813b>] kthread+0x10b/0x140
[<ffffffff95e033e9>] ret_from_fork+0x29/0x50
unreferenced object 0xffff9553c334f000 (size 1024):
comm "test_firmware-2", pid 5453, jiffies 4294944822 (age 65.652s)
hex dump (first 32 bytes):
47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00 GH4567..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
[<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
[<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
[<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
[<ffffffff95fd813b>] kthread+0x10b/0x140
[<ffffffff95e033e9>] ret_from_fork+0x29/0x50
unreferenced object 0xffff9553c3348400 (size 1024):
comm "test_firmware-3", pid 5454, jiffies 4294944822 (age 65.652s)
hex dump (first 32 bytes):
47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00 GH4567..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
[<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
[<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
[<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
[<ffffffff95fd813b>] kthread+0x10b/0x140
[<ffffffff95e033e9>] ret_from_fork+0x29/0x50[root@pc-mtodorov firmware]#
Note that the size 1024 corresponds to the size of the test firmware buffer. The actual number of the buffers leaked is around 70-110, depending on the test run.
The cause of the leak is the following:
request_partial_firmware_into_buf() and request_firmware_into_buf() provided firmware buffer isn't released on release_firmware(), we have allocated it and we are responsible for deallocating it manually. This is introduced in a number of context where previously only release_firmware() was called, which was insufficient.
--- lib/test_firmware.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
lib/test_firmware.c +18 -1
@@ -41,6 +41,7 @@ struct test_batched_req {bool sent;const struct firmware *fw;const char *name; +const char *fw_buf;struct completion completion;struct task_struct *task;struct device *dev;
@@ -143,8 +144,14 @@ static void __test_release_all_firmware(for (i =0 ; i < test_fw_config->num_requests; i++) { req = &test_fw_config->reqs[i]; -if (req->fw) +if (req->fw) { +if (req->fw_buf) { +kfree_const (req->fw_buf); + req->fw_buf =NULL ; + }release_firmware (req->fw); + req->fw =NULL ; + } }vfree (test_fw_config->reqs);
@@ -586,6 +593,8 @@ static ssize_t trigger_request_store(strmutex_lock (&test_fw_mutex);release_firmware (test_firmware); +if (test_fw_config->reqs) +__test_release_all_firmware (); test_firmware =NULL ; rc =request_firmware (&test_firmware, name, dev);if (rc) {
@@ -686,6 +695,8 @@ static ssize_t trigger_async_request_stomutex_lock (&test_fw_mutex);release_firmware (test_firmware); test_firmware =NULL ; +if (test_fw_config->reqs) +__test_release_all_firmware (); rc =request_firmware_nowait (THIS_MODULE ,1 , name, dev,GFP_KERNEL ,NULL , trigger_async_request_cb);if (rc) {
@@ -728,6 +739,8 @@ static ssize_t trigger_custom_fallback_smutex_lock (&test_fw_mutex);release_firmware (test_firmware); +if (test_fw_config->reqs) +__test_release_all_firmware (); test_firmware =NULL ; rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, name, dev, GFP_KERNEL, NULL,
@@ -790,6 +803,8 @@ static int test_fw_run_batch_request(voi test_fw_config->buf_size);if (!req->fw)kfree (test_buf); +else + req->fw_buf = test_buf; }else { req->rc = test_fw_config->req_firmware(&req->fw, req->name,
@@ -845,6 +860,7 @@ static ssize_t trigger_batched_requests_ req->fw =NULL ; req->idx = i; req->name = test_fw_config->name; + req->fw_buf =NULL ; req->dev = dev;init_completion (&req->completion); req->task = kthread_run(test_fw_run_batch_request, req,
@@ -944,6 +960,7 @@ ssize_t trigger_batched_requests_async_sfor (i =0 ; i < test_fw_config->num_requests; i++) { req = &test_fw_config->reqs[i]; req->name = test_fw_config->name; + req->fw_buf =NULL ; req->fw =NULL ; req->idx = i;init_completion (&req->completion);
Greg Kroah-Hartman
maintainerPATCH 143/159 KVM: x86: Account fastpath-only VM-Exits in vCPU stats
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 8b703a49c9df5e74870381ad7ba9c85d8a74ed2c upstream.
Increment vcpu->stat.exits when handling a fastpath VM-Exit without going through any part of the "slow" path. Not bumping the exits stat can result in wildly misleading exit counts, e.g. if the primary reason the guest is exiting is to program the TSC deadline timer.
--- arch/x86/kvm/x86.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/kvm/x86.c +3 -0
@@ -9946,6 +9946,9 @@ static int vcpu_enter_guest(struct kvm_v exit_fastpath =EXIT_FASTPATH_EXIT_HANDLED ;break ; } + +/* Note, VM-Exits that go down the "slow" path are accounted below. */ + ++vcpu->stat.exits; }/*
Greg Kroah-Hartman
maintainerPATCH 144/159 ksmbd: fix credit count leakage
In reply to Greg Kroah-HartmanFrom: Namjae Jeon <[email protected]>
commit 84c5aa47925a1f40d698b6a6a2bf67e99617433d upstream.
This patch fix the failure from smb2.credits.single_req_credits_granted test. When client send 8192 credit request, ksmbd return 8191 credit granted. ksmbd should give maximum possible credits that must be granted within the range of not exceeding the max credit to client.
--- fs/ksmbd/smb2pdu.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
fs/ksmbd/smb2pdu.c +1 -5
@@ -338,13 +338,9 @@ int smb2_set_rsp_credits(struct ksmbd_woif (hdr->Command ==SMB2_NEGOTIATE ) aux_max =1 ;else - aux_max = conn->vals->max_credits - credit_charge; + aux_max = conn->vals->max_credits - conn->total_credits; credits_granted = min_t(unsigned short, credits_requested, aux_max); -if (conn->vals->max_credits - conn->total_credits < credits_granted) - credits_granted = conn->vals->max_credits - - conn->total_credits; - conn->total_credits += credits_granted; work->credits_granted += credits_granted;
Greg Kroah-Hartman
maintainerPATCH 145/159 ksmbd: fix incorrect AllocationSize set in smb2_get_info
In reply to Greg Kroah-HartmanFrom: Namjae Jeon <[email protected]>
commit 6cc2268f5647cbfde3d4fc2e4ee005070ea3a8d2 upstream.
If filesystem support sparse file, ksmbd should return allocated size using ->i_blocks instead of stat->size. This fix generic/694 xfstests.
--- fs/ksmbd/smb2pdu.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-)
fs/ksmbd/smb2pdu.c +3 -18
@@ -4359,21 +4359,6 @@ static int get_file_basic_info(struct smreturn 0 ; } -static unsigned long long get_allocation_size (struct inode *inode, -struct kstat *stat) -{ -unsigned long long alloc_size =0 ; - -if (!S_ISDIR (stat->mode)) { -if ((inode->i_blocks <<9 ) <= stat->size) - alloc_size = stat->size; -else - alloc_size = inode->i_blocks <<9 ; - } - -return alloc_size; -} -static void get_file_standard_info (struct smb2_query_info_rsp *rsp,struct ksmbd_file *fp,void *rsp_org) {
@@ -4388,7 +4373,7 @@ static void get_file_standard_info(struc sinfo = (struct smb2_file_standard_info *)rsp->Buffer; delete_pending =ksmbd_inode_pending_delete (fp); - sinfo->AllocationSize =cpu_to_le64 (get_allocation_size (inode, &stat)); + sinfo->AllocationSize =cpu_to_le64 (inode->i_blocks <<9 ); sinfo->EndOfFile =S_ISDIR (stat.mode) ?0 :cpu_to_le64 (stat.size); sinfo->NumberOfLinks =cpu_to_le32 (get_nlink (&stat) - delete_pending); sinfo->DeletePending = delete_pending;
@@ -4453,7 +4438,7 @@ static int get_file_all_info(struct ksmb file_info->Attributes = fp->f_ci->m_fattr; file_info->Pad1 =0 ; file_info->AllocationSize = -cpu_to_le64 (get_allocation_size (inode, &stat)); +cpu_to_le64 (inode->i_blocks <<9 ); file_info->EndOfFile =S_ISDIR (stat.mode) ?0 :cpu_to_le64 (stat.size); file_info->NumberOfLinks =cpu_to_le32 (get_nlink (&stat) - delete_pending);
@@ -4642,7 +4627,7 @@ static int get_file_network_open_info(st file_info->ChangeTime =cpu_to_le64 (time); file_info->Attributes = fp->f_ci->m_fattr; file_info->AllocationSize = -cpu_to_le64 (get_allocation_size (inode, &stat)); +cpu_to_le64 (inode->i_blocks <<9 ); file_info->EndOfFile =S_ISDIR (stat.mode) ?0 :cpu_to_le64 (stat.size); file_info->Reserved =cpu_to_le32 (0 ); rsp->OutputBufferLength =
Greg Kroah-Hartman
maintainerPATCH 146/159 KEYS: asymmetric: Copy sig and digest in public_key_verify_signature()
In reply to Greg Kroah-HartmanFrom: Roberto Sassu <[email protected]>
commit c3d03e8e35e005e1a614e51bb59053eeb5857f76 upstream.
Commit ac4e97abce9b8 ("scatterlist: sg_set_buf() argument must be in linear mapping") checks that both the signature and the digest reside in the linear mapping area.
However, more recently commit ba14a194a434c ("fork: Add generic vmalloced stack support") made it possible to move the stack in the vmalloc area, which is not contiguous, and thus not suitable for sg_set_buf() which needs adjacent pages.
Always make a copy of the signature and digest in the same buffer used to store the key and its parameters, and pass them to sg_init_one(). Prefer it to conditionally doing the copy if necessary, to keep the code simple. The buffer allocated with kmalloc() is in the linear mapping area.
--- crypto/asymmetric_keys/public_key.c | 38 +++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-)
crypto/asymmetric_keys/public_key.c +21 -17
@@ -380,9 +380,10 @@ int public_key_verify_signature(const ststruct crypto_wait cwait;struct crypto_akcipher *tfm;struct akcipher_request *req; -struct scatterlist src_sg[2 ]; +struct scatterlist src_sg;char alg_name[CRYPTO_MAX_ALG_NAME ]; -char *key, *ptr; +char *buf, *ptr; +size_t buf_len;int ret;pr_devel ("==>%s()\n" , __func__);
@@ -420,34 +421,37 @@ int public_key_verify_signature(const stif (!req) goto error_free_tfm; - key =kmalloc (pkey->keylen +sizeof (u32) *2 + pkey->paramlen, -GFP_KERNEL ); -if (!key) + buf_len =max_t (size_t, pkey->keylen +sizeof (u32) *2 + pkey->paramlen, + sig->s_size + sig->digest_size); + + buf =kmalloc (buf_len,GFP_KERNEL ); +if (!buf) goto error_free_req; -memcpy (key, pkey->key, pkey->keylen); - ptr = key + pkey->keylen; +memcpy (buf, pkey->key, pkey->keylen); + ptr = buf + pkey->keylen; ptr =pkey_pack_u32 (ptr, pkey->algo); ptr =pkey_pack_u32 (ptr, pkey->paramlen);memcpy (ptr, pkey->params, pkey->paramlen);if (pkey->key_is_private) - ret =crypto_akcipher_set_priv_key (tfm, key, pkey->keylen); + ret =crypto_akcipher_set_priv_key (tfm, buf, pkey->keylen);else - ret =crypto_akcipher_set_pub_key (tfm, key, pkey->keylen); + ret =crypto_akcipher_set_pub_key (tfm, buf, pkey->keylen);if (ret) - goto error_free_key; + goto error_free_buf;if (strcmp (pkey->pkey_algo,"sm2" ) ==0 && sig->data_size) { ret =cert_sig_digest_update (sig, tfm);if (ret) - goto error_free_key; + goto error_free_buf; } -sg_init_table (src_sg,2 ); -sg_set_buf (&src_sg[0 ], sig->s, sig->s_size); -sg_set_buf (&src_sg[1 ], sig->digest, sig->digest_size); -akcipher_request_set_crypt (req, src_sg,NULL , sig->s_size, +memcpy (buf, sig->s, sig->s_size); +memcpy (buf + sig->s_size, sig->digest, sig->digest_size); + +sg_init_one (&src_sg, buf, sig->s_size + sig->digest_size); +akcipher_request_set_crypt (req, &src_sg,NULL , sig->s_size, sig->digest_size);crypto_init_wait (&cwait); akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
@@ -455,8 +459,8 @@ int public_key_verify_signature(const st crypto_req_done, &cwait); ret =crypto_wait_req (crypto_akcipher_verify (req), &cwait); -error_free_key: -kfree (key); +error_free_buf: +kfree (buf); error_free_req:akcipher_request_free (req); error_free_tfm:
Greg Kroah-Hartman
maintainerPATCH 147/159 regmap: Account for register length when chunking
In reply to Greg Kroah-HartmanFrom: Jim Wylder <[email protected]>
commit 3981514180c987a79ea98f0ae06a7cbf58a9ac0f upstream.
Currently, when regmap_raw_write() splits the data, it uses the max_raw_write value defined for the bus. For any bus that includes the target register address in the max_raw_write value, the chunked transmission will always exceed the maximum transmission length. To avoid this problem, subtract the length of the register and the padding from the maximum transmission.
--- drivers/base/regmap/regmap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/base/regmap/regmap.c +4 -2
@@ -2041,6 +2041,8 @@ int _regmap_raw_write(struct regmap *mapsize_t val_count = val_len / val_bytes;size_t chunk_count, chunk_bytes;size_t chunk_regs = val_count; +size_t max_data = map->max_raw_write - map->format.reg_bytes - + map->format.pad_bytes;int ret, i;if (!val_count)
@@ -2048,8 +2050,8 @@ int _regmap_raw_write(struct regmap *mapif (map->use_single_write) chunk_regs =1 ; -else if (map->max_raw_write && val_len > map->max_raw_write) - chunk_regs = map->max_raw_write / val_bytes; +else if (map->max_raw_write && val_len > max_data) + chunk_regs = max_data / val_bytes; chunk_count = val_count / chunk_regs; chunk_bytes = chunk_regs * val_bytes;
Greg Kroah-Hartman
maintainerPATCH 148/159 tpm, tpm_tis: Request threaded interrupt handler
In reply to Greg Kroah-HartmanFrom: Lino Sanfilippo <[email protected]>
commit 0c7e66e5fd69bf21034c9a9b081d7de7c3eb2cea upstream.
The TIS interrupt handler at least has to read and write the interrupt status register. In case of SPI both operations result in a call to tpm_tis_spi_transfer() which uses the bus_lock_mutex of the spi device and thus must only be called from a sleepable context.
To ensure this request a threaded interrupt handler.
--- drivers/char/tpm/tpm_tis_core.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/char/tpm/tpm_tis_core.c +5 -2
@@ -764,8 +764,11 @@ static int tpm_tis_probe_irq_single(struint rc;u32 int_status; -if (devm_request_irq (chip->dev.parent, irq, tis_int_handler, flags, -dev_name (&chip->dev), chip) !=0 ) { + + rc =devm_request_threaded_irq (chip->dev.parent, irq,NULL , + tis_int_handler,IRQF_ONESHOT | flags, +dev_name (&chip->dev), chip); +if (rc) {dev_info (&chip->dev,"Unable to request irq: %d for probe\n" , irq);return -1 ;
Greg Kroah-Hartman
maintainerPATCH 149/159 drm/rcar: stop using imply for dependencies
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 42d95d1b3a9c649bf5ee881fee5938e00126479a upstream.
The meaning of the 'imply' keyword has changed recently, and neither the old meaning (select the symbol if its dependencies are met) nor the new meaning (enable it by default, but let the user set any other setting) is what we want here.
Work around this by adding two more Kconfig options that lead to the correct behavior: if DRM_RCAR_USE_CMM and DRM_RCAR_USE_LVDS are enabled, that portion of the driver becomes usable, and no configuration results in a link error.
This avoids a link failure:
arm-linux-gnueabi-ld: drivers/gpu/drm/rcar-du/rcar_du_crtc.o: in function `rcar_du_crtc_atomic_begin':
rcar_du_crtc.c:(.text+0x1444): undefined reference to `rcar_cmm_setup'
arm-linux-gnueabi-ld: drivers/gpu/drm/rcar-du/rcar_du_crtc.o: in function `rcar_du_crtc_atomic_enable':
rcar_du_crtc.c:(.text+0x14d4): undefined reference to `rcar_cmm_enable'
arm-linux-gnueabi-ld: rcar_du_crtc.c:(.text+0x1548): undefined reference to `rcar_cmm_setup'
arm-linux-gnueabi-ld: drivers/gpu/drm/rcar-du/rcar_du_crtc.o: in function `rcar_du_crtc_atomic_disable':
rcar_du_crtc.c:(.text+0x18b8): undefined reference to `rcar_cmm_disable'
arm-linux-gnueabi-ld: drivers/gpu/drm/rcar-du/rcar_du_kms.o: in function `rcar_du_modeset_init':
--- drivers/gpu/drm/rcar-du/Kconfig | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)
drivers/gpu/drm/rcar-du/Kconfig +16 -9
@@ -4,8 +4,6 @@ config DRM_RCAR_DU depends on DRM && OF depends on ARM || ARM64 depends on ARCH_RENESAS || COMPILE_TEST - imply DRM_RCAR_CMM - imply DRM_RCAR_LVDS select DRM_KMS_HELPER select DRM_KMS_CMA_HELPER select DRM_GEM_CMA_HELPER
@@ -14,13 +12,17 @@ config DRM_RCAR_DU Choose this option if you have an R-Car chipset. If M is selected the module will be called rcar-du-drm. -config DRM_RCAR_CMM - tristate "R-Car DU Color Management Module (CMM) Support" - depends on DRM && OF +config DRM_RCAR_USE_CMM + bool "R-Car DU Color Management Module (CMM) Support" depends on DRM_RCAR_DU + default DRM_RCAR_DU help Enable support for R-Car Color Management Module (CMM). +config DRM_RCAR_CMM + def_tristate DRM_RCAR_DU + depends on DRM_RCAR_USE_CMM + config DRM_RCAR_DW_HDMI tristate "R-Car Gen3 and RZ/G2 DU HDMI Encoder Support" depends on DRM && OF
@@ -28,15 +30,20 @@ config DRM_RCAR_DW_HDMI help Enable support for R-Car Gen3 or RZ/G2 internal HDMI encoder. +config DRM_RCAR_USE_LVDS + bool "R-Car DU LVDS Encoder Support" + depends on DRM_BRIDGE && OF + default DRM_RCAR_DU + help + Enable support for the R-Car Display Unit embedded LVDS encoders. + config DRM_RCAR_LVDS - tristate "R-Car DU LVDS Encoder Support" - depends on DRM && DRM_BRIDGE && OF + def_tristate DRM_RCAR_DU + depends on DRM_RCAR_USE_LVDS select DRM_KMS_HELPER select DRM_PANEL select OF_FLATTREE select OF_OVERLAY - help - Enable support for the R-Car Display Unit embedded LVDS encoders. config DRM_RCAR_VSP bool "R-Car DU VSP Compositor Support" if ARM
Greg Kroah-Hartman
maintainerPATCH 150/159 scsi: dpt_i2o: Remove broken pass-through ioctl (I2OUSERCMD)
In reply to Greg Kroah-HartmanFrom: Ben Hutchings <[email protected]>
adpt_i2o_passthru() takes a user-provided message and passes it through to the hardware with appropriate translation of addresses and message IDs. It has a number of bugs:
- When a message requires scatter/gather, it doesn't verify that the offset to the scatter/gather list is less than the message size.
- When a message requires scatter/gather, it overwrites the DMA addresses with the user-space virtual addresses before unmapping the DMA buffers.
- It reads the message from user memory multiple times. This allows user-space to change the message and bypass validation.
- It assumes that the message is at least 4 words long, but doesn't check that.
I tried fixing these, but even the maintainer of the corresponding user-space in Debian doesn't have the hardware any more.
Instead, remove the pass-through ioctl (I2OUSRCMD) and supporting code.
There is no corresponding upstream commit, because this driver was removed upstream.
--- drivers/scsi/dpt_i2o.c | 274 +------------------------------------------------ drivers/scsi/dpti.h | 1 2 files changed, 8 insertions(+), 267 deletions(-)
drivers/scsi/dpt_i2o.c +8 -266
@@ -582,51 +582,6 @@ static int adpt_show_info(struct seq_filreturn 0 ; } -/* -* Turn a pointer to ioctl reply data into an u32 'context' -*/ -static u32 adpt_ioctl_to_context (adpt_hba * pHba,void *reply) -{ -#if BITS_PER_LONG ==32 -return (u32 )(unsigned long )reply; -#else -ulong flags =0 ; -u32 nr, i; - -spin_lock_irqsave (pHba->host->host_lock, flags); - nr =ARRAY_SIZE (pHba->ioctl_reply_context); -for (i =0 ; i < nr; i++) { -if (pHba->ioctl_reply_context[i] ==NULL ) { - pHba->ioctl_reply_context[i] = reply; -break ; - } - } -spin_unlock_irqrestore (pHba->host->host_lock, flags); -if (i >= nr) { -printk (KERN_WARNING "%s: Too many outstanding " -"ioctl commands\n" , pHba->name); -return (u32)-1 ; - } - -return i; -#endif -} - -/* -* Go from an u32 'context' to a pointer to ioctl reply data. -*/ -static void *adpt_ioctl_from_context (adpt_hba *pHba,u32 context) -{ -#if BITS_PER_LONG ==32 -return (void *)(unsigned long )context; -#else -void *p = pHba->ioctl_reply_context[context]; - pHba->ioctl_reply_context[context] =NULL ; - -return p; -#endif -} -/*=========================================================================== * Error Handling routines *===========================================================================
@@ -1648,208 +1603,6 @@ static int adpt_close(struct inode *inodreturn 0 ; } - -static int adpt_i2o_passthru (adpt_hba * pHba,u32 __user *arg) -{ -u32 msg[MAX_MESSAGE_SIZE ]; -u32 * reply =NULL ; -u32 size =0 ; -u32 reply_size =0 ; -u32 __user *user_msg = arg; -u32 __user * user_reply =NULL ; -void **sg_list =NULL ; -u32 sg_offset =0 ; -u32 sg_count =0 ; -int sg_index =0 ; -u32 i =0 ; -u32 rcode =0 ; -void *p =NULL ; -dma_addr_t addr; -ulong flags =0 ; - -memset (&msg,0 ,MAX_MESSAGE_SIZE *4 ); -// get user msg size in u32s -if (get_user (size, &user_msg[0 ])){ -return -EFAULT ; - } - size = size>>16 ; - - user_reply = &user_msg[size]; -if (size >MAX_MESSAGE_SIZE ){ -return -EFAULT ; - } - size *=4 ;// Convert to bytes - -/* Copy in the user's I2O command */ -if (copy_from_user (msg, user_msg, size)) { -return -EFAULT ; - } -get_user (reply_size, &user_reply[0 ]); - reply_size = reply_size>>16 ; -if (reply_size >REPLY_FRAME_SIZE ){ - reply_size =REPLY_FRAME_SIZE ; - } - reply_size *=4 ; - reply =kzalloc (REPLY_FRAME_SIZE *4 ,GFP_KERNEL ); -if (reply ==NULL ) { -printk (KERN_WARNING "%s: Could not allocate reply buffer\n" ,pHba->name); -return -ENOMEM ; - } - sg_offset = (msg[0 ]>>4 )&0xf ; - msg[2 ] =0x40000000 ;// IOCTL context - msg[3 ] =adpt_ioctl_to_context (pHba, reply); -if (msg[3 ] == (u32)-1 ) { - rcode = -EBUSY ; - goto free; - } - - sg_list =kcalloc (pHba->sg_tablesize,sizeof (*sg_list),GFP_KERNEL ); -if (!sg_list) { - rcode = -ENOMEM ; - goto free; - } -if (sg_offset) { -// TODO add 64 bit API -struct sg_simple_element *sg = (struct sg_simple_element *) (msg+sg_offset); - sg_count = (size - sg_offset*4 ) /sizeof (struct sg_simple_element ); -if (sg_count > pHba->sg_tablesize){ -printk (KERN_DEBUG "%s:IOCTL SG List too large (%u)\n" , pHba->name,sg_count); - rcode = -EINVAL ; - goto free; - } - -for (i =0 ; i < sg_count; i++) { -int sg_size; - -if (!(sg[i].flag_count &0x10000000 /*I2O_SGL_FLAGS_SIMPLE_ADDRESS_ELEMENT*/ )) { -printk (KERN_DEBUG "%s:Bad SG element %d - not simple (%x)\n" ,pHba->name,i, sg[i].flag_count); - rcode = -EINVAL ; - goto cleanup; - } - sg_size = sg[i].flag_count &0xffffff ; -/* Allocate memory for the transfer */ - p =dma_alloc_coherent (&pHba->pDev->dev, sg_size, &addr,GFP_KERNEL ); -if (!p) { -printk (KERN_DEBUG "%s: Could not allocate SG buffer - size = %d buffer number %d of %d\n" , - pHba->name,sg_size,i,sg_count); - rcode = -ENOMEM ; - goto cleanup; - } - sg_list[sg_index++] = p;// sglist indexed with input frame, not our internal frame. -/* Copy in the user's SG buffer if necessary */ -if (sg[i].flag_count &0x04000000 /*I2O_SGL_FLAGS_DIR*/ ) { -// sg_simple_element API is 32 bit -if (copy_from_user (p,(void __user *)(ulong )sg[i].addr_bus, sg_size)) { -printk (KERN_DEBUG "%s: Could not copy SG buf %d FROM user\n" ,pHba->name,i); - rcode = -EFAULT ; - goto cleanup; - } - } -/* sg_simple_element API is 32 bit, but addr < 4GB */ - sg[i].addr_bus = addr; - } - } - -do { -/* -* Stop any new commands from enterring the -* controller while processing the ioctl -*/ -if (pHba->host) { -scsi_block_requests (pHba->host); -spin_lock_irqsave (pHba->host->host_lock, flags); - } - rcode =adpt_i2o_post_wait (pHba, msg, size,FOREVER ); -if (rcode !=0 ) -printk ("adpt_i2o_passthru: post wait failed %d %p\n" , - rcode, reply); -if (pHba->host) { -spin_unlock_irqrestore (pHba->host->host_lock, flags); -scsi_unblock_requests (pHba->host); - } - }while (rcode == -ETIMEDOUT ); - -if (rcode){ - goto cleanup; - } - -if (sg_offset) { -/* Copy back the Scatter Gather buffers back to user space */ -u32 j; -// TODO add 64 bit API -struct sg_simple_element * sg; -int sg_size; - -// re-acquire the original message to handle correctly the sg copy operation -memset (&msg,0 ,MAX_MESSAGE_SIZE *4 ); -// get user msg size in u32s -if (get_user (size, &user_msg[0 ])){ - rcode = -EFAULT ; - goto cleanup; - } - size = size>>16 ; - size *=4 ; -if (size >MAX_MESSAGE_SIZE ) { - rcode = -EINVAL ; - goto cleanup; - } -/* Copy in the user's I2O command */ -if (copy_from_user (msg, user_msg, size)) { - rcode = -EFAULT ; - goto cleanup; - } - sg_count = (size - sg_offset*4 ) /sizeof (struct sg_simple_element ); - -// TODO add 64 bit API - sg = (struct sg_simple_element *)(msg + sg_offset); -for (j =0 ; j < sg_count; j++) { -/* Copy out the SG list to user's buffer if necessary */ -if (! (sg[j].flag_count &0x4000000 /*I2O_SGL_FLAGS_DIR*/ )) { - sg_size = sg[j].flag_count &0xffffff ; -// sg_simple_element API is 32 bit -if (copy_to_user ((void __user *)(ulong )sg[j].addr_bus,sg_list[j], sg_size)) { -printk (KERN_WARNING "%s: Could not copy %p TO user %x\n" ,pHba->name, sg_list[j], sg[j].addr_bus); - rcode = -EFAULT ; - goto cleanup; - } - } - } - } - -/* Copy back the reply to user space */ -if (reply_size) { -// we wrote our own values for context - now restore the user supplied ones -if (copy_from_user (reply+2 , user_msg+2 ,sizeof (u32)*2 )) { -printk (KERN_WARNING "%s: Could not copy message context FROM user\n" ,pHba->name); - rcode = -EFAULT ; - } -if (copy_to_user (user_reply, reply, reply_size)) { -printk (KERN_WARNING "%s: Could not copy reply TO user\n" ,pHba->name); - rcode = -EFAULT ; - } - } - - -cleanup: -if (rcode != -ETIME && rcode != -EINTR ) { -struct sg_simple_element *sg = - (struct sg_simple_element *) (msg +sg_offset); -while (sg_index) { -if (sg_list[--sg_index]) { -dma_free_coherent (&pHba->pDev->dev, - sg[sg_index].flag_count &0xffffff , - sg_list[sg_index], - sg[sg_index].addr_bus); - } - } - } - -free: -kfree (sg_list); -kfree (reply); -return rcode; -} -#if defined __ia64__static void adpt_ia64_info (sysInfo_S * si) {
@@ -1976,8 +1729,6 @@ static int adpt_ioctl(struct inode *inodreturn -EFAULT ; }break ; -case I2OUSRCMD : -return adpt_i2o_passthru (pHba, argp);case DPT_CTRLINFO :{drvrHBAinfo_S HbaInfo;
@@ -2134,13 +1885,6 @@ static irqreturn_t adpt_isr(int irq, voiadpt_send_nop (pHba, old_m); } context =readl (reply+8 ); -if (context &0x40000000 ){// IOCTL -void *p =adpt_ioctl_from_context (pHba,readl (reply+12 )); -if ( p !=NULL ) { -memcpy_fromio (p, reply,REPLY_FRAME_SIZE *4 ); - } -// All IOCTLs will also be post wait - }if (context &0x80000000 ){// Post wait message status =readl (reply+16 );if (status >>24 ){
@@ -2148,16 +1892,14 @@ static irqreturn_t adpt_isr(int irq, voi }else { status =I2O_POST_WAIT_OK ; } -if (!(context &0x40000000 )) { -/* -* The request tag is one less than the command tag -* as the firmware might treat a 0 tag as invalid -*/ - cmd =scsi_host_find_tag (pHba->host, -readl (reply +12 ) -1 ); -if (cmd !=NULL ) { -printk (KERN_WARNING "%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%x\n" , pHba->name, cmd, context); - } +/* +* The request tag is one less than the command tag +* as the firmware might treat a 0 tag as invalid +*/ + cmd =scsi_host_find_tag (pHba->host, +readl (reply +12 ) -1 ); +if (cmd !=NULL ) { +printk (KERN_WARNING "%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%x\n" , pHba->name, cmd, context); }adpt_i2o_post_wait_complete (context, status); }else {// SCSI message
drivers/scsi/dpti.h +0 -1
@@ -248,7 +248,6 @@ typedef struct _adpt_hba {void __iomem *FwDebugBLEDflag_P;// Virtual Addr Of FW Debug BLED void __iomem *FwDebugBLEDvalue_P;// Virtual Addr Of FW Debug BLED u32 FwDebugFlags; -u32 *ioctl_reply_context[4 ]; } adpt_hba;struct sg_simple_element {
Greg Kroah-Hartman
maintainerPATCH 151/159 scsi: dpt_i2o: Do not process completions with invalid addresses
In reply to Greg Kroah-HartmanFrom: Ben Hutchings <[email protected]>
adpt_isr() reads reply addresses from a hardware register, which should always be within the DMA address range of the device's pool of reply address buffers. In case the address is out of range, it tries to muddle on, converting to a virtual address using bus_to_virt().
bus_to_virt() does not take DMA addresses, and it doesn't make sense to try to handle the completion in this case. Ignore it and continue looping to service the interrupt. If a completion has been lost then the SCSI core should eventually time-out and trigger a reset.
There is no corresponding upstream commit, because this driver was removed upstream.
--- drivers/scsi/Kconfig | 2 +- drivers/scsi/dpt_i2o.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/Kconfig +1 -1
@@ -460,7 +460,7 @@ config SCSI_MVUMI config SCSI_DPT_I2O tristate "Adaptec I2O RAID support " - depends on SCSI && PCI && VIRT_TO_BUS + depends on SCSI && PCI help This driver supports all of Adaptec's I2O based RAID controllers as well as the DPT SmartRaid V cards. This is an Adaptec maintained
drivers/scsi/dpt_i2o.c +2 -2
@@ -56,7 +56,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Dri#include <linux/mutex.h> #include <asm/processor.h> /* for boot_cpu_data */ -#include <asm/io.h> /* for virt_to_bus, etc. */ +#include <asm/io.h> #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h>
@@ -1865,7 +1865,7 @@ static irqreturn_t adpt_isr(int irq, voi }else {/* Ick, we should *never* be here */ printk (KERN_ERR "dpti: reply frame not from pool\n" ); - reply = (u8 *)bus_to_virt (m); +continue ; }if (readl (reply) &MSG_FAIL ) {
Greg Kroah-Hartman
maintainerPATCH 152/159 drm/amdgpu/gfx10: Disable gfxoff before disabling powergating.
In reply to Greg Kroah-HartmanFrom: Bas Nieuwenhuizen <[email protected]>
commit 8173cab3368a13cdc3cad0bd5cf14e9399b0f501 upstream.
Otherwise we get a full system lock (looks like a FW mess).
Copied the order from the GFX9 powergating code.
--- drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +7 -1
@@ -8422,8 +8422,14 @@ static int gfx_v10_0_set_powergating_stabreak ;case CHIP_VANGOGH :case CHIP_YELLOW_CARP : +if (!enable) +amdgpu_gfx_off_ctrl (adev, false); +gfx_v10_cntl_pg (adev, enable); -amdgpu_gfx_off_ctrl (adev, enable); + +if (enable) +amdgpu_gfx_off_ctrl (adev, true); +break ;default :break ;
Greg Kroah-Hartman
maintainerPATCH 153/159 selftests: mptcp: diag: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 46565acdd29facbf418a11e4a3791b3c8967308d upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped".
--- tools/testing/selftests/net/mptcp/diag.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/net/mptcp/diag.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) ns="ns1-$rndh" ksft_skip=4
@@ -25,6 +27,8 @@ cleanup() ip netns del $ns } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
Greg Kroah-Hartman
maintainerPATCH 154/159 selftests: mptcp: simult flows: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 9161f21c74a1a0e7bb39eb84ea0c86b23c92fc87 upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped".
--- tools/testing/selftests/net/mptcp/simult_flows.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/net/mptcp/simult_flows.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) ns1="ns1-$rndh" ns2="ns2-$rndh"
@@ -32,6 +34,8 @@ cleanup() done } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
Greg Kroah-Hartman
maintainerPATCH 155/159 selftests: mptcp: join: skip if MPTCP is not supported
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 715c78a82e00f848f99ef76e6f6b89216ccba268 upstream.
Selftests are supposed to run on any kernels, including the old ones not supporting MPTCP.
A new check is then added to make sure MPTCP is supported. If not, the test stops and is marked as "skipped".
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/net/mptcp/mptcp_join.sh +4 -0
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +. "$(dirname "${0}")/mptcp_lib.sh" + ret=0 sin="" sinfail=""
@@ -161,6 +163,8 @@ reset_with_allow_join_id0() ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable } +mptcp_lib_check_mptcp + ip -Version > /dev/null 2>&1 if [ $? -ne 0 ];then echo "SKIP: Could not run test without ip tool"
Greg Kroah-Hartman
maintainerPATCH 156/159 ext4: enable the lazy init thread when remounting read/write
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
commit eb1f822c76beeaa76ab8b6737ab9dc9f9798408c upstream.
In commit a44be64bbecb ("ext4: don't clear SB_RDONLY when remounting r/w until quota is re-enabled") we defer clearing tyhe SB_RDONLY flag in struct super. However, we didn't defer when we checked sb_rdonly() to determine the lazy itable init thread should be enabled, with the next result that the lazy inode table initialization would not be properly started. This can cause generic/231 to fail in ext4's nojournal mode.
Fix this by moving when we decide to start or stop the lazy itable init thread to after we clear the SB_RDONLY flag when we are remounting the file system read/write.
Fixes a44be64bbecb ("ext4: don't clear SB_RDONLY when remounting r/w until...")
--- fs/ext4/super.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
fs/ext4/super.c +12 -12
@@ -5963,18 +5963,6 @@ static int ext4_remount(struct super_blo }/* -* Reinitialize lazy itable initialization thread based on -* current settings -*/ -if (sb_rdonly (sb) || !test_opt (sb,INIT_INODE_TABLE )) -ext4_unregister_li_request (sb); -else { -ext4_group_t first_not_zeroed; - first_not_zeroed =ext4_has_uninit_itable (sb); -ext4_register_li_request (sb, first_not_zeroed); - } - -/* * Handle creation of system zone data early because it can fail. * Releasing of existing data is done when we are sure remount will * succeed.
@@ -6011,6 +5999,18 @@ static int ext4_remount(struct super_bloif (enable_rw) sb->s_flags &= ~SB_RDONLY ; +/* +* Reinitialize lazy itable initialization thread based on +* current settings +*/ +if (sb_rdonly (sb) || !test_opt (sb,INIT_INODE_TABLE )) +ext4_unregister_li_request (sb); +else { +ext4_group_t first_not_zeroed; + first_not_zeroed =ext4_has_uninit_itable (sb); +ext4_register_li_request (sb, first_not_zeroed); + } +if (!ext4_has_feature_mmp (sb) ||sb_rdonly (sb))ext4_stop_mmpd (sbi);
Greg Kroah-Hartman
maintainerPATCH 157/159 ARM: defconfig: drop CONFIG_DRM_RCAR_LVDS
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 1441a15dd49616bd9dd4c25a018b0508cdada576 upstream.
This is now a hidden symbol, so just drop the defconfig line.
--- arch/arm/configs/multi_v7_defconfig | 1 - 1 file changed, 1 deletion(-)
arch/arm/configs/multi_v7_defconfig +0 -1
@@ -696,7 +696,6 @@ CONFIG_DRM_IMX_LDB=m CONFIG_DRM_IMX_HDMI=m CONFIG_DRM_ATMEL_HLCDC=m CONFIG_DRM_RCAR_DU=m -CONFIG_DRM_RCAR_LVDS=y CONFIG_DRM_SUN4I=m CONFIG_DRM_MSM=m CONFIG_DRM_FSL_DCU=m
Greg Kroah-Hartman
maintainerPATCH 158/159 RDMA/irdma: Fix drain SQ hang with no completion
In reply to Greg Kroah-HartmanFrom: Shiraz Saleem <[email protected]>
commit ead54ced6321099978d30d62dc49c282a6e70574 upstream.
SW generated completions for outstanding WRs posted on SQ after QP is in error target the wrong CQ. This causes the ib_drain_sq to hang with no completion.
Fix this to generate completions on the right CQ.
[ 863.969340] INFO: task kworker/u52:2:671 blocked for more than 122 seconds. [ 863.979224] Not tainted 5.14.0-130.el9.x86_64 #1 [ 863.986588] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 863.996997] task:kworker/u52:2 state:D stack: 0 pid: 671 ppid: 2 flags:0x00004000 [ 864.007272] Workqueue: xprtiod xprt_autoclose [sunrpc] [ 864.014056] Call Trace: [ 864.017575] __schedule+0x206/0x580 [ 864.022296] schedule+0x43/0xa0 [ 864.026736] schedule_timeout+0x115/0x150 [ 864.032185] __wait_for_common+0x93/0x1d0 [ 864.037717] ? usleep_range_state+0x90/0x90 [ 864.043368] __ib_drain_sq+0xf6/0x170 [ib_core] [ 864.049371] ? __rdma_block_iter_next+0x80/0x80 [ib_core] [ 864.056240] ib_drain_sq+0x66/0x70 [ib_core] [ 864.062003] rpcrdma_xprt_disconnect+0x82/0x3b0 [rpcrdma] [ 864.069365] ? xprt_prepare_transmit+0x5d/0xc0 [sunrpc] [ 864.076386] xprt_rdma_close+0xe/0x30 [rpcrdma] [ 864.082593] xprt_autoclose+0x52/0x100 [sunrpc] [ 864.088718] process_one_work+0x1e8/0x3c0 [ 864.094170] worker_thread+0x50/0x3b0 [ 864.099109] ? rescuer_thread+0x370/0x370 [ 864.104473] kthread+0x149/0x170 [ 864.109022] ? set_kthread_struct+0x40/0x40 [ 864.114713] ret_from_fork+0x22/0x30
--- drivers/infiniband/hw/irdma/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/irdma/utils.c +1 -1
@@ -2660,7 +2660,7 @@ void irdma_generate_flush_completions(stspin_unlock_irqrestore (&iwqp->lock, flags2);spin_unlock_irqrestore (&iwqp->iwscq->lock, flags1);if (compl_generated) -irdma_comp_handler (iwqp->iwrcq); +irdma_comp_handler (iwqp->iwscq); }else {spin_unlock_irqrestore (&iwqp->iwscq->lock, flags1); mod_delayed_work(iwqp->iwdev->cleanup_wq, &iwqp->dwork_flush,
Greg Kroah-Hartman
maintainerPATCH 159/159 RDMA/irdma: Do not generate SW completions for NOPs
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
commit 30ed9ee9a10a90ae719dcfcacead1d0506fa45ed upstream.
Currently, artificial SW completions are generated for NOP wqes which can generate unexpected completions with wr_id = 0. Skip the generation of artificial completions for NOPs.
--- drivers/infiniband/hw/irdma/utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/hw/irdma/utils.c +4 -1
@@ -2650,7 +2650,10 @@ void irdma_generate_flush_completions(st/* remove the SQ WR by moving SQ tail*/ IRDMA_RING_SET_TAIL (*sq_ring, sq_ring->tail + qp->sq_wrtrk_array[sq_ring->tail].quanta); - +if (cmpl->cpi.op_type ==IRDMAQP_OP_NOP ) { +kfree (cmpl); +continue ; + }ibdev_dbg (iwqp->iwscq->ibcq.device,"DEV: %s: adding wr_id = 0x%llx SQ Completion to list qp_id=%d\n" , __func__, cmpl->cpi.wr_id, qp->qp_id);
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.116-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tseted on BMIPS_GENERIC:
Signature · 1 line
Florian
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.116-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Hello Greg,
Quoted 10 lines
From: Greg Kroah-Hartman <[email protected]>
Sent: Wednesday, June 7, 2023 9:15 PMThis is the start of the stable review cycle for the 5.15.116 release. There are 159 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.
CIP configurations built and booted okay with Linux 5.15.116-rc1 (00621f2608ac):
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/pipelines/893074039
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/commits/linux-5.15.y
Kind regards, Chris
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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.
Successfully compiled and installed bindeb-pkgs on my computer (Acer Aspire E15, Intel Core i3 Haswell). No noticeable regressions.
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.116-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.15.116-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git branch: linux-5.15.y
* git commit: 00621f2608ac31643168c86e902c21a017ffe3b1
* git describe: v5.15.114-196-g00621f2608ac
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.15.y/build/v5.15.114-196-g00621f2608ac
## Test Regressions (compared to v5.15.114)
## Metric Regressions (compared to v5.15.114)
## Test Fixes (compared to v5.15.114)
## Metric Fixes (compared to v5.15.114)
## Test result summary
total: 108256, pass: 91348, fail: 3032, skip: 13715, xfail: 161
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 117 total, 116 passed, 1 failed
* arm64: 45 total, 43 passed, 2 failed
* i386: 35 total, 32 passed, 3 failed
* mips: 27 total, 26 passed, 1 failed
* parisc: 4 total, 4 passed, 0 failed
* powerpc: 27 total, 26 passed, 1 failed
* riscv: 11 total, 11 passed, 0 failed
* s390: 12 total, 11 passed, 1 failed
* sh: 14 total, 12 passed, 2 failed
* sparc: 8 total, 8 passed, 0 failed
* x86_64: 38 total, 36 passed, 2 failed
## Test suites summary
* boot
* fwts
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-firmware
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-user_events
* kselftest-vDSO
* kselftest-watchdog
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* perf
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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.
No problems seen on x86_64 and aarch64.
Thanks,
Harshit
Quoted 10 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.116-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.116-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Hi Greg,
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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.
Build test (gcc version 12.2.1 20230511):
mips: 62 configs -> no failure
arm: 99 configs -> no failure
arm64: 3 configs -> no failurex86_64: 4 configs -> no failure
alpha allmodconfig -> no failure
csky allmodconfig -> no failure
powerpc allmodconfig -> no failure
riscv allmodconfig -> no failure
s390 allmodconfig -> no failure
xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
arm64: Booted on rpi4b (4GB model). No regression. [2]
mips: Booted on ci20 board. No regression. [3]
[1]. https://openqa.qa.codethink.co.uk/tests/3807
[2]. https://openqa.qa.codethink.co.uk/tests/3823
[3]. https://openqa.qa.codethink.co.uk/tests/3824
Signature · 2 lines
Regards Sudip
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.116 release. There are 159 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.
Build results:
total: 155 pass: 155 fail: 0 Qemu test results: total: 499 pass: 498 fail: 1 Failed tests: arm:kudo-bmc:multi_v7_defconfig:npcm:usb0.1:nuvoton-npcm730-kudo:rootfs
The test failure is spurious and not new. I observe it randomly on multi_v7_defconfig builds, primarily on npcm platforms. There is no error message, just a stalled boot. I have been trying to bisect for a while, but I have not been successful so far. No immediate concern; I just wanted to mention it in case someone else hits the same or a similar problem.
Guenter