5.10.201-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 5.10.201-rc1 review
This is the start of the stable review cycle for the 5.10.201 release. There are 191 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:46:03 +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.10.201-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.10.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.10.201-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
Erik Kurzinger <[email protected]>
drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
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()
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
Heiner Kallweit <[email protected]>
r8169: respect userspace disabling IFF_MULTICAST
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
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.
Eric Dumazet <[email protected]>
inet: shrink struct flowi_common
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
Thierry Reding <[email protected]>
pwm: sti: Avoid conditional gotos
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
Dinghao Liu <[email protected]>
i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs
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
Andy Shevchenko <[email protected]>
interconnect: qcom: osm-l3: Replace custom implementation of COUNT_ARGS()
Konrad Dybcio <[email protected]>
interconnect: qcom: sc7180: Set ACV enable_mask
Konrad Dybcio <[email protected]>
interconnect: qcom: sc7180: Retire DEFINE_QBCM
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
Chenyuan Mi <[email protected]>
tools: iio: iio_generic_buffer: Fix some integer type and calculation
Alexandru Ardelean <[email protected]>
tools: iio: privatize globals and functions in iio_generic_buffer.c file
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
Jia-Ju Bai <[email protected]>
usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency
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()
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
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
WangJinchao <[email protected]>
padata: Fix refcnt handling in padata_free_shell()
Xiyu Yang <[email protected]>
padata: Convert from atomic_t to refcount_t on parallel_data->refcnt
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
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
Giovanni Cabiddu <[email protected]>
crypto: qat - mask device capabilities with soft straps
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
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
Sudeep Holla <[email protected]>
clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
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
Dmitry Baryshkov <[email protected]>
arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
Gaurav Kohli <[email protected]>
arm64: dts: qcom: msm8916: Fix iommu local address range
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
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
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
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
Nuno Sá <[email protected]>
hwmon: (axi-fan-control) Support temperature vs pwm points
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
Randy Dunlap <[email protected]>
clk: linux/clk-provider.h: fix kernel-doc warnings and typos
Dmitry Baryshkov <[email protected]>
clk: asm9260: use parent index to link the reference 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
Dmitry Baryshkov <[email protected]>
clk: qcom: gcc-sm8150: use ARRAY_SIZE instead of specifying num_parents
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
AngeloGioacchino Del Regno <[email protected]>
clk: qcom: mmcc-msm8998: Set bimc_smmu_gdsc always on
Konrad Dybcio <[email protected]>
clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks
AngeloGioacchino Del Regno <[email protected]>
clk: qcom: mmcc-msm8998: Add hardware clockgating registers to some clks
Devi Priya <[email protected]>
clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
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()
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
Sascha Hauer <[email protected]>
PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
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: 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()
Kees Cook <[email protected]>
overflow: Implement size_t saturating arithmetic helpers
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
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
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
Reuben Hawkins <[email protected]>
vfs: fix readahead(2) on block devices
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:
Documentation/process/deprecated.rst | 20 +- Makefile | 4 +- arch/arm/boot/dts/qcom-mdm9615.dtsi | 14 +- arch/arm/lib/memset.S | 1 + arch/arm/xen/enlighten.c | 25 +- arch/arm64/boot/dts/qcom/msm8916.dtsi | 2 +- arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 2 + arch/powerpc/include/asm/nohash/32/pte-40x.h | 3 - 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 +- 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-asm9260.c | 29 +-- 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/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 | 98 ++++---- drivers/clk/qcom/mmcc-msm8998.c | 17 +- 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_c3xxx/adf_c3xxx_hw_data.c | 34 ++- drivers/crypto/qat/qat_c3xxx/adf_c3xxx_hw_data.h | 1 + drivers/crypto/qat/qat_c3xxx/adf_drv.c | 6 +- .../crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c | 4 +- drivers/crypto/qat/qat_c3xxxvf/adf_drv.c | 4 +- drivers/crypto/qat/qat_c62x/adf_c62x_hw_data.c | 34 ++- drivers/crypto/qat/qat_c62x/adf_c62x_hw_data.h | 1 + drivers/crypto/qat/qat_c62x/adf_drv.c | 6 +- drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c | 4 +- drivers/crypto/qat/qat_c62xvf/adf_drv.c | 4 +- drivers/crypto/qat/qat_common/adf_accel_devices.h | 7 +- .../crypto/qat/qat_common/adf_transport_debug.c | 4 +- drivers/crypto/qat/qat_common/qat_hal.c | 27 ++- .../crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 20 +- drivers/crypto/qat/qat_dh895xcc/adf_drv.c | 4 +- .../qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c | 4 +- drivers/crypto/qat/qat_dh895xccvf/adf_drv.c | 4 +- drivers/devfreq/event/rockchip-dfi.c | 15 +- drivers/dma/pxa_dma.c | 1 - drivers/dma/ti/edma.c | 4 +- drivers/firmware/ti_sci.c | 46 +--- drivers/gpu/drm/bridge/tc358768.c | 25 +- drivers/gpu/drm/drm_syncobj.c | 3 +- drivers/gpu/drm/mediatek/mtk_drm_crtc.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 | 101 ++++++-- drivers/hwmon/coretemp.c | 2 +- drivers/i3c/master.c | 4 +- drivers/infiniband/hw/hfi1/efivar.c | 2 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- drivers/infiniband/hw/hns/hns_roce_qp.c | 2 +- drivers/infiniband/hw/mlx5/qp.c | 27 +++ drivers/input/rmi4/rmi_bus.c | 2 +- drivers/interconnect/qcom/osm-l3.c | 3 +- drivers/interconnect/qcom/sc7180.c | 256 +++++++++++++++++++-- drivers/leds/leds-pwm.c | 2 +- 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/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/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 +- .../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/mvm/tx.c | 14 +- drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 + drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 23 +- .../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/platform/x86/wmi.c | 50 ++-- drivers/pwm/pwm-brcmstb.c | 4 +- drivers/pwm/pwm-sti.c | 75 +++--- drivers/rtc/rtc-pcf85363.c | 2 +- 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/staging/media/sunxi/cedrus/cedrus_hw.c | 24 +- drivers/thermal/thermal_core.c | 6 +- drivers/tty/tty_jobctrl.c | 17 +- 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/file.c | 1 + fs/pstore/platform.c | 9 +- include/linux/clk-provider.h | 34 ++- include/linux/cpuhotplug.h | 1 + include/linux/idr.h | 6 +- include/linux/mfd/core.h | 2 +- include/linux/netdevice.h | 1 + include/linux/overflow.h | 110 +++++---- include/linux/padata.h | 3 +- include/net/flow.h | 2 +- include/net/netfilter/nf_nat_redirect.h | 3 +- include/net/tcp.h | 2 +- kernel/futex/core.c | 12 +- kernel/irq/matrix.c | 6 +- kernel/livepatch/core.c | 2 +- kernel/padata.c | 14 +- kernel/sched/fair.c | 18 +- kernel/trace/trace_kprobe.c | 2 +- lib/test_overflow.c | 98 ++++++++ mm/readahead.c | 3 +- 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/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/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 | 59 +++-- 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/pidfd/pidfd_fdinfo_test.c | 2 +- tools/testing/selftests/pidfd/pidfd_test.c | 12 +- tools/testing/selftests/resctrl/resctrl_tests.c | 5 + 213 files changed, 1806 insertions(+), 975 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/191 iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
5.10-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
@@ -446,7 +446,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
@@ -74,23 +74,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/191 sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
In reply to Greg Kroah-Hartman5.10-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
@@ -3927,22 +3927,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) {
@@ -6842,7 +6826,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) goto fail;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/191 vfs: fix readahead(2) on block devices
In reply to Greg Kroah-Hartman5.10-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
@@ -625,7 +625,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 4/191 x86/srso: Fix SBPB enablement for (possible) future fixed HW
In reply to Greg Kroah-Hartman5.10-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
@@ -2407,7 +2407,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 5/191 futex: Dont include process MM in futex key on no-MMU
In reply to Greg Kroah-Hartman5.10-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
@@ -514,7 +514,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 6/191 x86/boot: Fix incorrect startup_gdt_descr.size
In reply to Greg Kroah-Hartman5.10-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
@@ -80,7 +80,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 7/191 pstore/platform: Add check for kstrdup
In reply to Greg Kroah-Hartman5.10-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
@@ -558,6 +558,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 ;
@@ -577,11 +579,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 ; }
@@ -614,7 +621,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 8/191 genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
In reply to Greg Kroah-Hartman5.10-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 9/191 i40e: fix potential memory leaks in i40e_remove()
In reply to Greg Kroah-Hartman5.10-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
@@ -15601,11 +15601,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 10/191 wifi: iwlwifi: Use FW rate for non-data frames
In reply to Greg Kroah-Hartman5.10-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
@@ -532,16 +532,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
Re: [PATCH 5.10 010/191] wifi: iwlwifi: Use FW rate for non-data frames
Quoted 2 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
I wouldn't backport this patch anywhere.
First of all, it's only _required_ for real WiFi7 operation, which isn't supported in any of these old kernels. Secondly, it introduced a regression wrt. the rates used by the firmware, which, while not that important, caused some folks to complain.
johannes
Greg Kroah-Hartman
maintainerRe: [PATCH 5.10 010/191] wifi: iwlwifi: Use FW rate for non-data frames
Quoted 10 lines · Johannes Berg
Quoted 2 lines · Greg Kroah-Hartman
5.10-stable review patch. If anyone has any objections, please let me know.
I wouldn't backport this patch anywhere.
First of all, it's only _required_ for real WiFi7 operation, which isn't supported in any of these old kernels. Secondly, it introduced a regression wrt. the rates used by the firmware, which, while not that important, caused some folks to complain.
Ok, thanks! I'll drop it from all queues.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 11/191 udp: add missing WRITE_ONCE() around up->encap_rcv
In reply to Greg Kroah-Hartman5.10-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
@@ -2645,10 +2645,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 12/191 tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
In reply to Greg Kroah-Hartman5.10-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
@@ -6349,22 +6349,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 13/191 overflow: Implement size_t saturating arithmetic helpers
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit e1be43d9b5d0d1310dbd90185a8e5c7145dde40f ]
In order to perform more open-coded replacements of common allocation size arithmetic, the kernel needs saturating (SIZE_MAX) helpers for multiplication, addition, and subtraction. For example, it is common in allocators, especially on realloc, to add to an existing size:
p = krealloc(map->patch,
sizeof(struct reg_sequence) * (map->patch_regs + num_regs),
GFP_KERNEL);There is no existing saturating replacement for this calculation, and just leaving the addition open coded inside array_size() could potentially overflow as well. For example, an overflow in an expression for a size_t argument might wrap to zero:
array_size(anything, something_at_size_max + 1) == 0
Introduce size_mul(), size_add(), and size_sub() helpers that implicitly promote arguments to size_t and saturated calculations for use in allocations. With these helpers it is also possible to redefine array_size(), array3_size(), flex_array_size(), and struct_size() in terms of the new helpers.
As with the check_*_overflow() helpers, the new helpers use __must_check, though what is really desired is a way to make sure that assignment is only to a size_t lvalue. Without this, it's still possible to introduce overflow/underflow via type conversion (i.e. from size_t to int). Enforcing this will currently need to be left to static analysis or future use of -Wconversion.
Additionally update the overflow unit tests to force runtime evaluation for the pathological cases.
Stable-dep-of: d692873cbe86 ("gve: Use size_add() in call to struct_size()")
--- Documentation/process/deprecated.rst | 20 ++++- include/linux/overflow.h | 110 +++++++++++++++++---------- lib/test_overflow.c | 98 ++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 44 deletions(-)
Documentation/process/deprecated.rst +17 -3
@@ -70,6 +70,9 @@ Instead, the 2-factor form of the allocator should be used:: foo = kmalloc_array(count, size, GFP_KERNEL); +Specifically, kmalloc() can be replaced with kmalloc_array(), and +kzalloc() can be replaced with kcalloc(). + If no 2-factor form is available, the saturate-on-overflow helpers should be used::
@@ -90,9 +93,20 @@ Instead, use the helper:: array usage and switch to a `flexible array member <#zero-length-and-one-element-arrays>`_ instead. -See array_size(), array3_size(), and struct_size(), -for more details as well as the related check_add_overflow() and -check_mul_overflow() family of functions. +For other calculations, please compose the use of the size_mul(), +size_add(), and size_sub() helpers. For example, in the case of:: + + foo = krealloc(current_size + chunk_size * (count - 3), GFP_KERNEL); + +Instead, use the helpers:: + + foo = krealloc(size_add(current_size, + size_mul(chunk_size, + size_sub(count, 3))), GFP_KERNEL); + +For more details, also see array3_size() and flex_array_size(), +as well as the related check_mul_overflow(), check_add_overflow(), +check_sub_overflow(), and check_shl_overflow() family of functions. simple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull() ----------------------------------------------------------------------
include/linux/overflow.h +69 -41
157 lines not on this page · raw message
lib/test_overflow.c +98 -0
110 lines not on this page · raw message
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 14/191 gve: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman5.10-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
@@ -128,7 +128,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 15/191 mlxsw: Use size_mul() in call to struct_size()
In reply to Greg Kroah-Hartman5.10-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 16/191 tipc: Use size_add() in calls to struct_size()
In reply to Greg Kroah-Hartman5.10-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
@@ -1410,7 +1410,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;
@@ -1497,7 +1497,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 17/191 net: spider_net: Use size_add() in call to struct_size()
In reply to Greg Kroah-Hartman5.10-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
@@ -2311,7 +2311,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 18/191 wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
In reply to Greg Kroah-Hartman5.10-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
@@ -901,9 +901,9 @@ static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {#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 19/191 wifi: mt76: mt7603: rework/fix rx pse hang check
In reply to Greg Kroah-Hartman5.10-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
@@ -1535,20 +1535,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 20/191 tcp_metrics: add missing barriers on delete
In reply to Greg Kroah-Hartman5.10-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)->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 21/191 tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
In reply to Greg Kroah-Hartman5.10-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 22/191 tcp_metrics: do not create an entry from tcp_init_metrics()
In reply to Greg Kroah-Hartman5.10-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 23/191 wifi: rtlwifi: fix EDCA limit set by BT coexistence
In reply to Greg Kroah-Hartman5.10-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 24/191 can: dev: can_restart(): dont crash kernel if carrier is OK
In reply to Greg Kroah-Hartman5.10-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
@@ -578,7 +578,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 25/191 can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
In reply to Greg Kroah-Hartman5.10-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
@@ -603,11 +603,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 26/191 PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
In reply to Greg Kroah-Hartman5.10-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 27/191 thermal: core: prevent potential string overflow
In reply to Greg Kroah-Hartman5.10-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
@@ -879,7 +879,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 ;
@@ -888,7 +889,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 28/191 r8169: use tp_to_dev instead of open code
In reply to Greg Kroah-Hartman5.10-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
@@ -4688,12 +4688,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 29/191 r8169: fix rare issue with broken rx after link-down on RTL8125
In reply to Greg Kroah-Hartman5.10-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
@@ -4693,7 +4693,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 30/191 chtls: fix tp->rcv_tstamp initialization
In reply to Greg Kroah-Hartman5.10-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
@@ -2259,7 +2259,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 31/191 tcp: fix cookie_init_timestamp() overflows
In reply to Greg Kroah-Hartman5.10-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
@@ -776,7 +776,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 32/191 ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
In reply to Greg Kroah-Hartman5.10-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
@@ -156,8 +156,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;
@@ -210,8 +210,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 33/191 ipv6: avoid atomic fragment on GSO packets
In reply to Greg Kroah-Hartman5.10-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
@@ -178,7 +178,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 34/191 net: add DEV_STATS_READ() helper
In reply to Greg Kroah-Hartman5.10-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
@@ -3686,9 +3686,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
@@ -5286,5 +5286,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 35/191 ipvlan: properly track tx_errors
In reply to Greg Kroah-Hartman5.10-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
@@ -322,6 +322,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 36/191 regmap: debugfs: Fix a erroneous check after snprintf()
In reply to Greg Kroah-Hartman5.10-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 37/191 clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
In reply to Greg Kroah-Hartman5.10-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
@@ -147,17 +147,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 38/191 clk: qcom: mmcc-msm8998: Add hardware clockgating registers to some clks
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit fa92f3b093d6ca624f42d444d5a206f8724b6bb3 ]
Hardware clock gating is supported on some of the clocks declared in
there: ignoring that it does exist may lead to unstabilities on some firmwares.
Add the HWCG registers where applicable to stop potential crashes.
This was verified on a smartphone shipped with a recent MSM8998 firmware, which will experience random crashes without this change.
Stable-dep-of: 9906c4140897 ("clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks")
--- drivers/clk/qcom/mmcc-msm8998.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/clk/qcom/mmcc-msm8998.c +10 -0
@@ -1211,6 +1211,8 @@ static struct clk_rcg2 vfe1_clk_src = {static struct clk_branch misc_ahb_clk = { .halt_reg =0x328 , + .hwcg_reg =0x328 , + .hwcg_bit =1 , .clkr = { .enable_reg =0x328 , .enable_mask =BIT (0 ),
@@ -1241,6 +1243,8 @@ static struct clk_branch video_core_clk = {static struct clk_branch video_ahb_clk = { .halt_reg =0x1030 , + .hwcg_reg =0x1030 , + .hwcg_bit =1 , .clkr = { .enable_reg =0x1030 , .enable_mask =BIT (0 ),
@@ -1315,6 +1319,8 @@ static struct clk_branch video_subcore1_clk = {static struct clk_branch mdss_ahb_clk = { .halt_reg =0x2308 , + .hwcg_reg =0x2308 , + .hwcg_bit =1 , .clkr = { .enable_reg =0x2308 , .enable_mask =BIT (0 ),
@@ -2496,6 +2502,8 @@ static struct clk_branch mnoc_ahb_clk = {static struct clk_branch bimc_smmu_ahb_clk = { .halt_reg =0xe004 , + .hwcg_reg =0xe004 , + .hwcg_bit =1 , .clkr = { .enable_reg =0xe004 , .enable_mask =BIT (0 ),
@@ -2511,6 +2519,8 @@ static struct clk_branch bimc_smmu_ahb_clk = {static struct clk_branch bimc_smmu_axi_clk = { .halt_reg =0xe008 , + .hwcg_reg =0xe008 , + .hwcg_bit =1 , .clkr = { .enable_reg =0xe008 , .enable_mask =BIT (0 ),
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 39/191 clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks
In reply to Greg Kroah-Hartman5.10-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 40/191 clk: qcom: mmcc-msm8998: Set bimc_smmu_gdsc always on
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: AngeloGioacchino Del Regno <[email protected]>
[ Upstream commit 68e1d106eb4dceb61bc2818d829786b364fd502b ]
This GDSC enables (or cuts!) power to the Multimedia Subsystem IOMMU (mmss smmu), which has bootloader pre-set secure contexts. In the event of a complete power loss, the secure contexts will be reset and the hypervisor will crash the SoC.
To prevent this, and get a working multimedia subsystem, set this GDSC as always on.
Stable-dep-of: 1fc62c834739 ("clk: qcom: mmcc-msm8998: Fix the SMMU GDSC")
--- drivers/clk/qcom/mmcc-msm8998.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/mmcc-msm8998.c +1 -1
@@ -2666,7 +2666,7 @@ static struct gdsc bimc_smmu_gdsc = { .name = "bimc_smmu", }, .pwrsts = PWRSTS_OFF_ON, - .flags = HW_CTRL, + .flags = HW_CTRL | ALWAYS_ON, }; static struct clk_regmap *mmcc_msm8998_clocks[] = {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 41/191 clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
In reply to Greg Kroah-Hartman5.10-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 42/191 clk: qcom: gcc-sm8150: use ARRAY_SIZE instead of specifying num_parents
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 60ca4670fd6436c07cea38472ebcee3b00f03bc7 ]
Use ARRAY_SIZE() instead of manually specifying num_parents. This makes adding/removing entries to/from parent_data easy and errorproof.
Stable-dep-of: 7138c244fb29 ("clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src")
--- drivers/clk/qcom/gcc-sm8150.c | 96 +++++++++++++++++------------------ 1 file changed, 48 insertions(+), 48 deletions(-)
drivers/clk/qcom/gcc-sm8150.c +48 -48
@@ -241,7 +241,7 @@ static struct clk_rcg2 gcc_cpuss_ahb_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_cpuss_ahb_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -264,7 +264,7 @@ static struct clk_rcg2 gcc_emac_ptp_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_emac_ptp_clk_src" , .parent_data = gcc_parents_5, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_5), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -290,7 +290,7 @@ static struct clk_rcg2 gcc_emac_rgmii_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_emac_rgmii_clk_src" , .parent_data = gcc_parents_5, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_5), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -314,7 +314,7 @@ static struct clk_rcg2 gcc_gp1_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_gp1_clk_src" , .parent_data = gcc_parents_1, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_1), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -329,7 +329,7 @@ static struct clk_rcg2 gcc_gp2_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_gp2_clk_src" , .parent_data = gcc_parents_1, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_1), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -344,7 +344,7 @@ static struct clk_rcg2 gcc_gp3_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_gp3_clk_src" , .parent_data = gcc_parents_1, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_1), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -365,7 +365,7 @@ static struct clk_rcg2 gcc_pcie_0_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_pcie_0_aux_clk_src" , .parent_data = gcc_parents_2, - .num_parents =3 , + .num_parents =ARRAY_SIZE (gcc_parents_2), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -380,7 +380,7 @@ static struct clk_rcg2 gcc_pcie_1_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_pcie_1_aux_clk_src" , .parent_data = gcc_parents_2, - .num_parents =3 , + .num_parents =ARRAY_SIZE (gcc_parents_2), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -401,7 +401,7 @@ static struct clk_rcg2 gcc_pcie_phy_refgen_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_pcie_phy_refgen_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -423,7 +423,7 @@ static struct clk_rcg2 gcc_pdm2_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_pdm2_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -446,7 +446,7 @@ static struct clk_rcg2 gcc_qspi_core_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qspi_core_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -480,7 +480,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s0_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s0_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -495,7 +495,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s1_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s1_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -510,7 +510,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s2_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s2_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -525,7 +525,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s3_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s3_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -540,7 +540,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s4_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s4_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -555,7 +555,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s5_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s5_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -570,7 +570,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s6_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s6_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -585,7 +585,7 @@ static struct clk_rcg2 gcc_qupv3_wrap0_s7_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap0_s7_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -600,7 +600,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s0_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s0_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -615,7 +615,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s1_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s1_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -630,7 +630,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s2_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s2_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -645,7 +645,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s3_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s3_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -660,7 +660,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s4_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s4_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -675,7 +675,7 @@ static struct clk_rcg2 gcc_qupv3_wrap1_s5_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap1_s5_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -690,7 +690,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s0_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s0_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -705,7 +705,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s1_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s1_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -720,7 +720,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s2_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s2_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -735,7 +735,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s3_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s3_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -750,7 +750,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s4_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s4_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -765,7 +765,7 @@ static struct clk_rcg2 gcc_qupv3_wrap2_s5_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_qupv3_wrap2_s5_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -791,7 +791,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_sdcc2_apps_clk_src" , .parent_data = gcc_parents_6, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_6), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_floor_ops, },
@@ -816,7 +816,7 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_sdcc4_apps_clk_src" , .parent_data = gcc_parents_3, - .num_parents =3 , + .num_parents =ARRAY_SIZE (gcc_parents_3), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_floor_ops, },
@@ -836,7 +836,7 @@ static struct clk_rcg2 gcc_tsif_ref_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_tsif_ref_clk_src" , .parent_data = gcc_parents_7, - .num_parents =5 , + .num_parents =ARRAY_SIZE (gcc_parents_7), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -860,7 +860,7 @@ static struct clk_rcg2 gcc_ufs_card_axi_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_card_axi_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -883,7 +883,7 @@ static struct clk_rcg2 gcc_ufs_card_ice_core_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_card_ice_core_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -903,7 +903,7 @@ static struct clk_rcg2 gcc_ufs_card_phy_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_card_phy_aux_clk_src" , .parent_data = gcc_parents_4, - .num_parents =2 , + .num_parents =ARRAY_SIZE (gcc_parents_4), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -925,7 +925,7 @@ static struct clk_rcg2 gcc_ufs_card_unipro_core_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_card_unipro_core_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -949,7 +949,7 @@ static struct clk_rcg2 gcc_ufs_phy_axi_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_phy_axi_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -964,7 +964,7 @@ static struct clk_rcg2 gcc_ufs_phy_ice_core_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_phy_ice_core_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -979,7 +979,7 @@ static struct clk_rcg2 gcc_ufs_phy_phy_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_phy_phy_aux_clk_src" , .parent_data = gcc_parents_4, - .num_parents =2 , + .num_parents =ARRAY_SIZE (gcc_parents_4), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -994,7 +994,7 @@ static struct clk_rcg2 gcc_ufs_phy_unipro_core_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_ufs_phy_unipro_core_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1018,7 +1018,7 @@ static struct clk_rcg2 gcc_usb30_prim_master_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb30_prim_master_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1040,7 +1040,7 @@ static struct clk_rcg2 gcc_usb30_prim_mock_utmi_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb30_prim_mock_utmi_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1055,7 +1055,7 @@ static struct clk_rcg2 gcc_usb30_sec_master_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb30_sec_master_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1070,7 +1070,7 @@ static struct clk_rcg2 gcc_usb30_sec_mock_utmi_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb30_sec_mock_utmi_clk_src" , .parent_data = gcc_parents_0, - .num_parents =4 , + .num_parents =ARRAY_SIZE (gcc_parents_0), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1085,7 +1085,7 @@ static struct clk_rcg2 gcc_usb3_prim_phy_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb3_prim_phy_aux_clk_src" , .parent_data = gcc_parents_2, - .num_parents =3 , + .num_parents =ARRAY_SIZE (gcc_parents_2), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
@@ -1100,7 +1100,7 @@ static struct clk_rcg2 gcc_usb3_sec_phy_aux_clk_src = { .clkr.hw.init = &(struct clk_init_data){ .name ="gcc_usb3_sec_phy_aux_clk_src" , .parent_data = gcc_parents_2, - .num_parents =3 , + .num_parents =ARRAY_SIZE (gcc_parents_2), .flags =CLK_SET_RATE_PARENT , .ops = &clk_rcg2_ops, },
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 43/191 clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
In reply to Greg Kroah-Hartman5.10-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 44/191 clk: imx: Select MXC_CLK for CLK_IMX8QXP
In reply to Greg Kroah-Hartman5.10-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 45/191 clk: imx: imx8mq: correct error handling path
In reply to Greg Kroah-Hartman5.10-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
@@ -280,8 +280,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 ;
@@ -298,10 +297,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));
@@ -373,8 +374,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 46/191 clk: asm9260: use parent index to link the reference clock
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit f5290d8e4f0caa81a491448a27dd70e726095d07 ]
Rewrite clk-asm9260 to use parent index to use the reference clock. During this rework two helpers are added:
- clk_hw_register_mux_table_parent_data() to supplement clk_hw_register_mux_table() but using parent_data instead of parent_names
- clk_hw_register_fixed_rate_parent_accuracy() to be used instead of directly calling __clk_hw_register_fixed_rate(). The later function is an internal API, which is better not to be called directly.
Stable-dep-of: 84aefafe6b29 ("clk: linux/clk-provider.h: fix kernel-doc warnings and typos")
--- drivers/clk/clk-asm9260.c | 29 ++++++++++++----------------- include/linux/clk-provider.h | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 17 deletions(-)
drivers/clk/clk-asm9260.c +12 -17
@@ -80,7 +80,7 @@ struct asm9260_mux_clock {u8 mask;u32 *table;const char *name; -const char **parent_names; +const struct clk_parent_data *parent_data;u8 num_parents;unsigned long offset;unsigned long flags;
@@ -232,10 +232,10 @@ static const struct asm9260_gate_data asm9260_ahb_gates[] __initconst = { HW_AHBCLKCTRL1, 16 }, }; -static const char __initdata *main_mux_p[] = {NULL ,NULL }; -static const char __initdata *i2s0_mux_p[] = {NULL ,NULL ,"i2s0m_div" }; -static const char __initdata *i2s1_mux_p[] = {NULL ,NULL ,"i2s1m_div" }; -static const char __initdata *clkout_mux_p[] = {NULL ,NULL ,"rtc" }; +static struct clk_parent_data __initdata main_mux_p[] = { { .index =0 , }, { .name ="pll" } }; +static struct clk_parent_data __initdata i2s0_mux_p[] = { { .index =0 , }, { .name ="pll" }, { .name ="i2s0m_div" } }; +static struct clk_parent_data __initdata i2s1_mux_p[] = { { .index =0 , }, { .name ="pll" }, { .name ="i2s1m_div" } }; +static struct clk_parent_data __initdata clkout_mux_p[] = { { .index =0 , }, { .name ="pll" }, { .name ="rtc" } };static u32 three_mux_table[] = {0 ,1 ,3 };static struct asm9260_mux_clock asm9260_mux_clks[]__initdata = {
@@ -255,9 +255,10 @@ static struct asm9260_mux_clock asm9260_mux_clks[] __initdata = {static void __init asm9260_acc_init (struct device_node *np) { -struct clk_hw *hw; +struct clk_hw *hw, *pll_hw;struct clk_hw **hws; -const char *ref_clk, *pll_clk ="pll" ; +const char *pll_clk ="pll" ; +struct clk_parent_data pll_parent_data = { .index =0 };u32 rate;int n;
@@ -274,21 +275,15 @@ static void __init asm9260_acc_init(struct device_node *np)/* register pll */ rate = (ioread32 (base +HW_SYSPLLCTRL ) &0xffff ) *1000000 ; -/* TODO: Convert to DT parent scheme */ - ref_clk =of_clk_get_parent_name (np,0 ); - hw =__clk_hw_register_fixed_rate (NULL ,NULL , pll_clk, - ref_clk,NULL ,NULL ,0 , rate,0 , -CLK_FIXED_RATE_PARENT_ACCURACY ); - -if (IS_ERR (hw)) + pll_hw =clk_hw_register_fixed_rate_parent_accuracy (NULL , pll_clk, &pll_parent_data, +0 , rate); +if (IS_ERR (pll_hw))panic ("%pOFn: can't register REFCLK. Check DT!" , np);for (n =0 ; n <ARRAY_SIZE (asm9260_mux_clks); n++) {const struct asm9260_mux_clock *mc = &asm9260_mux_clks[n]; - mc->parent_names[0 ] = ref_clk; - mc->parent_names[1 ] = pll_clk; - hw =clk_hw_register_mux_table (NULL , mc->name, mc->parent_names, + hw =clk_hw_register_mux_table_parent_data (NULL , mc->name, mc->parent_data, mc->num_parents, mc->flags, base + mc->offset,0 , mc->mask,0 , mc->table, &asm9260_clk_lock); }
include/linux/clk-provider.h +21 -0
@@ -439,6 +439,20 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,__clk_hw_register_fixed_rate ((dev),NULL , (name),NULL ,NULL , \ (parent_data),NULL , (flags), \ (fixed_rate), (fixed_accuracy),0 ) +/** +* clk_hw_register_fixed_rate_parent_accuracy - register fixed-rate clock with +* the clock framework +* @dev: device that is registering this clock +* @name: name of this clock +* @parent_name: name of clock's parent +* @flags: framework-specific flags +* @fixed_rate: non-adjustable clock rate + */ +#define clk_hw_register_fixed_rate_parent_accuracy (dev, name, parent_data, \ + flags, fixed_rate) \ + __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, \ + (parent_data), (flags), (fixed_rate), 0, \ + CLK_FIXED_RATE_PARENT_ACCURACY)void clk_unregister_fixed_rate (struct clk *clk);void clk_hw_unregister_fixed_rate (struct clk_hw *hw);
@@ -858,6 +872,13 @@ struct clk *clk_register_mux_table(struct device *dev, const char *name, (parent_names), NULL, NULL, (flags), (reg), \ (shift), (mask), (clk_mux_flags), (table), \ (lock)) +#define clk_hw_register_mux_table_parent_data (dev, name, parent_data, \ + num_parents, flags, reg, shift, mask, \ + clk_mux_flags, table, lock) \ + __clk_hw_register_mux((dev), NULL, (name), (num_parents), \ + NULL, NULL, (parent_data), (flags), (reg), \ + (shift), (mask), (clk_mux_flags), (table), \ + (lock))#define clk_hw_register_mux (dev, name, parent_names, num_parents, flags, reg, \ shift, width, clk_mux_flags, lock) \ __clk_hw_register_mux((dev), NULL, (name), (num_parents), \
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 47/191 clk: linux/clk-provider.h: fix kernel-doc warnings and typos
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 84aefafe6b294041b7fa0757414c4a29c1bdeea2 ]
Fix spelling of "Structure".
Fix multiple kernel-doc warnings:
clk-provider.h:269: warning: Function parameter or member 'recalc_rate' not described in 'clk_ops'
clk-provider.h:468: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' clk-provider.h:468: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_with_accuracy_parent_data' clk-provider.h:482: warning: Function parameter or member 'parent_data' not described in 'clk_hw_register_fixed_rate_parent_accuracy' clk-provider.h:482: warning: Excess function parameter 'parent_name' description in 'clk_hw_register_fixed_rate_parent_accuracy' clk-provider.h:687: warning: Function parameter or member 'flags' not described in 'clk_divider'
clk-provider.h:1164: warning: Function parameter or member 'flags' not described in 'clk_fractional_divider' clk-provider.h:1164: warning: Function parameter or member 'approximation' not described in 'clk_fractional_divider' clk-provider.h:1213: warning: Function parameter or member 'flags' not described in 'clk_multiplier'
--- include/linux/clk-provider.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
include/linux/clk-provider.h +8 -7
@@ -61,7 +61,7 @@ struct clk_rate_request { };/** -* struct clk_duty - Struture encoding the duty cycle ratio of a clock +* struct clk_duty - Structure encoding the duty cycle ratio of a clock * * @num: Numerator of the duty cycle ratio * @den: Denominator of the duty cycle ratio
@@ -116,7 +116,7 @@ struct clk_duty {* @restore_context: Restore the context of the clock after a restoration * of power. * -* @recalc_rate Recalculate the rate of this clock, by querying hardware. The +* @recalc_rate: Recalculate the rate of this clock, by querying hardware. The * parent rate is an input parameter. It is up to the caller to * ensure that the prepare_mutex is held across this call. * Returns the calculated rate. Optional, but recommended - if
@@ -429,7 +429,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,* clock with the clock framework * @dev: device that is registering this clock * @name: name of this clock -* @parent_name: name of clock's parent +* @parent_data: name of clock's parent * @flags: framework-specific flags * @fixed_rate: non-adjustable clock rate * @fixed_accuracy: non-adjustable clock accuracy
@@ -444,7 +444,7 @@ struct clk *clk_register_fixed_rate(struct device *dev, const char *name,* the clock framework * @dev: device that is registering this clock * @name: name of this clock -* @parent_name: name of clock's parent +* @parent_data: name of clock's parent * @flags: framework-specific flags * @fixed_rate: non-adjustable clock rate */
@@ -580,7 +580,7 @@ struct clk_div_table {* Clock with an adjustable divider affecting its output frequency. Implements * .recalc_rate, .set_rate and .round_rate * -* Flags: +* @flags: * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the * register plus one. If CLK_DIVIDER_ONE_BASED is set then the divider is * the raw value read from the register, with the value of zero considered
@@ -945,11 +945,12 @@ void clk_hw_unregister_fixed_factor(struct clk_hw *hw);* @mwidth: width of the numerator bit field * @nshift: shift to the denominator bit field * @nwidth: width of the denominator bit field +* @approximation: clk driver's callback for calculating the divider clock * @lock: register lock * * Clock with adjustable fractional divider affecting its output frequency. * -* Flags: +* @flags: * CLK_FRAC_DIVIDER_ZERO_BASED - by default the numerator and denominator * is the value read from the register. If CLK_FRAC_DIVIDER_ZERO_BASED * is set then the numerator and denominator are both the value read
@@ -1002,7 +1003,7 @@ void clk_hw_unregister_fractional_divider(struct clk_hw *hw);* Clock with an adjustable multiplier affecting its output frequency. * Implements .recalc_rate, .set_rate and .round_rate * -* Flags: +* @flags: * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read * from the register, with 0 being a valid value effectively * zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 48/191 spi: nxp-fspi: use the correct ioremap function
In reply to Greg Kroah-Hartman5.10-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
@@ -685,7 +685,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 49/191 clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
In reply to Greg Kroah-Hartman5.10-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 50/191 clk: ti: Add ti_dt_clk_name() helper to use clock-output-names
In reply to Greg Kroah-Hartman5.10-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 51/191 clk: ti: Update pll and clockdomain clocks to use ti_dt_clk_name()
In reply to Greg Kroah-Hartman5.10-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 );
@@ -302,7 +304,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 52/191 clk: ti: Update component clocks to use ti_dt_clk_name()
In reply to Greg Kroah-Hartman5.10-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 53/191 clk: ti: change ti_clk_register[_omap_hw]() API
In reply to Greg Kroah-Hartman5.10-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 54/191 clk: ti: fix double free in of_ti_divider_clk_setup()
In reply to Greg Kroah-Hartman5.10-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 55/191 clk: npcm7xx: Fix incorrect kfree
In reply to Greg Kroah-Hartman5.10-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
@@ -647,7 +647,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 56/191 clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 57/191 clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 58/191 clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 59/191 clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 60/191 clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 61/191 clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
In reply to Greg Kroah-Hartman5.10-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 62/191 clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
In reply to Greg Kroah-Hartman5.10-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
@@ -110,6 +110,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 63/191 platform/x86: wmi: Fix probe failure when failing to register WMI devices
In reply to Greg Kroah-Hartman5.10-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
@@ -1157,8 +1157,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))
@@ -1169,8 +1169,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;
@@ -1191,8 +1191,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;
@@ -1231,9 +1231,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 64/191 platform/x86: wmi: remove unnecessary initializations
In reply to Greg Kroah-Hartman5.10-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
@@ -185,7 +185,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;
@@ -259,8 +259,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;
@@ -307,7 +307,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;
@@ -420,8 +420,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 ];
@@ -821,8 +821,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)
@@ -854,8 +854,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 65/191 platform/x86: wmi: Fix opening of char device
In reply to Greg Kroah-Hartman5.10-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
@@ -820,21 +820,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 66/191 hwmon: (axi-fan-control) Support temperature vs pwm points
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sá <[email protected]>
[ Upstream commit 2aee7e67bee7a5aa741bad6a0a472f108b29ad40 ]
The HW has some predefined points where it will associate a PWM value. However some users might want to better set these points to their usecases. This patch exposes these points as pwm auto_points:
* pwm1_auto_point1_temp_hyst: temperature threshold below which PWM should be 0%;
* pwm1_auto_point1_temp: temperature threshold above which PWM should be 25%;
* pwm1_auto_point2_temp_hyst: temperature threshold below which PWM should be 25%;
* pwm1_auto_point2_temp: temperature threshold above which PWM should be 50%;
* pwm1_auto_point3_temp_hyst: temperature threshold below which PWM should be 50%;
* pwm1_auto_point3_temp: temperature threshold above which PWM should be 75%;
* pwm1_auto_point4_temp_hyst: temperature threshold below which PWM should be 75%;
* pwm1_auto_point4_temp: temperature threshold above which PWM should be 100%;
Stable-dep-of: 2a5b3370a1d9 ("hwmon: (axi-fan-control) Fix possible NULL pointer dereference")
--- drivers/hwmon/axi-fan-control.c | 74 ++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-)
drivers/hwmon/axi-fan-control.c +73 -1
@@ -8,6 +8,7 @@#include <linux/clk.h> #include <linux/fpga/adi-axi-common.h> #include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/kernel.h>
@@ -23,6 +24,14 @@#define ADI_REG_PWM_PERIOD 0x00c0#define ADI_REG_TACH_MEASUR 0x00c4#define ADI_REG_TEMPERATURE 0x00c8 +#define ADI_REG_TEMP_00_H 0x0100 +#define ADI_REG_TEMP_25_L 0x0104 +#define ADI_REG_TEMP_25_H 0x0108 +#define ADI_REG_TEMP_50_L 0x010c +#define ADI_REG_TEMP_50_H 0x0110 +#define ADI_REG_TEMP_75_L 0x0114 +#define ADI_REG_TEMP_75_H 0x0118 +#define ADI_REG_TEMP_100_L 0x011c#define ADI_REG_IRQ_MASK 0x0040#define ADI_REG_IRQ_PENDING 0x0044
@@ -62,6 +71,39 @@ static inline u32 axi_ioread(const u32 reg,return ioread32 (ctl->base + reg); } +/* +* The core calculates the temperature as: +* T = /raw * 509.3140064 / 65535) - 280.2308787 +*/ +static ssize_t axi_fan_control_show (struct device *dev,struct device_attribute *da,char *buf) +{ +struct axi_fan_control_data *ctl =dev_get_drvdata (dev); +struct sensor_device_attribute *attr =to_sensor_dev_attr (da); +u32 temp =axi_ioread (attr->index, ctl); + + temp =DIV_ROUND_CLOSEST_ULL (temp *509314ULL ,65535 ) -280230 ; + +return sprintf (buf,"%u\n" , temp); +} + +static ssize_t axi_fan_control_store (struct device *dev,struct device_attribute *da, +const char *buf,size_t count) +{ +struct axi_fan_control_data *ctl =dev_get_drvdata (dev); +struct sensor_device_attribute *attr =to_sensor_dev_attr (da); +u32 temp; +int ret; + + ret =kstrtou32 (buf,10 , &temp); +if (ret) +return ret; + + temp =DIV_ROUND_CLOSEST_ULL ((temp +280230 ) *65535ULL ,509314 ); +axi_iowrite (temp, attr->index, ctl); + +return count; +} +static long axi_fan_control_get_pwm_duty (const struct axi_fan_control_data *ctl) {u32 pwm_width =axi_ioread (ADI_REG_PWM_WIDTH , ctl);
@@ -370,6 +412,36 @@ static const struct hwmon_chip_info axi_chip_info = { .info = axi_fan_control_info, }; +/* temperature threshold below which PWM should be 0% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point1_temp_hyst, axi_fan_control, ADI_REG_TEMP_00_H); +/* temperature threshold above which PWM should be 25% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point1_temp, axi_fan_control, ADI_REG_TEMP_25_L); +/* temperature threshold below which PWM should be 25% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point2_temp_hyst, axi_fan_control, ADI_REG_TEMP_25_H); +/* temperature threshold above which PWM should be 50% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point2_temp, axi_fan_control, ADI_REG_TEMP_50_L); +/* temperature threshold below which PWM should be 50% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point3_temp_hyst, axi_fan_control, ADI_REG_TEMP_50_H); +/* temperature threshold above which PWM should be 75% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point3_temp, axi_fan_control, ADI_REG_TEMP_75_L); +/* temperature threshold below which PWM should be 75% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point4_temp_hyst, axi_fan_control, ADI_REG_TEMP_75_H); +/* temperature threshold above which PWM should be 100% */ +static SENSOR_DEVICE_ATTR_RW(pwm1_auto_point4_temp, axi_fan_control, ADI_REG_TEMP_100_L); + +static struct attribute *axi_fan_control_attrs[] = { + &sensor_dev_attr_pwm1_auto_point1_temp_hyst.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point1_temp.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point2_temp_hyst.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point2_temp.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point3_temp_hyst.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point3_temp.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point4_temp_hyst.dev_attr.attr, + &sensor_dev_attr_pwm1_auto_point4_temp.dev_attr.attr, +NULL , +}; +ATTRIBUTE_GROUPS (axi_fan_control); +static const u32 version_1_0_0 =ADI_AXI_PCORE_VER (1 ,0 ,'a' );static const struct of_device_id axi_fan_control_of_match[] = {
@@ -446,7 +518,7 @@ static int axi_fan_control_probe(struct platform_device *pdev) name, ctl, &axi_chip_info, - NULL); + axi_fan_control_groups);return PTR_ERR_OR_ZERO (ctl->hdev); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 67/191 hwmon: (axi-fan-control) Fix possible NULL pointer dereference
In reply to Greg Kroah-Hartman5.10-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
@@ -495,6 +495,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;
@@ -508,19 +523,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 68/191 hwmon: (coretemp) Fix potentially truncated sysfs attribute name
In reply to Greg Kroah-Hartman5.10-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 69/191 drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
In reply to Greg Kroah-Hartman5.10-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
@@ -1533,7 +1533,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 70/191 drm/rockchip: vop: Fix call to crtc reset helper
In reply to Greg Kroah-Hartman5.10-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
@@ -1559,7 +1559,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 71/191 drm/radeon: possible buffer overflow
In reply to Greg Kroah-Hartman5.10-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
@@ -4819,14 +4819,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 72/191 drm/bridge: tc358768: Fix use of uninitialized variable
In reply to Greg Kroah-Hartman5.10-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 73/191 drm/bridge: tc358768: Disable non-continuous clock mode
In reply to Greg Kroah-Hartman5.10-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_EOT_PACKET )
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 74/191 drm/bridge: tc358768: Fix bit updates
In reply to Greg Kroah-Hartman5.10-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 75/191 drm/mediatek: Fix iommu fault during crtc enabling
In reply to Greg Kroah-Hartman5.10-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
@@ -320,6 +320,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 76/191 drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe()
In reply to Greg Kroah-Hartman5.10-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
@@ -1145,6 +1145,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 );
@@ -1185,9 +1186,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 77/191 arm64/arm: xen: enlighten: Fix KPTI checks
In reply to Greg Kroah-Hartman5.10-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
@@ -158,9 +158,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 ;
@@ -386,9 +383,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);
@@ -398,7 +392,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 ;
@@ -411,9 +411,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
@@ -144,6 +144,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 78/191 drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map()
In reply to Greg Kroah-Hartman5.10-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
@@ -38,7 +38,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 79/191 xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled
In reply to Greg Kroah-Hartman5.10-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 80/191 arm64: dts: qcom: msm8916: Fix iommu local address range
In reply to Greg Kroah-Hartman5.10-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
@@ -1175,7 +1175,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 81/191 arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
In reply to Greg Kroah-Hartman5.10-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
@@ -564,6 +564,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 82/191 ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator
In reply to Greg Kroah-Hartman5.10-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 83/191 soc: qcom: llcc: Handle a second device without data corruption
In reply to Greg Kroah-Hartman5.10-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
@@ -413,6 +413,9 @@ static int qcom_llcc_probe(struct platform_device *pdev)const struct llcc_slice_config *llcc_cfg;u32 sz; +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 84/191 firmware: ti_sci: Mark driver as non removable
In reply to Greg Kroah-Hartman5.10-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)
@@ -3510,43 +3497,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 85/191 clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
In reply to Greg Kroah-Hartman5.10-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
@@ -170,6 +170,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) sclk->info = handle->clk_ops->info_get (handle, 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 86/191 selftests/pidfd: Fix ksft print formats
In reply to Greg Kroah-Hartman5.10-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 87/191 selftests/resctrl: Ensure the benchmark commands fits to its array
In reply to Greg Kroah-Hartman5.10-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
@@ -132,9 +132,14 @@ int main(int argc, char **argv)detect_amd ();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 88/191 crypto: hisilicon/hpre - Fix a erroneous check after snprintf()
In reply to Greg Kroah-Hartman5.10-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
@@ -637,7 +637,7 @@ static int hpre_cluster_debugfs_init(struct hisi_qm *qm)for (i =0 ; i <HPRE_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 89/191 hwrng: geode - fix accessing registers
In reply to Greg Kroah-Hartman5.10-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 90/191 libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value
In reply to Greg Kroah-Hartman5.10-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 91/191 nd_btt: Make BTT lanes preemptible
In reply to Greg Kroah-Hartman5.10-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
@@ -959,7 +959,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;
@@ -978,16 +979,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 92/191 crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure
In reply to Greg Kroah-Hartman5.10-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
@@ -636,7 +636,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 93/191 crypto: caam/jr - fix Chacha20 + Poly1305 self test failure
In reply to Greg Kroah-Hartman5.10-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 94/191 crypto: qat - mask device capabilities with soft straps
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giovanni Cabiddu <[email protected]>
[ Upstream commit 7b07ed5042c5d21467af5aa055f2b49b2e661a83 ]
Enable acceleration engines (AEs) and accelerators based on soft straps and fuses. When looping with a number of AEs or accelerators, ignore the ones that are disabled.
This patch is based on earlier work done by Conor McLoughlin.
Stable-dep-of: 4e4e2ed22d50 ("crypto: qat - increase size of buffers")
--- .../crypto/qat/qat_c3xxx/adf_c3xxx_hw_data.c | 34 +++++++++++++++---- .../crypto/qat/qat_c3xxx/adf_c3xxx_hw_data.h | 1 + drivers/crypto/qat/qat_c3xxx/adf_drv.c | 6 ++-- .../qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c | 4 +-- drivers/crypto/qat/qat_c3xxxvf/adf_drv.c | 4 +-- .../crypto/qat/qat_c62x/adf_c62x_hw_data.c | 34 +++++++++++++++---- .../crypto/qat/qat_c62x/adf_c62x_hw_data.h | 1 + drivers/crypto/qat/qat_c62x/adf_drv.c | 6 ++-- .../qat/qat_c62xvf/adf_c62xvf_hw_data.c | 4 +-- drivers/crypto/qat/qat_c62xvf/adf_drv.c | 4 +-- .../crypto/qat/qat_common/adf_accel_devices.h | 5 +-- drivers/crypto/qat/qat_common/qat_hal.c | 27 ++++++++------- .../qat/qat_dh895xcc/adf_dh895xcc_hw_data.c | 20 +++++++---- drivers/crypto/qat/qat_dh895xcc/adf_drv.c | 4 +-- .../qat_dh895xccvf/adf_dh895xccvf_hw_data.c | 4 +-- drivers/crypto/qat/qat_dh895xccvf/adf_drv.c | 4 +-- 16 files changed, 109 insertions(+), 53 deletions(-)
drivers/crypto/qat/qat_c3xxx/adf_c3xxx_hw_data.c +27 -7
@@ -17,15 +17,33 @@ static struct adf_hw_device_class c3xxx_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) { -return (~fuse) >>ADF_C3XXX_ACCELERATORS_REG_OFFSET & -ADF_C3XXX_ACCELERATORS_MASK ; +u32 straps = self->straps; +u32 fuses = self->fuses; +u32 accel; + + accel = ~(fuses | straps) >>ADF_C3XXX_ACCELERATORS_REG_OFFSET ; + accel &=ADF_C3XXX_ACCELERATORS_MASK ; + +return accel; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) { -return (~fuse) &ADF_C3XXX_ACCELENGINES_MASK ; +u32 straps = self->straps; +u32 fuses = self->fuses; +unsigned long disabled; +u32 ae_disable; +int accel; + +/* If an accel is disabled, then disable the corresponding two AEs */ + disabled = ~get_accel_mask (self) &ADF_C3XXX_ACCELERATORS_MASK ; + ae_disable =BIT (1 ) |BIT (0 ); +for_each_set_bit (accel, &disabled,ADF_C3XXX_MAX_ACCELERATORS ) + straps |= ae_disable << (accel <<1 ); + +return ~(fuses | straps) &ADF_C3XXX_ACCELENGINES_MASK ; }static u32 get_num_accels (struct adf_hw_device_data *self)
@@ -109,11 +127,13 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) {struct adf_hw_device_data *hw_device = accel_dev->hw_device;struct adf_bar *misc_bar = &GET_BARS (accel_dev)[ADF_C3XXX_PMISC_BAR ]; +unsigned long accel_mask = hw_device->accel_mask; +unsigned long ae_mask = hw_device->ae_mask;void __iomem *csr = misc_bar->virt_addr;unsigned int val, i;/* Enable Accel Engine error detection & correction */ -for (i =0 ; i < hw_device->get_num_aes (hw_device); i++) { +for_each_set_bit (i, &ae_mask,GET_MAX_ACCELENGINES (accel_dev)) { val =ADF_CSR_RD (csr,ADF_C3XXX_AE_CTX_ENABLES (i)); val |=ADF_C3XXX_ENABLE_AE_ECC_ERR ;ADF_CSR_WR (csr,ADF_C3XXX_AE_CTX_ENABLES (i), val);
@@ -123,7 +143,7 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) }/* Enable shared memory error detection & correction */ -for (i =0 ; i < hw_device->get_num_accels (hw_device); i++) { +for_each_set_bit (i, &accel_mask,ADF_C3XXX_MAX_ACCELERATORS ) { val =ADF_CSR_RD (csr,ADF_C3XXX_UERRSSMSH (i)); val |=ADF_C3XXX_ERRSSMSH_EN ;ADF_CSR_WR (csr,ADF_C3XXX_UERRSSMSH (i), val);
drivers/crypto/qat/qat_c3xxx/adf_c3xxx_hw_data.h +1 -0
@@ -18,6 +18,7 @@#define ADF_C3XXX_SMIAPF1_MASK_OFFSET (0x3A000 + 0x30)#define ADF_C3XXX_SMIA0_MASK 0xFFFF#define ADF_C3XXX_SMIA1_MASK 0x1 +#define ADF_C3XXX_SOFTSTRAP_CSR_OFFSET 0x2EC/* Error detection and correction */ #define ADF_C3XXX_AE_CTX_ENABLES (i) (i * 0x1000 + 0x20818)#define ADF_C3XXX_AE_MISC_CONTROL (i) (i * 0x1000 + 0x20960)
drivers/crypto/qat/qat_c3xxx/adf_drv.c +4 -2
@@ -126,10 +126,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)pci_read_config_byte (pdev,PCI_REVISION_ID , &accel_pci_dev->revid);pci_read_config_dword (pdev,ADF_DEVICE_FUSECTL_OFFSET , &hw_data->fuses); +pci_read_config_dword (pdev,ADF_C3XXX_SOFTSTRAP_CSR_OFFSET , + &hw_data->straps);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* If the device has no acceleration engines then ignore it. */ if (!hw_data->accel_mask || !hw_data->ae_mask ||
drivers/crypto/qat/qat_c3xxxvf/adf_c3xxxvf_hw_data.c +2 -2
@@ -11,12 +11,12 @@ static struct adf_hw_device_class c3xxxiov_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) {return ADF_C3XXXIOV_ACCELERATORS_MASK ; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) {return ADF_C3XXXIOV_ACCELENGINES_MASK ; }
drivers/crypto/qat/qat_c3xxxvf/adf_drv.c +2 -2
@@ -119,8 +119,8 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)adf_init_hw_data_c3xxxiov (accel_dev->hw_device);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* Create dev top level debugfs entry */
drivers/crypto/qat/qat_c62x/adf_c62x_hw_data.c +27 -7
@@ -22,15 +22,33 @@ static struct adf_hw_device_class c62x_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) { -return (~fuse) >>ADF_C62X_ACCELERATORS_REG_OFFSET & -ADF_C62X_ACCELERATORS_MASK ; +u32 straps = self->straps; +u32 fuses = self->fuses; +u32 accel; + + accel = ~(fuses | straps) >>ADF_C62X_ACCELERATORS_REG_OFFSET ; + accel &=ADF_C62X_ACCELERATORS_MASK ; + +return accel; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) { -return (~fuse) &ADF_C62X_ACCELENGINES_MASK ; +u32 straps = self->straps; +u32 fuses = self->fuses; +unsigned long disabled; +u32 ae_disable; +int accel; + +/* If an accel is disabled, then disable the corresponding two AEs */ + disabled = ~get_accel_mask (self) &ADF_C62X_ACCELERATORS_MASK ; + ae_disable =BIT (1 ) |BIT (0 ); +for_each_set_bit (accel, &disabled,ADF_C62X_MAX_ACCELERATORS ) + straps |= ae_disable << (accel <<1 ); + +return ~(fuses | straps) &ADF_C62X_ACCELENGINES_MASK ; }static u32 get_num_accels (struct adf_hw_device_data *self)
@@ -119,11 +137,13 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) {struct adf_hw_device_data *hw_device = accel_dev->hw_device;struct adf_bar *misc_bar = &GET_BARS (accel_dev)[ADF_C62X_PMISC_BAR ]; +unsigned long accel_mask = hw_device->accel_mask; +unsigned long ae_mask = hw_device->ae_mask;void __iomem *csr = misc_bar->virt_addr;unsigned int val, i;/* Enable Accel Engine error detection & correction */ -for (i =0 ; i < hw_device->get_num_aes (hw_device); i++) { +for_each_set_bit (i, &ae_mask,GET_MAX_ACCELENGINES (accel_dev)) { val =ADF_CSR_RD (csr,ADF_C62X_AE_CTX_ENABLES (i)); val |=ADF_C62X_ENABLE_AE_ECC_ERR ;ADF_CSR_WR (csr,ADF_C62X_AE_CTX_ENABLES (i), val);
@@ -133,7 +153,7 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) }/* Enable shared memory error detection & correction */ -for (i =0 ; i < hw_device->get_num_accels (hw_device); i++) { +for_each_set_bit (i, &accel_mask,ADF_C62X_MAX_ACCELERATORS ) { val =ADF_CSR_RD (csr,ADF_C62X_UERRSSMSH (i)); val |=ADF_C62X_ERRSSMSH_EN ;ADF_CSR_WR (csr,ADF_C62X_UERRSSMSH (i), val);
drivers/crypto/qat/qat_c62x/adf_c62x_hw_data.h +1 -0
@@ -19,6 +19,7 @@#define ADF_C62X_SMIAPF1_MASK_OFFSET (0x3A000 + 0x30)#define ADF_C62X_SMIA0_MASK 0xFFFF#define ADF_C62X_SMIA1_MASK 0x1 +#define ADF_C62X_SOFTSTRAP_CSR_OFFSET 0x2EC/* Error detection and correction */ #define ADF_C62X_AE_CTX_ENABLES (i) (i * 0x1000 + 0x20818)#define ADF_C62X_AE_MISC_CONTROL (i) (i * 0x1000 + 0x20960)
drivers/crypto/qat/qat_c62x/adf_drv.c +4 -2
@@ -126,10 +126,12 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)pci_read_config_byte (pdev,PCI_REVISION_ID , &accel_pci_dev->revid);pci_read_config_dword (pdev,ADF_DEVICE_FUSECTL_OFFSET , &hw_data->fuses); +pci_read_config_dword (pdev,ADF_C62X_SOFTSTRAP_CSR_OFFSET , + &hw_data->straps);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* If the device has no acceleration engines then ignore it. */ if (!hw_data->accel_mask || !hw_data->ae_mask ||
drivers/crypto/qat/qat_c62xvf/adf_c62xvf_hw_data.c +2 -2
@@ -11,12 +11,12 @@ static struct adf_hw_device_class c62xiov_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) {return ADF_C62XIOV_ACCELERATORS_MASK ; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) {return ADF_C62XIOV_ACCELENGINES_MASK ; }
drivers/crypto/qat/qat_c62xvf/adf_drv.c +2 -2
@@ -119,8 +119,8 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)adf_init_hw_data_c62xiov (accel_dev->hw_device);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* Create dev top level debugfs entry */
drivers/crypto/qat/qat_common/adf_accel_devices.h +3 -2
@@ -104,8 +104,8 @@ struct adf_etr_ring_data;struct adf_hw_device_data {struct adf_hw_device_class *dev_class; -u32 (*get_accel_mask)(u32 fuse); -u32 (*get_ae_mask)(u32 fuse); +u32 (*get_accel_mask)(struct adf_hw_device_data *self); +u32 (*get_ae_mask)(struct adf_hw_device_data *self);u32 (*get_sram_bar_id)(struct adf_hw_device_data *self);u32 (*get_misc_bar_id)(struct adf_hw_device_data *self);u32 (*get_etr_bar_id)(struct adf_hw_device_data *self);
@@ -131,6 +131,7 @@ struct adf_hw_device_data {const char *fw_name;const char *fw_mmp_name;u32 fuses; +u32 straps;u32 accel_capabilities_mask;u32 instance_id;u16 accel_mask;
drivers/crypto/qat/qat_common/qat_hal.c +15 -12
@@ -346,11 +346,12 @@ static void qat_hal_put_wakeup_event(struct icp_qat_fw_loader_handle *handle,static int qat_hal_check_ae_alive (struct icp_qat_fw_loader_handle *handle) { +unsigned long ae_mask = handle->hal_handle->ae_mask;unsigned int base_cnt, cur_cnt;unsigned char ae;int times =MAX_RETRY_TIMES ; -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) { base_cnt =qat_hal_rd_ae_csr (handle, ae,PROFILE_COUNT ); base_cnt &=0xffff ;
@@ -384,6 +385,7 @@ int qat_hal_check_ae_active(struct icp_qat_fw_loader_handle *handle,static void qat_hal_reset_timestamp (struct icp_qat_fw_loader_handle *handle) { +unsigned long ae_mask = handle->hal_handle->ae_mask;unsigned int misc_ctl;unsigned char ae;
@@ -393,7 +395,7 @@ static void qat_hal_reset_timestamp(struct icp_qat_fw_loader_handle *handle)SET_GLB_CSR (handle,MISC_CONTROL , misc_ctl & (~MC_TIMESTAMP_ENABLE )); -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) {qat_hal_wr_ae_csr (handle, ae,TIMESTAMP_LOW ,0 );qat_hal_wr_ae_csr (handle, ae,TIMESTAMP_HIGH ,0 ); }
@@ -438,6 +440,7 @@ static int qat_hal_init_esram(struct icp_qat_fw_loader_handle *handle)#define SHRAM_INIT_CYCLES 2060int qat_hal_clr_reset (struct icp_qat_fw_loader_handle *handle) { +unsigned long ae_mask = handle->hal_handle->ae_mask;unsigned int ae_reset_csr;unsigned char ae;unsigned int clk_csr;
@@ -464,7 +467,7 @@ int qat_hal_clr_reset(struct icp_qat_fw_loader_handle *handle) goto out_err;/* Set undefined power-up/reset states to reasonable default values */ -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) {qat_hal_wr_ae_csr (handle, ae,CTX_ENABLES ,INIT_CTX_ENABLE_VALUE ); qat_hal_wr_indr_csr(handle, ae, ICP_QAT_UCLO_AE_ALL_CTX,
@@ -570,10 +573,11 @@ static void qat_hal_enable_ctx(struct icp_qat_fw_loader_handle *handle,static void qat_hal_clear_xfer (struct icp_qat_fw_loader_handle *handle) { +unsigned long ae_mask = handle->hal_handle->ae_mask;unsigned char ae;unsigned short reg; -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) {for (reg =0 ; reg <ICP_QAT_UCLO_MAX_GPR_REG ; reg++) {qat_hal_init_rd_xfer (handle, ae,0 ,ICP_SR_RD_ABS , reg,0 );
@@ -585,6 +589,7 @@ static void qat_hal_clear_xfer(struct icp_qat_fw_loader_handle *handle)static int qat_hal_clear_gpr (struct icp_qat_fw_loader_handle *handle) { +unsigned long ae_mask = handle->hal_handle->ae_mask;unsigned char ae;unsigned int ctx_mask =ICP_QAT_UCLO_AE_ALL_CTX ;int times =MAX_RETRY_TIMES ;
@@ -592,7 +597,7 @@ static int qat_hal_clear_gpr(struct icp_qat_fw_loader_handle *handle)unsigned int savctx =0 ;int ret =0 ; -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) { csr_val =qat_hal_rd_ae_csr (handle, ae,AE_MISC_CONTROL ); csr_val &= ~(1 <<MMC_SHARE_CS_BITPOS );qat_hal_wr_ae_csr (handle, ae,AE_MISC_CONTROL , csr_val);
@@ -613,7 +618,7 @@ static int qat_hal_clear_gpr(struct icp_qat_fw_loader_handle *handle)qat_hal_wr_ae_csr (handle, ae,CTX_SIG_EVENTS_ACTIVE ,0 );qat_hal_enable_ctx (handle, ae, ctx_mask); } -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) {/* wait for AE to finish */ do { ret = qat_hal_wait_cycles(handle, ae, 20, 1);
@@ -654,6 +659,8 @@ int qat_hal_init(struct adf_accel_dev *accel_dev)struct adf_hw_device_data *hw_data = accel_dev->hw_device;struct adf_bar *misc_bar = &pci_info->pci_bars[hw_data->get_misc_bar_id (hw_data)]; +unsigned long ae_mask = hw_data->ae_mask; +unsigned int csr_val =0 ;struct adf_bar *sram_bar; handle =kzalloc (sizeof (*handle),GFP_KERNEL );
@@ -689,9 +696,7 @@ int qat_hal_init(struct adf_accel_dev *accel_dev)/* create AE objects */ handle->hal_handle->upc_mask =0x1ffff ; handle->hal_handle->max_ustore =0x4000 ; -for (ae =0 ; ae <ICP_QAT_UCLO_MAX_AE ; ae++) { -if (!(hw_data->ae_mask & (1 << ae))) -continue ; +for_each_set_bit (ae, &ae_mask,ICP_QAT_UCLO_MAX_AE ) { handle->hal_handle->aes[ae].free_addr =0 ; handle->hal_handle->aes[ae].free_size = handle->hal_handle->max_ustore;
@@ -714,9 +719,7 @@ int qat_hal_init(struct adf_accel_dev *accel_dev) }/* Set SIGNATURE_ENABLE[0] to 0x1 in order to enable ALU_OUT csr */ -for (ae =0 ; ae < handle->hal_handle->ae_max_num; ae++) { -unsigned int csr_val =0 ; - +for_each_set_bit (ae, &ae_mask, handle->hal_handle->ae_max_num) { csr_val =qat_hal_rd_ae_csr (handle, ae,SIGNATURE_ENABLE ); csr_val |=0x1 ;qat_hal_wr_ae_csr (handle, ae,SIGNATURE_ENABLE , csr_val);
drivers/crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c +13 -7
@@ -24,15 +24,19 @@ static struct adf_hw_device_class dh895xcc_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) { -return (~fuse) >>ADF_DH895XCC_ACCELERATORS_REG_OFFSET & -ADF_DH895XCC_ACCELERATORS_MASK ; +u32 fuses = self->fuses; + +return ~fuses >>ADF_DH895XCC_ACCELERATORS_REG_OFFSET & +ADF_DH895XCC_ACCELERATORS_MASK ; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) { -return (~fuse) &ADF_DH895XCC_ACCELENGINES_MASK ; +u32 fuses = self->fuses; + +return ~fuses &ADF_DH895XCC_ACCELENGINES_MASK ; }static u32 get_num_accels (struct adf_hw_device_data *self)
@@ -131,11 +135,13 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) {struct adf_hw_device_data *hw_device = accel_dev->hw_device;struct adf_bar *misc_bar = &GET_BARS (accel_dev)[ADF_DH895XCC_PMISC_BAR ]; +unsigned long accel_mask = hw_device->accel_mask; +unsigned long ae_mask = hw_device->ae_mask;void __iomem *csr = misc_bar->virt_addr;unsigned int val, i;/* Enable Accel Engine error detection & correction */ -for (i =0 ; i < hw_device->get_num_aes (hw_device); i++) { +for_each_set_bit (i, &ae_mask,GET_MAX_ACCELENGINES (accel_dev)) { val =ADF_CSR_RD (csr,ADF_DH895XCC_AE_CTX_ENABLES (i)); val |=ADF_DH895XCC_ENABLE_AE_ECC_ERR ;ADF_CSR_WR (csr,ADF_DH895XCC_AE_CTX_ENABLES (i), val);
@@ -145,7 +151,7 @@ static void adf_enable_error_correction(struct adf_accel_dev *accel_dev) }/* Enable shared memory error detection & correction */ -for (i =0 ; i < hw_device->get_num_accels (hw_device); i++) { +for_each_set_bit (i, &accel_mask,ADF_DH895XCC_MAX_ACCELERATORS ) { val =ADF_CSR_RD (csr,ADF_DH895XCC_UERRSSMSH (i)); val |=ADF_DH895XCC_ERRSSMSH_EN ;ADF_CSR_WR (csr,ADF_DH895XCC_UERRSSMSH (i), val);
drivers/crypto/qat/qat_dh895xcc/adf_drv.c +2 -2
@@ -128,8 +128,8 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) &hw_data->fuses);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* If the device has no acceleration engines then ignore it. */ if (!hw_data->accel_mask || !hw_data->ae_mask ||
drivers/crypto/qat/qat_dh895xccvf/adf_dh895xccvf_hw_data.c +2 -2
@@ -11,12 +11,12 @@ static struct adf_hw_device_class dh895xcciov_class = { .instances = 0 }; -static u32 get_accel_mask (u32 fuse) +static u32 get_accel_mask (struct adf_hw_device_data *self) {return ADF_DH895XCCIOV_ACCELERATORS_MASK ; } -static u32 get_ae_mask (u32 fuse) +static u32 get_ae_mask (struct adf_hw_device_data *self) {return ADF_DH895XCCIOV_ACCELENGINES_MASK ; }
drivers/crypto/qat/qat_dh895xccvf/adf_drv.c +2 -2
@@ -119,8 +119,8 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)adf_init_hw_data_dh895xcciov (accel_dev->hw_device);/* Get Accelerators and Accelerators Engines masks */ - hw_data->accel_mask = hw_data->get_accel_mask (hw_data->fuses); - hw_data->ae_mask = hw_data->get_ae_mask (hw_data->fuses); + hw_data->accel_mask = hw_data->get_accel_mask (hw_data); + hw_data->ae_mask = hw_data->get_ae_mask (hw_data); accel_pci_dev->sku = hw_data->get_sku (hw_data);/* Create dev top level debugfs entry */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 95/191 crypto: qat - increase size of buffers
In reply to Greg Kroah-Hartman5.10-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
@@ -23,7 +23,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
@@ -89,7 +89,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)
@@ -184,7 +184,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 96/191 hid: cp2112: Fix duplicate workqueue initialization
In reply to Greg Kroah-Hartman5.10-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 97/191 ARM: 9321/1: memset: cast the constant byte to unsigned char
In reply to Greg Kroah-Hartman5.10-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
@@ -16,6 +16,7 @@ ENTRY(mmioset) ENTRY(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 98/191 ext4: move ix sanity check to corrent position
In reply to Greg Kroah-Hartman5.10-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
@@ -1003,6 +1003,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 ) {
@@ -1012,11 +1017,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 99/191 ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
In reply to Greg Kroah-Hartman5.10-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
@@ -107,6 +107,9 @@ static int psc_dma_hw_free(struct snd_soc_component *component,/** * 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 100/191 IB/mlx5: Fix rdma counter binding for RAW QP
In reply to Greg Kroah-Hartman5.10-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
@@ -3714,6 +3714,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) {
@@ -3729,6 +3753,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 101/191 RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common()
In reply to Greg Kroah-Hartman5.10-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
@@ -906,7 +906,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 102/191 RDMA/hns: Fix signed-unsigned mixed comparisons
In reply to Greg Kroah-Hartman5.10-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
@@ -247,7 +247,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 103/191 ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
In reply to Greg Kroah-Hartman5.10-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
@@ -1971,17 +1971,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 104/191 scsi: ufs: core: Leave space for \0 in utf8 desc string
In reply to Greg Kroah-Hartman5.10-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
@@ -3339,7 +3339,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 105/191 RDMA/hfi1: Workaround truncation compilation error
In reply to Greg Kroah-Hartman5.10-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
@@ -152,7 +152,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 106/191 hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip
In reply to Greg Kroah-Hartman5.10-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 107/191 sh: bios: Revive earlyprintk support
In reply to Greg Kroah-Hartman5.10-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
@@ -25,6 +25,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 108/191 Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures"
In reply to Greg Kroah-Hartman5.10-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,
@@ -3851,11 +3846,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 109/191 HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk
In reply to Greg Kroah-Hartman5.10-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
@@ -61,7 +61,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)
@@ -80,8 +80,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)
@@ -3702,7 +3700,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 ;
@@ -3935,7 +3933,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 110/191 HID: logitech-hidpp: Dont restart IO, instead defer hid_connect() only
In reply to Greg Kroah-Hartman5.10-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
@@ -3869,8 +3869,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) {
@@ -3928,19 +3930,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; } }
@@ -3952,6 +3949,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 111/191 HID: logitech-hidpp: Revert "Dont restart communication if not necessary"
In reply to Greg Kroah-Hartman5.10-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
@@ -3803,7 +3803,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 );
@@ -3854,10 +3853,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);
@@ -3874,7 +3869,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;
@@ -3913,7 +3908,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 )) {
@@ -3929,16 +3923,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
Greg Kroah-Hartman
maintainerPATCH 112/191 HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit ba9de350509504fb748837b71e23d7e84c83d93c ]
Calling get_wireless_feature_index() from probe() causes the wireless_feature_index to only get set for unifying devices which are already connected at probe() time. It does not get set for devices which connect later.
Fix this by moving get_wireless_feature_index() to hidpp_connect_event(), this does not make a difference for devices connected at probe() since probe() will queue the hidpp_connect_event() for those at probe time.
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 | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/hid/hid-logitech-hidpp.c +9 -11
@@ -1488,15 +1488,14 @@ static int hidpp_battery_get_property(struct power_supply *psy,/* -------------------------------------------------------------------------- */ #define HIDPP_PAGE_WIRELESS_DEVICE_STATUS 0x1d4b -static int hidpp_set_wireless_feature_index (struct hidpp_device *hidpp) +static int hidpp_get_wireless_feature_index (struct hidpp_device *hidpp,u8 *feature_index) {u8 feature_type;int ret; ret =hidpp_root_get_feature (hidpp,HIDPP_PAGE_WIRELESS_DEVICE_STATUS , - &hidpp->wireless_feature_index, - &feature_type); + feature_index, &feature_type);return ret; }
@@ -3666,6 +3665,13 @@ static void hidpp_connect_event(struct hidpp_device *hidpp) } } +if (hidpp->protocol_major >=2 ) { +u8 feature_index; + +if (!hidpp_get_wireless_feature_index (hidpp, &feature_index)) + hidpp->wireless_feature_index = feature_index; + } +if (hidpp->name == hdev->name && hidpp->protocol_major >=2 ) { name =hidpp_get_device_name (hidpp);if (name) {
@@ -3902,14 +3908,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)hidpp_overwrite_name (hdev); } -if (connected && hidpp->protocol_major >=2 ) { - ret =hidpp_set_wireless_feature_index (hidpp); -if (ret == -ENOENT ) - hidpp->wireless_feature_index =0 ; -else if (ret) - goto hid_hw_init_fail; - } -if (connected && (hidpp->quirks &HIDPP_QUIRK_CLASS_WTP )) { ret =wtp_get_config (hidpp);if (ret)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 113/191 ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cezary Rojewski <[email protected]>
[ Upstream commit 168d97844a61db302dec76d44406e9d4d7106b8e ]
Error path in snd_skl_parse_uuids() shall free last allocated module if its instance_id allocation fails.
--- sound/soc/intel/skylake/skl-sst-utils.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/intel/skylake/skl-sst-utils.c +1 -0
@@ -299,6 +299,7 @@ int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw, module->instance_id =devm_kzalloc (ctx->dev, size,GFP_KERNEL );if (!module->instance_id) { ret = -ENOMEM ; +kfree (module); goto free_uuid_list; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 114/191 padata: Convert from atomic_t to refcount_t on parallel_data->refcnt
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiyu Yang <[email protected]>
[ Upstream commit d5ee8e750c9449e9849a09ce6fb6b8adeaa66adc ]
refcount_t type and corresponding API can protect refcounters from accidental underflow and overflow and further use-after-free situations.
Stable-dep-of: 7ddc21e317b3 ("padata: Fix refcnt handling in padata_free_shell()")
--- include/linux/padata.h | 3 ++- kernel/padata.c | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-)
include/linux/padata.h +2 -1
@@ -12,6 +12,7 @@#ifndef PADATA_H #define PADATA_H +#include <linux/refcount.h> #include <linux/compiler_types.h> #include <linux/workqueue.h> #include <linux/spinlock.h>
@@ -96,7 +97,7 @@ struct parallel_data {struct padata_shell *ps;struct padata_list __percpu *reorder_list;struct padata_serial_queue __percpu *squeue; -atomic_t refcnt; +refcount_t refcnt;unsigned int seq_nr;unsigned int processed;int cpu;
kernel/padata.c +4 -4
@@ -211,7 +211,7 @@ int padata_do_parallel(struct padata_shell *ps,if ((pinst->flags &PADATA_RESET )) goto out; -atomic_inc (&pd->refcnt); +refcount_inc (&pd->refcnt); padata->pd = pd; padata->cb_cpu = *cb_cpu;
@@ -385,7 +385,7 @@ static void padata_serial_worker(struct work_struct *serial_work) }local_bh_enable (); -if (atomic_sub_and_test (cnt, &pd->refcnt)) +if (refcount_sub_and_test (cnt, &pd->refcnt))padata_free_pd (pd); }
@@ -598,7 +598,7 @@ static struct parallel_data *padata_alloc_pd(struct padata_shell *ps)padata_init_reorder_list (pd);padata_init_squeues (pd); pd->seq_nr =-1 ; -atomic_set (&pd->refcnt,1 ); +refcount_set (&pd->refcnt,1 );spin_lock_init (&pd->lock); pd->cpu =cpumask_first (pd->cpumask.pcpu);INIT_WORK (&pd->reorder_work, invoke_padata_reorder);
@@ -672,7 +672,7 @@ static int padata_replace(struct padata_instance *pinst)synchronize_rcu ();list_for_each_entry_continue_reverse (ps, &pinst->pslist, list) -if (atomic_dec_and_test (&ps->opd->refcnt)) +if (refcount_dec_and_test (&ps->opd->refcnt))padata_free_pd (ps->opd); pinst->flags &= ~PADATA_RESET ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 115/191 padata: Fix refcnt handling in padata_free_shell()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: WangJinchao <[email protected]>
[ Upstream commit 7ddc21e317b360c3444de3023bcc83b85fabae2f ]
In a high-load arm64 environment, the pcrypt_aead01 test in LTP can lead to system UAF (Use-After-Free) issues. Due to the lengthy analysis of the pcrypt_aead01 function call, I'll describe the problem scenario using a simplified model:
Suppose there's a user of padata named user_function that adheres to the padata requirement of calling padata_free_shell after serial() has been invoked, as demonstrated in the following code:
```c
struct request {
struct padata_priv padata;
struct completion *done;
};
void parallel(struct padata_priv *padata) {
do_something();
}
void serial(struct padata_priv *padata) {
struct request *request = container_of(padata,
struct request,
padata);
complete(request->done);
}
void user_function() {
DECLARE_COMPLETION(done)
padata->parallel = parallel;
padata->serial = serial;
padata_do_parallel();
wait_for_completion(&done);
padata_free_shell();
}
```In the corresponding padata.c file, there's the following code:
```c
static void padata_serial_worker(struct work_struct *serial_work) {
...
cnt = 0;
while (!list_empty(&local_list)) {
...
padata->serial(padata);
cnt++;
}
local_bh_enable();
if (refcount_sub_and_test(cnt, &pd->refcnt))
padata_free_pd(pd);
}
```Because of the high system load and the accumulation of unexecuted softirq at this moment, local_bh_enable() in padata takes longer to execute than usual. Subsequently, when accessing pd->refcnt, pd has already been released by padata_free_shell(), resulting in a UAF issue with pd->refcnt.
The fix is straightforward: add refcount_dec_and_test before calling padata_free_pd in padata_free_shell.
--- kernel/padata.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
kernel/padata.c +5 -1
@@ -1107,12 +1107,16 @@ EXPORT_SYMBOL(padata_alloc_shell);*/ void padata_free_shell (struct padata_shell *ps) { +struct parallel_data *pd; +if (!ps)return ;mutex_lock (&ps->pinst->lock);list_del (&ps->list); -padata_free_pd (rcu_dereference_protected (ps->pd,1 )); + pd =rcu_dereference_protected (ps->pd,1 ); +if (refcount_dec_and_test (&pd->refcnt)) +padata_free_pd (pd);mutex_unlock (&ps->pinst->lock);kfree (ps);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 116/191 ASoC: ams-delta.c: use component after check
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuninori Morimoto <[email protected]>
[ Upstream commit bd0f7498bc9084d8cccc5484cd004b40f314b763 ]
static void cx81801_close()
{
...
(A) struct snd_soc_dapm_context *dapm = &component->card->dapm;
...
(B) if (!component)
return;
}(A) uses component before NULL check (B). This patch moves it after (B).
--- sound/soc/ti/ams-delta.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/soc/ti/ams-delta.c +3 -1
@@ -303,7 +303,7 @@ static int cx81801_open(struct tty_struct *tty)static void cx81801_close (struct tty_struct *tty) {struct snd_soc_component *component = tty->disc_data; -struct snd_soc_dapm_context *dapm = &component->card->dapm; +struct snd_soc_dapm_context *dapm;del_timer_sync (&cx81801_timer);
@@ -315,6 +315,8 @@ static void cx81801_close(struct tty_struct *tty) v253_ops.close (tty); + dapm = &component->card->dapm; +/* Revert back to default audio input/output constellation */ snd_soc_dapm_mutex_lock (dapm);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 117/191 mfd: core: Un-constify mfd_cell.of_reg
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michał Mirosław <[email protected]>
[ Upstream commit 3c70342f1f0045dc827bb2f02d814ce31e0e0d05 ]
Enable dynamically filling in the whole mfd_cell structure. All other fields already allow that.
--- include/linux/mfd/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/mfd/core.h +1 -1
@@ -92,7 +92,7 @@ struct mfd_cell {* (above) when matching OF nodes with devices that have identical * compatible strings */ -const u64 of_reg; +u64 of_reg;/* Set to 'true' to use 'of_reg' (above) - allows for of_reg=0 */ bool use_of_reg;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 118/191 mfd: core: Ensure disabled devices are skipped without aborting
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herve Codina <[email protected]>
[ Upstream commit 7ba7bdef4d14e3722e2842da3b48cbadb73e52d6 ]
The loop searching for a matching device based on its compatible string is aborted when a matching disabled device is found. This abort prevents to add devices as soon as one disabled device is found.
Continue searching for an other device instead of aborting on the first disabled one fixes the issue.
--- drivers/mfd/mfd-core.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/mfd/mfd-core.c +12 -5
@@ -171,6 +171,7 @@ static int mfd_add_device(struct device *parent, int id,struct platform_device *pdev;struct device_node *np =NULL ;struct mfd_of_node_entry *of_entry, *tmp; +bool disabled = false;int ret = -ENOMEM ;int platform_id;int r;
@@ -208,11 +209,10 @@ static int mfd_add_device(struct device *parent, int id,if (IS_ENABLED (CONFIG_OF ) && parent->of_node && cell->of_compatible) {for_each_child_of_node (parent->of_node, np) {if (of_device_is_compatible (np, cell->of_compatible)) { -/* Ignore 'disabled' devices error free */ +/* Skip 'disabled' devices */ if (!of_device_is_available (np)) { -of_node_put (np); - ret =0 ; - goto fail_alias; + disabled = true; +continue ; } ret =mfd_match_of_node_to_dev (pdev, np, cell);
@@ -222,10 +222,17 @@ static int mfd_add_device(struct device *parent, int id,if (ret) goto fail_alias; -break ; + goto match; } } +if (disabled) { +/* Ignore 'disabled' devices error free */ + ret =0 ; + goto fail_alias; + } + +match:if (!pdev->dev.of_node)pr_warn ("%s: Failed to locate of_node [id: %d]\n" , cell->name, platform_id);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 119/191 mfd: dln2: Fix double put in dln2_probe
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dinghao Liu <[email protected]>
[ Upstream commit 759c409bc5fc496cbc22cd0b392d3cbb0c0e23eb ]
The dln2_free() already contains usb_put_dev(). Therefore, the redundant usb_put_dev() before dln2_free() may lead to a double free.
--- drivers/mfd/dln2.c | 1 - 1 file changed, 1 deletion(-)
drivers/mfd/dln2.c +0 -1
@@ -836,7 +836,6 @@ static int dln2_probe(struct usb_interface *interface,dln2_stop_rx_urbs (dln2); out_free: -usb_put_dev (dln2->usb_dev);dln2_free (dln2);return ret;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 120/191 leds: pwm: Dont disable the PWM when the LED should be off
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 76fe464c8e64e71b2e4af11edeef0e5d85eeb6aa ]
Disabling a PWM (i.e. calling pwm_apply_state with .enabled = false) gives no guarantees what the PWM output does. It might freeze where it currently is, or go in a High-Z state or drive the active or inactive state, it might even continue to toggle.
To ensure that the LED gets really disabled, don't disable the PWM even when .duty_cycle is zero.
This fixes disabling a leds-pwm LED on i.MX28. The PWM on this SoC is one of those that freezes its output on disable, so if you disable an LED that is full on, it stays on. If you disable a LED with half brightness it goes off in 50% of the cases and full on in the other 50%.
--- drivers/leds/leds-pwm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/leds/leds-pwm.c +1 -1
@@ -51,7 +51,7 @@ static int led_pwm_set(struct led_classdev *led_cdev, duty = led_dat->pwmstate.period - duty; led_dat->pwmstate.duty_cycle = duty; - led_dat->pwmstate.enabled = duty >0 ; + led_dat->pwmstate.enabled = true;return pwm_apply_state (led_dat->pwm, &led_dat->pwmstate); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 121/191 leds: trigger: ledtrig-cpu:: Fix output may be truncated issue for cpu
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit ff50f53276131a3059e8307d11293af388ed2bcd ]
In order to teach the compiler that 'trig->name' will never be truncated, we need to tell it that 'cpu' is not negative.
When building with W=1, this fixes the following warnings:
drivers/leds/trigger/ledtrig-cpu.c: In function ‘ledtrig_cpu_init’:
drivers/leds/trigger/ledtrig-cpu.c:155:56: error: ‘%d’ directive output may be truncated writing between 1 and 11 bytes into a region of size 5 [-Werror=format-truncation=]
155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu);
| ^~
drivers/leds/trigger/ledtrig-cpu.c:155:52: note: directive argument in the range [-2147483648, 7]
155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu);
| ^~~~~~~
drivers/leds/trigger/ledtrig-cpu.c:155:17: note: ‘snprintf’ output between 5 and 15 bytes into a destination of size 8
155 | snprintf(trig->name, MAX_NAME_LEN, "cpu%d", cpu);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--- drivers/leds/trigger/ledtrig-cpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/leds/trigger/ledtrig-cpu.c +2 -2
@@ -130,7 +130,7 @@ static int ledtrig_prepare_down_cpu(unsigned int cpu)static int __init ledtrig_cpu_init (void ) { -int cpu; +unsigned int cpu;int ret;/* Supports up to 9999 cpu cores */
@@ -152,7 +152,7 @@ static int __init ledtrig_cpu_init(void)if (cpu >=8 )continue ; -snprintf (trig->name,MAX_NAME_LEN ,"cpu%d" , cpu); +snprintf (trig->name,MAX_NAME_LEN ,"cpu%u" , cpu);led_trigger_register_simple (trig->name, &trig->_trig); }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 122/191 tty: tty_jobctrl: fix pid memleak in disassociate_ctty()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yi Yang <[email protected]>
[ Upstream commit 11e7f27b79757b6586645d87b95d5b78375ecdfc ]
There is a pid leakage:
------------------------------
unreferenced object 0xffff88810c181940 (size 224):
comm "sshd", pid 8191, jiffies 4294946950 (age 524.570s) hex dump (first 32 bytes):
01 00 00 00 00 00 00 00 00 00 00 00 ad 4e ad de .............N.. ff ff ff ff 6b 6b 6b 6b ff ff ff ff ff ff ff ff ....kkkk........
backtrace:
[<ffffffff814774e6>] kmem_cache_alloc+0x5c6/0x9b0
[<ffffffff81177342>] alloc_pid+0x72/0x570
[<ffffffff81140ac4>] copy_process+0x1374/0x2470
[<ffffffff81141d77>] kernel_clone+0xb7/0x900
[<ffffffff81142645>] __se_sys_clone+0x85/0xb0
[<ffffffff8114269b>] __x64_sys_clone+0x2b/0x30
[<ffffffff83965a72>] do_syscall_64+0x32/0x80
[<ffffffff83a00085>] entry_SYSCALL_64_after_hwframe+0x61/0xc6It turns out that there is a race condition between disassociate_ctty() and tty_signal_session_leader(), which caused this leakage.
The pid memleak is triggered by the following race:
task[sshd] task[bash]
----------------------- -----------------------
disassociate_ctty();
spin_lock_irq(¤t->sighand->siglock);
put_pid(current->signal->tty_old_pgrp);
current->signal->tty_old_pgrp = NULL;
tty = tty_kref_get(current->signal->tty);
spin_unlock_irq(¤t->sighand->siglock);tty_vhangup();tty_lock(tty);
...tty_signal_session_leader(); spin_lock_irq(&p->sighand->siglock);
...
if (tty->ctrl.pgrp) //tty->ctrl.pgrp is not NULL p->signal->tty_old_pgrp = get_pid(tty->ctrl.pgrp); //An extra get spin_unlock_irq(&p->sighand->siglock);
...
tty_unlock(tty);
if (tty) {
tty_lock(tty);
...
put_pid(tty->ctrl.pgrp);
tty->ctrl.pgrp = NULL; //It's too late
...
tty_unlock(tty);
}The issue is believed to be introduced by commit c8bcd9c5be24 ("tty:
Fix ->session locking") who moves the unlock of siglock in disassociate_ctty() above "if (tty)", making a small window allowing tty_signal_session_leader() to kick in. It can be easily reproduced by adding a delay before "if (tty)" and at the entrance of tty_signal_session_leader().
To fix this issue, we move "put_pid(current->signal->tty_old_pgrp)" after "tty->ctrl.pgrp = NULL".
--- drivers/tty/tty_jobctrl.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
drivers/tty/tty_jobctrl.c +11 -6
@@ -291,12 +291,7 @@ void disassociate_ctty(int on_exit)return ; } -spin_lock_irq (¤t->sighand->siglock); -put_pid (current->signal->tty_old_pgrp); - current->signal->tty_old_pgrp =NULL ; - tty =tty_kref_get (current->signal->tty); -spin_unlock_irq (¤t->sighand->siglock); - + tty =get_current_tty ();if (tty) {unsigned long flags;
@@ -311,6 +306,16 @@ void disassociate_ctty(int on_exit)tty_kref_put (tty); } +/* If tty->ctrl.pgrp is not NULL, it may be assigned to +* current->signal->tty_old_pgrp in a race condition, and +* cause pid memleak. Release current->signal->tty_old_pgrp +* after tty->ctrl.pgrp set to NULL. +*/ +spin_lock_irq (¤t->sighand->siglock); +put_pid (current->signal->tty_old_pgrp); + current->signal->tty_old_pgrp =NULL ; +spin_unlock_irq (¤t->sighand->siglock); +/* Now clear signal->tty under the lock */ read_lock (&tasklist_lock);session_clear_tty (task_session (current));
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 123/191 livepatch: Fix missing newline character in klp_resolve_symbols()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zheng Yejian <[email protected]>
[ Upstream commit 67e18e132f0fd738f8c8cac3aa1420312073f795 ]
Without the newline character, the log may not be printed immediately after the error occurs.
--- kernel/livepatch/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/livepatch/core.c +1 -1
@@ -245,7 +245,7 @@ static int klp_resolve_symbols(Elf_Shdr *sechdrs, const char *strtab,* symbols are exported and normal relas can be used instead. */ if (!sec_vmlinux && sym_vmlinux) { -pr_err ("invalid access to vmlinux symbol '%s' from module-specific livepatch relocation section" , +pr_err ("invalid access to vmlinux symbol '%s' from module-specific livepatch relocation section\n" , sym_name);return -EINVAL ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 124/191 perf evlist: Add evlist__add_dummy_on_all_cpus()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
[ Upstream commit 126d68fdcabed8c2ca5ffaba785add93ef722da8 ]
Add evlist__add_dummy_on_all_cpus() to enable creating a system-wide dummy event that sets up the system-wide maps before map propagation.
For convenience, add evlist__add_aux_dummy() so that the logic can be used whether or not the event needs to be system-wide.
Stable-dep-of: f9cdeb58a9cf ("perf evlist: Avoid frequency mode for the dummy event")
--- tools/perf/util/evlist.c | 45 ++++++++++++++++++++++++++++++++++++++++ tools/perf/util/evlist.h | 5 +++++ 2 files changed, 50 insertions(+)
tools/perf/util/evlist.c +45 -0
@@ -261,6 +261,51 @@ int evlist__add_dummy(struct evlist *evlist)return 0 ; } +static void evlist__add_on_all_cpus (struct evlist *evlist,struct evsel *evsel) +{ + evsel->core.system_wide = true; + +/* +* All CPUs. +* +* Note perf_event_open() does not accept CPUs that are not online, so +* in fact this CPU list will include only all online CPUs. +*/ +perf_cpu_map__put (evsel->core.own_cpus); + evsel->core.own_cpus =perf_cpu_map__new (NULL ); +perf_cpu_map__put (evsel->core.cpus); + evsel->core.cpus =perf_cpu_map__get (evsel->core.own_cpus); + +/* No threads */ +perf_thread_map__put (evsel->core.threads); + evsel->core.threads =perf_thread_map__new_dummy (); + +evlist__add (evlist, evsel); +} + +struct evsel *evlist__add_aux_dummy (struct evlist *evlist,bool system_wide) +{ +struct evsel *evsel =evlist__dummy_event (evlist); + +if (!evsel) +return NULL ; + + evsel->core.attr.exclude_kernel =1 ; + evsel->core.attr.exclude_guest =1 ; + evsel->core.attr.exclude_hv =1 ; + evsel->core.attr.freq =0 ; + evsel->core.attr.sample_period =1 ; + evsel->no_aux_samples = true; + evsel->name =strdup ("dummy:u" ); + +if (system_wide) +evlist__add_on_all_cpus (evlist, evsel); +else +evlist__add (evlist, evsel); + +return evsel; +} +static int evlist__add_attrs (struct evlist *evlist,struct perf_event_attr *attrs,size_t nr_attrs) {struct evsel *evsel, *n;
tools/perf/util/evlist.h +5 -0
@@ -111,6 +111,11 @@ int __evlist__add_default_attrs(struct evlist *evlist, __evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))int evlist__add_dummy (struct evlist *evlist); +struct evsel *evlist__add_aux_dummy (struct evlist *evlist,bool system_wide); +static inline struct evsel *evlist__add_dummy_on_all_cpus (struct evlist *evlist) +{ +return evlist__add_aux_dummy (evlist, true); +} int perf_evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 125/191 perf tools: Get rid of evlist__add_on_all_cpus()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 60ea006f72512fd7c36f16cdbe91f4fc284f8115 ]
The cpu and thread maps are properly handled in libperf now. No need to do it in the perf tools anymore. Let's remove the logic.
Stable-dep-of: f9cdeb58a9cf ("perf evlist: Avoid frequency mode for the dummy event")
--- tools/perf/util/evlist.c | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-)
tools/perf/util/evlist.c +2 -27
@@ -261,28 +261,6 @@ int evlist__add_dummy(struct evlist *evlist)return 0 ; } -static void evlist__add_on_all_cpus (struct evlist *evlist,struct evsel *evsel) -{ - evsel->core.system_wide = true; - -/* -* All CPUs. -* -* Note perf_event_open() does not accept CPUs that are not online, so -* in fact this CPU list will include only all online CPUs. -*/ -perf_cpu_map__put (evsel->core.own_cpus); - evsel->core.own_cpus =perf_cpu_map__new (NULL ); -perf_cpu_map__put (evsel->core.cpus); - evsel->core.cpus =perf_cpu_map__get (evsel->core.own_cpus); - -/* No threads */ -perf_thread_map__put (evsel->core.threads); - evsel->core.threads =perf_thread_map__new_dummy (); - -evlist__add (evlist, evsel); -} -struct evsel *evlist__add_aux_dummy (struct evlist *evlist,bool system_wide) {struct evsel *evsel =evlist__dummy_event (evlist);
@@ -295,14 +273,11 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide) evsel->core.attr.exclude_hv =1 ; evsel->core.attr.freq =0 ; evsel->core.attr.sample_period =1 ; + evsel->core.system_wide = system_wide; evsel->no_aux_samples = true; evsel->name =strdup ("dummy:u" ); -if (system_wide) -evlist__add_on_all_cpus (evlist, evsel); -else -evlist__add (evlist, evsel); - +evlist__add (evlist, evsel);return evsel; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 126/191 perf evlist: Avoid frequency mode for the dummy event
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit f9cdeb58a9cf46c09b56f5f661ea8da24b6458c3 ]
Dummy events are created with an attribute where the period and freq are zero. evsel__config will then see the uninitialized values and initialize them in evsel__default_freq_period. As fequency mode is used by default the dummy event would be set to use frequency mode. However, this has no effect on the dummy event but does cause unnecessary timers/interrupts. Avoid this overhead by setting the period to 1 for dummy events.
evlist__add_aux_dummy calls evlist__add_dummy then sets freq=0 and period=1. This isn't necessary after this change and so the setting is removed.
Quoted 1 line
From Stephane:
The dummy event is not counting anything. It is used to collect mmap records and avoid a race condition during the synthesize mmap phase of perf record. As such, it should not cause any overhead during active profiling. Yet, it did. Because of a bug the dummy event was programmed as a sampling event in frequency mode. Events in that mode incur more kernel overheads because on timer tick, the kernel has to look at the number of samples for each event and potentially adjust the sampling period to achieve the desired frequency. The dummy event was therefore adding a frequency event to task and ctx contexts we may otherwise not have any, e.g.,
perf record -a -e cpu/event=0x3c,period=10000000/.
On each timer tick the perf_adjust_freq_unthr_context() is invoked and if ctx->nr_freq is non-zero, then the kernel will loop over ALL the events of the context looking for frequency mode ones. In doing, so it locks the context, and enable/disable the PMU of each hw event. If all the events of the context are in period mode, the kernel will have to traverse the list for nothing incurring overhead. The overhead is multiplied by a very large factor when this happens in a guest kernel. There is no need for the dummy event to be in frequency mode, it does not count anything and therefore should not cause extra overhead for no reason.
--- tools/perf/util/evlist.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/util/evlist.c +3 -2
@@ -251,6 +251,9 @@ int evlist__add_dummy(struct evlist *evlist) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_DUMMY, .size = sizeof(attr), /* to capture ABI version */ + /* Avoid frequency mode for dummy events to avoid associated timers. */ + .freq = 0, + .sample_period = 1, };struct evsel *evsel =evsel__new_idx (&attr, evlist->core.nr_entries);
@@ -271,8 +274,6 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide) evsel->core.attr.exclude_kernel =1 ; evsel->core.attr.exclude_guest =1 ; evsel->core.attr.exclude_hv =1 ; - evsel->core.attr.freq =0 ; - evsel->core.attr.sample_period =1 ; evsel->core.system_wide = system_wide; evsel->no_aux_samples = true; evsel->name =strdup ("dummy:u" );
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 127/191 usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia-Ju Bai <[email protected]>
[ Upstream commit ef307bc6ef04e8c1ea843231db58e3afaafa9fa6 ]
In _dwc2_hcd_urb_enqueue(), "urb->hcpriv = NULL" is executed without holding the lock "hsotg->lock". In _dwc2_hcd_urb_dequeue():
spin_lock_irqsave(&hsotg->lock, flags);
...
if (!urb->hcpriv) {
dev_dbg(hsotg->dev, "## urb->hcpriv is NULL ##\n");
goto out;
}
rc = dwc2_hcd_urb_dequeue(hsotg, urb->hcpriv); // Use urb->hcpriv
...
out:
spin_unlock_irqrestore(&hsotg->lock, flags);When _dwc2_hcd_urb_enqueue() and _dwc2_hcd_urb_dequeue() are concurrently executed, the NULL check of "urb->hcpriv" can be executed before "urb->hcpriv = NULL". After urb->hcpriv is NULL, it can be used in the function call to dwc2_hcd_urb_dequeue(), which can cause a NULL pointer dereference.
This possible bug is found by an experimental static analysis tool developed by myself. This tool analyzes the locking APIs to extract function pairs that can be concurrently executed, and then analyzes the instructions in the paired functions to identify possible concurrency bugs including data races and atomicity violations. The above possible bug is reported, when my tool analyzes the source code of Linux 6.5.
To fix this possible bug, "urb->hcpriv = NULL" should be executed with holding the lock "hsotg->lock". After using this patch, my tool never reports the possible bug, with the kernelconfiguration allyesconfig for x86_64. Because I have no associated hardware, I cannot test the patch in runtime testing, and just verify it according to the code logic.
--- drivers/usb/dwc2/hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc2/hcd.c +1 -1
@@ -4684,8 +4684,8 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,if (qh_allocated && qh->channel && qh->channel->qh == qh) qh->channel->qh =NULL ; fail2: -spin_unlock_irqrestore (&hsotg->lock, flags); urb->hcpriv =NULL ; +spin_unlock_irqrestore (&hsotg->lock, flags);kfree (qtd); fail1:if (qh_allocated) {
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 128/191 dmaengine: ti: edma: handle irq_of_parse_and_map() errors
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 14f6d317913f634920a640e9047aa2e66f5bdcb7 ]
Zero is not a valid IRQ for in-kernel code and the irq_of_parse_and_map() function returns zero on error. So this check for valid IRQs should only accept values > 0.
--- drivers/dma/ti/edma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma/ti/edma.c +2 -2
@@ -2459,7 +2459,7 @@ static int edma_probe(struct platform_device *pdev)if (irq <0 && node) irq =irq_of_parse_and_map (node,0 ); -if (irq >=0 ) { +if (irq >0 ) { irq_name =devm_kasprintf (dev,GFP_KERNEL ,"%s_ccint" ,dev_name (dev)); ret = devm_request_irq(dev, irq, dma_irq_handler, 0, irq_name,
@@ -2475,7 +2475,7 @@ static int edma_probe(struct platform_device *pdev)if (irq <0 && node) irq =irq_of_parse_and_map (node,2 ); -if (irq >=0 ) { +if (irq >0 ) { irq_name =devm_kasprintf (dev,GFP_KERNEL ,"%s_ccerrint" ,dev_name (dev)); ret = devm_request_irq(dev, irq, dma_ccerr_handler, 0, irq_name,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 129/191 misc: st_core: Do not call kfree_skb() under spin_lock_irqsave()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 4d08c3d12b61022501989f9f071514d2d6f77c47 ]
It is not allowed to call kfree_skb() from hardware interrupt context or with hardware interrupts being disabled. So replace kfree_skb() with dev_kfree_skb_irq() under spin_lock_irqsave(). Compile tested only.
--- drivers/misc/ti-st/st_core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/misc/ti-st/st_core.c +4 -3
@@ -15,6 +15,7 @@#include <linux/skbuff.h> #include <linux/ti_wilink_st.h> +#include <linux/netdevice.h> extern void st_kim_recv (void *,const unsigned char *,long );void st_int_recv (void *,const unsigned char *,long );
@@ -436,7 +437,7 @@ static void st_int_enqueue(struct st_data_s *st_gdata, struct sk_buff *skb)case ST_LL_AWAKE_TO_ASLEEP :pr_err ("ST LL is illegal state(%ld)," "purging received skb." ,st_ll_getstate (st_gdata)); -kfree_skb (skb); +dev_kfree_skb_irq (skb);break ;case ST_LL_ASLEEP :skb_queue_tail (&st_gdata->tx_waitq, skb);
@@ -445,7 +446,7 @@ static void st_int_enqueue(struct st_data_s *st_gdata, struct sk_buff *skb)default :pr_err ("ST LL is illegal state(%ld)," "purging received skb." ,st_ll_getstate (st_gdata)); -kfree_skb (skb); +dev_kfree_skb_irq (skb);break ; }
@@ -499,7 +500,7 @@ void st_tx_wakeup(struct st_data_s *st_data)spin_unlock_irqrestore (&st_data->lock, flags);break ; } -kfree_skb (skb); +dev_kfree_skb_irq (skb);spin_unlock_irqrestore (&st_data->lock, flags); }/* if wake-up is set in another context- restart sending */
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 130/191 tools: iio: privatize globals and functions in iio_generic_buffer.c file
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandru Ardelean <[email protected]>
[ Upstream commit ebe5112535b5cf389ca7d337cf6a0c1d885f9880 ]
Mostly a tidy-up.
But also helps to understand the limits of scope of these functions and globals.
Stable-dep-of: 2d3dff577dd0 ("tools: iio: iio_generic_buffer ensure alignment")
--- tools/iio/iio_generic_buffer.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-)
tools/iio/iio_generic_buffer.c +15 -16
@@ -49,7 +49,7 @@ enum autochan {* Has the side effect of filling the channels[i].location values used * in processing the buffer output. **/ -int size_from_channelarray (struct iio_channel_info *channels,int num_channels) +static int size_from_channelarray (struct iio_channel_info *channels,int num_channels) {int bytes =0 ;int i =0 ;
@@ -68,7 +68,7 @@ int size_from_channelarray(struct iio_channel_info *channels, int num_channels)return bytes; } -void print1byte (uint8_t input,struct iio_channel_info *info) +static void print1byte (uint8_t input,struct iio_channel_info *info) {/* * Shift before conversion to avoid sign extension
@@ -85,7 +85,7 @@ void print1byte(uint8_t input, struct iio_channel_info *info) } } -void print2byte (uint16_t input,struct iio_channel_info *info) +static void print2byte (uint16_t input,struct iio_channel_info *info) {/* First swap if incorrect endian */ if (info->be)
@@ -108,7 +108,7 @@ void print2byte(uint16_t input, struct iio_channel_info *info) } } -void print4byte (uint32_t input,struct iio_channel_info *info) +static void print4byte (uint32_t input,struct iio_channel_info *info) {/* First swap if incorrect endian */ if (info->be)
@@ -131,7 +131,7 @@ void print4byte(uint32_t input, struct iio_channel_info *info) } } -void print8byte (uint64_t input,struct iio_channel_info *info) +static void print8byte (uint64_t input,struct iio_channel_info *info) {/* First swap if incorrect endian */ if (info->be)
@@ -167,9 +167,8 @@ void print8byte(uint64_t input, struct iio_channel_info *info)* to fill the location offsets. * @num_channels: number of channels **/ -void process_scan (char *data, -struct iio_channel_info *channels, -int num_channels) +static void process_scan (char *data,struct iio_channel_info *channels, +int num_channels) {int k;
@@ -238,7 +237,7 @@ static int enable_disable_all_channels(char *dev_dir_name, int enable)return 0 ; } -void print_usage (void ) +static void print_usage (void ) {fprintf (stderr,"Usage: generic_buffer [options]...\n" "Capture, convert and output data from IIO device buffer\n"
@@ -257,12 +256,12 @@ void print_usage(void) " -w <n> Set delay between reads in us (event-less mode)\n"); } -enum autochan autochannels =AUTOCHANNELS_DISABLED ; -char *dev_dir_name =NULL ; -char *buf_dir_name =NULL ; -bool current_trigger_set = false; +static enum autochan autochannels =AUTOCHANNELS_DISABLED ; +static char *dev_dir_name =NULL ; +static char *buf_dir_name =NULL ; +static bool current_trigger_set = false; -void cleanup (void ) +static void cleanup (void ) {int ret;
@@ -294,14 +293,14 @@ void cleanup(void) } } -void sig_handler (int signum) +static void sig_handler (int signum) {fprintf (stderr,"Caught signal %d\n" , signum);cleanup ();exit (-signum); } -void register_cleanup (void ) +static void register_cleanup (void ) {struct sigaction sa = { .sa_handler = sig_handler };const int signums[] = {SIGINT ,SIGTERM ,SIGABRT };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 131/191 tools: iio: iio_generic_buffer: Fix some integer type and calculation
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chenyuan Mi <[email protected]>
[ Upstream commit 49d736313d0975ddeb156f4f59801da833f78b30 ]
In function size_from_channelarray(), the return value 'bytes' is defined as int type. However, the calcution of 'bytes' in this function is designed to use the unsigned int type. So it is necessary to change 'bytes' type to unsigned int to avoid integer overflow.
The size_from_channelarray() is called in main() function, its return value is directly multipled by 'buf_len' and then used as the malloc() parameter. The 'buf_len' is completely controllable by user, thus a multiplication overflow may occur here. This could allocate an unexpected small area.
Stable-dep-of: 2d3dff577dd0 ("tools: iio: iio_generic_buffer ensure alignment")
--- tools/iio/iio_generic_buffer.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
tools/iio/iio_generic_buffer.c +13 -4
@@ -49,9 +49,9 @@ enum autochan {* Has the side effect of filling the channels[i].location values used * in processing the buffer output. **/ -static int size_from_channelarray (struct iio_channel_info *channels,int num_channels) +static unsigned int size_from_channelarray (struct iio_channel_info *channels,int num_channels) { -int bytes =0 ; +unsigned int bytes =0 ;int i =0 ;while (i < num_channels) {
@@ -342,7 +342,7 @@ int main(int argc, char **argv)ssize_t read_size;int dev_num =-1 , trig_num =-1 ;char *buffer_access =NULL ; -int scan_size; +unsigned int scan_size;int noevents =0 ;int notrigger =0 ;char *dummy;
@@ -612,7 +612,16 @@ int main(int argc, char **argv) } scan_size =size_from_channelarray (channels, num_channels); - data =malloc (scan_size * buf_len); + +size_t total_buf_len = scan_size * buf_len; + +if (scan_size >0 && total_buf_len / scan_size != buf_len) { + ret = -EFAULT ; +perror ("Integer overflow happened when calculate scan_size * buf_len" ); + goto error; + } + + data =malloc (total_buf_len);if (!data) { ret = -ENOMEM ; goto error;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 132/191 tools: iio: iio_generic_buffer ensure alignment
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matti Vaittinen <[email protected]>
[ Upstream commit 2d3dff577dd0ea8fe9637a13822f7603c4a881c8 ]
The iio_generic_buffer can return garbage values when the total size of scan data is not a multiple of the largest element in the scan. This can be demonstrated by reading a scan, consisting, for example of one 4-byte and one 2-byte element, where the 4-byte element is first in the buffer.
The IIO generic buffer code does not take into account the last two padding bytes that are needed to ensure that the 4-byte data for next scan is correctly aligned.
Add the padding bytes required to align the next sample with the scan size.
--- tools/iio/iio_generic_buffer.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
tools/iio/iio_generic_buffer.c +12 -1
@@ -52,9 +52,12 @@ enum autochan {static unsigned int size_from_channelarray (struct iio_channel_info *channels,int num_channels) {unsigned int bytes =0 ; -int i =0 ; +int i =0 , max =0 ; +unsigned int misalignment;while (i < num_channels) { +if (channels[i].bytes > max) + max = channels[i].bytes;if (bytes % channels[i].bytes ==0 ) channels[i].location = bytes;else
@@ -64,6 +67,14 @@ static unsigned int size_from_channelarray(struct iio_channel_info *channels, in bytes = channels[i].location + channels[i].bytes; i++; } +/* +* We want the data in next sample to also be properly aligned so +* we'll add padding at the end if needed. Adding padding only +* works for channel data which size is 2^n bytes. +*/ + misalignment = bytes % max; +if (misalignment) + bytes += max - misalignment;return bytes; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 133/191 USB: usbip: fix stub_dev hub disconnect
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Blixt <[email protected]>
[ Upstream commit 97475763484245916735a1aa9a3310a01d46b008 ]
If a hub is disconnected that has device(s) that's attached to the usbip layer the disconnect function might fail because it tries to release the port on an already disconnected hub.
--- drivers/usb/usbip/stub_dev.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/usbip/stub_dev.c +7 -2
@@ -462,8 +462,13 @@ static void stub_disconnect(struct usb_device *udev)/* release port */ rc =usb_hub_release_port (udev->parent, udev->portnum, (struct usb_dev_state *) udev); -if (rc) { -dev_dbg (&udev->dev,"unable to release port\n" ); +/* +* NOTE: If a HUB disconnect triggered disconnect of the down stream +* device usb_hub_release_port will return -ENODEV so we can safely ignore +* that error here. +*/ +if (rc && (rc != -ENODEV )) { +dev_dbg (&udev->dev,"unable to release port (%i)\n" , rc);return ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 134/191 dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 83c761f568733277ce1f7eb9dc9e890649c29a8c ]
If pxad_alloc_desc() fails on the first dma_pool_alloc() call, then sw_desc->nb_desc is zero.
In such a case pxad_free_desc() is called and it will BUG_ON().
Remove this erroneous BUG_ON().
It is also useless, because if "sw_desc->nb_desc == 0", then, on the first iteration of the for loop, i is -1 and the loop will not be executed. (both i and sw_desc->nb_desc are 'int')
--- drivers/dma/pxa_dma.c | 1 - 1 file changed, 1 deletion(-)
drivers/dma/pxa_dma.c +0 -1
@@ -723,7 +723,6 @@ static void pxad_free_desc(struct virt_dma_desc *vd)dma_addr_t dma;struct pxad_desc_sw *sw_desc =to_pxad_sw_desc (vd); -BUG_ON (sw_desc->nb_desc ==0 );for (i = sw_desc->nb_desc -1 ; i >=0 ; i--) {if (i >0 ) dma = sw_desc->hw_desc[i -1 ]->ddadr;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 135/191 f2fs: fix to initialize map.m_pblk in f2fs_precache_extents()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 8b07c1fb0f1ad139373c8253f2fad8bc43fab07d ]
Otherwise, it may print random physical block address in tracepoint of f2fs_map_blocks() as below:
f2fs_map_blocks: dev = (253,16), ino = 2297, file offset = 0, start blkaddr = 0xa356c421, len = 0x0, flags = 0
--- fs/f2fs/file.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/file.c +1 -0
@@ -3315,6 +3315,7 @@ int f2fs_precache_extents(struct inode *inode)return -EOPNOTSUPP ; map.m_lblk =0 ; + map.m_pblk =0 ; map.m_next_pgofs =NULL ; map.m_next_extent = &m_next_extent; map.m_seg_type =NO_CHECK_TYPE ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 136/191 interconnect: qcom: sc7180: Retire DEFINE_QBCM
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit e451b2ea5a11fb3f6d83e1f834ae6a5f55a02bba ]
The struct definition macros are hard to read and compare, expand them.
Stable-dep-of: 1ad83c479272 ("interconnect: qcom: sc7180: Set ACV enable_mask")
--- drivers/interconnect/qcom/sc7180.c | 255 ++++++++++++++++++++++++++--- 1 file changed, 231 insertions(+), 24 deletions(-)
drivers/interconnect/qcom/sc7180.c +231 -24
@@ -153,30 +153,237 @@ DEFINE_QNODE(srvc_snoc, SC7180_SLAVE_SERVICE_SNOC, 1, 4);DEFINE_QNODE (xs_qdss_stm,SC7180_SLAVE_QDSS_STM ,1 ,4 );DEFINE_QNODE (xs_sys_tcu_cfg,SC7180_SLAVE_TCU ,1 ,8 ); -DEFINE_QBCM (bcm_acv,"ACV" , false, &ebi); -DEFINE_QBCM (bcm_mc0,"MC0" , true, &ebi); -DEFINE_QBCM (bcm_sh0,"SH0" , true, &qns_llcc); -DEFINE_QBCM (bcm_mm0,"MM0" , false, &qns_mem_noc_hf); -DEFINE_QBCM (bcm_ce0,"CE0" , false, &qxm_crypto); -DEFINE_QBCM (bcm_cn0,"CN0" , true, &qnm_snoc, &xm_qdss_dap, &qhs_a1_noc_cfg, &qhs_a2_noc_cfg, &qhs_ahb2phy0, &qhs_aop, &qhs_aoss, &qhs_boot_rom, &qhs_camera_cfg, &qhs_camera_nrt_throttle_cfg, &qhs_camera_rt_throttle_cfg, &qhs_clk_ctl, &qhs_cpr_cx, &qhs_cpr_mx, &qhs_crypto0_cfg, &qhs_dcc_cfg, &qhs_ddrss_cfg, &qhs_display_cfg, &qhs_display_rt_throttle_cfg, &qhs_display_throttle_cfg, &qhs_glm, &qhs_gpuss_cfg, &qhs_imem_cfg, &qhs_ipa, &qhs_mnoc_cfg, &qhs_mss_cfg, &qhs_npu_cfg, &qhs_npu_dma_throttle_cfg, &qhs_npu_dsp_throttle_cfg, &qhs_pimem_cfg, &qhs_prng, &qhs_qdss_cfg, &qhs_qm_cfg, &qhs_qm_mpu_cfg, &qhs_qup0, &qhs_qup1, &qhs_security, &qhs_snoc_cfg, &qhs_tcsr, &qhs_tlmm_1, &qhs_tlmm_2, &qhs_tlmm_3, &qhs_ufs_mem_cfg, &qhs_usb3, &qhs_venus_cfg, &qhs_venus_throttle_cfg, &qhs_vsense_ctrl_cfg, &srvc_cnoc); -DEFINE_QBCM (bcm_mm1,"MM1" , false, &qxm_camnoc_hf0_uncomp, &qxm_camnoc_hf1_uncomp, &qxm_camnoc_sf_uncomp, &qhm_mnoc_cfg, &qxm_mdp0, &qxm_rot, &qxm_venus0, &qxm_venus_arm9); -DEFINE_QBCM (bcm_sh2,"SH2" , false, &acm_sys_tcu); -DEFINE_QBCM (bcm_mm2,"MM2" , false, &qns_mem_noc_sf); -DEFINE_QBCM (bcm_qup0,"QUP0" , false, &qup_core_master_1, &qup_core_master_2); -DEFINE_QBCM (bcm_sh3,"SH3" , false, &qnm_cmpnoc); -DEFINE_QBCM (bcm_sh4,"SH4" , false, &acm_apps0); -DEFINE_QBCM (bcm_sn0,"SN0" , true, &qns_gemnoc_sf); -DEFINE_QBCM (bcm_co0,"CO0" , false, &qns_cdsp_gemnoc); -DEFINE_QBCM (bcm_sn1,"SN1" , false, &qxs_imem); -DEFINE_QBCM (bcm_cn1,"CN1" , false, &qhm_qspi, &xm_sdc2, &xm_emmc, &qhs_ahb2phy2, &qhs_emmc_cfg, &qhs_pdm, &qhs_qspi, &qhs_sdc2); -DEFINE_QBCM (bcm_sn2,"SN2" , false, &qxm_pimem, &qns_gemnoc_gc); -DEFINE_QBCM (bcm_co2,"CO2" , false, &qnm_npu); -DEFINE_QBCM (bcm_sn3,"SN3" , false, &qxs_pimem); -DEFINE_QBCM (bcm_co3,"CO3" , false, &qxm_npu_dsp); -DEFINE_QBCM (bcm_sn4,"SN4" , false, &xs_qdss_stm); -DEFINE_QBCM (bcm_sn7,"SN7" , false, &qnm_aggre1_noc); -DEFINE_QBCM (bcm_sn9,"SN9" , false, &qnm_aggre2_noc); -DEFINE_QBCM (bcm_sn12,"SN12" , false, &qnm_gemnoc); +static struct qcom_icc_bcm bcm_acv = { + .name ="ACV" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &ebi }, +}; + +static struct qcom_icc_bcm bcm_mc0 = { + .name ="MC0" , + .keepalive = true, + .num_nodes =1 , + .nodes = { &ebi }, +}; + +static struct qcom_icc_bcm bcm_sh0 = { + .name ="SH0" , + .keepalive = true, + .num_nodes =1 , + .nodes = { &qns_llcc }, +}; + +static struct qcom_icc_bcm bcm_mm0 = { + .name ="MM0" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qns_mem_noc_hf }, +}; + +static struct qcom_icc_bcm bcm_ce0 = { + .name ="CE0" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qxm_crypto }, +}; + +static struct qcom_icc_bcm bcm_cn0 = { + .name ="CN0" , + .keepalive = true, + .num_nodes =48 , + .nodes = { &qnm_snoc, + &xm_qdss_dap, + &qhs_a1_noc_cfg, + &qhs_a2_noc_cfg, + &qhs_ahb2phy0, + &qhs_aop, + &qhs_aoss, + &qhs_boot_rom, + &qhs_camera_cfg, + &qhs_camera_nrt_throttle_cfg, + &qhs_camera_rt_throttle_cfg, + &qhs_clk_ctl, + &qhs_cpr_cx, + &qhs_cpr_mx, + &qhs_crypto0_cfg, + &qhs_dcc_cfg, + &qhs_ddrss_cfg, + &qhs_display_cfg, + &qhs_display_rt_throttle_cfg, + &qhs_display_throttle_cfg, + &qhs_glm, + &qhs_gpuss_cfg, + &qhs_imem_cfg, + &qhs_ipa, + &qhs_mnoc_cfg, + &qhs_mss_cfg, + &qhs_npu_cfg, + &qhs_npu_dma_throttle_cfg, + &qhs_npu_dsp_throttle_cfg, + &qhs_pimem_cfg, + &qhs_prng, + &qhs_qdss_cfg, + &qhs_qm_cfg, + &qhs_qm_mpu_cfg, + &qhs_qup0, + &qhs_qup1, + &qhs_security, + &qhs_snoc_cfg, + &qhs_tcsr, + &qhs_tlmm_1, + &qhs_tlmm_2, + &qhs_tlmm_3, + &qhs_ufs_mem_cfg, + &qhs_usb3, + &qhs_venus_cfg, + &qhs_venus_throttle_cfg, + &qhs_vsense_ctrl_cfg, + &srvc_cnoc + }, +}; + +static struct qcom_icc_bcm bcm_mm1 = { + .name ="MM1" , + .keepalive = false, + .num_nodes =8 , + .nodes = { &qxm_camnoc_hf0_uncomp, + &qxm_camnoc_hf1_uncomp, + &qxm_camnoc_sf_uncomp, + &qhm_mnoc_cfg, + &qxm_mdp0, + &qxm_rot, + &qxm_venus0, + &qxm_venus_arm9 + }, +}; + +static struct qcom_icc_bcm bcm_sh2 = { + .name ="SH2" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &acm_sys_tcu }, +}; + +static struct qcom_icc_bcm bcm_mm2 = { + .name ="MM2" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qns_mem_noc_sf }, +}; + +static struct qcom_icc_bcm bcm_qup0 = { + .name ="QUP0" , + .keepalive = false, + .num_nodes =2 , + .nodes = { &qup_core_master_1, &qup_core_master_2 }, +}; + +static struct qcom_icc_bcm bcm_sh3 = { + .name ="SH3" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qnm_cmpnoc }, +}; + +static struct qcom_icc_bcm bcm_sh4 = { + .name ="SH4" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &acm_apps0 }, +}; + +static struct qcom_icc_bcm bcm_sn0 = { + .name ="SN0" , + .keepalive = true, + .num_nodes =1 , + .nodes = { &qns_gemnoc_sf }, +}; + +static struct qcom_icc_bcm bcm_co0 = { + .name ="CO0" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qns_cdsp_gemnoc }, +}; + +static struct qcom_icc_bcm bcm_sn1 = { + .name ="SN1" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qxs_imem }, +}; + +static struct qcom_icc_bcm bcm_cn1 = { + .name ="CN1" , + .keepalive = false, + .num_nodes =8 , + .nodes = { &qhm_qspi, + &xm_sdc2, + &xm_emmc, + &qhs_ahb2phy2, + &qhs_emmc_cfg, + &qhs_pdm, + &qhs_qspi, + &qhs_sdc2 + }, +}; + +static struct qcom_icc_bcm bcm_sn2 = { + .name ="SN2" , + .keepalive = false, + .num_nodes =2 , + .nodes = { &qxm_pimem, &qns_gemnoc_gc }, +}; + +static struct qcom_icc_bcm bcm_co2 = { + .name ="CO2" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qnm_npu }, +}; + +static struct qcom_icc_bcm bcm_sn3 = { + .name ="SN3" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qxs_pimem }, +}; + +static struct qcom_icc_bcm bcm_co3 = { + .name ="CO3" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qxm_npu_dsp }, +}; + +static struct qcom_icc_bcm bcm_sn4 = { + .name ="SN4" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &xs_qdss_stm }, +}; + +static struct qcom_icc_bcm bcm_sn7 = { + .name ="SN7" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qnm_aggre1_noc }, +}; + +static struct qcom_icc_bcm bcm_sn9 = { + .name ="SN9" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qnm_aggre2_noc }, +}; + +static struct qcom_icc_bcm bcm_sn12 = { + .name ="SN12" , + .keepalive = false, + .num_nodes =1 , + .nodes = { &qnm_gemnoc }, +};static struct qcom_icc_bcm *aggre1_noc_bcms[] = { &bcm_cn1,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 137/191 interconnect: qcom: sc7180: Set ACV enable_mask
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 1ad83c4792722fe134c1352591420702ff7b9091 ]
ACV expects an enable_mask corresponding to the APPS RSC, fill it in.
--- drivers/interconnect/qcom/sc7180.c | 1 + 1 file changed, 1 insertion(+)
drivers/interconnect/qcom/sc7180.c +1 -0
@@ -155,6 +155,7 @@ DEFINE_QNODE(xs_sys_tcu_cfg, SC7180_SLAVE_TCU, 1, 8);static struct qcom_icc_bcm bcm_acv = { .name ="ACV" , + .enable_mask =BIT (3 ), .keepalive = false, .num_nodes =1 , .nodes = { &ebi },
Signature · 1 line
2.42.0
Re: [PATCH 5.10 137/191] interconnect: qcom: sc7180: Set ACV enable_mask
This patch breaks the build for 5.10.201:
/var/tmp/portage/sys-kernel/gentoo-kernel-5.10.201/work/linux-5.10/drivers/interconnect/qcom/sc7180.c:158:10:
error: ‘struct qcom_icc_bcm’ has no member named ‘enable_mask’
158 | .enable_mask = BIT(3),
| ^~~~~~~~~~~
make[4]: *** [/var/tmp/portage/sys-kernel/gentoo-kernel-5.10.201/work/linux-5.10/scripts/Makefile.build:286:drivers/interconnect/qcom/sc7180.o] Error 1
Looks like d8630f050d3fd2079f8617dd6c00c6509109c755 ('interconnect:
qcom: Add support for mask-based BCMs') is missing from 5.10.x.
thanks,
sam
Re: [PATCH 5.10 137/191] interconnect: qcom: sc7180: Set ACV enable_mask
Could a revert be queued for the next 5.10.x please?
thanks,
sam
Greg Kroah-Hartman
maintainerPATCH 138/191 interconnect: qcom: osm-l3: Replace custom implementation of COUNT_ARGS()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 577a3c5af1fe87b65931ea94d5515266da301f56 ]
Replace custom and non-portable implementation of COUNT_ARGS().
--- drivers/interconnect/qcom/osm-l3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/interconnect/qcom/osm-l3.c +2 -1
@@ -3,6 +3,7 @@* Copyright (c) 2020, The Linux Foundation. All rights reserved. */ +#include <linux/args.h> #include <linux/bitfield.h> #include <linux/clk.h> #include <linux/interconnect-provider.h>
@@ -77,7 +78,7 @@ struct qcom_icc_desc { .name = #_name, \ .id = _id, \ .buswidth = _buswidth, \ - .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \ + .num_links = COUNT_ARGS(__VA_ARGS__), \ .links = { __VA_ARGS__ }, \ }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 139/191 modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 7f54e00e5842663c2cea501bbbdfa572c94348a3 ]
When MODULE_DEVICE_TABLE(tee, ) is built on a host with a different endianness from the target architecture, it results in an incorrect MODULE_ALIAS().
For example, see a case where drivers/char/hw_random/optee-rng.c is built as a module for ARM little-endian.
If you build it on a little-endian host, you will get the correct MODULE_ALIAS:
$ grep MODULE_ALIAS drivers/char/hw_random/optee-rng.mod.c
MODULE_ALIAS("tee:ab7a617c-b8e7-4d8f-8301-d09b61036b64*");However, if you build it on a big-endian host, you will get a wrong MODULE_ALIAS:
$ grep MODULE_ALIAS drivers/char/hw_random/optee-rng.mod.c
MODULE_ALIAS("tee:646b0361-9bd0-0183-8f4d-e7b87c617aab*");The same problem also occurs when you enable CONFIG_CPU_BIG_ENDIAN, and build it on a little-endian host.
This issue has been unnoticed because the ARM kernel is configured for little-endian by default, and most likely built on a little-endian host (cross-build on x86 or native-build on ARM).
The uuid field must not be reversed because uuid_t is an array of __u8.
--- scripts/mod/file2alias.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
scripts/mod/file2alias.c +5 -5
@@ -1326,13 +1326,13 @@ static int do_typec_entry(const char *filename, void *symval, char *alias)/* Looks like: tee:uuid */ static int do_tee_entry (const char *filename,void *symval,char *alias) { -DEF_FIELD (symval, tee_client_device_id, uuid); +DEF_FIELD_ADDR (symval, tee_client_device_id, uuid);sprintf (alias,"tee:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" , - uuid.b[0 ], uuid.b[1 ], uuid.b[2 ], uuid.b[3 ], uuid.b[4 ], - uuid.b[5 ], uuid.b[6 ], uuid.b[7 ], uuid.b[8 ], uuid.b[9 ], - uuid.b[10 ], uuid.b[11 ], uuid.b[12 ], uuid.b[13 ], uuid.b[14 ], - uuid.b[15 ]); + uuid->b[0 ], uuid->b[1 ], uuid->b[2 ], uuid->b[3 ], uuid->b[4 ], + uuid->b[5 ], uuid->b[6 ], uuid->b[7 ], uuid->b[8 ], uuid->b[9 ], + uuid->b[10 ], uuid->b[11 ], uuid->b[12 ], uuid->b[13 ], uuid->b[14 ], + uuid->b[15 ]);add_wildcard (alias);return 1 ;
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 140/191 powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
[ Upstream commit cc8ee288f484a2a59c01ccd4d8a417d6ed3466e3 ]
40x TLB handlers were reworked by commit 2c74e2586bb9 ("powerpc/40x:
Rework 40x PTE access and TLB miss") to not require PTE_ATOMIC_UPDATES anymore.
Then commit 4e1df545e2fa ("powerpc/pgtable: Drop PTE_ATOMIC_UPDATES") removed all code related to PTE_ATOMIC_UPDATES.
Remove left over PTE_ATOMIC_UPDATES macro.
--- arch/powerpc/include/asm/nohash/32/pte-40x.h | 3 --- 1 file changed, 3 deletions(-)
arch/powerpc/include/asm/nohash/32/pte-40x.h +0 -3
@@ -69,9 +69,6 @@#define _PTE_NONE_MASK 0 -/* Until my rework is finished, 40x still needs atomic PTE updates */ -#define PTE_ATOMIC_UPDATES 1 -#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED)#define _PAGE_BASE (_PAGE_BASE_NC)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 141/191 powerpc/xive: Fix endian conversion size
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Gray <[email protected]>
[ Upstream commit ff7a60ab1e065257a0e467c13b519f4debcd7fcf ]
Sparse reports a size mismatch in the endian swap. The Opal implementation[1] passes the value as a __be64, and the receiving variable out_qsize is a u64, so the use of be32_to_cpu() appears to be an error.
[1]: https://github.com/open-power/skiboot/blob/80e2b1dc73/hw/xive.c#L3854
--- arch/powerpc/sysdev/xive/native.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/sysdev/xive/native.c +1 -1
@@ -779,7 +779,7 @@ int xive_native_get_queue_info(u32 vp_id, u32 prio,if (out_qpage) *out_qpage =be64_to_cpu (qpage);if (out_qsize) - *out_qsize =be32_to_cpu (qsize); + *out_qsize =be64_to_cpu (qsize);if (out_qeoi_page) *out_qeoi_page =be64_to_cpu (qeoi_page);if (out_escalate_irq)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 142/191 powerpc/imc-pmu: Use the correct spinlock initializer.
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
[ Upstream commit 007240d59c11f87ac4f6cfc6a1d116630b6b634c ]
The macro __SPIN_LOCK_INITIALIZER() is implementation specific. Users that desire to initialize a spinlock in a struct must use __SPIN_LOCK_UNLOCKED().
Use __SPIN_LOCK_UNLOCKED() for the spinlock_t in imc_global_refc.
--- arch/powerpc/perf/imc-pmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/perf/imc-pmu.c +1 -1
@@ -50,7 +50,7 @@ static int trace_imc_mem_size;* core and trace-imc */ static struct imc_pmu_ref imc_global_refc = { - .lock =__SPIN_LOCK_INITIALIZER (imc_global_refc.lock), + .lock =__SPIN_LOCK_UNLOCKED (imc_global_refc.lock), .id =0 , .refc =0 , };
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 143/191 powerpc/pseries: fix potential memory leak in init_cpu_associativity()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang Yufen <[email protected]>
[ Upstream commit 95f1a128cd728a7257d78e868f1f5a145fc43736 ]
If the vcpu_associativity alloc memory successfully but the pcpu_associativity fails to alloc memory, the vcpu_associativity memory leaks.
--- arch/powerpc/platforms/pseries/lpar.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/platforms/pseries/lpar.c +3 -1
@@ -523,8 +523,10 @@ static ssize_t vcpudispatch_stats_write(struct file *file, const char __user *p,if (cmd) { rc =init_cpu_associativity (); -if (rc) +if (rc) { +destroy_cpu_associativity (); goto out; + }for_each_possible_cpu (cpu) { disp =per_cpu_ptr (&vcpu_disp_data, cpu);
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 144/191 xhci: Loosen RPM as default policy to cover for AMD xHC 1.1
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Basavaraj Natikar <[email protected]>
[ Upstream commit 4baf1218150985ee3ab0a27220456a1f027ea0ac ]
The AMD USB host controller (1022:43f7) isn't going into PCI D3 by default without anything connected. This is because the policy that was introduced by commit a611bf473d1f ("xhci-pci: Set runtime PM as default policy on all xHC 1.2 or later devices") only covered 1.2 or later.
The 1.1 specification also has the same requirement as the 1.2 specification for D3 support. So expand the runtime PM as default policy to all AMD 1.1 devices as well.
--- drivers/usb/host/xhci-pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/host/xhci-pci.c +2 -0
@@ -345,6 +345,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)/* xHC spec requires PCI devices to support D3hot and D3cold */ if (xhci->hci_version >=0x120 ) xhci->quirks |=XHCI_DEFAULT_PM_RUNTIME_ALLOW ; +else if (pdev->vendor ==PCI_VENDOR_ID_AMD && xhci->hci_version >=0x110 ) + xhci->quirks |=XHCI_DEFAULT_PM_RUNTIME_ALLOW ;if (xhci->quirks &XHCI_RESET_ON_RESUME ) xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 145/191 usb: host: xhci-plat: fix possible kernel oops while resuming
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Shtylyov <[email protected]>
[ Upstream commit a5f928db59519a15e82ecba4ae3e7cbf5a44715a ]
If this driver enables the xHC clocks while resuming from sleep, it calls clk_prepare_enable() without checking for errors and blithely goes on to read/write the xHC's registers -- which, with the xHC not being clocked, at least on ARM32 usually causes an imprecise external abort exceptions which cause kernel oops. Currently, the chips for which the driver does the clock dance on suspend/resume seem to be the Broadcom STB SoCs, based on ARM32 CPUs, as it seems...
Found by Linux Verification Center (linuxtesting.org) with the Svace static analysis tool.
--- drivers/usb/host/xhci-plat.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-plat.c +19 -4
@@ -466,23 +466,38 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)int ret;if (!device_may_wakeup (dev) && (xhci->quirks &XHCI_SUSPEND_RESUME_CLKS )) { -clk_prepare_enable (xhci->clk); -clk_prepare_enable (xhci->reg_clk); + ret =clk_prepare_enable (xhci->clk); +if (ret) +return ret; + + ret =clk_prepare_enable (xhci->reg_clk); +if (ret) { +clk_disable_unprepare (xhci->clk); +return ret; + } } ret =xhci_priv_resume_quirk (hcd);if (ret) -return ret; + goto disable_clks; ret =xhci_resume (xhci,0 );if (ret) -return ret; + goto disable_clks;pm_runtime_disable (dev);pm_runtime_set_active (dev);pm_runtime_enable (dev);return 0 ; + +disable_clks: +if (!device_may_wakeup (dev) && (xhci->quirks &XHCI_SUSPEND_RESUME_CLKS )) { +clk_disable_unprepare (xhci->clk); +clk_disable_unprepare (xhci->reg_clk); + } + +return ret; }static int __maybe_unused xhci_plat_runtime_suspend (struct device *dev)
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 146/191 perf machine: Avoid out of bounds LBR memory read
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit ab8ce150781d326c6bfbe1e09f175ffde1186f80 ]
Running perf top with address sanitizer and "--call-graph=lbr" fails due to reading sample 0 when no samples exist. Add a guard to prevent this.
--- tools/perf/util/machine.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
tools/perf/util/machine.c +12 -10
@@ -2387,16 +2387,18 @@ static int lbr_callchain_add_lbr_ip(struct thread *thread,save_lbr_cursor_node (thread, cursor, i); } -/* Add LBR ip from first entries.to */ - ip = entries[0 ].to; - flags = &entries[0 ].flags; - *branch_from = entries[0 ].from; - err =add_callchain_ip (thread, cursor, parent, - root_al, &cpumode, ip, - true, flags,NULL , - *branch_from); -if (err) -return err; +if (lbr_nr >0 ) { +/* Add LBR ip from first entries.to */ + ip = entries[0 ].to; + flags = &entries[0 ].flags; + *branch_from = entries[0 ].from; + err =add_callchain_ip (thread, cursor, parent, + root_al, &cpumode, ip, + true, flags,NULL , + *branch_from); +if (err) +return err; + }return 0 ; }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 147/191 perf hist: Add missing puts to hist__account_cycles
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit c1149037f65bcf0334886180ebe3d5efcf214912 ]
Caught using reference count checking on perf top with "--call-graph=lbr". After this no memory leaks were detected.
--- tools/perf/util/hist.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
tools/perf/util/hist.c +7 -3
@@ -2624,8 +2624,6 @@ void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,/* If we have branch cycles always annotate them. */ if (bs && bs->nr && entries[0 ].flags.cycles) { -int i; - bi =sample__resolve_bstack (sample, al);if (bi) {struct addr_map_symbol *prev =NULL ;
@@ -2640,7 +2638,7 @@ void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,* Note that perf stores branches reversed from * program order! */ -for (i = bs->nr -1 ; i >=0 ; i--) { +for (int i = bs->nr -1 ; i >=0 ; i--) {addr_map_symbol__account_cycles (&bi[i].from, nonany_branch_mode ?NULL : prev, bi[i].flags.cycles);
@@ -2649,6 +2647,12 @@ void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,if (total_cycles) *total_cycles += bi[i].flags.cycles; } +for (unsigned int i =0 ; i < bs->nr; i++) { +map__put (bi[i].to.ms.map); +maps__put (bi[i].to.ms.maps); +map__put (bi[i].from.ms.map); +maps__put (bi[i].from.ms.maps); + }free (bi); } }
Signature · 1 line
2.42.0
Greg Kroah-Hartman
maintainerPATCH 148/191 i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dinghao Liu <[email protected]>
[ Upstream commit cab63f64887616e3c4e31cfd8103320be6ebc8d3 ]
put_device() needs to be called on failure of device_register() to give up the reference initialized in it to avoid refcount leak.
--- drivers/i3c/master.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/i3c/master.c +3 -1
@@ -1509,9 +1509,11 @@ i3c_master_register_new_i3c_devs(struct i3c_master_controller *master) desc->dev->dev.of_node = desc->boardinfo->of_node; ret =device_register (&desc->dev->dev); -if (ret) +if (ret) {dev_err (&master->dev,"Failed to add I3C device (err = %d)\n" , ret); +put_device (&desc->dev->dev); + } } }
Signature · 1 line
2.42.0