5.15.139-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 5.15.139-rc1 review
This is the start of the stable review cycle for the 5.15.139 release. There are 244 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, 17 Nov 2023 20:34:45 +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.139-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.139-rc1
Filipe Manana <[email protected]>
btrfs: use u64 for buffer sizes in the tree search ioctls
Dominique Martinet <[email protected]>
Revert "mmc: core: Capture correct oemid-bits for eMMC cards"
Yujie Liu <[email protected]>
tracing/kprobes: Fix the order of argument descriptions
Arnd Bergmann <[email protected]>
fbdev: fsl-diu-fb: mark wr_reg_wa() static
Dan Carpenter <[email protected]>
fbdev: imsttfb: fix a resource leak in probe
Helge Deller <[email protected]>
fbdev: imsttfb: Fix error path of imsttfb_probe()
Amit Kumar Mahapatra <[email protected]>
spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies
Jerome Brunet <[email protected]>
ASoC: hdmi-codec: register hpd callback on component probe
Erik Kurzinger <[email protected]>
drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
Florian Westphal <[email protected]>
netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses
Jeremy Sowden <[email protected]>
netfilter: nft_redir: use struct nf_nat_range2 throughout and deduplicate eval call-backs
Maciej Żenczykowski <[email protected]>
netfilter: xt_recent: fix (increase) ipv6 literal buffer length
Roman Bacik <[email protected]>
i2c: iproc: handle invalid slave state
Heiner Kallweit <[email protected]>
r8169: respect userspace disabling IFF_MULTICAST
Yu Kuai <[email protected]>
blk-core: use pr_warn_ratelimited() in bio_check_ro()
Miaohe Lin <[email protected]>
block: remove unneeded return value of bio_check_ro()
George Shuklin <[email protected]>
tg3: power down device only on SYSTEM_POWER_OFF
D. Wythe <[email protected]>
net/smc: put sk reference if close work was canceled
D. Wythe <[email protected]>
net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc
D. Wythe <[email protected]>
net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT
Hangbin Liu <[email protected]>
selftests: pmtu.sh: fix result checking
Furong Xu <[email protected]>
net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs
NeilBrown <[email protected]>
Fix termination state for idr_for_each_entry_ul()
Patrick Thompson <[email protected]>
net: r8169: Disable multicast filter for RTL8168H and RTL8107E
Kuniyuki Iwashima <[email protected]>
dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses.
Kuniyuki Iwashima <[email protected]>
dccp: Call security_inet_conn_request() after setting IPv4 addresses.
Ratheesh Kannoth <[email protected]>
octeontx2-pf: Fix holes in error code
Ratheesh Kannoth <[email protected]>
octeontx2-pf: Fix error codes
Eric Dumazet <[email protected]>
inet: shrink struct flowi_common
Hou Tao <[email protected]>
bpf: Check map->usercnt after timer->timer is assigned
Shigeru Yoshida <[email protected]>
tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING
Dan Carpenter <[email protected]>
hsr: Prevent use after free in prp_create_tagged_frame()
Willem de Bruijn <[email protected]>
llc: verify mac len before reading mac header
Dan Carpenter <[email protected]>
Input: synaptics-rmi4 - fix use after free in rmi_unregister_function()
Florian Fainelli <[email protected]>
pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume
Uwe Kleine-König <[email protected]>
pwm: sti: Reduce number of allocations and drop usage of chip_data
Ben Wolsieffer <[email protected]>
regmap: prevent noinc writes from clobbering cache
Hans Verkuil <[email protected]>
media: dvb-usb-v2: af9035: fix missing unlock
Jernej Skrabec <[email protected]>
media: cedrus: Fix clock/reset sequence
Jiasheng Jiang <[email protected]>
media: vidtv: mux: Add check and kfree for kstrdup
Jiasheng Jiang <[email protected]>
media: vidtv: psi: Add check for kstrdup
Katya Orlova <[email protected]>
media: s3c-camif: Avoid inappropriate kfree()
Zheng Wang <[email protected]>
media: bttv: fix use after free error due to btv->timeout timer
Christophe JAILLET <[email protected]>
media: i2c: max9286: Fix some redundant of_node_put() calls
Yang Yingliang <[email protected]>
pcmcia: ds: fix possible name leak in error path in pcmcia_device_add()
Yang Yingliang <[email protected]>
pcmcia: ds: fix refcount leak in pcmcia_device_add()
Yang Yingliang <[email protected]>
pcmcia: cs: fix possible hung task and memory leak pccardd()
Javier Carrasco <[email protected]>
rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call
Dan Williams <[email protected]>
cxl/mem: Fix shutdown order
Dinghao Liu <[email protected]>
i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs
Hangyu Hua <[email protected]>
9p/net: fix possible memory leak in p9_check_errors()
Ian Rogers <[email protected]>
perf hist: Add missing puts to hist__account_cycles
Ian Rogers <[email protected]>
perf machine: Avoid out of bounds LBR memory read
Sergey Shtylyov <[email protected]>
usb: host: xhci-plat: fix possible kernel oops while resuming
Basavaraj Natikar <[email protected]>
xhci: Loosen RPM as default policy to cover for AMD xHC 1.1
Wang Yufen <[email protected]>
powerpc/pseries: fix potential memory leak in init_cpu_associativity()
Sebastian Andrzej Siewior <[email protected]>
powerpc/imc-pmu: Use the correct spinlock initializer.
Benjamin Gray <[email protected]>
powerpc/xive: Fix endian conversion size
Christophe Leroy <[email protected]>
powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro
Masahiro Yamada <[email protected]>
modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host
Christophe Leroy <[email protected]>
powerpc: Only define __parse_fpscr() when required
Chao Yu <[email protected]>
f2fs: fix to initialize map.m_pblk in f2fs_precache_extents()
Christophe JAILLET <[email protected]>
dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc()
Jonas Blixt <[email protected]>
USB: usbip: fix stub_dev hub disconnect
Matti Vaittinen <[email protected]>
tools: iio: iio_generic_buffer ensure alignment
Jinjie Ruan <[email protected]>
misc: st_core: Do not call kfree_skb() under spin_lock_irqsave()
Dan Carpenter <[email protected]>
dmaengine: ti: edma: handle irq_of_parse_and_map() errors
Michał Mirosław <[email protected]>
usb: chipidea: Simplify Tegra DMA alignment code
Michał Mirosław <[email protected]>
usb: chipidea: Fix DMA overwrite for Tegra
Jia-Ju Bai <[email protected]>
usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency
Fenghua Yu <[email protected]>
dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers
Ian Rogers <[email protected]>
perf evlist: Avoid frequency mode for the dummy event
Namhyung Kim <[email protected]>
perf tools: Get rid of evlist__add_on_all_cpus()
Adrian Hunter <[email protected]>
perf evlist: Add evlist__add_dummy_on_all_cpus()
Zheng Yejian <[email protected]>
livepatch: Fix missing newline character in klp_resolve_symbols()
Yi Yang <[email protected]>
tty: tty_jobctrl: fix pid memleak in disassociate_ctty()
Chao Yu <[email protected]>
f2fs: compress: fix to avoid redundant compress extension
Chao Yu <[email protected]>
f2fs: compress: fix to avoid use-after-free on dic
Christophe JAILLET <[email protected]>
leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu'
Uwe Kleine-König <[email protected]>
leds: pwm: Don't disable the PWM when the LED should be off
Marek Behún <[email protected]>
leds: turris-omnia: Do not use SMBUS calls
Marek Behún <[email protected]>
leds: turris-omnia: Drop unnecessary mutex locking
Hans de Goede <[email protected]>
mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs
Dinghao Liu <[email protected]>
mfd: dln2: Fix double put in dln2_probe
Herve Codina <[email protected]>
mfd: core: Ensure disabled devices are skipped without aborting
Michał Mirosław <[email protected]>
mfd: core: Un-constify mfd_cell.of_reg
Kuninori Morimoto <[email protected]>
ASoC: ams-delta.c: use component after check
Giovanni Cabiddu <[email protected]>
crypto: qat - fix deadlock in backlog processing
WangJinchao <[email protected]>
padata: Fix refcnt handling in padata_free_shell()
Cezary Rojewski <[email protected]>
ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails
Hans de Goede <[email protected]>
HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event()
Hans de Goede <[email protected]>
HID: logitech-hidpp: Revert "Don't restart communication if not necessary"
Hans de Goede <[email protected]>
HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only
Bastien Nocera <[email protected]>
HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk
Bastien Nocera <[email protected]>
Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures"
Geert Uytterhoeven <[email protected]>
sh: bios: Revive earlyprintk support
Danny Kaehn <[email protected]>
hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip
Leon Romanovsky <[email protected]>
RDMA/hfi1: Workaround truncation compilation error
Daniel Mentz <[email protected]>
scsi: ufs: core: Leave space for '\0' in utf8 desc string
Zhang Shurong <[email protected]>
ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
Luoyouming <[email protected]>
RDMA/hns: The UD mode can only be configured with DCQCN
Chengchang Tang <[email protected]>
RDMA/hns: Fix signed-unsigned mixed comparisons
Chengchang Tang <[email protected]>
RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common()
Patrisious Haddad <[email protected]>
IB/mlx5: Fix rdma counter binding for RAW QP
Kuninori Morimoto <[email protected]>
ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
Gou Hao <[email protected]>
ext4: move 'ix' sanity check to corrent position
Kursad Oney <[email protected]>
ARM: 9321/1: memset: cast the constant byte to unsigned char
Danny Kaehn <[email protected]>
hid: cp2112: Fix duplicate workqueue initialization
Giovanni Cabiddu <[email protected]>
crypto: qat - increase size of buffers
Gaurav Jain <[email protected]>
crypto: caam/jr - fix Chacha20 + Poly1305 self test failure
Gaurav Jain <[email protected]>
crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure
Tomas Glozar <[email protected]>
nd_btt: Make BTT lanes preemptible
Chen Ni <[email protected]>
libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value
Tyrel Datwyler <[email protected]>
scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code
Gustavo A. R. Silva <[email protected]>
RDMA/core: Use size_{add,sub,mul}() in calls to struct_size()
Jonas Gorski <[email protected]>
hwrng: geode - fix accessing registers
Christophe JAILLET <[email protected]>
crypto: hisilicon/hpre - Fix a erroneous check after snprintf()
Ilpo Järvinen <[email protected]>
selftests/resctrl: Ensure the benchmark commands fits to its array
Maciej Wieczor-Retman <[email protected]>
selftests/pidfd: Fix ksft print formats
Adam Ford <[email protected]>
arm64: dts: imx8mn: Add sound-dai-cells to micfil node
Adam Ford <[email protected]>
arm64: dts: imx8mm: Add sound-dai-cells to micfil node
Fabio Estevam <[email protected]>
arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry
Sudeep Holla <[email protected]>
clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
Sudeep Holla <[email protected]>
firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device
Dhruva Gole <[email protected]>
firmware: ti_sci: Mark driver as non removable
Uwe Kleine-König <[email protected]>
soc: qcom: llcc: Handle a second device without data corruption
Krzysztof Kozlowski <[email protected]>
ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator
Stephan Gerhold <[email protected]>
arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators
Chris Packham <[email protected]>
ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
Konrad Dybcio <[email protected]>
arm64: dts: qcom: sc7280: Add missing LMH interrupts
Krzysztof Kozlowski <[email protected]>
arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory
Gaurav Kohli <[email protected]>
arm64: dts: qcom: msm8916: Fix iommu local address range
Geert Uytterhoeven <[email protected]>
ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name
Junhao He <[email protected]>
perf: hisi: Fix use-after-free when register pmu fails
AngeloGioacchino Del Regno <[email protected]>
drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling
Dmitry Baryshkov <[email protected]>
drm/msm/dsi: use msm_gem_kernel_put to free TX buffer
Marek Marczykowski-Górecki <[email protected]>
xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled
Dan Carpenter <[email protected]>
drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map()
Mark Rutland <[email protected]>
arm64/arm: xen: enlighten: Fix KPTI checks
Dmitry Baryshkov <[email protected]>
drm/bridge: lt9611uxc: fix the race in the error path
Maxime Ripard <[email protected]>
drm/bridge: lt9611uxc: Register and attach our DSI device at probe
Maxime Ripard <[email protected]>
drm/bridge: lt9611uxc: Switch to devm MIPI-DSI helpers
Christophe JAILLET <[email protected]>
drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe()
Jason-JH.Lin <[email protected]>
drm/mediatek: Fix iommu fault during crtc enabling
Jason-JH.Lin <[email protected]>
drm/mediatek: Fix iommu fault by swapping FBs after updating plane state
Xiaogang Chen <[email protected]>
drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Fix bit updates
Dmitry Osipenko <[email protected]>
drm/bridge: tc358768: Disable non-continuous clock mode
Tomi Valkeinen <[email protected]>
drm/bridge: tc358768: Fix use of uninitialized variable
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Add missing drm_bridge_attach call
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Manually disable HPD only if it was enabled
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Fix crash on bridge detach
Tomi Valkeinen <[email protected]>
drm/bridge: lt8912b: Fix bridge_detach
Stefan Eichenberger <[email protected]>
drm/bridge: lt8912b: Add hot plug detection
Maxime Ripard <[email protected]>
drm/bridge: lt8912b: Register and attach our DSI device at probe
Maxime Ripard <[email protected]>
drm/bridge: lt8912b: Switch to devm MIPI-DSI helpers
Maxime Ripard <[email protected]>
drm/mipi-dsi: Create devm device attachment
Maxime Ripard <[email protected]>
drm/mipi-dsi: Create devm device registration
Konstantin Meskhidze <[email protected]>
drm/radeon: possible buffer overflow
Jonas Karlman <[email protected]>
drm/rockchip: vop: Fix call to crtc reset helper
Jonas Karlman <[email protected]>
drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
Zhang Rui <[email protected]>
hwmon: (coretemp) Fix potentially truncated sysfs attribute name
Dragos Bogdan <[email protected]>
hwmon: (axi-fan-control) Fix possible NULL pointer dereference
Armin Wolf <[email protected]>
platform/x86: wmi: Fix opening of char device
Barnabás Pőcze <[email protected]>
platform/x86: wmi: remove unnecessary initializations
Armin Wolf <[email protected]>
platform/x86: wmi: Fix probe failure when failing to register WMI devices
Varadarajan Narayanan <[email protected]>
clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
Jiasheng Jiang <[email protected]>
clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
Jonathan Neuschäfer <[email protected]>
clk: npcm7xx: Fix incorrect kfree
Dan Carpenter <[email protected]>
clk: ti: fix double free in of_ti_divider_clk_setup()
Dario Binacchi <[email protected]>
clk: ti: change ti_clk_register[_omap_hw]() API
Tony Lindgren <[email protected]>
clk: ti: Update component clocks to use ti_dt_clk_name()
Tony Lindgren <[email protected]>
clk: ti: Update pll and clockdomain clocks to use ti_dt_clk_name()
Tony Lindgren <[email protected]>
clk: ti: Add ti_dt_clk_name() helper to use clock-output-names
Dan Carpenter <[email protected]>
clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
Han Xu <[email protected]>
spi: nxp-fspi: use the correct ioremap function
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Fix computation formula
Claudiu Beznea <[email protected]>
clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields
Geert Uytterhoeven <[email protected]>
clk: renesas: rzg2l: Simplify multiplication/shift logic
Robert Chiras <[email protected]>
clk: imx: imx8qxp: Fix elcdif_pll clock
Peng Fan <[email protected]>
clk: imx: imx8mq: correct error handling path
Abel Vesa <[email protected]>
clk: imx: Select MXC_CLK for CLK_IMX8QXP
Danila Tikhonov <[email protected]>
clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks
Devi Priya <[email protected]>
clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
Zhang Shurong <[email protected]>
spi: tegra: Fix missing IRQ check in tegra_slink_probe()
Christophe JAILLET <[email protected]>
regmap: debugfs: Fix a erroneous check after snprintf()
Eric Dumazet <[email protected]>
ipvlan: properly track tx_errors
Eric Dumazet <[email protected]>
net: add DEV_STATS_READ() helper
Yan Zhai <[email protected]>
ipv6: avoid atomic fragment on GSO packets
Christophe JAILLET <[email protected]>
ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
Miri Korenblit <[email protected]>
wifi: iwlwifi: empty overflow queue during flush
Johannes Berg <[email protected]>
wifi: iwlwifi: pcie: synchronize IRQs before NAPI
Gregory Greenman <[email protected]>
wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues
Johannes Berg <[email protected]>
iwlwifi: pcie: adjust to Bz completion descriptor
Eric Dumazet <[email protected]>
tcp: fix cookie_init_timestamp() overflows
Eric Dumazet <[email protected]>
chtls: fix tp->rcv_tstamp initialization
Heiner Kallweit <[email protected]>
r8169: fix rare issue with broken rx after link-down on RTL8125
Juhee Kang <[email protected]>
r8169: use tp_to_dev instead of open code
Dan Carpenter <[email protected]>
thermal: core: prevent potential string overflow
Phil Sutter <[email protected]>
netfilter: nf_tables: Drop pointless memset when dumping rules
Sascha Hauer <[email protected]>
PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
Marc Kleine-Budde <[email protected]>
can: dev: can_put_echo_skb(): don't crash kernel if can_priv::echo_skb is accessed out of bounds
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
Marc Kleine-Budde <[email protected]>
can: dev: can_restart(): don't crash kernel if carrier is OK
Dmitry Antipov <[email protected]>
wifi: rtlwifi: fix EDCA limit set by BT coexistence
Eric Dumazet <[email protected]>
tcp_metrics: do not create an entry from tcp_init_metrics()
Eric Dumazet <[email protected]>
tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
Eric Dumazet <[email protected]>
tcp_metrics: add missing barriers on delete
Felix Fietkau <[email protected]>
wifi: mt76: mt7603: improve stuck beacon handling
Felix Fietkau <[email protected]>
mt76: pass original queue id from __mt76_tx_queue_skb to the driver
Felix Fietkau <[email protected]>
mt76: add support for overriding the device used for DMA mapping
Felix Fietkau <[email protected]>
mt76: dma: use kzalloc instead of devm_kzalloc for txwi
Felix Fietkau <[email protected]>
wifi: mt76: mt7603: rework/fix rx pse hang check
Jinjie Ruan <[email protected]>
wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
Gustavo A. R. Silva <[email protected]>
net: spider_net: Use size_add() in call to struct_size()
Gustavo A. R. Silva <[email protected]>
tipc: Use size_add() in calls to struct_size()
Gustavo A. R. Silva <[email protected]>
mlxsw: Use size_mul() in call to struct_size()
Gustavo A. R. Silva <[email protected]>
gve: Use size_add() in call to struct_size()
Aananth V <[email protected]>
tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
Eric Dumazet <[email protected]>
udp: add missing WRITE_ONCE() around up->encap_rcv
Miri Korenblit <[email protected]>
wifi: iwlwifi: Use FW rate for non-data frames
Leon Hwang <[email protected]>
selftests/bpf: Correct map_fd to data_fd in tailcalls
Jakub Sitnicki <[email protected]>
selftests/bpf: Test tail call counting with bpf2bpf and data on stack
Andrii Staikov <[email protected]>
i40e: fix potential memory leaks in i40e_remove()
Chen Yu <[email protected]>
genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
Jiasheng Jiang <[email protected]>
pstore/platform: Add check for kstrdup
Yuntao Wang <[email protected]>
x86/boot: Fix incorrect startup_gdt_descr.size
Adam Dunlap <[email protected]>
x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot
Adrian Hunter <[email protected]>
x86: Share definition of __is_canonical_address()
Ben Wolsieffer <[email protected]>
futex: Don't include process MM in futex key on no-MMU
Josh Poimboeuf <[email protected]>
x86/srso: Fix SBPB enablement for (possible) future fixed HW
Jingbo Xu <[email protected]>
writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs
Reuben Hawkins <[email protected]>
vfs: fix readahead(2) on block devices
Peter Zijlstra <[email protected]>
sched: Fix stop_one_cpu_nowait() vs hotplug
Qais Yousef <[email protected]>
sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
David Howells <[email protected]>
iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/qcom-mdm9615.dtsi | 14 +-- arch/arm/boot/dts/r8a7792-blanche.dts | 2 +- arch/arm/lib/memset.S | 1 + arch/arm/xen/enlighten.c | 25 ++-- arch/arm64/boot/dts/freescale/imx8mm.dtsi | 1 + arch/arm64/boot/dts/freescale/imx8mn.dtsi | 1 + arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi | 2 +- arch/arm64/boot/dts/marvell/cn9130-crb.dtsi | 4 +- arch/arm64/boot/dts/marvell/cn9130-db.dtsi | 4 +- arch/arm64/boot/dts/qcom/apq8016-sbc.dts | 3 + arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts | 5 - arch/arm64/boot/dts/qcom/sc7280.dtsi | 8 ++ arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 2 + arch/powerpc/include/asm/nohash/32/pte-40x.h | 3 - arch/powerpc/kernel/traps.c | 2 + arch/powerpc/perf/imc-pmu.c | 2 +- arch/powerpc/platforms/pseries/lpar.c | 4 +- arch/powerpc/sysdev/xive/native.c | 2 +- arch/sh/Kconfig.debug | 11 ++ arch/x86/events/intel/pt.c | 14 +-- arch/x86/include/asm/page.h | 10 ++ arch/x86/include/asm/uaccess.h | 2 +- arch/x86/kernel/cpu/bugs.c | 2 +- arch/x86/kernel/head64.c | 2 +- arch/x86/kvm/emulate.c | 4 +- arch/x86/kvm/x86.c | 2 +- arch/x86/kvm/x86.h | 7 +- arch/x86/lib/copy_mc.c | 8 +- arch/x86/mm/maccess.c | 24 ++-- block/blk-core.c | 14 +-- drivers/acpi/device_sysfs.c | 10 +- drivers/base/regmap/regmap-debugfs.c | 2 +- drivers/base/regmap/regmap.c | 16 +-- drivers/char/hw_random/geode-rng.c | 6 +- drivers/clk/clk-npcm7xx.c | 2 +- drivers/clk/clk-scmi.c | 1 + drivers/clk/imx/Kconfig | 1 + drivers/clk/imx/clk-imx8mq.c | 17 +-- drivers/clk/imx/clk-imx8qxp.c | 2 +- drivers/clk/keystone/pll.c | 15 ++- drivers/clk/mediatek/clk-mt2701.c | 8 ++ drivers/clk/mediatek/clk-mt6765.c | 6 + drivers/clk/mediatek/clk-mt6779.c | 4 + drivers/clk/mediatek/clk-mt6797.c | 6 + drivers/clk/mediatek/clk-mt7629-eth.c | 4 + drivers/clk/mediatek/clk-mt7629.c | 6 + drivers/clk/qcom/Kconfig | 1 + drivers/clk/qcom/clk-rcg2.c | 14 +-- drivers/clk/qcom/gcc-sm8150.c | 2 +- drivers/clk/qcom/mmcc-msm8998.c | 7 +- drivers/clk/renesas/rzg2l-cpg.c | 20 ++-- drivers/clk/ti/apll.c | 13 +- drivers/clk/ti/autoidle.c | 2 +- drivers/clk/ti/clk-dra7-atl.c | 6 +- drivers/clk/ti/clk.c | 52 +++++--- drivers/clk/ti/clkctrl.c | 4 +- drivers/clk/ti/clock.h | 11 +- drivers/clk/ti/clockdomain.c | 2 +- drivers/clk/ti/composite.c | 6 +- drivers/clk/ti/divider.c | 12 +- drivers/clk/ti/dpll.c | 10 +- drivers/clk/ti/fapll.c | 11 +- drivers/clk/ti/fixed-factor.c | 4 +- drivers/clk/ti/gate.c | 8 +- drivers/clk/ti/interface.c | 9 +- drivers/clk/ti/mux.c | 8 +- drivers/crypto/caam/caamalg.c | 3 +- drivers/crypto/caam/caamalg_qi2.c | 3 +- drivers/crypto/hisilicon/hpre/hpre_main.c | 2 +- drivers/crypto/qat/qat_common/adf_accel_devices.h | 2 +- .../crypto/qat/qat_common/adf_transport_debug.c | 4 +- drivers/crypto/qat/qat_common/qat_algs_send.c | 46 +++---- drivers/cxl/core/memdev.c | 3 +- drivers/devfreq/event/rockchip-dfi.c | 15 +-- drivers/dma/idxd/Makefile | 6 +- drivers/dma/pxa_dma.c | 1 - drivers/dma/ti/edma.c | 4 +- drivers/firmware/arm_ffa/bus.c | 1 + drivers/firmware/ti_sci.c | 46 +------ drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 8 +- drivers/gpu/drm/bridge/lontium-lt8912b.c | 62 +++++----- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 75 +++++------- drivers/gpu/drm/bridge/tc358768.c | 25 ++-- drivers/gpu/drm/drm_mipi_dsi.c | 81 +++++++++++++ drivers/gpu/drm/drm_syncobj.c | 3 +- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 + drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 +- drivers/gpu/drm/mediatek/mtk_dsi.c | 4 +- drivers/gpu/drm/msm/dsi/dsi_host.c | 3 +- drivers/gpu/drm/radeon/evergreen.c | 7 +- drivers/gpu/drm/rockchip/cdn-dp-core.c | 15 ++- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 8 +- drivers/hid/hid-cp2112.c | 9 +- drivers/hid/hid-logitech-hidpp.c | 76 +++++------- drivers/hwmon/axi-fan-control.c | 29 +++-- drivers/hwmon/coretemp.c | 2 +- drivers/i2c/busses/i2c-bcm-iproc.c | 133 ++++++++++++--------- drivers/i3c/master.c | 4 +- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/sa_query.c | 4 +- drivers/infiniband/core/sysfs.c | 10 +- drivers/infiniband/core/user_mad.c | 4 +- drivers/infiniband/hw/hfi1/efivar.c | 2 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 5 +- drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +- drivers/infiniband/hw/mlx5/qp.c | 27 +++++ drivers/input/rmi4/rmi_bus.c | 2 +- drivers/leds/leds-pwm.c | 2 +- drivers/leds/leds-turris-omnia.c | 65 ++++++---- drivers/leds/trigger/ledtrig-cpu.c | 4 +- drivers/media/i2c/max9286.c | 2 - drivers/media/pci/bt8xx/bttv-driver.c | 1 + drivers/media/platform/s3c-camif/camif-capture.c | 6 +- drivers/media/test-drivers/vidtv/vidtv_mux.c | 7 +- drivers/media/test-drivers/vidtv/vidtv_psi.c | 45 ++++++- drivers/media/usb/dvb-usb-v2/af9035.c | 13 +- drivers/mfd/arizona-spi.c | 3 + drivers/mfd/dln2.c | 1 - drivers/mfd/mfd-core.c | 17 ++- drivers/misc/ti-st/st_core.c | 7 +- drivers/mmc/core/mmc.c | 2 +- drivers/net/can/dev/dev.c | 10 +- drivers/net/can/dev/skb.c | 6 +- drivers/net/ethernet/broadcom/tg3.c | 3 +- .../chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- drivers/net/ethernet/google/gve/gve_main.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 10 +- .../net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 80 +++++++------ .../ethernet/marvell/octeontx2/nic/otx2_struct.h | 34 +++--- .../mellanox/mlxsw/spectrum_acl_bloom_filter.c | 2 +- drivers/net/ethernet/realtek/r8169_main.c | 15 ++- drivers/net/ethernet/stmicro/stmmac/dwxgmac2.h | 2 +- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 14 ++- drivers/net/ethernet/toshiba/spider_net.c | 2 +- drivers/net/ipvlan/ipvlan_core.c | 8 +- drivers/net/ipvlan/ipvlan_main.c | 1 + drivers/net/macsec.c | 6 +- drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 5 +- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 +- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 18 +-- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 21 +++- drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 72 ++++++++--- .../net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 2 + drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 2 + drivers/net/wireless/intel/iwlwifi/queue/tx.c | 9 +- drivers/net/wireless/intel/iwlwifi/queue/tx.h | 2 +- drivers/net/wireless/mediatek/mt76/dma.c | 46 +++---- drivers/net/wireless/mediatek/mt76/mac80211.c | 1 + drivers/net/wireless/mediatek/mt76/mt76.h | 5 +- drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 78 ++++++++---- drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 + drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 23 ++-- drivers/net/wireless/mediatek/mt76/mt7603/regs.h | 5 + drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 3 +- drivers/net/wireless/mediatek/mt76/sdio.c | 6 +- drivers/net/wireless/mediatek/mt76/testmode.c | 4 +- drivers/net/wireless/mediatek/mt76/tx.c | 2 +- drivers/net/wireless/mediatek/mt76/usb.c | 6 +- .../net/wireless/realtek/rtlwifi/rtl8188ee/dm.c | 2 +- .../wireless/realtek/rtlwifi/rtl8192c/dm_common.c | 2 +- .../net/wireless/realtek/rtlwifi/rtl8723ae/dm.c | 2 +- drivers/net/wireless/realtek/rtw88/debug.c | 4 +- drivers/nvdimm/of_pmem.c | 8 +- drivers/nvdimm/region_devs.c | 8 +- drivers/pcmcia/cs.c | 1 + drivers/pcmcia/ds.c | 14 ++- drivers/perf/hisilicon/hisi_uncore_pa_pmu.c | 4 +- drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c | 4 +- drivers/platform/x86/wmi.c | 50 ++++---- drivers/pwm/pwm-brcmstb.c | 4 +- drivers/pwm/pwm-sti.c | 29 +++-- drivers/rtc/rtc-pcf85363.c | 2 +- drivers/scsi/ibmvscsi/ibmvfc.c | 3 +- drivers/scsi/ufs/ufshcd.c | 2 +- drivers/soc/qcom/llcc-qcom.c | 3 + drivers/spi/Kconfig | 1 + drivers/spi/spi-nxp-fspi.c | 2 +- drivers/spi/spi-tegra20-slink.c | 2 + drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 24 ++-- drivers/thermal/thermal_core.c | 6 +- drivers/tty/tty_jobctrl.c | 17 ++- drivers/usb/chipidea/host.c | 48 ++++---- drivers/usb/dwc2/hcd.c | 2 +- drivers/usb/host/xhci-pci.c | 2 + drivers/usb/host/xhci-plat.c | 23 +++- drivers/usb/usbip/stub_dev.c | 9 +- drivers/video/fbdev/fsl-diu-fb.c | 2 +- drivers/video/fbdev/imsttfb.c | 33 ++--- drivers/xen/xen-pciback/conf_space.c | 19 ++- drivers/xen/xen-pciback/conf_space_capability.c | 8 +- drivers/xen/xen-pciback/conf_space_header.c | 21 +--- fs/btrfs/ioctl.c | 10 +- fs/ext4/extents.c | 10 +- fs/f2fs/data.c | 4 +- fs/f2fs/file.c | 1 + fs/f2fs/super.c | 33 +++++ fs/fs-writeback.c | 41 +++++-- fs/pstore/platform.c | 9 +- include/drm/drm_mipi_dsi.h | 4 + include/linux/cpuhotplug.h | 1 + include/linux/idr.h | 6 +- include/linux/mfd/core.h | 2 +- include/linux/netdevice.h | 1 + include/net/flow.h | 2 +- include/net/netfilter/nf_nat_redirect.h | 3 +- include/net/tcp.h | 2 +- kernel/bpf/helpers.c | 25 ++-- kernel/futex/core.c | 12 +- kernel/irq/matrix.c | 6 +- kernel/livepatch/core.c | 2 +- kernel/padata.c | 6 +- kernel/sched/core.c | 10 +- kernel/sched/deadline.c | 2 + kernel/sched/fair.c | 22 +--- kernel/sched/rt.c | 4 + kernel/trace/trace_kprobe.c | 2 +- mm/readahead.c | 3 +- net/9p/client.c | 6 +- net/dccp/ipv4.c | 6 +- net/dccp/ipv6.c | 6 +- net/hsr/hsr_forward.c | 4 +- net/ipv4/syncookies.c | 20 ++-- net/ipv4/tcp_input.c | 9 +- net/ipv4/tcp_metrics.c | 15 ++- net/ipv4/udp.c | 6 +- net/ipv6/ip6_output.c | 8 +- net/ipv6/syncookies.c | 7 +- net/llc/llc_input.c | 10 +- net/llc/llc_s_ac.c | 3 + net/llc/llc_station.c | 3 + net/netfilter/nf_nat_redirect.c | 98 ++++++++------- net/netfilter/nf_tables_api.c | 4 - net/netfilter/nft_redir.c | 84 +++++-------- net/netfilter/xt_REDIRECT.c | 10 +- net/netfilter/xt_recent.c | 2 +- net/smc/af_smc.c | 4 +- net/smc/smc.h | 5 + net/smc/smc_cdc.c | 11 +- net/smc/smc_close.c | 5 +- net/tipc/link.c | 4 +- net/tipc/netlink.c | 4 +- scripts/mod/file2alias.c | 10 +- sound/soc/codecs/hdmi-codec.c | 27 +++-- sound/soc/fsl/fsl_easrc.c | 8 +- sound/soc/fsl/mpc5200_dma.c | 3 + sound/soc/intel/skylake/skl-sst-utils.c | 1 + sound/soc/ti/ams-delta.c | 4 +- tools/iio/iio_generic_buffer.c | 13 +- tools/perf/util/evlist.c | 21 ++++ tools/perf/util/evlist.h | 5 + tools/perf/util/hist.c | 10 +- tools/perf/util/machine.c | 22 ++-- tools/testing/selftests/bpf/prog_tests/tailcalls.c | 85 ++++++++++--- .../selftests/bpf/progs/tailcall_bpf2bpf6.c | 42 +++++++ tools/testing/selftests/net/pmtu.sh | 2 +- tools/testing/selftests/pidfd/pidfd_fdinfo_test.c | 2 +- tools/testing/selftests/pidfd/pidfd_test.c | 12 +- tools/testing/selftests/resctrl/resctrl_tests.c | 5 + 261 files changed, 1932 insertions(+), 1193 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/244 iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 066baf92bed934c9fb4bcee97a193f47aa63431c ]
copy_mc_to_user() has the destination marked __user on powerpc, but not on x86; the latter results in a sparse warning in lib/iov_iter.c.
Fix this by applying the tag on x86 too.
--- arch/x86/include/asm/uaccess.h | 2 +- arch/x86/lib/copy_mc.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
arch/x86/include/asm/uaccess.h +1 -1
@@ -543,7 +543,7 @@ copy_mc_to_kernel(void *to, const void *from, unsigned len);#define copy_mc_to_kernel copy_mc_to_kernelunsigned long __must_check -copy_mc_to_user (void *to,const void *from,unsigned len); +copy_mc_to_user (void __user *to,const void *from,unsigned len);#endif /*
arch/x86/lib/copy_mc.c +4 -4
@@ -70,23 +70,23 @@ unsigned long __must_check copy_mc_to_kernel(void *dst, const void *src, unsigne }EXPORT_SYMBOL_GPL (copy_mc_to_kernel); -unsigned long __must_check copy_mc_to_user (void *dst,const void *src,unsigned len) +unsigned long __must_check copy_mc_to_user (void __user *dst,const void *src,unsigned len) {unsigned long ret;if (copy_mc_fragile_enabled) {__uaccess_begin (); - ret =copy_mc_fragile (dst, src, len); + ret =copy_mc_fragile ((__force void *)dst, src, len);__uaccess_end ();return ret; }if (static_cpu_has (X86_FEATURE_ERMS )) {__uaccess_begin (); - ret =copy_mc_enhanced_fast_string (dst, src, len); + ret =copy_mc_enhanced_fast_string ((__force void *)dst, src, len);__uaccess_end ();return ret; } -return copy_user_generic (dst, src, len); +return copy_user_generic ((__force void *)dst, src, len); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 2/244 sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qais Yousef <[email protected]>
[ Upstream commit 23c9519def98ee0fa97ea5871535e9b136f522fc ]
find_energy_efficient_cpu() bails out early if effective util of the task is 0 as the delta at this point will be zero and there's nothing for EAS to do. When uclamp is being used, this could lead to wrong decisions when uclamp_max is set to 0. In this case the task is capped to performance point 0, but it is actually running and consuming energy and we can benefit from EAS energy calculations.
Rework the condition so that it bails out when both util and uclamp_min are 0.
We can do that without needing to use uclamp_task_util(); remove it.
--- kernel/sched/fair.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-)
kernel/sched/fair.c +1 -17
@@ -3987,22 +3987,6 @@ static inline unsigned long task_util_est(struct task_struct *p)return max (task_util (p),_task_util_est (p)); } -#ifdef CONFIG_UCLAMP_TASK -static inline unsigned long uclamp_task_util (struct task_struct *p, -unsigned long uclamp_min, -unsigned long uclamp_max) -{ -return clamp (task_util_est (p), uclamp_min, uclamp_max); -} -#else -static inline unsigned long uclamp_task_util (struct task_struct *p, -unsigned long uclamp_min, -unsigned long uclamp_max) -{ -return task_util_est (p); -} -#endif -static inline void util_est_enqueue (struct cfs_rq *cfs_rq,struct task_struct *p) {
@@ -7037,7 +7021,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) target = prev_cpu;sync_entity_load_avg (&p->se); -if (!uclamp_task_util (p, p_util_min, p_util_max)) +if (!task_util_est (p) && p_util_min ==0 ) goto unlock;for (; pd; pd = pd->next) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 3/244 sched: Fix stop_one_cpu_nowait() vs hotplug
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit f0498d2a54e7966ce23cd7c7ff42c64fa0059b07 ]
Kuyo reported sporadic failures on a sched_setaffinity() vs CPU hotplug stress-test -- notably affine_move_task() remains stuck in wait_for_completion(), leading to a hung-task detector warning.
Specifically, it was reported that stop_one_cpu_nowait(.fn = migration_cpu_stop) returns false -- this stopper is responsible for the matching complete().
The race scenario is:
CPU0 CPU1 // doing _cpu_down()
__set_cpus_allowed_ptr()
task_rq_lock();
takedown_cpu()
stop_machine_cpuslocked(take_cpu_down..)
<PREEMPT: cpu_stopper_thread()
MULTI_STOP_PREPARE
...
__set_cpus_allowed_ptr_locked()
affine_move_task()
task_rq_unlock();<PREEMPT: cpu_stopper_thread()\>
ack_state()
MULTI_STOP_RUN
take_cpu_down()
__cpu_disable();
stop_machine_park();
stopper->enabled = false;
/>
/>
stop_one_cpu_nowait(.fn = migration_cpu_stop);
if (stopper->enabled) // false!!!That is, by doing stop_one_cpu_nowait() after dropping rq-lock, the stopper thread gets a chance to preempt and allows the cpu-down for the target CPU to complete.
OTOH, since stop_one_cpu_nowait() / cpu_stop_queue_work() needs to issue a wakeup, it must not be ran under the scheduler locks.
Solve this apparent contradiction by keeping preemption disabled over the unlock + queue_stopper combination:
preempt_disable(); task_rq_unlock(...); if (!stop_pending) stop_one_cpu_nowait(...) preempt_enable();
This respects the lock ordering contraints while still avoiding the above race. That is, if we find the CPU is online under rq-lock, the targeted stop_one_cpu_nowait() must succeed.
Apply this pattern to all similar stop_one_cpu_nowait() invocations.
--- kernel/sched/core.c | 10 ++++++++-- kernel/sched/deadline.c | 2 ++ kernel/sched/fair.c | 4 +++- kernel/sched/rt.c | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-)
kernel/sched/core.c +8 -2
@@ -2377,9 +2377,11 @@ static int migration_cpu_stop(void *data)* it. */ WARN_ON_ONCE (!pending->stop_pending); +preempt_disable ();task_rq_unlock (rq, p, &rf);stop_one_cpu_nowait (task_cpu (p), migration_cpu_stop, &pending->arg, &pending->stop_work); +preempt_enable ();return 0 ; } out:
@@ -2660,12 +2662,13 @@ static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flag complete = true; } +preempt_disable ();task_rq_unlock (rq, p, rf); -if (push_task) {stop_one_cpu_nowait (rq->cpu, push_cpu_stop, p, &rq->push_work); } +preempt_enable ();if (complete)complete_all (&pending->done);
@@ -2731,12 +2734,13 @@ static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flagif (flags &SCA_MIGRATE_ENABLE ) p->migration_flags &= ~MDF_PUSH ; +preempt_disable ();task_rq_unlock (rq, p, rf); -if (!stop_pending) {stop_one_cpu_nowait (cpu_of (rq), migration_cpu_stop, &pending->arg, &pending->stop_work); } +preempt_enable ();if (flags &SCA_MIGRATE_ENABLE )return 0 ;
@@ -8961,9 +8965,11 @@ static void balance_push(struct rq *rq)* Temporarily drop rq->lock such that we can wake-up the stop task. * Both preemption and IRQs are still disabled. */ +preempt_disable ();raw_spin_rq_unlock (rq);stop_one_cpu_nowait (rq->cpu, __balance_push_cpu_stop, push_task,this_cpu_ptr (&push_work)); +preempt_enable ();/* * At this point need_resched() is true and we'll take the loop in * schedule(). The next pick is obviously going to be the stop task
kernel/sched/deadline.c +2 -0
@@ -2308,9 +2308,11 @@ static void pull_dl_task(struct rq *this_rq)double_unlock_balance (this_rq, src_rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (this_rq);stop_one_cpu_nowait (src_rq->cpu, push_cpu_stop, push_task, &src_rq->push_work); +preempt_enable ();raw_spin_rq_lock (this_rq); } }
kernel/sched/fair.c +3 -1
@@ -10364,13 +10364,15 @@ static int load_balance(int this_cpu, struct rq *this_rq, busiest->push_cpu = this_cpu; active_balance =1 ; } -raw_spin_rq_unlock_irqrestore (busiest, flags); +preempt_disable (); +raw_spin_rq_unlock_irqrestore (busiest, flags);if (active_balance) {stop_one_cpu_nowait (cpu_of (busiest), active_load_balance_cpu_stop, busiest, &busiest->active_balance_work); } +preempt_enable (); } }else { sd->nr_balance_failed =0 ;
kernel/sched/rt.c +4 -0
@@ -1951,9 +1951,11 @@ static int push_rt_task(struct rq *rq, bool pull)*/ push_task =get_push_task (rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (rq);stop_one_cpu_nowait (rq->cpu, push_cpu_stop, push_task, &rq->push_work); +preempt_enable ();raw_spin_rq_lock (rq); }
@@ -2290,9 +2292,11 @@ static void pull_rt_task(struct rq *this_rq)double_unlock_balance (this_rq, src_rq);if (push_task) { +preempt_disable ();raw_spin_rq_unlock (this_rq);stop_one_cpu_nowait (src_rq->cpu, push_cpu_stop, push_task, &src_rq->push_work); +preempt_enable ();raw_spin_rq_lock (this_rq); } }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 4/244 vfs: fix readahead(2) on block devices
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Reuben Hawkins <[email protected]>
[ Upstream commit 7116c0af4b8414b2f19fdb366eea213cbd9d91c2 ]
Readahead was factored to call generic_fadvise. That refactor added an S_ISREG restriction which broke readahead on block devices.
In addition to S_ISREG, this change checks S_ISBLK to fix block device readahead. There is no change in behavior with any file type besides block devices in this change.
--- mm/readahead.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/readahead.c +2 -1
@@ -627,7 +627,8 @@ ssize_t ksys_readahead(int fd, loff_t offset, size_t count)*/ ret = -EINVAL ;if (!f.file->f_mapping || !f.file->f_mapping->a_ops || - !S_ISREG (file_inode (f.file)->i_mode)) + (!S_ISREG (file_inode (f.file)->i_mode) && + !S_ISBLK (file_inode (f.file)->i_mode))) goto out; ret =vfs_fadvise (f.file, offset, count,POSIX_FADV_WILLNEED );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 5/244 writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jingbo Xu <[email protected]>
[ Upstream commit 6654408a33e6297d8e1d2773409431d487399b95 ]
The cgwb cleanup routine will try to release the dying cgwb by switching the attached inodes. It fetches the attached inodes from wb->b_attached list, omitting the fact that inodes only with dirty timestamps reside in wb->b_dirty_time list, which is the case when lazytime is enabled. This causes enormous zombie memory cgroup when lazytime is enabled, as inodes with dirty timestamps can not be switched to a live cgwb for a long time.
It is reasonable not to switch cgwb for inodes with dirty data, as otherwise it may break the bandwidth restrictions. However since the writeback of inode metadata is not accounted for, let's also switch inodes with dirty timestamps to avoid zombie memory and block cgroups when laztytime is enabled.
--- fs/fs-writeback.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-)
fs/fs-writeback.c +29 -12
@@ -609,6 +609,24 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)kfree (isw); } +static bool isw_prepare_wbs_switch (struct inode_switch_wbs_context *isw, +struct list_head *list,int *nr) +{ +struct inode *inode; + +list_for_each_entry (inode, list, i_io_list) { +if (!inode_prepare_wbs_switch (inode, isw->new_wb)) +continue ; + + isw->inodes[*nr] = inode; + (*nr)++; + +if (*nr >=WB_MAX_INODES_PER_ISW -1 ) +return true; + } +return false; +} +/** * cleanup_offline_cgwb - detach associated inodes * @wb: target wb
@@ -621,7 +639,6 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb) {struct cgroup_subsys_state *memcg_css;struct inode_switch_wbs_context *isw; -struct inode *inode;int nr;bool restart = false;
@@ -643,17 +660,17 @@ bool cleanup_offline_cgwb(struct bdi_writeback *wb) nr =0 ;spin_lock (&wb->list_lock); -list_for_each_entry (inode, &wb->b_attached, i_io_list) { -if (!inode_prepare_wbs_switch (inode, isw->new_wb)) -continue ; - - isw->inodes[nr++] = inode; - -if (nr >=WB_MAX_INODES_PER_ISW -1 ) { - restart = true; -break ; - } - } +/* +* In addition to the inodes that have completed writeback, also switch +* cgwbs for those inodes only with dirty timestamps. Otherwise, those +* inodes won't be written back for a long time when lazytime is +* enabled, and thus pinning the dying cgwbs. It won't break the +* bandwidth restrictions, as writeback of inode metadata is not +* accounted for. +*/ + restart =isw_prepare_wbs_switch (isw, &wb->b_attached, &nr); +if (!restart) + restart =isw_prepare_wbs_switch (isw, &wb->b_dirty_time, &nr);spin_unlock (&wb->list_lock);/* no attached inodes? bail out */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 6/244 x86/srso: Fix SBPB enablement for (possible) future fixed HW
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
[ Upstream commit 1d1142ac51307145dbb256ac3535a1d43a1c9800 ]
Make the SBPB check more robust against the (possible) case where future HW has SRSO fixed but doesn't have the SRSO_NO bit set.
--- arch/x86/kernel/cpu/bugs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/cpu/bugs.c +1 -1
@@ -2477,7 +2477,7 @@ static void __init srso_select_mitigation(void)pr_info ("%s%s\n" , srso_strings[srso_mitigation], (has_microcode ?"" :", no microcode" )); pred_cmd: -if ((boot_cpu_has (X86_FEATURE_SRSO_NO ) || srso_cmd ==SRSO_CMD_OFF ) && +if ((!boot_cpu_has_bug (X86_BUG_SRSO ) || srso_cmd ==SRSO_CMD_OFF ) &&boot_cpu_has (X86_FEATURE_SBPB )) x86_pred_cmd =PRED_CMD_SBPB ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 7/244 futex: Dont include process MM in futex key on no-MMU
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Wolsieffer <[email protected]>
[ Upstream commit c73801ae4f22b390228ebf471d55668e824198b6 ]
On no-MMU, all futexes are treated as private because there is no need to map a virtual address to physical to match the futex across processes. This doesn't quite work though, because private futexes include the current process's mm_struct as part of their key. This makes it impossible for one process to wake up a shared futex being waited on in another process.
Fix this bug by excluding the mm_struct from the key. With a single address space, the futex address is already a unique key.
--- kernel/futex/core.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
kernel/futex/core.c +11 -1
@@ -570,7 +570,17 @@ static int get_futex_key(u32 __user *uaddr, bool fshared, union futex_key *key,* but access_ok() should be faster than find_vma() */ if (!fshared) { - key->private.mm = mm; +/* +* On no-MMU, shared futexes are treated as private, therefore +* we must not include the current process in the key. Since +* there is only one address space, the address is a unique key +* on its own. +*/ +if (IS_ENABLED (CONFIG_MMU )) + key->private.mm = mm; +else + key->private.mm =NULL ; + key->private.address = address;return 0 ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 8/244 x86: Share definition of __is_canonical_address()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
[ Upstream commit 1fb85d06ad6754796cd1b920639ca9d8840abefd ]
Reduce code duplication by moving canonical address code to a common header file.
Stable-dep-of: f79936545fb1 ("x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot")
--- arch/x86/events/intel/pt.c | 14 ++------------ arch/x86/include/asm/page.h | 10 ++++++++++ arch/x86/kvm/emulate.c | 4 ++-- arch/x86/kvm/x86.c | 2 +- arch/x86/kvm/x86.h | 7 +------ arch/x86/mm/maccess.c | 7 +------ 6 files changed, 17 insertions(+), 27 deletions(-)
arch/x86/events/intel/pt.c +2 -12
@@ -1360,20 +1360,10 @@ static void pt_addr_filters_fini(struct perf_event *event) }#ifdef CONFIG_X86_64 -static u64 canonical_address (u64 vaddr,u8 vaddr_bits) -{ -return ((s64 )vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); -} - -static u64 is_canonical_address (u64 vaddr,u8 vaddr_bits) -{ -return canonical_address (vaddr, vaddr_bits) == vaddr; -} -/* Clamp to a canonical address greater-than-or-equal-to the address given */ static u64 clamp_to_ge_canonical_addr (u64 vaddr,u8 vaddr_bits) { -return is_canonical_address (vaddr, vaddr_bits) ? +return __is_canonical_address (vaddr, vaddr_bits) ? vaddr : -BIT_ULL (vaddr_bits -1 ); }
@@ -1381,7 +1371,7 @@ static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)/* Clamp to a canonical address less-than-or-equal-to the address given */ static u64 clamp_to_le_canonical_addr (u64 vaddr,u8 vaddr_bits) { -return is_canonical_address (vaddr, vaddr_bits) ? +return __is_canonical_address (vaddr, vaddr_bits) ? vaddr :BIT_ULL (vaddr_bits -1 ) -1 ; }
arch/x86/include/asm/page.h +10 -0
@@ -71,6 +71,16 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,extern bool __virt_addr_valid (unsigned long kaddr);#define virt_addr_valid (kaddr) __virt_addr_valid((unsigned long) (kaddr)) +static __always_inline u64 __canonical_address(u64 vaddr, u8 vaddr_bits) +{ +return ((s64 )vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); +} + +static __always_inline u64 __is_canonical_address(u64 vaddr, u8 vaddr_bits) +{ +return __canonical_address (vaddr, vaddr_bits) == vaddr; +} +#endif /* __ASSEMBLY__ */ #include <asm-generic/memory_model.h>
arch/x86/kvm/emulate.c +2 -2
@@ -687,7 +687,7 @@ static inline u8 ctxt_virt_addr_bits(struct x86_emulate_ctxt *ctxt)static inline bool emul_is_noncanonical_address (u64 la,struct x86_emulate_ctxt *ctxt) { -return get_canonical (la,ctxt_virt_addr_bits (ctxt)) != la; +return !__is_canonical_address (la,ctxt_virt_addr_bits (ctxt)); }/*
@@ -737,7 +737,7 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,case X86EMUL_MODE_PROT64 : *linear = la; va_bits =ctxt_virt_addr_bits (ctxt); -if (get_canonical (la, va_bits) != la) +if (!__is_canonical_address (la, va_bits)) goto bad; *max_size =min_t (u64, ~0u , (1ull << va_bits) - la);
arch/x86/kvm/x86.c +1 -1
@@ -1745,7 +1745,7 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,* value, and that something deterministic happens if the guest * invokes 64-bit SYSENTER. */ - data =get_canonical (data,vcpu_virt_addr_bits (vcpu)); + data =__canonical_address (data,vcpu_virt_addr_bits (vcpu));break ;case MSR_TSC_AUX :if (!kvm_is_supported_user_return_msr (MSR_TSC_AUX ))
arch/x86/kvm/x86.h +1 -6
@@ -211,14 +211,9 @@ static inline u8 vcpu_virt_addr_bits(struct kvm_vcpu *vcpu)return kvm_read_cr4_bits (vcpu,X86_CR4_LA57 ) ?57 :48 ; } -static inline u64 get_canonical (u64 la,u8 vaddr_bits) -{ -return ((int64_t )la << (64 - vaddr_bits)) >> (64 - vaddr_bits); -} -static inline bool is_noncanonical_address (u64 la,struct kvm_vcpu *vcpu) { -return get_canonical (la,vcpu_virt_addr_bits (vcpu)) != la; +return !__is_canonical_address (la,vcpu_virt_addr_bits (vcpu)); } static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu,
arch/x86/mm/maccess.c +1 -6
@@ -4,11 +4,6 @@#include <linux/kernel.h> #ifdef CONFIG_X86_64 -static __always_inline u64 canonical_address(u64 vaddr, u8 vaddr_bits) -{ -return ((s64 )vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); -} -bool copy_from_kernel_nofault_allowed (const void *unsafe_src,size_t size) {unsigned long vaddr = (unsigned long )unsafe_src;
@@ -19,7 +14,7 @@ bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)* we also need to include the userspace guard page. */ return vaddr >=TASK_SIZE_MAX +PAGE_SIZE && - canonical_address(vaddr, boot_cpu_data.x86_virt_bits) == vaddr; + __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); }#else bool copy_from_kernel_nofault_allowed (const void *unsafe_src,size_t size)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 9/244 x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Dunlap <[email protected]>
[ Upstream commit f79936545fb122856bd78b189d3c7ee59928c751 ]
Previously, if copy_from_kernel_nofault() was called before boot_cpu_data.x86_virt_bits was set up, then it would trigger undefined behavior due to a shift by 64.
This ended up causing boot failures in the latest version of ubuntu2204 in the gcp project when using SEV-SNP.
Specifically, this function is called during an early #VC handler which is triggered by a CPUID to check if NX is implemented.
--- arch/x86/mm/maccess.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
arch/x86/mm/maccess.c +14 -5
@@ -9,12 +9,21 @@ bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)unsigned long vaddr = (unsigned long )unsafe_src;/* -* Range covering the highest possible canonical userspace address -* as well as non-canonical address range. For the canonical range -* we also need to include the userspace guard page. +* Do not allow userspace addresses. This disallows +* normal userspace and the userspace guard page: */ -return vaddr >=TASK_SIZE_MAX +PAGE_SIZE && - __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); +if (vaddr <TASK_SIZE_MAX +PAGE_SIZE ) +return false; + +/* +* Allow everything during early boot before 'x86_virt_bits' +* is initialized. Needed for instruction decoding in early +* exception handlers. +*/ +if (!boot_cpu_data.x86_virt_bits) +return true; + + return __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); }#else bool copy_from_kernel_nofault_allowed (const void *unsafe_src,size_t size)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 10/244 x86/boot: Fix incorrect startup_gdt_descr.size
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuntao Wang <[email protected]>
[ Upstream commit 001470fed5959d01faecbd57fcf2f60294da0de1 ]
Since the size value is added to the base address to yield the last valid byte address of the GDT, the current size value of startup_gdt_descr is incorrect (too large by one), fix it.
[ mingo: This probably never mattered, because startup_gdt[] is only used
in a very controlled fashion - but make it consistent nevertheless. ]
--- arch/x86/kernel/head64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/head64.c +1 -1
@@ -79,7 +79,7 @@ static struct desc_struct startup_gdt[GDT_ENTRIES] = {* while the kernel still uses a direct mapping. */ static struct desc_ptr startup_gdt_descr = { - .size =sizeof (startup_gdt), + .size =sizeof (startup_gdt)-1 , .address =0 , };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 11/244 pstore/platform: Add check for kstrdup
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit a19d48f7c5d57c0f0405a7d4334d1d38fe9d3c1c ]
Add check for the return value of kstrdup() and return the error if it fails in order to avoid NULL pointer dereference.
--- fs/pstore/platform.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/pstore/platform.c +8 -1
@@ -561,6 +561,8 @@ static int pstore_write_user_compat(struct pstore_record *record,*/ int pstore_register (struct pstore_info *psi) { +char *new_backend; +if (backend &&strcmp (backend, psi->name)) {pr_warn ("ignoring unexpected backend '%s'\n" , psi->name);return -EPERM ;
@@ -580,11 +582,16 @@ int pstore_register(struct pstore_info *psi)return -EINVAL ; } + new_backend =kstrdup (psi->name,GFP_KERNEL ); +if (!new_backend) +return -ENOMEM ; +mutex_lock (&psinfo_lock);if (psinfo) {pr_warn ("backend '%s' already loaded: ignoring '%s'\n" , psinfo->name, psi->name);mutex_unlock (&psinfo_lock); +kfree (new_backend);return -EBUSY ; }
@@ -617,7 +624,7 @@ int pstore_register(struct pstore_info *psi)* Update the module parameter backend, so it is visible * through /sys/module/pstore/parameters/backend */ - backend =kstrdup (psi->name,GFP_KERNEL ); + backend = new_backend;pr_info ("Registered %s as persistent store backend\n" , psi->name);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 12/244 genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yu <[email protected]>
[ Upstream commit a0b0bad10587ae2948a7c36ca4ffc206007fbcf3 ]
When a CPU is about to be offlined, x86 validates that all active interrupts which are targeted to this CPU can be migrated to the remaining online CPUs. If not, the offline operation is aborted.
The validation uses irq_matrix_allocated() to retrieve the number of vectors which are allocated on the outgoing CPU. The returned number of allocated vectors includes also vectors which are associated to managed interrupts.
That's overaccounting because managed interrupts are:
- not migrated when the affinity mask of the interrupt targets only the outgoing CPU
- migrated to another CPU, but in that case the vector is already pre-allocated on the potential target CPUs and must not be taken into account.
As a consequence the check whether the remaining online CPUs have enough capacity for migrating the allocated vectors from the outgoing CPU might fail incorrectly.
Let irq_matrix_allocated() return only the number of allocated non-managed interrupts to make this validation check correct.
[ tglx: Amend changelog and fixup kernel-doc comment ]
--- kernel/irq/matrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/irq/matrix.c +3 -3
@@ -466,16 +466,16 @@ unsigned int irq_matrix_reserved(struct irq_matrix *m) }/** -* irq_matrix_allocated - Get the number of allocated irqs on the local cpu +* irq_matrix_allocated - Get the number of allocated non-managed irqs on the local CPU * @m: Pointer to the matrix to search * -* This returns number of allocated irqs +* This returns number of allocated non-managed interrupts. */ unsigned int irq_matrix_allocated (struct irq_matrix *m) {struct cpumap *cm =this_cpu_ptr (m->maps); -return cm->allocated; +return cm->allocated - cm->managed_allocated; }#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 13/244 i40e: fix potential memory leaks in i40e_remove()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Staikov <[email protected]>
[ Upstream commit 5ca636d927a106780451d957734f02589b972e2b ]
Instead of freeing memory of a single VSI, make sure the memory for all VSIs is cleared before releasing VSIs. Add releasing of their resources in a loop with the iteration number equal to the number of allocated VSIs.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +7 -3
@@ -16258,11 +16258,15 @@ static void i40e_remove(struct pci_dev *pdev)i40e_switch_branch_release (pf->veb[i]); } -/* Now we can shutdown the PF's VSI, just before we kill +/* Now we can shutdown the PF's VSIs, just before we kill * adminq and hmc. */ -if (pf->vsi[pf->lan_vsi]) -i40e_vsi_release (pf->vsi[pf->lan_vsi]); +for (i = pf->num_alloc_vsi; i--;) +if (pf->vsi[i]) { +i40e_vsi_close (pf->vsi[i]); +i40e_vsi_release (pf->vsi[i]); + pf->vsi[i] =NULL ; + }i40e_cloud_filter_exit (pf);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 14/244 selftests/bpf: Test tail call counting with bpf2bpf and data on stack
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Sitnicki <[email protected]>
[ Upstream commit 5e0b0a4c52d30bb09659446f40b77a692361600d ]
Cover the case when tail call count needs to be passed from BPF function to BPF function, and the caller has data on stack. Specifically when the size of data allocated on BPF stack is not a multiple on 8.
Stable-dep-of: 96daa9874211 ("selftests/bpf: Correct map_fd to data_fd in tailcalls")
--- .../selftests/bpf/prog_tests/tailcalls.c | 55 +++++++++++++++++++ .../selftests/bpf/progs/tailcall_bpf2bpf6.c | 42 ++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/tailcall_bpf2bpf6.c
tools/testing/selftests/bpf/prog_tests/tailcalls.c +55 -0
@@ -810,6 +810,59 @@ static void test_tailcall_bpf2bpf_4(bool noise)bpf_object__close (obj); } +#include "tailcall_bpf2bpf6.skel.h" + +/* Tail call counting works even when there is data on stack which is +* not aligned to 8 bytes. +*/ +static void test_tailcall_bpf2bpf_6 (void ) +{ +struct tailcall_bpf2bpf6 *obj; +int err, map_fd, prog_fd, main_fd, data_fd, i, val; +LIBBPF_OPTS (bpf_test_run_opts, topts, + .data_in = &pkt_v4, + .data_size_in = sizeof(pkt_v4), + .repeat = 1, + ); + + obj =tailcall_bpf2bpf6__open_and_load (); +if (!ASSERT_OK_PTR (obj,"open and load" )) +return ; + + main_fd =bpf_program__fd (obj->progs.entry); +if (!ASSERT_GE (main_fd,0 ,"entry prog fd" )) + goto out; + + map_fd =bpf_map__fd (obj->maps.jmp_table); +if (!ASSERT_GE (map_fd,0 ,"jmp_table map fd" )) + goto out; + + prog_fd =bpf_program__fd (obj->progs.classifier_0); +if (!ASSERT_GE (prog_fd,0 ,"classifier_0 prog fd" )) + goto out; + + i =0 ; + err =bpf_map_update_elem (map_fd, &i, &prog_fd,BPF_ANY ); +if (!ASSERT_OK (err,"jmp_table map update" )) + goto out; + + err =bpf_prog_test_run_opts (main_fd, &topts); +ASSERT_OK (err,"entry prog test run" ); +ASSERT_EQ (topts.retval,0 ,"tailcall retval" ); + + data_fd =bpf_map__fd (obj->maps.bss); +if (!ASSERT_GE (map_fd,0 ,"bss map fd" )) + goto out; + + i =0 ; + err =bpf_map_lookup_elem (data_fd, &i, &val); +ASSERT_OK (err,"bss map lookup" ); +ASSERT_EQ (val,1 ,"done flag is set" ); + +out: +tailcall_bpf2bpf6__destroy (obj); +} +void test_tailcalls (void ) {if (test__start_subtest ("tailcall_1" ))
@@ -832,4 +885,6 @@ void test_tailcalls(void)test_tailcall_bpf2bpf_4 (false);if (test__start_subtest ("tailcall_bpf2bpf_5" ))test_tailcall_bpf2bpf_4 (true); +if (test__start_subtest ("tailcall_bpf2bpf_6" )) +test_tailcall_bpf2bpf_6 (); }
tools/testing/selftests/bpf/progs/tailcall_bpf2bpf6.c new file +42 -0
42 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 15/244 selftests/bpf: Correct map_fd to data_fd in tailcalls
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Hwang <[email protected]>
[ Upstream commit 96daa9874211d5497aa70fa409b67afc29f0cb86 ]
Get and check data_fd. It should not check map_fd again.
Meanwhile, correct some 'return' to 'goto out'.
Thank the suggestion from Maciej in "bpf, x64: Fix tailcall infinite loop"[0] discussions.
[0] https://lore.kernel.org/bpf/[email protected]/T/#m7d3b601066ba66400d436b7e7579b2df4a101033
--- .../selftests/bpf/prog_tests/tailcalls.c | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-)
tools/testing/selftests/bpf/prog_tests/tailcalls.c +16 -16
@@ -272,11 +272,11 @@ static void test_tailcall_3(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; err =bpf_map_lookup_elem (data_fd, &i, &val);
@@ -334,11 +334,11 @@ static void test_tailcall_4(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out;for (i =0 ; i <bpf_map__def (prog_array)->max_entries; i++) {snprintf (prog_name,sizeof (prog_name),"classifier/%i" , i);
@@ -422,11 +422,11 @@ static void test_tailcall_5(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out;for (i =0 ; i <bpf_map__def (prog_array)->max_entries; i++) {snprintf (prog_name,sizeof (prog_name),"classifier/%i" , i);
@@ -610,11 +610,11 @@ static void test_tailcall_bpf2bpf_2(void) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; err =bpf_map_lookup_elem (data_fd, &i, &val);
@@ -783,11 +783,11 @@ static void test_tailcall_bpf2bpf_4(bool noise) data_map =bpf_object__find_map_by_name (obj,"tailcall.bss" );if (CHECK_FAIL (!data_map || !bpf_map__is_internal (data_map))) -return ; + goto out; data_fd =bpf_map__fd (data_map); -if (CHECK_FAIL (map_fd <0 )) -return ; +if (CHECK_FAIL (data_fd <0 )) + goto out; i =0 ; val.noise = noise;
@@ -851,7 +851,7 @@ static void test_tailcall_bpf2bpf_6(void)ASSERT_EQ (topts.retval,0 ,"tailcall retval" ); data_fd =bpf_map__fd (obj->maps.bss); -if (!ASSERT_GE (map_fd,0 ,"bss map fd" )) +if (!ASSERT_GE (data_fd,0 ,"bss map fd" )) goto out; i =0 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 16/244 wifi: iwlwifi: Use FW rate for non-data frames
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 499d02790495958506a64f37ceda7e97345a50a8 ]
Currently we are setting the rate in the tx cmd for mgmt frames (e.g. during connection establishment). This was problematic when sending mgmt frames in eSR mode, as we don't know what link this frame will be sent on (This is decided by the FW), so we don't know what is the lowest rate.
Fix this by not setting the rate in tx cmd and rely
on FW to choose the right one.
Set rate only for injected frames with fixed rate,
or when no sta is given.
Also set for important frames (EAPOL etc.) the High Priority flag.
--- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/tx.c +9 -5
@@ -479,16 +479,20 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb, flags |=IWL_TX_FLAGS_ENCRYPT_DIS ;/* -* For data packets rate info comes from the fw. Only -* set rate/antenna during connection establishment or in case -* no station is given. +* For data and mgmt packets rate info comes from the fw. Only +* set rate/antenna for injected frames with fixed rate, or +* when no sta is given. */ -if (!sta || !ieee80211_is_data (hdr->frame_control) || - mvmsta->sta_state <IEEE80211_STA_AUTHORIZED ) { +if (unlikely (!sta || + info->control.flags &IEEE80211_TX_CTRL_RATE_INJECT )) { flags |=IWL_TX_FLAGS_CMD_RATE ; rate_n_flags =iwl_mvm_get_tx_rate_n_flags (mvm, info, sta, hdr->frame_control); + }else if (!ieee80211_is_data (hdr->frame_control) || + mvmsta->sta_state <IEEE80211_STA_AUTHORIZED ) { +/* These are important frames */ + flags |=IWL_TX_FLAGS_HIGH_PRI ; } if (mvm->trans->trans_cfg->device_family >=
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 17/244 udp: add missing WRITE_ONCE() around up->encap_rcv
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 6d5a12eb91224d707f8691dccb40a5719fe5466d ]
UDP_ENCAP_ESPINUDP_NON_IKE setsockopt() writes over up->encap_rcv while other cpus read it.
--- net/ipv4/udp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/ipv4/udp.c +4 -2
@@ -2711,10 +2711,12 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,case UDP_ENCAP_ESPINUDP_NON_IKE :#if IS_ENABLED (CONFIG_IPV6 )if (sk->sk_family ==AF_INET6 ) - up->encap_rcv = ipv6_stub->xfrm6_udp_encap_rcv; +WRITE_ONCE (up->encap_rcv, + ipv6_stub->xfrm6_udp_encap_rcv); else#endif - up->encap_rcv = xfrm4_udp_encap_rcv; +WRITE_ONCE (up->encap_rcv, + xfrm4_udp_encap_rcv);#endif fallthrough;case UDP_ENCAP_L2TPINUDP :
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 18/244 tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aananth V <[email protected]>
[ Upstream commit e326578a21414738de45f77badd332fb00bd0f58 ]
For passive TCP Fast Open sockets that had SYN/ACK timeout and did not send more data in SYN_RECV, upon receiving the final ACK in 3WHS, the congestion state may awkwardly stay in CA_Loss mode unless the CA state was undone due to TCP timestamp checks. However, if tcp_rcv_synrecv_state_fastopen() decides not to undo, then we should enter CA_Open, because at that point we have received an ACK covering the retransmitted SYNACKs. Currently, the icsk_ca_state is only set to CA_Open after we receive an ACK for a data-packet. This is because tcp_ack does not call tcp_fastretrans_alert (and tcp_process_loss) if !prior_packets
Note that tcp_process_loss() calls tcp_try_undo_recovery(), so having tcp_rcv_synrecv_state_fastopen() decide that if we're in CA_Loss we should call tcp_try_undo_recovery() is consistent with that, and low risk.
--- net/ipv4/tcp_input.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
net/ipv4/tcp_input.c +5 -4
@@ -6376,22 +6376,23 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,static void tcp_rcv_synrecv_state_fastopen (struct sock *sk) { +struct tcp_sock *tp =tcp_sk (sk);struct request_sock *req;/* If we are still handling the SYNACK RTO, see if timestamp ECR allows * undo. If peer SACKs triggered fast recovery, we can't undo here. */ -if (inet_csk (sk)->icsk_ca_state == TCP_CA_Loss) -tcp_try_undo_loss (sk, false); +if (inet_csk (sk)->icsk_ca_state == TCP_CA_Loss && !tp->packets_out) +tcp_try_undo_recovery (sk);/* Reset rtx states to prevent spurious retransmits_timed_out() */ -tcp_sk (sk)->retrans_stamp =0 ; + tp->retrans_stamp =0 ;inet_csk (sk)->icsk_retransmits =0 ;/* Once we leave TCP_SYN_RECV or TCP_FIN_WAIT_1, * we no longer need req so release it. */ - req =rcu_dereference_protected (tcp_sk (sk)->fastopen_rsk, + req =rcu_dereference_protected (tp->fastopen_rsk,lockdep_sock_is_held (sk));reqsk_fastopen_remove (sk, req, false);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 19/244 gve: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit d692873cbe861a870cdc9cbfb120eefd113c3dfd ]
If, for any reason, tx_stats_num + rx_stats_num wraps around, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- drivers/net/ethernet/google/gve/gve_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/google/gve/gve_main.c +1 -1
@@ -139,7 +139,7 @@ static int gve_alloc_stats_report(struct gve_priv *priv) rx_stats_num = (GVE_RX_STATS_REPORT_NUM +NIC_RX_STATS_REPORT_NUM ) * priv->rx_cfg.num_queues; priv->stats_report_len =struct_size (priv->stats_report, stats, - tx_stats_num + rx_stats_num); +size_add (tx_stats_num, rx_stats_num)); priv->stats_report =dma_alloc_coherent (&priv->pdev->dev, priv->stats_report_len, &priv->stats_report_bus,GFP_KERNEL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 20/244 mlxsw: Use size_mul() in call to struct_size()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit e22c6ea025013ae447fe269269753ffec763dde5 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_mul().
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c +1 -1
@@ -251,7 +251,7 @@ mlxsw_sp_acl_bf_init(struct mlxsw_sp *mlxsw_sp, unsigned int num_erp_banks)* is 2^ACL_MAX_BF_LOG */ bf_bank_size =1 <<MLXSW_CORE_RES_GET (mlxsw_sp->core,ACL_MAX_BF_LOG ); - bf =kzalloc (struct_size (bf, refcnt, bf_bank_size * num_erp_banks), + bf =kzalloc (struct_size (bf, refcnt,size_mul (bf_bank_size, num_erp_banks)),GFP_KERNEL );if (!bf)return ERR_PTR (-ENOMEM );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 21/244 tipc: Use size_add() in calls to struct_size()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 2506a91734754de690869824fb0d1ac592ec1266 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- net/tipc/link.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/tipc/link.c +2 -2
@@ -1445,7 +1445,7 @@ u16 tipc_get_gap_ack_blks(struct tipc_gap_ack_blks **ga, struct tipc_link *l, p = (struct tipc_gap_ack_blks *)msg_data (hdr); sz =ntohs (p->len);/* Sanity check */ -if (sz ==struct_size (p, gacks, p->ugack_cnt + p->bgack_cnt)) { +if (sz ==struct_size (p, gacks,size_add (p->ugack_cnt, p->bgack_cnt))) {/* Good, check if the desired type exists */ if ((uc && p->ugack_cnt) || (!uc && p->bgack_cnt)) goto ok;
@@ -1532,7 +1532,7 @@ static u16 tipc_build_gap_ack_blks(struct tipc_link *l, struct tipc_msg *hdr) __tipc_build_gap_ack_blks(ga, l, ga->bgack_cnt) : 0;/* Total len */ - len =struct_size (ga, gacks, ga->bgack_cnt + ga->ugack_cnt); + len =struct_size (ga, gacks,size_add (ga->bgack_cnt, ga->ugack_cnt)); ga->len =htons (len);return len; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 22/244 net: spider_net: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 0201409079b975e46cc40e8bdff4bd61329ee10f ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() adds against potential integer overflows is defeated. Fix this by hardening call to struct_size() with size_add().
--- drivers/net/ethernet/toshiba/spider_net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/toshiba/spider_net.c +1 -1
@@ -2332,7 +2332,7 @@ spider_net_alloc_card(void)struct spider_net_card *card; netdev =alloc_etherdev (struct_size (card, darray, - tx_descriptors + rx_descriptors)); +size_add (tx_descriptors, rx_descriptors)));if (!netdev)return NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 23/244 wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 74f7957c9b1b95553faaf146a2553e023a9d1720 ]
Since debugfs_create_file() return ERR_PTR and never return NULL, so use IS_ERR() to check it instead of checking NULL.
--- drivers/net/wireless/realtek/rtw88/debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/debug.c +2 -2
@@ -1061,9 +1061,9 @@ static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {#define rtw_debugfs_add_core (name, mode, fopname, parent) \ do { \ rtw_debug_priv_ ##name.rtwdev = rtwdev; \ - if (!debugfs_create_file(#name, mode, \ + if (IS_ERR(debugfs_create_file(#name, mode, \ parent, &rtw_debug_priv_ ##name,\ - &file_ops_ ##fopname)) \ + &file_ops_ ##fopname))) \ pr_debug("Unable to initialize debugfs:%s\n", \ #name); \ } while (0)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 24/244 wifi: mt76: mt7603: rework/fix rx pse hang check
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit baa19b2e4b7bbb509a7ca7939c8785477dcd40ee ]
It turns out that the code in mt7603_rx_pse_busy() does not detect actual hardware hangs, it only checks for busy conditions in PSE.
A reset should only be performed if these conditions are true and if there is no rx activity as well.
Reset the counter whenever a rx interrupt occurs. In order to also deal with a fully loaded CPU that leaves interrupts disabled with continuous NAPI polling, also check for pending rx interrupts in the function itself.
--- .../net/wireless/mediatek/mt76/mt7603/core.c | 2 ++ .../net/wireless/mediatek/mt76/mt7603/mac.c | 23 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/core.c +2 -0
@@ -42,11 +42,13 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance) }if (intr &MT_INT_RX_DONE (0 )) { + dev->rx_pse_check =0 ;mt7603_irq_disable (dev,MT_INT_RX_DONE (0 ));napi_schedule (&dev->mt76.napi[0 ]); }if (intr &MT_INT_RX_DONE (1 )) { + dev->rx_pse_check =0 ;mt7603_irq_disable (dev,MT_INT_RX_DONE (1 ));napi_schedule (&dev->mt76.napi[1 ]); }
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +16 -7
@@ -1561,20 +1561,29 @@ static bool mt7603_rx_pse_busy(struct mt7603_dev *dev) {u32 addr, val; -if (mt76_rr (dev,MT_MCU_DEBUG_RESET ) &MT_MCU_DEBUG_RESET_QUEUES ) -return true; -if (mt7603_rx_fifo_busy (dev)) -return false; + goto out; addr =mt7603_reg_map (dev,MT_CLIENT_BASE_PHYS_ADDR +MT_CLIENT_STATUS );mt76_wr (dev, addr,3 ); val =mt76_rr (dev, addr) >>16 ; -if (is_mt7628 (dev) && (val &0x4001 ) ==0x4001 ) -return true; +if (!(val &BIT (0 ))) +return false; + +if (is_mt7628 (dev)) + val &=0xa000 ; +else + val &=0x8000 ; +if (!val) +return false; + +out: +if (mt76_rr (dev,MT_INT_SOURCE_CSR ) & + (MT_INT_RX_DONE (0 ) |MT_INT_RX_DONE (1 ))) +return false; -return (val &0x8001 ) ==0x8001 || (val &0xe001 ) ==0xe001 ; +return true; } static bool
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 25/244 mt76: dma: use kzalloc instead of devm_kzalloc for txwi
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 402e01092e79583923579662f244bc538f466f36 ]
dma unmap is already needed for cleanup anyway, so we don't need the extra tracking and can save a bit of memory here
Stable-dep-of: 317620593349 ("wifi: mt76: mt7603: improve stuck beacon handling")
--- drivers/net/wireless/mediatek/mt76/dma.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +4 -2
@@ -16,7 +16,7 @@ mt76_alloc_txwi(struct mt76_dev *dev)int size; size =L1_CACHE_ALIGN (dev->drv->txwi_size +sizeof (*t)); - txwi =devm_kzalloc (dev->dev, size,GFP_ATOMIC ); + txwi =kzalloc (size,GFP_ATOMIC );if (!txwi)return NULL ;
@@ -73,9 +73,11 @@ mt76_free_pending_txwi(struct mt76_dev *dev)struct mt76_txwi_cache *t;local_bh_disable (); -while ((t =__mt76_get_txwi (dev)) !=NULL ) +while ((t =__mt76_get_txwi (dev)) !=NULL ) {dma_unmap_single (dev->dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE ); +kfree (mt76_get_txwi_ptr (dev, t)); + }local_bh_enable (); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 26/244 mt76: add support for overriding the device used for DMA mapping
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit d1ddc536df93ae406ef671deb3218898d3515ea4 ]
WED support requires using non-coherent DMA, whereas the PCI device might be configured for coherent DMA.
The WED driver will take care of changing the PCI HIF coherent IO setting on attach.
Stable-dep-of: 317620593349 ("wifi: mt76: mt7603: improve stuck beacon handling")
--- drivers/net/wireless/mediatek/mt76/dma.c | 34 +++++++++---------- drivers/net/wireless/mediatek/mt76/mac80211.c | 1 + drivers/net/wireless/mediatek/mt76/mt76.h | 1 + 3 files changed, 19 insertions(+), 17 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +17 -17
@@ -20,7 +20,7 @@ mt76_alloc_txwi(struct mt76_dev *dev)if (!txwi)return NULL ; - addr =dma_map_single (dev->dev, txwi, dev->drv->txwi_size, + addr =dma_map_single (dev->dma_dev, txwi, dev->drv->txwi_size,DMA_TO_DEVICE ); t = (struct mt76_txwi_cache *)(txwi + dev->drv->txwi_size); t->dma_addr = addr;
@@ -74,7 +74,7 @@ mt76_free_pending_txwi(struct mt76_dev *dev)local_bh_disable ();while ((t =__mt76_get_txwi (dev)) !=NULL ) { -dma_unmap_single (dev->dev, t->dma_addr, dev->drv->txwi_size, +dma_unmap_single (dev->dma_dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE );kfree (mt76_get_txwi_ptr (dev, t)); }
@@ -123,7 +123,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, q->hw_idx = idx; size = q->ndesc *sizeof (struct mt76_desc ); - q->desc =dmam_alloc_coherent (dev->dev, size, &q->desc_dma,GFP_KERNEL ); + q->desc =dmam_alloc_coherent (dev->dma_dev, size, &q->desc_dma,GFP_KERNEL );if (!q->desc)return -ENOMEM ;
@@ -205,11 +205,11 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,struct mt76_queue_entry *e = &q->entry[idx];if (!e->skip_buf0) -dma_unmap_single (dev->dev, e->dma_addr[0 ], e->dma_len[0 ], +dma_unmap_single (dev->dma_dev, e->dma_addr[0 ], e->dma_len[0 ],DMA_TO_DEVICE );if (!e->skip_buf1) -dma_unmap_single (dev->dev, e->dma_addr[1 ], e->dma_len[1 ], +dma_unmap_single (dev->dma_dev, e->dma_addr[1 ], e->dma_len[1 ],DMA_TO_DEVICE );if (e->txwi ==DMA_DUMMY_DATA )
@@ -290,7 +290,7 @@ mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,if (info) *info =le32_to_cpu (desc->info); -dma_unmap_single (dev->dev, buf_addr, buf_len,DMA_FROM_DEVICE ); +dma_unmap_single (dev->dma_dev, buf_addr, buf_len,DMA_FROM_DEVICE ); e->buf =NULL ;return buf;
@@ -327,9 +327,9 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,if (q->queued +1 >= q->ndesc -1 ) goto error; - addr =dma_map_single (dev->dev, skb->data, skb->len, + addr =dma_map_single (dev->dma_dev, skb->data, skb->len,DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (dev->dev, addr))) +if (unlikely (dma_mapping_error (dev->dma_dev, addr))) goto error; buf.addr = addr;
@@ -376,8 +376,8 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,mt76_insert_hdr_pad (skb); len =skb_headlen (skb); - addr =dma_map_single (dev->dev, skb->data, len,DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (dev->dev, addr))) + addr =dma_map_single (dev->dma_dev, skb->data, len,DMA_TO_DEVICE ); +if (unlikely (dma_mapping_error (dev->dma_dev, addr))) goto free; tx_info.buf[n].addr = t->dma_addr;
@@ -389,9 +389,9 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,if (n ==ARRAY_SIZE (tx_info.buf)) goto unmap; - addr =dma_map_single (dev->dev, iter->data, iter->len, + addr =dma_map_single (dev->dma_dev, iter->data, iter->len,DMA_TO_DEVICE ); -if (unlikely (dma_mapping_error (dev->dev, addr))) +if (unlikely (dma_mapping_error (dev->dma_dev, addr))) goto unmap; tx_info.buf[n].addr = addr;
@@ -404,10 +404,10 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, goto unmap; } -dma_sync_single_for_cpu (dev->dev, t->dma_addr, dev->drv->txwi_size, +dma_sync_single_for_cpu (dev->dma_dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE ); ret = dev->drv->tx_prepare_skb (dev, txwi, q->qid, wcid, sta, &tx_info); -dma_sync_single_for_device (dev->dev, t->dma_addr, dev->drv->txwi_size, +dma_sync_single_for_device (dev->dma_dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE );if (ret <0 ) goto unmap;
@@ -417,7 +417,7 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, unmap:for (n--; n >0 ; n--) -dma_unmap_single (dev->dev, tx_info.buf[n].addr, +dma_unmap_single (dev->dma_dev, tx_info.buf[n].addr, tx_info.buf[n].len,DMA_TO_DEVICE ); free:
@@ -461,8 +461,8 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q)if (!buf)break ; - addr =dma_map_single (dev->dev, buf, len,DMA_FROM_DEVICE ); -if (unlikely (dma_mapping_error (dev->dev, addr))) { + addr =dma_map_single (dev->dma_dev, buf, len,DMA_FROM_DEVICE ); +if (unlikely (dma_mapping_error (dev->dma_dev, addr))) {skb_free_frag (buf);break ; }
drivers/net/wireless/mediatek/mt76/mac80211.c +1 -0
@@ -428,6 +428,7 @@ mt76_alloc_device(struct device *pdev, unsigned int size, dev->hw = hw; dev->dev = pdev; dev->drv = drv_ops; + dev->dma_dev = pdev; phy = &dev->phy; phy->dev = dev;
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -660,6 +660,7 @@ struct mt76_dev {const struct mt76_driver_ops *drv;const struct mt76_mcu_ops *mcu_ops;struct device *dev; +struct device *dma_dev;struct mt76_mcu mcu;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 27/244 mt76: pass original queue id from __mt76_tx_queue_skb to the driver
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit d08295f5be8e63e64f9e664572f1b582ede7958b ]
MT7615 and newer map multiple software tx queues to the hardware id
Stable-dep-of: 317620593349 ("wifi: mt76: mt7603: improve stuck beacon handling")
--- drivers/net/wireless/mediatek/mt76/dma.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt76.h | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 3 ++- drivers/net/wireless/mediatek/mt76/sdio.c | 6 +++--- drivers/net/wireless/mediatek/mt76/testmode.c | 4 ++-- drivers/net/wireless/mediatek/mt76/tx.c | 2 +- drivers/net/wireless/mediatek/mt76/usb.c | 6 +++--- 8 files changed, 19 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/dma.c +3 -3
@@ -349,8 +349,8 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,static int mt76_dma_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q, -struct sk_buff *skb,struct mt76_wcid *wcid, -struct ieee80211_sta *sta) +enum mt76_txq_id qid,struct sk_buff *skb, +struct mt76_wcid *wcid,struct ieee80211_sta *sta) {struct ieee80211_tx_status status = { .sta = sta,
@@ -406,7 +406,7 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,dma_sync_single_for_cpu (dev->dma_dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE ); - ret = dev->drv->tx_prepare_skb (dev, txwi, q->qid, wcid, sta, &tx_info); + ret = dev->drv->tx_prepare_skb (dev, txwi, qid, wcid, sta, &tx_info);dma_sync_single_for_device (dev->dma_dev, t->dma_addr, dev->drv->txwi_size,DMA_TO_DEVICE );if (ret <0 )
drivers/net/wireless/mediatek/mt76/mt76.h +2 -2
@@ -195,8 +195,8 @@ struct mt76_queue_ops { u32 ring_base);int (*tx_queue_skb)(struct mt76_dev *dev,struct mt76_queue *q, -struct sk_buff *skb,struct mt76_wcid *wcid, -struct ieee80211_sta *sta); +enum mt76_txq_id qid,struct sk_buff *skb, +struct mt76_wcid *wcid,struct ieee80211_sta *sta);int (*tx_queue_skb_raw)(struct mt76_dev *dev,struct mt76_queue *q,struct sk_buff *skb,u32 tx_info);
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +3 -3
@@ -24,8 +24,8 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)if (!skb)return ; -mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], skb, - &mvif->sta.wcid,NULL ); +mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], +MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL );spin_lock_bh (&dev->ps_lock); mt76_wr(dev, MT_DMA_FQCR0, MT_DMA_FQCR0_BUSY |
@@ -123,7 +123,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev, q, skb, &mvif->sta.wcid,NULL ); +mt76_tx_queue_skb (dev, q,MT_TXQ_CAB , skb, &mvif->sta.wcid,NULL ); }mt76_queue_kick (dev, q);spin_unlock_bh (&q->lock);
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +2 -1
@@ -59,7 +59,8 @@ static void mt76x02_pre_tbtt_tasklet(struct tasklet_struct *t)struct ieee80211_vif *vif = info->control.vif;struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv; -mt76_tx_queue_skb (dev, q, skb, &mvif->group_wcid,NULL ); +mt76_tx_queue_skb (dev, q,MT_TXQ_PSD , skb, &mvif->group_wcid, +NULL ); }spin_unlock_bh (&q->lock); }
drivers/net/wireless/mediatek/mt76/sdio.c +3 -3
@@ -243,8 +243,8 @@ static void mt76s_tx_status_data(struct work_struct *work)static int mt76s_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q, -struct sk_buff *skb,struct mt76_wcid *wcid, -struct ieee80211_sta *sta) +enum mt76_txq_id qid,struct sk_buff *skb, +struct mt76_wcid *wcid,struct ieee80211_sta *sta) {struct mt76_tx_info tx_info = { .skb = skb,
@@ -256,7 +256,7 @@ mt76s_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,return -ENOSPC ; skb->prev = skb->next =NULL ; - err = dev->drv->tx_prepare_skb (dev,NULL , q->qid, wcid, sta, &tx_info); + err = dev->drv->tx_prepare_skb (dev,NULL , qid, wcid, sta, &tx_info);if (err <0 )return err;
drivers/net/wireless/mediatek/mt76/testmode.c +2 -2
@@ -49,8 +49,8 @@ void mt76_testmode_tx_pending(struct mt76_phy *phy) q->queued < q->ndesc / 2) {int ret; - ret = dev->queue_ops->tx_queue_skb (dev, q,skb_get (skb), wcid, -NULL ); + ret = dev->queue_ops->tx_queue_skb (dev, q, qid,skb_get (skb), + wcid,NULL );if (ret <0 )break ;
drivers/net/wireless/mediatek/mt76/tx.c +1 -1
@@ -259,7 +259,7 @@ __mt76_tx_queue_skb(struct mt76_phy *phy, int qid, struct sk_buff *skb,int idx; non_aql = !info->tx_time_est; - idx = dev->queue_ops->tx_queue_skb (dev, q, skb, wcid, sta); + idx = dev->queue_ops->tx_queue_skb (dev, q, qid, skb, wcid, sta);if (idx <0 || !sta)return idx;
drivers/net/wireless/mediatek/mt76/usb.c +3 -3
@@ -901,8 +901,8 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,static int mt76u_tx_queue_skb (struct mt76_dev *dev,struct mt76_queue *q, -struct sk_buff *skb,struct mt76_wcid *wcid, -struct ieee80211_sta *sta) +enum mt76_txq_id qid,struct sk_buff *skb, +struct mt76_wcid *wcid,struct ieee80211_sta *sta) {struct mt76_tx_info tx_info = { .skb = skb,
@@ -914,7 +914,7 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,return -ENOSPC ; skb->prev = skb->next =NULL ; - err = dev->drv->tx_prepare_skb (dev,NULL , q->qid, wcid, sta, &tx_info); + err = dev->drv->tx_prepare_skb (dev,NULL , qid, wcid, sta, &tx_info);if (err <0 )return err;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 28/244 wifi: mt76: mt7603: improve stuck beacon handling
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit 3176205933494bd184c6acd70e796c382bc729b5 ]
Before preparing the new beacon, check the queue status, flush out all previous beacons and buffered multicast packets, then (if necessary) try to recover more gracefully from a stuck beacon condition by making a less invasive attempt at getting the MAC un-stuck.
--- .../wireless/mediatek/mt76/mt7603/beacon.c | 76 ++++++++++++++----- .../net/wireless/mediatek/mt76/mt7603/regs.h | 5 ++ 2 files changed, 60 insertions(+), 21 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +55 -21
@@ -9,6 +9,23 @@ struct beacon_bc_data {int count[MT7603_MAX_INTERFACES ]; }; +static void +mt7603_mac_stuck_beacon_recovery (struct mt7603_dev *dev) +{ +if (dev->beacon_check %5 !=4 ) +return ; + +mt76_clear (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_DMA_EN ); +mt76_set (dev,MT_SCH_4 ,MT_SCH_4_RESET ); +mt76_clear (dev,MT_SCH_4 ,MT_SCH_4_RESET ); +mt76_set (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_DMA_EN ); + +mt76_set (dev,MT_WF_CFG_OFF_WOCCR ,MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS ); +mt76_set (dev,MT_ARB_SCR ,MT_ARB_SCR_TX_DISABLE ); +mt76_clear (dev,MT_ARB_SCR ,MT_ARB_SCR_TX_DISABLE ); +mt76_clear (dev,MT_WF_CFG_OFF_WOCCR ,MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS ); +} +static void mt7603_update_beacon_iter (void *priv,u8 *mac,struct ieee80211_vif *vif) {
@@ -16,6 +33,8 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)struct mt76_dev *mdev = &dev->mt76;struct mt7603_vif *mvif = (struct mt7603_vif *)vif->drv_priv;struct sk_buff *skb =NULL ; +u32 om_idx = mvif->idx; +u32 val;if (!(mdev->beacon_mask &BIT (mvif->idx)))return ;
@@ -24,20 +43,33 @@ mt7603_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)if (!skb)return ; -mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], -MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL ); +if (om_idx) + om_idx |=0x10 ; + val =MT_DMA_FQCR0_BUSY |MT_DMA_FQCR0_MODE | +FIELD_PREP (MT_DMA_FQCR0_TARGET_BSS , om_idx) | +FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) | +FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 );spin_lock_bh (&dev->ps_lock); -mt76_wr (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY | -FIELD_PREP (MT_DMA_FQCR0_TARGET_WCID , mvif->sta.wcid.idx) | -FIELD_PREP (MT_DMA_FQCR0_TARGET_QID , - dev->mphy.q_tx[MT_TXQ_CAB ]->hw_idx) | -FIELD_PREP (MT_DMA_FQCR0_DEST_PORT_ID ,3 ) | -FIELD_PREP (MT_DMA_FQCR0_DEST_QUEUE_ID ,8 )); -if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) +mt76_wr (dev,MT_DMA_FQCR0 , val | +FIELD_PREP (MT_DMA_FQCR0_TARGET_QID ,MT_TX_HW_QUEUE_BCN )); +if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) { dev->beacon_check =MT7603_WATCHDOG_TIMEOUT ; + goto out; + } + +mt76_wr (dev,MT_DMA_FQCR0 , val | +FIELD_PREP (MT_DMA_FQCR0_TARGET_QID ,MT_TX_HW_QUEUE_BMC )); +if (!mt76_poll (dev,MT_DMA_FQCR0 ,MT_DMA_FQCR0_BUSY ,0 ,5000 )) { + dev->beacon_check =MT7603_WATCHDOG_TIMEOUT ; + goto out; + } +mt76_tx_queue_skb (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], +MT_TXQ_BEACON , skb, &mvif->sta.wcid,NULL ); + +out:spin_unlock_bh (&dev->ps_lock); }
@@ -81,6 +113,18 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) data.dev = dev;__skb_queue_head_init (&data.q); +/* Flush all previous CAB queue packets and beacons */ +mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); + +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_CAB ], false); +mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], false); + +if (dev->mphy.q_tx[MT_TXQ_BEACON ]->queued >0 ) + dev->beacon_check++; +else + dev->beacon_check =0 ; +mt7603_mac_stuck_beacon_recovery (dev); + q = dev->mphy.q_tx[MT_TXQ_BEACON ];spin_lock_bh (&q->lock); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
@@ -89,14 +133,9 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)mt76_queue_kick (dev, q);spin_unlock_bh (&q->lock); -/* Flush all previous CAB queue packets */ -mt76_wr (dev,MT_WF_ARB_CAB_FLUSH ,GENMASK (30 ,16 ) |BIT (0 )); - -mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_CAB ], false); -mt76_csa_check (mdev);if (mdev->csa_complete) - goto out; +return ; q = dev->mphy.q_tx[MT_TXQ_CAB ]; do {
@@ -108,7 +147,7 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t) skb_queue_len(&data.q) < 8);if (skb_queue_empty (&data.q)) - goto out; +return ;for (i =0 ; i <ARRAY_SIZE (data.tail); i++) {if (!data.tail[i])
@@ -136,11 +175,6 @@ void mt7603_pre_tbtt_tasklet(struct tasklet_struct *t)MT_WF_ARB_CAB_START_BSSn (0 ) | (MT_WF_ARB_CAB_START_BSS0n (1 ) * ((1 << (MT7603_MAX_INTERFACES - 1)) - 1))); - -out: -mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BEACON ], false); -if (dev->mphy.q_tx[MT_TXQ_BEACON ]->queued >hweight8 (mdev->beacon_mask)) - dev->beacon_check++; }void mt7603_beacon_set_timer (struct mt7603_dev *dev,int idx,int intval)
drivers/net/wireless/mediatek/mt76/mt7603/regs.h +5 -0
@@ -462,6 +462,11 @@ enum {#define MT_WF_SEC_BASE 0x21a00#define MT_WF_SEC (ofs) (MT_WF_SEC_BASE + (ofs)) +#define MT_WF_CFG_OFF_BASE 0x21e00 +#define MT_WF_CFG_OFF (ofs) (MT_WF_CFG_OFF_BASE + (ofs)) +#define MT_WF_CFG_OFF_WOCCR MT_WF_CFG_OFF(0x004) +#define MT_WF_CFG_OFF_WOCCR_TMAC_GC_DIS BIT(4) +#define MT_SEC_SCR MT_WF_SEC(0x004)#define MT_SEC_SCR_MASK_ORDER GENMASK(1, 0)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 29/244 tcp_metrics: add missing barriers on delete
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit cbc3a153222805d65f821e10f4f78b6afce06f86 ]
When removing an item from RCU protected list, we must prevent store-tearing, using rcu_assign_pointer() or WRITE_ONCE().
--- net/ipv4/tcp_metrics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_metrics.c +2 -2
@@ -908,7 +908,7 @@ static void tcp_metrics_flush_all(struct net *net) match = net ?net_eq (tm_net (tm), net) : !refcount_read (&tm_net (tm)->ns.count);if (match) { - *pp = tm->tcpm_next; +rcu_assign_pointer (*pp, tm->tcpm_next);kfree_rcu (tm, rcu_head); }else { pp = &tm->tcpm_next;
@@ -949,7 +949,7 @@ static int tcp_metrics_nl_cmd_del(struct sk_buff *skb, struct genl_info *info)if (addr_same (&tm->tcpm_daddr, &daddr) && (!src ||addr_same (&tm->tcpm_saddr, &saddr)) &&net_eq (tm_net (tm), net)) { - *pp = tm->tcpm_next; +rcu_assign_pointer (*pp, tm->tcpm_next);kfree_rcu (tm, rcu_head); found = true; }else {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 30/244 tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 081480014a64a69d901f8ef1ffdd56d6085cf87e ]
We need to set tp->snd_ssthresh to TCP_INFINITE_SSTHRESH in the case tcp_get_metrics() fails for some reason.
--- net/ipv4/tcp_metrics.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/ipv4/tcp_metrics.c +4 -5
@@ -470,6 +470,10 @@ void tcp_init_metrics(struct sock *sk)u32 val, crtt =0 ;/* cached RTT scaled by 8 */ sk_dst_confirm (sk); +/* ssthresh may have been reduced unnecessarily during. +* 3WHS. Restore it back to its initial default. +*/ + tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ;if (!dst) goto reset;
@@ -489,11 +493,6 @@ void tcp_init_metrics(struct sock *sk) tp->snd_ssthresh = val;if (tp->snd_ssthresh > tp->snd_cwnd_clamp) tp->snd_ssthresh = tp->snd_cwnd_clamp; - }else { -/* ssthresh may have been reduced unnecessarily during. -* 3WHS. Restore it back to its initial default. -*/ - tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ; } val =tcp_metric_get (tm,TCP_METRIC_REORDERING );if (val && tp->reordering != val)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 31/244 tcp_metrics: do not create an entry from tcp_init_metrics()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a135798e6e200ecb2f864cecca6d257ba278370c ]
tcp_init_metrics() only wants to get metrics if they were previously stored in the cache. Creating an entry is adding useless costs, especially when tcp_no_metrics_save is set.
--- net/ipv4/tcp_metrics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_metrics.c +1 -1
@@ -478,7 +478,7 @@ void tcp_init_metrics(struct sock *sk) goto reset;rcu_read_lock (); - tm =tcp_get_metrics (sk, dst, true); + tm =tcp_get_metrics (sk, dst, false);if (!tm) {rcu_read_unlock (); goto reset;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 32/244 wifi: rtlwifi: fix EDCA limit set by BT coexistence
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 3391ee7f9ea508c375d443cd712c2e699be235b4 ]
In 'rtl92c_dm_check_edca_turbo()', 'rtl88e_dm_check_edca_turbo()', and 'rtl8723e_dm_check_edca_turbo()', the DL limit should be set from the corresponding field of 'rtlpriv->btcoexist' rather than UL. Compile tested only.
--- drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c | 2 +- drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c | 2 +- drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c +1 -1
@@ -799,7 +799,7 @@ static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
drivers/net/wireless/realtek/rtlwifi/rtl8192c/dm_common.c +1 -1
@@ -640,7 +640,7 @@ static void rtl92c_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c +1 -1
@@ -466,7 +466,7 @@ static void rtl8723e_dm_check_edca_turbo(struct ieee80211_hw *hw) }if (rtlpriv->btcoexist.bt_edca_dl !=0 ) { - edca_be_ul = rtlpriv->btcoexist.bt_edca_dl; + edca_be_dl = rtlpriv->btcoexist.bt_edca_dl; bt_change_edca = true; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 33/244 can: dev: can_restart(): dont crash kernel if carrier is OK
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit fe5c9940dfd8ba0c73672dddb30acd1b7a11d4c7 ]
During testing, I triggered a can_restart() with the netif carrier being OK [1]. The BUG_ON, which checks if the carrier is OK, results in a fatal kernel crash. This is neither helpful for debugging nor for a production system.
[1] The root cause is a race condition in can_restart() which will be fixed in the next patch.
Do not crash the kernel, issue an error message instead, and continue restarting the CAN device anyway.
--- drivers/net/can/dev/dev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/can/dev/dev.c +2 -1
@@ -141,7 +141,8 @@ static void can_restart(struct net_device *dev)struct can_frame *cf;int err; -BUG_ON (netif_carrier_ok (dev)); +if (netif_carrier_ok (dev)) +netdev_err (dev,"Attempt to restart for bus-off recovery, but carrier is OK?\n" );/* No synchronization needed because the device is bus-off and * no messages can come in or go out.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 34/244 can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 6841cab8c4504835e4011689cbdb3351dec693fd ]
This race condition was discovered while updating the at91_can driver to use can_bus_off(). The following scenario describes how the converted at91_can driver would behave.
When a CAN device goes into BUS-OFF state, the driver usually stops/resets the CAN device and calls can_bus_off().
This function sets the netif carrier to off, and (if configured by user space) schedules a delayed work that calls can_restart() to restart the CAN device.
The can_restart() function first checks if the carrier is off and triggers an error message if the carrier is OK.
Then it calls the driver's do_set_mode() function to restart the device, then it sets the netif carrier to on. There is a race window between these two calls.
The at91 CAN controller (observed on the sama5d3, a single core 32 bit ARM CPU) has a hardware limitation. If the device goes into bus-off while sending a CAN frame, there is no way to abort the sending of this frame. After the controller is enabled again, another attempt is made to send it.
If the bus is still faulty, the device immediately goes back to the bus-off state. The driver calls can_bus_off(), the netif carrier is switched off and another can_restart is scheduled. This occurs within the race window before the original can_restart() handler marks the netif carrier as OK. This would cause the 2nd can_restart() to be called with an OK netif carrier, resulting in an error message.
The flow of the 1st can_restart() looks like this:
can_restart()
// bail out if netif_carrier is OK
netif_carrier_ok(dev)
priv->do_set_mode(dev, CAN_MODE_START)
// enable CAN controller
// sama5d3 restarts sending old message
// CAN devices goes into BUS_OFF, triggers IRQ// IRQ handler start
at91_irq()
at91_irq_err_line()
can_bus_off()
netif_carrier_off()
schedule_delayed_work()// IRQ handler end
netif_carrier_on()
The 2nd can_restart() will be called with an OK netif carrier and the error message will be printed.
To close the race window, first set the netif carrier to on, then restart the controller. In case the restart fails with an error code, roll back the netif carrier to off.
--- drivers/net/can/dev/dev.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/can/dev/dev.c +4 -3
@@ -166,11 +166,12 @@ static void can_restart(struct net_device *dev) priv->can_stats.restarts++;/* Now restart the device */ - err = priv->do_set_mode (dev,CAN_MODE_START ); -netif_carrier_on (dev); -if (err) + err = priv->do_set_mode (dev,CAN_MODE_START ); +if (err) {netdev_err (dev,"Error %d during restart" , err); +netif_carrier_off (dev); + } }static void can_restart_work (struct work_struct *work)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 35/244 can: dev: can_put_echo_skb(): dont crash kernel if can_priv::echo_skb is accessed out of bounds
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
[ Upstream commit 6411959c10fe917288cbb1038886999148560057 ]
If the "struct can_priv::echoo_skb" is accessed out of bounds, this would cause a kernel crash. Instead, issue a meaningful warning message and return with an error.
--- drivers/net/can/dev/skb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/can/dev/skb.c +5 -1
@@ -42,7 +42,11 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, {struct can_priv *priv =netdev_priv (dev); -BUG_ON (idx >= priv->echo_skb_max); +if (idx >= priv->echo_skb_max) { +netdev_err (dev,"%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n" , + __func__, idx, priv->echo_skb_max); +return -EINVAL ; + }/* check flag whether this packet has to be looped back */ if (!(dev->flags & IFF_ECHO) ||
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 36/244 PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sascha Hauer <[email protected]>
[ Upstream commit 1e0731c05c985deb68a97fa44c1adcd3305dda90 ]
As a matter of fact the regmap_pmu already is mandatory because it is used unconditionally in the driver. Bail out gracefully in probe() rather than crashing later.
--- drivers/devfreq/event/rockchip-dfi.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/devfreq/event/rockchip-dfi.c +8 -7
@@ -194,14 +194,15 @@ static int rockchip_dfi_probe(struct platform_device *pdev)return PTR_ERR (data->clk); } -/* try to find the optional reference to the pmu syscon */ node =of_parse_phandle (np,"rockchip,pmu" ,0 ); -if (node) { - data->regmap_pmu =syscon_node_to_regmap (node); -of_node_put (node); -if (IS_ERR (data->regmap_pmu)) -return PTR_ERR (data->regmap_pmu); - } +if (!node) +return dev_err_probe (&pdev->dev, -ENODEV ,"Can't find pmu_grf registers\n" ); + + data->regmap_pmu =syscon_node_to_regmap (node); +of_node_put (node); +if (IS_ERR (data->regmap_pmu)) +return PTR_ERR (data->regmap_pmu); + data->dev = dev; desc =devm_kzalloc (dev,sizeof (*desc),GFP_KERNEL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 37/244 netfilter: nf_tables: Drop pointless memset when dumping rules
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Sutter <[email protected]>
[ Upstream commit 30fa41a0f6df4c85790cc6499ddc4a926a113bfa ]
None of the dump callbacks uses netlink_callback::args beyond the first element, no need to zero the data.
--- net/netfilter/nf_tables_api.c | 4 ---- 1 file changed, 4 deletions(-)
net/netfilter/nf_tables_api.c +0 -4
@@ -3184,10 +3184,6 @@ static int __nf_tables_dump_rules(struct sk_buff *skb, goto cont_skip;if (*idx < s_idx) goto cont; -if (*idx > s_idx) { -memset (&cb->args[1 ],0 , -sizeof (cb->args) -sizeof (cb->args[0 ])); - }if (prule) handle = prule->handle;else
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 38/244 thermal: core: prevent potential string overflow
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit c99626092efca3061b387043d4a7399bf75fbdd5 ]
The dev->id value comes from ida_alloc() so it's a number between zero and INT_MAX. If it's too high then these sprintf()s will overflow.
--- drivers/thermal/thermal_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/thermal/thermal_core.c +4 -2
@@ -671,7 +671,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,if (result) goto release_ida; -sprintf (dev->attr_name,"cdev%d_trip_point" , dev->id); +snprintf (dev->attr_name,sizeof (dev->attr_name),"cdev%d_trip_point" , + dev->id);sysfs_attr_init (&dev->attr.attr); dev->attr.attr.name = dev->attr_name; dev->attr.attr.mode =0444 ;
@@ -680,7 +681,8 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz,if (result) goto remove_symbol_link; -sprintf (dev->weight_attr_name,"cdev%d_weight" , dev->id); +snprintf (dev->weight_attr_name,sizeof (dev->weight_attr_name), +"cdev%d_weight" , dev->id);sysfs_attr_init (&dev->weight_attr.attr); dev->weight_attr.attr.name = dev->weight_attr_name; dev->weight_attr.attr.mode =S_IWUSR |S_IRUGO ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 39/244 r8169: use tp_to_dev instead of open code
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juhee Kang <[email protected]>
[ Upstream commit 4b6c6065fca123d419afef005a696f51e6590470 ]
The open code is defined as a helper function(tp_to_dev) on r8169_main.c, which the open code is &tp->pci_dev->dev. The helper function was added in commit 1e1205b7d3e9 ("r8169: add helper tp_to_dev"). And then later, commit f1e911d5d0df ("r8169: add basic phylib support") added r8169_phylink_handler function but it didn't use the helper function. Thus, tp_to_dev() replaces the open code. This patch doesn't change logic.
Stable-dep-of: 621735f59064 ("r8169: fix rare issue with broken rx after link-down on RTL8125")
--- drivers/net/ethernet/realtek/r8169_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +3 -2
@@ -4656,12 +4656,13 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)static void r8169_phylink_handler (struct net_device *ndev) {struct rtl8169_private *tp =netdev_priv (ndev); +struct device *d =tp_to_dev (tp);if (netif_carrier_ok (ndev)) {rtl_link_chg_patch (tp); -pm_request_resume (&tp->pci_dev->dev); +pm_request_resume (d); }else { -pm_runtime_idle (&tp->pci_dev->dev); +pm_runtime_idle (d); }if (net_ratelimit ())
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 40/244 r8169: fix rare issue with broken rx after link-down on RTL8125
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 621735f590643e3048ca2060c285b80551660601 ]
In very rare cases (I've seen two reports so far about different RTL8125 chip versions) it seems the MAC locks up when link goes down and requires a software reset to get revived.
Realtek doesn't publish hw errata information, therefore the root cause is unknown. Realtek vendor drivers do a full hw re-initialization on each link-up event, the slimmed-down variant here was reported to fix the issue for the reporting user.
It's not fully clear which parts of the NIC are reset as part of the software reset, therefore I can't rule out side effects.
--- drivers/net/ethernet/realtek/r8169_main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/realtek/r8169_main.c +4 -0
@@ -4661,7 +4661,11 @@ static void r8169_phylink_handler(struct net_device *ndev)if (netif_carrier_ok (ndev)) {rtl_link_chg_patch (tp);pm_request_resume (d); +netif_wake_queue (tp->dev); }else { +/* In few cases rx is broken after link-down otherwise */ +if (rtl_is_8125 (tp)) +rtl_reset_work (tp);pm_runtime_idle (d); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 41/244 chtls: fix tp->rcv_tstamp initialization
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 225d9ddbacb102621af6d28ff7bf5a0b4ce249d8 ]
tp->rcv_tstamp should be set to tcp_jiffies, not tcp_time_stamp().
--- drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +1 -1
@@ -2260,7 +2260,7 @@ static void chtls_rx_ack(struct sock *sk, struct sk_buff *skb)if (tp->snd_una != snd_una) { tp->snd_una = snd_una; - tp->rcv_tstamp =tcp_time_stamp (tp); + tp->rcv_tstamp = tcp_jiffies32;if (tp->snd_una == tp->snd_nxt && !csk_flag_nochk (csk,CSK_TX_FAILOVER ))csk_reset_flag (csk,CSK_TX_WAIT_IDLE );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 42/244 tcp: fix cookie_init_timestamp() overflows
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 73ed8e03388d16c12fc577e5c700b58a29045a15 ]
cookie_init_timestamp() is supposed to return a 64bit timestamp suitable for both TSval determination and setting of skb->tstamp.
Unfortunately it uses 32bit fields and overflows after 2^32 * 10^6 nsec (~49 days) of uptime.
Generated TSval are still correct, but skb->tstamp might be set far away in the past, potentially confusing other layers.
tcp_ns_to_ts() is changed to return a full 64bit value, ts and ts_now variables are changed to u64 type, and TSMASK is removed in favor of shifts operations.
While we are at it, change this sequence:
ts >>= TSBITS; ts--; ts <<= TSBITS; ts |= options; to: ts -= (1UL << TSBITS);
--- include/net/tcp.h | 2 +- net/ipv4/syncookies.c | 20 +++++++------------- 2 files changed, 8 insertions(+), 14 deletions(-)
include/net/tcp.h +1 -1
@@ -786,7 +786,7 @@ static inline u32 tcp_time_stamp(const struct tcp_sock *tp) }/* Convert a nsec timestamp into TCP TSval timestamp (ms based currently) */ -static inline u32 tcp_ns_to_ts (u64 ns) +static inline u64 tcp_ns_to_ts (u64 ns) {return div_u64 (ns,NSEC_PER_SEC /TCP_TS_HZ ); }
net/ipv4/syncookies.c +7 -13
@@ -43,7 +43,6 @@ static siphash_key_t syncookie_secret[2] __read_mostly;* requested/supported by the syn/synack exchange. */ #define TSBITS 6 -#define TSMASK (((__u32)1 << TSBITS) - 1)static u32 cookie_hash (__be32 saddr,__be32 daddr,__be16 sport,__be16 dport,u32 count,int c)
@@ -64,27 +63,22 @@ static u32 cookie_hash(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport,*/ u64 cookie_init_timestamp (struct request_sock *req,u64 now) { -struct inet_request_sock *ireq; -u32 ts, ts_now =tcp_ns_to_ts (now); +const struct inet_request_sock *ireq =inet_rsk (req); +u64 ts, ts_now =tcp_ns_to_ts (now);u32 options =0 ; - ireq =inet_rsk (req); - options = ireq->wscale_ok ? ireq->snd_wscale :TS_OPT_WSCALE_MASK ;if (ireq->sack_ok) options |=TS_OPT_SACK ;if (ireq->ecn_ok) options |=TS_OPT_ECN ; - ts = ts_now & ~TSMASK ; + ts = (ts_now >>TSBITS ) <<TSBITS ; ts |= options; -if (ts > ts_now) { - ts >>=TSBITS ; - ts--; - ts <<=TSBITS ; - ts |= options; - } -return (u64 )ts * (NSEC_PER_SEC /TCP_TS_HZ ); +if (ts > ts_now) + ts -= (1UL <<TSBITS ); + +return ts * (NSEC_PER_SEC /TCP_TS_HZ ); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 43/244 iwlwifi: pcie: adjust to Bz completion descriptor
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 5d19e2087fea28651eff7eadf4510fa1564688a2 ]
The Bz devices got a new completion descriptor again since we only ever really used 4 out of 32 bytes anyway. Adjust the code to deal with that. Note that the intention was to reduce the size, but the hardware was implemented wrongly.
While at it, do some cleanups and remove the union to simplify the code, clean up iwl_pcie_free_bd_size() to no longer need an argument and add iwl_pcie_used_bd_size() with the logic to selct completion descriptor size.
Stable-dep-of: 37fb29bd1f90 ("wifi: iwlwifi: pcie: synchronize IRQs before NAPI")
--- .../wireless/intel/iwlwifi/pcie/internal.h | 20 +++++-- drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 56 ++++++++++++------- 2 files changed, 51 insertions(+), 25 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/internal.h +14 -6
@@ -1,6 +1,6 @@/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ /* -* Copyright (C) 2003-2015, 2018-2021 Intel Corporation +* Copyright (C) 2003-2015, 2018-2022 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2016-2017 Intel Deutschland GmbH */
@@ -103,6 +103,18 @@ struct iwl_rx_completion_desc {u8 reserved2[25 ]; } __packed; +/** +* struct iwl_rx_completion_desc_bz - Bz completion descriptor +* @rbid: unique tag of the received buffer +* @flags: flags (0: fragmented, all others: reserved) +* @reserved: reserved +*/ +struct iwl_rx_completion_desc_bz { +__le16 rbid; +u8 flags; +u8 reserved[1 ]; +} __packed; +/** * struct iwl_rxq - Rx queue * @id: queue index
@@ -133,11 +145,7 @@ struct iwl_rxq {int id;void *bd;dma_addr_t bd_dma; -union { -void *used_bd; -__le32 *bd_32; -struct iwl_rx_completion_desc *cd; - }; +void *used_bd;dma_addr_t used_bd_dma;u32 read;u32 write;
drivers/net/wireless/intel/iwlwifi/pcie/rx.c +37 -19
105 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 44/244 wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory Greenman <[email protected]>
[ Upstream commit 5af2bb3168db6b0af9988eb25cccf2e3bc4455e2 ]
When rx/tx queues are being freed, on a different CPU there could be still rx flow running. Call napi_synchronize() to prevent such a race.
Stable-dep-of: 37fb29bd1f90 ("wifi: iwlwifi: pcie: synchronize IRQs before NAPI")
--- .../net/wireless/intel/iwlwifi/pcie/internal.h | 1 + drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 18 +++++++++++++++++- .../wireless/intel/iwlwifi/pcie/trans-gen2.c | 1 + .../net/wireless/intel/iwlwifi/pcie/trans.c | 1 + 4 files changed, 20 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/pcie/internal.h +1 -0
@@ -480,6 +480,7 @@ int iwl_pcie_rx_stop(struct iwl_trans *trans);void iwl_pcie_rx_free (struct iwl_trans *trans);void iwl_pcie_free_rbs_pool (struct iwl_trans *trans);void iwl_pcie_rx_init_rxb_lists (struct iwl_rxq *rxq); +void iwl_pcie_rx_napi_sync (struct iwl_trans *trans);void iwl_pcie_rxq_alloc_rbs (struct iwl_trans *trans,gfp_t priority,struct iwl_rxq *rxq);
drivers/net/wireless/intel/iwlwifi/pcie/rx.c +17 -1
@@ -1,6 +1,6 @@// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* -* Copyright (C) 2003-2014, 2018-2022 Intel Corporation +* Copyright (C) 2003-2014, 2018-2023 Intel Corporation * Copyright (C) 2013-2015 Intel Mobile Communications GmbH * Copyright (C) 2016-2017 Intel Deutschland GmbH */
@@ -1050,6 +1050,22 @@ static int iwl_pcie_napi_poll_msix(struct napi_struct *napi, int budget)return ret; } +void iwl_pcie_rx_napi_sync (struct iwl_trans *trans) +{ +struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans); +int i; + +if (unlikely (!trans_pcie->rxq)) +return ; + +for (i =0 ; i < trans->num_rx_queues; i++) { +struct iwl_rxq *rxq = &trans_pcie->rxq[i]; + +if (rxq && rxq->napi.poll) +napi_synchronize (&rxq->napi); + } +} +static int _iwl_pcie_rx_init (struct iwl_trans *trans) {struct iwl_trans_pcie *trans_pcie =IWL_TRANS_GET_PCIE_TRANS (trans);
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +1 -0
@@ -165,6 +165,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_rx_napi_sync (trans);iwl_txq_gen2_tx_free (trans);iwl_pcie_rx_stop (trans); }
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +1 -0
@@ -1197,6 +1197,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_rx_napi_sync (trans);iwl_pcie_tx_stop (trans);iwl_pcie_rx_stop (trans);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 45/244 wifi: iwlwifi: pcie: synchronize IRQs before NAPI
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 37fb29bd1f90f16d1abc95c0e9f0ff8eec9829ad ]
When we want to synchronize the NAPI, which was added in commit 5af2bb3168db ("wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues"), we also need to make sure we can't actually reschedule the NAPI. Yes, this happens while interrupts are disabled, but interrupts may still be running or pending. Also call iwl_pcie_synchronize_irqs() to ensure we won't reschedule the NAPI.
--- drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 1 + drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 1 + 2 files changed, 2 insertions(+)
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +1 -0
@@ -165,6 +165,7 @@ void _iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_synchronize_irqs (trans);iwl_pcie_rx_napi_sync (trans);iwl_txq_gen2_tx_free (trans);iwl_pcie_rx_stop (trans);
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +1 -0
@@ -1197,6 +1197,7 @@ static void _iwl_trans_pcie_stop_device(struct iwl_trans *trans)if (test_and_clear_bit (STATUS_DEVICE_ENABLED , &trans->status)) {IWL_DEBUG_INFO (trans,"DEVICE_ENABLED bit was set and is now cleared\n" ); +iwl_pcie_synchronize_irqs (trans);iwl_pcie_rx_napi_sync (trans);iwl_pcie_tx_stop (trans);iwl_pcie_rx_stop (trans);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 46/244 wifi: iwlwifi: empty overflow queue during flush
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 658939fc68d3241f9a0019e224cd7154438c23f2 ]
If a TX queue has no space for new TX frames, the driver will keep these frames in the overflow queue, and during reclaim flow it will retry to send the frames from that queue.
But if the reclaim flow was invoked from TX queue flush, we will also TX these frames, which is wrong as we don't want to TX anything after flush.
This might also cause assert 0x125F when removing the queue, saying that the driver removes a non-empty queue
Fix this by TXing the overflow queue's frames only if we are not in flush queue flow.
--- drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 5 +++-- drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 ++++--- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 4 ++-- drivers/net/wireless/intel/iwlwifi/queue/tx.c | 9 +++++---- drivers/net/wireless/intel/iwlwifi/queue/tx.h | 2 +- 5 files changed, 15 insertions(+), 12 deletions(-)
drivers/net/wireless/intel/iwlwifi/dvm/tx.c +3 -2
@@ -3,6 +3,7 @@* * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. * Copyright (C) 2019 Intel Corporation +* Copyright (C) 2023 Intel Corporation * * Contact Information: * Intel Linux Wireless <[email protected]>
@@ -1174,7 +1175,7 @@ void iwlagn_rx_reply_tx(struct iwl_priviwlagn_check_ratid_empty (priv, sta_id, tid); } -iwl_trans_reclaim (priv->trans, txq_id, ssn, &skbs); +iwl_trans_reclaim (priv->trans, txq_id, ssn, &skbs, false); freed =0 ;
@@ -1320,7 +1321,7 @@ void iwlagn_rx_reply_compressed_ba(struc* block-ack window (we assume that they've been successfully * transmitted ... if not, it's too late anyway). */ iwl_trans_reclaim (priv->trans, scd_flow, ba_resp_scd_ssn, - &reclaimed_skbs); + &reclaimed_skbs, false); IWL_DEBUG_TX_REPLY(priv, "REPLY_COMPRESSED_BA [%d] Received from %pM, " "sta_id = %d\n",
drivers/net/wireless/intel/iwlwifi/iwl-trans.h +4 -3
@@ -539,7 +539,7 @@ struct iwl_trans_ops {int (*tx)(struct iwl_trans *trans,struct sk_buff *skb,struct iwl_device_tx_cmd *dev_cmd,int queue);void (*reclaim)(struct iwl_trans *trans,int queue,int ssn, -struct sk_buff_head *skbs); +struct sk_buff_head *skbs,bool is_flush);void (*set_q_ptrs)(struct iwl_trans *trans,int queue,int ptr);
@@ -1122,14 +1122,15 @@ static inline int iwl_trans_tx(struct iw }static inline void iwl_trans_reclaim (struct iwl_trans *trans,int queue, -int ssn,struct sk_buff_head *skbs) +int ssn,struct sk_buff_head *skbs, +bool is_flush) {if (WARN_ON_ONCE (trans->state !=IWL_TRANS_FW_ALIVE )) {IWL_ERR (trans,"%s bad state = %d\n" , __func__, trans->state);return ; } - trans->ops->reclaim (trans, queue, ssn, skbs); + trans->ops->reclaim (trans, queue, ssn, skbs, is_flush); } static inline void iwl_trans_set_q_ptrs(struct iwl_trans *trans, int queue,
drivers/net/wireless/intel/iwlwifi/mvm/tx.c +2 -2
@@ -1436,7 +1436,7 @@ static void iwl_mvm_rx_tx_cmd_single(str seq_ctl =le16_to_cpu (tx_resp->seq_ctl);/* we can free until ssn % q.n_bd not inclusive */ -iwl_trans_reclaim (mvm->trans, txq_id, ssn, &skbs); +iwl_trans_reclaim (mvm->trans, txq_id, ssn, &skbs, false);while (!skb_queue_empty (&skbs)) {struct sk_buff *skb =__skb_dequeue (&skbs);
@@ -1781,7 +1781,7 @@ static void iwl_mvm_tx_reclaim(struct iw* block-ack window (we assume that they've been successfully * transmitted ... if not, it's too late anyway). */ -iwl_trans_reclaim (mvm->trans, txq, index, &reclaimed_skbs); +iwl_trans_reclaim (mvm->trans, txq, index, &reclaimed_skbs, is_flush); skb_queue_walk(&reclaimed_skbs, skb) {struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);
drivers/net/wireless/intel/iwlwifi/queue/tx.c +5 -4
@@ -1520,7 +1520,7 @@ void iwl_txq_progress(struct iwl_txq *tx/* Frees buffers until index _not_ inclusive */ void iwl_txq_reclaim (struct iwl_trans *trans,int txq_id,int ssn, -struct sk_buff_head *skbs) +struct sk_buff_head *skbs,bool is_flush) {struct iwl_txq *txq = trans->txqs.txq[txq_id];int tfd_num =iwl_txq_get_cmd_index (txq, ssn);
@@ -1591,9 +1591,11 @@ void iwl_txq_reclaim(struct iwl_trans *tif (iwl_txq_space (trans, txq) > txq->low_mark &&test_bit (txq_id, trans->txqs.queue_stopped)) {struct sk_buff_head overflow_skbs; +struct sk_buff *skb;__skb_queue_head_init (&overflow_skbs); -skb_queue_splice_init (&txq->overflow_q, &overflow_skbs); +skb_queue_splice_init (&txq->overflow_q, + is_flush ? skbs : &overflow_skbs);/* * We are going to transmit from the overflow queue.
@@ -1613,8 +1615,7 @@ void iwl_txq_reclaim(struct iwl_trans *t*/ spin_unlock_bh (&txq->lock); -while (!skb_queue_empty (&overflow_skbs)) { -struct sk_buff *skb =__skb_dequeue (&overflow_skbs); +while ((skb =__skb_dequeue (&overflow_skbs))) {struct iwl_device_tx_cmd *dev_cmd_ptr; dev_cmd_ptr = *(void **)((u8 *)skb->cb +
drivers/net/wireless/intel/iwlwifi/queue/tx.h +1 -1
@@ -174,7 +174,7 @@ void iwl_txq_gen1_update_byte_cnt_tbl(st struct iwl_txq *txq, u16 byte_cnt, int num_tbs);void iwl_txq_reclaim (struct iwl_trans *trans,int txq_id,int ssn, -struct sk_buff_head *skbs); +struct sk_buff_head *skbs,bool is_flush);void iwl_txq_set_q_ptrs (struct iwl_trans *trans,int txq_id,int ptr);void iwl_trans_txq_freeze_timer (struct iwl_trans *trans,unsigned long txqs,bool freeze);
Greg Kroah-Hartman
maintainerPATCH 47/244 ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 48cf49d31994ff97b33c4044e618560ec84d35fb ]
snprintf() does not return negative values on error.
To know if the buffer was too small, the returned value needs to be compared with the length of the passed buffer. If it is greater or equal, the output has been truncated, so add checks for the truncation to create_pnp_modalias() and create_of_modalias(). Also make them return -ENOMEM in that case, as they already do that elsewhere.
Moreover, the remaining size of the buffer used by snprintf() needs to be updated after the first write to avoid out-of-bounds access as already done correctly in create_pnp_modalias(), but not in create_of_modalias(), so change the latter accordingly.
--- drivers/acpi/device_sysfs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/acpi/device_sysfs.c +6 -4
@@ -157,8 +157,8 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias,return 0 ; len =snprintf (modalias, size,"acpi:" ); -if (len <=0 ) -return len; +if (len >= size) +return -ENOMEM ; size -= len;
@@ -211,8 +211,10 @@ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias, len =snprintf (modalias, size,"of:N%sT" , (char *)buf.pointer);ACPI_FREE (buf.pointer); -if (len <=0 ) -return len; +if (len >= size) +return -ENOMEM ; + + size -= len; of_compatible = acpi_dev->data.of_compatible;if (of_compatible->type ==ACPI_TYPE_PACKAGE ) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 48/244 ipv6: avoid atomic fragment on GSO packets
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yan Zhai <[email protected]>
[ Upstream commit 03d6c848bfb406e9ef6d9846d759e97beaeea113 ]
When the ipv6 stack output a GSO packet, if its gso_size is larger than dst MTU, then all segments would be fragmented. However, it is possible for a GSO packet to have a trailing segment with smaller actual size than both gso_size as well as the MTU, which leads to an "atomic fragment". Atomic fragments are considered harmful in RFC-8021. An Existing report from APNIC also shows that atomic fragments are more likely to be dropped even it is equivalent to a no-op [1].
Add an extra check in the GSO slow output path. For each segment from the original over-sized packet, if it fits with the path MTU, then avoid generating an atomic fragment.
--- net/ipv6/ip6_output.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +7 -1
@@ -159,7 +159,13 @@ ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk,int err;skb_mark_not_on_list (segs); - err =ip6_fragment (net, sk, segs, ip6_finish_output2); +/* Last GSO segment can be smaller than gso_size (and MTU). +* Adding a fragment header would produce an "atomic fragment", +* which is considered harmful (RFC-8021). Avoid that. +*/ + err = segs->len > mtu ? +ip6_fragment (net, sk, segs, ip6_finish_output2) : +ip6_finish_output2 (net, sk, segs);if (err && ret ==0 ) ret = err; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 49/244 net: add DEV_STATS_READ() helper
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 0b068c714ca9479d2783cc333fff5bc2d4a6d45c ]
Companion of DEV_STATS_INC() & DEV_STATS_ADD().
This is going to be used in the series.
Use it in macsec_get_stats64().
Stable-dep-of: ff672b9ffeb3 ("ipvlan: properly track tx_errors")
--- drivers/net/macsec.c | 6 +++--- include/linux/netdevice.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/net/macsec.c +3 -3
@@ -3681,9 +3681,9 @@ static void macsec_get_stats64(struct net_device *dev,dev_fetch_sw_netstats (s, dev->tstats); - s->rx_dropped =atomic_long_read (&dev->stats.__rx_dropped); - s->tx_dropped =atomic_long_read (&dev->stats.__tx_dropped); - s->rx_errors =atomic_long_read (&dev->stats.__rx_errors); + s->rx_dropped =DEV_STATS_READ (dev, rx_dropped); + s->tx_dropped =DEV_STATS_READ (dev, tx_dropped); + s->rx_errors =DEV_STATS_READ (dev, rx_errors); }static int macsec_get_iflink (const struct net_device *dev)
include/linux/netdevice.h +1 -0
@@ -5499,5 +5499,6 @@ extern struct net_device *blackhole_netdev;#define DEV_STATS_INC (DEV ,FIELD ) atomic_long_inc(&(DEV)->stats.__##FIELD)#define DEV_STATS_ADD (DEV ,FIELD ,VAL ) \ atomic_long_add((VAL), &(DEV)->stats.__##FIELD) +#define DEV_STATS_READ (DEV ,FIELD ) atomic_long_read(&(DEV)->stats.__##FIELD)#endif /* _LINUX_NETDEVICE_H */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 50/244 ipvlan: properly track tx_errors
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit ff672b9ffeb3f82135488ac16c5c5eb4b992999b ]
Both ipvlan_process_v4_outbound() and ipvlan_process_v6_outbound() increment dev->stats.tx_errors in case of errors.
Unfortunately there are two issues :
1) ipvlan_get_stats64() does not propagate dev->stats.tx_errors to user.
2) Increments are not atomic. KCSAN would complain eventually.
Use DEV_STATS_INC() to not miss an update, and change ipvlan_get_stats64() to copy the value back to user.
--- drivers/net/ipvlan/ipvlan_core.c | 8 ++++---- drivers/net/ipvlan/ipvlan_main.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +4 -4
@@ -442,12 +442,12 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb) err =ip_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);else ret =NET_XMIT_SUCCESS ; goto out; err: - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);kfree_skb (skb); out:return ret;
@@ -483,12 +483,12 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb) err =ip6_local_out (net, skb->sk, skb);if (unlikely (net_xmit_eval (err))) - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);else ret =NET_XMIT_SUCCESS ; goto out; err: - dev->stats.tx_errors++; +DEV_STATS_INC (dev, tx_errors);kfree_skb (skb); out:return ret;
drivers/net/ipvlan/ipvlan_main.c +1 -0
@@ -324,6 +324,7 @@ static void ipvlan_get_stats64(struct net_device *dev, s->rx_dropped = rx_errs; s->tx_dropped = tx_drps; } + s->tx_errors =DEV_STATS_READ (dev, tx_errors); }static int ipvlan_vlan_rx_add_vid (struct net_device *dev,__be16 proto,u16 vid)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 51/244 regmap: debugfs: Fix a erroneous check after snprintf()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit d3601857e14de6369f00ae19564f1d817d175d19 ]
This error handling looks really strange.
Check if the string has been truncated instead.
--- drivers/base/regmap/regmap-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/regmap/regmap-debugfs.c +1 -1
@@ -48,7 +48,7 @@ static ssize_t regmap_name_read_file(struct file *file, name = map->dev->driver->name; ret =snprintf (buf,PAGE_SIZE ,"%s\n" , name); -if (ret <0 ) { +if (ret >=PAGE_SIZE ) {kfree (buf);return ret; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 52/244 spi: tegra: Fix missing IRQ check in tegra_slink_probe()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Shurong <[email protected]>
[ Upstream commit eb9913b511f10968a02cfa5329a896855dd152a3 ]
This func misses checking for platform_get_irq()'s call and may passes the negative error codes to request_irq(), which takes unsigned IRQ #, causing it to fail with -EINVAL, overriding an original error code.
Fix this by stop calling request_irq() with invalid IRQ #s.
--- drivers/spi/spi-tegra20-slink.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-tegra20-slink.c +2 -0
@@ -1087,6 +1087,8 @@ static int tegra_slink_probe(struct platform_device *pdev)reset_control_deassert (tspi->rst); spi_irq =platform_get_irq (pdev,0 ); +if (spi_irq <0 ) +return spi_irq; tspi->irq = spi_irq; ret = request_threaded_irq(tspi->irq, tegra_slink_isr, tegra_slink_isr_thread, IRQF_ONESHOT,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 53/244 clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Devi Priya <[email protected]>
[ Upstream commit f7b7d30158cff246667273bd2a62fc93ee0725d2 ]
If the parent clock rate is greater than unsigned long max/2 then integer overflow happens when calculating the clock rate on 32-bit systems. As RCG2 uses half integer dividers, the clock rate is first being multiplied by 2 which will overflow the unsigned long max value. Hence, replace the common pattern of doing 64-bit multiplication and then a do_div() call with simpler mult_frac call.
--- drivers/clk/qcom/clk-rcg2.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
drivers/clk/qcom/clk-rcg2.c +4 -10
@@ -148,17 +148,11 @@ static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)static unsigned long calc_rate (unsigned long rate,u32 m,u32 n,u32 mode,u32 hid_div) { -if (hid_div) { - rate *=2 ; - rate /= hid_div +1 ; - } +if (hid_div) + rate =mult_frac (rate,2 , hid_div +1 ); -if (mode) { -u64 tmp = rate; - tmp *= m; -do_div (tmp, n); - rate = tmp; - } +if (mode) + rate =mult_frac (rate, m, n);return rate; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 54/244 clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 9906c4140897bbdbff7bb71c6ae67903cb9954ce ]
Some branch clocks are governed externally and we're only supposed to send a request concerning their shutdown, not actually ensure it happens.
Use the BRANCH_HALT_SKIP define to skip checking the halt bit.
--- drivers/clk/qcom/mmcc-msm8998.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/qcom/mmcc-msm8998.c +3 -0
@@ -2487,6 +2487,7 @@ static struct clk_branch fd_ahb_clk = {static struct clk_branch mnoc_ahb_clk = { .halt_reg =0x5024 , + .halt_check =BRANCH_HALT_SKIP , .clkr = { .enable_reg =0x5024 , .enable_mask =BIT (0 ),
@@ -2502,6 +2503,7 @@ static struct clk_branch mnoc_ahb_clk = {static struct clk_branch bimc_smmu_ahb_clk = { .halt_reg =0xe004 , + .halt_check =BRANCH_HALT_SKIP , .hwcg_reg =0xe004 , .hwcg_bit =1 , .clkr = {
@@ -2519,6 +2521,7 @@ static struct clk_branch bimc_smmu_ahb_clk = {static struct clk_branch bimc_smmu_axi_clk = { .halt_reg =0xe008 , + .halt_check =BRANCH_HALT_SKIP , .hwcg_reg =0xe008 , .hwcg_bit =1 , .clkr = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 55/244 clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 1fc62c8347397faf4e18249e88ecd4470c0a5357 ]
The SMMU GDSC doesn't have to be ALWAYS-ON and shouldn't feature the HW_CTRL flag (it's separate from hw_ctrl_addr). In addition to that, it should feature a cxc entry for bimc_smmu_axi_clk and be marked as votable.
Fix all of these issues.
--- drivers/clk/qcom/mmcc-msm8998.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/clk/qcom/mmcc-msm8998.c +3 -1
@@ -2662,11 +2662,13 @@ static struct gdsc camss_cpp_gdsc = {static struct gdsc bimc_smmu_gdsc = { .gdscr =0xe020 , .gds_hw_ctrl =0xe024 , + .cxcs = (unsigned int []){0xe008 }, + .cxc_count =1 , .pd = { .name ="bimc_smmu" , }, .pwrsts =PWRSTS_OFF_ON , - .flags =HW_CTRL |ALWAYS_ON , + .flags =VOTABLE , };static struct clk_regmap *mmcc_msm8998_clocks[] = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 56/244 clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danila Tikhonov <[email protected]>
[ Upstream commit 7138c244fb293f24ce8ab782961022eff00a10c4 ]
Set .flags = CLK_OPS_PARENT_ENABLE to fix "gcc_sdcc2_apps_clk_src: rcg didn't update its configuration" error.
--- drivers/clk/qcom/gcc-sm8150.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/gcc-sm8150.c +1 -1
@@ -792,7 +792,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { .name = "gcc_sdcc2_apps_clk_src", .parent_data = gcc_parents_6, .num_parents = ARRAY_SIZE(gcc_parents_6), - .flags = CLK_SET_RATE_PARENT, + .flags = CLK_OPS_PARENT_ENABLE, .ops = &clk_rcg2_floor_ops, }, };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 57/244 clk: imx: Select MXC_CLK for CLK_IMX8QXP
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit 317e69c49b4ceef8aebb47d771498ccb3571bdf9 ]
If the i.MX8QXP clock provider is built-in but the MXC_CLK is built as module, build fails:
aarch64-linux-ld: drivers/clk/imx/clk-imx8-acm.o: in function `imx8_acm_clk_probe':
clk-imx8-acm.c:(.text+0x3d0): undefined reference to `imx_check_clk_hws'
Fix that by selecting MXC_CLK in case of CLK_IMX8QXP.
--- drivers/clk/imx/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clk/imx/Kconfig +1 -0
@@ -96,5 +96,6 @@ config CLK_IMX8QXP depends on (ARCH_MXC && ARM64) || COMPILE_TEST depends on IMX_SCU && HAVE_ARM_SMCCC select MXC_CLK_SCU + select MXC_CLK help Build the driver for IMX8QXP SCU based clocks.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 58/244 clk: imx: imx8mq: correct error handling path
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 577ad169966e6e75b10e004389a3f79813e84b5d ]
Avoid memory leak in error handling path. It does not make much sense for the SoC without clk driver, to make program behavior correct, let's fix it.
--- drivers/clk/imx/clk-imx8mq.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/clk/imx/clk-imx8mq.c +10 -7
@@ -288,8 +288,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)void __iomem *base;int err; - clk_hw_data =kzalloc (struct_size (clk_hw_data, hws, -IMX8MQ_CLK_END ),GFP_KERNEL ); + clk_hw_data =devm_kzalloc (dev,struct_size (clk_hw_data, hws,IMX8MQ_CLK_END ),GFP_KERNEL );if (WARN_ON (!clk_hw_data))return -ENOMEM ;
@@ -306,10 +305,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) hws[IMX8MQ_CLK_EXT4 ] =imx_obtain_fixed_clk_hw (np,"clk_ext4" ); np =of_find_compatible_node (NULL ,NULL ,"fsl,imx8mq-anatop" ); - base =of_iomap (np,0 ); + base =devm_of_iomap (dev, np,0 ,NULL );of_node_put (np); -if (WARN_ON (!base)) -return -ENOMEM ; +if (WARN_ON (IS_ERR (base))) { + err =PTR_ERR (base); + goto unregister_hws; + } hws[IMX8MQ_ARM_PLL_REF_SEL ] =imx_clk_hw_mux ("arm_pll_ref_sel" , base +0x28 ,16 ,2 , pll_ref_sels,ARRAY_SIZE (pll_ref_sels)); hws[IMX8MQ_GPU_PLL_REF_SEL ] =imx_clk_hw_mux ("gpu_pll_ref_sel" , base +0x18 ,16 ,2 , pll_ref_sels,ARRAY_SIZE (pll_ref_sels));
@@ -395,8 +396,10 @@ static int imx8mq_clocks_probe(struct platform_device *pdev) np = dev->of_node; base =devm_platform_ioremap_resource (pdev,0 ); -if (WARN_ON (IS_ERR (base))) -return PTR_ERR (base); +if (WARN_ON (IS_ERR (base))) { + err =PTR_ERR (base); + goto unregister_hws; + }/* CORE */ hws[IMX8MQ_CLK_A53_DIV ] =imx8m_clk_hw_composite_core ("arm_a53_div" , imx8mq_a53_sels, base +0x8000 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 59/244 clk: imx: imx8qxp: Fix elcdif_pll clock
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Chiras <[email protected]>
[ Upstream commit 15cee75dacb82ade710d61bfd536011933ef9bf2 ]
Move the elcdif_pll clock initialization before the lcd_clk, since the elcdif_clk needs to be initialized ahead of lcd_clk, being its parent. This change fixes issues with the LCD clocks during suspend/resume.
--- drivers/clk/imx/clk-imx8qxp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-imx8qxp.c +1 -1
@@ -148,10 +148,10 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu ("adc0_clk" ,IMX_SC_R_ADC_0 ,IMX_SC_PM_CLK_PER );imx_clk_scu ("adc1_clk" ,IMX_SC_R_ADC_1 ,IMX_SC_PM_CLK_PER );imx_clk_scu ("pwm_clk" ,IMX_SC_R_LCD_0_PWM_0 ,IMX_SC_PM_CLK_PER ); +imx_clk_scu ("elcdif_pll" ,IMX_SC_R_ELCDIF_PLL ,IMX_SC_PM_CLK_PLL );imx_clk_scu2 ("lcd_clk" , lcd_sels,ARRAY_SIZE (lcd_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_PER );imx_clk_scu2 ("lcd_pxl_clk" , lcd_pxl_sels,ARRAY_SIZE (lcd_pxl_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_MISC0 );imx_clk_scu ("lcd_pxl_bypass_div_clk" ,IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_BYPASS ); -imx_clk_scu ("elcdif_pll" ,IMX_SC_R_ELCDIF_PLL ,IMX_SC_PM_CLK_PLL );/* Audio SS */ imx_clk_scu ("audio_pll0_clk" ,IMX_SC_R_AUDIO_PLL_0 ,IMX_SC_PM_CLK_PLL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 60/244 clk: renesas: rzg2l: Simplify multiplication/shift logic
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 29db30c45f07c929c86c40a5b85f18b69c89c638 ]
"a * (1 << b)" == "a << b".
No change in generated code.
Stable-dep-of: a2b23159499e ("clk: renesas: rzg2l: Fix computation formula")
--- drivers/clk/renesas/rzg2l-cpg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/renesas/rzg2l-cpg.c +1 -1
@@ -155,7 +155,7 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw, val1 =readl (priv->base +GET_REG_SAMPLL_CLK1 (pll_clk->conf)); val2 =readl (priv->base +GET_REG_SAMPLL_CLK2 (pll_clk->conf)); mult =MDIV (val1) +KDIV (val1) /65536 ; - div =PDIV (val1) * (1 <<SDIV (val2)); + div =PDIV (val1) <<SDIV (val2);return DIV_ROUND_CLOSEST_ULL ((u64 )parent_rate * mult, div); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 61/244 clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 72977f07b035e488c3f1928832a1616c6cae7278 ]
Use FIELD_GET() for PLL register fields. This is its purpose.
Stable-dep-of: a2b23159499e ("clk: renesas: rzg2l: Fix computation formula")
--- drivers/clk/renesas/rzg2l-cpg.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +5 -5
@@ -11,6 +11,7 @@* Copyright (C) 2015 Renesas Electronics Corp. */ +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/clk-provider.h> #include <linux/clk/renesas.h>
@@ -37,14 +38,13 @@#define WARN_DEBUG (x) do { } while (0)#endif -#define DIV_RSMASK (v, s, m) ((v >> s) & m)#define GET_SHIFT (val) ((val >> 12) & 0xff)#define GET_WIDTH (val) ((val >> 8) & 0xf) -#define KDIV (val) DIV_RSMASK(val, 16, 0xffff) -#define MDIV (val) DIV_RSMASK(val, 6, 0x3ff) -#define PDIV (val) DIV_RSMASK(val, 0, 0x3f) -#define SDIV (val) DIV_RSMASK(val, 0, 0x7) +#define KDIV (val) FIELD_GET(GENMASK(31, 16), val) +#define MDIV (val) FIELD_GET(GENMASK(15, 6), val) +#define PDIV (val) FIELD_GET(GENMASK(5, 0), val) +#define SDIV (val) FIELD_GET(GENMASK(2, 0), val)#define CLK_ON_R (reg) (reg)#define CLK_MON_R (reg) (0x180 + (reg))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 62/244 clk: renesas: rzg2l: Fix computation formula
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit a2b23159499efd36b2d63b3c4534075d12ddc97a ]
According to the hardware manual for RZ/G2L (r01uh0914ej0130-rzg2l-rzg2lc.pdf), the computation formula for PLL rate is as follows:
Fout = ((m + k/65536) * Fin) / (p * 2^s)
and k has values in the range [-32768, 32767]. Dividing k by 65536 with integer arithmetic gives zero all the time, causing slight differences b/w what has been set vs. what is displayed. Thus, get rid of this and decompose the formula before dividing k by 65536.
--- drivers/clk/renesas/rzg2l-cpg.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +6 -6
@@ -41,7 +41,7 @@#define GET_SHIFT (val) ((val >> 12) & 0xff)#define GET_WIDTH (val) ((val >> 8) & 0xf) -#define KDIV (val) FIELD_GET(GENMASK(31, 16), val) +#define KDIV (val) ((s16)FIELD_GET(GENMASK(31, 16), val))#define MDIV (val) FIELD_GET(GENMASK(15, 6), val)#define PDIV (val) FIELD_GET(GENMASK(5, 0), val)#define SDIV (val) FIELD_GET(GENMASK(2, 0), val)
@@ -146,18 +146,18 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,struct pll_clk *pll_clk =to_pll (hw);struct rzg2l_cpg_priv *priv = pll_clk->priv;unsigned int val1, val2; -unsigned int mult =1 ; -unsigned int div =1 ; +u64 rate;if (pll_clk->type !=CLK_TYPE_SAM_PLL )return parent_rate; val1 =readl (priv->base +GET_REG_SAMPLL_CLK1 (pll_clk->conf)); val2 =readl (priv->base +GET_REG_SAMPLL_CLK2 (pll_clk->conf)); - mult =MDIV (val1) +KDIV (val1) /65536 ; - div =PDIV (val1) <<SDIV (val2); -return DIV_ROUND_CLOSEST_ULL ((u64 )parent_rate * mult, div); + rate =mul_u64_u32_shr (parent_rate, (MDIV (val1) <<16 ) +KDIV (val1), +16 +SDIV (val2)); + +return DIV_ROUND_CLOSEST_ULL (rate,PDIV (val1)); }static const struct clk_ops rzg2l_cpg_pll_ops = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 63/244 spi: nxp-fspi: use the correct ioremap function
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Han Xu <[email protected]>
[ Upstream commit c3aa5cb264a38ae9bbcce32abca4c155af0456df ]
AHB memory as MMIO should be mapped with ioremap rather than ioremap_wc, which should have been used initially just to handle unaligned access as a workaround.
--- drivers/spi/spi-nxp-fspi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-nxp-fspi.c +1 -1
@@ -708,7 +708,7 @@ static int nxp_fspi_read_ahb(struct nxp_fspi *f, const struct spi_mem_op *op) f->memmap_len = len >NXP_FSPI_MIN_IOMAP ? len :NXP_FSPI_MIN_IOMAP ; - f->ahb_addr =ioremap_wc (f->memmap_phy + f->memmap_start, + f->ahb_addr =ioremap (f->memmap_phy + f->memmap_start, f->memmap_len);if (!f->ahb_addr) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 64/244 clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit a5d14f8b551eb1551c10053653ee8e27f19672fa ]
The clk_register_divider() and clk_register_mux() functions returns error pointers on error but this code checks for NULL. Fix that.
--- drivers/clk/keystone/pll.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/clk/keystone/pll.c +9 -6
@@ -281,12 +281,13 @@ static void __init of_pll_div_clk_init(struct device_node *node) clk =clk_register_divider (NULL , clk_name, parent_name,0 , reg, shift, mask,0 ,NULL ); -if (clk) { -of_clk_add_provider (node, of_clk_src_simple_get, clk); - }else { +if (IS_ERR (clk)) {pr_err ("%s: error registering divider %s\n" , __func__, clk_name);iounmap (reg); +return ; } + +of_clk_add_provider (node, of_clk_src_simple_get, clk); }CLK_OF_DECLARE (pll_divider_clock,"ti,keystone,pll-divider-clock" , of_pll_div_clk_init);
@@ -328,10 +329,12 @@ static void __init of_pll_mux_clk_init(struct device_node *node) clk =clk_register_mux (NULL , clk_name, (const char **)&parents,ARRAY_SIZE (parents) ,0 , reg, shift, mask,0 ,NULL ); -if (clk) -of_clk_add_provider (node, of_clk_src_simple_get, clk); -else +if (IS_ERR (clk)) {pr_err ("%s: error registering mux %s\n" , __func__, clk_name); +return ; + } + +of_clk_add_provider (node, of_clk_src_simple_get, clk); }CLK_OF_DECLARE (pll_mux_clock,"ti,keystone,pll-mux-clock" , of_pll_mux_clk_init);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 65/244 clk: ti: Add ti_dt_clk_name() helper to use clock-output-names
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit 2c1593328d7f02fe49de5ad6b42c36296c9d6922 ]
Let's create the clock alias based on the clock-output-names property if available. Also the component clock drivers can use ti_dt_clk_name() in the following patches.
Stable-dep-of: 7af5b9eadd64 ("clk: ti: fix double free in of_ti_divider_clk_setup()")
--- drivers/clk/ti/clk.c | 20 +++++++++++++++++++- drivers/clk/ti/clock.h | 1 + 2 files changed, 20 insertions(+), 1 deletion(-)
drivers/clk/ti/clk.c +19 -1
@@ -402,6 +402,24 @@ static const struct of_device_id simple_clk_match_table[] __initconst = { { } }; +/** +* ti_dt_clk_name - init clock name from first output name or node name +* @np: device node +* +* Use the first clock-output-name for the clock name if found. Fall back +* to legacy naming based on node name. +*/ +const char *ti_dt_clk_name (struct device_node *np) +{ +const char *name; + +if (!of_property_read_string_index (np,"clock-output-names" ,0 , + &name)) +return name; + +return np->name; +} +/** * ti_clk_add_aliases - setup clock aliases *
@@ -418,7 +436,7 @@ void __init ti_clk_add_aliases(void) clkspec.np = np; clk =of_clk_get_from_provider (&clkspec); -ti_clk_add_alias (NULL , clk, np->name); +ti_clk_add_alias (NULL , clk,ti_dt_clk_name (np)); } }
drivers/clk/ti/clock.h +1 -0
@@ -214,6 +214,7 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw, const char *con);struct clk *ti_clk_register_omap_hw (struct device *dev,struct clk_hw *hw,const char *con); +const char *ti_dt_clk_name (struct device_node *np);int ti_clk_add_alias (struct device *dev,struct clk *clk,const char *con);void ti_clk_add_aliases (void );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 66/244 clk: ti: Update pll and clockdomain clocks to use ti_dt_clk_name()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit 9e56a7d4263ca1c51d867e811cf2dd7e61b6469e ]
Let's update the TI pll and clockdomain clocks to use ti_dt_clk_name() instead of devicetree node name if available.
Stable-dep-of: 7af5b9eadd64 ("clk: ti: fix double free in of_ti_divider_clk_setup()")
--- drivers/clk/ti/apll.c | 13 +++++++++---- drivers/clk/ti/clockdomain.c | 2 +- drivers/clk/ti/dpll.c | 8 +++++--- drivers/clk/ti/fapll.c | 11 +++++++---- 4 files changed, 22 insertions(+), 12 deletions(-)
drivers/clk/ti/apll.c +9 -4
@@ -139,6 +139,7 @@ static void __init omap_clk_register_apll(void *user,struct clk_hw *hw = user;struct clk_hw_omap *clk_hw =to_clk_hw_omap (hw);struct dpll_data *ad = clk_hw->dpll_data; +const char *name;struct clk *clk;const struct clk_init_data *init = clk_hw->hw.init;
@@ -166,7 +167,8 @@ static void __init omap_clk_register_apll(void *user, ad->clk_bypass =__clk_get_hw (clk); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, node->name); + name =ti_dt_clk_name (node); + clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init->parent_names);
@@ -198,7 +200,7 @@ static void __init of_dra7_apll_setup(struct device_node *node) clk_hw->dpll_data = ad; clk_hw->hw.init = init; - init->name = node->name; + init->name =ti_dt_clk_name (node); init->ops = &apll_ck_ops; init->num_parents =of_clk_get_parent_count (node);
@@ -347,6 +349,7 @@ static void __init of_omap2_apll_setup(struct device_node *node)struct dpll_data *ad =NULL ;struct clk_hw_omap *clk_hw =NULL ;struct clk_init_data *init =NULL ; +const char *name;struct clk *clk;const char *parent_name;u32 val;
@@ -362,7 +365,8 @@ static void __init of_omap2_apll_setup(struct device_node *node) clk_hw->dpll_data = ad; clk_hw->hw.init = init; init->ops = &omap2_apll_ops; - init->name = node->name; + name =ti_dt_clk_name (node); + init->name = name; clk_hw->ops = &omap2_apll_hwops; init->num_parents =of_clk_get_parent_count (node);
@@ -403,7 +407,8 @@ static void __init of_omap2_apll_setup(struct device_node *node)if (ret) goto cleanup; - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, node->name); + name =ti_dt_clk_name (node); + clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init);
drivers/clk/ti/clockdomain.c +1 -1
@@ -131,7 +131,7 @@ static void __init of_ti_clockdomain_setup(struct device_node *node) {struct clk *clk;struct clk_hw *clk_hw; -const char *clkdm_name = node->name; +const char *clkdm_name =ti_dt_clk_name (node);int i;unsigned int num_clks;
drivers/clk/ti/dpll.c +5 -3
@@ -164,6 +164,7 @@ static void __init _register_dpll(void *user,struct clk_hw *hw = user;struct clk_hw_omap *clk_hw =to_clk_hw_omap (hw);struct dpll_data *dd = clk_hw->dpll_data; +const char *name;struct clk *clk;const struct clk_init_data *init = hw->init;
@@ -193,7 +194,8 @@ static void __init _register_dpll(void *user, dd->clk_bypass =__clk_get_hw (clk);/* register the clock */ - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, node->name); + name =ti_dt_clk_name (node); + clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
@@ -227,7 +229,7 @@ static void _register_dpll_x2(struct device_node *node,struct clk *clk;struct clk_init_data init = {NULL };struct clk_hw_omap *clk_hw; -const char *name = node->name; +const char *name =ti_dt_clk_name (node);const char *parent_name; parent_name =of_clk_get_parent_name (node,0 );
@@ -304,7 +306,7 @@ static void __init of_ti_dpll_setup(struct device_node *node, clk_hw->ops = &clkhwops_omap3_dpll; clk_hw->hw.init = init; - init->name = node->name; + init->name =ti_dt_clk_name (node); init->ops = ops; init->num_parents =of_clk_get_parent_count (node);
drivers/clk/ti/fapll.c +7 -4
@@ -19,6 +19,8 @@#include <linux/of_address.h> #include <linux/clk/ti.h> +#include "clock.h" +/* FAPLL Control Register PLL_CTRL */ #define FAPLL_MAIN_MULT_N_SHIFT 16#define FAPLL_MAIN_DIV_P_SHIFT 8
@@ -542,6 +544,7 @@ static void __init ti_fapll_setup(struct device_node *node)struct clk_init_data *init =NULL ;const char *parent_name[2 ];struct clk *pll_clk; +const char *name;int i; fd =kzalloc (sizeof (*fd),GFP_KERNEL );
@@ -559,7 +562,8 @@ static void __init ti_fapll_setup(struct device_node *node) goto free; init->ops = &ti_fapll_ops; - init->name = node->name; + name =ti_dt_clk_name (node); + init->name = name; init->num_parents =of_clk_get_parent_count (node);if (init->num_parents !=2 ) {
@@ -591,7 +595,7 @@ static void __init ti_fapll_setup(struct device_node *node)if (fapll_is_ddr_pll (fd->base)) fd->bypass_bit_inverted = true; - fd->name = node->name; + fd->name = name; fd->hw.init = init;/* Register the parent PLL */
@@ -638,8 +642,7 @@ static void __init ti_fapll_setup(struct device_node *node) freq =NULL ; } synth_clk =ti_fapll_synth_setup (fd, freq, div, output_instance, - output_name, node->name, - pll_clk); + output_name, name, pll_clk);if (IS_ERR (synth_clk))continue ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 67/244 clk: ti: Update component clocks to use ti_dt_clk_name()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit ed06099c5d0b329082cc19c58eace0b20bf7fe70 ]
Let's update all the TI component clocks to use ti_dt_clk_name() instead of devicetree node name if available.
Stable-dep-of: 7af5b9eadd64 ("clk: ti: fix double free in of_ti_divider_clk_setup()")
--- drivers/clk/ti/autoidle.c | 2 +- drivers/clk/ti/clk-dra7-atl.c | 6 ++++-- drivers/clk/ti/composite.c | 6 ++++-- drivers/clk/ti/divider.c | 6 ++++-- drivers/clk/ti/fixed-factor.c | 2 +- drivers/clk/ti/gate.c | 4 +++- drivers/clk/ti/interface.c | 4 +++- drivers/clk/ti/mux.c | 4 +++- 8 files changed, 23 insertions(+), 11 deletions(-)
drivers/clk/ti/autoidle.c +1 -1
@@ -205,7 +205,7 @@ int __init of_ti_clk_autoidle_setup(struct device_node *node)return -ENOMEM ; clk->shift = shift; - clk->name = node->name; + clk->name =ti_dt_clk_name (node); ret =ti_clk_get_reg_addr (node,0 , &clk->reg);if (ret) {kfree (clk);
drivers/clk/ti/clk-dra7-atl.c +4 -2
@@ -173,6 +173,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)struct dra7_atl_desc *clk_hw =NULL ;struct clk_init_data init = {NULL };const char **parent_names =NULL ; +const char *name;struct clk *clk; clk_hw =kzalloc (sizeof (*clk_hw),GFP_KERNEL );
@@ -183,7 +184,8 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) clk_hw->hw.init = &init; clk_hw->divider =1 ; - init.name = node->name; + name =ti_dt_clk_name (node); + init.name = name; init.ops = &atl_clk_ops; init.flags =CLK_IGNORE_UNUSED ; init.num_parents =of_clk_get_parent_count (node);
@@ -203,7 +205,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) init.parent_names = parent_names; - clk =ti_clk_register (NULL , &clk_hw->hw, node->name); + clk =ti_clk_register (NULL , &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
drivers/clk/ti/composite.c +4 -2
@@ -125,6 +125,7 @@ static void __init _register_composite(void *user,struct component_clk *comp;int num_parents =0 ;const char **parent_names =NULL ; +const char *name;int i;int ret;
@@ -172,7 +173,8 @@ static void __init _register_composite(void *user, goto cleanup; } - clk = clk_register_composite(NULL, node->name, + name =ti_dt_clk_name (node); + clk = clk_register_composite(NULL, name, parent_names, num_parents, _get_hw(cclk, CLK_COMPONENT_TYPE_MUX), &ti_clk_mux_ops,
@@ -182,7 +184,7 @@ static void __init _register_composite(void *user, &ti_composite_gate_ops, 0);if (!IS_ERR (clk)) { - ret =ti_clk_add_alias (NULL , clk, node->name); + ret =ti_clk_add_alias (NULL , clk, name);if (ret) {clk_unregister (clk); goto cleanup;
drivers/clk/ti/divider.c +4 -2
@@ -320,10 +320,12 @@ static struct clk *_register_divider(struct device_node *node,struct clk *clk;struct clk_init_data init;const char *parent_name; +const char *name; parent_name =of_clk_get_parent_name (node,0 ); - init.name = node->name; + name =ti_dt_clk_name (node); + init.name = name; init.ops = &ti_clk_divider_ops; init.flags = flags; init.parent_names = (parent_name ? &parent_name :NULL );
@@ -332,7 +334,7 @@ static struct clk *_register_divider(struct device_node *node, div->hw.init = &init;/* register the clock */ - clk =ti_clk_register (NULL , &div->hw, node->name); + clk =ti_clk_register (NULL , &div->hw, name);if (IS_ERR (clk))kfree (div);
drivers/clk/ti/fixed-factor.c +1 -1
@@ -36,7 +36,7 @@static void __init of_ti_fixed_factor_clk_setup (struct device_node *node) {struct clk *clk; -const char *clk_name = node->name; +const char *clk_name =ti_dt_clk_name (node);const char *parent_name;u32 div, mult;u32 flags =0 ;
drivers/clk/ti/gate.c +3 -1
@@ -138,6 +138,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node,struct clk *clk;const char *parent_name;struct clk_omap_reg reg; +const char *name;u8 enable_bit =0 ;u32 val;u32 flags =0 ;
@@ -164,7 +165,8 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node,if (of_property_read_bool (node,"ti,set-bit-to-disable" )) clk_gate_flags |=INVERT_ENABLE ; - clk =_register_gate (NULL , node->name, parent_name, flags, ®, + name =ti_dt_clk_name (node); + clk =_register_gate (NULL , name, parent_name, flags, ®, enable_bit, clk_gate_flags, ops, hw_ops);if (!IS_ERR (clk))
drivers/clk/ti/interface.c +3 -1
@@ -72,6 +72,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node,const char *parent_name;struct clk_omap_reg reg;u8 enable_bit =0 ; +const char *name;u32 val;if (ti_clk_get_reg_addr (node,0 , ®))
@@ -86,7 +87,8 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node,return ; } - clk =_register_interface (NULL , node->name, parent_name, ®, + name =ti_dt_clk_name (node); + clk =_register_interface (NULL , name, parent_name, ®, enable_bit, ops);if (!IS_ERR (clk))
drivers/clk/ti/mux.c +3 -1
@@ -176,6 +176,7 @@ static void of_mux_clk_setup(struct device_node *node)struct clk_omap_reg reg;unsigned int num_parents;const char **parent_names; +const char *name;u8 clk_mux_flags =0 ;u32 mask =0 ;u32 shift =0 ;
@@ -213,7 +214,8 @@ static void of_mux_clk_setup(struct device_node *node) mask = (1 <<fls (mask)) -1 ; - clk =_register_mux (NULL , node->name, parent_names, num_parents, + name =ti_dt_clk_name (node); + clk =_register_mux (NULL , name, parent_names, num_parents, flags, ®, shift, mask, latch, clk_mux_flags,NULL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 68/244 clk: ti: change ti_clk_register[_omap_hw]() API
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dario Binacchi <[email protected]>
[ Upstream commit 3400d546a741a2b2001d88e7fa29110d45a3930d ]
The ti_clk_register() and ti_clk_register_omap_hw() functions are always called with the parameter of type "struct device" set to NULL, since the functions from which they are called always have a parameter of type "struct device_node". Replacing "struct device" type parameter with "struct device_node" will allow you to register a TI clock to the common clock framework by taking advantage of the facilities provided by the "struct device_node" type. Further, adding the "of_" prefix to the name of these functions explicitly binds them to the "struct device_node" type.
The patch has been tested on a Beaglebone board.
Stable-dep-of: 7af5b9eadd64 ("clk: ti: fix double free in of_ti_divider_clk_setup()")
--- drivers/clk/ti/apll.c | 4 ++-- drivers/clk/ti/clk-dra7-atl.c | 2 +- drivers/clk/ti/clk.c | 34 ++++++++++++++++------------------ drivers/clk/ti/clkctrl.c | 4 ++-- drivers/clk/ti/clock.h | 10 +++++----- drivers/clk/ti/composite.c | 2 +- drivers/clk/ti/divider.c | 2 +- drivers/clk/ti/dpll.c | 4 ++-- drivers/clk/ti/fixed-factor.c | 2 +- drivers/clk/ti/gate.c | 6 +++--- drivers/clk/ti/interface.c | 7 ++++--- drivers/clk/ti/mux.c | 6 +++--- 12 files changed, 41 insertions(+), 42 deletions(-)
drivers/clk/ti/apll.c +2 -2
@@ -168,7 +168,7 @@ static void __init omap_clk_register_apll(void *user, ad->clk_bypass =__clk_get_hw (clk); name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init->parent_names);
@@ -408,7 +408,7 @@ static void __init of_omap2_apll_setup(struct device_node *node) goto cleanup; name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);kfree (init);
drivers/clk/ti/clk-dra7-atl.c +1 -1
@@ -205,7 +205,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) init.parent_names = parent_names; - clk =ti_clk_register (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
drivers/clk/ti/clk.c +16 -18
@@ -436,7 +436,7 @@ void __init ti_clk_add_aliases(void) clkspec.np = np; clk =of_clk_get_from_provider (&clkspec); -ti_clk_add_alias (NULL , clk,ti_dt_clk_name (np)); +ti_clk_add_alias (clk,ti_dt_clk_name (np)); } }
@@ -489,7 +489,6 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)/** * ti_clk_add_alias - add a clock alias for a TI clock -* @dev: device alias for this clock * @clk: clock handle to create alias for * @con: connection ID for this clock *
@@ -497,7 +496,7 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)* and assigns the data to it. Returns 0 if successful, negative error * value otherwise. */ -int ti_clk_add_alias (struct device *dev,struct clk *clk,const char *con) +int ti_clk_add_alias (struct clk *clk,const char *con) {struct clk_lookup *cl;
@@ -511,8 +510,6 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)if (!cl)return -ENOMEM ; -if (dev) - cl->dev_id =dev_name (dev); cl->con_id = con; cl->clk = clk;
@@ -522,8 +519,8 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con) }/** -* ti_clk_register - register a TI clock to the common clock framework -* @dev: device for this clock +* of_ti_clk_register - register a TI clock to the common clock framework +* @node: device node for this clock * @hw: hardware clock handle * @con: connection ID for this clock *
@@ -531,17 +528,18 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)* alias for it. Returns a handle to the registered clock if successful, * ERR_PTR value in failure. */ -struct clk *ti_clk_register (struct device *dev,struct clk_hw *hw, -const char *con) +struct clk *of_ti_clk_register (struct device_node *node,struct clk_hw *hw, +const char *con) {struct clk *clk;int ret; - clk =clk_register (dev, hw); -if (IS_ERR (clk)) -return clk; + ret =of_clk_hw_register (node, hw); +if (ret) +return ERR_PTR (ret); - ret =ti_clk_add_alias (dev, clk, con); + clk = hw->clk; + ret =ti_clk_add_alias (clk, con);if (ret) {clk_unregister (clk);return ERR_PTR (ret);
@@ -551,8 +549,8 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw, }/** -* ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework -* @dev: device for this clock +* of_ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework +* @node: device node for this clock * @hw: hardware clock handle * @con: connection ID for this clock *
@@ -561,13 +559,13 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,* Returns a handle to the registered clock if successful, ERR_PTR value * in failure. */ -struct clk *ti_clk_register_omap_hw (struct device *dev,struct clk_hw *hw, -const char *con) +struct clk *of_ti_clk_register_omap_hw (struct device_node *node, +struct clk_hw *hw,const char *con) {struct clk *clk;struct clk_hw_omap *oclk; - clk =ti_clk_register (dev, hw, con); + clk =of_ti_clk_register (node, hw, con);if (IS_ERR (clk))return clk;
drivers/clk/ti/clkctrl.c +2 -2
@@ -317,7 +317,7 @@ _ti_clkctrl_clk_register(struct omap_clkctrl_provider *provider, init.ops = ops; init.flags =0 ; - clk =ti_clk_register (NULL , clk_hw, init.name); + clk =of_ti_clk_register (node, clk_hw, init.name);if (IS_ERR_OR_NULL (clk)) { ret = -EINVAL ; goto cleanup;
@@ -701,7 +701,7 @@ static void __init _ti_omap4_clkctrl_setup(struct device_node *node) init.ops = &omap4_clkctrl_clk_ops; hw->hw.init = &init; - clk =ti_clk_register_omap_hw (NULL , &hw->hw, init.name); + clk =of_ti_clk_register_omap_hw (node, &hw->hw, init.name);if (IS_ERR_OR_NULL (clk)) goto cleanup;
drivers/clk/ti/clock.h +5 -5
@@ -210,12 +210,12 @@ extern const struct omap_clkctrl_data dm816_clkctrl_data[];typedef void (*ti_of_clk_init_cb_t )(void *,struct device_node *); -struct clk *ti_clk_register (struct device *dev,struct clk_hw *hw, -const char *con); -struct clk *ti_clk_register_omap_hw (struct device *dev,struct clk_hw *hw, -const char *con); +struct clk *of_ti_clk_register (struct device_node *node,struct clk_hw *hw, +const char *con); +struct clk *of_ti_clk_register_omap_hw (struct device_node *node, +struct clk_hw *hw,const char *con);const char *ti_dt_clk_name (struct device_node *np); -int ti_clk_add_alias (struct device *dev,struct clk *clk,const char *con); +int ti_clk_add_alias (struct clk *clk,const char *con);void ti_clk_add_aliases (void );void ti_clk_latch (struct clk_omap_reg *reg,s8 shift);
drivers/clk/ti/composite.c +1 -1
@@ -184,7 +184,7 @@ static void __init _register_composite(void *user, &ti_composite_gate_ops, 0);if (!IS_ERR (clk)) { - ret =ti_clk_add_alias (NULL , clk, name); + ret =ti_clk_add_alias (clk, name);if (ret) {clk_unregister (clk); goto cleanup;
drivers/clk/ti/divider.c +1 -1
@@ -334,7 +334,7 @@ static struct clk *_register_divider(struct device_node *node, div->hw.init = &init;/* register the clock */ - clk =ti_clk_register (NULL , &div->hw, name); + clk =of_ti_clk_register (node, &div->hw, name);if (IS_ERR (clk))kfree (div);
drivers/clk/ti/dpll.c +2 -2
@@ -195,7 +195,7 @@ static void __init _register_dpll(void *user,/* register the clock */ name =ti_dt_clk_name (node); - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);
@@ -267,7 +267,7 @@ static void _register_dpll_x2(struct device_node *node,#endif /* register the clock */ - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
drivers/clk/ti/fixed-factor.c +1 -1
@@ -62,7 +62,7 @@ static void __init of_ti_fixed_factor_clk_setup(struct device_node *node)if (!IS_ERR (clk)) {of_clk_add_provider (node, of_clk_src_simple_get, clk);of_ti_clk_autoidle_setup (node); -ti_clk_add_alias (NULL , clk, clk_name); +ti_clk_add_alias (clk, clk_name); } } CLK_OF_DECLARE(ti_fixed_factor_clk, "ti,fixed-factor-clock",
drivers/clk/ti/gate.c +3 -3
@@ -93,7 +93,7 @@ static int omap36xx_gate_clk_enable_with_hsdiv_restore(struct clk_hw *hw)return ret; } -static struct clk *_register_gate(struct device *dev, const char *name, +static struct clk *_register_gate(struct device_node *node, const char *name, const char *parent_name, unsigned long flags, struct clk_omap_reg *reg, u8 bit_idx, u8 clk_gate_flags, const struct clk_ops *ops,
@@ -123,7 +123,7 @@ static struct clk *_register_gate(struct device *dev, const char *name, init.flags = flags; - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
@@ -166,7 +166,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node, clk_gate_flags |=INVERT_ENABLE ; name =ti_dt_clk_name (node); - clk =_register_gate (NULL , name, parent_name, flags, ®, + clk =_register_gate (node, name, parent_name, flags, ®, enable_bit, clk_gate_flags, ops, hw_ops);if (!IS_ERR (clk))
drivers/clk/ti/interface.c +4 -3
@@ -32,7 +32,8 @@ static const struct clk_ops ti_interface_clk_ops = { .is_enabled = &omap2_dflt_clk_is_enabled, }; -static struct clk *_register_interface (struct device *dev,const char *name, +static struct clk *_register_interface (struct device_node *node, +const char *name,const char *parent_name,struct clk_omap_reg *reg,u8 bit_idx,const struct clk_hw_omap_ops *ops)
@@ -57,7 +58,7 @@ static struct clk *_register_interface(struct device *dev, const char *name, init.num_parents =1 ; init.parent_names = &parent_name; - clk =ti_clk_register_omap_hw (NULL , &clk_hw->hw, name); + clk =of_ti_clk_register_omap_hw (node, &clk_hw->hw, name);if (IS_ERR (clk))kfree (clk_hw);
@@ -88,7 +89,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node, } name =ti_dt_clk_name (node); - clk =_register_interface (NULL , name, parent_name, ®, + clk =_register_interface (node, name, parent_name, ®, enable_bit, ops);if (!IS_ERR (clk))
drivers/clk/ti/mux.c +3 -3
@@ -126,7 +126,7 @@ const struct clk_ops ti_clk_mux_ops = { .restore_context = clk_mux_restore_context, }; -static struct clk *_register_mux(struct device *dev, const char *name, +static struct clk *_register_mux(struct device_node *node, const char *name, const char * const *parent_names, u8 num_parents, unsigned long flags, struct clk_omap_reg *reg, u8 shift, u32 mask,
@@ -156,7 +156,7 @@ static struct clk *_register_mux(struct device *dev, const char *name, mux->table = table; mux->hw.init = &init; - clk =ti_clk_register (dev, &mux->hw, name); + clk =of_ti_clk_register (node, &mux->hw, name);if (IS_ERR (clk))kfree (mux);
@@ -215,7 +215,7 @@ static void of_mux_clk_setup(struct device_node *node) mask = (1 <<fls (mask)) -1 ; name =ti_dt_clk_name (node); - clk =_register_mux (NULL , name, parent_names, num_parents, + clk =_register_mux (node, name, parent_names, num_parents, flags, ®, shift, mask, latch, clk_mux_flags,NULL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 69/244 clk: ti: fix double free in of_ti_divider_clk_setup()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 7af5b9eadd64c9e02a71f97c45bcdf3b64841f6b ]
The "div" pointer is freed in _register_divider() and again in of_ti_divider_clk_setup(). Delete the free in _register_divider()
--- drivers/clk/ti/divider.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/clk/ti/divider.c +1 -7
@@ -317,7 +317,6 @@ static struct clk *_register_divider(struct device_node *node,u32 flags, struct clk_omap_divider *div) { - struct clk *clk; struct clk_init_data init;const char *parent_name;const char *name;
@@ -334,12 +333,7 @@ static struct clk *_register_divider(struct device_node *node, div->hw.init = &init;/* register the clock */ - clk =of_ti_clk_register (node, &div->hw, name); - -if (IS_ERR (clk)) -kfree (div); - -return clk; +return of_ti_clk_register (node, &div->hw, name); } int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 70/244 clk: npcm7xx: Fix incorrect kfree
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Neuschäfer <[email protected]>
[ Upstream commit bbc5080bef4a245106aa8e8d424ba8847ca7c0ca ]
The corresponding allocation is:
Quoted 2 lines
npcm7xx_clk_data= kzalloc(struct_size(npcm7xx_clk_data, hws,NPCM7XX_NUM_CLOCKS), GFP_KERNEL);
... so, kfree should be applied to npcm7xx_clk_data, not npcm7xx_clk_data->hws.
--- drivers/clk/clk-npcm7xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/clk-npcm7xx.c +1 -1
@@ -539,7 +539,7 @@ static void __init npcm7xx_clk_init(struct device_node *clk_np)return ; npcm7xx_init_fail: -kfree (npcm7xx_clk_data->hws); +kfree (npcm7xx_clk_data); npcm7xx_init_np_err:iounmap (clk_base); npcm7xx_init_error:
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 71/244 clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit b82681042724924ae3ba0f2f2eeec217fa31e830 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6765.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt6765.c +6 -0
@@ -785,6 +785,8 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_APMIXED_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data);
@@ -820,6 +822,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (fixed_clks,ARRAY_SIZE (fixed_clks), clk_data);
@@ -860,6 +864,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev) } clk_data =mtk_alloc_clk_data (CLK_IFR_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, ifr_clks,ARRAY_SIZE (ifr_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 72/244 clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 1f57f78fbacf630430bf954e5a84caafdfea30c0 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6779.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/mediatek/clk-mt6779.c +4 -0
@@ -1216,6 +1216,8 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)struct device_node *node = pdev->dev.of_node; clk_data =mtk_alloc_clk_data (CLK_APMIXED_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_plls (node, plls,ARRAY_SIZE (plls), clk_data);
@@ -1236,6 +1238,8 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 73/244 clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 606f6366a35a3329545e38129804d65ef26ed7d2 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt6797.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt6797.c +6 -0
@@ -391,6 +391,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_factors (top_fixed_divs,ARRAY_SIZE (top_fixed_divs), clk_data);
@@ -563,6 +565,8 @@ static void mtk_infrasys_init_early(struct device_node *node)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return ;for (i =0 ; i <CLK_INFRA_NR ; i++) infra_clk_data->clks[i] =ERR_PTR (-EPROBE_DEFER );
@@ -587,6 +591,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return -ENOMEM ; }else {for (i =0 ; i <CLK_INFRA_NR ; i++) {if (infra_clk_data->clks[i] ==ERR_PTR (-EPROBE_DEFER ))
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 74/244 clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 0884393c63cc9a1772f7121a6645ba7bd76feeb9 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt7629-eth.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/mediatek/clk-mt7629-eth.c +4 -0
@@ -83,6 +83,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)int r; clk_data =mtk_alloc_clk_data (CLK_ETH_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, eth_clks,CLK_ETH_NR_CLK , clk_data);
@@ -105,6 +107,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)int r; clk_data =mtk_alloc_clk_data (CLK_SGMII_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, sgmii_clks[id++],CLK_SGMII_NR_CLK , clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 75/244 clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 2befa515c1bb6cdd33c262b909d93d1973a219aa ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt7629.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/mediatek/clk-mt7629.c +6 -0
@@ -580,6 +580,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
@@ -603,6 +605,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)struct clk_onecell_data *clk_data; clk_data =mtk_alloc_clk_data (CLK_INFRA_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, infra_clks,ARRAY_SIZE (infra_clks), clk_data);
@@ -626,6 +630,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_PERI_NR_CLK ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 76/244 clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiasheng Jiang <[email protected]>
[ Upstream commit 0d6e24b422a2166a9297a8286ff2e6ab9a5e8cd3 ]
Add the check for the return value of mtk_alloc_clk_data() in order to avoid NULL pointer dereference.
--- drivers/clk/mediatek/clk-mt2701.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clk/mediatek/clk-mt2701.c +8 -0
@@ -675,6 +675,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_TOP_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_fixed_clks (top_fixed_clks,ARRAY_SIZE (top_fixed_clks), clk_data);
@@ -742,6 +744,8 @@ static void __init mtk_infrasys_init_early(struct device_node *node)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return ;for (i =0 ; i <CLK_INFRA_NR ; i++) infra_clk_data->clks[i] =ERR_PTR (-EPROBE_DEFER );
@@ -768,6 +772,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)if (!infra_clk_data) { infra_clk_data =mtk_alloc_clk_data (CLK_INFRA_NR ); +if (!infra_clk_data) +return -ENOMEM ; }else {for (i =0 ; i <CLK_INFRA_NR ; i++) {if (infra_clk_data->clks[i] ==ERR_PTR (-EPROBE_DEFER ))
@@ -896,6 +902,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)return PTR_ERR (base); clk_data =mtk_alloc_clk_data (CLK_PERI_NR ); +if (!clk_data) +return -ENOMEM ;mtk_clk_register_gates (node, peri_clks,ARRAY_SIZE (peri_clks), clk_data);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 77/244 clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varadarajan Narayanan <[email protected]>
[ Upstream commit 6a15647d0adc686226045e8046369f34d6ab03ed ]
The config IPQ_APSS_6018 should depend on QCOM_SMEM, to avoid the following error reported by 'kernel test robot'
loongarch64-linux-ld: drivers/clk/qcom/apss-ipq6018.o: in function `apss_ipq6018_probe': >> apss-ipq6018.c:(.text+0xd0): undefined reference to `qcom_smem_get_soc_id'
--- drivers/clk/qcom/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/Kconfig +1 -0
@@ -127,6 +127,7 @@ config IPQ_APSS_6018 tristate "IPQ APSS Clock Controller" select IPQ_APSS_PLL depends on QCOM_APCS_IPC || COMPILE_TEST + depends on QCOM_SMEM help Support for APSS clock controller on IPQ platforms. The APSS clock controller manages the Mux and enable block that feeds the
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 78/244 platform/x86: wmi: Fix probe failure when failing to register WMI devices
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit ed85891a276edaf7a867de0e9acd0837bc3008f2 ]
When a WMI device besides the first one somehow fails to register, retval is returned while still containing a negative error code. This causes the ACPI device fail to probe, leaving behind zombie WMI devices leading to various errors later.
Handle the single error path separately and return 0 unconditionally after trying to register all WMI devices to solve the issue. Also continue to register WMI devices even if some fail to allocate memory.
--- drivers/platform/x86/wmi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/platform/x86/wmi.c +8 -8
@@ -1161,8 +1161,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)struct wmi_block *wblock, *next;union acpi_object *obj;acpi_status status; -int retval =0 ;u32 i, total; +int retval; status =acpi_evaluate_object (device->handle,"_WDG" ,NULL , &out);if (ACPI_FAILURE (status))
@@ -1173,8 +1173,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)return -ENXIO ;if (obj->type !=ACPI_TYPE_BUFFER ) { - retval = -ENXIO ; - goto out_free_pointer; +kfree (obj); +return -ENXIO ; } gblock = (const struct guid_block *)obj->buffer.pointer;
@@ -1195,8 +1195,8 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) wblock =kzalloc (sizeof (struct wmi_block ),GFP_KERNEL );if (!wblock) { - retval = -ENOMEM ; -break ; +dev_err (wmi_bus_dev,"Failed to allocate %pUL\n" , &gblock[i].guid); +continue ; } wblock->acpi_device = device;
@@ -1235,9 +1235,9 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device) } } -out_free_pointer: -kfree (out.pointer); -return retval; +kfree (obj); + +return 0 ; }/*
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 79/244 platform/x86: wmi: remove unnecessary initializations
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Pőcze <[email protected]>
[ Upstream commit 43aacf838ef7384d985ef5385ecb0124f8c70007 ]
Some pointers are initialized when they are defined, but they are almost immediately reassigned in the following lines. Remove these superfluous assignments.
Stable-dep-of: eba9ac7abab9 ("platform/x86: wmi: Fix opening of char device")
--- drivers/platform/x86/wmi.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/platform/x86/wmi.c +9 -9
@@ -188,7 +188,7 @@ static int get_subobj_info(acpi_handle handle, const char *pathname,static acpi_status wmi_method_enable (struct wmi_block *wblock,int enable) { -struct guid_block *block =NULL ; +struct guid_block *block;char method[5 ];acpi_status status;acpi_handle handle;
@@ -262,8 +262,8 @@ EXPORT_SYMBOL_GPL(wmi_evaluate_method);acpi_status wmidev_evaluate_method (struct wmi_device *wdev,u8 instance,u32 method_id,const struct acpi_buffer *in,struct acpi_buffer *out) { -struct guid_block *block =NULL ; -struct wmi_block *wblock =NULL ; +struct guid_block *block; +struct wmi_block *wblock;acpi_handle handle;acpi_status status;struct acpi_object_list input;
@@ -310,7 +310,7 @@ EXPORT_SYMBOL_GPL(wmidev_evaluate_method);static acpi_status __query_block (struct wmi_block *wblock,u8 instance,struct acpi_buffer *out) { -struct guid_block *block =NULL ; +struct guid_block *block;acpi_handle handle;acpi_status status, wc_status =AE_ERROR ;struct acpi_object_list input;
@@ -423,8 +423,8 @@ EXPORT_SYMBOL_GPL(wmidev_block_query);acpi_status wmi_set_block (const char *guid_string,u8 instance,const struct acpi_buffer *in) { -struct guid_block *block =NULL ;struct wmi_block *wblock =NULL ; +struct guid_block *block;acpi_handle handle;struct acpi_object_list input;union acpi_object params[2 ];
@@ -828,8 +828,8 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver)static int wmi_char_open (struct inode *inode,struct file *filp) {const char *driver_name = filp->f_path.dentry->d_iname; -struct wmi_block *wblock =NULL ; -struct wmi_block *next =NULL ; +struct wmi_block *wblock; +struct wmi_block *next;list_for_each_entry_safe (wblock, next, &wmi_block_list, list) {if (!wblock->dev.dev.driver)
@@ -861,8 +861,8 @@ static long wmi_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)struct wmi_ioctl_buffer __user *input = (struct wmi_ioctl_buffer __user *) arg;struct wmi_block *wblock = filp->private_data; -struct wmi_ioctl_buffer *buf =NULL ; -struct wmi_driver *wdriver =NULL ; +struct wmi_ioctl_buffer *buf; +struct wmi_driver *wdriver;int ret;if (_IOC_TYPE (cmd) !=WMI_IOC )
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 80/244 platform/x86: wmi: Fix opening of char device
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit eba9ac7abab91c8f6d351460239108bef5e7a0b6 ]
Since commit fa1f68db6ca7 ("drivers: misc: pass miscdevice pointer via file private data"), the miscdevice stores a pointer to itself inside filp->private_data, which means that private_data will not be NULL when wmi_char_open() is called. This might cause memory corruption should wmi_char_open() be unable to find its driver, something which can happen when the associated WMI device is deleted in wmi_free_devices().
Fix the problem by using the miscdevice pointer to retrieve the WMI device data associated with a char device using container_of(). This also avoids wmi_char_open() picking a wrong WMI device bound to a driver with the same name as the original driver.
--- drivers/platform/x86/wmi.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-)
drivers/platform/x86/wmi.c +6 -14
@@ -827,21 +827,13 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver) }static int wmi_char_open (struct inode *inode,struct file *filp) { -const char *driver_name = filp->f_path.dentry->d_iname; -struct wmi_block *wblock; -struct wmi_block *next; - -list_for_each_entry_safe (wblock, next, &wmi_block_list, list) { -if (!wblock->dev.dev.driver) -continue ; -if (strcmp (driver_name, wblock->dev.dev.driver->name) ==0 ) { - filp->private_data = wblock; -break ; - } - } +/* +* The miscdevice already stores a pointer to itself +* inside filp->private_data +*/ + struct wmi_block *wblock = container_of(filp->private_data, struct wmi_block, char_dev); -if (!filp->private_data) -return -ENODEV ; + filp->private_data = wblock;return nonseekable_open (inode, filp); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 81/244 hwmon: (axi-fan-control) Fix possible NULL pointer dereference
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dragos Bogdan <[email protected]>
[ Upstream commit 2a5b3370a1d9750eca325292e291c8c7cb8cf2e0 ]
axi_fan_control_irq_handler(), dependent on the private axi_fan_control_data structure, might be called before the hwmon device is registered. That will cause an "Unable to handle kernel NULL pointer dereference" error.
--- drivers/hwmon/axi-fan-control.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
drivers/hwmon/axi-fan-control.c +16 -13
@@ -508,6 +508,21 @@ static int axi_fan_control_probe(struct platform_device *pdev)return -ENODEV ; } + ret =axi_fan_control_init (ctl, pdev->dev.of_node); +if (ret) { +dev_err (&pdev->dev,"Failed to initialize device\n" ); +return ret; + } + + ctl->hdev =devm_hwmon_device_register_with_info (&pdev->dev, + name, + ctl, + &axi_chip_info, + axi_fan_control_groups); + +if (IS_ERR (ctl->hdev)) +return PTR_ERR (ctl->hdev); + ctl->irq =platform_get_irq (pdev,0 );if (ctl->irq <0 )return ctl->irq;
@@ -521,19 +536,7 @@ static int axi_fan_control_probe(struct platform_device *pdev)return ret; } - ret =axi_fan_control_init (ctl, pdev->dev.of_node); -if (ret) { -dev_err (&pdev->dev,"Failed to initialize device\n" ); -return ret; - } - - ctl->hdev =devm_hwmon_device_register_with_info (&pdev->dev, - name, - ctl, - &axi_chip_info, - axi_fan_control_groups); - -return PTR_ERR_OR_ZERO (ctl->hdev); +return 0 ; }static struct platform_driver axi_fan_control_driver = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 82/244 hwmon: (coretemp) Fix potentially truncated sysfs attribute name
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Rui <[email protected]>
[ Upstream commit bbfff736d30e5283ad09e748caff979d75ddef7f ]
When build with W=1 and "-Werror=format-truncation", below error is observed in coretemp driver,
drivers/hwmon/coretemp.c: In function 'create_core_data':
Quoted 1 line
Quoted 1 line
drivers/hwmon/coretemp.c:393:34: error: '%s' directive output may be truncated writing likely 5 or more bytes into a region of size between 3 and 13 [-Werror=format-truncation=]
393 | "temp%d_%s", attr_no, suffixes[i]);
| ^~
drivers/hwmon/coretemp.c:393:26: note: assuming directive output of 5 bytes
393 | "temp%d_%s", attr_no, suffixes[i]);
| ^~~~~~~~~~~
drivers/hwmon/coretemp.c:392:17: note: 'snprintf' output 7 or more bytes (assuming 22) into a destination of size 19
392 | snprintf(tdata->attr_name[i], CORETEMP_NAME_LENGTH,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
393 | "temp%d_%s", attr_no, suffixes[i]);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cc1: all warnings being treated as errors
Given that
1. '%d' could take 10 charactors,
2. '%s' could take 10 charactors ("crit_alarm"),
3. "temp", "_" and the NULL terminator take 6 charactors, fix the problem by increasing CORETEMP_NAME_LENGTH to 28.
--- drivers/hwmon/coretemp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/coretemp.c +1 -1
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");#define PKG_SYSFS_ATTR_NO 1/* Sysfs attribute for package temp */ #define BASE_SYSFS_ATTR_NO 2/* Sysfs Base attr no for coretemp */ #define NUM_REAL_CORES 128/* Number of Real cores per cpu */ -#define CORETEMP_NAME_LENGTH 19/* String Length of attrs */ +#define CORETEMP_NAME_LENGTH 28/* String Length of attrs */ #define MAX_CORE_ATTRS 4/* Maximum no of basic attrs */ #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)#define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 83/244 drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 13fc28804bf10ca0b7bce3efbba95c534836d7ca ]
struct rockchip_crtc_state members such as output_type, output_bpc and enable_afbc is always reset to zero in the atomic_duplicate_state crtc funcs.
Fix this by using kmemdup on the subclass rockchip_crtc_state struct.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop.c +2 -1
@@ -1554,7 +1554,8 @@ static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc)if (WARN_ON (!crtc->state))return NULL ; - rockchip_state =kzalloc (sizeof (*rockchip_state),GFP_KERNEL ); + rockchip_state =kmemdup (to_rockchip_crtc_state (crtc->state), +sizeof (*rockchip_state),GFP_KERNEL );if (!rockchip_state)return NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 84/244 drm/rockchip: vop: Fix call to crtc reset helper
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 5aacd290837828c089a83ac9795c74c4c9e2c923 ]
Allocation of crtc_state may fail in vop_crtc_reset, causing an invalid pointer to be passed to __drm_atomic_helper_crtc_reset.
Fix this by adding a NULL check of crtc_state, similar to other drivers.
--- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/rockchip/rockchip_drm_vop.c +4 -1
@@ -1580,7 +1580,10 @@ static void vop_crtc_reset(struct drm_crtc *crtc)if (crtc->state)vop_crtc_destroy_state (crtc, crtc->state); -__drm_atomic_helper_crtc_reset (crtc, &crtc_state->base); +if (crtc_state) +__drm_atomic_helper_crtc_reset (crtc, &crtc_state->base); +else +__drm_atomic_helper_crtc_reset (crtc,NULL ); }#ifdef CONFIG_DRM_ANALOGIX_DP
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 85/244 drm/radeon: possible buffer overflow
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Meskhidze <[email protected]>
[ Upstream commit dd05484f99d16715a88eedfca363828ef9a4c2d4 ]
Buffer 'afmt_status' of size 6 could overflow, since index 'afmt_idx' is checked after access.
--- drivers/gpu/drm/radeon/evergreen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/drm/radeon/evergreen.c +4 -3
@@ -4820,14 +4820,15 @@ int evergreen_irq_process(struct radeon_device *rdev)break ;case 44 :/* hdmi */ afmt_idx = src_data; -if (!(afmt_status[afmt_idx] &AFMT_AZ_FORMAT_WTRIG )) -DRM_DEBUG ("IH: IH event w/o asserted irq bit?\n" ); -if (afmt_idx >5 ) {DRM_ERROR ("Unhandled interrupt: %d %d\n" , src_id, src_data);break ; } + +if (!(afmt_status[afmt_idx] &AFMT_AZ_FORMAT_WTRIG )) +DRM_DEBUG ("IH: IH event w/o asserted irq bit?\n" ); + afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG ; queue_hdmi = true;DRM_DEBUG ("IH: HDMI%d\n" , afmt_idx +1 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 86/244 drm/mipi-dsi: Create devm device registration
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit a1419fb4a73e47f0eab2985dff594ed52397471b ]
Devices that take their data through the MIPI-DSI bus but are controlled through a secondary bus like I2C have to register a secondary device on the MIPI-DSI bus through the mipi_dsi_device_register_full() function.
At removal or when an error occurs, that device needs to be removed through a call to mipi_dsi_device_unregister().
Let's create a device-managed variant of the registration function that will automatically unregister the device at unbind.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/drm_mipi_dsi.c | 46 ++++++++++++++++++++++++++++++++++ include/drm/drm_mipi_dsi.h | 3 +++ 2 files changed, 49 insertions(+)
drivers/gpu/drm/drm_mipi_dsi.c +46 -0
@@ -246,6 +246,52 @@ void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi) }EXPORT_SYMBOL (mipi_dsi_device_unregister); +static void devm_mipi_dsi_device_unregister (void *arg) +{ +struct mipi_dsi_device *dsi = arg; + +mipi_dsi_device_unregister (dsi); +} + +/** +* devm_mipi_dsi_device_register_full - create a managed MIPI DSI device +* @dev: device to tie the MIPI-DSI device lifetime to +* @host: DSI host to which this device is connected +* @info: pointer to template containing DSI device information +* +* Create a MIPI DSI device by using the device information provided by +* mipi_dsi_device_info template +* +* This is the managed version of mipi_dsi_device_register_full() which +* automatically calls mipi_dsi_device_unregister() when @dev is +* unbound. +* +* Returns: +* A pointer to the newly created MIPI DSI device, or, a pointer encoded +* with an error +*/ +struct mipi_dsi_device * +devm_mipi_dsi_device_register_full (struct device *dev, +struct mipi_dsi_host *host, +const struct mipi_dsi_device_info *info) +{ +struct mipi_dsi_device *dsi; +int ret; + + dsi =mipi_dsi_device_register_full (host, info); +if (IS_ERR (dsi)) +return dsi; + + ret =devm_add_action_or_reset (dev, + devm_mipi_dsi_device_unregister, + dsi); +if (ret) +return ERR_PTR (ret); + +return dsi; +} +EXPORT_SYMBOL_GPL (devm_mipi_dsi_device_register_full); +static DEFINE_MUTEX (host_lock);static LIST_HEAD (host_list);
include/drm/drm_mipi_dsi.h +3 -0
@@ -227,6 +227,9 @@ struct mipi_dsi_device * mipi_dsi_device_register_full(struct mipi_dsi_host *host, const struct mipi_dsi_device_info *info);void mipi_dsi_device_unregister (struct mipi_dsi_device *dsi); +struct mipi_dsi_device * +devm_mipi_dsi_device_register_full (struct device *dev,struct mipi_dsi_host *host, +const struct mipi_dsi_device_info *info);struct mipi_dsi_device *of_find_mipi_dsi_device_by_node (struct device_node *np);int mipi_dsi_attach (struct mipi_dsi_device *dsi);int mipi_dsi_detach (struct mipi_dsi_device *dsi);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 87/244 drm/mipi-dsi: Create devm device attachment
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit db6568498b35a4d5d5a99420df27ed25fae31406 ]
MIPI-DSI devices need to call mipi_dsi_attach() when their probe is done to attach against their host.
However, at removal or when an error occurs, that attachment needs to be undone through a call to mipi_dsi_detach().
Let's create a device-managed variant of the attachment function that will automatically detach the device at unbind.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/drm_mipi_dsi.c | 35 ++++++++++++++++++++++++++++++++++ include/drm/drm_mipi_dsi.h | 1 + 2 files changed, 36 insertions(+)
drivers/gpu/drm/drm_mipi_dsi.c +35 -0
@@ -392,6 +392,41 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi) }EXPORT_SYMBOL (mipi_dsi_detach); +static void devm_mipi_dsi_detach (void *arg) +{ +struct mipi_dsi_device *dsi = arg; + +mipi_dsi_detach (dsi); +} + +/** +* devm_mipi_dsi_attach - Attach a MIPI-DSI device to its DSI Host +* @dev: device to tie the MIPI-DSI device attachment lifetime to +* @dsi: DSI peripheral +* +* This is the managed version of mipi_dsi_attach() which automatically +* calls mipi_dsi_detach() when @dev is unbound. +* +* Returns: +* 0 on success, a negative error code on failure. +*/ +int devm_mipi_dsi_attach (struct device *dev, +struct mipi_dsi_device *dsi) +{ +int ret; + + ret =mipi_dsi_attach (dsi); +if (ret) +return ret; + + ret =devm_add_action_or_reset (dev, devm_mipi_dsi_detach, dsi); +if (ret) +return ret; + +return 0 ; +} +EXPORT_SYMBOL_GPL (devm_mipi_dsi_attach); +static ssize_t mipi_dsi_device_transfer (struct mipi_dsi_device *dsi,struct mipi_dsi_msg *msg) {
include/drm/drm_mipi_dsi.h +1 -0
@@ -233,6 +233,7 @@ devm_mipi_dsi_device_register_full(struct device *dev, struct mipi_dsi_host *hosstruct mipi_dsi_device *of_find_mipi_dsi_device_by_node (struct device_node *np);int mipi_dsi_attach (struct mipi_dsi_device *dsi);int mipi_dsi_detach (struct mipi_dsi_device *dsi); +int devm_mipi_dsi_attach (struct device *dev,struct mipi_dsi_device *dsi);int mipi_dsi_shutdown_peripheral (struct mipi_dsi_device *dsi);int mipi_dsi_turn_on_peripheral (struct mipi_dsi_device *dsi); int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 88/244 drm/bridge: lt8912b: Switch to devm MIPI-DSI helpers
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit 1fdbf66e3d40257902b4c5cdf872730dae24004f ]
Let's switch to the new devm MIPI-DSI function to register and attach our secondary device.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +4 -16
@@ -481,11 +481,11 @@ static int lt8912_attach_dsi(struct lt8912 *lt)return -EPROBE_DEFER ; } - dsi =mipi_dsi_device_register_full (host, &info); + dsi =devm_mipi_dsi_device_register_full (dev, host, &info);if (IS_ERR (dsi)) { ret =PTR_ERR (dsi);dev_err (dev,"failed to create dsi device (%d)\n" , ret); - goto err_dsi_device; +return ret; } lt->dsi = dsi;
@@ -497,24 +497,13 @@ static int lt8912_attach_dsi(struct lt8912 *lt)MIPI_DSI_MODE_LPM |MIPI_DSI_MODE_NO_EOT_PACKET ; - ret =mipi_dsi_attach (dsi); + ret =devm_mipi_dsi_attach (dev, dsi);if (ret <0 ) {dev_err (dev,"failed to attach dsi to host\n" ); - goto err_dsi_attach; +return ret; }return 0 ; - -err_dsi_attach: -mipi_dsi_device_unregister (dsi); -err_dsi_device: -return ret; -} - -static void lt8912_detach_dsi (struct lt8912 *lt) -{ -mipi_dsi_detach (lt->dsi); -mipi_dsi_device_unregister (lt->dsi); }static int lt8912_bridge_connector_init (struct drm_bridge *bridge)
@@ -581,7 +570,6 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)struct lt8912 *lt =bridge_to_lt8912 (bridge);if (lt->is_attached) { -lt8912_detach_dsi (lt);lt8912_hard_power_off (lt);drm_connector_unregister (<->connector);drm_connector_cleanup (<->connector);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 89/244 drm/bridge: lt8912b: Register and attach our DSI device at probe
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit d89078c37b10f05fa4f4791b71db2572db361b68 ]
In order to avoid any probe ordering issue, the best practice is to move the secondary MIPI-DSI device registration and attachment to the MIPI-DSI host at probe time. Let's do this.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +7 -4
@@ -552,10 +552,6 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,if (ret) goto error; - ret =lt8912_attach_dsi (lt); -if (ret) - goto error; - lt->is_attached = true;return 0 ;
@@ -714,8 +710,15 @@ static int lt8912_probe(struct i2c_client *client,drm_bridge_add (<->bridge); + ret =lt8912_attach_dsi (lt); +if (ret) + goto err_attach; +return 0 ; +err_attach: +drm_bridge_remove (<->bridge); +lt8912_free_i2c (lt); err_i2c:lt8912_put_dt (lt); err_dt_parse:
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 90/244 drm/bridge: lt8912b: Add hot plug detection
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Eichenberger <[email protected]>
[ Upstream commit 3b0a01a6a5224ed9b3f69f44edaa889b2e2b9779 ]
Enable hot plug detection when it is available on the HDMI port. Without this connecting to a different monitor with incompatible timing before the 10 seconds poll period will lead to a broken display output.
Stable-dep-of: 941882a0e96d ("drm/bridge: lt8912b: Fix bridge_detach")
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +19 -2
@@ -506,14 +506,27 @@ static int lt8912_attach_dsi(struct lt8912 *lt)return 0 ; } +static void lt8912_bridge_hpd_cb (void *data,enum drm_connector_status status) +{ +struct lt8912 *lt = data; + +if (lt->bridge.dev) +drm_helper_hpd_irq_event (lt->bridge.dev); +} +static int lt8912_bridge_connector_init (struct drm_bridge *bridge) {int ret;struct lt8912 *lt =bridge_to_lt8912 (bridge);struct drm_connector *connector = <->connector; - connector->polled =DRM_CONNECTOR_POLL_CONNECT | -DRM_CONNECTOR_POLL_DISCONNECT ; +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) { +drm_bridge_hpd_enable (lt->hdmi_port, lt8912_bridge_hpd_cb, lt); + connector->polled =DRM_CONNECTOR_POLL_HPD ; + }else { + connector->polled =DRM_CONNECTOR_POLL_CONNECT | +DRM_CONNECTOR_POLL_DISCONNECT ; + } ret = drm_connector_init(bridge->dev, connector, <8912_connector_funcs,
@@ -567,6 +580,10 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)if (lt->is_attached) {lt8912_hard_power_off (lt); + +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +drm_bridge_hpd_disable (lt->hdmi_port); +drm_connector_unregister (<->connector);drm_connector_cleanup (<->connector); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 91/244 drm/bridge: lt8912b: Fix bridge_detach
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 941882a0e96d245f38116e940912b404b6a93c6f ]
The driver calls lt8912_bridge_detach() from its lt8912_remove() function. As the DRM core detaches bridges automatically, this leads to calling lt8912_bridge_detach() twice. The code probably has tried to manage the double-call with the 'is_attached' variable, but the driver never sets the variable to false, so its of no help.
Fix the issue by dropping the call to lt8912_bridge_detach() from lt8912_remove(), as the DRM core will handle the detach call for us, and also drop the useless is_attached field.
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +5 -11
@@ -43,7 +43,6 @@ struct lt8912 {u8 data_lanes;bool is_power_on; -bool is_attached; };static int lt8912_write_init_config (struct lt8912 *lt)
@@ -565,8 +564,6 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,if (ret) goto error; - lt->is_attached = true; -return 0 ; error:
@@ -578,15 +575,13 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge) {struct lt8912 *lt =bridge_to_lt8912 (bridge); -if (lt->is_attached) { -lt8912_hard_power_off (lt); +lt8912_hard_power_off (lt); -if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) -drm_bridge_hpd_disable (lt->hdmi_port); +if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +drm_bridge_hpd_disable (lt->hdmi_port); -drm_connector_unregister (<->connector); -drm_connector_cleanup (<->connector); - } +drm_connector_unregister (<->connector); +drm_connector_cleanup (<->connector); } static enum drm_connector_status
@@ -746,7 +741,6 @@ static int lt8912_remove(struct i2c_client *client) {struct lt8912 *lt =i2c_get_clientdata (client); -lt8912_bridge_detach (<->bridge);drm_bridge_remove (<->bridge);lt8912_free_i2c (lt);lt8912_put_dt (lt);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 92/244 drm/bridge: lt8912b: Fix crash on bridge detach
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 44283993144a03af9df31934d6c32bbd42d1a347 ]
The lt8912b driver, in its bridge detach function, calls drm_connector_unregister() and drm_connector_cleanup().
drm_connector_unregister() should be called only for connectors explicitly registered with drm_connector_register(), which is not the case in lt8912b.
The driver's drm_connector_funcs.destroy hook is set to drm_connector_cleanup().
Thus the driver should not call either drm_connector_unregister() nor drm_connector_cleanup() in its lt8912_bridge_detach(), as they cause a crash on bridge detach:
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
Mem abort info:
ESR = 0x0000000096000006
EC = 0x25: DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
FSC = 0x06: level 2 translation fault
Data abort info:
ISV = 0, ISS = 0x00000006, ISS2 = 0x00000000
CM = 0, WnR = 0, TnD = 0, TagAccess = 0
GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
user pgtable: 4k pages, 48-bit VAs, pgdp=00000000858f3000
[0000000000000000] pgd=0800000085918003, p4d=0800000085918003, pud=0800000085431003, pmd=0000000000000000
Internal error: Oops: 0000000096000006 [#1] PREEMPT SMP Modules linked in: tidss(-) display_connector lontium_lt8912b tc358768 panel_lvds panel_simple drm_dma_helper drm_kms_helper drm drm_panel_orientation_quirks CPU: 3 PID: 462 Comm: rmmod Tainted: G W 6.5.0-rc2+ #2 Hardware name: Toradex Verdin AM62 on Verdin Development Board (DT) pstate: 80000005 (Nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : drm_connector_cleanup+0x78/0x2d4 [drm] lr : lt8912_bridge_detach+0x54/0x6c [lontium_lt8912b]
sp : ffff800082ed3a90
x29: ffff800082ed3a90 x28: ffff0000040c1940 x27: 0000000000000000
x26: 0000000000000000 x25: dead000000000122 x24: dead000000000122
x23: dead000000000100 x22: ffff000003fb6388 x21: 0000000000000000
x20: 0000000000000000 x19: ffff000003fb6260 x18: fffffffffffe56e8
x17: 0000000000000000 x16: 0010000000000000 x15: 0000000000000038
x14: 0000000000000000 x13: ffff800081914b48 x12: 000000000000040e
x11: 000000000000015a x10: ffff80008196ebb8 x9 : ffff800081914b48 x8 : 00000000ffffefff x7 : ffff0000040c1940 x6 : ffff80007aa649d0 x5 : 0000000000000000 x4 : 0000000000000001 x3 : ffff80008159e008 x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000
Call trace: drm_connector_cleanup+0x78/0x2d4 [drm] lt8912_bridge_detach+0x54/0x6c [lontium_lt8912b] drm_bridge_detach+0x44/0x84 [drm] drm_encoder_cleanup+0x40/0xb8 [drm] drmm_encoder_alloc_release+0x1c/0x30 [drm] drm_managed_release+0xac/0x148 [drm] drm_dev_put.part.0+0x88/0xb8 [drm] devm_drm_dev_init_release+0x14/0x24 [drm] devm_action_release+0x14/0x20 release_nodes+0x5c/0x90 devres_release_all+0x8c/0xe0 device_unbind_cleanup+0x18/0x68 device_release_driver_internal+0x208/0x23c driver_detach+0x4c/0x94 bus_remove_driver+0x70/0xf4 driver_unregister+0x30/0x60 platform_driver_unregister+0x14/0x20 tidss_platform_driver_exit+0x18/0xb2c [tidss] __arm64_sys_delete_module+0x1a0/0x2b4 invoke_syscall+0x48/0x110 el0_svc_common.constprop.0+0x60/0x10c do_el0_svc_compat+0x1c/0x40 el0_svc_compat+0x40/0xac el0t_32_sync_handler+0xb0/0x138 el0t_32_sync+0x194/0x198 Code: 9104a276 f2fbd5b7 aa0203e1 91008af8 (f85c0420)
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 3 --- 1 file changed, 3 deletions(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +0 -3
@@ -579,9 +579,6 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD )drm_bridge_hpd_disable (lt->hdmi_port); - -drm_connector_unregister (<->connector); -drm_connector_cleanup (<->connector); } static enum drm_connector_status
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 93/244 drm/bridge: lt8912b: Manually disable HPD only if it was enabled
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 6985c5efc4057bc79137807295d84ada3123d051 ]
lt8912b only calls drm_bridge_hpd_enable() if it creates a connector and the next bridge has DRM_BRIDGE_OP_HPD set. However, when calling drm_bridge_hpd_disable() it misses checking if a connector was created, calling drm_bridge_hpd_disable() even if HPD was never enabled. I don't see any issues caused by this wrong call, though.
Add the check to avoid wrongly calling drm_bridge_hpd_disable().
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/lontium-lt8912b.c +1 -1
@@ -577,7 +577,7 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)lt8912_hard_power_off (lt); -if (lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD ) +if (lt->connector.dev && lt->hdmi_port->ops &DRM_BRIDGE_OP_HPD )drm_bridge_hpd_disable (lt->hdmi_port); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 94/244 drm/bridge: lt8912b: Add missing drm_bridge_attach call
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit f45acf7acf75921c0409d452f0165f51a19a74fd ]
The driver does not call drm_bridge_attach(), which causes the next bridge to not be added to the bridge chain. This causes the pipeline init to fail when DRM_BRIDGE_ATTACH_NO_CONNECTOR is used.
Add the call to drm_bridge_attach().
--- drivers/gpu/drm/bridge/lontium-lt8912b.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/bridge/lontium-lt8912b.c +7 -0
@@ -548,6 +548,13 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,struct lt8912 *lt =bridge_to_lt8912 (bridge);int ret; + ret =drm_bridge_attach (bridge->encoder, lt->hdmi_port, bridge, +DRM_BRIDGE_ATTACH_NO_CONNECTOR ); +if (ret <0 ) { +dev_err (lt->dev,"Failed to attach next bridge (%d)\n" , ret); +return ret; + } +if (!(flags &DRM_BRIDGE_ATTACH_NO_CONNECTOR )) { ret =lt8912_bridge_connector_init (bridge);if (ret) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 95/244 drm/bridge: tc358768: Fix use of uninitialized variable
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit a2d9036615f0adfa5b0a46bb2ce42ef1d9a04fbe ]
smatch reports:
drivers/gpu/drm/bridge/tc358768.c:223 tc358768_update_bits() error: uninitialized symbol 'orig'.
Fix this by bailing out from tc358768_update_bits() if the tc358768_read() produces an error.
--- drivers/gpu/drm/bridge/tc358768.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/bridge/tc358768.c +4 -0
@@ -217,6 +217,10 @@ static void tc358768_update_bits(struct tc358768_priv *priv, u32 reg, u32 mask,u32 tmp, orig;tc358768_read (priv, reg, &orig); + +if (priv->error) +return ; + tmp = orig & ~mask; tmp |= val & mask;if (tmp != orig)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 96/244 drm/bridge: tc358768: Disable non-continuous clock mode
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Osipenko <[email protected]>
[ Upstream commit fbc5a90e82c1131869e76ce5b082693b8a75c121 ]
Non-continuous clock mode doesn't work because driver doesn't support it properly. The bridge driver programs wrong bitfields that are required by the non-continuous mode (BTACNTRL1 register bitfields are swapped in the code), but fixing them doesn't help.
Display panel of ASUS Transformer TF700T tablet supports non-continuous mode and display doesn't work at all using that mode. There are no device-trees that are actively using this DSI bridge in upstream yet, so clearly the broken mode wasn't ever tested properly. It's a bit too difficult to get LP mode working, hence let's disable the offending mode for now and fall back to continuous mode.
Stable-dep-of: 66962d5c3c51 ("drm/bridge: tc358768: Fix bit updates")
--- drivers/gpu/drm/bridge/tc358768.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +8 -2
@@ -637,6 +637,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) {struct tc358768_priv *priv =bridge_to_tc358768 (bridge);struct mipi_dsi_device *dsi_dev = priv->output.dev; +unsigned long mode_flags = dsi_dev->mode_flags;u32 val, val2, lptxcnt, hact, data_type;s32 raw_val;const struct drm_display_mode *mode;
@@ -644,6 +645,11 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)u32 dsiclk, dsibclk;int ret, i; +if (mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) { +dev_warn_once (priv->dev,"Non-continuous mode unimplemented, falling back to continuous\n" ); + mode_flags &= ~MIPI_DSI_CLOCK_NON_CONTINUOUS ; + } +tc358768_hw_enable (priv); ret =tc358768_sw_reset (priv);
@@ -779,7 +785,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) val |=BIT (i +1 );tc358768_write (priv,TC358768_HSTXVREGEN , val); -if (!(dsi_dev->mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS )) +if (!(mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ))tc358768_write (priv,TC358768_TXOPTIONCNTRL ,0x1 );/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */
@@ -836,7 +842,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) val |=TC358768_DSI_CONTROL_TXMD ; -if (!(dsi_dev->mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS )) +if (!(mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS )) val |=TC358768_DSI_CONTROL_HSCKMD ;if (dsi_dev->mode_flags &MIPI_DSI_MODE_NO_EOT_PACKET )
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 97/244 drm/bridge: tc358768: Fix bit updates
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 66962d5c3c51377b9b90cae35b7e038950438e02 ]
The driver has a few places where it does:
if (thing_is_enabled_in_config)
update_thing_bit_in_hw()
This means that if the thing is _not_ enabled, the bit never gets cleared. This affects the h/vsyncs and continuous DSI clock bits.
Fix the driver to always update the bit.
--- drivers/gpu/drm/bridge/tc358768.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/gpu/drm/bridge/tc358768.c +7 -6
@@ -785,8 +785,8 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge) val |=BIT (i +1 );tc358768_write (priv,TC358768_HSTXVREGEN , val); -if (!(mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS )) -tc358768_write (priv,TC358768_TXOPTIONCNTRL ,0x1 ); +tc358768_write (priv,TC358768_TXOPTIONCNTRL , + (mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) ?0 :BIT (0 ));/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */ val =tc358768_to_ns ((lptxcnt +1 ) * dsibclk_nsk *4 );
@@ -822,11 +822,12 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)tc358768_write (priv,TC358768_DSI_HACT , hact);/* VSYNC polarity */ -if (!(mode->flags &DRM_MODE_FLAG_NVSYNC )) -tc358768_update_bits (priv,TC358768_CONFCTL ,BIT (5 ),BIT (5 )); +tc358768_update_bits (priv,TC358768_CONFCTL ,BIT (5 ), + (mode->flags &DRM_MODE_FLAG_PVSYNC ) ?BIT (5 ) :0 ); +/* HSYNC polarity */ -if (mode->flags &DRM_MODE_FLAG_PHSYNC ) -tc358768_update_bits (priv,TC358768_PP_MISC ,BIT (0 ),BIT (0 )); +tc358768_update_bits (priv,TC358768_PP_MISC ,BIT (0 ), + (mode->flags &DRM_MODE_FLAG_PHSYNC ) ?BIT (0 ) :0 );/* Start DSI Tx */ tc358768_write (priv,TC358768_DSI_START ,0x1 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 98/244 drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaogang Chen <[email protected]>
[ Upstream commit 7bfaa160caed8192f8262c4638f552cad94bcf5a ]
This patch fixes:
1: ref number of prange's svm_bo got decreased by an async call from hmm. When wait svm_bo of prange got released we shoul also wait prang->svm_bo become NULL, otherwise prange->svm_bo may be set to null after allocate new vram buffer.
2: During waiting svm_bo of prange got released in a while loop should reschedule current task to give other tasks oppotunity to run, specially the the workque task that handles svm_bo ref release, otherwise we may enter to softlock.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +4 -4
@@ -433,11 +433,11 @@ svm_range_validate_svm_bo(struct amdgpu_device *adev, struct svm_range *prange)/* We need a new svm_bo. Spin-loop to wait for concurrent * svm_range_bo_release to finish removing this range from -* its range list. After this, it is safe to reuse the -* svm_bo pointer and svm_bo_list head. +* its range list and set prange->svm_bo to null. After this, +* it is safe to reuse the svm_bo pointer and svm_bo_list head. */ -while (!list_empty_careful (&prange->svm_bo_list)) - ; +while (!list_empty_careful (&prange->svm_bo_list) || prange->svm_bo) +cond_resched ();return false; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 99/244 drm/mediatek: Fix iommu fault by swapping FBs after updating plane state
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason-JH.Lin <[email protected]>
[ Upstream commit 3ec71e05ae6e7f46512e568ed81c92be589003dd ]
According to the comment in drm_atomic_helper_async_commit(), we should make sure FBs have been swapped, so that cleanups in the new_state performs a cleanup in the old FB.
So we should move swapping FBs after calling mtk_plane_update_new_state(), to avoid using the old FB which could be freed.
--- drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/mediatek/mtk_drm_plane.c +1 -1
@@ -154,9 +154,9 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane, plane->state->src_y = new_state->src_y; plane->state->src_h = new_state->src_h; plane->state->src_w = new_state->src_w; -swap (plane->state->fb, new_state->fb);mtk_plane_update_new_state (new_state, new_plane_state); +swap (plane->state->fb, new_state->fb);wmb ();/* Make sure the above parameters are set before update */ new_plane_state->pending.async_dirty = true;mtk_drm_crtc_async_update (new_state->crtc, plane, state);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 100/244 drm/mediatek: Fix iommu fault during crtc enabling
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason-JH.Lin <[email protected]>
[ Upstream commit 53412dc2905401207f264dc30890f6b9e41524a6 ]
The difference between drm_atomic_helper_commit_tail() and drm_atomic_helper_commit_tail_rpm() is drm_atomic_helper_commit_tail() will commit plane first and then enable crtc, drm_atomic_helper_commit_tail_rpm() will enable crtc first and then commit plane.
Before mediatek-drm enables crtc, the power and clk required by OVL have not been turned on, so the commit plane cannot be committed before crtc is enabled. That means OVL layer should not be enabled before crtc is enabled.
Therefore, the atomic_commit_tail of mediatek-drm is hooked with drm_atomic_helper_commit_tail_rpm().
Another reason is that the plane_state of drm_atomic_state is not synchronized with the plane_state stored in mtk_crtc during crtc enablng, so just set all planes to disabled.
--- drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/mediatek/mtk_drm_crtc.c +3 -0
@@ -362,6 +362,9 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)unsigned int local_layer; plane_state =to_mtk_plane_state (plane->state); + +/* should not enable layer before crtc enabled */ + plane_state->pending.enable = false; comp =mtk_drm_ddp_comp_for_plane (crtc, plane, &local_layer);if (comp) mtk_ddp_comp_layer_config(comp, local_layer,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 101/244 drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 44b968d0d0868b7a9b7a5c64464ada464ff4d532 ]
cdn_dp_audio_codec_init() can fail. So add some error handling.
If component_add() fails, the previous cdn_dp_audio_codec_init() call should be undone, as already done in the remove function.
--- drivers/gpu/drm/rockchip/cdn-dp-core.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/gpu/drm/rockchip/cdn-dp-core.c +13 -2
@@ -1146,6 +1146,7 @@ static int cdn_dp_probe(struct platform_device *pdev)struct cdn_dp_device *dp;struct extcon_dev *extcon;struct phy *phy; +int ret;int i; dp =devm_kzalloc (dev,sizeof (*dp),GFP_KERNEL );
@@ -1186,9 +1187,19 @@ static int cdn_dp_probe(struct platform_device *pdev)mutex_init (&dp->lock);dev_set_drvdata (dev, dp); -cdn_dp_audio_codec_init (dp, dev); + ret =cdn_dp_audio_codec_init (dp, dev); +if (ret) +return ret; + + ret =component_add (dev, &cdn_dp_component_ops); +if (ret) + goto err_audio_deinit; -return component_add (dev, &cdn_dp_component_ops); +return 0 ; + +err_audio_deinit: +platform_device_unregister (dp->audio_pdev); +return ret; }static int cdn_dp_remove (struct platform_device *pdev)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 102/244 drm/bridge: lt9611uxc: Switch to devm MIPI-DSI helpers
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit 293ada7b058e536d9d53d0d8840c6ba8c2f718e4 ]
Let's switch to the new devm MIPI-DSI function to register and attach our secondary device.
Stable-dep-of: 15fe53be46ea ("drm/bridge: lt9611uxc: fix the race in the error path")
--- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 38 +++++----------------- 1 file changed, 8 insertions(+), 30 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611uxc.c +8 -30
@@ -258,17 +258,18 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,const struct mipi_dsi_device_info info = {"lt9611uxc" ,0 ,NULL };struct mipi_dsi_device *dsi;struct mipi_dsi_host *host; +struct device *dev = lt9611uxc->dev;int ret; host =of_find_mipi_dsi_host_by_node (dsi_node);if (!host) { -dev_err (lt9611uxc->dev,"failed to find dsi host\n" ); +dev_err (dev,"failed to find dsi host\n" );return ERR_PTR (-EPROBE_DEFER ); } - dsi =mipi_dsi_device_register_full (host, &info); + dsi =devm_mipi_dsi_device_register_full (dev, host, &info);if (IS_ERR (dsi)) { -dev_err (lt9611uxc->dev,"failed to create dsi device\n" ); +dev_err (dev,"failed to create dsi device\n" );return dsi; }
@@ -277,10 +278,9 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc, dsi->mode_flags =MIPI_DSI_MODE_VIDEO |MIPI_DSI_MODE_VIDEO_SYNC_PULSE |MIPI_DSI_MODE_VIDEO_HSE ; - ret =mipi_dsi_attach (dsi); + ret =devm_mipi_dsi_attach (dev, dsi);if (ret <0 ) { -dev_err (lt9611uxc->dev,"failed to attach dsi to host\n" ); -mipi_dsi_device_unregister (dsi); +dev_err (dev,"failed to attach dsi to host\n" );return ERR_PTR (ret); }
@@ -355,19 +355,6 @@ static int lt9611uxc_connector_init(struct drm_bridge *bridge, struct lt9611uxcreturn drm_connector_attach_encoder (<9611uxc->connector, bridge->encoder); } -static void lt9611uxc_bridge_detach (struct drm_bridge *bridge) -{ -struct lt9611uxc *lt9611uxc =bridge_to_lt9611uxc (bridge); - -if (lt9611uxc->dsi1) { -mipi_dsi_detach (lt9611uxc->dsi1); -mipi_dsi_device_unregister (lt9611uxc->dsi1); - } - -mipi_dsi_detach (lt9611uxc->dsi0); -mipi_dsi_device_unregister (lt9611uxc->dsi0); -} -static int lt9611uxc_bridge_attach (struct drm_bridge *bridge,enum drm_bridge_attach_flags flags) {
@@ -388,19 +375,11 @@ static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,/* Attach secondary DSI, if specified */ if (lt9611uxc->dsi1_node) { lt9611uxc->dsi1 =lt9611uxc_attach_dsi (lt9611uxc, lt9611uxc->dsi1_node); -if (IS_ERR (lt9611uxc->dsi1)) { - ret =PTR_ERR (lt9611uxc->dsi1); - goto err_unregister_dsi0; - } +if (IS_ERR (lt9611uxc->dsi1)) +return PTR_ERR (lt9611uxc->dsi1); }return 0 ; - -err_unregister_dsi0: -mipi_dsi_detach (lt9611uxc->dsi0); -mipi_dsi_device_unregister (lt9611uxc->dsi0); - -return ret; } static enum drm_mode_status
@@ -544,7 +523,6 @@ static struct edid *lt9611uxc_bridge_get_edid(struct drm_bridge *bridge,static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = { .attach = lt9611uxc_bridge_attach, - .detach = lt9611uxc_bridge_detach, .mode_valid = lt9611uxc_bridge_mode_valid, .mode_set = lt9611uxc_bridge_mode_set, .detect = lt9611uxc_bridge_detect,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 103/244 drm/bridge: lt9611uxc: Register and attach our DSI device at probe
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Ripard <[email protected]>
[ Upstream commit 4a46ace5ac621c0f84b3910bc3c93acf6c93963b ]
In order to avoid any probe ordering issue, the best practice is to move the secondary MIPI-DSI device registration and attachment to the MIPI-DSI host at probe time. Let's do this.
Stable-dep-of: 15fe53be46ea ("drm/bridge: lt9611uxc: fix the race in the error path")
--- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 31 +++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611uxc.c +19 -12
@@ -367,18 +367,6 @@ static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,return ret; } -/* Attach primary DSI */ - lt9611uxc->dsi0 =lt9611uxc_attach_dsi (lt9611uxc, lt9611uxc->dsi0_node); -if (IS_ERR (lt9611uxc->dsi0)) -return PTR_ERR (lt9611uxc->dsi0); - -/* Attach secondary DSI, if specified */ -if (lt9611uxc->dsi1_node) { - lt9611uxc->dsi1 =lt9611uxc_attach_dsi (lt9611uxc, lt9611uxc->dsi1_node); -if (IS_ERR (lt9611uxc->dsi1)) -return PTR_ERR (lt9611uxc->dsi1); - } -return 0 ; }
@@ -958,8 +946,27 @@ static int lt9611uxc_probe(struct i2c_client *client,drm_bridge_add (<9611uxc->bridge); +/* Attach primary DSI */ + lt9611uxc->dsi0 =lt9611uxc_attach_dsi (lt9611uxc, lt9611uxc->dsi0_node); +if (IS_ERR (lt9611uxc->dsi0)) { + ret =PTR_ERR (lt9611uxc->dsi0); + goto err_remove_bridge; + } + +/* Attach secondary DSI, if specified */ +if (lt9611uxc->dsi1_node) { + lt9611uxc->dsi1 =lt9611uxc_attach_dsi (lt9611uxc, lt9611uxc->dsi1_node); +if (IS_ERR (lt9611uxc->dsi1)) { + ret =PTR_ERR (lt9611uxc->dsi1); + goto err_remove_bridge; + } + } +return lt9611uxc_audio_init (dev, lt9611uxc); +err_remove_bridge: +drm_bridge_remove (<9611uxc->bridge); + err_disable_regulators:regulator_bulk_disable (ARRAY_SIZE (lt9611uxc->supplies), lt9611uxc->supplies);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 104/244 drm/bridge: lt9611uxc: fix the race in the error path
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 15fe53be46eaf4f6339cd433972ecc90513e3076 ]
If DSI host attachment fails, the LT9611UXC driver will remove the bridge without ensuring that there is no outstanding HPD work being done. In rare cases this can result in the warnings regarding the mutex being incorrect. Fix this by forcebly freing IRQ and flushing the work.
DEBUG_LOCKS_WARN_ON(lock->magic != lock)
WARNING: CPU: 0 PID: 10 at kernel/locking/mutex.c:582 __mutex_lock+0x468/0x77c Modules linked in: CPU: 0 PID: 10 Comm: kworker/0:1 Tainted: G U 6.6.0-rc5-next-20231011-gd81f81c2b682-dirty #1206 Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT) Workqueue: events lt9611uxc_hpd_work pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : __mutex_lock+0x468/0x77c lr : __mutex_lock+0x468/0x77c
sp : ffff8000800a3c70
x29: ffff8000800a3c70 x28: 0000000000000000 x27: ffffd595fe333000
x26: ffff7c2f0002c005 x25: ffffd595ff1b3000 x24: ffffd595fccda5a0
x23: 0000000000000000 x22: 0000000000000002 x21: ffff7c2f056d91c8
x20: 0000000000000000 x19: ffff7c2f056d91c8 x18: fffffffffffe8db0
x17: 000000040044ffff x16: 005000f2b5503510 x15: 0000000000000000
x14: 000000000006efb8 x13: 0000000000000000 x12: 0000000000000037
x11: 0000000000000001 x10: 0000000000001470 x9 : ffff8000800a3ae0 x8 : ffff7c2f0027f8d0 x7 : ffff7c2f0027e400 x6 : ffffd595fc702b54 x5 : 0000000000000000 x4 : ffff8000800a0000 x3 : 0000000000000000 x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff7c2f0027e400
Call trace: __mutex_lock+0x468/0x77c mutex_lock_nested+0x24/0x30 drm_bridge_hpd_notify+0x2c/0x5c lt9611uxc_hpd_work+0x6c/0x80 process_one_work+0x1ec/0x51c worker_thread+0x1ec/0x3e4 kthread+0x120/0x124 ret_from_fork+0x10/0x20 irq event stamp: 15799 hardirqs last enabled at (15799): [<ffffd595fc702ba4>] finish_task_switch.isra.0+0xa8/0x278 hardirqs last disabled at (15798): [<ffffd595fd5a1580>] __schedule+0x7b8/0xbd8 softirqs last enabled at (15794): [<ffffd595fc690698>] __do_softirq+0x498/0x4e0 softirqs last disabled at (15771): [<ffffd595fc69615c>] ____do_softirq+0x10/0x1c
--- drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/drm/bridge/lontium-lt9611uxc.c +6 -4
@@ -927,9 +927,9 @@ static int lt9611uxc_probe(struct i2c_client *client,init_waitqueue_head (<9611uxc->wq);INIT_WORK (<9611uxc->work, lt9611uxc_hpd_work); - ret =devm_request_threaded_irq (dev, client->irq,NULL , - lt9611uxc_irq_thread_handler, -IRQF_ONESHOT ,"lt9611uxc" , lt9611uxc); + ret =request_threaded_irq (client->irq,NULL , + lt9611uxc_irq_thread_handler, +IRQF_ONESHOT ,"lt9611uxc" , lt9611uxc);if (ret) {dev_err (dev,"failed to request irq\n" ); goto err_disable_regulators;
@@ -965,6 +965,8 @@ static int lt9611uxc_probe(struct i2c_client *client,return lt9611uxc_audio_init (dev, lt9611uxc); err_remove_bridge: +free_irq (client->irq, lt9611uxc); +cancel_work_sync (<9611uxc->work);drm_bridge_remove (<9611uxc->bridge); err_disable_regulators:
@@ -981,7 +983,7 @@ static int lt9611uxc_remove(struct i2c_client *client) {struct lt9611uxc *lt9611uxc =i2c_get_clientdata (client); -disable_irq (client->irq); +free_irq (client->irq, lt9611uxc);cancel_work_sync (<9611uxc->work);lt9611uxc_audio_exit (lt9611uxc);drm_bridge_remove (<9611uxc->bridge);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 105/244 arm64/arm: xen: enlighten: Fix KPTI checks
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 20f3b8eafe0ba5d3c69d5011a9b07739e9645132 ]
When KPTI is in use, we cannot register a runstate region as XEN requires that this is always a valid VA, which we cannot guarantee. Due to this, xen_starting_cpu() must avoid registering each CPU's runstate region, and xen_guest_init() must avoid setting up features that depend upon it.
We tried to ensure that in commit:
f88af7229f6f22ce (" xen/arm: do not setup the runstate info page if kpti is enabled")
... where we added checks for xen_kernel_unmapped_at_usr(), which wraps arm64_kernel_unmapped_at_el0() on arm64 and is always false on 32-bit arm.
Unfortunately, as xen_guest_init() is an early_initcall, this happens before secondary CPUs are booted and arm64 has finalized the ARM64_UNMAP_KERNEL_AT_EL0 cpucap which backs arm64_kernel_unmapped_at_el0(), and so this can subsequently be set as secondary CPUs are onlined. On a big.LITTLE system where the boot CPU does not require KPTI but some secondary CPUs do, this will result in xen_guest_init() intializing features that depend on the runstate region, and xen_starting_cpu() registering the runstate region on some CPUs before KPTI is subsequent enabled, resulting the the problems the aforementioned commit tried to avoid.
Handle this more robsutly by deferring the initialization of the runstate region until secondary CPUs have been initialized and the ARM64_UNMAP_KERNEL_AT_EL0 cpucap has been finalized. The per-cpu work is moved into a new hotplug starting function which is registered later when we're certain that KPTI will not be used.
--- arch/arm/xen/enlighten.c | 25 ++++++++++++++++--------- include/linux/cpuhotplug.h | 1 + 2 files changed, 17 insertions(+), 9 deletions(-)
arch/arm/xen/enlighten.c +16 -9
@@ -159,9 +159,6 @@ static int xen_starting_cpu(unsigned int cpu)BUG_ON (err);per_cpu (xen_vcpu, cpu) = vcpup; -if (!xen_kernel_unmapped_at_usr ()) -xen_setup_runstate_info (cpu); - after_register_vcpu_info:enable_percpu_irq (xen_events_irq,0 );return 0 ;
@@ -394,9 +391,6 @@ static int __init xen_guest_init(void)return -EINVAL ; } -if (!xen_kernel_unmapped_at_usr ()) -xen_time_setup_guest (); -if (xen_initial_domain ())pvclock_gtod_register_notifier (&xen_pvclock_gtod_notifier);
@@ -406,7 +400,13 @@ static int __init xen_guest_init(void) }early_initcall (xen_guest_init); -static int __init xen_pm_init (void ) +static int xen_starting_runstate_cpu (unsigned int cpu) +{ +xen_setup_runstate_info (cpu); +return 0 ; +} + +static int __init xen_late_init (void ) {if (!xen_domain ())return -ENODEV ;
@@ -419,9 +419,16 @@ static int __init xen_pm_init(void)do_settimeofday64 (&ts); } -return 0 ; +if (xen_kernel_unmapped_at_usr ()) +return 0 ; + +xen_time_setup_guest (); + +return cpuhp_setup_state (CPUHP_AP_ARM_XEN_RUNSTATE_STARTING , +"arm/xen_runstate:starting" , + xen_starting_runstate_cpu,NULL ); } -late_initcall (xen_pm_init); +late_initcall (xen_late_init);/* empty stubs */
include/linux/cpuhotplug.h +1 -0
@@ -188,6 +188,7 @@ enum cpuhp_state {/* Must be the last timer callback */ CPUHP_AP_DUMMY_TIMER_STARTING ,CPUHP_AP_ARM_XEN_STARTING , +CPUHP_AP_ARM_XEN_RUNSTATE_STARTING ,CPUHP_AP_ARM_CORESIGHT_STARTING ,CPUHP_AP_ARM_CORESIGHT_CTI_STARTING , CPUHP_AP_ARM64_ISNDEP_STARTING,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 106/244 drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 6471da5ee311d53ef46eebcb7725bc94266cc0cf ]
The "ret" variable is declared as ssize_t and it can hold negative error codes but the "rk_obj->base.size" variable is type size_t. This means that when we compare them, they are both type promoted to size_t and the negative error code becomes a high unsigned value and is treated as success. Add a cast to fix this.
--- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/rockchip/rockchip_drm_gem.c +1 -1
@@ -39,7 +39,7 @@ static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj) ret =iommu_map_sgtable (private->domain, rk_obj->dma_addr, rk_obj->sgt, prot); -if (ret < rk_obj->base.size) { +if (ret < (ssize_t )rk_obj->base.size) {DRM_ERROR ("failed to map buffer: size=%zd request_size=%zd\n" , ret, rk_obj->base.size); ret = -ENOMEM ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 107/244 xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Marczykowski-Górecki <[email protected]>
[ Upstream commit 2c269f42d0f382743ab230308b836ffe5ae9b2ae ]
Linux enables MSI-X before disabling INTx, but keeps MSI-X masked until the table is filled. Then it disables INTx just before clearing MASKALL bit. Currently this approach is rejected by xen-pciback. According to the PCIe spec, device cannot use INTx when MSI/MSI-X is enabled (in other words: enabling MSI/MSI-X implicitly disables INTx).
Change the logic to consider INTx disabled if MSI/MSI-X is enabled. This applies to three places:
- checking currently enabled interrupts type,
- transition to MSI/MSI-X - where INTx would be implicitly disabled,
- clearing INTx disable bit - which can be allowed even if MSI/MSI-X is enabled, as device should consider INTx disabled anyway in that case
--- drivers/xen/xen-pciback/conf_space.c | 19 +++++++++++------ .../xen/xen-pciback/conf_space_capability.c | 8 ++++++- drivers/xen/xen-pciback/conf_space_header.c | 21 +++---------------- 3 files changed, 23 insertions(+), 25 deletions(-)
drivers/xen/xen-pciback/conf_space.c +13 -6
@@ -288,12 +288,6 @@ int xen_pcibk_get_interrupt_type(struct pci_dev *dev)u16 val;int ret =0 ; - err =pci_read_config_word (dev,PCI_COMMAND , &val); -if (err) -return err; -if (!(val &PCI_COMMAND_INTX_DISABLE )) - ret |=INTERRUPT_TYPE_INTX ; -/* * Do not trust dev->msi(x)_enabled here, as enabling could be done * bypassing the pci_*msi* functions, by the qemu.
@@ -316,6 +310,19 @@ int xen_pcibk_get_interrupt_type(struct pci_dev *dev)if (val &PCI_MSIX_FLAGS_ENABLE ) ret |=INTERRUPT_TYPE_MSIX ; } + +/* +* PCIe spec says device cannot use INTx if MSI/MSI-X is enabled, +* so check for INTx only when both are disabled. +*/ +if (!ret) { + err =pci_read_config_word (dev,PCI_COMMAND , &val); +if (err) +return err; +if (!(val &PCI_COMMAND_INTX_DISABLE )) + ret |=INTERRUPT_TYPE_INTX ; + } +return ret ?:INTERRUPT_TYPE_NONE ; }
drivers/xen/xen-pciback/conf_space_capability.c +7 -1
@@ -236,10 +236,16 @@ static int msi_msix_flags_write(struct pci_dev *dev, int offset, u16 new_value,return PCIBIOS_SET_FAILED ;if (new_value & field_config->enable_bit) { -/* don't allow enabling together with other interrupt types */ +/* +* Don't allow enabling together with other interrupt type, but do +* allow enabling MSI(-X) while INTx is still active to please Linuxes +* MSI(-X) startup sequence. It is safe to do, as according to PCI +* spec, device with enabled MSI(-X) shouldn't use INTx. +*/ int int_type =xen_pcibk_get_interrupt_type (dev);if (int_type ==INTERRUPT_TYPE_NONE || + int_type ==INTERRUPT_TYPE_INTX || int_type == field_config->int_type) goto write;return PCIBIOS_SET_FAILED ;
drivers/xen/xen-pciback/conf_space_header.c +3 -18
@@ -104,24 +104,9 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)pci_clear_mwi (dev); } -if (dev_data && dev_data->allow_interrupt_control) { -if ((cmd->val ^ value) &PCI_COMMAND_INTX_DISABLE ) { -if (value &PCI_COMMAND_INTX_DISABLE ) { -pci_intx (dev,0 ); - }else { -/* Do not allow enabling INTx together with MSI or MSI-X. */ -switch (xen_pcibk_get_interrupt_type (dev)) { -case INTERRUPT_TYPE_NONE : -pci_intx (dev,1 ); -break ; -case INTERRUPT_TYPE_INTX : -break ; -default : -return PCIBIOS_SET_FAILED ; - } - } - } - } +if (dev_data && dev_data->allow_interrupt_control && + ((cmd->val ^ value) &PCI_COMMAND_INTX_DISABLE )) +pci_intx (dev, !(value &PCI_COMMAND_INTX_DISABLE )); cmd->val = value;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 108/244 drm/msm/dsi: use msm_gem_kernel_put to free TX buffer
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 69b321b2c3df4f7e51a9de587e41f324b0b717b0 ]
Use exiting function to free the allocated GEM object instead of open-coding it. This has a bonus of internally calling msm_gem_put_vaddr() to compensate for msm_gem_get_vaddr() in msm_get_kernel_new().
Patchwork: https://patchwork.freedesktop.org/patch/562239/
--- drivers/gpu/drm/msm/dsi/dsi_host.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/msm/dsi/dsi_host.c +1 -2
@@ -1154,8 +1154,7 @@ static void dsi_tx_buf_free(struct msm_dsi_host *msm_host) priv = dev->dev_private;if (msm_host->tx_gem_obj) { -msm_gem_unpin_iova (msm_host->tx_gem_obj, priv->kms->aspace); -drm_gem_object_put (msm_host->tx_gem_obj); +msm_gem_kernel_put (msm_host->tx_gem_obj, priv->kms->aspace); msm_host->tx_gem_obj =NULL ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 109/244 drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 5855d422a6f250f3518f43b49092c8e87a5e42be ]
Due to the initial confusion about MIPI_DSI_MODE_EOT_PACKET, properly renamed to MIPI_DSI_MODE_NO_EOT_PACKET, reflecting its actual meaning, both the DSI_TXRX_CON register setting for bit (HSTX_)DIS_EOT and the later calculation for horizontal sync-active (HSA), back (HBP) and front (HFP) porches got incorrect due to the logic being inverted.
This means that a number of settings were wrong because....:
- DSI_TXRX_CON register setting: bit (HSTX_)DIS_EOT should be set in order to disable the End of Transmission packet;
- Horizontal Sync and Back/Front porches: The delta used to calculate all of HSA, HBP and HFP should account for the additional EOT packet.
Before this change...
- Bit (HSTX_)DIS_EOT was being set when EOT packet was enabled;
- For HSA/HBP/HFP delta... all three were wrong, as words were added when EOT disabled, instead of when EOT packet enabled!
Invert the logic around flag MIPI_DSI_MODE_NO_EOT_PACKET in the MediaTek DSI driver to fix the aforementioned issues.
--- drivers/gpu/drm/mediatek/mtk_dsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/mediatek/mtk_dsi.c +2 -2
@@ -406,7 +406,7 @@ static void mtk_dsi_rxtx_control(struct mtk_dsi *dsi)if (dsi->mode_flags &MIPI_DSI_CLOCK_NON_CONTINUOUS ) tmp_reg |=HSTX_CKLP_EN ; -if (!(dsi->mode_flags &MIPI_DSI_MODE_NO_EOT_PACKET )) +if (dsi->mode_flags &MIPI_DSI_MODE_NO_EOT_PACKET ) tmp_reg |=DIS_EOT ;writel (tmp_reg, dsi->regs +DSI_TXRX_CTRL );
@@ -483,7 +483,7 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi) timing->da_hs_zero + timing->da_hs_exit +3 ; delta = dsi->mode_flags &MIPI_DSI_MODE_VIDEO_BURST ?18 :12 ; - delta += dsi->mode_flags &MIPI_DSI_MODE_NO_EOT_PACKET ?2 :0 ; + delta += dsi->mode_flags &MIPI_DSI_MODE_NO_EOT_PACKET ?0 :2 ; horizontal_frontporch_byte = vm->hfront_porch * dsi_tmp_buf_bpp; horizontal_front_back_byte = horizontal_frontporch_byte + horizontal_backporch_byte;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 110/244 perf: hisi: Fix use-after-free when register pmu fails
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junhao He <[email protected]>
[ Upstream commit b805cafc604bfdb671fae7347a57f51154afa735 ]
When we fail to register the uncore pmu, the pmu context may not been allocated. The error handing will call cpuhp_state_remove_instance() to call uncore pmu offline callback, which migrate the pmu context. Since that's liable to lead to some kind of use-after-free.
Use cpuhp_state_remove_instance_nocalls() instead of cpuhp_state_remove_instance() so that the notifiers don't execute after the PMU device has been failed to register.
--- drivers/perf/hisilicon/hisi_uncore_pa_pmu.c | 4 ++-- drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/perf/hisilicon/hisi_uncore_pa_pmu.c +2 -2
@@ -434,8 +434,8 @@ static int hisi_pa_pmu_probe(struct platform_device *pdev) ret =perf_pmu_register (&pa_pmu->pmu, name,-1 );if (ret) {dev_err (pa_pmu->dev,"PMU register failed, ret = %d\n" , ret); -cpuhp_state_remove_instance (CPUHP_AP_PERF_ARM_HISI_PA_ONLINE , - &pa_pmu->node); +cpuhp_state_remove_instance_nocalls (CPUHP_AP_PERF_ARM_HISI_PA_ONLINE , + &pa_pmu->node);return ret; }
drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c +2 -2
@@ -463,8 +463,8 @@ static int hisi_sllc_pmu_probe(struct platform_device *pdev) ret =perf_pmu_register (&sllc_pmu->pmu, name,-1 );if (ret) {dev_err (sllc_pmu->dev,"PMU register failed, ret = %d\n" , ret); -cpuhp_state_remove_instance (CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE , - &sllc_pmu->node); +cpuhp_state_remove_instance_nocalls (CPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE , + &sllc_pmu->node);return ret; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 111/244 ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit edc6ef026fe69154bb6b70dd6e7f278cfd7d6919 ]
On blanche, the GPIO keyboard fails to probe with:
sh-pfc e6060000.pinctrl: could not map pin config for "GP_11_02"
Fix this by correcting the name for this pin to "GP_11_2".
--- arch/arm/boot/dts/r8a7792-blanche.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/r8a7792-blanche.dts +1 -1
@@ -239,7 +239,7 @@ du1_pins: du1 { }; keyboard_pins: keyboard { - pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_02"; + pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_2"; bias-pull-up; };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 112/244 arm64: dts: qcom: msm8916: Fix iommu local address range
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gaurav Kohli <[email protected]>
[ Upstream commit 2de8ee9f58fa51f707c71f8fbcd8470ab0078102 ]
Fix the apps iommu local address space range as per data sheet.
--- arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/msm8916.dtsi +1 -1
@@ -1233,7 +1233,7 @@ apps_iommu: iommu@1ef0000 { #size-cells = <1>; #iommu-cells = <1>; compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; - ranges = <0 0x01e20000 0x40000>; + ranges = <0 0x01e20000 0x20000>; reg = <0x01ef0000 0x3000>; clocks = <&gcc GCC_SMMU_CFG_CLK>, <&gcc GCC_APSS_TCU_CLK>;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 113/244 arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit f32096602c19e68fb9bf04b494d13f1190602554 ]
There are two entries for similar reserved memory: qseecom@cb400000 and audio@cb400000. Keep the qseecom as it is longer.
Warning (unique_unit_address_if_enabled): /reserved-memory/audio@cb400000: duplicate unit-address (also used in node /reserved-memory/qseecom@cb400000)
--- arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts | 5 ----- 1 file changed, 5 deletions(-)
arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts +0 -5
@@ -99,11 +99,6 @@ rmtfs_mem: rmtfs@ca100000 { qcom,client-id = <1>; }; - audio_mem: audio@cb400000 { - reg = <0 0xcb000000 0 0x400000>; - no-mem; - }; - qseecom_mem: qseecom@cb400000 { reg = <0 0xcb400000 0 0x1c00000>; no-mem;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 114/244 arm64: dts: qcom: sc7280: Add missing LMH interrupts
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 3f93d119c9d6e1744d55cd48af764160a1a3aca3 ]
Hook up the interrupts that signal the Limits Management Hardware has started some sort of throttling action.
--- arch/arm64/boot/dts/qcom/sc7280.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/arm64/boot/dts/qcom/sc7280.dtsi +8 -0
@@ -1851,6 +1851,14 @@ cpufreq_hw: cpufreq@18591000 { reg = <0 0x18591000 0 0x1000>, <0 0x18592000 0 0x1000>, <0 0x18593000 0 0x1000>; + + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "dcvsh-irq-0", + "dcvsh-irq-1", + "dcvsh-irq-2"; + clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>; clock-names = "xo", "alternate"; #freq-domain-cells = <1>;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 115/244 arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit b33868a52f342d9b1f20aa5bffe40cbd69bd0a4b ]
Enable the host-cap-8bit quirk on this device. It is required for the WiFi to function properly.
--- arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/qcom/sdm845-mtp.dts +2 -0
@@ -572,6 +572,8 @@ &wifi { vdd-1.8-xo-supply = <&vreg_l7a_1p8>; vdd-1.3-rfa-supply = <&vreg_l17a_1p3>; vdd-3.3-ch0-supply = <&vreg_l25a_3p3>; + + qcom,snoc-host-cap-8bit-quirk; }; /* PINCTRL - additions to nodes defined in sdm845.dtsi */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 116/244 ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Packham <[email protected]>
[ Upstream commit 0878fd86f554ab98aa493996c7e0c72dff58437f ]
Both the CN9130-CRB and CN9130-DB use the SPI1 interface but had the pinctrl node labelled as "cp0_spi0_pins". Use the label "cp0_spi1_pins" and update the node name to "cp0-spi-pins-1" to avoid confusion with the pinctrl options for SPI0.
--- arch/arm64/boot/dts/marvell/cn9130-crb.dtsi | 4 ++-- arch/arm64/boot/dts/marvell/cn9130-db.dtsi | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/marvell/cn9130-crb.dtsi +2 -2
@@ -107,7 +107,7 @@ cp0_sdhci_pins: cp0-sdhi-pins-0 { "mpp59", "mpp60", "mpp61"; marvell,function = "sdio"; }; - cp0_spi0_pins: cp0-spi-pins-0 { + cp0_spi1_pins: cp0-spi-pins-1 { marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16"; marvell,function = "spi1"; };
@@ -149,7 +149,7 @@ &cp0_sdhci0 { &cp0_spi1 { pinctrl-names = "default"; - pinctrl-0 = <&cp0_spi0_pins>; + pinctrl-0 = <&cp0_spi1_pins>; reg = <0x700680 0x50>, /* control */ <0x2000000 0x1000000>; /* CS0 */ status = "okay";
arch/arm64/boot/dts/marvell/cn9130-db.dtsi +2 -2
@@ -307,7 +307,7 @@ &cp0_sdhci0 { &cp0_spi1 { status = "disabled"; pinctrl-names = "default"; - pinctrl-0 = <&cp0_spi0_pins>; + pinctrl-0 = <&cp0_spi1_pins>; reg = <0x700680 0x50>; spi-flash@0 {
@@ -371,7 +371,7 @@ cp0_sdhci_pins: cp0-sdhi-pins-0 { "mpp59", "mpp60", "mpp61"; marvell,function = "sdio"; }; - cp0_spi0_pins: cp0-spi-pins-0 { + cp0_spi1_pins: cp0-spi-pins-1 { marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16"; marvell,function = "spi1"; };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 117/244 arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephan Gerhold <[email protected]>
[ Upstream commit 33e9032a1875bb1aee3c68a4540f5a577ff44130 ]
Add the missing regulator supplies to the ADV7533 HDMI bridge to fix the following dtbs_check warnings. They are all also supplied by pm8916_l6 so there is no functional difference.
apq8016-sbc.dtb: bridge@39: 'dvdd-supply' is a required property apq8016-sbc.dtb: bridge@39: 'pvdd-supply' is a required property apq8016-sbc.dtb: bridge@39: 'a2vdd-supply' is a required property
from schema display/bridge/adi,adv7533.yaml
--- arch/arm64/boot/dts/qcom/apq8016-sbc.dts | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/qcom/apq8016-sbc.dts +3 -0
@@ -190,6 +190,9 @@ adv_bridge: bridge@39 { pd-gpios = <&msmgpio 32 GPIO_ACTIVE_HIGH>; avdd-supply = <&pm8916_l6>; + a2vdd-supply = <&pm8916_l6>; + dvdd-supply = <&pm8916_l6>; + pvdd-supply = <&pm8916_l6>; v1p2-supply = <&pm8916_l6>; v3p3-supply = <&pm8916_l17>;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 118/244 ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 09f8ee81b6da5f76de8b83c8bfc4475b54e101e0 ]
Fixed regulator put under "regulators" node will not be populated, unless simple-bus or something similar is used. Drop the "regulators" wrapper node to fix this.
--- arch/arm/boot/dts/qcom-mdm9615.dtsi | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
arch/arm/boot/dts/qcom-mdm9615.dtsi +6 -8
@@ -82,14 +82,12 @@ cxo_board { }; }; - regulators { - vsdcc_fixed: vsdcc-regulator { - compatible = "regulator-fixed"; - regulator-name = "SDCC Power"; - regulator-min-microvolt = <2700000>; - regulator-max-microvolt = <2700000>; - regulator-always-on; - }; + vsdcc_fixed: vsdcc-regulator { + compatible = "regulator-fixed"; + regulator-name = "SDCC Power"; + regulator-min-microvolt = <2700000>; + regulator-max-microvolt = <2700000>; + regulator-always-on; }; soc: soc {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 119/244 soc: qcom: llcc: Handle a second device without data corruption
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit f1a1bc8775b26345aba2be278118999e7f661d3d ]
Usually there is only one llcc device. But if there were a second, even a failed probe call would modify the global drv_data pointer. So check if drv_data is valid before overwriting it.
--- drivers/soc/qcom/llcc-qcom.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/soc/qcom/llcc-qcom.c +3 -0
@@ -537,6 +537,9 @@ static int qcom_llcc_probe(struct platform_device *pdev)u32 sz;u32 version; +if (!IS_ERR (drv_data)) +return -EBUSY ; + drv_data =devm_kzalloc (dev,sizeof (*drv_data),GFP_KERNEL );if (!drv_data) { ret = -ENOMEM ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 120/244 firmware: ti_sci: Mark driver as non removable
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dhruva Gole <[email protected]>
[ Upstream commit 7b7a224b1ba1703583b25a3641ad9798f34d832a ]
The TI-SCI message protocol provides a way to communicate between various compute processors with a central system controller entity. It provides the fundamental device management capability and clock control in the SOCs that it's used in.
The remove function failed to do all the necessary cleanup if there are registered users. Some things are freed however which likely results in an oops later on.
Ensure that the driver isn't unbound by suppressing its bind and unbind sysfs attributes. As the driver is built-in there is no way to remove device once bound.
We can also remove the ti_sci_remove call along with the ti_sci_debugfs_destroy as there are no callers for it any longer.
--- drivers/firmware/ti_sci.c | 46 +-------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-)
drivers/firmware/ti_sci.c +1 -45
@@ -190,19 +190,6 @@ static int ti_sci_debugfs_create(struct platform_device *pdev, return 0; } -/** -* ti_sci_debugfs_destroy() - clean up log debug file -* @pdev: platform device pointer -* @info: Pointer to SCI entity information -*/ -static void ti_sci_debugfs_destroy (struct platform_device *pdev, -struct ti_sci_info *info) -{ -if (IS_ERR (info->debug_region)) -return ; - -debugfs_remove (info->d); -}#else /* CONFIG_DEBUG_FS */ static inline int ti_sci_debugfs_create (struct platform_device *dev,struct ti_sci_info *info)
@@ -3435,43 +3422,12 @@ static int ti_sci_probe(struct platform_device *pdev)return ret; } -static int ti_sci_remove (struct platform_device *pdev) -{ -struct ti_sci_info *info; -struct device *dev = &pdev->dev; -int ret =0 ; - -of_platform_depopulate (dev); - - info =platform_get_drvdata (pdev); - -if (info->nb.notifier_call) -unregister_restart_handler (&info->nb); - -mutex_lock (&ti_sci_list_mutex); -if (info->users) - ret = -EBUSY ; -else -list_del (&info->node); -mutex_unlock (&ti_sci_list_mutex); - -if (!ret) { -ti_sci_debugfs_destroy (pdev, info); - -/* Safe to free channels since no more users */ -mbox_free_channel (info->chan_tx); -mbox_free_channel (info->chan_rx); - } - -return ret; -} -static struct platform_driver ti_sci_driver = { .probe = ti_sci_probe, - .remove = ti_sci_remove, .driver = { .name ="ti-sci" , .of_match_table =of_match_ptr (ti_sci_of_match), + .suppress_bind_attrs = true, }, };module_platform_driver (ti_sci_driver);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 121/244 firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
[ Upstream commit 7d0bc6360f17ea323ab25939a34857123d7d87e5 ]
Commit 19b8766459c4 ("firmware: arm_ffa: Fix FFA device names for logical partitions") added an ID to the FFA device using ida_alloc() and append the same to "arm-ffa" to make up a unique device name. However it missed to stash the id value in ffa_dev to help freeing the ID later when the device is destroyed.
Due to the missing/unassigned ID in FFA device, we get the following warning when the FF-A device is unregistered.
| ida_free called for id=0 which is not allocated. | WARNING: CPU: 7 PID: 1 at lib/idr.c:525 ida_free+0x114/0x164 | CPU: 7 PID: 1 Comm: swapper/0 Not tainted 6.6.0-rc4 #209 | pstate: 61400009 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) | pc : ida_free+0x114/0x164 | lr : ida_free+0x114/0x164 | Call trace: | ida_free+0x114/0x164 | ffa_release_device+0x24/0x3c | device_release+0x34/0x8c | kobject_put+0x94/0xf8 | put_device+0x18/0x24 | klist_devices_put+0x14/0x20 | klist_next+0xc8/0x114 | bus_for_each_dev+0xd8/0x144 | arm_ffa_bus_exit+0x30/0x54 | ffa_init+0x68/0x330 | do_one_initcall+0xdc/0x250 | do_initcall_level+0x8c/0xac | do_initcalls+0x54/0x94 | do_basic_setup+0x1c/0x28 | kernel_init_freeable+0x104/0x170 | kernel_init+0x20/0x1a0 | ret_from_fork+0x10/0x20
Fix the same by actually assigning the ID in the FFA device this time for real.
--- drivers/firmware/arm_ffa/bus.c | 1 + 1 file changed, 1 insertion(+)
drivers/firmware/arm_ffa/bus.c +1 -0
@@ -192,6 +192,7 @@ struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id) dev->release = ffa_release_device;dev_set_name (&ffa_dev->dev,"arm-ffa-%d" , id); + ffa_dev->id = id; ffa_dev->vm_id = vm_id;uuid_copy (&ffa_dev->uuid, uuid);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 122/244 clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
[ Upstream commit 3537a75e73f3420614a358d0c8b390ea483cc87d ]
Add the missing devm_kfree() when we skip the clocks with invalid or missing information from the firmware.
--- drivers/clk/clk-scmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/clk-scmi.c +1 -0
@@ -178,6 +178,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) sclk->info = scmi_proto_clk_ops->info_get (ph, idx);if (!sclk->info) {dev_dbg (dev,"invalid clock info for idx %d\n" , idx); +devm_kfree (dev, sclk);continue ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 123/244 arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabio Estevam <[email protected]>
[ Upstream commit 1d33cd614d89b0ec024d25ec45acf4632211b5a7 ]
The first compatible entry for the jpegenc should be 'nxp,imx8qm-jpgenc'.
Change it accordingly to fix the following schema warning:
imx8qm-apalis-eval.dtb: jpegenc@58450000: compatible: 'oneOf' conditional failed, one must be fixed:
'nxp,imx8qm-jpgdec' is not one of ['nxp,imx8qxp-jpgdec', 'nxp,imx8qxp-jpgenc'] 'nxp,imx8qm-jpgenc' was expected
'nxp,imx8qxp-jpgdec' was expected
--- arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi +1 -1
@@ -8,5 +8,5 @@ &jpegdec { }; &jpegenc { - compatible = "nxp,imx8qm-jpgdec", "nxp,imx8qxp-jpgenc"; + compatible = "nxp,imx8qm-jpgenc", "nxp,imx8qxp-jpgenc"; };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 124/244 arm64: dts: imx8mm: Add sound-dai-cells to micfil node
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Ford <[email protected]>
[ Upstream commit 0e6cc2b8bb7d67733f4a47720787eff1ce2666f2 ]
Per the DT bindings, the micfil node should have a sound-dai-cells entry.
--- arch/arm64/boot/dts/freescale/imx8mm.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/freescale/imx8mm.dtsi +1 -0
@@ -366,6 +366,7 @@ micfil: audio-controller@30080000 { "pll8k", "pll11k", "clkext3"; dmas = <&sdma2 24 25 0x80000000>; dma-names = "rx"; + #sound-dai-cells = <0>; status = "disabled"; };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 125/244 arm64: dts: imx8mn: Add sound-dai-cells to micfil node
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Ford <[email protected]>
[ Upstream commit db1925454a2e7cadcac8756442ca7c3198332336 ]
Per the DT bindings, the micfil node should have a sound-dai-cells entry.
--- arch/arm64/boot/dts/freescale/imx8mn.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/freescale/imx8mn.dtsi +1 -0
@@ -340,6 +340,7 @@ micfil: audio-controller@30080000 { "pll8k", "pll11k", "clkext3"; dmas = <&sdma2 24 25 0x80000000>; dma-names = "rx"; + #sound-dai-cells = <0>; status = "disabled"; };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 126/244 selftests/pidfd: Fix ksft print formats
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maciej Wieczor-Retman <[email protected]>
[ Upstream commit 4d7f4e8158b62f63031510cdc24acc520956c091 ]
Compiling pidfd selftest after adding a __printf() attribute to ksft_print_msg() and ksft_test_result_pass() exposes -Wformat warnings in error_report(), test_pidfd_poll_exec_thread(), child_poll_exec_test(), test_pidfd_poll_leader_exit_thread(), child_poll_leader_exit_test().
The ksft_test_result_pass() in error_report() expects a string but doesn't provide any argument after the format string. All the other calls to ksft_print_msg() in the functions mentioned above have format strings that don't match with other passed arguments.
Fix format specifiers so they match the passed variables.
Add a missing variable to ksft_test_result_pass() inside error_report() so it matches other cases in the switch statement.
--- tools/testing/selftests/pidfd/pidfd_fdinfo_test.c | 2 +- tools/testing/selftests/pidfd/pidfd_test.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-)
tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +1 -1
@@ -62,7 +62,7 @@ static void error_report(struct error *err, const char *test_name)break ;case PIDFD_PASS : -ksft_test_result_pass ("%s test: Passed\n" ); +ksft_test_result_pass ("%s test: Passed\n" , test_name);break ;default :
tools/testing/selftests/pidfd/pidfd_test.c +6 -6
@@ -380,13 +380,13 @@ static int test_pidfd_send_signal_syscall_support(void)static void *test_pidfd_poll_exec_thread (void *priv) { -ksft_print_msg ("Child Thread: starting. pid %d tid %d ; and sleeping\n" , +ksft_print_msg ("Child Thread: starting. pid %d tid %ld ; and sleeping\n" ,getpid (),syscall (SYS_gettid));ksft_print_msg ("Child Thread: doing exec of sleep\n" );execl ("/bin/sleep" ,"sleep" ,str (CHILD_THREAD_MIN_WAIT ), (char *)NULL ); -ksft_print_msg ("Child Thread: DONE. pid %d tid %d\n" , +ksft_print_msg ("Child Thread: DONE. pid %d tid %ld\n" ,getpid (),syscall (SYS_gettid));return NULL ; }
@@ -426,7 +426,7 @@ static int child_poll_exec_test(void *args) {pthread_t t1; -ksft_print_msg ("Child (pidfd): starting. pid %d tid %d\n" ,getpid (), +ksft_print_msg ("Child (pidfd): starting. pid %d tid %ld\n" ,getpid (),syscall (SYS_gettid));pthread_create (&t1,NULL , test_pidfd_poll_exec_thread,NULL );/*
@@ -477,10 +477,10 @@ static void test_pidfd_poll_exec(int use_waitpid)static void *test_pidfd_poll_leader_exit_thread (void *priv) { -ksft_print_msg ("Child Thread: starting. pid %d tid %d ; and sleeping\n" , +ksft_print_msg ("Child Thread: starting. pid %d tid %ld ; and sleeping\n" ,getpid (),syscall (SYS_gettid));sleep (CHILD_THREAD_MIN_WAIT ); -ksft_print_msg ("Child Thread: DONE. pid %d tid %d\n" ,getpid (),syscall (SYS_gettid)); +ksft_print_msg ("Child Thread: DONE. pid %d tid %ld\n" ,getpid (),syscall (SYS_gettid));return NULL ; }
@@ -489,7 +489,7 @@ static int child_poll_leader_exit_test(void *args) {pthread_t t1, t2; -ksft_print_msg ("Child: starting. pid %d tid %d\n" ,getpid (),syscall (SYS_gettid)); +ksft_print_msg ("Child: starting. pid %d tid %ld\n" ,getpid (),syscall (SYS_gettid));pthread_create (&t1,NULL , test_pidfd_poll_leader_exit_thread,NULL );pthread_create (&t2,NULL , test_pidfd_poll_leader_exit_thread,NULL );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 127/244 selftests/resctrl: Ensure the benchmark commands fits to its array
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 4a28c7665c2a1ac0400864eabb0c641e135f61aa ]
Benchmark command is copied into an array in the stack. The array is BENCHMARK_ARGS items long but the command line could try to provide a longer command. Argument size is also fixed by BENCHMARK_ARG_SIZE (63 bytes of space after fitting the terminating \0 character) and user could have inputted argument longer than that.
Return error in case the benchmark command does not fit to the space allocated for it.
--- tools/testing/selftests/resctrl/resctrl_tests.c | 5 +++++ 1 file changed, 5 insertions(+)
tools/testing/selftests/resctrl/resctrl_tests.c +5 -0
@@ -224,9 +224,14 @@ int main(int argc, char **argv)return ksft_exit_fail_msg ("Not running as root, abort testing.\n" );if (has_ben) { +if (argc - ben_ind >=BENCHMARK_ARGS ) +ksft_exit_fail_msg ("Too long benchmark command.\n" ); +/* Extract benchmark command from command line. */ for (i = ben_ind; i < argc; i++) { benchmark_cmd[i - ben_ind] = benchmark_cmd_area[i]; +if (strlen (argv[i]) >=BENCHMARK_ARG_SIZE ) +ksft_exit_fail_msg ("Too long benchmark command argument.\n" );sprintf (benchmark_cmd[i - ben_ind],"%s" , argv[i]); } benchmark_cmd[ben_count] =NULL ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 128/244 crypto: hisilicon/hpre - Fix a erroneous check after snprintf()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit c977950146720abff14e46d8c53f5638b06a9182 ]
This error handling looks really strange.
Check if the string has been truncated instead.
--- drivers/crypto/hisilicon/hpre/hpre_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/hisilicon/hpre/hpre_main.c +1 -1
@@ -854,7 +854,7 @@ static int hpre_cluster_debugfs_init(struct hisi_qm *qm)for (i =0 ; i < clusters_num; i++) { ret =snprintf (buf,HPRE_DBGFS_VAL_MAX_LEN ,"cluster%d" , i); -if (ret <0 ) +if (ret >=HPRE_DBGFS_VAL_MAX_LEN )return -EINVAL ; tmp_d =debugfs_create_dir (buf, qm->debug.debug_root);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 129/244 hwrng: geode - fix accessing registers
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 464bd8ec2f06707f3773676a1bd2c64832a3c805 ]
When the membase and pci_dev pointer were moved to a new struct in priv, the actual membase users were left untouched, and they started reading out arbitrary memory behind the struct instead of registers. This unfortunately turned the RNG into a constant number generator, depending on the content of what was at that offset.
To fix this, update geode_rng_data_{read,present}() to also get the membase via amd_geode_priv, and properly read from the right addresses again.
--- drivers/char/hw_random/geode-rng.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/char/hw_random/geode-rng.c +4 -2
@@ -58,7 +58,8 @@ struct amd_geode_priv {static int geode_rng_data_read (struct hwrng *rng,u32 *data) { -void __iomem *mem = (void __iomem *)rng->priv; +struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv; +void __iomem *mem = priv->membase; *data =readl (mem +GEODE_RNG_DATA_REG );
@@ -67,7 +68,8 @@ static int geode_rng_data_read(struct hwrng *rng, u32 *data)static int geode_rng_data_present (struct hwrng *rng,int wait) { -void __iomem *mem = (void __iomem *)rng->priv; +struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv; +void __iomem *mem = priv->membase;int data, i;for (i =0 ; i <20 ; i++) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 130/244 RDMA/core: Use size_{add,sub,mul}() in calls to struct_size()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 81760bedc65194ff38e1e4faefd5f9f0c95c19a4 ]
If, for any reason, the open-coded arithmetic causes a wraparound, the protection that struct_size() provides against potential integer overflows is defeated. Fix this by hardening calls to struct_size() with size_add(), size_sub() and size_mul().
--- drivers/infiniband/core/device.c | 2 +- drivers/infiniband/core/sa_query.c | 4 +++- drivers/infiniband/core/sysfs.c | 10 +++++----- drivers/infiniband/core/user_mad.c | 4 +++- 4 files changed, 12 insertions(+), 8 deletions(-)
drivers/infiniband/core/device.c +1 -1
@@ -803,7 +803,7 @@ static int alloc_port_data(struct ib_device *device)* empty slots at the beginning. */ pdata_rcu =kzalloc (struct_size (pdata_rcu, pdata, -rdma_end_port (device) +1 ), +size_add (rdma_end_port (device),1 )),GFP_KERNEL );if (!pdata_rcu)return -ENOMEM ;
drivers/infiniband/core/sa_query.c +3 -1
@@ -2132,7 +2132,9 @@ static int ib_sa_add_one(struct ib_device *device) s =rdma_start_port (device); e =rdma_end_port (device); - sa_dev =kzalloc (struct_size (sa_dev, port, e - s +1 ),GFP_KERNEL ); + sa_dev =kzalloc (struct_size (sa_dev, port, +size_add (size_sub (e, s),1 )), +GFP_KERNEL );if (!sa_dev)return -ENOMEM ;
drivers/infiniband/core/sysfs.c +5 -5
@@ -902,7 +902,7 @@ alloc_hw_stats_device(struct ib_device *ibdev)* Two extra attribue elements here, one for the lifespan entry and * one to NULL terminate the list for the sysfs core code */ - data =kzalloc (struct_size (data, attrs, stats->num_counters +1 ), + data =kzalloc (struct_size (data, attrs,size_add (stats->num_counters,1 )),GFP_KERNEL );if (!data) goto err_free_stats;
@@ -1001,7 +1001,7 @@ alloc_hw_stats_port(struct ib_port *port, struct attribute_group *group)* Two extra attribue elements here, one for the lifespan entry and * one to NULL terminate the list for the sysfs core code */ - data =kzalloc (struct_size (data, attrs, stats->num_counters +1 ), + data =kzalloc (struct_size (data, attrs,size_add (stats->num_counters,1 )),GFP_KERNEL );if (!data) goto err_free_stats;
@@ -1125,7 +1125,7 @@ static int setup_gid_attrs(struct ib_port *port,int ret; gid_attr_group =kzalloc (struct_size (gid_attr_group, attrs_list, - attr->gid_tbl_len *2 ), +size_mul (attr->gid_tbl_len,2 )),GFP_KERNEL );if (!gid_attr_group)return -ENOMEM ;
@@ -1190,8 +1190,8 @@ static struct ib_port *setup_port(struct ib_core_device *coredev, int port_num,int ret; p =kvzalloc (struct_size (p, attrs_list, - attr->gid_tbl_len + attr->pkey_tbl_len), -GFP_KERNEL ); +size_add (attr->gid_tbl_len, attr->pkey_tbl_len)), +GFP_KERNEL );if (!p)return ERR_PTR (-ENOMEM ); p->ibdev = device;
drivers/infiniband/core/user_mad.c +3 -1
@@ -1378,7 +1378,9 @@ static int ib_umad_add_one(struct ib_device *device) s =rdma_start_port (device); e =rdma_end_port (device); - umad_dev =kzalloc (struct_size (umad_dev, ports, e - s +1 ),GFP_KERNEL ); + umad_dev =kzalloc (struct_size (umad_dev, ports, +size_add (size_sub (e, s),1 )), +GFP_KERNEL );if (!umad_dev)return -ENOMEM ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 131/244 scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tyrel Datwyler <[email protected]>
[ Upstream commit 670106eb4c8b23475f8c2b3416005a312afa622f ]
Commit 0217a272fe13 ("scsi: ibmvfc: Store return code of H_FREE_SUB_CRQ during cleanup") wrongly changed the busy loop check to use rtas_busy_delay() instead of H_BUSY and H_IS_LONG_BUSY(). The busy return codes for RTAS and hypercalls are not the same.
Fix this issue by restoring the use of H_BUSY and H_IS_LONG_BUSY().
--- drivers/scsi/ibmvscsi/ibmvfc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/ibmvscsi/ibmvfc.c +1 -2
@@ -22,7 +22,6 @@#include <linux/bsg-lib.h> #include <asm/firmware.h> #include <asm/irq.h> -#include <asm/rtas.h> #include <asm/vio.h> #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h>
@@ -5802,7 +5801,7 @@ static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost, irq_failed:do { rc =plpar_hcall_norets (H_FREE_SUB_CRQ , vdev->unit_address, scrq->cookie); - }while (rtas_busy_delay (rc)); + }while (rc ==H_BUSY ||H_IS_LONG_BUSY (rc)); reg_failed:LEAVE ;return rc;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 132/244 libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 6fd4ebfc4d61e3097b595ab2725d513e3bbd6739 ]
Use devm_kstrdup() instead of kstrdup() and check its return value to avoid memory leak.
--- drivers/nvdimm/of_pmem.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/nvdimm/of_pmem.c +7 -1
@@ -30,7 +30,13 @@ static int of_pmem_region_probe(struct platform_device *pdev)if (!priv)return -ENOMEM ; - priv->bus_desc.provider_name =kstrdup (pdev->name,GFP_KERNEL ); + priv->bus_desc.provider_name =devm_kstrdup (&pdev->dev, pdev->name, +GFP_KERNEL ); +if (!priv->bus_desc.provider_name) { +kfree (priv); +return -ENOMEM ; + } + priv->bus_desc.module =THIS_MODULE ; priv->bus_desc.of_node = np;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 133/244 nd_btt: Make BTT lanes preemptible
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Glozar <[email protected]>
[ Upstream commit 36c75ce3bd299878fd9b238e9803d3817ddafbf3 ]
nd_region_acquire_lane uses get_cpu, which disables preemption. This is an issue on PREEMPT_RT kernels, since btt_write_pg and also nd_region_acquire_lane itself take a spin lock, resulting in BUG:
sleeping function called from invalid context.
Fix the issue by replacing get_cpu with smp_process_id and migrate_disable when needed. This makes BTT operations preemptible, thus permitting the use of spin_lock.
BUG example occurring when running ndctl tests on PREEMPT_RT kernel:
BUG: sleeping function called from invalid context at
kernel/locking/spinlock_rt.c:48in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 4903, name:
libndctlpreempt_count: 1, expected: 0
RCU nest depth: 0, expected: 0
Preemption disabled at:
[<ffffffffc1313db5>] nd_region_acquire_lane+0x15/0x90 [libnvdimm] Call Trace: <TASK> dump_stack_lvl+0x8e/0xb0 __might_resched+0x19b/0x250 rt_spin_lock+0x4c/0x100 ? btt_write_pg+0x2d7/0x500 [nd_btt] btt_write_pg+0x2d7/0x500 [nd_btt] ? local_clock_noinstr+0x9/0xc0 btt_submit_bio+0x16d/0x270 [nd_btt] __submit_bio+0x48/0x80 __submit_bio_noacct+0x7e/0x1e0 submit_bio_wait+0x58/0xb0 __blkdev_direct_IO_simple+0x107/0x240 ? inode_set_ctime_current+0x51/0x110 ? __pfx_submit_bio_wait_endio+0x10/0x10 blkdev_write_iter+0x1d8/0x290 vfs_write+0x237/0x330 ... </TASK>
--- drivers/nvdimm/region_devs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/nvdimm/region_devs.c +4 -4
@@ -966,7 +966,8 @@ unsigned int nd_region_acquire_lane(struct nd_region *nd_region) {unsigned int cpu, lane; - cpu =get_cpu (); +migrate_disable (); + cpu =smp_processor_id ();if (nd_region->num_lanes < nr_cpu_ids) {struct nd_percpu_lane *ndl_lock, *ndl_count;
@@ -985,16 +986,15 @@ EXPORT_SYMBOL(nd_region_acquire_lane);void nd_region_release_lane (struct nd_region *nd_region,unsigned int lane) {if (nd_region->num_lanes < nr_cpu_ids) { -unsigned int cpu =get_cpu (); +unsigned int cpu =smp_processor_id ();struct nd_percpu_lane *ndl_lock, *ndl_count; ndl_count =per_cpu_ptr (nd_region->lane, cpu); ndl_lock =per_cpu_ptr (nd_region->lane, lane);if (--ndl_count->count ==0 )spin_unlock (&ndl_lock->lock); -put_cpu (); } -put_cpu (); +migrate_enable (); }EXPORT_SYMBOL (nd_region_release_lane);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 134/244 crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gaurav Jain <[email protected]>
[ Upstream commit 7b8c6aee0d5b864e70c0da82583f9862e374eaf3 ]
key buffer is not copied in chachapoly_setkey function, results in wrong output for encryption/decryption operation.
fix this by memcpy the key in caam_ctx key arrary
--- drivers/crypto/caam/caamalg_qi2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/crypto/caam/caamalg_qi2.c +2 -1
@@ -639,7 +639,8 @@ static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,if (keylen !=CHACHA_KEY_SIZE + saltlen)return -EINVAL ; - ctx->cdata.key_virt = key; +memcpy (ctx->key, key, keylen); + ctx->cdata.key_virt = ctx->key; ctx->cdata.keylen = keylen - saltlen;return chachapoly_set_sh_desc (aead);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 135/244 crypto: caam/jr - fix Chacha20 + Poly1305 self test failure
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gaurav Jain <[email protected]>
[ Upstream commit a8d3cdcc092fb2f2882acb6c20473a1be0ef4484 ]
key buffer is not copied in chachapoly_setkey function, results in wrong output for encryption/decryption operation.
fix this by memcpy the key in caam_ctx key arrary
--- drivers/crypto/caam/caamalg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/crypto/caam/caamalg.c +2 -1
@@ -566,7 +566,8 @@ static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,if (keylen !=CHACHA_KEY_SIZE + saltlen)return -EINVAL ; - ctx->cdata.key_virt = key; +memcpy (ctx->key, key, keylen); + ctx->cdata.key_virt = ctx->key; ctx->cdata.keylen = keylen - saltlen;return chachapoly_set_sh_desc (aead);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 136/244 crypto: qat - increase size of buffers
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 4e4e2ed22d505c5bacf65c6a39bfb6d120d24785 ]
Increase the size of the buffers used for composing the names used for the transport debugfs entries and the vector name to avoid a potential truncation.
This resolves the following errors when compiling the driver with W=1 and KCFLAGS=-Werror on GCC 12.3.1:
drivers/crypto/intel/qat/qat_common/adf_transport_debug.c: In function ‘adf_ring_debugfs_add’:
drivers/crypto/intel/qat/qat_common/adf_transport_debug.c:100:60: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=] drivers/crypto/intel/qat/qat_common/adf_isr.c: In function ‘adf_isr_resource_alloc’:
drivers/crypto/intel/qat/qat_common/adf_isr.c:197:47: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size between 0 and 5 [-Werror=format-truncation=]
--- drivers/crypto/qat/qat_common/adf_accel_devices.h | 2 +- drivers/crypto/qat/qat_common/adf_transport_debug.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/qat/qat_common/adf_accel_devices.h +1 -1
@@ -24,7 +24,7 @@#define ADF_PCI_MAX_BARS 3#define ADF_DEVICE_NAME_LENGTH 32#define ADF_ETR_MAX_RINGS_PER_BANK 16 -#define ADF_MAX_MSIX_VECTOR_NAME 16 +#define ADF_MAX_MSIX_VECTOR_NAME 48#define ADF_DEVICE_NAME_PREFIX "qat_"enum adf_accel_capabilities {
drivers/crypto/qat/qat_common/adf_transport_debug.c +2 -2
@@ -90,7 +90,7 @@ DEFINE_SEQ_ATTRIBUTE(adf_ring_debug);int adf_ring_debugfs_add (struct adf_etr_ring_data *ring,const char *name) {struct adf_etr_ring_debug_entry *ring_debug; -char entry_name[8 ]; +char entry_name[16 ]; ring_debug =kzalloc (sizeof (*ring_debug),GFP_KERNEL );if (!ring_debug)
@@ -192,7 +192,7 @@ int adf_bank_debugfs_add(struct adf_etr_bank_data *bank) {struct adf_accel_dev *accel_dev = bank->accel_dev;struct dentry *parent = accel_dev->transport->debug; -char name[8 ]; +char name[16 ];snprintf (name,sizeof (name),"bank_%02d" , bank->bank_number); bank->bank_debug_dir =debugfs_create_dir (name, parent);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 137/244 hid: cp2112: Fix duplicate workqueue initialization
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danny Kaehn <[email protected]>
[ Upstream commit e3c2d2d144c082dd71596953193adf9891491f42 ]
Previously the cp2112 driver called INIT_DELAYED_WORK within cp2112_gpio_irq_startup, resulting in duplicate initilizations of the workqueue on subsequent IRQ startups following an initial request. This resulted in a warning in set_work_data in workqueue.c, as well as a rare NULL dereference within process_one_work in workqueue.c.
Initialize the workqueue within _probe instead.
--- drivers/hid/hid-cp2112.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hid/hid-cp2112.c +2 -2
@@ -1157,8 +1157,6 @@ static unsigned int cp2112_gpio_irq_startup(struct irq_data *d)struct gpio_chip *gc =irq_data_get_irq_chip_data (d);struct cp2112_device *dev =gpiochip_get_data (gc); -INIT_DELAYED_WORK (&dev->gpio_poll_worker, cp2112_gpio_poll_callback); -if (!dev->gpio_poll) { dev->gpio_poll = true;schedule_delayed_work (&dev->gpio_poll_worker,0 );
@@ -1354,6 +1352,8 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id) girq->handler = handle_simple_irq; girq->threaded = true; +INIT_DELAYED_WORK (&dev->gpio_poll_worker, cp2112_gpio_poll_callback); + ret =gpiochip_add_data (&dev->gc, dev);if (ret <0 ) {hid_err (hdev,"error registering gpio chip\n" );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 138/244 ARM: 9321/1: memset: cast the constant byte to unsigned char
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kursad Oney <[email protected]>
[ Upstream commit c0e824661f443b8cab3897006c1bbc69fd0e7bc4 ]
memset() description in ISO/IEC 9899:1999 (and elsewhere) says:
The memset function copies the value of c (converted to an unsigned char) into each of the first n characters of the object pointed to by s.
The kernel's arm32 memset does not cast c to unsigned char. This results in the following code to produce erroneous output:
char a[128]; memset(a, -128, sizeof(a));
This is because gcc will generally emit the following code before it calls memset() :
mov r0, r7 mvn r1, #127 ; 0x7f bl 00000000 <memset>
r1 ends up with 0xffffff80 before being used by memset() and the 'a' array will have -128 once in every four bytes while the other bytes will be set incorrectly to -1 like this (printing the first 8 bytes) :
test_module: -128 -1 -1 -1 test_module: -1 -1 -1 -128
The change here is to 'and' r1 with 255 before it is used.
--- arch/arm/lib/memset.S | 1 + 1 file changed, 1 insertion(+)
arch/arm/lib/memset.S +1 -0
@@ -17,6 +17,7 @@ ENTRY(__memset) ENTRY(mmioset) WEAK(memset) UNWIND( .fnstart ) + and r1, r1, #255 @ cast to unsigned char ands r3, r0, #3 @ 1 unaligned? mov ip, r0 @ preserve r0 as return value bne 6f @ 1
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 139/244 ext4: move ix sanity check to corrent position
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gou Hao <[email protected]>
[ Upstream commit af90a8f4a09ec4a3de20142e37f37205d4687f28 ]
Check 'ix' before it is used.
--- fs/ext4/extents.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/ext4/extents.c +5 -5
@@ -1004,6 +1004,11 @@ static int ext4_ext_insert_index(handle_t *handle, struct inode *inode, ix = curp->p_idx; } +if (unlikely (ix >EXT_MAX_INDEX (curp->p_hdr))) { +EXT4_ERROR_INODE (inode,"ix > EXT_MAX_INDEX!" ); +return -EFSCORRUPTED ; + } + len =EXT_LAST_INDEX (curp->p_hdr) - ix +1 ;BUG_ON (len <0 );if (len >0 ) {
@@ -1013,11 +1018,6 @@ static int ext4_ext_insert_index(handle_t *handle, struct inode *inode,memmove (ix +1 , ix, len *sizeof (struct ext4_extent_idx )); } -if (unlikely (ix >EXT_MAX_INDEX (curp->p_hdr))) { -EXT4_ERROR_INODE (inode,"ix > EXT_MAX_INDEX!" ); -return -EFSCORRUPTED ; - } - ix->ei_block =cpu_to_le32 (logical);ext4_idx_store_pblock (ix, ptr);le16_add_cpu (&curp->p_hdr->eh_entries,1 );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 140/244 ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit 4a221b2e3340f4a3c2b414c46c846a26c6caf820 ]
This patch fixes the warnings of "Function parameter or member 'xxx' not described".
Quoted 1 line
Quoted 1 line
sound/soc/fsl/mpc5200_dma.c:116: warning: Function parameter or member 'component' not described in 'psc_dma_trigger'
sound/soc/fsl/mpc5200_dma.c:116: warning: Function parameter or member 'substream' not described in 'psc_dma_trigger' sound/soc/fsl/mpc5200_dma.c:116: warning: Function parameter or member 'cmd' not described in 'psc_dma_trigger'
--- sound/soc/fsl/mpc5200_dma.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/fsl/mpc5200_dma.c +3 -0
@@ -100,6 +100,9 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream)/** * psc_dma_trigger: start and stop the DMA transfer. +* @component: triggered component +* @substream: triggered substream +* @cmd: triggered command * * This function is called by ALSA to start, stop, pause, and resume the DMA * transfer of data.
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 141/244 IB/mlx5: Fix rdma counter binding for RAW QP
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrisious Haddad <[email protected]>
[ Upstream commit c1336bb4aa5e809a622a87d74311275514086596 ]
Previously when we had a RAW QP, we bound a counter to it when it moved to INIT state, using the counter context inside RQC.
But when we try to modify that counter later in RTS state we used modify QP which tries to change the counter inside QPC instead of RQC.
Now we correctly modify the counter set_id inside of RQC instead of QPC for the RAW QP.
--- drivers/infiniband/hw/mlx5/qp.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/infiniband/hw/mlx5/qp.c +27 -0
@@ -3955,6 +3955,30 @@ static unsigned int get_tx_affinity(struct ib_qp *qp,return tx_affinity; } +static int __mlx5_ib_qp_set_raw_qp_counter (struct mlx5_ib_qp *qp,u32 set_id, +struct mlx5_core_dev *mdev) +{ +struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp; +struct mlx5_ib_rq *rq = &raw_packet_qp->rq; +u32 in[MLX5_ST_SZ_DW (modify_rq_in)] = {}; +void *rqc; + +if (!qp->rq.wqe_cnt) +return 0 ; + +MLX5_SET (modify_rq_in, in, rq_state, rq->state); +MLX5_SET (modify_rq_in, in, uid,to_mpd (qp->ibqp.pd)->uid); + + rqc =MLX5_ADDR_OF (modify_rq_in, in, ctx); +MLX5_SET (rqc, rqc, state,MLX5_RQC_STATE_RDY ); + +MLX5_SET64 (modify_rq_in, in, modify_bitmask, +MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_RQ_COUNTER_SET_ID ); +MLX5_SET (rqc, rqc, counter_set_id, set_id); + +return mlx5_core_modify_rq (mdev, rq->base.mqp.qpn, in); +} +static int __mlx5_ib_qp_set_counter (struct ib_qp *qp,struct rdma_counter *counter) {
@@ -3970,6 +3994,9 @@ static int __mlx5_ib_qp_set_counter(struct ib_qp *qp,else set_id =mlx5_ib_get_counters_id (dev, mqp->port -1 ); +if (mqp->type ==IB_QPT_RAW_PACKET ) +return __mlx5_ib_qp_set_raw_qp_counter (mqp, set_id, dev->mdev); + base = &mqp->trans_qp.base;MLX5_SET (rts2rts_qp_in, in, opcode,MLX5_CMD_OP_RTS2RTS_QP );MLX5_SET (rts2rts_qp_in, in, qpn, base->mqp.qpn);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 142/244 RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common()
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit c64e9710f9241e38a1c761ed1c1a30854784da66 ]
ucmd in hns_roce_create_qp_common() are not initialized. But it works fine until new member sdb_addr is added to struct hns_roce_ib_create_qp.
If the user-mode driver uses an old version ABI, then the value of the new member will be undefined after ib_copy_from_udata().
This patch fixes it by initialize this variable to 0. And the default value of the new member sdb_addr will be 0 which is invalid.
--- drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_qp.c +1 -1
@@ -1049,7 +1049,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev, {struct hns_roce_ib_create_qp_resp resp = {};struct ib_device *ibdev = &hr_dev->ib_dev; -struct hns_roce_ib_create_qp ucmd; +struct hns_roce_ib_create_qp ucmd = {};int ret;mutex_init (&hr_qp->mutex);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 143/244 RDMA/hns: Fix signed-unsigned mixed comparisons
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit b5f9efff101b06fd06a5e280a2b00b1335f5f476 ]
The ib_mtu_enum_to_int() and uverbs_attr_get_len() may returns a negative value. In this case, mixed comparisons of signed and unsigned types will throw wrong results.
This patch adds judgement for this situation.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +1 -1
@@ -244,7 +244,7 @@ static bool check_inl_data_len(struct hns_roce_qp *qp, unsigned int len)struct hns_roce_dev *hr_dev =to_hr_dev (qp->ibqp.device);int mtu =ib_mtu_enum_to_int (qp->path_mtu); -if (len > qp->max_inline_data || len > mtu) { +if (mtu <0 || len > qp->max_inline_data || len > mtu) {ibdev_err (&hr_dev->ib_dev,"invalid length of data, data len = %u, max inline len = %u, path mtu = %d.\n" , len, qp->max_inline_data, mtu);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 144/244 RDMA/hns: The UD mode can only be configured with DCQCN
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luoyouming <[email protected]>
[ Upstream commit 27c5fd271d8b8730fc0bb1b6cae953ad7808a874 ]
Due to hardware limitations, only DCQCN is supported for UD. Therefore, the default algorithm for UD is set to DCQCN.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -0
@@ -4556,6 +4556,9 @@ static int check_cong_type(struct ib_qp *ibqp, {struct hns_roce_dev *hr_dev =to_hr_dev (ibqp->device); +if (ibqp->qp_type ==IB_QPT_UD ) + hr_dev->caps.cong_type =CONG_TYPE_DCQCN ; +/* different congestion types match different configurations */ switch (hr_dev->caps.cong_type) {case CONG_TYPE_DCQCN :
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 145/244 ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Shurong <[email protected]>
[ Upstream commit 9e630efb5a4af56fdb15aa10405f5cfd3f5f5b83 ]
The pm_runtime_enable will increase power disable depth. Thus a pairing decrement is needed on the error handling path to keep it balanced according to context. We fix it by calling pm_runtime_disable when error returns.
--- sound/soc/fsl/fsl_easrc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_easrc.c +6 -2
@@ -1965,17 +1965,21 @@ static int fsl_easrc_probe(struct platform_device *pdev) &fsl_easrc_dai, 1);if (ret) {dev_err (dev,"failed to register ASoC DAI\n" ); -return ret; + goto err_pm_disable; } ret =devm_snd_soc_register_component (dev, &fsl_asrc_component,NULL ,0 );if (ret) {dev_err (&pdev->dev,"failed to register ASoC platform\n" ); -return ret; + goto err_pm_disable; }return 0 ; + +err_pm_disable: +pm_runtime_disable (&pdev->dev); +return ret; }static int fsl_easrc_remove (struct platform_device *pdev)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 146/244 scsi: ufs: core: Leave space for \0 in utf8 desc string
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Mentz <[email protected]>
[ Upstream commit a75a16c62a2540f11eeae4f2b50e95deefb652ea ]
utf16s_to_utf8s does not NULL terminate the output string. For us to be able to add a NULL character when utf16s_to_utf8s returns, we need to make sure that there is space for such NULL character at the end of the output buffer. We can achieve this by passing an output buffer size to utf16s_to_utf8s that is one character less than what we allocated.
Other call sites of utf16s_to_utf8s appear to be using the same technique where they artificially reduce the buffer size by one to leave space for a NULL character or line feed character.
--- drivers/scsi/ufs/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +1 -1
@@ -3465,7 +3465,7 @@ int ufshcd_read_string_desc(struct ufs_hba *hba, u8 desc_index,*/ ret =utf16s_to_utf8s (uc_str->uc, uc_str->len -QUERY_DESC_HDR_SIZE , -UTF16_BIG_ENDIAN , str, ascii_len); +UTF16_BIG_ENDIAN , str, ascii_len -1 );/* replace non-printable or non-ASCII characters with spaces */ for (i =0 ; i < ret; i++)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 147/244 RDMA/hfi1: Workaround truncation compilation error
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit d4b2d165714c0ce8777d5131f6e0aad617b7adc4 ]
Increase name array to be large enough to overcome the following compilation error.
drivers/infiniband/hw/hfi1/efivar.c: In function ‘read_hfi1_efi_var’:drivers/infiniband/hw/hfi1/efivar.c:124:44: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=]
124 | snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
| ^drivers/infiniband/hw/hfi1/efivar.c:124:9: note: ‘snprintf’ output 2 or more bytes (assuming 65) into a destination of size 64
124 | snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~drivers/infiniband/hw/hfi1/efivar.c:133:52: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=]
133 | snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
| ^drivers/infiniband/hw/hfi1/efivar.c:133:17: note: ‘snprintf’ output 2 or more bytes (assuming 65) into a destination of size 64
133 | snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cc1: all warnings being treated as errors
make[6]: *** [scripts/Makefile.build:243: drivers/infiniband/hw/hfi1/efivar.o] Error 1
--- drivers/infiniband/hw/hfi1/efivar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/hfi1/efivar.c +1 -1
@@ -110,7 +110,7 @@ int read_hfi1_efi_var(struct hfi1_devdata *dd, const char *kind, unsigned long *size, void **return_data) { char prefix_name[64]; -char name[64 ]; +char name[128 ];int result;int i;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 148/244 hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danny Kaehn <[email protected]>
[ Upstream commit dc3115e6c5d9863ec1a9ff1acf004ede93c34361 ]
Previously cp2112_gpio_irq_shutdown() always cancelled the gpio_poll_worker, even if other IRQs were still active, and did not set the gpio_poll flag to false. This resulted in any call to _shutdown() resulting in interrupts no longer functioning on the chip until a _remove() occurred (a.e. the cp2112 is unplugged or system rebooted).
Only cancel polling if all IRQs are disabled/masked, and correctly set the gpio_poll flag, allowing polling to restart when an interrupt is next enabled.
--- drivers/hid/hid-cp2112.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/hid/hid-cp2112.c +4 -1
@@ -1171,7 +1171,10 @@ static void cp2112_gpio_irq_shutdown(strstruct gpio_chip *gc =irq_data_get_irq_chip_data (d);struct cp2112_device *dev =gpiochip_get_data (gc); -cancel_delayed_work_sync (&dev->gpio_poll_worker); +if (!dev->irq_mask) { + dev->gpio_poll = false; +cancel_delayed_work_sync (&dev->gpio_poll_worker); + } }static int cp2112_gpio_irq_type (struct irq_data *d,unsigned int type)
Greg Kroah-Hartman
maintainerPATCH 149/244 sh: bios: Revive earlyprintk support
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 553f7ac78fbb41b2c93ab9b9d78e42274d27daa9 ]
The SuperH BIOS earlyprintk code is protected by CONFIG_EARLY_PRINTK. However, when this protection was added, it was missed that SuperH no longer defines an EARLY_PRINTK config symbol since commit e76fe57447e88916 ("sh: Remove old early serial console code V2"), so BIOS earlyprintk can no longer be used.
Fix this by reviving the EARLY_PRINTK config symbol.
--- arch/sh/Kconfig.debug | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/sh/Kconfig.debug +11 -0
@@ -22,6 +22,17 @@ config STACK_DEBUG every function call and will therefore incur a major performance hit. Most users should say N. +config EARLY_PRINTK + bool "Early printk" + depends on SH_STANDARD_BIOS + help + Say Y here to redirect kernel printk messages to the serial port + used by the SH-IPL bootloader, starting very early in the boot + process and ending when the kernel's serial console is initialised. + This option is only useful while porting the kernel to a new machine, + when the kernel may crash or hang before the serial console is + initialised. If unsure, say N. + config 4KSTACKS bool "Use 4Kb for kernel stacks instead of 8Kb" depends on DEBUG_KERNEL && (MMU || BROKEN) && !PAGE_SIZE_64KB
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 150/244 Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures"
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bastien Nocera <[email protected]>
[ Upstream commit cae253d6033da885e71c29c1591b22838a52de76 ]
Now that we're in 2022, and the majority of desktop environments can and should support touchpad gestures through libinput, remove the legacy module parameter that made it possible to use gestures implemented in firmware.
This will eventually allow simplifying the driver's initialisation code.
This reverts commit 9188dbaed68a4b23dc96eba165265c08caa7dc2a.
Stable-dep-of: 11ca0322a419 ("HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only")
--- drivers/hid/hid-logitech-hidpp.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/hid/hid-logitech-hidpp.c +0 -10
@@ -31,11 +31,6 @@ MODULE_LICENSE("GPL");MODULE_AUTHOR ("Benjamin Tissoires <[email protected]>" );MODULE_AUTHOR ("Nestor Lopez Casado <[email protected]>" ); -static bool disable_raw_mode; -module_param (disable_raw_mode, bool,0644 ); -MODULE_PARM_DESC (disable_raw_mode, -"Disable Raw mode reporting for touchpads and keep firmware gestures." ); -static bool disable_tap_to_click;module_param (disable_tap_to_click, bool,0644 ); MODULE_PARM_DESC(disable_tap_to_click,
@@ -4137,11 +4132,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) hidpp_application_equals(hdev, HID_GD_KEYBOARD)) hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS; -if (disable_raw_mode) { - hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP ; - hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT ; - } -if (hidpp->quirks &HIDPP_QUIRK_CLASS_WTP ) { ret =wtp_allocate (hdev, id);if (ret)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 151/244 HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bastien Nocera <[email protected]>
[ Upstream commit d83956c8855c6c2ed4bd16cec4a5083d63df17e4 ]
HIDPP_QUIRK_NO_HIDINPUT isn't used by any devices but still happens to work as HIDPP_QUIRK_DELAYED_INIT is defined to the same value. Remove HIDPP_QUIRK_NO_HIDINPUT and use HIDPP_QUIRK_DELAYED_INIT everywhere instead.
Tested on a T650 which requires that quirk, and a number of unifying and Bluetooth devices that don't.
Stable-dep-of: 11ca0322a419 ("HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only")
--- drivers/hid/hid-logitech-hidpp.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/hid/hid-logitech-hidpp.c +3 -5
@@ -63,7 +63,7 @@ MODULE_PARM_DESC(disable_tap_to_click,/* bits 2..20 are reserved for classes */ /* #define HIDPP_QUIRK_CONNECT_EVENTS BIT(21) disabled */ #define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22) -#define HIDPP_QUIRK_NO_HIDINPUT BIT(23) +#define HIDPP_QUIRK_DELAYED_INIT BIT(23)#define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS BIT(24)#define HIDPP_QUIRK_UNIFYING BIT(25)#define HIDPP_QUIRK_HI_RES_SCROLL_1P0 BIT(26)
@@ -82,8 +82,6 @@ MODULE_PARM_DESC(disable_tap_to_click, HIDPP_QUIRK_HI_RES_SCROLL_X2120 | \ HIDPP_QUIRK_HI_RES_SCROLL_X2121) -#define HIDPP_QUIRK_DELAYED_INIT HIDPP_QUIRK_NO_HIDINPUT -#define HIDPP_CAPABILITY_HIDPP10_BATTERY BIT(0)#define HIDPP_CAPABILITY_HIDPP20_BATTERY BIT(1)#define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
@@ -3988,7 +3986,7 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)if (hidpp->quirks &HIDPP_QUIRK_HI_RES_SCROLL )hi_res_scroll_enable (hidpp); -if (!(hidpp->quirks &HIDPP_QUIRK_NO_HIDINPUT ) || hidpp->delayed_input) +if (!(hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT ) || hidpp->delayed_input)/* if the input nodes are already created, we can stop now */ return ;
@@ -4221,7 +4219,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)hid_hw_close (hdev);hid_hw_stop (hdev); -if (hidpp->quirks &HIDPP_QUIRK_NO_HIDINPUT ) +if (hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT ) connect_mask &= ~HID_CONNECT_HIDINPUT ;/* Now export the actual inputs and hidraw nodes to the world */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 152/244 HID: logitech-hidpp: Dont restart IO, instead defer hid_connect() only
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit 11ca0322a41920df2b462d2e45b0731e47ff475b ]
Restarting IO causes 2 problems:
1. Some devices do not like IO being restarted this was addressed in commit 498ba2069035 ("HID: logitech-hidpp: Don't restart communication if not necessary"), but that change has issues of its own and needs to be reverted.
2. Restarting IO and specifically calling hid_device_io_stop() causes received packets to be missed, which may cause connect-events to get missed.
Restarting IO was introduced in commit 91cf9a98ae41 ("HID: logitech-hidpp:
make .probe usbhid capable") to allow to retrieve the device's name and serial number and store these in hdev->name and hdev->uniq before connecting any hid subdrivers (hid-input, hidraw) exporting this info to userspace.
But this does not require restarting IO, this merely requires deferring calling hid_connect(). Calling hid_hw_start() with a connect-mask of 0 makes it skip calling hid_connect(), so hidpp_probe() can simply call hid_connect() later without needing to restart IO.
Remove the stop + restart of IO and instead just call hid_connect() later to avoid the issues caused by restarting IO.
Now that IO is no longer stopped, hid_hw_close() must be called at the end of probe() to balance the hid_hw_open() done at the beginning probe().
This series has been tested on the following devices:
Logitech Bluetooth Laser Travel Mouse (bluetooth, HID++ 1.0) Logitech M720 Triathlon (bluetooth, HID++ 4.5)
Logitech M720 Triathlon (unifying, HID++ 4.5)
Logitech K400 Pro (unifying, HID++ 4.1)
Logitech K270 (eQUAD nano Lite, HID++ 2.0)
Logitech M185 (eQUAD nano Lite, HID++ 4.5)
Logitech LX501 keyboard (27 Mhz, HID++ builtin scroll-wheel, HID++ 1.0) Logitech M-RAZ105 mouse (27 Mhz, HID++ extra mouse buttons, HID++ 1.0)
And by bentiss:
Logitech Touchpad T650 (unifying)
Logitech Touchpad T651 (bluetooth)
Logitech MX Master 3B (BLE)
Logitech G403 (plain USB / Gaming receiver)
--- drivers/hid/hid-logitech-hidpp.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/hid/hid-logitech-hidpp.c +12 -10
@@ -4155,8 +4155,10 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) hdev->name);/* -* Plain USB connections need to actually call start and open -* on the transport driver to allow incoming data. +* First call hid_hw_start(hdev, 0) to allow IO without connecting any +* hid subdrivers (hid-input, hidraw). This allows retrieving the dev's +* name and serial number and store these in hdev->name and hdev->uniq, +* before the hid-input and hidraw drivers expose these to userspace. */ ret =hid_hw_start (hdev, will_restart ?0 : connect_mask);if (ret) {
@@ -4214,19 +4216,14 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)flush_work (&hidpp->work);if (will_restart) { -/* Reset the HID node state */ -hid_device_io_stop (hdev); -hid_hw_close (hdev); -hid_hw_stop (hdev); -if (hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT ) connect_mask &= ~HID_CONNECT_HIDINPUT ;/* Now export the actual inputs and hidraw nodes to the world */ - ret =hid_hw_start (hdev, connect_mask); + ret =hid_connect (hdev, connect_mask);if (ret) { -hid_err (hdev,"%s:hid_hw_start returned error\n" , __func__); - goto hid_hw_start_fail; +hid_err (hdev,"%s:hid_connect returned error %d\n" , __func__, ret); + goto hid_hw_init_fail; } }
@@ -4238,6 +4235,11 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) ret); } +/* +* This relies on logi_dj_ll_close() being a no-op so that DJ connection +* events will still be received. +*/ +hid_hw_close (hdev);return ret; hid_hw_init_fail:
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 153/244 HID: logitech-hidpp: Revert "Dont restart communication if not necessary"
In reply to Greg Kroah-Hartman5.15-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit 55bf70362ffc4ddd7c8745e2fe880edac00e4aff ]
Commit 91cf9a98ae41 ("HID: logitech-hidpp: make .probe usbhid capable") makes hidpp_probe() first call hid_hw_start(hdev, 0) to allow IO without connecting any hid subdrivers (hid-input, hidraw).
This is done to allow to retrieve the device's name and serial number and store these in hdev->name and hdev->uniq.
Then later on IO was stopped and started again with hid_hw_start(hdev, HID_CONNECT_DEFAULT) connecting hid-input and hidraw after the name and serial number have been setup.
Commit 498ba2069035 ("HID: logitech-hidpp: Don't restart communication if not necessary") changed the probe() code to only do the start with a 0 connect-mask + restart later for unifying devices.
But for non unifying devices hdev->name and hdev->uniq are updated too. So this change re-introduces the problem for which the start with a 0 connect-mask + restart later behavior was introduced.
The previous patch in this series changes the unifying path to instead of restarting IO only call hid_connect() later. This avoids possible issues with restarting IO seen on non unifying devices.
Revert the change to limit the restart behavior to unifying devices to fix hdev->name changing after userspace facing devices have already been registered.
This series has been tested on the following devices:
Logitech Bluetooth Laser Travel Mouse (bluetooth, HID++ 1.0) Logitech M720 Triathlon (bluetooth, HID++ 4.5)
Logitech M720 Triathlon (unifying, HID++ 4.5)
Logitech K400 Pro (unifying, HID++ 4.1)
Logitech K270 (eQUAD nano Lite, HID++ 2.0)
Logitech M185 (eQUAD nano Lite, HID++ 4.5)
Logitech LX501 keyboard (27 Mhz, HID++ builtin scroll-wheel, HID++ 1.0) Logitech M-RAZ105 mouse (27 Mhz, HID++ extra mouse buttons, HID++ 1.0)
And by bentiss:
Logitech Touchpad T650 (unifying)
Logitech Touchpad T651 (bluetooth)
Logitech MX Master 3B (BLE)
Logitech G403 (plain USB / Gaming receiver)
--- drivers/hid/hid-logitech-hidpp.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-)
drivers/hid/hid-logitech-hidpp.c +8 -16
@@ -4089,7 +4089,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)bool connected;unsigned int connect_mask =HID_CONNECT_DEFAULT ;struct hidpp_ff_private_data data; -bool will_restart = false;/* report_fixup needs drvdata to be set before we call hid_parse */ hidpp =devm_kzalloc (&hdev->dev,sizeof (*hidpp),GFP_KERNEL );
@@ -4140,10 +4139,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)return ret; } -if (hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT || - hidpp->quirks &HIDPP_QUIRK_UNIFYING ) - will_restart = true; -INIT_WORK (&hidpp->work, delayed_work_cb);mutex_init (&hidpp->send_mutex);init_waitqueue_head (&hidpp->wait);
@@ -4160,7 +4155,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)* name and serial number and store these in hdev->name and hdev->uniq, * before the hid-input and hidraw drivers expose these to userspace. */ - ret =hid_hw_start (hdev, will_restart ?0 : connect_mask); + ret =hid_hw_start (hdev,0 );if (ret) {hid_err (hdev,"hw start failed\n" ); goto hid_hw_start_fail;
@@ -4199,7 +4194,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) hidpp->wireless_feature_index =0 ; else if (ret) goto hid_hw_init_fail; - ret = 0; }if (connected && (hidpp->quirks &HIDPP_QUIRK_CLASS_WTP )) {
@@ -4215,16 +4209,14 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)schedule_work (&hidpp->work);flush_work (&hidpp->work); -if (will_restart) { -if (hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT ) - connect_mask &= ~HID_CONNECT_HIDINPUT ; +if (hidpp->quirks &HIDPP_QUIRK_DELAYED_INIT ) + connect_mask &= ~HID_CONNECT_HIDINPUT ; -/* Now export the actual inputs and hidraw nodes to the world */ - ret =hid_connect (hdev, connect_mask); -if (ret) { -hid_err (hdev,"%s:hid_connect returned error %d\n" , __func__, ret); - goto hid_hw_init_fail; - } +/* Now export the actual inputs and hidraw nodes to the world */ + ret =hid_connect (hdev, connect_mask); +if (ret) { +hid_err (hdev,"%s:hid_connect returned error %d\n" , __func__, ret); + goto hid_hw_init_fail; }if (hidpp->quirks &HIDPP_QUIRK_CLASS_G920 ) {
Signature · 1 line
2.42.0