5.15.47-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 5.15.47-rc1 review
This is the start of the stable review cycle for the 5.15.47 release. There are 247 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 15 Jun 2022 09:47:08 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.47-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.15.47-rc1
Damien Le Moal <[email protected]>
zonefs: fix handling of explicit_open option on mount
Johan Hovold <[email protected]>
PCI: qcom: Fix pipe clock imbalance
Davide Caratti <[email protected]>
net/sched: act_police: more accurate MTU policing
Pascal Hambourg <[email protected]>
md/raid0: Ignore RAID0 layout if the second zone has only one device
Jason A. Donenfeld <[email protected]>
random: account for arch randomness in bits
Jason A. Donenfeld <[email protected]>
random: mark bootloader randomness code as __init
Jason A. Donenfeld <[email protected]>
random: avoid checking crng_ready() twice in random_init()
KuoHsiang Chou <[email protected]>
drm/ast: Create threshold values for AST2600
Alexey Kardashevskiy <[email protected]>
powerpc/mm: Switch obsolete dssall to .long
Michael Ellerman <[email protected]>
powerpc/32: Fix overread/overwrite of thread_struct via ptrace
Alex Deucher <[email protected]>
drm/amdgpu: update VCN codec support for Yellow Carp
Brian Norris <[email protected]>
drm/atomic: Force bridge self-refresh-exit on CRTC switch
Brian Norris <[email protected]>
drm/bridge: analogix_dp: Support PSR-exit to disable transition
Michael Ellerman <[email protected]>
powerpc: Don't select HAVE_IRQ_EXIT_ON_IRQ_STACK
Xie Yongji <[email protected]>
vduse: Fix NULL pointer dereference on sysfs access
Mathias Nyman <[email protected]>
Input: bcm5974 - set missing URB_NO_TRANSFER_DMA_MAP urb flag
Olivier Matz <[email protected]>
ixgbe: fix unexpected VLAN Rx in promisc mode on VF
Olivier Matz <[email protected]>
ixgbe: fix bcast packets Rx on VF after promisc removal
Martin Faltesek <[email protected]>
nfc: st21nfca: fix incorrect sizing calculations in EVT_TRANSACTION
Martin Faltesek <[email protected]>
nfc: st21nfca: fix memory leaks in EVT_TRANSACTION handling
Martin Faltesek <[email protected]>
nfc: st21nfca: fix incorrect validating logic in EVT_TRANSACTION
Jchao Sun <[email protected]>
writeback: Fix inode->i_io_list not be protected by inode->i_lock error
Ilya Maximets <[email protected]>
net: openvswitch: fix misuse of the cached connection on tuple changes
Tan Tee Min <[email protected]>
net: phy: dp83867: retrigger SGMII AN when link change
Adrian Hunter <[email protected]>
mmc: block: Fix CQE recovery reset success
Sergey Shtylyov <[email protected]>
ata: libata-transport: fix {dma|pio|xfer}_mode sysfs files
David Safford <[email protected]>
KEYS: trusted: tpm2: Fix migratable logic
Paulo Alcantara <[email protected]>
cifs: fix reconnect on smb3 mount types
Shyam Prasad N <[email protected]>
cifs: return errors during session setup during reconnects
Jeremy Soller <[email protected]>
ALSA: hda/realtek: Add quirk for HP Dev One
Cameron Berkenpas <[email protected]>
ALSA: hda/realtek: Fix for quirk to enable speaker output on the Lenovo Yoga DuetITL 2021
huangwenhui <[email protected]>
ALSA: hda/conexant - Fix loopback issue with CX20632
Takashi Iwai <[email protected]>
ALSA: usb-audio: Set up (implicit) sync for Saffire 6
Takashi Iwai <[email protected]>
ALSA: usb-audio: Skip generic sync EP parse for secondary EP
Kuan-Ying Lee <[email protected]>
scripts/gdb: change kernel config dumping method
Xie Yongji <[email protected]>
vringh: Fix loop descriptors check in the indirect cases
Kees Cook <[email protected]>
nodemask: Fix return values to be unsigned
Yury Norov <[email protected]>
drm/amd/pm: use bitmap_{from,to}_arr32 where appropriate
Steve French <[email protected]>
cifs: version operations for smb20 unneeded when legacy support disabled
Christian Borntraeger <[email protected]>
s390/gmap: voluntarily schedule during key setting
Yu Kuai <[email protected]>
nbd: fix io hung while disconnecting device
Yu Kuai <[email protected]>
nbd: fix race between nbd_alloc_config() and module removal
Yu Kuai <[email protected]>
nbd: call genl_unregister_family() first in nbd_cleanup()
Peter Zijlstra <[email protected]>
jump_label,noinstr: Avoid instrumentation for JUMP_LABEL=n builds
Peter Zijlstra <[email protected]>
x86/cpu: Elide KCSAN for cpu_has() and friends
Masahiro Yamada <[email protected]>
modpost: fix undefined behavior of is_arm_mapping_symbol()
Johannes Berg <[email protected]>
um: line: Use separate IRQs per line
Lijo Lazar <[email protected]>
drm/amd/pm: Fix missing thermal throttler status
Gong Yuanjun <[email protected]>
drm/radeon: fix a possible null pointer dereference
David Galiffi <[email protected]>
drm/amd/display: Check if modulo is 0 before dividing.
Xiubo Li <[email protected]>
ceph: flush the mdlog for filesystem sync
Venky Shankar <[email protected]>
ceph: allow ceph.dir.rctime xattr to be updatable
Michal Kubecek <[email protected]>
Revert "net: af_key: add check for pfkey_broadcast in function pfkey_process"
Hannes Reinecke <[email protected]>
scsi: myrb: Fix up null pointer access on myrb_cleanup()
Guoqing Jiang <[email protected]>
md: protect md_unregister_thread from reentrancy
Liu Xinpeng <[email protected]>
watchdog: wdat_wdt: Stop watchdog when rebooting the system
Hao Luo <[email protected]>
kernfs: Separate kernfs_pr_cont_buf and rename_lock.
John Ogness <[email protected]>
serial: msm_serial: disable interrupts in __msm_console_write()
Wang Cheng <[email protected]>
staging: rtl8712: fix uninit-value in r871xu_drv_init()
Wang Cheng <[email protected]>
staging: rtl8712: fix uninit-value in usb_read8() and friends
Andre Przywara <[email protected]>
clocksource/drivers/sp804: Avoid error on multiple instances
bumwoo lee <[email protected]>
extcon: Modify extcon device to be created after driver data is set
Dan Carpenter <[email protected]>
extcon: Fix extcon_get_extcon_dev() error handling
Shuah Khan <[email protected]>
misc: rtsx: set NULL intfdata when probe fails
Srinivas Kandagatla <[email protected]>
soundwire: qcom: adjust autoenumeration timeout
Marek Szyprowski <[email protected]>
usb: dwc2: gadget: don't reset gadget's driver->bus
Changbin Du <[email protected]>
sysrq: do not omit current cpu when showing backtrace of all active CPUs
Hangyu Hua <[email protected]>
char: xillybus: fix a refcount leak in cleanup_dev()
Evan Green <[email protected]>
USB: hcd-pci: Fully suspend across freeze/thaw cycle
Duoming Zhou <[email protected]>
drivers: usb: host: Fix deadlock in oxu_bus_suspend()
Duoming Zhou <[email protected]>
drivers: tty: serial: Fix deadlock in sa1100_set_termios()
Zhen Ni <[email protected]>
USB: host: isp116x: check return value after calling platform_get_resource()
Duoming Zhou <[email protected]>
drivers: staging: rtl8192e: Fix deadlock in rtllib_beacons_stop()
Duoming Zhou <[email protected]>
drivers: staging: rtl8192u: Fix deadlock in ieee80211_beacons_stop()
Mika Westerberg <[email protected]>
thunderbolt: Use different lane for second DisplayPort tunnel
Huang Guobin <[email protected]>
tty: Fix a possible resource leak in icom_probe
Zheyu Ma <[email protected]>
tty: synclink_gt: Fix null-pointer-dereference in slgt_clean()
Duoming Zhou <[email protected]>
drivers: staging: rtl8192bs: Fix deadlock in rtw_joinbss_event_prehandle()
Duoming Zhou <[email protected]>
drivers: staging: rtl8723bs: Fix deadlock in rtw_surveydone_event_callback()
Kees Cook <[email protected]>
lkdtm/usercopy: Expand size of "out of frame" object
Miquel Raynal <[email protected]>
iio: st_sensors: Add a local lock for protecting odr
Xiaoke Wang <[email protected]>
staging: rtl8712: fix a potential memory leak in r871xu_drv_init()
Xiaoke Wang <[email protected]>
iio: dummy: iio_simple_dummy: check the return value of kstrdup()
David Howells <[email protected]>
iov_iter: Fix iter_xarray_get_pages{,_alloc}()
Etienne van der Linde <[email protected]>
nfp: flower: restructure flow-key for gre+vlan combination
Linus Torvalds <[email protected]>
drm: imx: fix compiler warning with gcc-12
Muchun Song <[email protected]>
tcp: use alloc_large_system_hash() to allocate table_perturb
Marek Behún <[email protected]>
net: dsa: mv88e6xxx: use BMSR_ANEGCOMPLETE bit for filling an_complete
Miaoqian Lin <[email protected]>
net: altera: Fix refcount leak in altera_tse_mdio_create
Willem de Bruijn <[email protected]>
ip_gre: test csum_start instead of transport header
Mark Bloch <[email protected]>
net/mlx5: fs, fail conflicting actions
Feras Daoud <[email protected]>
net/mlx5: Rearm the FW tracer after each tracer event
Saeed Mahameed <[email protected]>
net/mlx5: Fix mlx5_get_next_dev() peer device matching
Mark Bloch <[email protected]>
net/mlx5: Lag, filter non compatible devices
Masahiro Yamada <[email protected]>
net: ipv6: unexport __init-annotated seg6_hmac_init()
Masahiro Yamada <[email protected]>
net: xfrm: unexport __init-annotated xfrm4_protocol_init()
Masahiro Yamada <[email protected]>
net: mdio: unexport __init-annotated mdio_bus_init()
Chuck Lever <[email protected]>
SUNRPC: Fix the calculation of xdr->end in xdr_get_next_encode_buffer()
Maciej Fijalkowski <[email protected]>
xsk: Fix handling of invalid descriptors in XSK TX batching API
Magnus Karlsson <[email protected]>
i40e: xsk: Move tmp desc array from driver to pool
Gal Pressman <[email protected]>
net/mlx4_en: Fix wrong return value on ioctl EEPROM query failure
Miaoqian Lin <[email protected]>
net: dsa: lantiq_gswip: Fix refcount leak in gswip_gphy_fw_list
Eric Dumazet <[email protected]>
bpf, arm64: Clear prog->jited_len along prog->jited
Kuniyuki Iwashima <[email protected]>
af_unix: Fix a data-race in unix_dgram_peer_wake_me().
Christophe JAILLET <[email protected]>
stmmac: intel: Fix an error handling path in intel_eth_pci_probe()
Masahiro Yamada <[email protected]>
xen: unexport __init-annotated xen_xlate_map_ballooned_pages()
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: bail out early if hardware offload is not supported
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: memleak flow rule from commit path
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: release new hooks on unsupported flowtable flags
Miaoqian Lin <[email protected]>
ata: pata_octeon_cf: Fix refcount leak in octeon_cf_probe
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: always initialize flowtable hook list in transaction
Chuck Lever <[email protected]>
SUNRPC: Trap RDMA segment overflows
Michael Ellerman <[email protected]>
powerpc/kasan: Force thread size increase with KASAN
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: delete flowtable hooks via transaction list
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: use kfree_rcu(ptr, rcu) to release hooks in clean_net path
Florian Westphal <[email protected]>
netfilter: nat: really support inet nat without l3 address
Marek Vasut <[email protected]>
drm/bridge: ti-sn65dsi83: Handle dsi_lanes == 0 as invalid
Christophe JAILLET <[email protected]>
drm/bridge: sn65dsi83: Fix an error handling path in sn65dsi83_probe()
Kinglong Mee <[email protected]>
xprtrdma: treat all calls not a bcall when bc_serv is NULL
Chao Yu <[email protected]>
f2fs: fix to tag gcing flag on page during file defragment
Greg Ungerer <[email protected]>
m68knommu: fix undefined reference to `mach_get_rtc_pll'
Liao Chang <[email protected]>
RISC-V: use memcpy for kexec_file mode
Yang Yingliang <[email protected]>
video: fbdev: pxa3xx-gcu: release the resources correctly in pxa3xx_gcu_probe/remove()
Saurabh Sengar <[email protected]>
video: fbdev: hyperv_fb: Allow resolutions with size > 64 MB for Gen1
Trond Myklebust <[email protected]>
NFSv4: Don't hold the layoutget locks across multiple RPC calls
Radhey Shyam Pandey <[email protected]>
dmaengine: zynqmp_dma: In struct zynqmp_dma_chan fix desc_size data type
Greg Ungerer <[email protected]>
m68knommu: fix undefined reference to `_init_sp'
Greg Ungerer <[email protected]>
m68knommu: set ZERO_PAGE() to the allocated zeroed page
Lucas Tanure <[email protected]>
i2c: cadence: Increase timeout per message if necessary
Dongliang Mu <[email protected]>
f2fs: remove WARN_ON in f2fs_is_valid_blkaddr
Yang Yingliang <[email protected]>
iommu/arm-smmu-v3: check return value after calling platform_get_resource()
Yang Yingliang <[email protected]>
iommu/arm-smmu: fix possible null-ptr-deref in arm_smmu_device_probe()
Mark-PK Tsai <[email protected]>
tracing: Avoid adding tracer option before update_tracer_options
Jun Miao <[email protected]>
tracing: Fix sleeping function called from invalid context on RT kernel
Jeff Xie <[email protected]>
tracing: Make tp_printk work on syscall tracepoints
Masami Hiramatsu <[email protected]>
bootconfig: Make the bootconfig.o as a normal object file
Gong Yuanjun <[email protected]>
mips: cpc: Fix refcount leak in mips_cpc_default_phys_base
Dave Jiang <[email protected]>
dmaengine: idxd: set DMA_INTERRUPT cap bit
Leo Yan <[email protected]>
perf c2c: Fix sorting in percent_rmt_hitm_cmp()
Saravana Kannan <[email protected]>
driver core: Fix wait_for_device_probe() & deferred_probe_timeout interaction
Hoang Le <[email protected]>
tipc: check attribute length for bearer name
Damien Le Moal <[email protected]>
scsi: sd: Fix potential NULL pointer dereference
David Howells <[email protected]>
afs: Fix infinite loop found by xfstest generic/676
Haibo Chen <[email protected]>
gpio: pca953x: use the correct register address to do regcache sync
Fabien Parent <[email protected]>
regulator: mt6315-regulator: fix invalid allowed mode
Alexander Gordeev <[email protected]>
s390/mcck: isolate SIE instruction when setting CIF_MCCK_GUEST flag
Dan Carpenter <[email protected]>
octeontx2-af: fix error code in is_valid_offset()
Jason Wang <[email protected]>
vdpa: ifcvf: set pci driver data in probe
Eric Dumazet <[email protected]>
tcp: tcp_rtx_synack() can be called from process context
Guoju Fang <[email protected]>
net: sched: add barrier to fix packet stuck problem for lockless qdisc
Maxim Mikityanskiy <[email protected]>
net/mlx5e: Update netdev features after changing XDP state
Changcheng Liu <[email protected]>
net/mlx5: correct ECE offset in query qp output
Paul Blakey <[email protected]>
net/mlx5: CT: Fix header-rewrite re-use for tupels
Maor Dickman <[email protected]>
net/mlx5e: TC NIC mode, fix tc chains miss table
Leon Romanovsky <[email protected]>
net/mlx5: Don't use already freed action pointer
Christophe JAILLET <[email protected]>
virtio: pci: Fix an error handling path in vp_modern_probe()
Eli Cohen <[email protected]>
vdpa: Fix error logic in vdpa_nl_cmd_dev_get_doit
Jens Axboe <[email protected]>
block: make bioset_exit() fully resilient against being called twice
Íñigo Huguet <[email protected]>
sfc: fix wrong tx channel offset with efx_separate_tx_channels
Martin Habets <[email protected]>
sfc: fix considering that all channels have TX queues
Yu Xiao <[email protected]>
nfp: only report pause frame configuration for physical device
Eric Dumazet <[email protected]>
tcp: add accessors to read/set tp->snd_cwnd
Guangguan Wang <[email protected]>
net/smc: fixes for converting from "struct smc_cdc_tx_pend **" to "struct smc_wr_tx_pend_priv *"
Heinrich Schuchardt <[email protected]>
riscv: read-only pages should not be writable
Christoph Hellwig <[email protected]>
block: take destination bvec offsets into account in bio_copy_data_iter
Menglong Dong <[email protected]>
bpf: Fix probe read error in ___bpf_prog_run()
Song Liu <[email protected]>
selftests/bpf: fix stacktrace_build_id with missing kprobe/urandom_read
Andrii Nakryiko <[email protected]>
selftests/bpf: fix selftest after random: Urandom_read tracepoint removal
Zhihao Cheng <[email protected]>
ubi: ubi_create_volume: Fix use-after-free when volume creation failed
Zhihao Cheng <[email protected]>
ubi: fastmap: Fix high cpu usage of ubi_bgt by making sure wl_pool not empty
Baokun Li <[email protected]>
jffs2: fix memory leak in jffs2_do_fill_super
Alexander Lobakin <[email protected]>
modpost: fix removing numeric suffixes
Miaoqian Lin <[email protected]>
net: dsa: mv88e6xxx: Fix refcount leak in mv88e6xxx_mdios_register
Miaoqian Lin <[email protected]>
net: ethernet: ti: am65-cpsw-nuss: Fix some refcount leaks
Dan Carpenter <[email protected]>
net: ethernet: mtk_eth_soc: out of bounds read in mtk_hwlro_get_fdir_entry()
Vincent Ray <[email protected]>
net: sched: fixed barrier to prevent skbuff sticking in qdisc backlog
Jann Horn <[email protected]>
s390/crypto: fix scatterwalk_unmap() callers in AES-GCM
Krzysztof Kozlowski <[email protected]>
clocksource/drivers/oxnas-rps: Fix irq_of_parse_and_map() return value
Shengjiu Wang <[email protected]>
ASoC: fsl_sai: Fix FSL_SAI_xDR/xFR definition
Ming Lei <[email protected]>
blk-mq: don't touch ->tagset in blk_mq_get_sq_hctx
Miaoqian Lin <[email protected]>
watchdog: ts4800_wdt: Fix refcount leak in ts4800_wdt_probe
Miaoqian Lin <[email protected]>
watchdog: rti-wdt: Fix pm_runtime_get_sync() error checking
Zhang Wensheng <[email protected]>
driver core: fix deadlock in __device_attach
Schspa Shi <[email protected]>
driver: base: fix UAF when driver_attach failed
Tony Lindgren <[email protected]>
bus: ti-sysc: Fix warnings for unbind for serial
Miaoqian Lin <[email protected]>
firmware: dmi-sysfs: Fix memory leak in dmi_sysfs_register_handle
Ilpo Järvinen <[email protected]>
serial: stm32-usart: Correct CSIZE, bits, and parity
Ilpo Järvinen <[email protected]>
serial: st-asc: Sanitize CSIZE and correct PARENB for CS7
Ilpo Järvinen <[email protected]>
serial: sifive: Sanitize CSIZE and c_iflag
Ilpo Järvinen <[email protected]>
serial: sh-sci: Don't allow CS5-6
Ilpo Järvinen <[email protected]>
serial: txx9: Don't allow CS5-6
Ilpo Järvinen <[email protected]>
serial: rda-uart: Don't allow CS5-6
Ilpo Järvinen <[email protected]>
serial: digicolor-usart: Don't allow CS5-6
YueHaibing <[email protected]>
serial: cpm_uart: Fix build error without CONFIG_SERIAL_CPM_CONSOLE
Ilpo Järvinen <[email protected]>
serial: 8250_fintek: Check SER_RS485_RTS_* only with RS485
John Ogness <[email protected]>
serial: meson: acquire port->lock in startup()
Tony Lindgren <[email protected]>
tty: n_gsm: Fix packet data hex dump output
Tony Lindgren <[email protected]>
tty: n_gsm: Don't ignore write return value in gsmld_output()
Jiasheng Jiang <[email protected]>
staging: r8188eu: add check for kzalloc
Miaoqian Lin <[email protected]>
rtc: ftrtc010: Fix error handling in ftrtc010_rtc_probe
Lad Prabhakar <[email protected]>
rtc: ftrtc010: Use platform_get_irq() to get the interrupt
Yang Yingliang <[email protected]>
rtc: mt6397: check return value after calling platform_get_resource()
Howard Chiu <[email protected]>
ARM: dts: aspeed: ast2600-evb: Enable RX delay for MAC0/MAC1
Samuel Holland <[email protected]>
clocksource/drivers/riscv: Events are stopped during CPU suspend
Miaoqian Lin <[email protected]>
soc: rockchip: Fix refcount leak in rockchip_grf_init
Li Jun <[email protected]>
extcon: ptn5150: Add queue work sync before driver release
Xin Xiong <[email protected]>
ksmbd: fix reference count leak in smb_check_perm_dacl()
Guilherme G. Piccoli <[email protected]>
coresight: cpu-debug: Replace mutex with mutex_trylock on panic notifier
Pierre-Louis Bossart <[email protected]>
soundwire: intel: prevent pm_runtime resume prior to system suspend
Greg Kroah-Hartman <[email protected]>
export: fix string handling of namespace in EXPORT_SYMBOL_NS
Maciej W. Rozycki <[email protected]>
serial: sifive: Report actual baud base rather than fixed 115200
Hans de Goede <[email protected]>
power: supply: axp288_fuel_gauge: Drop BIOS version check from "T3 MRD" DMI quirk
Johan Hovold <[email protected]>
phy: qcom-qmp: fix pipe-clock imbalance on power-on failure
Guilherme G. Piccoli <[email protected]>
misc/pvpanic: Convert regular spinlock into trylock on panic path
Andy Shevchenko <[email protected]>
pvpanic: Fix typos in the comments
Krzysztof Kozlowski <[email protected]>
rpmsg: qcom_smd: Fix returning 0 if irq_of_parse_and_map() fails
Cixi Geng <[email protected]>
iio: adc: sc27xx: Fine tune the scale calibration values
Cixi Geng <[email protected]>
iio: adc: sc27xx: fix read big scale voltage not right
Miaoqian Lin <[email protected]>
iio: proximity: vl53l0x: Fix return value check of wait_for_completion_timeout
Miaoqian Lin <[email protected]>
iio: adc: stmpe-adc: Fix wait_for_completion_timeout return value check
Arnaud Pouliquen <[email protected]>
rpmsg: virtio: Fix the unregistration of the device rpmsg_ctrl
Hangyu Hua <[email protected]>
rpmsg: virtio: Fix possible double free in rpmsg_virtio_add_ctrl_dev()
Hangyu Hua <[email protected]>
rpmsg: virtio: Fix possible double free in rpmsg_probe()
Bjorn Andersson <[email protected]>
usb: typec: mux: Check dev_set_name() return value
Xiaomeng Tong <[email protected]>
firmware: stratix10-svc: fix a missing check on list iterator
Xiaomeng Tong <[email protected]>
misc: fastrpc: fix an incorrect NULL check on list iterator
Zheng Yongjun <[email protected]>
usb: dwc3: pci: Fix pm_runtime_get_sync() error checking
Wesley Cheng <[email protected]>
usb: dwc3: gadget: Replace list_for_each_entry_safe() if using giveback
Krzysztof Kozlowski <[email protected]>
rpmsg: qcom_smd: Fix irq_of_parse_and_map() return value
Uwe Kleine-König <[email protected]>
pwm: raspberrypi-poe: Fix endianness in firmware struct
Uwe Kleine-König <[email protected]>
pwm: lp3943: Fix duty calculation in case period was clamped
Christophe JAILLET <[email protected]>
staging: fieldbus: Fix the error handling path in anybuss_host_common_probe()
Miaoqian Lin <[email protected]>
usb: musb: Fix missing of_node_put() in omap2430_probe
Lin Ma <[email protected]>
USB: storage: karma: fix rio_karma_init return
Niels Dossche <[email protected]>
usb: usbip: add missing device lock on tweak configuration cmd
Hangyu Hua <[email protected]>
usb: usbip: fix a refcount leak in stub_probe()
Peng Fan <[email protected]>
remoteproc: imx_rproc: Ignore create mem entry for resource table
Sherry Sun <[email protected]>
tty: serial: fsl_lpuart: fix potential bug when using both of_alias_get_id and ida_simple_get
Miaoqian Lin <[email protected]>
serial: 8250_aspeed_vuart: Fix potential NULL dereference in aspeed_vuart_probe
Daniel Gibson <[email protected]>
tty: n_tty: Restore EOF push handling behavior
Miaoqian Lin <[email protected]>
tty: serial: owl: Fix missing clk_disable_unprepare() in owl_uart_probe
Wang Weiyang <[email protected]>
tty: goldfish: Use tty_port_destroy() to destroy port
Christophe Leroy <[email protected]>
lkdtm/bugs: Don't expect thread termination without CONFIG_UBSAN_TRAP
Jiasheng Jiang <[email protected]>
lkdtm/bugs: Check for the NULL pointer after calling kmalloc
Alexandru Tachici <[email protected]>
iio: adc: ad7124: Remove shift from scan_type
Jakob Koschel <[email protected]>
staging: greybus: codecs: fix type confusion of list iterator variable
Randy Dunlap <[email protected]>
pcmcia: db1xxx_ss: restrict to MIPS_DB1XXX boards
-------------
Diffstat:
Documentation/ABI/testing/sysfs-ata | 11 ++-- .../bindings/regulator/mt6315-regulator.yaml | 4 +- Makefile | 4 +- arch/arm/boot/dts/aspeed-ast2600-evb.dts | 4 +- arch/arm64/net/bpf_jit_comp.c | 1 + arch/m68k/Kconfig.machine | 1 + arch/m68k/include/asm/pgtable_no.h | 3 +- arch/m68k/kernel/setup_mm.c | 7 --- arch/m68k/kernel/setup_no.c | 1 - arch/m68k/kernel/time.c | 9 +++ arch/mips/kernel/mips-cpc.c | 1 + arch/powerpc/Kconfig | 2 - arch/powerpc/include/asm/ppc-opcode.h | 2 + arch/powerpc/include/asm/thread_info.h | 10 ++- arch/powerpc/kernel/idle.c | 2 +- arch/powerpc/kernel/idle_6xx.S | 2 +- arch/powerpc/kernel/l2cr_6xx.S | 6 +- arch/powerpc/kernel/ptrace/ptrace-fpu.c | 20 ++++-- arch/powerpc/kernel/ptrace/ptrace.c | 3 + arch/powerpc/kernel/swsusp_32.S | 2 +- arch/powerpc/kernel/swsusp_asm64.S | 2 +- arch/powerpc/mm/mmu_context.c | 2 +- arch/powerpc/platforms/powermac/cache.S | 4 +- arch/riscv/kernel/efi.c | 2 +- arch/riscv/kernel/machine_kexec.c | 4 +- arch/s390/crypto/aes_s390.c | 4 +- arch/s390/kernel/entry.S | 6 +- arch/s390/mm/gmap.c | 14 +++++ arch/um/drivers/chan_kern.c | 10 +-- arch/um/drivers/line.c | 22 ++++--- arch/um/drivers/line.h | 4 +- arch/um/drivers/ssl.c | 2 - arch/um/drivers/stdio_console.c | 2 - arch/um/include/asm/irq.h | 22 +++---- arch/x86/include/asm/cpufeature.h | 2 +- block/bio.c | 9 ++- block/blk-mq.c | 7 +-- drivers/ata/libata-transport.c | 2 +- drivers/ata/pata_octeon_cf.c | 3 + drivers/base/bus.c | 4 +- drivers/base/dd.c | 10 ++- drivers/block/nbd.c | 37 +++++++---- drivers/bus/ti-sysc.c | 4 +- drivers/char/random.c | 15 +++-- drivers/char/xillybus/xillyusb.c | 1 + drivers/clocksource/timer-oxnas-rps.c | 2 +- drivers/clocksource/timer-riscv.c | 2 +- drivers/clocksource/timer-sp804.c | 10 +-- drivers/dma/idxd/dma.c | 1 + drivers/dma/xilinx/zynqmp_dma.c | 5 +- drivers/extcon/extcon-axp288.c | 4 +- drivers/extcon/extcon-ptn5150.c | 11 ++++ drivers/extcon/extcon.c | 33 ++++++---- drivers/firmware/dmi-sysfs.c | 2 +- drivers/firmware/stratix10-svc.c | 12 ++-- drivers/gpio/gpio-pca953x.c | 19 +++--- drivers/gpu/drm/amd/amdgpu/nv.c | 1 + .../gpu/drm/amd/display/dc/dce/dce_clock_source.c | 9 ++- drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c | 2 +- drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 1 + drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 2 +- drivers/gpu/drm/ast/ast_mode.c | 5 +- drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 42 +++++++++++-- drivers/gpu/drm/bridge/ti-sn65dsi83.c | 34 +++++++--- drivers/gpu/drm/drm_atomic_helper.c | 16 ++++- drivers/gpu/drm/imx/ipuv3-crtc.c | 2 +- drivers/gpu/drm/radeon/radeon_connectors.c | 4 ++ drivers/hwtracing/coresight/coresight-cpu-debug.c | 7 ++- drivers/i2c/busses/i2c-cadence.c | 12 +++- drivers/iio/adc/ad7124.c | 1 - drivers/iio/adc/sc27xx_adc.c | 20 +++--- drivers/iio/adc/stmpe-adc.c | 8 +-- drivers/iio/common/st_sensors/st_sensors_core.c | 24 ++++++-- drivers/iio/dummy/iio_simple_dummy.c | 20 +++--- drivers/iio/proximity/vl53l0x-i2c.c | 7 +-- drivers/input/mouse/bcm5974.c | 7 ++- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 + drivers/iommu/arm/arm-smmu/arm-smmu.c | 5 +- drivers/md/md.c | 15 +++-- drivers/md/raid0.c | 31 +++++----- drivers/misc/cardreader/rtsx_usb.c | 1 + drivers/misc/fastrpc.c | 9 +-- drivers/misc/lkdtm/bugs.c | 10 ++- drivers/misc/lkdtm/lkdtm.h | 8 +-- drivers/misc/lkdtm/usercopy.c | 17 ++++- drivers/misc/pvpanic/pvpanic-mmio.c | 2 +- drivers/misc/pvpanic/pvpanic.c | 10 ++- drivers/mmc/core/block.c | 3 +- drivers/mtd/ubi/fastmap-wl.c | 69 ++++++++++++++------- drivers/mtd/ubi/fastmap.c | 11 ---- drivers/mtd/ubi/ubi.h | 4 +- drivers/mtd/ubi/vmt.c | 1 - drivers/mtd/ubi/wl.c | 19 +++--- drivers/net/dsa/lantiq_gswip.c | 4 +- drivers/net/dsa/mv88e6xxx/chip.c | 1 + drivers/net/dsa/mv88e6xxx/serdes.c | 27 ++++---- drivers/net/ethernet/altera/altera_tse_main.c | 6 +- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 11 ---- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 - drivers/net/ethernet/intel/i40e/i40e_xsk.c | 4 +- drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 8 +-- .../net/ethernet/marvell/octeontx2/af/rvu_cpt.c | 2 +- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 + drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/dev.c | 72 +++++++++++++++++----- .../ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 7 ++- drivers/net/ethernet/mellanox/mlx5/core/en/fs.h | 2 + drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c | 19 +++--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 5 ++ drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 38 +++++++++++- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 37 +++++++++-- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 12 ++-- .../net/ethernet/mellanox/mlx5/core/mlx5_core.h | 1 + .../ethernet/mellanox/mlx5/core/steering/fs_dr.c | 9 ++- .../net/ethernet/netronome/nfp/flower/conntrack.c | 32 +++++----- drivers/net/ethernet/netronome/nfp/flower/match.c | 16 ++--- .../net/ethernet/netronome/nfp/nfp_net_ethtool.c | 4 +- drivers/net/ethernet/sfc/efx_channels.c | 6 +- drivers/net/ethernet/sfc/net_driver.h | 2 +- drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 4 +- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 3 +- drivers/net/phy/dp83867.c | 29 +++++++++ drivers/net/phy/mdio_bus.c | 1 - drivers/nfc/st21nfca/se.c | 53 +++++++++------- drivers/pci/controller/dwc/pcie-qcom.c | 6 -- drivers/pcmcia/Kconfig | 2 +- drivers/phy/qualcomm/phy-qcom-qmp.c | 2 +- drivers/power/supply/axp288_charger.c | 17 ++--- drivers/power/supply/axp288_fuel_gauge.c | 1 - drivers/power/supply/charger-manager.c | 7 +-- drivers/power/supply/max8997_charger.c | 8 +-- drivers/pwm/pwm-lp3943.c | 1 + drivers/pwm/pwm-raspberrypi-poe.c | 2 +- drivers/remoteproc/imx_rproc.c | 3 + drivers/rpmsg/qcom_smd.c | 4 +- drivers/rpmsg/virtio_rpmsg_bus.c | 9 ++- drivers/rtc/rtc-ftrtc010.c | 38 ++++++++---- drivers/rtc/rtc-mt6397.c | 2 + drivers/scsi/myrb.c | 11 +++- drivers/scsi/sd.c | 1 - drivers/soc/rockchip/grf.c | 2 + drivers/soundwire/intel.c | 3 + drivers/soundwire/qcom.c | 2 +- drivers/staging/fieldbus/anybuss/host.c | 2 +- drivers/staging/greybus/audio_codec.c | 4 +- drivers/staging/r8188eu/core/rtw_xmit.c | 13 +++- drivers/staging/r8188eu/include/rtw_xmit.h | 2 +- drivers/staging/rtl8192e/rtllib_softmac.c | 2 +- .../staging/rtl8192u/ieee80211/ieee80211_softmac.c | 2 +- drivers/staging/rtl8712/os_intfs.c | 1 - drivers/staging/rtl8712/usb_intf.c | 12 ++-- drivers/staging/rtl8712/usb_ops.c | 27 +++++--- drivers/staging/rtl8723bs/core/rtw_mlme.c | 12 ++-- drivers/thunderbolt/tb.c | 19 +++++- drivers/thunderbolt/test.c | 16 ++--- drivers/thunderbolt/tunnel.c | 11 ++-- drivers/thunderbolt/tunnel.h | 4 +- drivers/tty/goldfish.c | 2 + drivers/tty/n_gsm.c | 36 +++++++---- drivers/tty/n_tty.c | 38 +++++++++++- drivers/tty/serial/8250/8250_aspeed_vuart.c | 2 + drivers/tty/serial/8250/8250_fintek.c | 8 +-- drivers/tty/serial/cpm_uart/cpm_uart_core.c | 2 +- drivers/tty/serial/digicolor-usart.c | 2 + drivers/tty/serial/fsl_lpuart.c | 24 ++------ drivers/tty/serial/icom.c | 2 +- drivers/tty/serial/meson_uart.c | 13 ++++ drivers/tty/serial/msm_serial.c | 5 ++ drivers/tty/serial/owl-uart.c | 1 + drivers/tty/serial/rda-uart.c | 2 + drivers/tty/serial/sa1100.c | 4 +- drivers/tty/serial/serial_txx9.c | 2 + drivers/tty/serial/sh-sci.c | 6 +- drivers/tty/serial/sifive.c | 8 ++- drivers/tty/serial/st-asc.c | 4 ++ drivers/tty/serial/stm32-usart.c | 15 ++++- drivers/tty/synclink_gt.c | 2 + drivers/tty/sysrq.c | 13 ++-- drivers/usb/core/hcd-pci.c | 4 +- drivers/usb/dwc2/gadget.c | 1 - drivers/usb/dwc3/drd.c | 9 +-- drivers/usb/dwc3/dwc3-pci.c | 2 +- drivers/usb/dwc3/gadget.c | 20 ++++-- drivers/usb/host/isp116x-hcd.c | 6 +- drivers/usb/host/oxu210hp-hcd.c | 2 + drivers/usb/musb/omap2430.c | 1 + drivers/usb/phy/phy-omap-otg.c | 4 +- drivers/usb/storage/karma.c | 15 ++--- drivers/usb/typec/mux.c | 14 +++-- drivers/usb/typec/tcpm/fusb302.c | 4 +- drivers/usb/usbip/stub_dev.c | 2 +- drivers/usb/usbip/stub_rx.c | 2 + drivers/vdpa/ifcvf/ifcvf_main.c | 3 +- drivers/vdpa/vdpa.c | 13 ++-- drivers/vdpa/vdpa_user/vduse_dev.c | 7 +-- drivers/vhost/vringh.c | 10 ++- drivers/video/fbdev/hyperv_fb.c | 19 +----- drivers/video/fbdev/pxa3xx-gcu.c | 12 ++-- drivers/virtio/virtio_pci_modern_dev.c | 1 + drivers/watchdog/rti_wdt.c | 2 +- drivers/watchdog/ts4800_wdt.c | 5 +- drivers/watchdog/wdat_wdt.c | 1 + drivers/xen/xlate_mmu.c | 1 - fs/afs/dir.c | 5 +- fs/ceph/mds_client.c | 33 ++++++++-- fs/ceph/xattr.c | 10 ++- fs/cifs/cifsfs.c | 2 +- fs/cifs/cifsfs.h | 2 +- fs/cifs/cifsglob.h | 4 +- fs/cifs/misc.c | 27 ++++---- fs/cifs/smb2ops.c | 7 ++- fs/cifs/smb2pdu.c | 3 + fs/f2fs/checkpoint.c | 4 +- fs/f2fs/file.c | 1 + fs/fs-writeback.c | 37 ++++++++--- fs/inode.c | 2 +- fs/jffs2/fs.c | 1 + fs/kernfs/dir.c | 31 ++++++---- fs/ksmbd/smbacl.c | 1 + fs/nfs/nfs4proc.c | 4 ++ fs/zonefs/super.c | 11 ++-- include/linux/export.h | 7 ++- include/linux/extcon.h | 2 +- include/linux/iio/common/st_sensors.h | 3 + include/linux/jump_label.h | 4 +- include/linux/mlx5/mlx5_ifc.h | 5 +- include/linux/nodemask.h | 38 ++++++------ include/linux/random.h | 2 +- include/net/flow_offload.h | 1 + include/net/netfilter/nf_tables.h | 1 - include/net/netfilter/nf_tables_offload.h | 2 +- include/net/sch_generic.h | 42 +++++-------- include/net/tcp.h | 19 ++++-- include/net/xdp_sock_drv.h | 5 +- include/net/xsk_buff_pool.h | 1 + include/trace/events/tcp.h | 2 +- kernel/bpf/core.c | 14 ++--- kernel/trace/trace.c | 13 +++- kernel/trace/trace_syscalls.c | 35 ++++------- lib/Makefile | 2 +- lib/iov_iter.c | 20 ++---- lib/nodemask.c | 4 +- net/core/filter.c | 2 +- net/core/flow_offload.c | 6 ++ net/ipv4/inet_hashtables.c | 10 +-- net/ipv4/ip_gre.c | 11 ++-- net/ipv4/tcp.c | 8 +-- net/ipv4/tcp_bbr.c | 20 +++--- net/ipv4/tcp_bic.c | 14 ++--- net/ipv4/tcp_cdg.c | 30 ++++----- net/ipv4/tcp_cong.c | 18 +++--- net/ipv4/tcp_cubic.c | 22 +++---- net/ipv4/tcp_dctcp.c | 11 ++-- net/ipv4/tcp_highspeed.c | 18 +++--- net/ipv4/tcp_htcp.c | 10 +-- net/ipv4/tcp_hybla.c | 18 +++--- net/ipv4/tcp_illinois.c | 12 ++-- net/ipv4/tcp_input.c | 36 +++++------ net/ipv4/tcp_ipv4.c | 2 +- net/ipv4/tcp_lp.c | 6 +- net/ipv4/tcp_metrics.c | 12 ++-- net/ipv4/tcp_nv.c | 24 ++++---- net/ipv4/tcp_output.c | 34 +++++----- net/ipv4/tcp_rate.c | 2 +- net/ipv4/tcp_scalable.c | 4 +- net/ipv4/tcp_vegas.c | 21 ++++--- net/ipv4/tcp_veno.c | 24 ++++---- net/ipv4/tcp_westwood.c | 3 +- net/ipv4/tcp_yeah.c | 30 ++++----- net/ipv4/xfrm4_protocol.c | 1 - net/ipv6/seg6_hmac.c | 1 - net/ipv6/tcp_ipv6.c | 2 +- net/key/af_key.c | 10 +-- net/netfilter/nf_tables_api.c | 54 +++++++--------- net/netfilter/nf_tables_offload.c | 23 ++++++- net/netfilter/nft_nat.c | 3 +- net/openvswitch/actions.c | 6 ++ net/openvswitch/conntrack.c | 4 +- net/sched/act_police.c | 16 ++++- net/smc/smc_cdc.c | 2 +- net/sunrpc/xdr.c | 6 +- net/sunrpc/xprtrdma/rpc_rdma.c | 5 ++ net/sunrpc/xprtrdma/svc_rdma_rw.c | 4 +- net/tipc/bearer.c | 3 +- net/unix/af_unix.c | 2 +- net/xdp/xsk.c | 16 ++--- net/xdp/xsk_buff_pool.c | 7 +++ net/xdp/xsk_queue.h | 14 +---- scripts/gdb/linux/config.py | 6 +- scripts/mod/modpost.c | 5 +- security/keys/trusted-keys/trusted_tpm2.c | 4 +- sound/pci/hda/patch_conexant.c | 7 +++ sound/pci/hda/patch_realtek.c | 2 + sound/soc/fsl/fsl_sai.h | 4 +- sound/usb/pcm.c | 5 +- sound/usb/quirks-table.h | 7 ++- tools/perf/builtin-c2c.c | 4 +- .../selftests/bpf/progs/test_stacktrace_build_id.c | 12 +--- .../testing/selftests/net/forwarding/tc_police.sh | 52 ++++++++++++++++ tools/testing/selftests/netfilter/nft_nat.sh | 43 +++++++++++++ 300 files changed, 1877 insertions(+), 1119 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/247 pcmcia: db1xxx_ss: restrict to MIPS_DB1XXX boards
From: Randy Dunlap <[email protected]>
[ Upstream commit 3928cf08334ed895a31458cbebd8d4ec6d84c080 ]
When the MIPS_ALCHEMY board selection is MIPS_XXS1500 instead of MIPS_DB1XXX, the PCMCIA driver 'db1xxx_ss' has build errors due to missing DB1XXX symbols. The PCMCIA driver should be restricted to MIPS_DB1XXX instead of MIPS_ALCHEMY to fix this build error.
ERROR: modpost: "bcsr_read" [drivers/pcmcia/db1xxx_ss.ko] undefined!
ERROR: modpost: "bcsr_mod" [drivers/pcmcia/db1xxx_ss.ko] undefined!
--- drivers/pcmcia/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pcmcia/Kconfig +1 -1
@@ -151,7 +151,7 @@ config TCIC config PCMCIA_ALCHEMY_DEVBOARD tristate "Alchemy Db/Pb1xxx PCMCIA socket services" - depends on MIPS_ALCHEMY && PCMCIA + depends on MIPS_DB1XXX && PCMCIA help Enable this driver of you want PCMCIA support on your Alchemy Db1000, Db/Pb1100, Db/Pb1500, Db/Pb1550, Db/Pb1200, DB1300
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 2/247 staging: greybus: codecs: fix type confusion of list iterator variable
In reply to Greg Kroah-HartmanFrom: Jakob Koschel <[email protected]>
[ Upstream commit 84ef256550196bc06e6849a34224c998b45bd557 ]
If the list does not exit early then data == NULL and 'module' does not point to a valid list element.
Using 'module' in such a case is not valid and was therefore removed.
--- drivers/staging/greybus/audio_codec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/greybus/audio_codec.c +2 -2
@@ -599,8 +599,8 @@ static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream)break ; }if (!data) { -dev_err (dai->dev,"%s:%s DATA connection missing\n" , - dai->name, module->name); +dev_err (dai->dev,"%s DATA connection missing\n" , + dai->name);mutex_unlock (&codec->lock);return -ENODEV ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 3/247 iio: adc: ad7124: Remove shift from scan_type
In reply to Greg Kroah-HartmanFrom: Alexandru Tachici <[email protected]>
[ Upstream commit fe78ccf79b0e29fd6d8dc2e2c3b0dbeda4ce3ad8 ]
The 24 bits data is stored in 32 bits in BE. There is no need to shift it. This confuses user-space apps.
--- drivers/iio/adc/ad7124.c | 1 - 1 file changed, 1 deletion(-)
drivers/iio/adc/ad7124.c +0 -1
@@ -188,7 +188,6 @@ static const struct iio_chan_spec ad7124_channel_template = { .sign = 'u', .realbits = 24, .storagebits = 32, - .shift = 8, .endianness = IIO_BE, }, };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 4/247 lkdtm/bugs: Check for the NULL pointer after calling kmalloc
In reply to Greg Kroah-HartmanFrom: Jiasheng Jiang <[email protected]>
[ Upstream commit 4a9800c81d2f34afb66b4b42e0330ae8298019a2 ]
As the possible failure of the kmalloc(), the not_checked and checked could be NULL pointer.
Therefore, it should be better to check it in order to avoid the dereference of the NULL pointer.
Also, we need to kfree the 'not_checked' and 'checked' to avoid the memory leak if fails.
And since it is just a test, it may directly return without error number.
--- drivers/misc/lkdtm/bugs.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/misc/lkdtm/bugs.c +5 -0
@@ -248,6 +248,11 @@ void lkdtm_ARRAY_BOUNDS(void) not_checked =kmalloc (sizeof (*not_checked) *2 ,GFP_KERNEL ); checked =kmalloc (sizeof (*checked) *2 ,GFP_KERNEL ); +if (!not_checked || !checked) { +kfree (not_checked); +kfree (checked); +return ; + }pr_info ("Array access within bounds ...\n" );/* For both, touch all bytes in the actual member size. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 5/247 lkdtm/bugs: Dont expect thread termination without CONFIG_UBSAN_TRAP
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
[ Upstream commit 8bfdbddd68249e0d8598777cca8249619ee51df0 ]
When you don't select CONFIG_UBSAN_TRAP, you get:
# echo ARRAY_BOUNDS > /sys/kernel/debug/provoke-crash/DIRECT [ 102.265827] ================================================================================ [ 102.278433] UBSAN: array-index-out-of-bounds in drivers/misc/lkdtm/bugs.c:342:16 [ 102.287207] index 8 is out of range for type 'char [8]' [ 102.298722] ================================================================================ [ 102.313712] lkdtm: FAIL: survived array bounds overflow! [ 102.318770] lkdtm: Unexpected! This kernel (5.16.0-rc1-s3k-dev-01884-g720dcf79314a ppc) was built with CONFIG_UBSAN_BOUNDS=y
It is not correct because when CONFIG_UBSAN_TRAP is not selected you can't expect array bounds overflow to kill the thread.
Modify the logic so that when the kernel is built with CONFIG_UBSAN_BOUNDS but without CONFIG_UBSAN_TRAP, you get a warning about CONFIG_UBSAN_TRAP not been selected instead.
This also require a fix of pr_expected_config(), otherwise the following error is encountered.
CC drivers/misc/lkdtm/bugs.odrivers/misc/lkdtm/bugs.c: In function 'lkdtm_ARRAY_BOUNDS':drivers/misc/lkdtm/bugs.c:351:2: error: 'else' without a previous 'if'
351 | else
| ^~~~--- drivers/misc/lkdtm/bugs.c | 5 ++++- drivers/misc/lkdtm/lkdtm.h | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-)
drivers/misc/lkdtm/bugs.c +4 -1
@@ -272,7 +272,10 @@ void lkdtm_ARRAY_BOUNDS(void)kfree (not_checked);kfree (checked);pr_err ("FAIL: survived array bounds overflow!\n" ); -pr_expected_config (CONFIG_UBSAN_BOUNDS ); +if (IS_ENABLED (CONFIG_UBSAN_BOUNDS )) +pr_expected_config (CONFIG_UBSAN_TRAP ); +else +pr_expected_config (CONFIG_UBSAN_BOUNDS ); }void lkdtm_CORRUPT_LIST_ADD (void )
drivers/misc/lkdtm/lkdtm.h +4 -4
@@ -9,19 +9,19 @@extern char *lkdtm_kernel_info;#define pr_expected_config (kconfig) \ -{ \ +do { \ if (IS_ENABLED(kconfig)) \ pr_err("Unexpected! This %s was built with " #kconfig "=y\n", \ lkdtm_kernel_info); \ else \ pr_warn("This is probably expected, since this %s was built *without* " #kconfig "=y\n", \ lkdtm_kernel_info); \ -} +} while (0)#ifndef MODULE int lkdtm_check_bool_cmdline (const char *param);#define pr_expected_config_param (kconfig, param) \ -{ \ +do { \ if (IS_ENABLED(kconfig)) { \ switch (lkdtm_check_bool_cmdline(param)) { \ case 0: \
@@ -52,7 +52,7 @@ int lkdtm_check_bool_cmdline(const char *param); break; \ } \ } \ -} +} while (0)#else #define pr_expected_config_param (kconfig, param) pr_expected_config(kconfig)#endif
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 6/247 tty: goldfish: Use tty_port_destroy() to destroy port
In reply to Greg Kroah-HartmanFrom: Wang Weiyang <[email protected]>
[ Upstream commit 507b05063d1b7a1fcb9f7d7c47586fc4f3508f98 ]
In goldfish_tty_probe(), the port initialized through tty_port_init() should be destroyed in error paths.In goldfish_tty_remove(), qtty->port also should be destroyed or else might leak resources.
Fix the above by calling tty_port_destroy().
--- drivers/tty/goldfish.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/goldfish.c +2 -0
@@ -407,6 +407,7 @@ static int goldfish_tty_probe(struct platform_device *pdev) err_tty_register_device_failed:free_irq (irq, qtty); err_dec_line_count: +tty_port_destroy (&qtty->port); goldfish_tty_current_line_count--;if (goldfish_tty_current_line_count ==0 )goldfish_tty_delete_driver ();
@@ -428,6 +429,7 @@ static int goldfish_tty_remove(struct platform_device *pdev)iounmap (qtty->base); qtty->base =NULL ;free_irq (qtty->irq, pdev); +tty_port_destroy (&qtty->port); goldfish_tty_current_line_count--;if (goldfish_tty_current_line_count ==0 )goldfish_tty_delete_driver ();
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 7/247 tty: serial: owl: Fix missing clk_disable_unprepare() in owl_uart_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit bcea0f547ec1a2ee44d429aaf0334633e386e67c ]
Fix the missing clk_disable_unprepare() before return from owl_uart_probe() in the error handling case.
--- drivers/tty/serial/owl-uart.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/owl-uart.c +1 -0
@@ -731,6 +731,7 @@ static int owl_uart_probe(struct platform_device *pdev) owl_port->port.uartclk =clk_get_rate (owl_port->clk);if (owl_port->port.uartclk ==0 ) {dev_err (&pdev->dev,"clock rate is zero\n" ); +clk_disable_unprepare (owl_port->clk);return -EINVAL ; } owl_port->port.flags =UPF_BOOT_AUTOCONF |UPF_IOREMAP |UPF_LOW_LATENCY ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 8/247 tty: n_tty: Restore EOF push handling behavior
In reply to Greg Kroah-HartmanFrom: Daniel Gibson <[email protected]>
[ Upstream commit 65a8b287023da68c4550deab5c764e6891cf1caf ]
TTYs in ICANON mode have a special case that allows "pushing" a line without a regular EOL character (like newline), by using EOF (the EOT character - ASCII 0x4) as a pseudo-EOL. It is silently discarded, so the reader of the PTS will receive the line *without* EOF or any other terminating character.
This special case has an edge case: What happens if the readers buffer is the same size as the line (without EOF)? Will they be able to tell if the whole line is received, i.e. if the next read() will return more of the same line or the next line?
There are two possibilities, that both have (dis)advantages:
1. The next read() returns 0. FreeBSD (13.0) and OSX (10.11) do this.
Advantage: The reader can interpret this as "the line is over".
Disadvantage: read() returning 0 means EOF, the reader could also interpret it as "there's no more data" and stop reading or even close the PT.
2. The next read() returns the next line, the EOF is silently discarded. Solaris (or at least OpenIndiana 2021.10) does this, Linux has done do this since commit 40d5e0905a03 ("n_tty: Fix EOF push handling"); this behavior was recently broken by commit 359303076163 ("tty:
n_tty: do not look ahead for EOL character past the end of the buffer").
Advantage: read() won't return 0 (EOF), reader less likely to be confused (and things like while(read(..)>0) don't break)
Disadvantage: The reader can't really know if the read() continues the last line (that filled the whole read buffer) or starts a new line.
As both options are defensible (and are used by other Unix-likes), it's best to stick to the "old" behavior since "n_tty: Fix EOF push handling" of 2013, i.e. silently discard that EOF.
This patch - that I actually got from Linus for testing and only modified slightly - restores that behavior by skipping an EOF character if it's the next character after reading is done.
Based on a patch from Linus Torvalds.
--- drivers/tty/n_tty.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
drivers/tty/n_tty.c +37 -1
@@ -2012,6 +2012,35 @@ static bool canon_copy_from_read_buf(struct tty_struct *tty,return ldata->read_tail != canon_head; } +/* +* If we finished a read at the exact location of an +* EOF (special EOL character that's a __DISABLED_CHAR) +* in the stream, silently eat the EOF. +*/ +static void canon_skip_eof (struct tty_struct *tty) +{ +struct n_tty_data *ldata = tty->disc_data; +size_t tail, canon_head; + + canon_head =smp_load_acquire (&ldata->canon_head); + tail = ldata->read_tail; + +// No data? +if (tail == canon_head) +return ; + +// See if the tail position is EOF in the circular buffer + tail &= (N_TTY_BUF_SIZE -1 ); +if (!test_bit (tail, ldata->read_flags)) +return ; +if (read_buf (ldata, tail) != __DISABLED_CHAR) +return ; + +// Clear the EOL bit, skip the EOF char. +clear_bit (tail, ldata->read_flags); +smp_store_release (&ldata->read_tail, ldata->read_tail +1 ); +} +/** * job_control - check job control * @tty: tty
@@ -2081,7 +2110,14 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,*/ if (*cookie) {if (ldata->icanon && !L_EXTPROC (tty)) { -if (canon_copy_from_read_buf (tty, &kb, &nr)) +/* +* If we have filled the user buffer, see +* if we should skip an EOF character before +* releasing the lock and returning done. +*/ +if (!nr) +canon_skip_eof (tty); +else if (canon_copy_from_read_buf (tty, &kb, &nr))return kb - kbuf; }else {if (copy_from_read_buf (tty, &kb, &nr))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 9/247 serial: 8250_aspeed_vuart: Fix potential NULL dereference in aspeed_vuart_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 0e0fd55719fa081de6f9e5d9e6cef48efb04d34a ]
platform_get_resource() may fail and return NULL, so we should better check it's return value to avoid a NULL pointer dereference.
--- drivers/tty/serial/8250/8250_aspeed_vuart.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/8250/8250_aspeed_vuart.c +2 -0
@@ -429,6 +429,8 @@ static int aspeed_vuart_probe(struct platform_device *pdev)timer_setup (&vuart->unthrottle_timer, aspeed_vuart_unthrottle_exp,0 ); res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (!res) +return -EINVAL ;memset (&port,0 ,sizeof (port)); port.port.private_data = vuart;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 10/247 tty: serial: fsl_lpuart: fix potential bug when using both of_alias_get_id and ida_simple_get
In reply to Greg Kroah-HartmanFrom: Sherry Sun <[email protected]>
[ Upstream commit f398e0aa325c61fa20903833a5b534ecb8e6e418 ]
Now fsl_lpuart driver use both of_alias_get_id() and ida_simple_get() in .probe(), which has the potential bug. For example, when remove the lpuart7 alias in dts, of_alias_get_id() will return error, then call ida_simple_get() to allocate the id 0 for lpuart7, this may confilct with the lpuart4 which has alias 0.
aliases {
...
serial0 = &lpuart4;
serial1 = &lpuart5;
serial2 = &lpuart6;
serial3 = &lpuart7;
}So remove the ida_simple_get() in .probe(), return an error directly when calling of_alias_get_id() fails, which is consistent with other uart drivers behavior.
--- drivers/tty/serial/fsl_lpuart.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-)
drivers/tty/serial/fsl_lpuart.c +4 -20
@@ -239,8 +239,6 @@/* IMX lpuart has four extra unused regs located at the beginning */ #define IMX_REG_OFF 0x10 -static DEFINE_IDA (fsl_lpuart_ida); -enum lpuart_type {VF610_LPUART ,LS1021A_LPUART ,
@@ -275,7 +273,6 @@ struct lpuart_port {int rx_dma_rng_buf_len;unsigned int dma_tx_nents;wait_queue_head_t dma_wait; -bool id_allocated; };struct lpuart_soc_data {
@@ -2703,23 +2700,18 @@ static int lpuart_probe(struct platform_device *pdev) ret =of_alias_get_id (np,"serial" );if (ret <0 ) { - ret =ida_simple_get (&fsl_lpuart_ida,0 ,UART_NR ,GFP_KERNEL ); -if (ret <0 ) { -dev_err (&pdev->dev,"port line is full, add device failed\n" ); -return ret; - } - sport->id_allocated = true; +dev_err (&pdev->dev,"failed to get alias id, errno %d\n" , ret); +return ret; }if (ret >=ARRAY_SIZE (lpuart_ports)) {dev_err (&pdev->dev,"serial%d out of range\n" , ret); - ret = -EINVAL ; - goto failed_out_of_range; +return -EINVAL ; } sport->port.line = ret; ret =lpuart_enable_clks (sport);if (ret) - goto failed_clock_enable; +return ret; sport->port.uartclk =lpuart_get_baud_clk_rate (sport); lpuart_ports[sport->port.line] = sport;
@@ -2767,10 +2759,6 @@ static int lpuart_probe(struct platform_device *pdev)uart_remove_one_port (&lpuart_reg, &sport->port); failed_attach_port:lpuart_disable_clks (sport); -failed_clock_enable: -failed_out_of_range: -if (sport->id_allocated) -ida_simple_remove (&fsl_lpuart_ida, sport->port.line);return ret; }
@@ -2780,9 +2768,6 @@ static int lpuart_remove(struct platform_device *pdev)uart_remove_one_port (&lpuart_reg, &sport->port); -if (sport->id_allocated) -ida_simple_remove (&fsl_lpuart_ida, sport->port.line); -lpuart_disable_clks (sport);if (sport->dma_tx_chan)
@@ -2912,7 +2897,6 @@ static int __init lpuart_serial_init(void) static void __exit lpuart_serial_exit(void) { -ida_destroy (&fsl_lpuart_ida);platform_driver_unregister (&lpuart_driver);uart_unregister_driver (&lpuart_reg); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/247 remoteproc: imx_rproc: Ignore create mem entry for resource table
In reply to Greg Kroah-HartmanFrom: Peng Fan <[email protected]>
[ Upstream commit 58b7c856519fe946620ee68dd0c37bd3c695484a ]
Resource table is used by Linux to get information published by remote processor. It should be not be used for memory allocation, so not create rproc mem entry.
--- drivers/remoteproc/imx_rproc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/remoteproc/imx_rproc.c +3 -0
@@ -447,6 +447,9 @@ static int imx_rproc_prepare(struct rproc *rproc)if (!strcmp (it.node->name,"vdev0buffer" ))continue ; +if (!strcmp (it.node->name,"rsc-table" )) +continue ; + rmem =of_reserved_mem_lookup (it.node);if (!rmem) {dev_err (priv->dev,"unable to acquire memory-region\n" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/247 usb: usbip: fix a refcount leak in stub_probe()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit 9ec4cbf1cc55d126759051acfe328d489c5d6e60 ]
usb_get_dev() is called in stub_device_alloc(). When stub_probe() fails after that, usb_put_dev() needs to be called to release the reference.
Fix this by moving usb_put_dev() to sdev_free error path handling.
Find this by code review.
--- drivers/usb/usbip/stub_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/usbip/stub_dev.c +1 -1
@@ -393,7 +393,6 @@ static int stub_probe(struct usb_device *udev) err_port:dev_set_drvdata (&udev->dev,NULL ); -usb_put_dev (udev);/* we already have busid_priv, just lock busid_lock */ spin_lock (&busid_priv->busid_lock);
@@ -408,6 +407,7 @@ static int stub_probe(struct usb_device *udev)put_busid_priv (busid_priv); sdev_free: +usb_put_dev (udev);stub_device_free (sdev);return rc;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 13/247 usb: usbip: add missing device lock on tweak configuration cmd
In reply to Greg Kroah-HartmanFrom: Niels Dossche <[email protected]>
[ Upstream commit d088fabace2ca337b275d1d4b36db4fe7771e44f ]
The function documentation of usb_set_configuration says that its callers should hold the device lock. This lock is held for all callsites except tweak_set_configuration_cmd. The code path can be executed for example when attaching a remote USB device. The solution is to surround the call by the device lock.
This bug was found using my experimental own-developed static analysis tool, which reported the missing lock on v5.17.2. I manually verified this bug report by doing code review as well. I runtime checked that the required lock is not held. I compiled and runtime tested this on x86_64 with a USB mouse. After applying this patch, my analyser no longer reports this potential bug.
--- drivers/usb/usbip/stub_rx.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/usbip/stub_rx.c +2 -0
@@ -138,7 +138,9 @@ static int tweak_set_configuration_cmd(struct urb *urb) req = (struct usb_ctrlrequest *) urb->setup_packet; config =le16_to_cpu (req->wValue); +usb_lock_device (sdev->udev); err =usb_set_configuration (sdev->udev, config); +usb_unlock_device (sdev->udev);if (err && err != -ENODEV )dev_err (&sdev->udev->dev,"can't set config #%d, error %d\n" , config, err);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/247 USB: storage: karma: fix rio_karma_init return
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit b92ffb1eddd9a66a90defc556dcbf65a43c196c7 ]
The function rio_karam_init() should return -ENOMEM instead of value 0 (USB_STOR_TRANSPORT_GOOD) when allocation fails.
Similarly, it should return -EIO when rio_karma_send_command() fails.
--- drivers/usb/storage/karma.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/usb/storage/karma.c +8 -7
@@ -174,24 +174,25 @@ static void rio_karma_destructor(void *extra)static int rio_karma_init (struct us_data *us) { -int ret =0 ;struct karma_data *data =kzalloc (sizeof (struct karma_data ),GFP_NOIO );if (!data) - goto out; +return -ENOMEM ; data->recv =kmalloc (RIO_RECV_LEN ,GFP_NOIO );if (!data->recv) {kfree (data); - goto out; +return -ENOMEM ; } us->extra = data; us->extra_destructor = rio_karma_destructor; - ret =rio_karma_send_command (RIO_ENTER_STORAGE , us); - data->in_storage = (ret ==0 ); -out: -return ret; +if (rio_karma_send_command (RIO_ENTER_STORAGE , us)) +return -EIO ; + + data->in_storage =1 ; + +return 0 ; }static struct scsi_host_template karma_host_template;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/247 usb: musb: Fix missing of_node_put() in omap2430_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 424bef51fa530389b0b9008c9e144e40c10e8458 ]
The device_node pointer is returned by of_parse_phandle() with refcount incremented. We should use of_node_put() on it when done.
--- drivers/usb/musb/omap2430.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/musb/omap2430.c +1 -0
@@ -363,6 +363,7 @@ static int omap2430_probe(struct platform_device *pdev) control_node =of_parse_phandle (np,"ctrl-module" ,0 );if (control_node) { control_pdev =of_find_device_by_node (control_node); +of_node_put (control_node);if (!control_pdev) {dev_err (&pdev->dev,"Failed to get control device\n" ); ret = -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/247 staging: fieldbus: Fix the error handling path in anybuss_host_common_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 7079b3483a17be2cfba64cbd4feb1b7ae07f1ea7 ]
If device_register() fails, device_unregister() should not be called because it will free some resources that are not allocated. put_device() should be used instead.
--- drivers/staging/fieldbus/anybuss/host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/fieldbus/anybuss/host.c +1 -1
@@ -1384,7 +1384,7 @@ anybuss_host_common_probe(struct device *dev, goto err_device;return cd; err_device: -device_unregister (&cd->client->dev); +put_device (&cd->client->dev); err_kthread:kthread_stop (cd->qthread); err_reset:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/247 pwm: lp3943: Fix duty calculation in case period was clamped
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 5e3b07ca5cc78cd4a987e78446849e41288d87cb ]
The hardware only supports periods <= 1.6 ms and if a bigger period is requested it is clamped to 1.6 ms. In this case duty_cycle might be bigger than 1.6 ms and then the duty cycle register is written with a value bigger than LP3943_MAX_DUTY. So clamp duty_cycle accordingly.
--- drivers/pwm/pwm-lp3943.c | 1 + 1 file changed, 1 insertion(+)
drivers/pwm/pwm-lp3943.c +1 -0
@@ -125,6 +125,7 @@ static int lp3943_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,if (err)return err; + duty_ns =min (duty_ns, period_ns); val = (u8)(duty_ns *LP3943_MAX_DUTY / period_ns);return lp3943_write_byte (lp3943, reg_duty, val);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/247 pwm: raspberrypi-poe: Fix endianness in firmware struct
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 09f688f0718f57f9cf68ee1aa94490f641e759ba ]
The reg member of struct raspberrypi_pwm_prop is a little endian 32 bit quantity. Explicitly convert the (native endian) value to little endian on assignment as is already done in raspberrypi_pwm_set_property().
This fixes the following sparse warning:
drivers/pwm/pwm-raspberrypi-poe.c:69:24: warning: incorrect type in initializer (different base types)
drivers/pwm/pwm-raspberrypi-poe.c:69:24: expected restricted __le32 [usertype] reg
drivers/pwm/pwm-raspberrypi-poe.c:69:24: got unsigned int [usertype] reg
--- drivers/pwm/pwm-raspberrypi-poe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pwm/pwm-raspberrypi-poe.c +1 -1
@@ -66,7 +66,7 @@ static int raspberrypi_pwm_get_property(struct rpi_firmware *firmware, u32 reg, u32 *val) { struct raspberrypi_pwm_prop msg = { - .reg = reg + .reg =cpu_to_le32 (reg), };int ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/247 rpmsg: qcom_smd: Fix irq_of_parse_and_map() return value
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 1a358d35066487d228a68303d808bc4721c6b1b9 ]
The irq_of_parse_and_map() returns 0 on failure, not a negative ERRNO.
--- drivers/rpmsg/qcom_smd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rpmsg/qcom_smd.c +1 -1
@@ -1404,7 +1404,7 @@ static int qcom_smd_parse_edge(struct device *dev, edge->name = node->name; irq =irq_of_parse_and_map (node,0 ); -if (irq <0 ) { +if (!irq) {dev_err (dev,"required smd interrupt missing\n" ); ret = irq; goto put_node;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/247 usb: dwc3: gadget: Replace list_for_each_entry_safe() if using giveback
In reply to Greg Kroah-HartmanFrom: Wesley Cheng <[email protected]>
[ Upstream commit bf594d1d0c1d7b895954018043536ffd327844f9 ]
The list_for_each_entry_safe() macro saves the current item (n) and the item after (n+1), so that n can be safely removed without corrupting the list. However, when traversing the list and removing items using gadget giveback, the DWC3 lock is briefly released, allowing other routines to execute. There is a situation where, while items are being removed from the cancelled_list using dwc3_gadget_ep_cleanup_cancelled_requests(), the pullup disable routine is running in parallel (due to UDC unbind). As the cleanup routine removes n, and the pullup disable removes n+1, once the cleanup retakes the DWC3 lock, it references a request who was already removed/handled. With list debug enabled, this leads to a panic. Ensure all instances of the macro are replaced where gadget giveback is used.
Example call stack:
Thread#1:__dwc3_gadget_ep_set_halt() - CLEAR HALT
-> dwc3_gadget_ep_cleanup_cancelled_requests()
->list_for_each_entry_safe()
->dwc3_gadget_giveback(n)
->dwc3_gadget_del_and_unmap_request()- n deleted[cancelled_list]
->spin_unlock
->Thread#2 executes
...
->dwc3_gadget_giveback(n+1)
->Already removed!Thread#2:dwc3_gadget_pullup()
->waiting for dwc3 spin_lock
...
->Thread#1 released lock
->dwc3_stop_active_transfers()
->dwc3_remove_requests()
->fetches n+1 item from cancelled_list (n removed by Thread#1)
->dwc3_gadget_giveback()
->dwc3_gadget_del_and_unmap_request()- n+1 deleted[cancelled_list]
->spin_unlock--- drivers/usb/dwc3/gadget.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/usb/dwc3/gadget.c +16 -4
@@ -1955,10 +1955,10 @@ static void dwc3_gadget_ep_skip_trbs(struct dwc3_ep *dep, struct dwc3_request *rstatic void dwc3_gadget_ep_cleanup_cancelled_requests (struct dwc3_ep *dep) {struct dwc3_request *req; -struct dwc3_request *tmp;struct dwc3 *dwc = dep->dwc; -list_for_each_entry_safe (req, tmp, &dep->cancelled_list, list) { +while (!list_empty (&dep->cancelled_list)) { + req =next_request (&dep->cancelled_list);dwc3_gadget_ep_skip_trbs (dep, req);switch (req->status) {case DWC3_REQUEST_STATUS_DISCONNECTED :
@@ -1975,6 +1975,12 @@ static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep)dwc3_gadget_giveback (dep, req, -ECONNRESET );break ; } +/* +* The endpoint is disabled, let the dwc3_remove_requests() +* handle the cleanup. +*/ +if (!dep->endpoint.desc) +break ; } }
@@ -3258,15 +3264,21 @@ static void dwc3_gadget_ep_cleanup_completed_requests(struct dwc3_ep *dep, const struct dwc3_event_depevt *event, int status) {struct dwc3_request *req; -struct dwc3_request *tmp; -list_for_each_entry_safe (req, tmp, &dep->started_list, list) { +while (!list_empty (&dep->started_list)) {int ret; + req =next_request (&dep->started_list); ret =dwc3_gadget_ep_cleanup_completed_request (dep, event, req, status);if (ret)break ; +/* +* The endpoint is disabled, let the dwc3_remove_requests() +* handle the cleanup. +*/ +if (!dep->endpoint.desc) +break ; } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/247 usb: dwc3: pci: Fix pm_runtime_get_sync() error checking
In reply to Greg Kroah-HartmanFrom: Zheng Yongjun <[email protected]>
[ Upstream commit a03e2ddab8e735e2cc315609b297b300e9cc60d2 ]
If the device is already in a runtime PM enabled state pm_runtime_get_sync() will return 1, so a test for negative value should be used to check for errors.
--- drivers/usb/dwc3/dwc3-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc3/dwc3-pci.c +1 -1
@@ -256,7 +256,7 @@ static void dwc3_pci_resume_work(struct work_struct *work)int ret; ret =pm_runtime_get_sync (&dwc3->dev); -if (ret) { +if (ret <0 ) {pm_runtime_put_sync_autosuspend (&dwc3->dev);return ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/247 misc: fastrpc: fix an incorrect NULL check on list iterator
In reply to Greg Kroah-HartmanFrom: Xiaomeng Tong <[email protected]>
[ Upstream commit 5ac11fe03a0a83042d1a040dbce4fa2fb5521e23 ]
The bug is here:
if (!buf) {The list iterator value 'buf' will *always* be set and non-NULL by list_for_each_entry(), so it is incorrect to assume that the iterator value will be NULL if the list is empty (in this case, the check 'if (!buf) {' will always be false and never exit expectly).
To fix the bug, use a new variable 'iter' as the list iterator, while use the original variable 'buf' as a dedicated pointer to point to the found element.
--- drivers/misc/fastrpc.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/misc/fastrpc.c +5 -4
@@ -1351,17 +1351,18 @@ static int fastrpc_req_munmap_impl(struct fastrpc_user *fl, struct fastrpc_req_munmap *req) {struct fastrpc_invoke_args args[1 ] = { [0 ] = {0 } }; -struct fastrpc_buf *buf, *b; +struct fastrpc_buf *buf =NULL , *iter, *b;struct fastrpc_munmap_req_msg req_msg;struct device *dev = fl->sctx->dev;int err;u32 sc;spin_lock (&fl->lock); -list_for_each_entry_safe (buf, b, &fl->mmaps, node) { -if ((buf->raddr == req->vaddrout) && (buf->size == req->size)) +list_for_each_entry_safe (iter, b, &fl->mmaps, node) { +if ((iter->raddr == req->vaddrout) && (iter->size == req->size)) { + buf = iter;break ; - buf =NULL ; + } }spin_unlock (&fl->lock);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/247 firmware: stratix10-svc: fix a missing check on list iterator
In reply to Greg Kroah-HartmanFrom: Xiaomeng Tong <[email protected]>
[ Upstream commit 5a0793ac66ac0e254d292f129a4d6c526f9f2aff ]
The bug is here:
pmem->vaddr = NULL;
The list iterator 'pmem' will point to a bogus position containing HEAD if the list is empty or no element is found. This case must be checked before any use of the iterator, otherwise it will lead to a invalid memory access.
To fix this bug, just gen_pool_free/set NULL/list_del() and return when found, otherwise list_del HEAD and return;
--- drivers/firmware/stratix10-svc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/firmware/stratix10-svc.c +6 -6
@@ -941,17 +941,17 @@ EXPORT_SYMBOL_GPL(stratix10_svc_allocate_memory);void stratix10_svc_free_memory (struct stratix10_svc_chan *chan,void *kaddr) {struct stratix10_svc_data_mem *pmem; -size_t size =0 ;list_for_each_entry (pmem, &svc_data_mem, node)if (pmem->vaddr == kaddr) { - size = pmem->size; -break ; +gen_pool_free (chan->ctrl->genpool, + (unsigned long )kaddr, pmem->size); + pmem->vaddr =NULL ; +list_del (&pmem->node); +return ; } -gen_pool_free (chan->ctrl->genpool, (unsigned long )kaddr, size); - pmem->vaddr =NULL ; -list_del (&pmem->node); +list_del (&svc_data_mem); }EXPORT_SYMBOL_GPL (stratix10_svc_free_memory);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/247 usb: typec: mux: Check dev_set_name() return value
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit b9fa0292490db39d6542f514117333d366ec0011 ]
It's possible that dev_set_name() returns -ENOMEM, catch and handle this.
--- drivers/usb/typec/mux.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/usb/typec/mux.c +10 -4
@@ -131,8 +131,11 @@ typec_switch_register(struct device *parent, sw->dev.class = &typec_mux_class; sw->dev.type = &typec_switch_dev_type; sw->dev.driver_data = desc->drvdata; -dev_set_name (&sw->dev,"%s-switch" , - desc->name ? desc->name :dev_name (parent)); + ret =dev_set_name (&sw->dev,"%s-switch" , desc->name ? desc->name :dev_name (parent)); +if (ret) { +put_device (&sw->dev); +return ERR_PTR (ret); + } ret =device_add (&sw->dev);if (ret) {
@@ -338,8 +341,11 @@ typec_mux_register(struct device *parent, const struct typec_mux_desc *desc) mux->dev.class = &typec_mux_class; mux->dev.type = &typec_mux_dev_type; mux->dev.driver_data = desc->drvdata; -dev_set_name (&mux->dev,"%s-mux" , - desc->name ? desc->name :dev_name (parent)); + ret =dev_set_name (&mux->dev,"%s-mux" , desc->name ? desc->name :dev_name (parent)); +if (ret) { +put_device (&mux->dev); +return ERR_PTR (ret); + } ret =device_add (&mux->dev);if (ret) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 25/247 rpmsg: virtio: Fix possible double free in rpmsg_probe()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit c2eecefec5df1306eafce28ccdf1ca159a552ecc ]
vch will be free in virtio_rpmsg_release_device() when rpmsg_ns_register_device() fails. There is no need to call kfree() again.
Fix this by changing error path from free_vch to free_ctrldev.
--- drivers/rpmsg/virtio_rpmsg_bus.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/rpmsg/virtio_rpmsg_bus.c +2 -3
@@ -964,7 +964,8 @@ static int rpmsg_probe(struct virtio_device *vdev) err =rpmsg_ns_register_device (rpdev_ns);if (err) - goto free_vch; +/* vch will be free in virtio_rpmsg_release_device() */ + goto free_ctrldev; }/*
@@ -988,8 +989,6 @@ static int rpmsg_probe(struct virtio_device *vdev)return 0 ; -free_vch: -kfree (vch); free_ctrldev:rpmsg_virtio_del_ctrl_dev (rpdev_ctrl); free_coherent:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 26/247 rpmsg: virtio: Fix possible double free in rpmsg_virtio_add_ctrl_dev()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit 1680939e9ecf7764fba8689cfb3429c2fe2bb23c ]
vch will be free in virtio_rpmsg_release_device() when rpmsg_ctrldev_register_device() fails. There is no need to call kfree() again.
--- drivers/rpmsg/virtio_rpmsg_bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rpmsg/virtio_rpmsg_bus.c +1 -1
@@ -842,7 +842,7 @@ static struct rpmsg_device *rpmsg_virtio_add_ctrl_dev(struct virtio_device *vdev err =rpmsg_chrdev_register_device (rpdev_ctrl);if (err) { -kfree (vch); +/* vch will be free in virtio_rpmsg_release_device() */ return ERR_PTR (err); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 27/247 rpmsg: virtio: Fix the unregistration of the device rpmsg_ctrl
In reply to Greg Kroah-HartmanFrom: Arnaud Pouliquen <[email protected]>
[ Upstream commit df191796985922488e4e6b64f7bd79c3934412f2 ]
Unregister the rpmsg_ctrl device instead of just freeing the the virtio_rpmsg_channel structure.
This will properly unregister the device and call virtio_rpmsg_release_device() that frees the structure.
--- drivers/rpmsg/virtio_rpmsg_bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rpmsg/virtio_rpmsg_bus.c +1 -1
@@ -853,7 +853,7 @@ static void rpmsg_virtio_del_ctrl_dev(struct rpmsg_device *rpdev_ctrl) {if (!rpdev_ctrl)return ; -kfree (to_virtio_rpmsg_channel (rpdev_ctrl)); +device_unregister (&rpdev_ctrl->dev); }static int rpmsg_probe (struct virtio_device *vdev)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 28/247 iio: adc: stmpe-adc: Fix wait_for_completion_timeout return value check
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit d345b23200bcdbd2bd3582213d738c258b77718f ]
wait_for_completion_timeout() returns unsigned long not long. it returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case
--- drivers/iio/adc/stmpe-adc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/iio/adc/stmpe-adc.c +4 -4
@@ -61,7 +61,7 @@ struct stmpe_adc {static int stmpe_read_voltage (struct stmpe_adc *info,struct iio_chan_spec const *chan,int *val) { -long ret; +unsigned long ret;mutex_lock (&info->lock);
@@ -79,7 +79,7 @@ static int stmpe_read_voltage(struct stmpe_adc *info, ret =wait_for_completion_timeout (&info->completion,STMPE_ADC_TIMEOUT ); -if (ret <=0 ) { +if (ret ==0 ) {stmpe_reg_write (info->stmpe,STMPE_REG_ADC_INT_STA ,STMPE_ADC_CH (info->channel));mutex_unlock (&info->lock);
@@ -96,7 +96,7 @@ static int stmpe_read_voltage(struct stmpe_adc *info,static int stmpe_read_temp (struct stmpe_adc *info,struct iio_chan_spec const *chan,int *val) { -long ret; +unsigned long ret;mutex_lock (&info->lock);
@@ -114,7 +114,7 @@ static int stmpe_read_temp(struct stmpe_adc *info, ret =wait_for_completion_timeout (&info->completion,STMPE_ADC_TIMEOUT ); -if (ret <=0 ) { +if (ret ==0 ) {mutex_unlock (&info->lock);return -ETIMEDOUT ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 29/247 iio: proximity: vl53l0x: Fix return value check of wait_for_completion_timeout
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 50f2959113cb6756ffd73c4fedc712cf2661f711 ]
wait_for_completion_timeout() returns unsigned long not int. It returns 0 if timed out, and positive if completed. The check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case.
--- drivers/iio/proximity/vl53l0x-i2c.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/iio/proximity/vl53l0x-i2c.c +3 -4
@@ -104,6 +104,7 @@ static int vl53l0x_read_proximity(struct vl53l0x_data *data,u16 tries =20 ;u8 buffer[12 ];int ret; +unsigned long time_left; ret =i2c_smbus_write_byte_data (client,VL_REG_SYSRANGE_START ,1 );if (ret <0 )
@@ -112,10 +113,8 @@ static int vl53l0x_read_proximity(struct vl53l0x_data *data,if (data->client->irq) {reinit_completion (&data->completion); - ret =wait_for_completion_timeout (&data->completion,HZ /10 ); -if (ret <0 ) -return ret; -else if (ret ==0 ) + time_left =wait_for_completion_timeout (&data->completion,HZ /10 ); +if (time_left ==0 )return -ETIMEDOUT ;vl53l0x_clear_irq (data);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 30/247 iio: adc: sc27xx: fix read big scale voltage not right
In reply to Greg Kroah-HartmanFrom: Cixi Geng <[email protected]>
[ Upstream commit ad930a75613282400179361e220e58b87386b8c7 ]
Fix wrong configuration value of SC27XX_ADC_SCALE_MASK and SC27XX_ADC_SCALE_SHIFT by spec documetation.
--- drivers/iio/adc/sc27xx_adc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/adc/sc27xx_adc.c +2 -2
@@ -36,8 +36,8 @@/* Bits and mask definition for SC27XX_ADC_CH_CFG register */ #define SC27XX_ADC_CHN_ID_MASK GENMASK(4, 0) -#define SC27XX_ADC_SCALE_MASK GENMASK(10, 8) -#define SC27XX_ADC_SCALE_SHIFT 8 +#define SC27XX_ADC_SCALE_MASK GENMASK(10, 9) +#define SC27XX_ADC_SCALE_SHIFT 9/* Bits definitions for SC27XX_ADC_INT_EN registers */ #define SC27XX_ADC_IRQ_EN BIT(0)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 31/247 iio: adc: sc27xx: Fine tune the scale calibration values
In reply to Greg Kroah-HartmanFrom: Cixi Geng <[email protected]>
[ Upstream commit 5a7a184b11c6910f47600ff5cbbee34168f701a8 ]
Small adjustment the scale calibration value for the sc2731, use new name sc2731_[big|small]_scale_graph_calib, and remove the origin [big|small]_scale_graph_calib struct for unused.
--- drivers/iio/adc/sc27xx_adc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/iio/adc/sc27xx_adc.c +8 -8
@@ -103,14 +103,14 @@ static struct sc27xx_adc_linear_graph small_scale_graph = { 100, 341, }; -static const struct sc27xx_adc_linear_graph big_scale_graph_calib = { -4200 ,856 , -3600 ,733 , +static const struct sc27xx_adc_linear_graph sc2731_big_scale_graph_calib = { +4200 ,850 , +3600 ,728 , }; -static const struct sc27xx_adc_linear_graph small_scale_graph_calib = { -1000 ,833 , -100 ,80 , +static const struct sc27xx_adc_linear_graph sc2731_small_scale_graph_calib = { +1000 ,838 , +100 ,84 , };static int sc27xx_adc_get_calib_data (u32 calib_data,int calib_adc)
@@ -130,11 +130,11 @@ static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data,size_t len;if (big_scale) { - calib_graph = &big_scale_graph_calib; + calib_graph = &sc2731_big_scale_graph_calib; graph = &big_scale_graph; cell_name ="big_scale_calib" ; }else { - calib_graph = &small_scale_graph_calib; + calib_graph = &sc2731_small_scale_graph_calib; graph = &small_scale_graph; cell_name ="small_scale_calib" ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/247 rpmsg: qcom_smd: Fix returning 0 if irq_of_parse_and_map() fails
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 59d6f72f6f9c92fec8757d9e29527da828e9281f ]
irq_of_parse_and_map() returns 0 on failure, so this should not be passed further as error return code.
--- drivers/rpmsg/qcom_smd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/rpmsg/qcom_smd.c +1 -1
@@ -1406,7 +1406,7 @@ static int qcom_smd_parse_edge(struct device *dev, irq =irq_of_parse_and_map (node,0 );if (!irq) {dev_err (dev,"required smd interrupt missing\n" ); - ret = irq; + ret = -EINVAL ; goto put_node; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/247 pvpanic: Fix typos in the comments
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit cc5b392d0f94f27743583140d819fa35a46899db ]
Fix a few spelling typos in the comments.
--- drivers/misc/pvpanic/pvpanic-mmio.c | 2 +- drivers/misc/pvpanic/pvpanic.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/misc/pvpanic/pvpanic-mmio.c +1 -1
@@ -100,7 +100,7 @@ static int pvpanic_mmio_probe(struct platform_device *pdev) pi->base = base; pi->capability =PVPANIC_PANICKED |PVPANIC_CRASH_LOADED ; -/* initlize capability by RDPT */ +/* initialize capability by RDPT */ pi->capability &=ioread8 (base); pi->events = pi->capability;
drivers/misc/pvpanic/pvpanic.c +1 -1
@@ -58,7 +58,7 @@ pvpanic_panic_notify(struct notifier_block *nb, unsigned long code,static struct notifier_block pvpanic_panic_nb = { .notifier_call = pvpanic_panic_notify, - .priority =1 ,/* let this called before broken drm_fb_helper */ + .priority =1 ,/* let this called before broken drm_fb_helper() */ };static void pvpanic_remove (void *param)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/247 misc/pvpanic: Convert regular spinlock into trylock on panic path
In reply to Greg Kroah-HartmanFrom: Guilherme G. Piccoli <[email protected]>
[ Upstream commit e918c10265ef2bc82ce8a6fed6d8123d09ec1db3 ]
The pvpanic driver relies on panic notifiers to execute a callback on panic event. Such function is executed in atomic context - the panic function disables local IRQs, preemption and all other CPUs that aren't running the panic code.
With that said, it's dangerous to use regular spinlocks in such path, as introduced by commit b3c0f8774668 ("misc/pvpanic: probe multiple instances"). This patch fixes that by replacing regular spinlocks with the trylock safer approach.
It also fixes an old comment (about a long gone framebuffer code) and the notifier priority - we should execute hypervisor notifiers early, deferring this way the panic action to the hypervisor, as expected by the users that are setting up pvpanic.
--- drivers/misc/pvpanic/pvpanic.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/misc/pvpanic/pvpanic.c +8 -2
@@ -34,7 +34,9 @@ pvpanic_send_event(unsigned int event) {struct pvpanic_instance *pi_cur; -spin_lock (&pvpanic_lock); +if (!spin_trylock (&pvpanic_lock)) +return ; +list_for_each_entry (pi_cur, &pvpanic_list, list) {if (event & pi_cur->capability & pi_cur->events)iowrite8 (event, pi_cur->base);
@@ -56,9 +58,13 @@ pvpanic_panic_notify(struct notifier_block *nb, unsigned long code,return NOTIFY_DONE ; } +/* +* Call our notifier very early on panic, deferring the +* action taken to the hypervisor. +*/ static struct notifier_block pvpanic_panic_nb = { .notifier_call = pvpanic_panic_notify, - .priority =1 ,/* let this called before broken drm_fb_helper() */ + .priority =INT_MAX , };static void pvpanic_remove (void *param)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/247 phy: qcom-qmp: fix pipe-clock imbalance on power-on failure
In reply to Greg Kroah-HartmanFrom: Johan Hovold <[email protected]>
[ Upstream commit 5e73b2d9867998278479ccc065a8a8227a5513ef ]
Make sure to disable the pipe clock also if ufs-reset deassertion fails during power on.
Note that the ufs-reset is asserted in qcom_qmp_phy_com_exit().
--- drivers/phy/qualcomm/phy-qcom-qmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/qualcomm/phy-qcom-qmp.c +1 -1
@@ -4802,7 +4802,7 @@ static int qcom_qmp_phy_power_on(struct phy *phy) ret =reset_control_deassert (qmp->ufs_reset);if (ret) - goto err_lane_rst; + goto err_pcs_ready;qcom_qmp_phy_configure (pcs_misc, cfg->regs, cfg->pcs_misc_tbl, cfg->pcs_misc_tbl_num);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/247 power: supply: axp288_fuel_gauge: Drop BIOS version check from "T3 MRD" DMI quirk
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit f61509a6f0b70f5bedea34efaf8065621689bd7a ]
Some "T3 MRD" mini-PCs / HDMI-sticks without a battery use a different value then "5.11" for their DMI BIOS version field.
Drop the BIOS version check so that the no-battery "T3 MRD" DMI quirk applies to these too.
--- drivers/power/supply/axp288_fuel_gauge.c | 1 - 1 file changed, 1 deletion(-)
drivers/power/supply/axp288_fuel_gauge.c +0 -1
@@ -605,7 +605,6 @@ static const struct dmi_system_id axp288_no_battery_list[] = { DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"), DMI_MATCH(DMI_CHASSIS_TYPE, "3"), DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."), - DMI_MATCH(DMI_BIOS_VERSION, "5.11"), }, }, {}
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/247 serial: sifive: Report actual baud base rather than fixed 115200
In reply to Greg Kroah-HartmanFrom: Maciej W. Rozycki <[email protected]>
[ Upstream commit 0a7ff843d507ce2cca2c3b7e169ee56e28133530 ]
The base baud value reported is supposed to be the highest baud rate that can be set for a serial port. The SiFive FU740-C000 SOC's on-chip UART supports baud rates of up to 1/16 of the input clock rate, which is the bus clock `tlclk'[1], often at 130MHz in the case of the HiFive Unmatched board.
However the sifive UART driver reports a fixed value of 115200 instead:
10010000.serial: ttySIF0 at MMIO 0x10010000 (irq = 1, base_baud = 115200) is a SiFive UART v0 10011000.serial: ttySIF1 at MMIO 0x10011000 (irq = 2, base_baud = 115200) is a SiFive UART v0
even though we already support setting higher baud rates, e.g.:
$ tty /dev/ttySIF1 $ stty speed 230400
The baud base value is computed by the serial core by dividing the UART clock recorded in `struct uart_port' by 16, which is also the minimum value of the clock divider supported, so correct the baud base value reported by setting the UART clock recorded to the input clock rate rather than 115200:
10010000.serial: ttySIF0 at MMIO 0x10010000 (irq = 1, base_baud = 8125000) is a SiFive UART v0 10011000.serial: ttySIF1 at MMIO 0x10011000 (irq = 2, base_baud = 8125000) is a SiFive UART v0
[1] "SiFive FU740-C000 Manual", v1p3, SiFive, Inc., August 13, 2021,
Section 16.9 "Baud Rate Divisor Register (div)", pp.143-144
--- drivers/tty/serial/sifive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/sifive.c +1 -1
@@ -998,7 +998,7 @@ static int sifive_serial_probe(struct platform_device *pdev)/* Set up clock divider */ ssp->clkin_rate =clk_get_rate (ssp->clk); ssp->baud_rate =SIFIVE_DEFAULT_BAUD_RATE ; - ssp->port.uartclk = ssp->baud_rate *16 ; + ssp->port.uartclk = ssp->clkin_rate;__ssp_update_div (ssp);platform_set_drvdata (pdev, ssp);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/247 export: fix string handling of namespace in EXPORT_SYMBOL_NS
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
[ Upstream commit d143b9db8069f0e2a0fa34484e806a55a0dd4855 ]
Commit c3a6cf19e695 ("export: avoid code duplication in include/linux/export.h") broke the ability for a defined string to be used as a namespace value. Fix this up by using stringify to properly encode the namespace name.
--- include/linux/export.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
include/linux/export.h +4 -3
@@ -2,6 +2,8 @@#ifndef _LINUX_EXPORT_H#define _LINUX_EXPORT_H +#include <linux/stringify.h> +/* * Export symbols from the kernel to modules. Forked from module.h * to reduce the amount of pointless cruft we feed to gcc when only
@@ -154,7 +156,6 @@ struct kernel_symbol {#endif /* CONFIG_MODULES */ #ifdef DEFAULT_SYMBOL_NAMESPACE -#include <linux/stringify.h> #define _EXPORT_SYMBOL (sym, sec) __EXPORT_SYMBOL(sym, sec, __stringify(DEFAULT_SYMBOL_NAMESPACE))#else #define _EXPORT_SYMBOL (sym, sec) __EXPORT_SYMBOL(sym, sec, "")
@@ -162,8 +163,8 @@ struct kernel_symbol {#define EXPORT_SYMBOL (sym) _EXPORT_SYMBOL(sym, "")#define EXPORT_SYMBOL_GPL (sym) _EXPORT_SYMBOL(sym, "_gpl") -#define EXPORT_SYMBOL_NS (sym, ns) __EXPORT_SYMBOL(sym, "", #ns) -#define EXPORT_SYMBOL_NS_GPL (sym, ns) __EXPORT_SYMBOL(sym, "_gpl", #ns) +#define EXPORT_SYMBOL_NS (sym, ns) __EXPORT_SYMBOL(sym, "", __stringify(ns)) +#define EXPORT_SYMBOL_NS_GPL (sym, ns) __EXPORT_SYMBOL(sym, "_gpl", __stringify(ns))#endif /* !__ASSEMBLY__ */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 39/247 soundwire: intel: prevent pm_runtime resume prior to system suspend
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 6d9f2dadba698114fed97b224578c5338a36b0d9 ]
commit e38f9ff63e6d ("ACPI: scan: Do not add device IDs from _CID if _HID is not valid") exposes a race condition on a TGL RVP device leading to a timeout.
The detailed analysis shows the RT711 codec driver scheduling a jack detection workqueue while attaching during a spurious pm_runtime resume, and the work function happens to be scheduled after the manager device is suspended.
The direct link between this ACPI patch and a spurious pm_runtime resume is not obvious; the most likely explanation is that a change in the ACPI device linked list management modifies the order in which the pm_runtime device status is checked and exposes a race condition that was probably present for a very long time, but was not identified.
We already have a check in the .prepare stage, where we will resume to full power from specific clock-stop modes. In all other cases, we don't need to resume to full power by default. Adding the SMART_SUSPEND flag prevents the spurious resume from happening.
--- drivers/soundwire/intel.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/soundwire/intel.c +3 -0
@@ -1298,6 +1298,9 @@ static int intel_link_probe(struct auxiliary_device *auxdev,/* use generic bandwidth allocation algorithm */ sdw->cdns.bus.compute_params = sdw_compute_params; +/* avoid resuming from pm_runtime suspend if it's not required */ +dev_pm_set_driver_flags (dev,DPM_FLAG_SMART_SUSPEND ); + ret =sdw_bus_master_add (bus, dev, dev->fwnode);if (ret) {dev_err (dev,"sdw_bus_master_add fail: %d\n" , ret);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/247 coresight: cpu-debug: Replace mutex with mutex_trylock on panic notifier
In reply to Greg Kroah-HartmanFrom: Guilherme G. Piccoli <[email protected]>
[ Upstream commit 1adff542d67a2ed1120955cb219bfff8a9c53f59 ]
The panic notifier infrastructure executes registered callbacks when a panic event happens - such callbacks are executed in atomic context, with interrupts and preemption disabled in the running CPU and all other CPUs disabled. That said, mutexes in such context are not a good idea.
This patch replaces a regular mutex with a mutex_trylock safer approach; given the nature of the mutex used in the driver, it should be pretty uncommon being unable to acquire such mutex in the panic path, hence no functional change should be observed (and if it is, that would be likely a deadlock with the regular mutex).
--- drivers/hwtracing/coresight/coresight-cpu-debug.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/hwtracing/coresight/coresight-cpu-debug.c +4 -3
@@ -380,9 +380,10 @@ static int debug_notifier_call(struct notifier_block *self,int cpu;struct debug_drvdata *drvdata; -mutex_lock (&debug_lock); +/* Bail out if we can't acquire the mutex or the functionality is off */ +if (!mutex_trylock (&debug_lock)) +return NOTIFY_DONE ; -/* Bail out if the functionality is disabled */ if (!debug_enable) goto skip_dump;
@@ -401,7 +402,7 @@ static int debug_notifier_call(struct notifier_block *self, skip_dump:mutex_unlock (&debug_lock); -return 0 ; +return NOTIFY_DONE ; }static struct notifier_block debug_notifier = {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 41/247 ksmbd: fix reference count leak in smb_check_perm_dacl()
In reply to Greg Kroah-HartmanFrom: Xin Xiong <[email protected]>
[ Upstream commit d21a580dafc69aa04f46e6099616146a536b0724 ]
The issue happens in a specific path in smb_check_perm_dacl(). When "id" and "uid" have the same value, the function simply jumps out of the loop without decrementing the reference count of the object "posix_acls", which is increased by get_acl() earlier. This may result in memory leaks.
Fix it by decreasing the reference count of "posix_acls" before jumping to label "check_access_bits".
--- fs/ksmbd/smbacl.c | 1 + 1 file changed, 1 insertion(+)
fs/ksmbd/smbacl.c +1 -0
@@ -1274,6 +1274,7 @@ int smb_check_perm_dacl(struct ksmbd_conn *conn, struct path *path,if (!access_bits) access_bits =SET_MINIMUM_RIGHTS ; +posix_acl_release (posix_acls); goto check_access_bits; } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/247 extcon: ptn5150: Add queue work sync before driver release
In reply to Greg Kroah-HartmanFrom: Li Jun <[email protected]>
[ Upstream commit 782cd939cbe0f569197cd1c9b0477ee213167f04 ]
Add device managed action to sync pending queue work, otherwise the queued work may run after the work is destroyed.
--- drivers/extcon/extcon-ptn5150.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/extcon/extcon-ptn5150.c +11 -0
@@ -194,6 +194,13 @@ static int ptn5150_init_dev_type(struct ptn5150_info *info)return 0 ; } +static void ptn5150_work_sync_and_put (void *data) +{ +struct ptn5150_info *info = data; + +cancel_work_sync (&info->irq_work); +} +static int ptn5150_i2c_probe (struct i2c_client *i2c) {struct device *dev = &i2c->dev;
@@ -284,6 +291,10 @@ static int ptn5150_i2c_probe(struct i2c_client *i2c)if (ret)return -EINVAL ; + ret =devm_add_action_or_reset (dev, ptn5150_work_sync_and_put, info); +if (ret) +return ret; +/* * Update current extcon state if for example OTG connection was there * before the probe
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 43/247 soc: rockchip: Fix refcount leak in rockchip_grf_init
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 9b59588d8be91c96bfb0371e912ceb4f16315dbf ]
of_find_matching_node_and_match returns a node pointer with refcount incremented, we should use of_node_put() on it when done. Add missing of_node_put() to avoid refcount leak.
--- drivers/soc/rockchip/grf.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/soc/rockchip/grf.c +2 -0
@@ -148,12 +148,14 @@ static int __init rockchip_grf_init(void)return -ENODEV ;if (!match || !match->data) {pr_err ("%s: missing grf data\n" , __func__); +of_node_put (np);return -EINVAL ; } grf_info = match->data; grf =syscon_node_to_regmap (np); +of_node_put (np);if (IS_ERR (grf)) {pr_err ("%s: could not get grf syscon\n" , __func__);return PTR_ERR (grf);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/247 clocksource/drivers/riscv: Events are stopped during CPU suspend
In reply to Greg Kroah-HartmanFrom: Samuel Holland <[email protected]>
[ Upstream commit 232ccac1bd9b5bfe73895f527c08623e7fa0752d ]
Some implementations of the SBI time extension depend on hart-local state (for example, CSRs) that are lost or hardware that is powered down when a CPU is suspended. To be safe, the clockevents driver cannot assume that timer IRQs will be received during CPU suspend.
--- drivers/clocksource/timer-riscv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clocksource/timer-riscv.c +1 -1
@@ -32,7 +32,7 @@ static int riscv_clock_next_event(unsigned long delta,static unsigned int riscv_clock_event_irq; static DEFINE_PER_CPU(struct clock_event_device, riscv_clock_event) = { .name ="riscv_timer_clockevent" , - .features =CLOCK_EVT_FEAT_ONESHOT , + .features =CLOCK_EVT_FEAT_ONESHOT |CLOCK_EVT_FEAT_C3STOP , .rating =100 , .set_next_event = riscv_clock_next_event, };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/247 ARM: dts: aspeed: ast2600-evb: Enable RX delay for MAC0/MAC1
In reply to Greg Kroah-HartmanFrom: Howard Chiu <[email protected]>
[ Upstream commit 4d338ee40ba89e508c5d3e1b4af956af7cb5e12e ]
Since mac0/1 and mac2/3 are physically located on different die, they have different properties by nature, which is mac0/1 has smaller delay step.
The property 'phy-mode' on ast2600 mac0 and mac1 is recommended to set to 'rgmii-rxid' which enables the RX interface delay from the PHY chip.
Refer page 45 of SDK User Guide v08.00
https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.00/SDK_User_Guide_v08.00.pdf
--- arch/arm/boot/dts/aspeed-ast2600-evb.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/boot/dts/aspeed-ast2600-evb.dts +2 -2
@@ -103,7 +103,7 @@ &mac0 { status = "okay"; - phy-mode = "rgmii"; + phy-mode = "rgmii-rxid"; phy-handle = <ðphy0>; pinctrl-names = "default";
@@ -114,7 +114,7 @@ &mac1 { status = "okay"; - phy-mode = "rgmii"; + phy-mode = "rgmii-rxid"; phy-handle = <ðphy1>; pinctrl-names = "default";
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/247 rtc: mt6397: check return value after calling platform_get_resource()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit d3b43eb505bffb8e4cdf6800c15660c001553fe6 ]
It will cause null-ptr-deref if platform_get_resource() returns NULL, we need check the return value.
--- drivers/rtc/rtc-mt6397.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/rtc/rtc-mt6397.c +2 -0
@@ -269,6 +269,8 @@ static int mtk_rtc_probe(struct platform_device *pdev)return -ENOMEM ; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (!res) +return -EINVAL ; rtc->addr_base = res->start; rtc->data =of_device_get_match_data (&pdev->dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/247 rtc: ftrtc010: Use platform_get_irq() to get the interrupt
In reply to Greg Kroah-HartmanFrom: Lad Prabhakar <[email protected]>
[ Upstream commit 05020a733b02cf7a474305e620fb306cd3abfe84 ]
platform_get_resource(pdev, IORESOURCE_IRQ, ..) relies on static allocation of IRQ resources in DT core code, this causes an issue when using hierarchical interrupt domains using "interrupts" property in the node as this bypasses the hierarchical setup and messes up the irq chaining.
In preparation for removal of static setup of IRQ resource from DT core code use platform_get_irq().
--- drivers/rtc/rtc-ftrtc010.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/rtc/rtc-ftrtc010.c +3 -5
@@ -141,11 +141,9 @@ static int ftrtc010_rtc_probe(struct platform_device *pdev) } } - res =platform_get_resource (pdev,IORESOURCE_IRQ ,0 ); -if (!res) -return -ENODEV ; - - rtc->rtc_irq = res->start; + rtc->rtc_irq =platform_get_irq (pdev,0 ); +if (rtc->rtc_irq <0 ) +return rtc->rtc_irq; res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!res)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/247 rtc: ftrtc010: Fix error handling in ftrtc010_rtc_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit b520cbe5be37b1b9b401c0b6ecbdae32575273db ]
In the error handling path, the clk_prepare_enable() function call should be balanced by a corresponding 'clk_disable_unprepare()' call , as already done in the remove function.
clk_disable_unprepare calls clk_disable() and clk_unprepare(). They will use IS_ERR_OR_NULL to check the argument.
--- drivers/rtc/rtc-ftrtc010.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-)
drivers/rtc/rtc-ftrtc010.c +24 -10
@@ -137,26 +137,34 @@ static int ftrtc010_rtc_probe(struct platform_device *pdev) ret =clk_prepare_enable (rtc->extclk);if (ret) {dev_err (dev,"failed to enable EXTCLK\n" ); -return ret; + goto err_disable_pclk; } } rtc->rtc_irq =platform_get_irq (pdev,0 ); -if (rtc->rtc_irq <0 ) -return rtc->rtc_irq; +if (rtc->rtc_irq <0 ) { + ret = rtc->rtc_irq; + goto err_disable_extclk; + } res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -if (!res) -return -ENODEV ; +if (!res) { + ret = -ENODEV ; + goto err_disable_extclk; + } rtc->rtc_base =devm_ioremap (dev, res->start,resource_size (res)); -if (!rtc->rtc_base) -return -ENOMEM ; +if (!rtc->rtc_base) { + ret = -ENOMEM ; + goto err_disable_extclk; + } rtc->rtc_dev =devm_rtc_allocate_device (dev); -if (IS_ERR (rtc->rtc_dev)) -return PTR_ERR (rtc->rtc_dev); +if (IS_ERR (rtc->rtc_dev)) { + ret =PTR_ERR (rtc->rtc_dev); + goto err_disable_extclk; + } rtc->rtc_dev->ops = &ftrtc010_rtc_ops;
@@ -172,9 +180,15 @@ static int ftrtc010_rtc_probe(struct platform_device *pdev) ret =devm_request_irq (dev, rtc->rtc_irq, ftrtc010_rtc_interrupt,IRQF_SHARED , pdev->name, dev);if (unlikely (ret)) -return ret; + goto err_disable_extclk;return devm_rtc_register_device (rtc->rtc_dev); + +err_disable_extclk: +clk_disable_unprepare (rtc->extclk); +err_disable_pclk: +clk_disable_unprepare (rtc->pclk); +return ret; }static int ftrtc010_rtc_remove (struct platform_device *pdev)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/247 staging: r8188eu: add check for kzalloc
In reply to Greg Kroah-HartmanFrom: Jiasheng Jiang <[email protected]>
[ Upstream commit f94b47c6bde624d6c07f43054087607c52054a95 ]
As kzalloc() may return null pointer, it should be better to check the return value and return error if fails in order to avoid dereference of null pointer.
Moreover, the return value of rtw_alloc_hwxmits() should also be dealt with.
--- drivers/staging/r8188eu/core/rtw_xmit.c | 13 +++++++++++-- drivers/staging/r8188eu/include/rtw_xmit.h | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-)
drivers/staging/r8188eu/core/rtw_xmit.c +11 -2
@@ -179,7 +179,12 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf; -rtw_alloc_hwxmits (padapter); + res =rtw_alloc_hwxmits (padapter); +if (res) { + res = _FAIL; + goto exit; + } +rtw_init_hwxmits (pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);for (i =0 ; i <4 ; i++)
@@ -1516,7 +1521,7 @@ s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe)return res; } -void rtw_alloc_hwxmits (struct adapter *padapter) +int rtw_alloc_hwxmits (struct adapter *padapter) {struct hw_xmit *hwxmits;struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
@@ -1524,6 +1529,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter) pxmitpriv->hwxmit_entry =HWXMIT_ENTRY ; pxmitpriv->hwxmits =kzalloc (sizeof (struct hw_xmit ) * pxmitpriv->hwxmit_entry,GFP_KERNEL ); +if (!pxmitpriv->hwxmits) +return -ENOMEM ; hwxmits = pxmitpriv->hwxmits;
@@ -1540,6 +1547,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter) hwxmits[3 ] .sta_queue = &pxmitpriv->bk_pending; }else { } + +return 0 ; }void rtw_free_hwxmits (struct adapter *padapter)
drivers/staging/r8188eu/include/rtw_xmit.h +1 -1
@@ -345,7 +345,7 @@ s32 rtw_txframes_sta_ac_pending(struct adapter *padapter,void rtw_init_hwxmits (struct hw_xmit *phwxmit,int entry);s32 _rtw_init_xmit_priv (struct xmit_priv *pxmitpriv,struct adapter *padapter);void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv); -void rtw_alloc_hwxmits (struct adapter *padapter); +int rtw_alloc_hwxmits (struct adapter *padapter);void rtw_free_hwxmits (struct adapter *padapter);s32 rtw_xmit (struct adapter *padapter,struct sk_buff **pkt);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/247 tty: n_gsm: Dont ignore write return value in gsmld_output()
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 9136c68346d096697935b9840782f7051d5796c5 ]
We currently have gsmld_output() ignore the return value from device write. This means we will lose packets if device write returns 0 or an error.
--- drivers/tty/n_gsm.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/tty/n_gsm.c +2 -3
@@ -692,7 +692,7 @@ static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci)print_hex_dump_bytes ("gsm_data_kick: " ,DUMP_PREFIX_OFFSET , gsm->txframe, len); -if (gsmld_output (gsm, gsm->txframe, len) <0 ) +if (gsmld_output (gsm, gsm->txframe, len) <=0 )break ;/* FIXME: Can eliminate one SOF in many more cases */ gsm->tx_bytes -= msg->len;
@@ -2373,8 +2373,7 @@ static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len)if (debug &4 )print_hex_dump_bytes ("gsmld_output: " ,DUMP_PREFIX_OFFSET , data, len); - gsm->tty->ops->write (gsm->tty, data, len); -return len; +return gsm->tty->ops->write (gsm->tty, data, len); }/**
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/247 tty: n_gsm: Fix packet data hex dump output
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 925ea0fa5277c1e6bb9e51955ef34eea9736c3d7 ]
The module param debug for n_gsm uses KERN_INFO level, but the hexdump now uses KERN_DEBUG level. This started after commit 091cb0994edd ("lib/hexdump: make print_hex_dump_bytes() a nop on !DEBUG builds"). We now use dynamic_hex_dump() unless DEBUG is set.
This causes no packets to be seen with modprobe n_gsm debug=0x1f unlike earlier. Let's fix this by adding gsm_hex_dump_bytes() that calls print_hex_dump() with KERN_INFO to match what n_gsm is doing with the other debug related output.
--- drivers/tty/n_gsm.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-)
drivers/tty/n_gsm.c +23 -8
@@ -443,6 +443,25 @@ static u8 gsm_encode_modem(const struct gsm_dlci *dlci)return modembits; } +static void gsm_hex_dump_bytes (const char *fname,const u8 *data, +unsigned long len) +{ +char *prefix; + +if (!fname) { +print_hex_dump (KERN_INFO ,"" ,DUMP_PREFIX_NONE ,16 ,1 , data, len, + true); +return ; + } + + prefix =kasprintf (GFP_KERNEL ,"%s: " , fname); +if (!prefix) +return ; +print_hex_dump (KERN_INFO , prefix,DUMP_PREFIX_OFFSET ,16 ,1 , data, len, + true); +kfree (prefix); +} +/** * gsm_print_packet - display a frame for debug * @hdr: header to print before decode
@@ -507,7 +526,7 @@ static void gsm_print_packet(const char *hdr, int addr, int cr,else pr_cont ("(F)" ); -print_hex_dump_bytes ("" ,DUMP_PREFIX_NONE , data, dlen); +gsm_hex_dump_bytes (NULL , data, dlen); }
@@ -689,9 +708,7 @@ static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci) }if (debug &4 ) -print_hex_dump_bytes ("gsm_data_kick: " , -DUMP_PREFIX_OFFSET , - gsm->txframe, len); +gsm_hex_dump_bytes (__func__, gsm->txframe, len);if (gsmld_output (gsm, gsm->txframe, len) <=0 )break ;/* FIXME: Can eliminate one SOF in many more cases */
@@ -2371,8 +2388,7 @@ static int gsmld_output(struct gsm_mux *gsm, u8 *data, int len)return -ENOSPC ; }if (debug &4 ) -print_hex_dump_bytes ("gsmld_output: " ,DUMP_PREFIX_OFFSET , - data, len); +gsm_hex_dump_bytes (__func__, data, len);return gsm->tty->ops->write (gsm->tty, data, len); }
@@ -2448,8 +2464,7 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,char flags =TTY_NORMAL ;if (debug &4 ) -print_hex_dump_bytes ("gsmld_receive: " ,DUMP_PREFIX_OFFSET , - cp, count); +gsm_hex_dump_bytes (__func__, cp, count);for (; count; count--, cp++) {if (fp)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/247 serial: meson: acquire port->lock in startup()
In reply to Greg Kroah-HartmanFrom: John Ogness <[email protected]>
[ Upstream commit 589f892ac8ef244e47c5a00ffd8605daa1eaef8e ]
The uart_ops startup() callback is called without interrupts disabled and without port->lock locked, relatively late during the boot process (from the call path of console_on_rootfs()). If the device is a console, it was already previously registered and could be actively printing messages.
Since the startup() callback is reading/writing registers used by the console write() callback (AML_UART_CONTROL), its access must be synchronized using the port->lock. Currently it is not.
The startup() callback is the only function that explicitly enables interrupts. Without the synchronization, it is possible that interrupts become accidentally permanently disabled.
CPU0 CPU1 meson_serial_console_write meson_uart_startup -------------------------- ------------------
spin_lock(port->lock)
val = readl(AML_UART_CONTROL)uart_console_write()
writel(INT_EN, AML_UART_CONTROL)writel(val, AML_UART_CONTROL)spin_unlock(port->lock)
Add port->lock synchronization to meson_uart_startup() to avoid racing with meson_serial_console_write().
Also add detailed comments to meson_uart_reset() explaining why it is *not* using port->lock synchronization.
--- drivers/tty/serial/meson_uart.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/tty/serial/meson_uart.c +13 -0
@@ -253,6 +253,14 @@ static const char *meson_uart_type(struct uart_port *port)return (port->type ==PORT_MESON ) ?"meson_uart" :NULL ; } +/* +* This function is called only from probe() using a temporary io mapping +* in order to perform a reset before setting up the device. Since the +* temporarily mapped region was successfully requested, there can be no +* console on this port at this time. Hence it is not necessary for this +* function to acquire the port->lock. (Since there is no console on this +* port at this time, the port->lock is not initialized yet.) +*/ static void meson_uart_reset (struct uart_port *port) {u32 val;
@@ -267,9 +275,12 @@ static void meson_uart_reset(struct uart_port *port)static int meson_uart_startup (struct uart_port *port) { +unsigned long flags;u32 val;int ret =0 ; +spin_lock_irqsave (&port->lock, flags); + val =readl (port->membase +AML_UART_CONTROL ); val |=AML_UART_CLEAR_ERR ;writel (val, port->membase +AML_UART_CONTROL );
@@ -285,6 +296,8 @@ static int meson_uart_startup(struct uart_port *port) val = (AML_UART_RECV_IRQ (1 ) |AML_UART_XMIT_IRQ (port->fifosize /2 ));writel (val, port->membase +AML_UART_MISC ); +spin_unlock_irqrestore (&port->lock, flags); + ret =request_irq (port->irq, meson_uart_interrupt,0 , port->name, port);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/247 serial: 8250_fintek: Check SER_RS485_RTS_* only with RS485
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit af0179270977508df6986b51242825d7edd59caf ]
SER_RS485_RTS_ON_SEND and SER_RS485_RTS_AFTER_SEND relate to behavior within RS485 operation. The driver checks if they have the same value which is not possible to realize with the hardware. The check is taken regardless of SER_RS485_ENABLED flag and -EINVAL is returned when the check fails, which creates problems.
This check makes it unnecessarily complicated to turn RS485 mode off as simple zeroed serial_rs485 struct will trigger that equal values check. In addition, the driver itself memsets its rs485 structure to zero when RS485 is disabled but if userspace would try to make an TIOCSRS485 ioctl() call with the very same struct, it would end up failing with -EINVAL which doesn't make much sense.
Resolve the problem by moving the check inside SER_RS485_ENABLED block.
--- drivers/tty/serial/8250/8250_fintek.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/tty/serial/8250/8250_fintek.c +4 -4
@@ -200,12 +200,12 @@ static int fintek_8250_rs485_config(struct uart_port *port,if (!pdata)return -EINVAL ; -/* Hardware do not support same RTS level on send and receive */ -if (!(rs485->flags &SER_RS485_RTS_ON_SEND ) == - !(rs485->flags &SER_RS485_RTS_AFTER_SEND )) -return -EINVAL ;if (rs485->flags &SER_RS485_ENABLED ) { +/* Hardware do not support same RTS level on send and receive */ +if (!(rs485->flags &SER_RS485_RTS_ON_SEND ) == + !(rs485->flags &SER_RS485_RTS_AFTER_SEND )) +return -EINVAL ;memset (rs485->padding,0 ,sizeof (rs485->padding)); config |=RS485_URA ; }else {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/247 serial: cpm_uart: Fix build error without CONFIG_SERIAL_CPM_CONSOLE
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit 0258502f11a4f6036b5f8b34b09027c8a92def3a ]
drivers/tty/serial/cpm_uart/cpm_uart_core.c: In function ‘cpm_uart_init_port’:drivers/tty/serial/cpm_uart/cpm_uart_core.c:1251:7: error: ‘udbg_port’ undeclared (first use in this function); did you mean ‘uart_port’?
if (!udbg_port)
^~~~~~~~~
uart_portcommit d142585bceb3 leave this corner, wrap it with #ifdef block
--- drivers/tty/serial/cpm_uart/cpm_uart_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/cpm_uart/cpm_uart_core.c +1 -1
@@ -1247,7 +1247,7 @@ static int cpm_uart_init_port(struct device_node *np, }#ifdef CONFIG_PPC_EARLY_DEBUG_CPM -#ifdef CONFIG_CONSOLE_POLL +#if defined(CONFIG_CONSOLE_POLL ) && defined(CONFIG_SERIAL_CPM_CONSOLE ) if (!udbg_port)#endif udbg_putc =NULL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/247 serial: digicolor-usart: Dont allow CS5-6
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit fd63031b8c0763addcecdefe0e0c59d49646204e ]
Only CS7 and CS8 seem supported but CSIZE is not sanitized to CS8 in the default: block.
Set CSIZE correctly so that userspace knows the effective value. Incorrect CSIZE also results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/digicolor-usart.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/digicolor-usart.c +2 -0
@@ -309,6 +309,8 @@ static void digicolor_uart_set_termios(struct uart_port *port,case CS8 :default : config |=UA_CONFIG_CHAR_LEN ; + termios->c_cflag &= ~CSIZE ; + termios->c_cflag |=CS8 ;break ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/247 serial: rda-uart: Dont allow CS5-6
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 098333a9c7d12bb3ce44c82f08b4d810c44d31b0 ]
Only CS7 and CS8 are supported but CSIZE is not sanitized after fallthrough from CS5 or CS6 to CS7.
Set CSIZE correctly so that userspace knows the effective value. Incorrect CSIZE also results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/rda-uart.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/rda-uart.c +2 -0
@@ -262,6 +262,8 @@ static void rda_uart_set_termios(struct uart_port *port, fallthrough;case CS7 : ctrl &= ~RDA_UART_DBITS_8 ; + termios->c_cflag &= ~CSIZE ; + termios->c_cflag |=CS7 ;break ;default : ctrl |=RDA_UART_DBITS_8 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/247 serial: txx9: Dont allow CS5-6
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 79ac88655dc0551e3571ad16bdabdbe65d61553e ]
Only CS7 and CS8 are supported but CSIZE is not sanitized with CS5 or CS6 to CS8.
Set CSIZE correctly so that userspace knows the effective value. Incorrect CSIZE also results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/serial_txx9.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/serial_txx9.c +2 -0
@@ -644,6 +644,8 @@ serial_txx9_set_termios(struct uart_port *port, struct ktermios *termios,case CS6 :/* not supported */ case CS8 : cval |=TXX9_SILCR_UMODE_8BIT ; + termios->c_cflag &= ~CSIZE ; + termios->c_cflag |=CS8 ;break ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/247 serial: sh-sci: Dont allow CS5-6
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 9b87162de8be26bf3156460b37deee6399fd0fcb ]
Only CS7 and CS8 seem supported but CSIZE is not sanitized from CS5 or CS6 to CS8.
Set CSIZE correctly so that userspace knows the effective value. Incorrect CSIZE also results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/sh-sci.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/tty/serial/sh-sci.c +5 -1
@@ -2390,8 +2390,12 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,int best_clk =-1 ;unsigned long flags; -if ((termios->c_cflag &CSIZE ) ==CS7 ) +if ((termios->c_cflag &CSIZE ) ==CS7 ) { smr_val |=SCSMR_CHR ; + }else { + termios->c_cflag &= ~CSIZE ; + termios->c_cflag |=CS8 ; + }if (termios->c_cflag &PARENB ) smr_val |=SCSMR_PE ;if (termios->c_cflag &PARODD )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/247 serial: sifive: Sanitize CSIZE and c_iflag
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit c069d2756c01ed36121fae6a42c14fdf1325c71d ]
Only CS8 is supported but CSIZE was not sanitized to CS8.
Set CSIZE correctly so that userspace knows the effective value. Incorrect CSIZE also results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
Similarly, INPCK, PARMRK, and BRKINT are reported textually unsupported but were not cleared in termios c_iflag which is the machine-readable format.
--- drivers/tty/serial/sifive.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/tty/serial/sifive.c +5 -1
@@ -666,12 +666,16 @@ static void sifive_serial_set_termios(struct uart_port *port,int rate;char nstop; -if ((termios->c_cflag &CSIZE ) !=CS8 ) +if ((termios->c_cflag &CSIZE ) !=CS8 ) {dev_err_once (ssp->port.dev,"only 8-bit words supported\n" ); + termios->c_cflag &= ~CSIZE ; + termios->c_cflag |=CS8 ; + }if (termios->c_iflag & (INPCK |PARMRK ))dev_err_once (ssp->port.dev,"parity checking not supported\n" );if (termios->c_iflag &BRKINT )dev_err_once (ssp->port.dev,"BREAK detection not supported\n" ); + termios->c_iflag &= ~(INPCK |PARMRK |BRKINT );/* Set number of stop bits */ nstop = (termios->c_cflag &CSTOPB ) ?2 :1 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/247 serial: st-asc: Sanitize CSIZE and correct PARENB for CS7
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 52bb1cb7118564166b04d52387bd8403632f5190 ]
Only CS7 and CS8 seem supported but CSIZE is not sanitized from CS5 or CS6 to CS8. In addition, ASC_CTL_MODE_7BIT_PAR suggests that CS7 has to have parity, thus add PARENB.
Incorrect CSIZE results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/st-asc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/st-asc.c +4 -0
@@ -535,10 +535,14 @@ static void asc_set_termios(struct uart_port *port, struct ktermios *termios,/* set character length */ if ((cflag &CSIZE ) ==CS7 ) { ctrl_val |=ASC_CTL_MODE_7BIT_PAR ; + cflag |=PARENB ; }else { ctrl_val |= (cflag &PARENB ) ?ASC_CTL_MODE_8BIT_PAR :ASC_CTL_MODE_8BIT ; + cflag &= ~CSIZE ; + cflag |=CS8 ; } + termios->c_cflag = cflag;/* set stop bit */ ctrl_val |= (cflag &CSTOPB ) ?ASC_CTL_STOP_2BIT :ASC_CTL_STOP_1BIT ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 61/247 serial: stm32-usart: Correct CSIZE, bits, and parity
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 1deeda8d2877c18bc2b9eeee10dd6d2628852848 ]
Add CSIZE sanitization for unsupported CSIZE configurations. In addition, if parity is asked for but CSx was unsupported, the sensible result is CS8+parity which requires setting USART_CR1_M0 like with 9 bits.
Incorrect CSIZE results in miscalculation of the frame bits in tty_get_char_size() or in its predecessor where the roughly the same code is directly within uart_update_timeout().
--- drivers/tty/serial/stm32-usart.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/tty/serial/stm32-usart.c +12 -3
@@ -807,13 +807,22 @@ static void stm32_usart_set_termios(struct uart_port *port,* CS8 or (CS7 + parity), 8 bits word aka [M1:M0] = 0b00 * M0 and M1 already cleared by cr1 initialization. */ -if (bits ==9 ) +if (bits ==9 ) { cr1 |=USART_CR1_M0 ; -else if ((bits ==7 ) && cfg->has_7bits_data) + }else if ((bits ==7 ) && cfg->has_7bits_data) { cr1 |=USART_CR1_M1 ; -else if (bits !=8 ) + }else if (bits !=8 ) {dev_dbg (port->dev,"Unsupported data bits config: %u bits\n" , bits); + cflag &= ~CSIZE ; + cflag |=CS8 ; + termios->c_cflag = cflag; + bits =8 ; +if (cflag &PARENB ) { + bits++; + cr1 |=USART_CR1_M0 ; + } + } if (ofs->rtor != UNDEF_REG && (stm32_port->rx_ch || (stm32_port->fifoen &&
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 62/247 firmware: dmi-sysfs: Fix memory leak in dmi_sysfs_register_handle
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 660ba678f9998aca6db74f2dd912fa5124f0fa31 ]
kobject_init_and_add() takes reference even when it fails. According to the doc of kobject_init_and_add()
If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object.
Fix this issue by calling kobject_put().
--- drivers/firmware/dmi-sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/dmi-sysfs.c +1 -1
@@ -603,7 +603,7 @@ static void __init dmi_sysfs_register_handle(const struct dmi_header *dh, "%d-%d", dh->type, entry->instance);if (*ret) { -kfree (entry); +kobject_put (&entry->kobj);return ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 63/247 bus: ti-sysc: Fix warnings for unbind for serial
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit c337125b8834f9719dfda0e40b25eaa266f1b8cf ]
We can get "failed to disable" clock_unprepare warnings on unbind at least for the serial console device if the unbind is done before the device has been idled.
As some devices are using deferred idle, we must check the status for pending idle work to idle the device.
--- drivers/bus/ti-sysc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/bus/ti-sysc.c +3 -1
@@ -3325,7 +3325,9 @@ static int sysc_remove(struct platform_device *pdev)struct sysc *ddata =platform_get_drvdata (pdev);int error; -cancel_delayed_work_sync (&ddata->idle_work); +/* Device can still be enabled, see deferred idle quirk in probe */ +if (cancel_delayed_work_sync (&ddata->idle_work)) +ti_sysc_idle (&ddata->idle_work.work); error =pm_runtime_resume_and_get (ddata->dev);if (error <0 ) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 64/247 driver: base: fix UAF when driver_attach failed
In reply to Greg Kroah-HartmanFrom: Schspa Shi <[email protected]>
[ Upstream commit 310862e574001a97ad02272bac0fd13f75f42a27 ]
When driver_attach(drv); failed, the driver_private will be freed. But it has been added to the bus, which caused a UAF.
To fix it, we need to delete it from the bus when failed.
--- drivers/base/bus.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/base/bus.c +3 -1
@@ -617,7 +617,7 @@ int bus_add_driver(struct device_driver *drv)if (drv->bus->p->drivers_autoprobe) { error =driver_attach (drv);if (error) - goto out_unregister; + goto out_del_list; }module_add_driver (drv->owner, drv);
@@ -644,6 +644,8 @@ int bus_add_driver(struct device_driver *drv)return 0 ; +out_del_list: +klist_del (&priv->knode_bus); out_unregister:kobject_put (&priv->kobj);/* drv->p is freed in driver_release() */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 65/247 driver core: fix deadlock in __device_attach
In reply to Greg Kroah-HartmanFrom: Zhang Wensheng <[email protected]>
[ Upstream commit b232b02bf3c205b13a26dcec08e53baddd8e59ed ]
In __device_attach function, The lock holding logic is as follows:
...__device_attachdevice_lock(dev) // get lock dev
async_schedule_dev(__device_attach_async_helper, dev); // func
async_schedule_node
async_schedule_node_domain(func)
entry = kzalloc(sizeof(struct async_entry), GFP_ATOMIC);
/* when fail or work limit, sync to execute func, but
__device_attach_async_helper will get lock dev as
well, which will lead to A-A deadlock. */
if (!entry || atomic_read(&entry_count) > MAX_WORK) {
func;
else
queue_work_node(node, system_unbound_wq, &entry->work) device_unlock(dev)
As shown above, when it is allowed to do async probes, because of out of memory or work limit, async work is not allowed, to do sync execute instead. it will lead to A-A deadlock because of __device_attach_async_helper getting lock dev.
To fix the deadlock, move the async_schedule_dev outside device_lock, as we can see, in async_schedule_node_domain, the parameter of queue_work_node is system_unbound_wq, so it can accept concurrent operations. which will also not change the code logic, and will not lead to deadlock.
--- drivers/base/dd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/base/dd.c +4 -1
@@ -944,6 +944,7 @@ static void __device_attach_async_helper(void *_dev, async_cookie_t cookie)static int __device_attach (struct device *dev,bool allow_async) {int ret =0 ; +bool async = false;device_lock (dev);if (dev->p->dead) {
@@ -982,7 +983,7 @@ static int __device_attach(struct device *dev, bool allow_async)*/ dev_dbg (dev,"scheduling asynchronous probe\n" );get_device (dev); -async_schedule_dev (__device_attach_async_helper, dev); + async = true; }else {pm_request_idle (dev); }
@@ -992,6 +993,8 @@ static int __device_attach(struct device *dev, bool allow_async) } out_unlock:device_unlock (dev); +if (async) +async_schedule_dev (__device_attach_async_helper, dev);return ret; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 66/247 watchdog: rti-wdt: Fix pm_runtime_get_sync() error checking
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit b3ac0c58fa8934926360268f3d89ec7680644d7b ]
If the device is already in a runtime PM enabled state pm_runtime_get_sync() will return 1, so a test for negative value should be used to check for errors.
--- drivers/watchdog/rti_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/rti_wdt.c +1 -1
@@ -227,7 +227,7 @@ static int rti_wdt_probe(struct platform_device *pdev)pm_runtime_enable (dev); ret =pm_runtime_get_sync (dev); -if (ret) { +if (ret <0 ) {pm_runtime_put_noidle (dev);pm_runtime_disable (&pdev->dev);return dev_err_probe (dev, ret,"runtime pm failed\n" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 67/247 watchdog: ts4800_wdt: Fix refcount leak in ts4800_wdt_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 5d24df3d690809952528e7a19a43d84bc5b99d44 ]
of_parse_phandle() returns a node pointer with refcount incremented, we should use of_node_put() on it when done. Add missing of_node_put() in some error paths.
--- drivers/watchdog/ts4800_wdt.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/watchdog/ts4800_wdt.c +4 -1
@@ -125,13 +125,16 @@ static int ts4800_wdt_probe(struct platform_device *pdev) ret =of_property_read_u32_index (np,"syscon" ,1 , ®);if (ret <0 ) {dev_err (dev,"no offset in syscon\n" ); +of_node_put (syscon_np);return ret; }/* allocate memory for watchdog struct */ wdt =devm_kzalloc (dev,sizeof (*wdt),GFP_KERNEL ); -if (!wdt) +if (!wdt) { +of_node_put (syscon_np);return -ENOMEM ; + }/* set regmap and offset to know where to write */ wdt->feed_offset = reg;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 68/247 blk-mq: dont touch ->tagset in blk_mq_get_sq_hctx
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
[ Upstream commit 5d05426e2d5fd7df8afc866b78c36b37b00188b7 ]
blk_mq_run_hw_queues() could be run when there isn't queued request and after queue is cleaned up, at that time tagset is freed, because tagset lifetime is covered by driver, and often freed after blk_cleanup_queue() returns.
So don't touch ->tagset for figuring out current default hctx by the mapping built in request queue, so use-after-free on tagset can be avoided. Meantime this way should be fast than retrieving mapping from tagset.
--- block/blk-mq.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
block/blk-mq.c +3 -4
@@ -1642,8 +1642,7 @@ static bool blk_mq_has_sqsched(struct request_queue *q)*/ static struct blk_mq_hw_ctx *blk_mq_get_sq_hctx (struct request_queue *q) { -struct blk_mq_hw_ctx *hctx; - +struct blk_mq_ctx *ctx =blk_mq_get_ctx (q);/* * If the IO scheduler does not respect hardware queues when * dispatching, we just don't bother with multiple HW queues and
@@ -1651,8 +1650,8 @@ static struct blk_mq_hw_ctx *blk_mq_get_sq_hctx(struct request_queue *q)* just causes lock contention inside the scheduler and pointless cache * bouncing. */ - hctx =blk_mq_map_queue_type (q,HCTX_TYPE_DEFAULT , -raw_smp_processor_id ()); +struct blk_mq_hw_ctx *hctx =blk_mq_map_queue (q,0 , ctx); +if (!blk_mq_hctx_stopped (hctx))return hctx;return NULL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 69/247 ASoC: fsl_sai: Fix FSL_SAI_xDR/xFR definition
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
[ Upstream commit e4dd748dc87cf431af7b3954963be0d9f6150217 ]
There are multiple xDR and xFR registers, the index is from 0 to 7. FSL_SAI_xDR and FSL_SAI_xFR is abandoned, replace them with FSL_SAI_xDR0 and FSL_SAI_xFR0.
--- sound/soc/fsl/fsl_sai.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_sai.h +2 -2
@@ -80,8 +80,8 @@#define FSL_SAI_xCR3 (tx, ofs) (tx ? FSL_SAI_TCR3(ofs) : FSL_SAI_RCR3(ofs))#define FSL_SAI_xCR4 (tx, ofs) (tx ? FSL_SAI_TCR4(ofs) : FSL_SAI_RCR4(ofs))#define FSL_SAI_xCR5 (tx, ofs) (tx ? FSL_SAI_TCR5(ofs) : FSL_SAI_RCR5(ofs)) -#define FSL_SAI_xDR (tx, ofs) (tx ? FSL_SAI_TDR(ofs) : FSL_SAI_RDR(ofs)) -#define FSL_SAI_xFR (tx, ofs) (tx ? FSL_SAI_TFR(ofs) : FSL_SAI_RFR(ofs)) +#define FSL_SAI_xDR0 (tx) (tx ? FSL_SAI_TDR0 : FSL_SAI_RDR0) +#define FSL_SAI_xFR0 (tx) (tx ? FSL_SAI_TFR0 : FSL_SAI_RFR0)#define FSL_SAI_xMR (tx) (tx ? FSL_SAI_TMR : FSL_SAI_RMR)/* SAI Transmit/Receive Control Register */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 70/247 clocksource/drivers/oxnas-rps: Fix irq_of_parse_and_map() return value
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 9c04a8ff03def4df3f81219ffbe1ec9b44ff5348 ]
The irq_of_parse_and_map() returns 0 on failure, not a negative ERRNO.
--- drivers/clocksource/timer-oxnas-rps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clocksource/timer-oxnas-rps.c +1 -1
@@ -236,7 +236,7 @@ static int __init oxnas_rps_timer_init(struct device_node *np) } rps->irq =irq_of_parse_and_map (np,0 ); -if (rps->irq <0 ) { +if (!rps->irq) { ret = -EINVAL ; goto err_iomap; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 71/247 s390/crypto: fix scatterwalk_unmap() callers in AES-GCM
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
[ Upstream commit bd52cd5e23f134019b23f0c389db0f9a436e4576 ]
The argument of scatterwalk_unmap() is supposed to be the void* that was returned by the previous scatterwalk_map() call.
The s390 AES-GCM implementation was instead passing the pointer to the struct scatter_walk.
This doesn't actually break anything because scatterwalk_unmap() only uses its argument under CONFIG_HIGHMEM and ARCH_HAS_FLUSH_ON_KUNMAP.
--- arch/s390/crypto/aes_s390.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/s390/crypto/aes_s390.c +2 -2
@@ -701,7 +701,7 @@ static inline void _gcm_sg_unmap_and_advance(struct gcm_sg_walk *gw, unsigned int nbytes) { gw->walk_bytes_remain -= nbytes; -scatterwalk_unmap (&gw->walk); +scatterwalk_unmap (gw->walk_ptr);scatterwalk_advance (&gw->walk, nbytes);scatterwalk_done (&gw->walk,0 , gw->walk_bytes_remain); gw->walk_ptr =NULL ;
@@ -776,7 +776,7 @@ static int gcm_out_walk_go(struct gcm_sg_walk *gw, unsigned int minbytesneeded) goto out; } -scatterwalk_unmap (&gw->walk); +scatterwalk_unmap (gw->walk_ptr); gw->walk_ptr =NULL ; gw->ptr = gw->buf;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 72/247 net: sched: fixed barrier to prevent skbuff sticking in qdisc backlog
In reply to Greg Kroah-HartmanFrom: Vincent Ray <[email protected]>
[ Upstream commit a54ce3703613e41fe1d98060b62ec09a3984dc28 ]
In qdisc_run_begin(), smp_mb__before_atomic() used before test_bit() does not provide any ordering guarantee as test_bit() is not an atomic operation. This, added to the fact that the spin_trylock() call at the beginning of qdisc_run_begin() does not guarantee acquire semantics if it does not grab the lock, makes it possible for the following statement :
if (test_bit(__QDISC_STATE_MISSED, &qdisc->state))
to be executed before an enqueue operation called before qdisc_run_begin().
As a result the following race can happen :
CPU 1 CPU 2
qdisc_run_begin() qdisc_run_begin() /* true */
set(MISSED) .
/* returns false */ .
. /* sees MISSED = 1 */
. /* so qdisc not empty */
. __qdisc_run()
. .
. pfifo_fast_dequeue()
----> /* may be done here */ .
| . clear(MISSED) | . . | . smp_mb __after_atomic(); | . . | . /* recheck the queue */ | . /* nothing => exit */ | enqueue(skb1) | . | qdisc_run_begin() | . | spin_trylock() /* fail */ | . | smp_mb__before_atomic() /* not enough */ | .
---- if (test_bit(MISSED))
return false; /* exit */
In the above scenario, CPU 1 and CPU 2 both try to grab the qdisc->seqlock at the same time. Only CPU 2 succeeds and enters the bypass code path, where it emits its skb then calls __qdisc_run().
CPU1 fails, sets MISSED and goes down the traditionnal enqueue() + dequeue() code path. But when executing qdisc_run_begin() for the second time, after enqueuing its skbuff, it sees the MISSED bit still set (by itself) and consequently chooses to exit early without setting it again nor trying to grab the spinlock again.
Meanwhile CPU2 has seen MISSED = 1, cleared it, checked the queue and found it empty, so it returned.
At the end of the sequence, we end up with skb1 enqueued in the backlog, both CPUs out of __dev_xmit_skb(), the MISSED bit not set, and no __netif_schedule() called made. skb1 will now linger in the qdisc until somebody later performs a full __qdisc_run(). Associated to the bypass capacity of the qdisc, and the ability of the TCP layer to avoid resending packets which it knows are still in the qdisc, this can lead to serious traffic "holes" in a TCP connection.
We fix this by replacing the smp_mb__before_atomic() / test_bit() / set_bit() / smp_mb__after_atomic() sequence inside qdisc_run_begin() by a single test_and_set_bit() call, which is more concise and enforces the needed memory barriers.
--- include/net/sch_generic.h | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-)
include/net/sch_generic.h +8 -28
@@ -173,37 +173,17 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc)if (spin_trylock (&qdisc->seqlock))return true; -/* Paired with smp_mb__after_atomic() to make sure -* STATE_MISSED checking is synchronized with clearing -* in pfifo_fast_dequeue(). +/* No need to insist if the MISSED flag was already set. +* Note that test_and_set_bit() also gives us memory ordering +* guarantees wrt potential earlier enqueue() and below +* spin_trylock(), both of which are necessary to prevent races */ -smp_mb__before_atomic (); - -/* If the MISSED flag is set, it means other thread has -* set the MISSED flag before second spin_trylock(), so -* we can return false here to avoid multi cpus doing -* the set_bit() and second spin_trylock() concurrently. -*/ -if (test_bit (__QDISC_STATE_MISSED, &qdisc->state)) +if (test_and_set_bit (__QDISC_STATE_MISSED, &qdisc->state))return false; -/* Set the MISSED flag before the second spin_trylock(), -* if the second spin_trylock() return false, it means -* other cpu holding the lock will do dequeuing for us -* or it will see the MISSED flag set after releasing -* lock and reschedule the net_tx_action() to do the -* dequeuing. -*/ -set_bit (__QDISC_STATE_MISSED, &qdisc->state); - -/* spin_trylock() only has load-acquire semantic, so use -* smp_mb__after_atomic() to ensure STATE_MISSED is set -* before doing the second spin_trylock(). -*/ -smp_mb__after_atomic (); - -/* Retry again in case other CPU may not see the new flag -* after it releases the lock at the end of qdisc_run_end(). +/* Try to take the lock again to make sure that we will either +* grab it or the CPU that still has it will see MISSED set +* when testing it in qdisc_run_end() */ return spin_trylock (&qdisc->seqlock); }else if (qdisc_is_running (qdisc)) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 73/247 net: ethernet: mtk_eth_soc: out of bounds read in mtk_hwlro_get_fdir_entry()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit e7e7104e2d5ddf3806a28695670f21bef471f1e1 ]
The "fsp->location" variable comes from user via ethtool_get_rxnfc(). Check that it is valid to prevent an out of bounds read.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +3 -0
@@ -1991,6 +1991,9 @@ static int mtk_hwlro_get_fdir_entry(struct net_device *dev,struct ethtool_rx_flow_spec *fsp = (struct ethtool_rx_flow_spec *)&cmd->fs; +if (fsp->location >=ARRAY_SIZE (mac->hwlro_ip)) +return -EINVAL ; +/* only tcp dst ipv4 is meaningful, others are meaningless */ fsp->flow_type =TCP_V4_FLOW ; fsp->h_u.tcp_ip4_spec.ip4dst =ntohl (mac->hwlro_ip[fsp->location]);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 74/247 net: ethernet: ti: am65-cpsw-nuss: Fix some refcount leaks
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 5dd89d2fc438457811cbbec07999ce0d80051ff5 ]
of_get_child_by_name() returns a node pointer with refcount incremented, we should use of_node_put() on it when not need anymore. am65_cpsw_init_cpts() and am65_cpsw_nuss_probe() don't release the refcount in error case.
Add missing of_node_put() to avoid refcount leak.
--- drivers/net/ethernet/ti/am65-cpsw-nuss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/ti/am65-cpsw-nuss.c +2 -1
@@ -1802,6 +1802,7 @@ static int am65_cpsw_init_cpts(struct am65_cpsw_common *common)if (IS_ERR (cpts)) {int ret =PTR_ERR (cpts); +of_node_put (node);if (ret == -EOPNOTSUPP ) {dev_info (dev,"cpts disabled\n" );return 0 ;
@@ -2668,9 +2669,9 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)if (!node)return -ENOENT ; common->port_num =of_get_child_count (node); +of_node_put (node);if (common->port_num <1 || common->port_num >AM65_CPSW_MAX_PORTS )return -ENOENT ; -of_node_put (node); common->rx_flow_id_base =-1 ;init_completion (&common->tdown_complete);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 75/247 net: dsa: mv88e6xxx: Fix refcount leak in mv88e6xxx_mdios_register
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 02ded5a173619b11728b8bf75a3fd995a2c1ff28 ]
of_get_child_by_name() returns a node pointer with refcount incremented, we should use of_node_put() on it when done.
mv88e6xxx_mdio_register() pass the device node to of_mdiobus_register(). We don't need the device node after it.
Add missing of_node_put() to avoid refcount leak.
--- drivers/net/dsa/mv88e6xxx/chip.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/dsa/mv88e6xxx/chip.c +1 -0
@@ -3492,6 +3492,7 @@ static int mv88e6xxx_mdios_register(struct mv88e6xxx_chip *chip,*/ child =of_get_child_by_name (np,"mdio" ); err =mv88e6xxx_mdio_register (chip, child, false); +of_node_put (child);if (err)return err;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 76/247 modpost: fix removing numeric suffixes
In reply to Greg Kroah-HartmanFrom: Alexander Lobakin <[email protected]>
[ Upstream commit b5beffa20d83c4e15306c991ffd00de0d8628338 ]
With the -z unique-symbol linker flag or any similar mechanism, it is possible to trigger the following:
ERROR: modpost: "param_set_uint.0" [vmlinux] is a static EXPORT_SYMBOL
The reason is that for now the condition from remove_dot():
if (m && (s[n + m] == '.' || s[n + m] == 0))
which was designed to test if it's a dot or a '\0' after the suffix is never satisfied.
This is due to that s[n + m] always points to the last digit of a numeric suffix, not on the symbol next to it (from a custom debug print added to modpost):
param_set_uint.0, s[n + m] is '0', s[n + m + 1] is '\0'
So it's off-by-one and was like that since 2014.
Fix this for the sake of any potential upcoming features, but don't bother stable-backporting, as it's well hidden -- apart from that LD flag, it can be triggered only with GCC LTO which never landed upstream.
--- scripts/mod/modpost.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/mod/modpost.c +1 -1
@@ -1971,7 +1971,7 @@ static char *remove_dot(char *s)if (n && s[n]) {size_t m =strspn (s + n +1 ,"0123456789" ); -if (m && (s[n + m] =='.' || s[n + m] ==0 )) +if (m && (s[n + m +1 ] =='.' || s[n + m +1 ] ==0 )) s[n] =0 ;/* strip trailing .lto */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 77/247 jffs2: fix memory leak in jffs2_do_fill_super
In reply to Greg Kroah-HartmanFrom: Baokun Li <[email protected]>
[ Upstream commit c14adb1cf70a984ed081c67e9d27bc3caad9537c ]
If jffs2_iget() or d_make_root() in jffs2_do_fill_super() returns an error, we can observe the following kmemleak report:
--------------------------------------------
unreferenced object 0xffff888105a65340 (size 64):
comm "mount", pid 710, jiffies 4302851558 (age 58.239s) hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<ffffffff859c45e5>] kmem_cache_alloc_trace+0x475/0x8a0
[<ffffffff86160146>] jffs2_sum_init+0x96/0x1a0
[<ffffffff86140e25>] jffs2_do_mount_fs+0x745/0x2120
[<ffffffff86149fec>] jffs2_do_fill_super+0x35c/0x810
[<ffffffff8614aae9>] jffs2_fill_super+0x2b9/0x3b0
[...]unreferenced object 0xffff8881bd7f0000 (size 65536):
comm "mount", pid 710, jiffies 4302851558 (age 58.239s) hex dump (first 32 bytes):
bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................ bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
backtrace:
[<ffffffff858579ba>] kmalloc_order+0xda/0x110
[<ffffffff85857a11>] kmalloc_order_trace+0x21/0x130
[<ffffffff859c2ed1>] __kmalloc+0x711/0x8a0
[<ffffffff86160189>] jffs2_sum_init+0xd9/0x1a0
[<ffffffff86140e25>] jffs2_do_mount_fs+0x745/0x2120
[<ffffffff86149fec>] jffs2_do_fill_super+0x35c/0x810
[<ffffffff8614aae9>] jffs2_fill_super+0x2b9/0x3b0
[...]
--------------------------------------------This is because the resources allocated in jffs2_sum_init() are not released. Call jffs2_sum_exit() to release these resources to solve the problem.
--- fs/jffs2/fs.c | 1 + 1 file changed, 1 insertion(+)
fs/jffs2/fs.c +1 -0
@@ -604,6 +604,7 @@ int jffs2_do_fill_super(struct super_block *sb, struct fs_context *fc)jffs2_free_raw_node_refs (c);kvfree (c->blocks);jffs2_clear_xattr_subsystem (c); +jffs2_sum_exit (c); out_inohash:kfree (c->inocache_list); out_wbuf:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 78/247 ubi: fastmap: Fix high cpu usage of ubi_bgt by making sure wl_pool not empty
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit d09e9a2bddba6c48e0fddb16c4383172ac593251 ]
There at least 6 PEBs reserved on UBI device:
1. EBA_RESERVED_PEBS[1]
2. WL_RESERVED_PEBS[1]
3. UBI_LAYOUT_VOLUME_EBS[2]
4. MIN_FASTMAP_RESERVED_PEBS[2]
When all ubi volumes take all their PEBs, there are 3 (EBA_RESERVED_PEBS + WL_RESERVED_PEBS + MIN_FASTMAP_RESERVED_PEBS - MIN_FASTMAP_TAKEN_PEBS[1]) free PEBs. Since commit f9c34bb529975fe ("ubi: Fix producing anchor PEBs") and commit 4b68bf9a69d22dd ("ubi: Select fastmap anchor PEBs considering wear level rules") applied, there is only 1 (3 - FASTMAP_ANCHOR_PEBS[1] - FASTMAP_NEXT_ANCHOR_PEBS[1]) free PEB to fill pool and wl_pool, after filling pool, wl_pool is always empty. So, UBI could be stuck in an infinite loop:
ubi_thread system_wqwear_leveling_worker <--------------------------------------------------
get_peb_for_wl |
// fm_wl_pool, used = size = 0 |
schedule_work(&ubi->fm_work) |
|
update_fastmap_work_fn |
ubi_update_fastmap |
ubi_refill_pools |
// ubi->free_count - ubi->beb_rsvd_pebs < 5 |
// wl_pool is not filled with any PEBs |
schedule_erase(old_fm_anchor) |
ubi_ensure_anchor_pebs |
__schedule_ubi_work(wear_leveling_worker) |
|
__erase_worker |
ensure_wear_leveling |
__schedule_ubi_work(wear_leveling_worker) --------------------------, which cause high cpu usage of ubi_bgt:
top - 12:10:42 up 5 min, 2 users, load average: 1.76, 0.68, 0.27
Tasks: 123 total, 3 running, 54 sleeping, 0 stopped, 0 zombie
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1589 root 20 0 0 0 0 R 45.0 0.0 0:38.86 ubi_bgt0d 319 root 20 0 0 0 0 I 15.2 0.0 0:15.29 kworker/0:3-eve 371 root 20 0 0 0 0 I 14.9 0.0 0:12.85 kworker/3:3-eve 20 root 20 0 0 0 0 I 11.3 0.0 0:05.33 kworker/1:0-eve 202 root 20 0 0 0 0 I 11.3 0.0 0:04.93 kworker/2:3-eve
In commit 4b68bf9a69d22dd ("ubi: Select fastmap anchor PEBs considering wear level rules"), there are three key changes:
1) Choose the fastmap anchor when the most free PEBs are available.
2) Enable anchor move within the anchor area again as it is useful for distributing wear.
3) Import a candidate fm anchor and check this PEB's erase count during wear leveling. If the wear leveling limit is exceeded, use the used anchor area PEB with the lowest erase count to replace it.
The anchor candidate can be removed, we can check fm_anchor PEB's erase count during wear leveling. Fix it by:
1) Removing 'fm_next_anchor' and check 'fm_anchor' during wear leveling.
2) Preferentially filling one free peb into fm_wl_pool in condition of ubi->free_count > ubi->beb_rsvd_pebs, then try to reserve enough free count for fastmap non anchor pebs after the above prerequisites are met.
Then, there are at least 1 PEB in pool and 1 PEB in wl_pool after calling ubi_refill_pools() with all erase works done.
Fetch a reproducer in [Link].
--- drivers/mtd/ubi/fastmap-wl.c | 69 ++++++++++++++++++++++++------------ drivers/mtd/ubi/fastmap.c | 11 ------ drivers/mtd/ubi/ubi.h | 4 +-- drivers/mtd/ubi/wl.c | 19 +++++----- 4 files changed, 57 insertions(+), 46 deletions(-)
drivers/mtd/ubi/fastmap-wl.c +46 -23
@@ -97,6 +97,33 @@ struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int anchor)return e; } +/* +* has_enough_free_count - whether ubi has enough free pebs to fill fm pools +* @ubi: UBI device description object +* @is_wl_pool: whether UBI is filling wear leveling pool +* +* This helper function checks whether there are enough free pebs (deducted +* by fastmap pebs) to fill fm_pool and fm_wl_pool, above rule works after +* there is at least one of free pebs is filled into fm_wl_pool. +* For wear leveling pool, UBI should also reserve free pebs for bad pebs +* handling, because there maybe no enough free pebs for user volumes after +* producing new bad pebs. +*/ +static bool has_enough_free_count (struct ubi_device *ubi,bool is_wl_pool) +{ +int fm_used =0 ;// fastmap non anchor pebs. +int beb_rsvd_pebs; + +if (!ubi->free.rb_node) +return false; + + beb_rsvd_pebs = is_wl_pool ? ubi->beb_rsvd_pebs :0 ; +if (ubi->fm_wl_pool.size >0 && !(ubi->ro_mode || ubi->fm_disabled)) + fm_used = ubi->fm_size / ubi->leb_size -1 ; + +return ubi->free_count - beb_rsvd_pebs > fm_used; +} +/** * ubi_refill_pools - refills all fastmap PEB pools. * @ubi: UBI device description object
@@ -120,21 +147,17 @@ void ubi_refill_pools(struct ubi_device *ubi)wl_tree_add (ubi->fm_anchor, &ubi->free); ubi->free_count++; } -if (ubi->fm_next_anchor) { -wl_tree_add (ubi->fm_next_anchor, &ubi->free); - ubi->free_count++; - } -/* All available PEBs are in ubi->free, now is the time to get +/* +* All available PEBs are in ubi->free, now is the time to get * the best anchor PEBs. */ ubi->fm_anchor =ubi_wl_get_fm_peb (ubi,1 ); - ubi->fm_next_anchor =ubi_wl_get_fm_peb (ubi,1 );for (;;) { enough =0 ;if (pool->size < pool->max_size) { -if (!ubi->free.rb_node) +if (!has_enough_free_count (ubi, false))break ; e =wl_get_wle (ubi);
@@ -147,8 +170,7 @@ void ubi_refill_pools(struct ubi_device *ubi) enough++;if (wl_pool->size < wl_pool->max_size) { -if (!ubi->free.rb_node || - (ubi->free_count - ubi->beb_rsvd_pebs <5 )) +if (!has_enough_free_count (ubi, true))break ; e =find_wl_entry (ubi, &ubi->free,WL_FREE_MAX_DIFF );
@@ -286,20 +308,26 @@ static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi)int ubi_ensure_anchor_pebs (struct ubi_device *ubi) {struct ubi_work *wrk; +struct ubi_wl_entry *anchor;spin_lock (&ubi->wl_lock); -/* Do we have a next anchor? */ -if (!ubi->fm_next_anchor) { - ubi->fm_next_anchor =ubi_wl_get_fm_peb (ubi,1 ); -if (!ubi->fm_next_anchor) -/* Tell wear leveling to produce a new anchor PEB */ - ubi->fm_do_produce_anchor =1 ; +/* Do we already have an anchor? */ +if (ubi->fm_anchor) { +spin_unlock (&ubi->wl_lock); +return 0 ; } -/* Do wear leveling to get a new anchor PEB or check the -* existing next anchor candidate. -*/ +/* See if we can find an anchor PEB on the list of free PEBs */ + anchor =ubi_wl_get_fm_peb (ubi,1 ); +if (anchor) { + ubi->fm_anchor = anchor; +spin_unlock (&ubi->wl_lock); +return 0 ; + } + + ubi->fm_do_produce_anchor =1 ; +/* No luck, trigger wear leveling to produce a new anchor PEB. */ if (ubi->wl_scheduled) {spin_unlock (&ubi->wl_lock);return 0 ;
@@ -381,11 +409,6 @@ static void ubi_fastmap_close(struct ubi_device *ubi) ubi->fm_anchor =NULL ; } -if (ubi->fm_next_anchor) { -return_unused_peb (ubi, ubi->fm_next_anchor); - ubi->fm_next_anchor =NULL ; - } -if (ubi->fm) {for (i =0 ; i < ubi->fm->used_blocks; i++)kfree (ubi->fm->e[i]);
drivers/mtd/ubi/fastmap.c +0 -11
@@ -1230,17 +1230,6 @@ static int ubi_write_fastmap(struct ubi_device *ubi, fm_pos +=sizeof (*fec);ubi_assert (fm_pos <= ubi->fm_size); } -if (ubi->fm_next_anchor) { - fec = (struct ubi_fm_ec *)(fm_raw + fm_pos); - - fec->pnum =cpu_to_be32 (ubi->fm_next_anchor->pnum); -set_seen (ubi, ubi->fm_next_anchor->pnum, seen_pebs); - fec->ec =cpu_to_be32 (ubi->fm_next_anchor->ec); - - free_peb_count++; - fm_pos +=sizeof (*fec); -ubi_assert (fm_pos <= ubi->fm_size); - } fmh->free_peb_count =cpu_to_be32 (free_peb_count);ubi_for_each_used_peb (ubi, wl_e, tmp_rb) {
drivers/mtd/ubi/ubi.h +1 -3
@@ -489,8 +489,7 @@ struct ubi_debug_info {* @fm_work: fastmap work queue * @fm_work_scheduled: non-zero if fastmap work was scheduled * @fast_attach: non-zero if UBI was attached by fastmap -* @fm_anchor: The new anchor PEB used during fastmap update -* @fm_next_anchor: An anchor PEB candidate for the next time fastmap is updated +* @fm_anchor: The next anchor PEB to use for fastmap * @fm_do_produce_anchor: If true produce an anchor PEB in wl * * @used: RB-tree of used physical eraseblocks
@@ -601,7 +600,6 @@ struct ubi_device {int fm_work_scheduled;int fast_attach;struct ubi_wl_entry *fm_anchor; -struct ubi_wl_entry *fm_next_anchor;int fm_do_produce_anchor;/* Wear-leveling sub-system's stuff */
drivers/mtd/ubi/wl.c +10 -9
@@ -689,16 +689,16 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,#ifdef CONFIG_MTD_UBI_FASTMAP e1 =find_anchor_wl_entry (&ubi->used); -if (e1 && ubi->fm_next_anchor && - (ubi->fm_next_anchor->ec - e1->ec >=UBI_WL_THRESHOLD )) { +if (e1 && ubi->fm_anchor && + (ubi->fm_anchor->ec - e1->ec >=UBI_WL_THRESHOLD )) { ubi->fm_do_produce_anchor =1 ; -/* fm_next_anchor is no longer considered a good anchor -* candidate. +/* +* fm_anchor is no longer considered a good anchor. * NULL assignment also prevents multiple wear level checks * of this PEB. */ -wl_tree_add (ubi->fm_next_anchor, &ubi->free); - ubi->fm_next_anchor =NULL ; +wl_tree_add (ubi->fm_anchor, &ubi->free); + ubi->fm_anchor =NULL ; ubi->free_count++; }
@@ -1085,12 +1085,13 @@ static int __erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk)if (!err) {spin_lock (&ubi->wl_lock); -if (!ubi->fm_disabled && !ubi->fm_next_anchor && +if (!ubi->fm_disabled && !ubi->fm_anchor && e->pnum <UBI_FM_MAX_START ) { -/* Abort anchor production, if needed it will be +/* +* Abort anchor production, if needed it will be * enabled again in the wear leveling started below. */ - ubi->fm_next_anchor = e; + ubi->fm_anchor = e; ubi->fm_do_produce_anchor =0 ; }else {wl_tree_add (e, &ubi->free);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 79/247 ubi: ubi_create_volume: Fix use-after-free when volume creation failed
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit 8c03a1c21d72210f81cb369cc528e3fde4b45411 ]
There is an use-after-free problem for 'eba_tbl' in ubi_create_volume()'s error handling path:
ubi_eba_replace_table(vol, eba_tbl)
vol->eba_tbl = tbl
out_mapping:
ubi_eba_destroy_table(eba_tbl) // Free 'eba_tbl'out_unlock:
put_device(&vol->dev)
vol_release
kfree(tbl->entries) // UAFFix it by removing redundant 'eba_tbl' releasing. Fetch a reproducer in [Link].
--- drivers/mtd/ubi/vmt.c | 1 - 1 file changed, 1 deletion(-)
drivers/mtd/ubi/vmt.c +0 -1
@@ -309,7 +309,6 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req) ubi->volumes[vol_id] =NULL ; ubi->vol_count -=1 ;spin_unlock (&ubi->volumes_lock); -ubi_eba_destroy_table (eba_tbl); out_acc:spin_lock (&ubi->volumes_lock); ubi->rsvd_pebs -= vol->reserved_pebs;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 80/247 selftests/bpf: fix selftest after random: Urandom_read tracepoint removal
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 99dea2c664d7bc7e4f6f6947182d0d365165a998 ]
14c174633f34 ("random: remove unused tracepoints") removed all the tracepoints from drivers/char/random.c, one of which, random:urandom_read, was used by stacktrace_build_id selftest to trigger stack trace capture.
Fix breakage by switching to kprobing urandom_read() function.
--- .../selftests/bpf/progs/test_stacktrace_build_id.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)
tools/testing/selftests/bpf/progs/test_stacktrace_build_id.c +2 -10
@@ -39,16 +39,8 @@ struct {__type (value, stack_trace_t); } stack_amap SEC(".maps"); -/* taken from /sys/kernel/debug/tracing/events/random/urandom_read/format */ -struct random_urandom_args { -unsigned long long pad; -int got_bits; -int pool_left; -int input_left; -}; - -SEC("tracepoint/random/urandom_read") -int oncpu (struct random_urandom_args *args) +SEC("kprobe/urandom_read") +int oncpu (struct pt_regs *args) {__u32 max_len =sizeof (struct bpf_stack_build_id ) *PERF_MAX_STACK_DEPTH ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 81/247 selftests/bpf: fix stacktrace_build_id with missing kprobe/urandom_read
In reply to Greg Kroah-HartmanFrom: Song Liu <[email protected]>
[ Upstream commit 59ed76fe2f981bccde37bdddb465f260a96a2404 ]
Kernel function urandom_read is replaced with urandom_read_iter. Therefore, kprobe on urandom_read is not working any more:
[root@eth50-1 bpf]# ./test_progs -n 161 test_stacktrace_build_id:PASS:skel_open_and_load 0 nsec
libbpf: kprobe perf_event_open() failed: No such file or directory
libbpf: prog 'oncpu': failed to create kprobe 'urandom_read+0x0' \
perf event: No such file or directory
libbpf: prog 'oncpu': failed to auto-attach: -2 test_stacktrace_build_id:FAIL:attach_tp err -2
161 stacktrace_build_id:FAIL
Fix this by replacing urandom_read with urandom_read_iter in the test.
--- tools/testing/selftests/bpf/progs/test_stacktrace_build_id.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/progs/test_stacktrace_build_id.c +1 -1
@@ -39,7 +39,7 @@ struct {__type (value, stack_trace_t); } stack_amap SEC(".maps"); -SEC("kprobe/urandom_read") +SEC("kprobe/urandom_read_iter")int oncpu (struct pt_regs *args) {__u32 max_len =sizeof (struct bpf_stack_build_id )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 82/247 bpf: Fix probe read error in ___bpf_prog_run()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit caff1fa4118cec4dfd4336521ebd22a6408a1e3e ]
I think there is something wrong with BPF_PROBE_MEM in ___bpf_prog_run() in big-endian machine. Let's make a test and see what will happen if we want to load a 'u16' with BPF_PROBE_MEM.
Let's make the src value '0x0001', the value of dest register will become 0x0001000000000000, as the value will be loaded to the first 2 byte of DST with following code:
bpf_probe_read_kernel(&DST, SIZE, (const void *)(long) (SRC + insn->off));
Obviously, the value in DST is not correct. In fact, we can compare BPF_PROBE_MEM with LDX_MEM_H:
DST = *(SIZE *)(unsigned long) (SRC + insn->off);
If the memory load is done by LDX_MEM_H, the value in DST will be 0x1 now.
And I think this error results in the test case 'test_bpf_sk_storage_map' failing:
test_bpf_sk_storage_map:PASS:bpf_iter_bpf_sk_storage_map__open_and_load 0 nsec test_bpf_sk_storage_map:PASS:socket 0 nsec test_bpf_sk_storage_map:PASS:map_update 0 nsec test_bpf_sk_storage_map:PASS:socket 0 nsec test_bpf_sk_storage_map:PASS:map_update 0 nsec test_bpf_sk_storage_map:PASS:socket 0 nsec test_bpf_sk_storage_map:PASS:map_update 0 nsec test_bpf_sk_storage_map:PASS:attach_iter 0 nsec test_bpf_sk_storage_map:PASS:create_iter 0 nsec test_bpf_sk_storage_map:PASS:read 0 nsec test_bpf_sk_storage_map:FAIL:ipv6_sk_count got 0 expected 3 $10/26 bpf_iter/bpf_sk_storage_map:FAIL
The code of the test case is simply, it will load sk->sk_family to the register with BPF_PROBE_MEM and check if it is AF_INET6. With this patch, now the test case 'bpf_iter' can pass:
$10 bpf_iter:OK
--- kernel/bpf/core.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
kernel/bpf/core.c +5 -9
@@ -1652,6 +1652,11 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn)CONT ; \ LDX_MEM_##SIZEOP: \ DST = *(SIZE *)(unsigned long) (SRC + insn->off); \ + CONT; \ + LDX_PROBE_MEM_##SIZEOP: \ + bpf_probe_read_kernel(&DST, sizeof(SIZE), \ + (const void *)(long) (SRC + insn->off)); \ + DST = *((SIZE *)&DST); \ CONT;LDST (B , u8)
@@ -1659,15 +1664,6 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn) LDST(W, u32) LDST(DW, u64)#undef LDST -#define LDX_PROBE (SIZEOP ,SIZE ) \ - LDX_PROBE_MEM_##SIZEOP: \ - bpf_probe_read_kernel(&DST, SIZE, (const void *)(long) (SRC + insn->off)); \ - CONT; - LDX_PROBE(B, 1) - LDX_PROBE(H, 2) - LDX_PROBE(W, 4) - LDX_PROBE(DW, 8) -#undef LDX_PROBE#define ATOMIC_ALU_OP (BOP ,KOP ) \ case BOP: \
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 83/247 block: take destination bvec offsets into account in bio_copy_data_iter
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 403d50341cce6b5481a92eb481e6df60b1f49b55 ]
Appartly bcache can copy into bios that do not just contain fresh pages but can have offsets into the bio_vecs. Restore support for tht in bio_copy_data_iter.
--- block/bio.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
block/bio.c +5 -3
@@ -1289,10 +1289,12 @@ void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,struct bio_vec src_bv =bio_iter_iovec (src, *src_iter);struct bio_vec dst_bv =bio_iter_iovec (dst, *dst_iter);unsigned int bytes =min (src_bv.bv_len, dst_bv.bv_len); -void *src_buf; +void *src_buf =bvec_kmap_local (&src_bv); +void *dst_buf =bvec_kmap_local (&dst_bv); - src_buf =bvec_kmap_local (&src_bv); -memcpy_to_bvec (&dst_bv, src_buf); +memcpy (dst_buf, src_buf, bytes); + +kunmap_local (dst_buf);kunmap_local (src_buf);bio_advance_iter_single (src, src_iter, bytes);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 84/247 riscv: read-only pages should not be writable
In reply to Greg Kroah-HartmanFrom: Heinrich Schuchardt <[email protected]>
[ Upstream commit 630f972d76d6460235e84e1aa034ee06f9c8c3a9 ]
If EFI pages are marked as read-only,
we should remove the _PAGE_WRITE flag.
The current code overwrites an unused value.
--- arch/riscv/kernel/efi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/riscv/kernel/efi.c +1 -1
@@ -65,7 +65,7 @@ static int __init set_permissions(pte_t *ptep, unsigned long addr, void *data)if (md->attribute &EFI_MEMORY_RO ) { val =pte_val (pte) & ~_PAGE_WRITE; - val =pte_val (pte) | _PAGE_READ; + val |= _PAGE_READ; pte =__pte (val); }if (md->attribute &EFI_MEMORY_XP ) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 85/247 net/smc: fixes for converting from "struct smc_cdc_tx_pend **" to "struct smc_wr_tx_pend_priv *"
In reply to Greg Kroah-HartmanFrom: Guangguan Wang <[email protected]>
[ Upstream commit e225c9a5a74b12e9ef8516f30a3db2c7eb866ee1 ]
"struct smc_cdc_tx_pend **" can not directly convert to "struct smc_wr_tx_pend_priv *".
--- net/smc/smc_cdc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/smc/smc_cdc.c +1 -1
@@ -72,7 +72,7 @@ int smc_cdc_get_free_slot(struct smc_connection *conn,/* abnormal termination */ if (!rc)smc_wr_tx_put_slot (link, - (struct smc_wr_tx_pend_priv *)pend); + (struct smc_wr_tx_pend_priv *)(*pend)); rc = -EPIPE ; }return rc;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 86/247 tcp: add accessors to read/set tp->snd_cwnd
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 40570375356c874b1578e05c1dcc3ff7c1322dbe ]
We had various bugs over the years with code breaking the assumption that tp->snd_cwnd is greater than zero.
Lately, syzbot reported the WARN_ON_ONCE(!tp->prior_cwnd) added in commit 8b8a321ff72c ("tcp: fix zero cwnd in tcp_cwnd_reduction") can trigger, and without a repro we would have to spend considerable time finding the bug.
Instead of complaining too late, we want to catch where and when tp->snd_cwnd is set to an illegal value.
--- include/net/tcp.h | 19 +++++++++++++++---- include/trace/events/tcp.h | 2 +- net/core/filter.c | 2 +- net/ipv4/tcp.c | 8 ++++---- net/ipv4/tcp_bbr.c | 20 ++++++++++---------- net/ipv4/tcp_bic.c | 14 +++++++------- net/ipv4/tcp_cdg.c | 30 +++++++++++++++--------------- net/ipv4/tcp_cong.c | 18 +++++++++--------- net/ipv4/tcp_cubic.c | 22 +++++++++++----------- net/ipv4/tcp_dctcp.c | 11 ++++++----- net/ipv4/tcp_highspeed.c | 18 +++++++++--------- net/ipv4/tcp_htcp.c | 10 +++++----- net/ipv4/tcp_hybla.c | 18 +++++++++--------- net/ipv4/tcp_illinois.c | 12 +++++++----- net/ipv4/tcp_input.c | 36 ++++++++++++++++++------------------ net/ipv4/tcp_ipv4.c | 2 +- net/ipv4/tcp_lp.c | 6 +++--- net/ipv4/tcp_metrics.c | 12 ++++++------ net/ipv4/tcp_nv.c | 24 ++++++++++++------------ net/ipv4/tcp_output.c | 30 +++++++++++++++--------------- net/ipv4/tcp_rate.c | 2 +- net/ipv4/tcp_scalable.c | 4 ++-- net/ipv4/tcp_vegas.c | 21 +++++++++++---------- net/ipv4/tcp_veno.c | 24 ++++++++++++------------ net/ipv4/tcp_westwood.c | 3 ++- net/ipv4/tcp_yeah.c | 30 +++++++++++++++--------------- net/ipv6/tcp_ipv6.c | 2 +- 27 files changed, 208 insertions(+), 192 deletions(-)
include/net/tcp.h +15 -4
@@ -1199,9 +1199,20 @@ static inline unsigned int tcp_packets_in_flight(const struct tcp_sock *tp)#define TCP_INFINITE_SSTHRESH 0x7fffffff +static inline u32 tcp_snd_cwnd (const struct tcp_sock *tp) +{ +return tp->snd_cwnd; +} + +static inline void tcp_snd_cwnd_set (struct tcp_sock *tp,u32 val) +{ +WARN_ON_ONCE ((int )val <=0 ); + tp->snd_cwnd = val; +} +static inline bool tcp_in_slow_start (const struct tcp_sock *tp) { -return tp->snd_cwnd < tp->snd_ssthresh; +return tcp_snd_cwnd (tp) < tp->snd_ssthresh; }static inline bool tcp_in_initial_slowstart (const struct tcp_sock *tp)
@@ -1227,8 +1238,8 @@ static inline __u32 tcp_current_ssthresh(const struct sock *sk)return tp->snd_ssthresh; else return max(tp->snd_ssthresh, - ((tp->snd_cwnd >>1 ) + - (tp->snd_cwnd >>2 ))); + ((tcp_snd_cwnd (tp) >>1 ) + + (tcp_snd_cwnd (tp) >>2 ))); }/* Use define here intentionally to get WARN_ON location shown at the caller */
@@ -1270,7 +1281,7 @@ static inline bool tcp_is_cwnd_limited(const struct sock *sk)/* If in slow start, ensure cwnd grows to twice what was ACKed. */ if (tcp_in_slow_start (tp)) -return tp->snd_cwnd <2 * tp->max_packets_out; +return tcp_snd_cwnd (tp) <2 * tp->max_packets_out;return tp->is_cwnd_limited; }
include/trace/events/tcp.h +1 -1
@@ -279,7 +279,7 @@ TRACE_EVENT(tcp_probe, __entry->data_len = skb->len -__tcp_hdrlen (th); __entry->snd_nxt = tp->snd_nxt; __entry->snd_una = tp->snd_una; - __entry->snd_cwnd = tp->snd_cwnd; + __entry->snd_cwnd =tcp_snd_cwnd (tp); __entry->snd_wnd = tp->snd_wnd; __entry->rcv_wnd = tp->rcv_wnd; __entry->ssthresh =tcp_current_ssthresh (sk);
net/core/filter.c +1 -1
@@ -4885,7 +4885,7 @@ static int _bpf_setsockopt(struct sock *sk, int level, int optname,if (val <=0 || tp->data_segs_out > tp->syn_data) ret = -EINVAL ;else - tp->snd_cwnd = val; +tcp_snd_cwnd_set (tp, val);break ;case TCP_BPF_SNDCWND_CLAMP :if (val <=0 ) {
net/ipv4/tcp.c +4 -4
@@ -435,7 +435,7 @@ void tcp_init_sock(struct sock *sk)* algorithms that we must have the following bandaid to talk * efficiently to them. -DaveM */ - tp->snd_cwnd =TCP_INIT_CWND ; +tcp_snd_cwnd_set (tp,TCP_INIT_CWND );/* There's a bubble in the pipe until at least the first ACK. */ tp->app_limited = ~0U ;
@@ -3021,7 +3021,7 @@ int tcp_disconnect(struct sock *sk, int flags) icsk->icsk_rto_min =TCP_RTO_MIN ; icsk->icsk_delack_max =TCP_DELACK_MAX ; tp->snd_ssthresh =TCP_INFINITE_SSTHRESH ; - tp->snd_cwnd =TCP_INIT_CWND ; +tcp_snd_cwnd_set (tp,TCP_INIT_CWND ); tp->snd_cwnd_cnt =0 ; tp->window_clamp =0 ; tp->delivered =0 ;
@@ -3732,7 +3732,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) info->tcpi_max_pacing_rate = rate64; info->tcpi_reordering = tp->reordering; - info->tcpi_snd_cwnd = tp->snd_cwnd; + info->tcpi_snd_cwnd =tcp_snd_cwnd (tp);if (info->tcpi_state ==TCP_LISTEN ) {/* listeners aliased fields :
@@ -3901,7 +3901,7 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk, rate64 =tcp_compute_delivery_rate (tp);nla_put_u64_64bit (stats,TCP_NLA_DELIVERY_RATE , rate64,TCP_NLA_PAD ); -nla_put_u32 (stats,TCP_NLA_SND_CWND , tp->snd_cwnd); +nla_put_u32 (stats,TCP_NLA_SND_CWND ,tcp_snd_cwnd (tp));nla_put_u32 (stats,TCP_NLA_REORDERING , tp->reordering);nla_put_u32 (stats,TCP_NLA_MIN_RTT ,tcp_min_rtt (tp));
net/ipv4/tcp_bbr.c +10 -10
@@ -274,7 +274,7 @@ static void bbr_init_pacing_rate_from_rtt(struct sock *sk) }else {/* no RTT sample yet */ rtt_us =USEC_PER_MSEC ;/* use nominal default RTT */ } - bw = (u64 )tp->snd_cwnd *BW_UNIT ; + bw = (u64 )tcp_snd_cwnd (tp) *BW_UNIT ;do_div (bw, rtt_us); sk->sk_pacing_rate =bbr_bw_to_pacing_rate (sk, bw, bbr_high_gain); }
@@ -321,9 +321,9 @@ static void bbr_save_cwnd(struct sock *sk)struct bbr *bbr =inet_csk_ca (sk);if (bbr->prev_ca_state < TCP_CA_Recovery && bbr->mode !=BBR_PROBE_RTT ) - bbr->prior_cwnd = tp->snd_cwnd;/* this cwnd is good enough */ + bbr->prior_cwnd =tcp_snd_cwnd (tp);/* this cwnd is good enough */ else /* loss recovery or BBR_PROBE_RTT have temporarily cut cwnd */ - bbr->prior_cwnd =max (bbr->prior_cwnd, tp->snd_cwnd); + bbr->prior_cwnd =max (bbr->prior_cwnd,tcp_snd_cwnd (tp)); }static void bbr_cwnd_event (struct sock *sk,enum tcp_ca_event event)
@@ -480,7 +480,7 @@ static bool bbr_set_cwnd_to_recover_or_restore(struct tcp_sock *tp =tcp_sk (sk);struct bbr *bbr =inet_csk_ca (sk);u8 prev_state = bbr->prev_ca_state, state =inet_csk (sk)->icsk_ca_state; -u32 cwnd = tp->snd_cwnd; +u32 cwnd =tcp_snd_cwnd (tp);/* An ACK for P pkts should release at most 2*P packets. We do this * in two steps. First, here we deduct the number of lost packets.
@@ -518,7 +518,7 @@ static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, {struct tcp_sock *tp =tcp_sk (sk);struct bbr *bbr =inet_csk_ca (sk); -u32 cwnd = tp->snd_cwnd, target_cwnd =0 ; +u32 cwnd =tcp_snd_cwnd (tp), target_cwnd =0 ;if (!acked) goto done;/* no packet fully ACKed; just apply caps */
@@ -542,9 +542,9 @@ static void bbr_set_cwnd(struct sock *sk, const struct rate_sample *rs, cwnd =max (cwnd, bbr_cwnd_min_target); done: - tp->snd_cwnd =min (cwnd, tp->snd_cwnd_clamp);/* apply global cap */ +tcp_snd_cwnd_set (tp,min (cwnd, tp->snd_cwnd_clamp));/* apply global cap */ if (bbr->mode ==BBR_PROBE_RTT )/* drain queue, refresh min_rtt */ - tp->snd_cwnd =min (tp->snd_cwnd, bbr_cwnd_min_target); +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp), bbr_cwnd_min_target)); }/* End cycle phase if it's time and/or we hit the phase's in-flight target. */
@@ -854,7 +854,7 @@ static void bbr_update_ack_aggregation(struct sock *sk, bbr->ack_epoch_acked =min_t (u32,0xFFFFF , bbr->ack_epoch_acked + rs->acked_sacked); extra_acked = bbr->ack_epoch_acked - expected_acked; - extra_acked =min (extra_acked, tp->snd_cwnd); + extra_acked =min (extra_acked,tcp_snd_cwnd (tp));if (extra_acked > bbr->extra_acked[bbr->extra_acked_win_idx]) bbr->extra_acked[bbr->extra_acked_win_idx] = extra_acked; }
@@ -912,7 +912,7 @@ static void bbr_check_probe_rtt_done(struct sock *sk)return ; bbr->min_rtt_stamp = tcp_jiffies32;/* wait a while until PROBE_RTT */ - tp->snd_cwnd =max (tp->snd_cwnd, bbr->prior_cwnd); +tcp_snd_cwnd_set (tp,max (tcp_snd_cwnd (tp), bbr->prior_cwnd));bbr_reset_mode (sk); }
@@ -1091,7 +1091,7 @@ static u32 bbr_undo_cwnd(struct sock *sk) bbr->full_bw =0 ;/* spurious slow-down; reset full pipe detection */ bbr->full_bw_cnt =0 ;bbr_reset_lt_bw_sampling (sk); -return tcp_sk (sk)->snd_cwnd; +return tcp_snd_cwnd (tcp_sk (sk)); }/* Entering loss recovery, so save cwnd for when we exit or undo recovery. */
net/ipv4/tcp_bic.c +7 -7
@@ -150,7 +150,7 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)if (!acked)return ; } -bictcp_update (ca, tp->snd_cwnd); +bictcp_update (ca,tcp_snd_cwnd (tp));tcp_cong_avoid_ai (tp, ca->cnt, acked); }
@@ -166,16 +166,16 @@ static u32 bictcp_recalc_ssthresh(struct sock *sk) ca->epoch_start =0 ;/* end of epoch */ /* Wmax and fast convergence */ -if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence) - ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta)) +if (tcp_snd_cwnd (tp) < ca->last_max_cwnd && fast_convergence) + ca->last_max_cwnd = (tcp_snd_cwnd (tp) * (BICTCP_BETA_SCALE + beta)) / (2 *BICTCP_BETA_SCALE );else - ca->last_max_cwnd = tp->snd_cwnd; + ca->last_max_cwnd =tcp_snd_cwnd (tp); -if (tp->snd_cwnd <= low_window) -return max (tp->snd_cwnd >>1U ,2U ); +if (tcp_snd_cwnd (tp) <= low_window) +return max (tcp_snd_cwnd (tp) >>1U ,2U );else -return max ((tp->snd_cwnd * beta) /BICTCP_BETA_SCALE ,2U ); +return max ((tcp_snd_cwnd (tp) * beta) /BICTCP_BETA_SCALE ,2U ); }static void bictcp_state (struct sock *sk,u8 new_state)
net/ipv4/tcp_cdg.c +15 -15
@@ -161,8 +161,8 @@ static void tcp_cdg_hystart_update(struct sock *sk) LINUX_MIB_TCPHYSTARTTRAINDETECT);NET_ADD_STATS (sock_net (sk),LINUX_MIB_TCPHYSTARTTRAINCWND , - tp->snd_cwnd); - tp->snd_ssthresh = tp->snd_cwnd; +tcp_snd_cwnd (tp)); + tp->snd_ssthresh =tcp_snd_cwnd (tp);return ; } }
@@ -180,8 +180,8 @@ static void tcp_cdg_hystart_update(struct sock *sk) LINUX_MIB_TCPHYSTARTDELAYDETECT);NET_ADD_STATS (sock_net (sk),LINUX_MIB_TCPHYSTARTDELAYCWND , - tp->snd_cwnd); - tp->snd_ssthresh = tp->snd_cwnd; +tcp_snd_cwnd (tp)); + tp->snd_ssthresh =tcp_snd_cwnd (tp); } } }
@@ -252,7 +252,7 @@ static bool tcp_cdg_backoff(struct sock *sk, u32 grad)return false; } - ca->shadow_wnd =max (ca->shadow_wnd, tp->snd_cwnd); + ca->shadow_wnd =max (ca->shadow_wnd,tcp_snd_cwnd (tp)); ca->state =CDG_BACKOFF ;tcp_enter_cwr (sk);return true;
@@ -285,14 +285,14 @@ static void tcp_cdg_cong_avoid(struct sock *sk, u32 ack, u32 acked) }if (!tcp_is_cwnd_limited (sk)) { - ca->shadow_wnd =min (ca->shadow_wnd, tp->snd_cwnd); + ca->shadow_wnd =min (ca->shadow_wnd,tcp_snd_cwnd (tp));return ; } - prior_snd_cwnd = tp->snd_cwnd; + prior_snd_cwnd =tcp_snd_cwnd (tp);tcp_reno_cong_avoid (sk, ack, acked); - incr = tp->snd_cwnd - prior_snd_cwnd; + incr =tcp_snd_cwnd (tp) - prior_snd_cwnd; ca->shadow_wnd =max (ca->shadow_wnd, ca->shadow_wnd + incr); }
@@ -331,15 +331,15 @@ static u32 tcp_cdg_ssthresh(struct sock *sk)struct tcp_sock *tp =tcp_sk (sk);if (ca->state ==CDG_BACKOFF ) -return max (2U , (tp->snd_cwnd *min (1024U , backoff_beta)) >>10 ); +return max (2U , (tcp_snd_cwnd (tp) *min (1024U , backoff_beta)) >>10 );if (ca->state ==CDG_NONFULL && use_tolerance) -return tp->snd_cwnd; +return tcp_snd_cwnd (tp); - ca->shadow_wnd =min (ca->shadow_wnd >>1 , tp->snd_cwnd); + ca->shadow_wnd =min (ca->shadow_wnd >>1 ,tcp_snd_cwnd (tp));if (use_shadow) -return max3 (2U , ca->shadow_wnd, tp->snd_cwnd >>1 ); -return max (2U , tp->snd_cwnd >>1 ); +return max3 (2U , ca->shadow_wnd,tcp_snd_cwnd (tp) >>1 ); +return max (2U ,tcp_snd_cwnd (tp) >>1 ); }static void tcp_cdg_cwnd_event (struct sock *sk,const enum tcp_ca_event ev)
@@ -357,7 +357,7 @@ static void tcp_cdg_cwnd_event(struct sock *sk, const enum tcp_ca_event ev) ca->gradients = gradients; ca->rtt_seq = tp->snd_nxt; - ca->shadow_wnd = tp->snd_cwnd; + ca->shadow_wnd =tcp_snd_cwnd (tp);break ;case CA_EVENT_COMPLETE_CWR : ca->state =CDG_UNKNOWN ;
@@ -380,7 +380,7 @@ static void tcp_cdg_init(struct sock *sk) ca->gradients =kcalloc (window,sizeof (ca->gradients[0 ]),GFP_NOWAIT | __GFP_NOWARN); ca->rtt_seq = tp->snd_nxt; - ca->shadow_wnd = tp->snd_cwnd; + ca->shadow_wnd =tcp_snd_cwnd (tp); }static void tcp_cdg_release (struct sock *sk)
net/ipv4/tcp_cong.c +9 -9
@@ -395,10 +395,10 @@ int tcp_set_congestion_control(struct sock *sk, const char *name, bool load,*/ u32 tcp_slow_start (struct tcp_sock *tp,u32 acked) { -u32 cwnd =min (tp->snd_cwnd + acked, tp->snd_ssthresh); +u32 cwnd =min (tcp_snd_cwnd (tp) + acked, tp->snd_ssthresh); - acked -= cwnd - tp->snd_cwnd; - tp->snd_cwnd =min (cwnd, tp->snd_cwnd_clamp); + acked -= cwnd -tcp_snd_cwnd (tp); +tcp_snd_cwnd_set (tp,min (cwnd, tp->snd_cwnd_clamp));return acked; }
@@ -412,7 +412,7 @@ void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked)/* If credits accumulated at a higher w, apply them gently now. */ if (tp->snd_cwnd_cnt >= w) { tp->snd_cwnd_cnt =0 ; - tp->snd_cwnd++; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); } tp->snd_cwnd_cnt += acked;
@@ -420,9 +420,9 @@ void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked)u32 delta = tp->snd_cwnd_cnt / w; tp->snd_cwnd_cnt -= delta * w; - tp->snd_cwnd += delta; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) + delta); } - tp->snd_cwnd =min (tp->snd_cwnd, tp->snd_cwnd_clamp); +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp), tp->snd_cwnd_clamp)); }EXPORT_SYMBOL_GPL (tcp_cong_avoid_ai);
@@ -447,7 +447,7 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked)return ; }/* In dangerous area, increase slowly. */ -tcp_cong_avoid_ai (tp, tp->snd_cwnd, acked); +tcp_cong_avoid_ai (tp,tcp_snd_cwnd (tp), acked); }EXPORT_SYMBOL_GPL (tcp_reno_cong_avoid);
@@ -456,7 +456,7 @@ u32 tcp_reno_ssthresh(struct sock *sk) {const struct tcp_sock *tp =tcp_sk (sk); -return max (tp->snd_cwnd >>1U ,2U ); +return max (tcp_snd_cwnd (tp) >>1U ,2U ); }EXPORT_SYMBOL_GPL (tcp_reno_ssthresh);
@@ -464,7 +464,7 @@ u32 tcp_reno_undo_cwnd(struct sock *sk) {const struct tcp_sock *tp =tcp_sk (sk); -return max (tp->snd_cwnd, tp->prior_cwnd); +return max (tcp_snd_cwnd (tp), tp->prior_cwnd); }EXPORT_SYMBOL_GPL (tcp_reno_undo_cwnd);
net/ipv4/tcp_cubic.c +11 -11
@@ -332,7 +332,7 @@ static void cubictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)if (!acked)return ; } -bictcp_update (ca, tp->snd_cwnd, acked); +bictcp_update (ca,tcp_snd_cwnd (tp), acked);tcp_cong_avoid_ai (tp, ca->cnt, acked); }
@@ -344,13 +344,13 @@ static u32 cubictcp_recalc_ssthresh(struct sock *sk) ca->epoch_start =0 ;/* end of epoch */ /* Wmax and fast convergence */ -if (tp->snd_cwnd < ca->last_max_cwnd && fast_convergence) - ca->last_max_cwnd = (tp->snd_cwnd * (BICTCP_BETA_SCALE + beta)) +if (tcp_snd_cwnd (tp) < ca->last_max_cwnd && fast_convergence) + ca->last_max_cwnd = (tcp_snd_cwnd (tp) * (BICTCP_BETA_SCALE + beta)) / (2 *BICTCP_BETA_SCALE );else - ca->last_max_cwnd = tp->snd_cwnd; + ca->last_max_cwnd =tcp_snd_cwnd (tp); -return max ((tp->snd_cwnd * beta) /BICTCP_BETA_SCALE ,2U ); +return max ((tcp_snd_cwnd (tp) * beta) /BICTCP_BETA_SCALE ,2U ); }static void cubictcp_state (struct sock *sk,u8 new_state)
@@ -411,13 +411,13 @@ static void hystart_update(struct sock *sk, u32 delay) ca->found =1 ;pr_debug ("hystart_ack_train (%u > %u) delay_min %u (+ ack_delay %u) cwnd %u\n" , now - ca->round_start, threshold, - ca->delay_min,hystart_ack_delay (sk), tp->snd_cwnd); + ca->delay_min,hystart_ack_delay (sk),tcp_snd_cwnd (tp));NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPHYSTARTTRAINDETECT );NET_ADD_STATS (sock_net (sk),LINUX_MIB_TCPHYSTARTTRAINCWND , - tp->snd_cwnd); - tp->snd_ssthresh = tp->snd_cwnd; +tcp_snd_cwnd (tp)); + tp->snd_ssthresh =tcp_snd_cwnd (tp); } } }
@@ -436,8 +436,8 @@ static void hystart_update(struct sock *sk, u32 delay) LINUX_MIB_TCPHYSTARTDELAYDETECT);NET_ADD_STATS (sock_net (sk),LINUX_MIB_TCPHYSTARTDELAYCWND , - tp->snd_cwnd); - tp->snd_ssthresh = tp->snd_cwnd; +tcp_snd_cwnd (tp)); + tp->snd_ssthresh =tcp_snd_cwnd (tp); } } }
@@ -467,7 +467,7 @@ static void cubictcp_acked(struct sock *sk, const struct ack_sample *sample)/* hystart triggers when cwnd is larger than some threshold */ if (!ca->found &&tcp_in_slow_start (tp) && hystart && - tp->snd_cwnd >= hystart_low_window) +tcp_snd_cwnd (tp) >= hystart_low_window)hystart_update (sk, delay); }
net/ipv4/tcp_dctcp.c +6 -5
@@ -104,8 +104,8 @@ static u32 dctcp_ssthresh(struct sock *sk)struct dctcp *ca =inet_csk_ca (sk);struct tcp_sock *tp =tcp_sk (sk); - ca->loss_cwnd = tp->snd_cwnd; -return max (tp->snd_cwnd - ((tp->snd_cwnd * ca->dctcp_alpha) >>11U ),2U ); + ca->loss_cwnd =tcp_snd_cwnd (tp); +return max (tcp_snd_cwnd (tp) - ((tcp_snd_cwnd (tp) * ca->dctcp_alpha) >>11U ),2U ); }static void dctcp_update_alpha (struct sock *sk,u32 flags)
@@ -146,8 +146,8 @@ static void dctcp_react_to_loss(struct sock *sk)struct dctcp *ca =inet_csk_ca (sk);struct tcp_sock *tp =tcp_sk (sk); - ca->loss_cwnd = tp->snd_cwnd; - tp->snd_ssthresh =max (tp->snd_cwnd >>1U ,2U ); + ca->loss_cwnd =tcp_snd_cwnd (tp); + tp->snd_ssthresh =max (tcp_snd_cwnd (tp) >>1U ,2U ); }static void dctcp_state (struct sock *sk,u8 new_state)
@@ -209,8 +209,9 @@ static size_t dctcp_get_info(struct sock *sk, u32 ext, int *attr,static u32 dctcp_cwnd_undo (struct sock *sk) {const struct dctcp *ca =inet_csk_ca (sk); +struct tcp_sock *tp =tcp_sk (sk); -return max (tcp_sk (sk)->snd_cwnd, ca->loss_cwnd); +return max (tcp_snd_cwnd (tp), ca->loss_cwnd); }static struct tcp_congestion_ops dctcp__read_mostly = {
net/ipv4/tcp_highspeed.c +9 -9
@@ -127,22 +127,22 @@ static void hstcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)* snd_cwnd <= * hstcp_aimd_vals[ca->ai].cwnd */ -if (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd) { -while (tp->snd_cwnd > hstcp_aimd_vals[ca->ai].cwnd && +if (tcp_snd_cwnd (tp) > hstcp_aimd_vals[ca->ai].cwnd) { +while (tcp_snd_cwnd (tp) > hstcp_aimd_vals[ca->ai].cwnd && ca->ai <HSTCP_AIMD_MAX -1 ) ca->ai++; - }else if (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1 ].cwnd) { -while (ca->ai && tp->snd_cwnd <= hstcp_aimd_vals[ca->ai-1 ].cwnd) + }else if (ca->ai &&tcp_snd_cwnd (tp) <= hstcp_aimd_vals[ca->ai-1 ].cwnd) { +while (ca->ai &&tcp_snd_cwnd (tp) <= hstcp_aimd_vals[ca->ai-1 ].cwnd) ca->ai--; }/* Do additive increase */ -if (tp->snd_cwnd < tp->snd_cwnd_clamp) { +if (tcp_snd_cwnd (tp) < tp->snd_cwnd_clamp) {/* cwnd = cwnd + a(w) / cwnd */ tp->snd_cwnd_cnt += ca->ai +1 ; -if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { - tp->snd_cwnd_cnt -= tp->snd_cwnd; - tp->snd_cwnd++; +if (tp->snd_cwnd_cnt >=tcp_snd_cwnd (tp)) { + tp->snd_cwnd_cnt -=tcp_snd_cwnd (tp); +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); } } }
@@ -154,7 +154,7 @@ static u32 hstcp_ssthresh(struct sock *sk)struct hstcp *ca =inet_csk_ca (sk);/* Do multiplicative decrease */ -return max (tp->snd_cwnd - ((tp->snd_cwnd * hstcp_aimd_vals[ca->ai].md) >>8 ),2U ); +return max (tcp_snd_cwnd (tp) - ((tcp_snd_cwnd (tp) * hstcp_aimd_vals[ca->ai].md) >>8 ),2U ); }static struct tcp_congestion_ops tcp_highspeed__read_mostly = {
net/ipv4/tcp_htcp.c +5 -5
@@ -124,7 +124,7 @@ static void measure_achieved_throughput(struct sock *sk, ca->packetcount += sample->pkts_acked; -if (ca->packetcount >= tp->snd_cwnd - (ca->alpha >>7 ? :1 ) && +if (ca->packetcount >=tcp_snd_cwnd (tp) - (ca->alpha >>7 ? :1 ) && now - ca->lasttime >= ca->minRTT && ca->minRTT >0 ) {__u32 cur_Bi = ca->packetcount *HZ / (now - ca->lasttime);
@@ -225,7 +225,7 @@ static u32 htcp_recalc_ssthresh(struct sock *sk)const struct htcp *ca =inet_csk_ca (sk);htcp_param_update (sk); -return max ((tp->snd_cwnd * ca->beta) >>7 ,2U ); +return max ((tcp_snd_cwnd (tp) * ca->beta) >>7 ,2U ); }static void htcp_cong_avoid (struct sock *sk,u32 ack,u32 acked)
@@ -242,9 +242,9 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 acked)/* In dangerous area, increase slowly. * In theory this is tp->snd_cwnd += alpha / tp->snd_cwnd */ -if ((tp->snd_cwnd_cnt * ca->alpha)>>7 >= tp->snd_cwnd) { -if (tp->snd_cwnd < tp->snd_cwnd_clamp) - tp->snd_cwnd++; +if ((tp->snd_cwnd_cnt * ca->alpha)>>7 >=tcp_snd_cwnd (tp)) { +if (tcp_snd_cwnd (tp) < tp->snd_cwnd_clamp) +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); tp->snd_cwnd_cnt =0 ;htcp_alpha_update (ca); }else
net/ipv4/tcp_hybla.c +9 -9
@@ -54,7 +54,7 @@ static void hybla_init(struct sock *sk) ca->rho2_7ls =0 ; ca->snd_cwnd_cents =0 ; ca->hybla_en = true; - tp->snd_cwnd =2 ; +tcp_snd_cwnd_set (tp,2 ); tp->snd_cwnd_clamp =65535 ;/* 1st Rho measurement based on initial srtt */
@@ -62,7 +62,7 @@ static void hybla_init(struct sock *sk)/* set minimum rtt as this is the 1st ever seen */ ca->minrtt_us = tp->srtt_us; - tp->snd_cwnd = ca->rho; +tcp_snd_cwnd_set (tp, ca->rho); }static void hybla_state (struct sock *sk,u8 ca_state)
@@ -137,31 +137,31 @@ static void hybla_cong_avoid(struct sock *sk, u32 ack, u32 acked)* as long as increment is estimated as (rho<<7)/window * it already is <<7 and we can easily count its fractions. */ - increment = ca->rho2_7ls / tp->snd_cwnd; + increment = ca->rho2_7ls /tcp_snd_cwnd (tp);if (increment <128 ) tp->snd_cwnd_cnt++; } odd = increment %128 ; - tp->snd_cwnd += increment >>7 ; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) + (increment >>7 )); ca->snd_cwnd_cents += odd;/* check when fractions goes >=128 and increase cwnd by 1. */ while (ca->snd_cwnd_cents >=128 ) { - tp->snd_cwnd++; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); ca->snd_cwnd_cents -=128 ; tp->snd_cwnd_cnt =0 ; }/* check when cwnd has not been incremented for a while */ -if (increment ==0 && odd ==0 && tp->snd_cwnd_cnt >= tp->snd_cwnd) { - tp->snd_cwnd++; +if (increment ==0 && odd ==0 && tp->snd_cwnd_cnt >=tcp_snd_cwnd (tp)) { +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); tp->snd_cwnd_cnt =0 ; }/* clamp down slowstart cwnd to ssthresh value. */ if (is_slowstart) - tp->snd_cwnd =min (tp->snd_cwnd, tp->snd_ssthresh); +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp), tp->snd_ssthresh)); - tp->snd_cwnd =min_t (u32, tp->snd_cwnd, tp->snd_cwnd_clamp); +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp), tp->snd_cwnd_clamp)); }static struct tcp_congestion_ops tcp_hybla__read_mostly = {
net/ipv4/tcp_illinois.c +7 -5
@@ -224,7 +224,7 @@ static void update_params(struct sock *sk)struct tcp_sock *tp =tcp_sk (sk);struct illinois *ca =inet_csk_ca (sk); -if (tp->snd_cwnd < win_thresh) { +if (tcp_snd_cwnd (tp) < win_thresh) { ca->alpha =ALPHA_BASE ; ca->beta =BETA_BASE ; }else if (ca->cnt_rtt >0 ) {
@@ -284,9 +284,9 @@ static void tcp_illinois_cong_avoid(struct sock *sk, u32 ack, u32 acked)* tp->snd_cwnd += alpha/tp->snd_cwnd */ delta = (tp->snd_cwnd_cnt * ca->alpha) >>ALPHA_SHIFT ; -if (delta >= tp->snd_cwnd) { - tp->snd_cwnd =min (tp->snd_cwnd + delta / tp->snd_cwnd, - (u32 )tp->snd_cwnd_clamp); +if (delta >=tcp_snd_cwnd (tp)) { +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp) + delta /tcp_snd_cwnd (tp), + (u32 )tp->snd_cwnd_clamp)); tp->snd_cwnd_cnt =0 ; } }
@@ -296,9 +296,11 @@ static u32 tcp_illinois_ssthresh(struct sock *sk) {struct tcp_sock *tp =tcp_sk (sk);struct illinois *ca =inet_csk_ca (sk); +u32 decr;/* Multiplicative decrease */ -return max (tp->snd_cwnd - ((tp->snd_cwnd * ca->beta) >>BETA_SHIFT ),2U ); + decr = (tcp_snd_cwnd (tp) * ca->beta) >>BETA_SHIFT ; +return max (tcp_snd_cwnd (tp) - decr,2U ); }/* Extract info for Tcp socket info provided via netlink. */
net/ipv4/tcp_input.c +18 -18
@@ -414,7 +414,7 @@ static void tcp_sndbuf_expand(struct sock *sk) per_mss =roundup_pow_of_two (per_mss) +SKB_DATA_ALIGN (sizeof (struct sk_buff )); - nr_segs =max_t (u32,TCP_INIT_CWND , tp->snd_cwnd); + nr_segs =max_t (u32,TCP_INIT_CWND ,tcp_snd_cwnd (tp)); nr_segs =max_t (u32, nr_segs, tp->reordering +1 );/* Fast Recovery (RFC 5681 3.2) :
@@ -901,12 +901,12 @@ static void tcp_update_pacing_rate(struct sock *sk)* If snd_cwnd >= (tp->snd_ssthresh / 2), we are approaching * end of slow start and should slow down. */ -if (tp->snd_cwnd < tp->snd_ssthresh /2 ) +if (tcp_snd_cwnd (tp) < tp->snd_ssthresh /2 ) rate *=sock_net (sk)->ipv4.sysctl_tcp_pacing_ss_ratio;else rate *=sock_net (sk)->ipv4.sysctl_tcp_pacing_ca_ratio; - rate *=max (tp->snd_cwnd, tp->packets_out); + rate *=max (tcp_snd_cwnd (tp), tp->packets_out);if (likely (tp->srtt_us))do_div (rate, tp->srtt_us);
@@ -2139,12 +2139,12 @@ void tcp_enter_loss(struct sock *sk) !after(tp->high_seq, tp->snd_una) || (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) { tp->prior_ssthresh =tcp_current_ssthresh (sk); - tp->prior_cwnd = tp->snd_cwnd; + tp->prior_cwnd =tcp_snd_cwnd (tp); tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh (sk);tcp_ca_event (sk,CA_EVENT_LOSS );tcp_init_undo (tp); } - tp->snd_cwnd =tcp_packets_in_flight (tp) +1 ; +tcp_snd_cwnd_set (tp,tcp_packets_in_flight (tp) +1 ); tp->snd_cwnd_cnt =0 ; tp->snd_cwnd_stamp = tcp_jiffies32;
@@ -2450,7 +2450,7 @@ static void DBGUNDO(struct sock *sk, const char *msg)pr_debug ("Undo %s %pI4/%u c%u l%u ss%u/%u p%u\n" , msg, &inet->inet_daddr,ntohs (inet->inet_dport), - tp->snd_cwnd,tcp_left_out (tp), +tcp_snd_cwnd (tp),tcp_left_out (tp), tp->snd_ssthresh, tp->prior_ssthresh, tp->packets_out); }
@@ -2459,7 +2459,7 @@ static void DBGUNDO(struct sock *sk, const char *msg)pr_debug ("Undo %s %pI6/%u c%u l%u ss%u/%u p%u\n" , msg, &sk->sk_v6_daddr,ntohs (inet->inet_dport), - tp->snd_cwnd,tcp_left_out (tp), +tcp_snd_cwnd (tp),tcp_left_out (tp), tp->snd_ssthresh, tp->prior_ssthresh, tp->packets_out); }
@@ -2484,7 +2484,7 @@ static void tcp_undo_cwnd_reduction(struct sock *sk, bool unmark_loss)if (tp->prior_ssthresh) {const struct inet_connection_sock *icsk =inet_csk (sk); - tp->snd_cwnd = icsk->icsk_ca_ops->undo_cwnd (sk); +tcp_snd_cwnd_set (tp, icsk->icsk_ca_ops->undo_cwnd (sk));if (tp->prior_ssthresh > tp->snd_ssthresh) { tp->snd_ssthresh = tp->prior_ssthresh;
@@ -2591,7 +2591,7 @@ static void tcp_init_cwnd_reduction(struct sock *sk) tp->high_seq = tp->snd_nxt; tp->tlp_high_seq =0 ; tp->snd_cwnd_cnt =0 ; - tp->prior_cwnd = tp->snd_cwnd; + tp->prior_cwnd =tcp_snd_cwnd (tp); tp->prr_delivered =0 ; tp->prr_out =0 ; tp->snd_ssthresh =inet_csk (sk)->icsk_ca_ops->ssthresh (sk);
@@ -2621,7 +2621,7 @@ void tcp_cwnd_reduction(struct sock *sk, int newly_acked_sacked, int newly_lost, }/* Force a fast retransmit upon entering fast recovery */ sndcnt =max (sndcnt, (tp->prr_out ?0 :1 )); - tp->snd_cwnd =tcp_packets_in_flight (tp) + sndcnt; +tcp_snd_cwnd_set (tp,tcp_packets_in_flight (tp) + sndcnt); }static inline void tcp_end_cwnd_reduction (struct sock *sk)
@@ -2634,7 +2634,7 @@ static inline void tcp_end_cwnd_reduction(struct sock *sk)/* Reset cwnd to ssthresh in CWR or Recovery (unless it's undone) */ if (tp->snd_ssthresh <TCP_INFINITE_SSTHRESH && (inet_csk (sk)->icsk_ca_state ==TCP_CA_CWR || tp->undo_marker)) { - tp->snd_cwnd = tp->snd_ssthresh; +tcp_snd_cwnd_set (tp, tp->snd_ssthresh); tp->snd_cwnd_stamp = tcp_jiffies32; }tcp_ca_event (sk,CA_EVENT_COMPLETE_CWR );
@@ -2701,9 +2701,9 @@ static void tcp_mtup_probe_success(struct sock *sk)/* FIXME: breaks with very large cwnd */ tp->prior_ssthresh =tcp_current_ssthresh (sk); - tp->snd_cwnd = tp->snd_cwnd * -tcp_mss_to_mtu (sk, tp->mss_cache) / - icsk->icsk_mtup.probe_size; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) * +tcp_mss_to_mtu (sk, tp->mss_cache) / + icsk->icsk_mtup.probe_size); tp->snd_cwnd_cnt =0 ; tp->snd_cwnd_stamp = tcp_jiffies32; tp->snd_ssthresh =tcp_current_ssthresh (sk);
@@ -3026,7 +3026,7 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una, tp->snd_una == tp->mtu_probe.probe_seq_start) {tcp_mtup_probe_failed (sk);/* Restores the reduction we did in tcp_mtup_probe() */ - tp->snd_cwnd++; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 );tcp_simple_retransmit (sk);return ; }
@@ -5403,7 +5403,7 @@ static bool tcp_should_expand_sndbuf(const struct sock *sk)return false;/* If we filled the congestion window, do not expand. */ -if (tcp_packets_in_flight (tp) >= tp->snd_cwnd) +if (tcp_packets_in_flight (tp) >=tcp_snd_cwnd (tp))return false;return true;
@@ -5970,9 +5970,9 @@ void tcp_init_transfer(struct sock *sk, int bpf_op, struct sk_buff *skb)* retransmission has occurred. */ if (tp->total_retrans >1 && tp->undo_marker) - tp->snd_cwnd =1 ; +tcp_snd_cwnd_set (tp,1 );else - tp->snd_cwnd =tcp_init_cwnd (tp,__sk_dst_get (sk)); +tcp_snd_cwnd_set (tp,tcp_init_cwnd (tp,__sk_dst_get (sk))); tp->snd_cwnd_stamp = tcp_jiffies32;bpf_skops_established (sk, bpf_op, skb);
net/ipv4/tcp_ipv4.c +1 -1
@@ -2656,7 +2656,7 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i)jiffies_to_clock_t (icsk->icsk_rto),jiffies_to_clock_t (icsk->icsk_ack.ato), (icsk->icsk_ack.quick <<1 ) |inet_csk_in_pingpong_mode (sk), - tp->snd_cwnd, +tcp_snd_cwnd (tp), state ==TCP_LISTEN ? fastopenq->max_qlen : (tcp_in_initial_slowstart(tp) ? -1 : tp->snd_ssthresh));
net/ipv4/tcp_lp.c +3 -3
@@ -297,7 +297,7 @@ static void tcp_lp_pkts_acked(struct sock *sk, const struct ack_sample *sample) lp->flag &= ~LP_WITHIN_THR ;pr_debug ("TCP-LP: %05o|%5u|%5u|%15u|%15u|%15u\n" , lp->flag, - tp->snd_cwnd, lp->remote_hz, lp->owd_min, lp->owd_max, +tcp_snd_cwnd (tp), lp->remote_hz, lp->owd_min, lp->owd_max, lp->sowd >>3 );if (lp->flag &LP_WITHIN_THR )
@@ -313,12 +313,12 @@ static void tcp_lp_pkts_acked(struct sock *sk, const struct ack_sample *sample)/* happened within inference * drop snd_cwnd into 1 */ if (lp->flag &LP_WITHIN_INF ) - tp->snd_cwnd =1U ; +tcp_snd_cwnd_set (tp,1U );/* happened after inference * cut snd_cwnd into half */ else - tp->snd_cwnd =max (tp->snd_cwnd >>1U ,1U ); +tcp_snd_cwnd_set (tp,max (tcp_snd_cwnd (tp) >>1U ,1U ));/* record this drop time */ lp->last_drop = now;
net/ipv4/tcp_metrics.c +6 -6
@@ -388,15 +388,15 @@ void tcp_update_metrics(struct sock *sk)if (!net->ipv4.sysctl_tcp_no_ssthresh_metrics_save && !tcp_metric_locked (tm,TCP_METRIC_SSTHRESH )) { val =tcp_metric_get (tm,TCP_METRIC_SSTHRESH ); -if (val && (tp->snd_cwnd >>1 ) > val) +if (val && (tcp_snd_cwnd (tp) >>1 ) > val)tcp_metric_set (tm,TCP_METRIC_SSTHRESH , - tp->snd_cwnd >>1 ); +tcp_snd_cwnd (tp) >>1 ); }if (!tcp_metric_locked (tm,TCP_METRIC_CWND )) { val =tcp_metric_get (tm,TCP_METRIC_CWND ); -if (tp->snd_cwnd > val) +if (tcp_snd_cwnd (tp) > val)tcp_metric_set (tm,TCP_METRIC_CWND , - tp->snd_cwnd); +tcp_snd_cwnd (tp)); } }else if (!tcp_in_slow_start (tp) && icsk->icsk_ca_state == TCP_CA_Open) {
@@ -404,10 +404,10 @@ void tcp_update_metrics(struct sock *sk)if (!net->ipv4.sysctl_tcp_no_ssthresh_metrics_save && !tcp_metric_locked (tm,TCP_METRIC_SSTHRESH ))tcp_metric_set (tm,TCP_METRIC_SSTHRESH , -max (tp->snd_cwnd >>1 , tp->snd_ssthresh)); +max (tcp_snd_cwnd (tp) >>1 , tp->snd_ssthresh));if (!tcp_metric_locked (tm,TCP_METRIC_CWND )) { val =tcp_metric_get (tm,TCP_METRIC_CWND ); -tcp_metric_set (tm,TCP_METRIC_CWND , (val + tp->snd_cwnd) >>1 ); +tcp_metric_set (tm,TCP_METRIC_CWND , (val +tcp_snd_cwnd (tp)) >>1 ); } }else {/* Else slow start did not finish, cwnd is non-sense,
net/ipv4/tcp_nv.c +12 -12
@@ -198,10 +198,10 @@ static void tcpnv_cong_avoid(struct sock *sk, u32 ack, u32 acked) }if (ca->cwnd_growth_factor <0 ) { - cnt = tp->snd_cwnd << -ca->cwnd_growth_factor; + cnt =tcp_snd_cwnd (tp) << -ca->cwnd_growth_factor;tcp_cong_avoid_ai (tp, cnt, acked); }else { - cnt =max (4U , tp->snd_cwnd >> ca->cwnd_growth_factor); + cnt =max (4U ,tcp_snd_cwnd (tp) >> ca->cwnd_growth_factor);tcp_cong_avoid_ai (tp, cnt, acked); } }
@@ -210,7 +210,7 @@ static u32 tcpnv_recalc_ssthresh(struct sock *sk) {const struct tcp_sock *tp =tcp_sk (sk); -return max ((tp->snd_cwnd * nv_loss_dec_factor) >>10 ,2U ); +return max ((tcp_snd_cwnd (tp) * nv_loss_dec_factor) >>10 ,2U ); }static void tcpnv_state (struct sock *sk,u8 new_state)
@@ -258,7 +258,7 @@ static void tcpnv_acked(struct sock *sk, const struct ack_sample *sample)return ;/* Stop cwnd growth if we were in catch up mode */ -if (ca->nv_catchup && tp->snd_cwnd >= nv_min_cwnd) { +if (ca->nv_catchup &&tcp_snd_cwnd (tp) >= nv_min_cwnd) { ca->nv_catchup =0 ; ca->nv_allow_cwnd_growth =0 ; }
@@ -372,7 +372,7 @@ static void tcpnv_acked(struct sock *sk, const struct ack_sample *sample)* if cwnd < max_win, grow cwnd * else leave the same */ -if (tp->snd_cwnd > max_win) { +if (tcp_snd_cwnd (tp) > max_win) {/* there is congestion, check that it is ok * to make a CA decision * 1. We should have at least nv_dec_eval_min_calls
@@ -399,20 +399,20 @@ static void tcpnv_acked(struct sock *sk, const struct ack_sample *sample) ca->nv_allow_cwnd_growth =0 ; tp->snd_ssthresh = (nv_ssthresh_factor * max_win) >>3 ; -if (tp->snd_cwnd - max_win >2 ) { +if (tcp_snd_cwnd (tp) - max_win >2 ) {/* gap > 2, we do exponential cwnd decrease */ int dec; - dec =max (2U , ((tp->snd_cwnd - max_win) * + dec =max (2U , ((tcp_snd_cwnd (tp) - max_win) * nv_cong_dec_mult) >>7 ); - tp->snd_cwnd -= dec; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) - dec); }else if (nv_cong_dec_mult >0 ) { - tp->snd_cwnd = max_win; +tcp_snd_cwnd_set (tp, max_win); }if (ca->cwnd_growth_factor >0 ) ca->cwnd_growth_factor =0 ; ca->nv_no_cong_cnt =0 ; - }else if (tp->snd_cwnd <= max_win - nv_pad_buffer) { + }else if (tcp_snd_cwnd (tp) <= max_win - nv_pad_buffer) {/* There is no congestion, grow cwnd if allowed*/ if (ca->nv_eval_call_cnt < nv_inc_eval_min_calls)return ;
@@ -445,8 +445,8 @@ static void tcpnv_acked(struct sock *sk, const struct ack_sample *sample)* (it wasn't before, if it is now is because nv * decreased it). */ -if (tp->snd_cwnd < nv_min_cwnd) - tp->snd_cwnd = nv_min_cwnd; +if (tcp_snd_cwnd (tp) < nv_min_cwnd) +tcp_snd_cwnd_set (tp, nv_min_cwnd); } }
net/ipv4/tcp_output.c +15 -15
@@ -143,7 +143,7 @@ void tcp_cwnd_restart(struct sock *sk, s32 delta) {struct tcp_sock *tp =tcp_sk (sk);u32 restart_cwnd =tcp_init_cwnd (tp,__sk_dst_get (sk)); -u32 cwnd = tp->snd_cwnd; +u32 cwnd =tcp_snd_cwnd (tp);tcp_ca_event (sk,CA_EVENT_CWND_RESTART );
@@ -152,7 +152,7 @@ void tcp_cwnd_restart(struct sock *sk, s32 delta)while ((delta -=inet_csk (sk)->icsk_rto) >0 && cwnd > restart_cwnd) cwnd >>=1 ; - tp->snd_cwnd =max (cwnd, restart_cwnd); +tcp_snd_cwnd_set (tp,max (cwnd, restart_cwnd)); tp->snd_cwnd_stamp = tcp_jiffies32; tp->snd_cwnd_used =0 ; }
@@ -1015,7 +1015,7 @@ static void tcp_tsq_write(struct sock *sk)struct tcp_sock *tp =tcp_sk (sk);if (tp->lost_out > tp->retrans_out && - tp->snd_cwnd >tcp_packets_in_flight (tp)) { +tcp_snd_cwnd (tp) >tcp_packets_in_flight (tp)) {tcp_mstamp_refresh (tp);tcp_xmit_retransmit_queue (sk); }
@@ -1866,9 +1866,9 @@ static void tcp_cwnd_application_limited(struct sock *sk)/* Limited by application or receiver window. */ u32 init_win =tcp_init_cwnd (tp,__sk_dst_get (sk));u32 win_used =max (tp->snd_cwnd_used, init_win); -if (win_used < tp->snd_cwnd) { +if (win_used <tcp_snd_cwnd (tp)) { tp->snd_ssthresh =tcp_current_ssthresh (sk); - tp->snd_cwnd = (tp->snd_cwnd + win_used) >>1 ; +tcp_snd_cwnd_set (tp, (tcp_snd_cwnd (tp) + win_used) >>1 ); } tp->snd_cwnd_used =0 ; }
@@ -2040,7 +2040,7 @@ static inline unsigned int tcp_cwnd_test(const struct tcp_sock *tp,return 1 ; in_flight =tcp_packets_in_flight (tp); - cwnd = tp->snd_cwnd; + cwnd =tcp_snd_cwnd (tp);if (in_flight >= cwnd)return 0 ;
@@ -2197,12 +2197,12 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, in_flight =tcp_packets_in_flight (tp);BUG_ON (tcp_skb_pcount (skb) <=1 ); -BUG_ON (tp->snd_cwnd <= in_flight); +BUG_ON (tcp_snd_cwnd (tp) <= in_flight); send_win =tcp_wnd_end (tp) -TCP_SKB_CB (skb)->seq;/* From in_flight test above, we know that cwnd > in_flight. */ - cong_win = (tp->snd_cwnd - in_flight) * tp->mss_cache; + cong_win = (tcp_snd_cwnd (tp) - in_flight) * tp->mss_cache; limit =min (send_win, cong_win);
@@ -2216,7 +2216,7 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, win_divisor =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_tso_win_divisor);if (win_divisor) { -u32 chunk =min (tp->snd_wnd, tp->snd_cwnd * tp->mss_cache); +u32 chunk =min (tp->snd_wnd,tcp_snd_cwnd (tp) * tp->mss_cache);/* If at least some fraction of a window is available, * just use it.
@@ -2344,7 +2344,7 @@ static int tcp_mtu_probe(struct sock *sk)if (likely (!icsk->icsk_mtup.enabled || icsk->icsk_mtup.probe_size ||inet_csk (sk)->icsk_ca_state != TCP_CA_Open || - tp->snd_cwnd <11 || +tcp_snd_cwnd (tp) <11 || tp->rx_opt.num_sacks || tp->rx_opt.dsack))return -1 ;
@@ -2380,7 +2380,7 @@ static int tcp_mtu_probe(struct sock *sk)return 0 ;/* Do we need to wait to drain cwnd? With none in flight, don't stall */ -if (tcp_packets_in_flight (tp) +2 > tp->snd_cwnd) { +if (tcp_packets_in_flight (tp) +2 >tcp_snd_cwnd (tp)) {if (!tcp_packets_in_flight (tp))return -1 ;else
@@ -2452,7 +2452,7 @@ static int tcp_mtu_probe(struct sock *sk)if (!tcp_transmit_skb (sk, nskb,1 ,GFP_ATOMIC )) {/* Decrement cwnd here because we are sending * effectively two packets. */ - tp->snd_cwnd--; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) -1 );tcp_event_new_data_sent (sk, nskb); icsk->icsk_mtup.probe_size =tcp_mss_to_mtu (sk, nskb->len);
@@ -2709,7 +2709,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,else tcp_chrono_stop (sk,TCP_CHRONO_RWND_LIMITED ); - is_cwnd_limited |= (tcp_packets_in_flight (tp) >= tp->snd_cwnd); + is_cwnd_limited |= (tcp_packets_in_flight (tp) >=tcp_snd_cwnd (tp));if (likely (sent_pkts || is_cwnd_limited))tcp_cwnd_validate (sk, is_cwnd_limited);
@@ -2819,7 +2819,7 @@ void tcp_send_loss_probe(struct sock *sk)if (unlikely (!skb)) {WARN_ONCE (tp->packets_out,"invalid inflight: %u state %u cwnd %u mss %d\n" , - tp->packets_out, sk->sk_state, tp->snd_cwnd, mss); + tp->packets_out, sk->sk_state,tcp_snd_cwnd (tp), mss);inet_csk (sk)->icsk_pending =0 ;return ; }
@@ -3308,7 +3308,7 @@ void tcp_xmit_retransmit_queue(struct sock *sk)if (!hole) tp->retransmit_skb_hint = skb; - segs = tp->snd_cwnd -tcp_packets_in_flight (tp); + segs =tcp_snd_cwnd (tp) -tcp_packets_in_flight (tp);if (segs <=0 )break ; sacked =TCP_SKB_CB (skb)->sacked;
net/ipv4/tcp_rate.c +1 -1
@@ -194,7 +194,7 @@ void tcp_rate_check_app_limited(struct sock *sk)/* Nothing in sending host's qdisc queues or NIC tx queue. */ sk_wmem_alloc_get (sk) <SKB_TRUESIZE (1 ) &&/* We are not limited by CWND. */ -tcp_packets_in_flight (tp) < tp->snd_cwnd && +tcp_packets_in_flight (tp) <tcp_snd_cwnd (tp) &&/* All lost packets have been retransmitted. */ tp->lost_out <= tp->retrans_out) tp->app_limited =
net/ipv4/tcp_scalable.c +2 -2
@@ -27,7 +27,7 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked)if (!acked)return ; } -tcp_cong_avoid_ai (tp,min (tp->snd_cwnd,TCP_SCALABLE_AI_CNT ), +tcp_cong_avoid_ai (tp,min (tcp_snd_cwnd (tp),TCP_SCALABLE_AI_CNT ), acked); }
@@ -35,7 +35,7 @@ static u32 tcp_scalable_ssthresh(struct sock *sk) {const struct tcp_sock *tp =tcp_sk (sk); -return max (tp->snd_cwnd - (tp->snd_cwnd>>TCP_SCALABLE_MD_SCALE ),2U ); +return max (tcp_snd_cwnd (tp) - (tcp_snd_cwnd (tp)>>TCP_SCALABLE_MD_SCALE ),2U ); }static struct tcp_congestion_ops tcp_scalable__read_mostly = {
net/ipv4/tcp_vegas.c +11 -10
@@ -159,7 +159,7 @@ EXPORT_SYMBOL_GPL(tcp_vegas_cwnd_event);static inline u32 tcp_vegas_ssthresh (struct tcp_sock *tp) { -return min (tp->snd_ssthresh, tp->snd_cwnd); +return min (tp->snd_ssthresh,tcp_snd_cwnd (tp)); }static void tcp_vegas_cong_avoid (struct sock *sk,u32 ack,u32 acked)
@@ -217,14 +217,14 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked)* This is: * (actual rate in segments) * baseRTT */ - target_cwnd = (u64 )tp->snd_cwnd * vegas->baseRTT; + target_cwnd = (u64 )tcp_snd_cwnd (tp) * vegas->baseRTT;do_div (target_cwnd, rtt);/* Calculate the difference between the window we had, * and the window we would like to have. This quantity * is the "Diff" from the Arizona Vegas papers. */ - diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; + diff =tcp_snd_cwnd (tp) * (rtt-vegas->baseRTT) / vegas->baseRTT;if (diff > gamma &&tcp_in_slow_start (tp)) {/* Going too fast. Time to slow down
@@ -238,7 +238,8 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked)* truncation robs us of full link * utilization. */ - tp->snd_cwnd =min (tp->snd_cwnd, (u32 )target_cwnd+1 ); +tcp_snd_cwnd_set (tp,min (tcp_snd_cwnd (tp), + (u32 )target_cwnd +1 )); tp->snd_ssthresh =tcp_vegas_ssthresh (tp); }else if (tcp_in_slow_start (tp)) {
@@ -254,14 +255,14 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked)/* The old window was too fast, so * we slow down. */ - tp->snd_cwnd--; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) -1 ); tp->snd_ssthresh =tcp_vegas_ssthresh (tp); }else if (diff < alpha) {/* We don't have enough extra packets * in the network, so speed up. */ - tp->snd_cwnd++; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); }else {/* Sending just as fast as we * should be.
@@ -269,10 +270,10 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 acked) } } -if (tp->snd_cwnd <2 ) - tp->snd_cwnd =2 ; -else if (tp->snd_cwnd > tp->snd_cwnd_clamp) - tp->snd_cwnd = tp->snd_cwnd_clamp; +if (tcp_snd_cwnd (tp) <2 ) +tcp_snd_cwnd_set (tp,2 ); +else if (tcp_snd_cwnd (tp) > tp->snd_cwnd_clamp) +tcp_snd_cwnd_set (tp, tp->snd_cwnd_clamp); tp->snd_ssthresh =tcp_current_ssthresh (sk); }
net/ipv4/tcp_veno.c +12 -12
@@ -146,11 +146,11 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked) rtt = veno->minrtt; - target_cwnd = (u64 )tp->snd_cwnd * veno->basertt; + target_cwnd = (u64 )tcp_snd_cwnd (tp) * veno->basertt; target_cwnd <<=V_PARAM_SHIFT ;do_div (target_cwnd, rtt); - veno->diff = (tp->snd_cwnd <<V_PARAM_SHIFT ) - target_cwnd; + veno->diff = (tcp_snd_cwnd (tp) <<V_PARAM_SHIFT ) - target_cwnd;if (tcp_in_slow_start (tp)) {/* Slow start. */
@@ -164,15 +164,15 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked)/* In the "non-congestive state", increase cwnd * every rtt. */ -tcp_cong_avoid_ai (tp, tp->snd_cwnd, acked); +tcp_cong_avoid_ai (tp,tcp_snd_cwnd (tp), acked); }else {/* In the "congestive state", increase cwnd * every other rtt. */ -if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { +if (tp->snd_cwnd_cnt >=tcp_snd_cwnd (tp)) {if (veno->inc && - tp->snd_cwnd < tp->snd_cwnd_clamp) { - tp->snd_cwnd++; +tcp_snd_cwnd (tp) < tp->snd_cwnd_clamp) { +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) +1 ); veno->inc =0 ; }else veno->inc =1 ;
@@ -181,10 +181,10 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked) tp->snd_cwnd_cnt += acked; } done: -if (tp->snd_cwnd <2 ) - tp->snd_cwnd =2 ; -else if (tp->snd_cwnd > tp->snd_cwnd_clamp) - tp->snd_cwnd = tp->snd_cwnd_clamp; +if (tcp_snd_cwnd (tp) <2 ) +tcp_snd_cwnd_set (tp,2 ); +else if (tcp_snd_cwnd (tp) > tp->snd_cwnd_clamp) +tcp_snd_cwnd_set (tp, tp->snd_cwnd_clamp); }/* Wipe the slate clean for the next rtt. */ /* veno->cntrtt = 0; */
@@ -199,10 +199,10 @@ static u32 tcp_veno_ssthresh(struct sock *sk)if (veno->diff < beta)/* in "non-congestive state", cut cwnd by 1/5 */ -return max (tp->snd_cwnd *4 /5 ,2U ); +return max (tcp_snd_cwnd (tp) *4 /5 ,2U );else /* in "congestive state", cut cwnd by 1/2 */ -return max (tp->snd_cwnd >>1U ,2U ); +return max (tcp_snd_cwnd (tp) >>1U ,2U ); }static struct tcp_congestion_ops tcp_veno__read_mostly = {
net/ipv4/tcp_westwood.c +2 -1
@@ -244,7 +244,8 @@ static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event)switch (event) {case CA_EVENT_COMPLETE_CWR : - tp->snd_cwnd = tp->snd_ssthresh =tcp_westwood_bw_rttmin (sk); + tp->snd_ssthresh =tcp_westwood_bw_rttmin (sk); +tcp_snd_cwnd_set (tp, tp->snd_ssthresh);break ;case CA_EVENT_LOSS : tp->snd_ssthresh =tcp_westwood_bw_rttmin (sk);
net/ipv4/tcp_yeah.c +15 -15
@@ -71,11 +71,11 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked)if (!yeah->doing_reno_now) {/* Scalable */ -tcp_cong_avoid_ai (tp,min (tp->snd_cwnd,TCP_SCALABLE_AI_CNT ), +tcp_cong_avoid_ai (tp,min (tcp_snd_cwnd (tp),TCP_SCALABLE_AI_CNT ), acked); }else {/* Reno */ -tcp_cong_avoid_ai (tp, tp->snd_cwnd, acked); +tcp_cong_avoid_ai (tp,tcp_snd_cwnd (tp), acked); }/* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt.
@@ -130,7 +130,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked)/* Compute excess number of packets above bandwidth * Avoid doing full 64 bit divide. */ - bw = tp->snd_cwnd; + bw =tcp_snd_cwnd (tp); bw *= rtt - yeah->vegas.baseRTT;do_div (bw, rtt); queue = bw;
@@ -138,20 +138,20 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked)if (queue >TCP_YEAH_ALPHA || rtt - yeah->vegas.baseRTT > (yeah->vegas.baseRTT /TCP_YEAH_PHY )) {if (queue >TCP_YEAH_ALPHA && - tp->snd_cwnd > yeah->reno_count) { +tcp_snd_cwnd (tp) > yeah->reno_count) {u32 reduction =min (queue /TCP_YEAH_GAMMA , - tp->snd_cwnd >>TCP_YEAH_EPSILON ); +tcp_snd_cwnd (tp) >>TCP_YEAH_EPSILON ); - tp->snd_cwnd -= reduction; +tcp_snd_cwnd_set (tp,tcp_snd_cwnd (tp) - reduction); - tp->snd_cwnd =max (tp->snd_cwnd, - yeah->reno_count); +tcp_snd_cwnd_set (tp,max (tcp_snd_cwnd (tp), + yeah->reno_count)); - tp->snd_ssthresh = tp->snd_cwnd; + tp->snd_ssthresh =tcp_snd_cwnd (tp); }if (yeah->reno_count <=2 ) - yeah->reno_count =max (tp->snd_cwnd>>1 ,2U ); + yeah->reno_count =max (tcp_snd_cwnd (tp)>>1 ,2U );else yeah->reno_count++;
@@ -176,7 +176,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked)*/ yeah->vegas.beg_snd_una = yeah->vegas.beg_snd_nxt; yeah->vegas.beg_snd_nxt = tp->snd_nxt; - yeah->vegas.beg_snd_cwnd = tp->snd_cwnd; + yeah->vegas.beg_snd_cwnd =tcp_snd_cwnd (tp);/* Wipe the slate clean for the next RTT. */ yeah->vegas.cntRTT =0 ;
@@ -193,16 +193,16 @@ static u32 tcp_yeah_ssthresh(struct sock *sk)if (yeah->doing_reno_now <TCP_YEAH_RHO ) { reduction = yeah->lastQ; - reduction =min (reduction,max (tp->snd_cwnd>>1 ,2U )); + reduction =min (reduction,max (tcp_snd_cwnd (tp)>>1 ,2U )); - reduction =max (reduction, tp->snd_cwnd >>TCP_YEAH_DELTA ); + reduction =max (reduction,tcp_snd_cwnd (tp) >>TCP_YEAH_DELTA ); }else - reduction =max (tp->snd_cwnd>>1 ,2U ); + reduction =max (tcp_snd_cwnd (tp)>>1 ,2U ); yeah->fast_count =0 ; yeah->reno_count =max (yeah->reno_count>>1 ,2U ); -return max_t (int, tp->snd_cwnd - reduction,2 ); +return max_t (int,tcp_snd_cwnd (tp) - reduction,2 ); }static struct tcp_congestion_ops tcp_yeah__read_mostly = {
net/ipv6/tcp_ipv6.c +1 -1
@@ -2075,7 +2075,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)jiffies_to_clock_t (icsk->icsk_rto),jiffies_to_clock_t (icsk->icsk_ack.ato), (icsk->icsk_ack.quick <<1 ) |inet_csk_in_pingpong_mode (sp), - tp->snd_cwnd, +tcp_snd_cwnd (tp), state ==TCP_LISTEN ? fastopenq->max_qlen : (tcp_in_initial_slowstart (tp) ?-1 : tp->snd_ssthresh)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 87/247 nfp: only report pause frame configuration for physical device
In reply to Greg Kroah-HartmanFrom: Yu Xiao <[email protected]>
[ Upstream commit 0649e4d63420ebc8cbebef3e9d39e12ffc5eb9fa ]
Only report pause frame configuration for physical device. Logical port of both PCI PF and PCI VF do not support it.
--- drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +2 -2
@@ -286,8 +286,6 @@ nfp_net_get_link_ksettings(struct net_device *netdev,/* Init to unknowns */ ethtool_link_ksettings_add_link_mode (cmd, supported,FIBRE ); -ethtool_link_ksettings_add_link_mode (cmd, supported, Pause); -ethtool_link_ksettings_add_link_mode (cmd, advertising, Pause); cmd->base.port =PORT_OTHER ; cmd->base.speed =SPEED_UNKNOWN ; cmd->base.duplex =DUPLEX_UNKNOWN ;
@@ -295,6 +293,8 @@ nfp_net_get_link_ksettings(struct net_device *netdev, port =nfp_port_from_netdev (netdev); eth_port =nfp_port_get_eth_port (port);if (eth_port) { +ethtool_link_ksettings_add_link_mode (cmd, supported, Pause); +ethtool_link_ksettings_add_link_mode (cmd, advertising, Pause); cmd->base.autoneg = eth_port->aneg !=NFP_ANEG_DISABLED ?AUTONEG_ENABLE :AUTONEG_DISABLE ;nfp_net_set_fec_link_mode (eth_port, cmd);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 88/247 sfc: fix considering that all channels have TX queues
In reply to Greg Kroah-HartmanFrom: Martin Habets <[email protected]>
[ Upstream commit 2e102b53f8a778f872dc137f4c7ac548705817aa ]
Normally, all channels have RX and TX queues, but this is not true if modparam efx_separate_tx_channels=1 is used. In that cases, some channels only have RX queues and others only TX queues (or more preciselly, they have them allocated, but not initialized).
Fix efx_channel_has_tx_queues to return the correct value for this case too.
Messages shown at probe time before the fix:
sfc 0000:03:00.0 ens6f0np0: MC command 0x82 inlen 544 failed rc=-22 (raw=0) arg=0
------------[ cut here ]------------ netdevice: ens6f0np0: failed to initialise TXQ -1 WARNING: CPU: 1 PID: 626 at drivers/net/ethernet/sfc/ef10.c:2393 efx_ef10_tx_init+0x201/0x300 [sfc] [...] stripped RIP: 0010:efx_ef10_tx_init+0x201/0x300 [sfc] [...] stripped Call Trace: efx_init_tx_queue+0xaa/0xf0 [sfc] efx_start_channels+0x49/0x120 [sfc] efx_start_all+0x1f8/0x430 [sfc] efx_net_open+0x5a/0xe0 [sfc] __dev_open+0xd0/0x190 __dev_change_flags+0x1b3/0x220 dev_change_flags+0x21/0x60 [...] stripped
Messages shown at remove time before the fix:
sfc 0000:03:00.0 ens6f0np0: failed to flush 10 queues sfc 0000:03:00.0 ens6f0np0: failed to flush queues
--- drivers/net/ethernet/sfc/net_driver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/sfc/net_driver.h +1 -1
@@ -1533,7 +1533,7 @@ static inline bool efx_channel_is_xdp_tx(struct efx_channel *channel)static inline bool efx_channel_has_tx_queues (struct efx_channel *channel) { -return true; +return channel && channel->channel >= channel->efx->tx_channel_offset; }static inline unsigned int efx_channel_num_tx_queues (struct efx_channel *channel)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 89/247 sfc: fix wrong tx channel offset with efx_separate_tx_channels
In reply to Greg Kroah-HartmanFrom: Íñigo Huguet <[email protected]>
[ Upstream commit c308dfd1b43ef0d4c3e57b741bb3462eb7a7f4a2 ]
tx_channel_offset is calculated in efx_allocate_msix_channels, but it is also calculated again in efx_set_channels because it was originally done there, and when efx_allocate_msix_channels was introduced it was forgotten to be removed from efx_set_channels.
Moreover, the old calculation is wrong when using efx_separate_tx_channels because now we can have XDP channels after the TX channels, so n_channels - n_tx_channels doesn't point to the first TX channel.
Remove the old calculation from efx_set_channels, and add the initialization of this variable if MSI or legacy interrupts are used, next to the initialization of the rest of the related variables, where it was missing.
--- drivers/net/ethernet/sfc/efx_channels.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/net/ethernet/sfc/efx_channels.c +2 -4
@@ -308,6 +308,7 @@ int efx_probe_interrupts(struct efx_nic *efx) efx->n_channels =1 ; efx->n_rx_channels =1 ; efx->n_tx_channels =1 ; + efx->tx_channel_offset =0 ; efx->n_xdp_channels =0 ; efx->xdp_channel_offset = efx->n_channels; rc =pci_enable_msi (efx->pci_dev);
@@ -328,6 +329,7 @@ int efx_probe_interrupts(struct efx_nic *efx) efx->n_channels =1 + (efx_separate_tx_channels ?1 :0 ); efx->n_rx_channels =1 ; efx->n_tx_channels =1 ; + efx->tx_channel_offset =1 ; efx->n_xdp_channels =0 ; efx->xdp_channel_offset = efx->n_channels; efx->legacy_irq = efx->pci_dev->irq;
@@ -956,10 +958,6 @@ int efx_set_channels(struct efx_nic *efx)struct efx_channel *channel;int rc; - efx->tx_channel_offset = - efx_separate_tx_channels ? - efx->n_channels - efx->n_tx_channels :0 ; -if (efx->xdp_tx_queue_count) {EFX_WARN_ON_PARANOID (efx->xdp_tx_queues);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 90/247 block: make bioset_exit() fully resilient against being called twice
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
[ Upstream commit 605f7415ecfb426610195dd6c7577b30592b3369 ]
Most of bioset_exit() is fine being called twice, as it clears the various allocations etc when they are freed. The exception is bio_alloc_cache_destroy(), which does not clear ->cache when it has freed it.
This isn't necessarily a bug, but can be if buggy users does call the exit path more then once, or with just a memset() bioset which has never been initialized. dm appears to be one such user.
--- block/bio.c | 1 + 1 file changed, 1 insertion(+)
block/bio.c +1 -0
@@ -665,6 +665,7 @@ static void bio_alloc_cache_destroy(struct bio_set *bs)bio_alloc_cache_prune (cache,-1U ); }free_percpu (bs->cache); + bs->cache =NULL ; }/**
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 91/247 vdpa: Fix error logic in vdpa_nl_cmd_dev_get_doit
In reply to Greg Kroah-HartmanFrom: Eli Cohen <[email protected]>
[ Upstream commit 7a6691f1f89784f775fa0c54be57533445726068 ]
In vdpa_nl_cmd_dev_get_doit(), if the call to genlmsg_reply() fails we must not call nlmsg_free() since this is done inside genlmsg_reply().
Fix it.
Message-Id: <[email protected]>
--- drivers/vdpa/vdpa.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/vdpa/vdpa.c +9 -4
@@ -558,14 +558,19 @@ static int vdpa_nl_cmd_dev_get_doit(struct sk_buff *skb, struct genl_info *info) goto mdev_err; } err =vdpa_dev_fill (vdev, msg, info->snd_portid, info->snd_seq,0 , info->extack); -if (!err) - err =genlmsg_reply (msg, info); +if (err) + goto mdev_err; + + err =genlmsg_reply (msg, info); +put_device (dev); +mutex_unlock (&vdpa_dev_mutex); +return err; + mdev_err:put_device (dev); err:mutex_unlock (&vdpa_dev_mutex); -if (err) -nlmsg_free (msg); +nlmsg_free (msg);return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 92/247 virtio: pci: Fix an error handling path in vp_modern_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 7a836a2aba09479c8e71fa43249eecc4af945f61 ]
If an error occurs after a successful pci_request_selected_regions() call, it should be undone by a corresponding pci_release_selected_regions() call, as already done in vp_modern_remove().
Message-Id: <237109725aad2c3c03d14549f777b1927c84b045.1648977064.git.christophe.jaillet@wanadoo.fr>
--- drivers/virtio/virtio_pci_modern_dev.c | 1 + 1 file changed, 1 insertion(+)
drivers/virtio/virtio_pci_modern_dev.c +1 -0
@@ -340,6 +340,7 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev) err_map_isr:pci_iounmap (pci_dev, mdev->common); err_map_common: +pci_release_selected_regions (pci_dev, mdev->modern_bars);return err; }EXPORT_SYMBOL_GPL (vp_modern_probe);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 93/247 net/mlx5: Dont use already freed action pointer
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit 80b2bd737d0e833e6a2b77e482e5a714a79c86a4 ]
The call to mlx5dr_action_destroy() releases "action" memory. That pointer is set to miss_action later and generates the following smatch error:
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c:53 set_miss_action()
warn: 'action' was already freed.
Make sure that the pointer is always valid by setting NULL after destroy.
--- drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/steering/fs_dr.c +4 -5
@@ -43,11 +43,10 @@ static int set_miss_action(struct mlx5_flow_root_namespace *ns, err =mlx5dr_table_set_miss_action (ft->fs_dr_table.dr_table, action);if (err && action) { err =mlx5dr_action_destroy (action); -if (err) { - action =NULL ; -mlx5_core_err (ns->dev,"Failed to destroy action (%d)\n" , - err); - } +if (err) +mlx5_core_err (ns->dev, +"Failed to destroy action (%d)\n" , err); + action =NULL ; } ft->fs_dr_table.miss_action = action;if (old_miss_action) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 94/247 net/mlx5e: TC NIC mode, fix tc chains miss table
In reply to Greg Kroah-HartmanFrom: Maor Dickman <[email protected]>
[ Upstream commit 66cb64e292d21588bdb831f08a7ec0ff04d6380d ]
The cited commit changed promisc table to be created on demand with the highest priority in the NIC table replacing the vlan table, this caused tc NIC tables miss flow to skip the prmoisc table because it use vlan table as miss table.
OVS offload in NIC mode use promisc by default so any unicast packet which will be handled by tc NIC tables miss flow will skip the promisc rule and will be dropped.
Fix this by adding new empty table in new tc level with low priority and point the nic tc chain miss to it, the new table is managed so it will point to vlan table if promisc is disabled and to promisc table if enabled.
--- .../net/ethernet/mellanox/mlx5/core/en/fs.h | 2 + .../net/ethernet/mellanox/mlx5/core/en_tc.c | 38 ++++++++++++++++++- .../net/ethernet/mellanox/mlx5/core/fs_core.c | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/fs.h +2 -0
@@ -12,6 +12,7 @@ struct mlx5e_post_act;enum {MLX5E_TC_FT_LEVEL =0 ,MLX5E_TC_TTC_FT_LEVEL , +MLX5E_TC_MISS_LEVEL , };struct mlx5e_tc_table {
@@ -20,6 +21,7 @@ struct mlx5e_tc_table {*/ struct mutex t_lock;struct mlx5_flow_table *t; +struct mlx5_flow_table *miss_t;struct mlx5_fs_chains *chains;struct mlx5e_post_act *post_act;
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +36 -2
@@ -4993,6 +4993,33 @@ static int mlx5e_tc_nic_get_ft_size(struct mlx5_core_dev *dev)return tc_tbl_size; } +static int mlx5e_tc_nic_create_miss_table (struct mlx5e_priv *priv) +{ +struct mlx5_flow_table **ft = &priv->fs.tc.miss_t; +struct mlx5_flow_table_attr ft_attr = {}; +struct mlx5_flow_namespace *ns; +int err =0 ; + + ft_attr.max_fte =1 ; + ft_attr.autogroup.max_num_groups =1 ; + ft_attr.level =MLX5E_TC_MISS_LEVEL ; + ft_attr.prio =0 ; + ns =mlx5_get_flow_namespace (priv->mdev,MLX5_FLOW_NAMESPACE_KERNEL ); + + *ft =mlx5_create_auto_grouped_flow_table (ns, &ft_attr); +if (IS_ERR (*ft)) { + err =PTR_ERR (*ft); +netdev_err (priv->netdev,"failed to create tc nic miss table err=%d\n" , err); + } + +return err; +} + +static void mlx5e_tc_nic_destroy_miss_table (struct mlx5e_priv *priv) +{ +mlx5_destroy_flow_table (priv->fs.tc.miss_t); +} +int mlx5e_tc_nic_init (struct mlx5e_priv *priv) {struct mlx5e_tc_table *tc = &priv->fs.tc;
@@ -5025,19 +5052,23 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv) } tc->mapping = chains_mapping; + err =mlx5e_tc_nic_create_miss_table (priv); +if (err) + goto err_chains; +if (MLX5_CAP_FLOWTABLE_NIC_RX (priv->mdev, ignore_flow_level)) attr.flags =MLX5_CHAINS_AND_PRIOS_SUPPORTED |MLX5_CHAINS_IGNORE_FLOW_LEVEL_SUPPORTED ; attr.ns =MLX5_FLOW_NAMESPACE_KERNEL ; attr.max_ft_sz =mlx5e_tc_nic_get_ft_size (dev); attr.max_grp_num =MLX5E_TC_TABLE_NUM_GROUPS ; - attr.default_ft =mlx5e_vlan_get_flowtable (priv->fs.vlan); + attr.default_ft = priv->fs.tc.miss_t; attr.mapping = chains_mapping; tc->chains =mlx5_chains_create (dev, &attr);if (IS_ERR (tc->chains)) { err =PTR_ERR (tc->chains); - goto err_chains; + goto err_miss; } tc->post_act =mlx5e_tc_post_act_init (priv, tc->chains,MLX5_FLOW_NAMESPACE_KERNEL );
@@ -5060,6 +5091,8 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)mlx5_tc_ct_clean (tc->ct);mlx5e_tc_post_act_destroy (tc->post_act);mlx5_chains_destroy (tc->chains); +err_miss: +mlx5e_tc_nic_destroy_miss_table (priv); err_chains:mapping_destroy (chains_mapping); err_mapping:
@@ -5100,6 +5133,7 @@ void mlx5e_tc_nic_cleanup(struct mlx5e_priv *priv)mlx5e_tc_post_act_destroy (tc->post_act);mapping_destroy (tc->mapping);mlx5_chains_destroy (tc->chains); +mlx5e_tc_nic_destroy_miss_table (priv); }int mlx5e_tc_esw_init (struct rhashtable *tc_ht)
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +1 -1
@@ -113,7 +113,7 @@#define KERNEL_MIN_LEVEL (KERNEL_NIC_PRIO_NUM_LEVELS + 1)#define KERNEL_NIC_TC_NUM_PRIOS 1 -#define KERNEL_NIC_TC_NUM_LEVELS 2 +#define KERNEL_NIC_TC_NUM_LEVELS 3#define ANCHOR_NUM_LEVELS 1#define ANCHOR_NUM_PRIOS 1
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 95/247 net/mlx5: CT: Fix header-rewrite re-use for tupels
In reply to Greg Kroah-HartmanFrom: Paul Blakey <[email protected]>
[ Upstream commit 1f2856cde64baa78475e6d3c601fb7b7f693a161 ]
Tuple entries that don't have nat configured for them which are added to the ct nat table will always create a new modify header, as we don't check for possible re-use on them. The same for tuples that have nat configured for them but are added to ct table.
Fix the above by only avoiding wasteful re-use lookup for actually natted entries in ct nat table.
--- .../ethernet/mellanox/mlx5/core/en/tc_ct.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +11 -8
@@ -650,7 +650,7 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,struct mlx5_flow_attr *attr, struct flow_rule *flow_rule, struct mlx5e_mod_hdr_handle **mh, - u8 zone_restore_id, bool nat) + u8 zone_restore_id, bool nat_table, bool has_nat) { struct mlx5e_tc_mod_hdr_acts mod_acts = {};struct flow_action_entry *meta;
@@ -665,11 +665,12 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv, &attr->ct_attr.ct_labels_id);if (err)return -EOPNOTSUPP ; -if (nat) { - err =mlx5_tc_ct_entry_create_nat (ct_priv, flow_rule, - &mod_acts); -if (err) - goto err_mapping; +if (nat_table) { +if (has_nat) { + err =mlx5_tc_ct_entry_create_nat (ct_priv, flow_rule, &mod_acts); +if (err) + goto err_mapping; + } ct_state |=MLX5_CT_STATE_NAT_BIT ; }
@@ -684,7 +685,7 @@ mlx5_tc_ct_entry_create_mod_hdr(struct mlx5_tc_ct_priv *ct_priv,if (err) goto err_mapping; -if (nat) { +if (nat_table && has_nat) { attr->modify_hdr =mlx5_modify_header_alloc (ct_priv->dev, ct_priv->ns_type, mod_acts.num_actions, mod_acts.actions);
@@ -752,7 +753,9 @@ mlx5_tc_ct_entry_add_rule(struct mlx5_tc_ct_priv *ct_priv, err =mlx5_tc_ct_entry_create_mod_hdr (ct_priv, attr, flow_rule, &zone_rule->mh, - zone_restore_id, nat); + zone_restore_id, + nat, +mlx5_tc_ct_entry_has_nat (entry));if (err) {ct_dbg ("Failed to create ct entry mod hdr" ); goto err_mod_hdr;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 96/247 net/mlx5: correct ECE offset in query qp output
In reply to Greg Kroah-HartmanFrom: Changcheng Liu <[email protected]>
[ Upstream commit 3fc2a9e89b3508a5cc0c324f26d7b4740ba8c456 ]
ECE field should be after opt_param_mask in query qp output.
--- include/linux/mlx5/mlx5_ifc.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
include/linux/mlx5/mlx5_ifc.h +2 -3
@@ -5028,12 +5028,11 @@ struct mlx5_ifc_query_qp_out_bits {u8 syndrome[0x20 ]; -u8 reserved_at_40[0x20 ]; -u8 ece[0x20 ]; +u8 reserved_at_40[0x40 ];u8 opt_param_mask[0x20 ]; -u8 reserved_at_a0[0x20 ]; +u8 ece[0x20 ];struct mlx5_ifc_qpc_bits qpc;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 97/247 net/mlx5e: Update netdev features after changing XDP state
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit f6279f113ad593971999c877eb69dc3d36a75894 ]
Some features (LRO, HW GRO) conflict with XDP. If there is an attempt to enable such features while XDP is active, they will be set to off [requested on]. In order to activate these features after XDP is turned off, the driver needs to call netdev_update_features(). This commit adds this missing call after XDP state changes.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +5 -0
@@ -4181,6 +4181,11 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) unlock:mutex_unlock (&priv->state_lock); + +/* Need to fix some features. */ +if (!err) +netdev_update_features (netdev); +return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 98/247 net: sched: add barrier to fix packet stuck problem for lockless qdisc
In reply to Greg Kroah-HartmanFrom: Guoju Fang <[email protected]>
[ Upstream commit 2e8728c955ce0624b958eee6e030a37aca3a5d86 ]
In qdisc_run_end(), the spin_unlock() only has store-release semantic, which guarantees all earlier memory access are visible before it. But the subsequent test_bit() has no barrier semantics so may be reordered ahead of the spin_unlock(). The store-load reordering may cause a packet stuck problem.
The concurrent operations can be described as below,
CPU 0 | CPU 1
qdisc_run_end() | qdisc_run_begin()
. | .
----> /* may be reorderd here */ | .
| . | .
| spin_unlock() | set_bit()
| . | smp_mb__after_atomic()
---- test_bit() | spin_trylock()
. | .Consider the following sequence of events:
CPU 0 reorder test_bit() ahead and see MISSED = 0 CPU 1 calls set_bit()
CPU 1 calls spin_trylock() and return fail CPU 0 executes spin_unlock()
At the end of the sequence, CPU 0 calls spin_unlock() and does nothing because it see MISSED = 0. The skb on CPU 1 has beed enqueued but no one take it, until the next cpu pushing to the qdisc (if ever ...) will notice and dequeue it.
This patch fix this by adding one explicit barrier. As spin_unlock() and test_bit() ordering is a store-load ordering, a full memory barrier smp_mb() is needed here.
--- include/net/sch_generic.h | 6 ++++++ 1 file changed, 6 insertions(+)
include/net/sch_generic.h +6 -0
@@ -202,6 +202,12 @@ static inline void qdisc_run_end(struct Qdisc *qdisc)if (qdisc->flags &TCQ_F_NOLOCK ) {spin_unlock (&qdisc->seqlock); +/* spin_unlock() only has store-release semantic. The unlock +* and test_bit() ordering is a store-load ordering, so a full +* memory barrier is needed here. +*/ +smp_mb (); +if (unlikely (test_bit (__QDISC_STATE_MISSED, &qdisc->state)))__netif_schedule (qdisc);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 99/247 tcp: tcp_rtx_synack() can be called from process context
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 0a375c822497ed6ad6b5da0792a12a6f1af10c0b ]
Laurent reported the enclosed report [1]
This bug triggers with following coditions:
0) Kernel built with CONFIG_DEBUG_PREEMPT=y
1) A new passive FastOpen TCP socket is created.
This FO socket waits for an ACK coming from client to be a complete ESTABLISHED one.
2) A socket operation on this socket goes through lock_sock() release_sock() dance.
3) While the socket is owned by the user in step 2),
a retransmit of the SYN is received and stored in socket backlog.
4) At release_sock() time, the socket backlog is processed while in process context.
5) A SYNACK packet is cooked in response of the SYN retransmit.
6) -> tcp_rtx_synack() is called in process context.
Before blamed commit, tcp_rtx_synack() was always called from BH handler, from a timer handler.
Fix this by using TCP_INC_STATS() & NET_INC_STATS() which do not assume caller is in non preemptible context.
[1]
BUG: using __this_cpu_add() in preemptible [00000000] code: epollpep/2180 caller is tcp_rtx_synack.part.0+0x36/0xc0 CPU: 10 PID: 2180 Comm: epollpep Tainted: G OE 5.16.0-0.bpo.4-amd64 #1 Debian 5.16.12-1~bpo11+1 Hardware name: Supermicro SYS-5039MC-H8TRF/X11SCD-F, BIOS 1.7 11/23/2021 Call Trace: <TASK> dump_stack_lvl+0x48/0x5e check_preemption_disabled+0xde/0xe0 tcp_rtx_synack.part.0+0x36/0xc0 tcp_rtx_synack+0x8d/0xa0 ? kmem_cache_alloc+0x2e0/0x3e0 ? apparmor_file_alloc_security+0x3b/0x1f0 inet_rtx_syn_ack+0x16/0x30 tcp_check_req+0x367/0x610 tcp_rcv_state_process+0x91/0xf60 ? get_nohz_timer_target+0x18/0x1a0 ? lock_timer_base+0x61/0x80 ? preempt_count_add+0x68/0xa0 tcp_v4_do_rcv+0xbd/0x270 __release_sock+0x6d/0xb0 release_sock+0x2b/0x90 sock_setsockopt+0x138/0x1140 ? __sys_getsockname+0x7e/0xc0 ? aa_sk_perm+0x3e/0x1a0 __sys_setsockopt+0x198/0x1e0 __x64_sys_setsockopt+0x21/0x30 do_syscall_64+0x38/0xc0 entry_SYSCALL_64_after_hwframe+0x44/0xae
--- net/ipv4/tcp_output.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_output.c +2 -2
@@ -4116,8 +4116,8 @@ int tcp_rtx_synack(const struct sock *sk, struct request_sock *req) res = af_ops->send_synack (sk,NULL , &fl, req,NULL ,TCP_SYNACK_NORMAL ,NULL );if (!res) { -__TCP_INC_STATS (sock_net (sk),TCP_MIB_RETRANSSEGS ); -__NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPSYNRETRANS ); +TCP_INC_STATS (sock_net (sk),TCP_MIB_RETRANSSEGS ); +NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPSYNRETRANS );if (unlikely (tcp_passive_fastopen (sk)))tcp_sk (sk)->total_retrans++;trace_tcp_retransmit_synack (sk, req);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 100/247 vdpa: ifcvf: set pci driver data in probe
In reply to Greg Kroah-HartmanFrom: Jason Wang <[email protected]>
[ Upstream commit bd8bb9aed56b1814784a975e2dfea12a9adcee92 ]
We should set the pci driver data in probe instead of the vdpa device adding callback. Otherwise if no vDPA device is created we will lose the pointer to the management device.
Message-Id: <[email protected]>
--- drivers/vdpa/ifcvf/ifcvf_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/vdpa/ifcvf/ifcvf_main.c +2 -1
@@ -505,7 +505,6 @@ static int ifcvf_vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name) } ifcvf_mgmt_dev->adapter = adapter; -pci_set_drvdata (pdev, ifcvf_mgmt_dev); vf = &adapter->vf; vf->dev_type =get_dev_type (pdev);
@@ -620,6 +619,8 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) goto err; } +pci_set_drvdata (pdev, ifcvf_mgmt_dev); +return 0 ; err:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 101/247 octeontx2-af: fix error code in is_valid_offset()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit f3d671c711097a133bc36bd2bde52f1fcca783a6 ]
The is_valid_offset() function returns success/true if the call to validate_and_get_cpt_blkaddr() fails.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_cpt.c +1 -1
@@ -206,7 +206,7 @@ static bool is_valid_offset(struct rvu *rvu, struct cpt_rd_wr_reg_msg *req) blkaddr =validate_and_get_cpt_blkaddr (req->blkaddr);if (blkaddr <0 ) -return blkaddr; +return false;/* Registers that can be accessed from PF/VF */ if ((offset & 0xFF000) == CPT_AF_LFX_CTL(0) ||
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 102/247 s390/mcck: isolate SIE instruction when setting CIF_MCCK_GUEST flag
In reply to Greg Kroah-HartmanFrom: Alexander Gordeev <[email protected]>
[ Upstream commit 29ccaa4b35ea874ddd50518e5c2c746b9238a792 ]
Commit d768bd892fc8 ("s390: add options to change branch prediction behaviour for the kernel") introduced .Lsie_exit label - supposedly to fence off SIE instruction. However, the corresponding address range length .Lsie_crit_mcck_length was not updated, which led to BPON code potentionally marked with CIF_MCCK_GUEST flag.
Both .Lsie_exit and .Lsie_crit_mcck_length were removed with commit 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S"), but the issue persisted - currently BPOFF and BPENTER macros might get wrongly considered by the machine check handler as a guest.
--- arch/s390/kernel/entry.S | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/s390/kernel/entry.S +5 -1
@@ -248,6 +248,10 @@ ENTRY(sie64a) BPEXIT __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) .Lsie_entry: sie 0(%r14) +# Let the next instruction be NOP to avoid triggering a machine check +# and handling it in a guest as result of the instruction execution. + nopr 7 +.Lsie_leave: BPOFF BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) .Lsie_skip:
@@ -536,7 +540,7 @@ ENTRY(mcck_int_handler) jno .Lmcck_panic #if IS_ENABLED(CONFIG_KVM) OUTSIDE %r9,.Lsie_gmap,.Lsie_done,6f - OUTSIDE %r9,.Lsie_entry,.Lsie_skip,4f + OUTSIDE %r9,.Lsie_entry,.Lsie_leave,4f oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST j 5f 4: CHKSTG .Lmcck_panic
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 103/247 regulator: mt6315-regulator: fix invalid allowed mode
In reply to Greg Kroah-HartmanFrom: Fabien Parent <[email protected]>
[ Upstream commit 28cbc2d4c54c09a427b18a1604740efb6b2cc2d6 ]
In the binding example, the regulator mode 4 is shown as a valid mode, but the driver actually only support mode 0 to 2:
This generates an error in dmesg when copy/pasting the binding example:
[ 0.306080] vbuck1: invalid regulator-allowed-modes element 4 [ 0.307290] vbuck2: invalid regulator-allowed-modes element 4
This commit fixes this error by removing the invalid mode from the examples.
--- .../devicetree/bindings/regulator/mt6315-regulator.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/regulator/mt6315-regulator.yaml +2 -2
@@ -55,7 +55,7 @@ examples: regulator-min-microvolt = <300000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; - regulator-allowed-modes = <0 1 2 4>; + regulator-allowed-modes = <0 1 2>; }; vbuck3 {
@@ -63,7 +63,7 @@ examples: regulator-min-microvolt = <300000>; regulator-max-microvolt = <1193750>; regulator-enable-ramp-delay = <256>; - regulator-allowed-modes = <0 1 2 4>; + regulator-allowed-modes = <0 1 2>; }; }; };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 104/247 gpio: pca953x: use the correct register address to do regcache sync
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit 43624eda86c98b0de726d0b6f2516ccc3ef7313f ]
For regcache_sync_region, need to use pca953x_recalc_addr() to get the real register address.
--- drivers/gpio/gpio-pca953x.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/gpio/gpio-pca953x.c +11 -8
@@ -1108,20 +1108,21 @@ static int pca953x_regcache_sync(struct device *dev) {struct pca953x_chip *chip =dev_get_drvdata (dev);int ret; +u8 regaddr;/* * The ordering between direction and output is important, * sync these registers first and only then sync the rest. */ - ret =regcache_sync_region (chip->regmap, chip->regs->direction, - chip->regs->direction +NBANK (chip)); + regaddr =pca953x_recalc_addr (chip, chip->regs->direction,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip));if (ret) {dev_err (dev,"Failed to sync GPIO dir registers: %d\n" , ret);return ret; } - ret =regcache_sync_region (chip->regmap, chip->regs->output, - chip->regs->output +NBANK (chip)); + regaddr =pca953x_recalc_addr (chip, chip->regs->output,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip));if (ret) {dev_err (dev,"Failed to sync GPIO out registers: %d\n" , ret);return ret;
@@ -1129,16 +1130,18 @@ static int pca953x_regcache_sync(struct device *dev)#ifdef CONFIG_GPIO_PCA953X_IRQ if (chip->driver_data &PCA_PCAL ) { - ret =regcache_sync_region (chip->regmap,PCAL953X_IN_LATCH , -PCAL953X_IN_LATCH +NBANK (chip)); + regaddr =pca953x_recalc_addr (chip,PCAL953X_IN_LATCH ,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, + regaddr +NBANK (chip));if (ret) {dev_err (dev,"Failed to sync INT latch registers: %d\n" , ret);return ret; } - ret =regcache_sync_region (chip->regmap,PCAL953X_INT_MASK , -PCAL953X_INT_MASK +NBANK (chip)); + regaddr =pca953x_recalc_addr (chip,PCAL953X_INT_MASK ,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, + regaddr +NBANK (chip));if (ret) {dev_err (dev,"Failed to sync INT mask registers: %d\n" , ret);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 105/247 afs: Fix infinite loop found by xfstest generic/676
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 17eabd42560f4636648ad65ba5b20228071e2363 ]
In AFS, a directory is handled as a file that the client downloads and parses locally for the purposes of performing lookup and getdents operations. The in-kernel afs filesystem has a number of functions that do this.
A directory file is arranged as a series of 2K blocks divided into 32-byte slots, where a directory entry occupies one or more slots, plus each block starts with one or more metadata blocks.
When parsing a block, if the last slots are occupied by a dirent that occupies more than a single slot and the file position points at a slot that's not the initial one, the logic in afs_dir_iterate_block() that skips over it won't advance the file pointer to the end of it. This will cause an infinite loop in getdents() as it will keep retrying that block and failing to advance beyond the final entry.
Fix this by advancing the file pointer if the next entry will be beyond it when we skip a block.
This was found by the generic/676 xfstest but can also be triggered with something like:
~/xfstests-dev/src/t_readdir_3 /xfstest.test/z 4000 1
--- fs/afs/dir.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/afs/dir.c +4 -1
@@ -486,8 +486,11 @@ static int afs_dir_iterate_block(struct afs_vnode *dvnode, }/* skip if starts before the current position */ -if (offset < curr) +if (offset < curr) { +if (next > curr) + ctx->pos = blkoff + next *sizeof (union afs_xdr_dirent );continue ; + }/* found the next entry */ if (!dir_emit(ctx, dire->u.name, nlen,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 106/247 scsi: sd: Fix potential NULL pointer dereference
In reply to Greg Kroah-HartmanFrom: Damien Le Moal <[email protected]>
[ Upstream commit 05fbde3a77a4f1d62e4c4428f384288c1f1a0be5 ]
If sd_probe() sees an early error before sdkp->device is initialized, sd_zbc_release_disk() is called. This causes a NULL pointer dereference when sd_is_zoned() is called inside that function. Avoid this by removing the call to sd_zbc_release_disk() in sd_probe() error path.
This change is safe and does not result in zone information memory leakage because the zone information for a zoned disk is allocated only when sd_revalidate_disk() is called, at which point sdkp->disk_dev is fully set, resulting in sd_disk_release() being called when needed to cleanup a disk zone information using sd_zbc_release_disk().
--- drivers/scsi/sd.c | 1 - 1 file changed, 1 deletion(-)
drivers/scsi/sd.c +0 -1
@@ -3480,7 +3480,6 @@ static int sd_probe(struct device *dev) out_put:put_disk (gd); out_free: -sd_zbc_release_disk (sdkp);kfree (sdkp); out:scsi_autopm_put_device (sdp);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 107/247 tipc: check attribute length for bearer name
In reply to Greg Kroah-HartmanFrom: Hoang Le <[email protected]>
[ Upstream commit 7f36f798f89bf32c0164049cb0e3fd1af613d0bb ]
syzbot reported uninit-value:
=====================================================
BUG: KMSAN: uninit-value in string_nocheck lib/vsprintf.c:644 [inline] BUG: KMSAN: uninit-value in string+0x4f9/0x6f0 lib/vsprintf.c:725 string_nocheck lib/vsprintf.c:644 [inline] string+0x4f9/0x6f0 lib/vsprintf.c:725 vsnprintf+0x2222/0x3650 lib/vsprintf.c:2806 vprintk_store+0x537/0x2150 kernel/printk/printk.c:2158 vprintk_emit+0x28b/0xab0 kernel/printk/printk.c:2256 vprintk_default+0x86/0xa0 kernel/printk/printk.c:2283 vprintk+0x15f/0x180 kernel/printk/printk_safe.c:50 _printk+0x18d/0x1cf kernel/printk/printk.c:2293 tipc_enable_bearer net/tipc/bearer.c:371 [inline] __tipc_nl_bearer_enable+0x2022/0x22a0 net/tipc/bearer.c:1033 tipc_nl_bearer_enable+0x6c/0xb0 net/tipc/bearer.c:1042 genl_family_rcv_msg_doit net/netlink/genetlink.c:731 [inline]
- Do sanity check the attribute length for TIPC_NLA_BEARER_NAME.
- Do not use 'illegal name' in printing message.
--- net/tipc/bearer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
net/tipc/bearer.c +1 -2
@@ -259,9 +259,8 @@ static int tipc_enable_bearer(struct net *net, const char *name,u32 i;if (!bearer_name_validate (name, &b_names)) { - errstr ="illegal name" ;NL_SET_ERR_MSG (extack,"Illegal name" ); - goto rejected; +return res; }if (prio >TIPC_MAX_LINK_PRI && prio !=TIPC_MEDIA_LINK_PRI ) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 108/247 driver core: Fix wait_for_device_probe() & deferred_probe_timeout interaction
In reply to Greg Kroah-HartmanFrom: Saravana Kannan <[email protected]>
[ Upstream commit 5ee76c256e928455212ab759c51d198fedbe7523 ]
Mounting NFS rootfs was timing out when deferred_probe_timeout was non-zero [1]. This was because ip_auto_config() initcall times out waiting for the network interfaces to show up when deferred_probe_timeout was non-zero. While ip_auto_config() calls wait_for_device_probe() to make sure any currently running deferred probe work or asynchronous probe finishes, that wasn't sufficient to account for devices being deferred until deferred_probe_timeout.
Commit 35a672363ab3 ("driver core: Ensure wait_for_device_probe() waits until the deferred_probe_timeout fires") tried to fix that by making sure wait_for_device_probe() waits for deferred_probe_timeout to expire before returning.
However, if wait_for_device_probe() is called from the kernel_init() context:
- Before deferred_probe_initcall() [2], it causes the boot process to hang due to a deadlock.
- After deferred_probe_initcall() [3], it blocks kernel_init() from continuing till deferred_probe_timeout expires and beats the point of deferred_probe_timeout that's trying to wait for userspace to load modules.
Neither of this is good. So revert the changes towait_for_device_probe().
[1] - https://lore.kernel.org/lkml/TYAPR01MB45443DF63B9EF29054F7C41FD8C60@TYAPR01MB4544.jpnprd01.prod.outlook.com/
[2] - https://lore.kernel.org/lkml/[email protected]/
[3] - https://lore.kernel.org/lkml/[email protected]/
--- drivers/base/dd.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/base/dd.c +0 -5
@@ -257,7 +257,6 @@ DEFINE_SHOW_ATTRIBUTE(deferred_devs);int driver_deferred_probe_timeout;EXPORT_SYMBOL_GPL (driver_deferred_probe_timeout); -static DECLARE_WAIT_QUEUE_HEAD (probe_timeout_waitqueue);static int __init deferred_probe_timeout_setup (char *str) {
@@ -312,7 +311,6 @@ static void deferred_probe_timeout_work_func(struct work_struct *work)list_for_each_entry (p, &deferred_probe_pending_list, deferred_probe)dev_info (p->device,"deferred probe pending\n" );mutex_unlock (&deferred_probe_mutex); -wake_up_all (&probe_timeout_waitqueue); } static DECLARE_DELAYED_WORK(deferred_probe_timeout_work, deferred_probe_timeout_work_func);
@@ -719,9 +717,6 @@ int driver_probe_done(void)*/ void wait_for_device_probe (void ) { -/* wait for probe timeout */ -wait_event (probe_timeout_waitqueue, !driver_deferred_probe_timeout); -/* wait for the deferred probe workqueue to finish */ flush_work (&deferred_probe_work);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 109/247 perf c2c: Fix sorting in percent_rmt_hitm_cmp()
In reply to Greg Kroah-HartmanFrom: Leo Yan <[email protected]>
[ Upstream commit b24192a17337abbf3f44aaa75e15df14a2d0016e ]
The function percent_rmt_hitm_cmp() wrongly uses local HITMs for sorting remote HITMs.
Since this function is to sort cache lines for remote HITMs, this patch changes to use 'rmt_hitm' field for correct sorting.
--- tools/perf/builtin-c2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/builtin-c2c.c +2 -2
@@ -924,8 +924,8 @@ percent_rmt_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,double per_left;double per_right; - per_left =PERCENT (left, lcl_hitm); - per_right =PERCENT (right, lcl_hitm); + per_left =PERCENT (left, rmt_hitm); + per_right =PERCENT (right, rmt_hitm);return per_left - per_right; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 110/247 dmaengine: idxd: set DMA_INTERRUPT cap bit
In reply to Greg Kroah-HartmanFrom: Dave Jiang <[email protected]>
[ Upstream commit 4e5a4eb20393b851590b4465f1197a8041c2076b ]
Even though idxd driver has always supported interrupt, it never actually set the DMA_INTERRUPT cap bit. Rectify this mistake so the interrupt capability is advertised.
--- drivers/dma/idxd/dma.c | 1 + 1 file changed, 1 insertion(+)
drivers/dma/idxd/dma.c +1 -0
@@ -181,6 +181,7 @@ int idxd_register_dma_device(struct idxd_device *idxd)INIT_LIST_HEAD (&dma->channels); dma->dev = dev; +dma_cap_set (DMA_INTERRUPT , dma->cap_mask);dma_cap_set (DMA_PRIVATE , dma->cap_mask);dma_cap_set (DMA_COMPLETION_NO_ORDER , dma->cap_mask); dma->device_release = idxd_dma_release;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 111/247 mips: cpc: Fix refcount leak in mips_cpc_default_phys_base
In reply to Greg Kroah-HartmanFrom: Gong Yuanjun <[email protected]>
[ Upstream commit 4107fa700f314592850e2c64608f6ede4c077476 ]
Add the missing of_node_put() to release the refcount incremented by of_find_compatible_node().
--- arch/mips/kernel/mips-cpc.c | 1 + 1 file changed, 1 insertion(+)
arch/mips/kernel/mips-cpc.c +1 -0
@@ -27,6 +27,7 @@ phys_addr_t __weak mips_cpc_default_phys_base(void) cpc_node =of_find_compatible_node (of_root,NULL ,"mti,mips-cpc" );if (cpc_node) { err =of_address_to_resource (cpc_node,0 , &res); +of_node_put (cpc_node);if (!err)return res.start; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 112/247 bootconfig: Make the bootconfig.o as a normal object file
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 6014a23638cdee63a71ef13c51d7c563eb5829ee ]
Since the APIs defined in the bootconfig.o are not individually used, it is meaningless to build it as library by lib-y. Use obj-y for that.
--- lib/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/Makefile +1 -1
@@ -275,7 +275,7 @@ $(foreach file, $(libfdt_files), \ $(eval CFLAGS_$(file) = -I $(srctree)/scripts/dtc/libfdt)) lib-$(CONFIG_LIBFDT) += $(libfdt_files) -lib-$(CONFIG_BOOT_CONFIG) += bootconfig.o +obj-$(CONFIG_BOOT_CONFIG) += bootconfig.o obj-$(CONFIG_RBTREE_TEST) += rbtree_test.o obj-$(CONFIG_INTERVAL_TREE_TEST) += interval_tree_test.o
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 113/247 tracing: Make tp_printk work on syscall tracepoints
In reply to Greg Kroah-HartmanFrom: Jeff Xie <[email protected]>
[ Upstream commit cb1c45fb68b8a4285ccf750842b1136f26cfe267 ]
Currently the tp_printk option has no effect on syscall tracepoint. When adding the kernel option parameter tp_printk, then:
echo 1 > /sys/kernel/debug/tracing/events/syscalls/enable
When running any application, no trace information is printed on the terminal.
Now added printk for syscall tracepoints.
--- kernel/trace/trace_syscalls.c | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-)
kernel/trace/trace_syscalls.c +11 -24
@@ -154,7 +154,7 @@ print_syscall_enter(struct trace_iterator *iter, int flags, goto end;/* parameter types */ -if (tr->trace_flags &TRACE_ITER_VERBOSE ) +if (tr && tr->trace_flags &TRACE_ITER_VERBOSE )trace_seq_printf (s,"%s " , entry->types[i]);/* parameter values */
@@ -296,9 +296,7 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id)struct trace_event_file *trace_file;struct syscall_trace_enter *entry;struct syscall_metadata *sys_data; -struct ring_buffer_event *event; -struct trace_buffer *buffer; -unsigned int trace_ctx; +struct trace_event_buffer fbuffer;unsigned long args[6 ];int syscall_nr;int size;
@@ -321,20 +319,16 @@ static void ftrace_syscall_enter(void *data, struct pt_regs *regs, long id) size =sizeof (*entry) +sizeof (unsigned long ) * sys_data->nb_args; - trace_ctx =tracing_gen_ctx (); - - event =trace_event_buffer_lock_reserve (&buffer, trace_file, - sys_data->enter_event->event.type, size, trace_ctx); -if (!event) + entry =trace_event_buffer_reserve (&fbuffer, trace_file, size); +if (!entry)return ; - entry =ring_buffer_event_data (event); + entry =ring_buffer_event_data (fbuffer.event); entry->nr = syscall_nr;syscall_get_arguments (current, regs, args);memcpy (entry->args, args,sizeof (unsigned long ) * sys_data->nb_args); -event_trigger_unlock_commit (trace_file, buffer, event, entry, - trace_ctx); +trace_event_buffer_commit (&fbuffer); }static void ftrace_syscall_exit (void *data,struct pt_regs *regs,long ret)
@@ -343,9 +337,7 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)struct trace_event_file *trace_file;struct syscall_trace_exit *entry;struct syscall_metadata *sys_data; -struct ring_buffer_event *event; -struct trace_buffer *buffer; -unsigned int trace_ctx; +struct trace_event_buffer fbuffer;int syscall_nr; syscall_nr =trace_get_syscall_nr (current, regs);
@@ -364,20 +356,15 @@ static void ftrace_syscall_exit(void *data, struct pt_regs *regs, long ret)if (!sys_data)return ; - trace_ctx =tracing_gen_ctx (); - - event =trace_event_buffer_lock_reserve (&buffer, trace_file, - sys_data->exit_event->event.type,sizeof (*entry), - trace_ctx); -if (!event) + entry =trace_event_buffer_reserve (&fbuffer, trace_file,sizeof (*entry)); +if (!entry)return ; - entry =ring_buffer_event_data (event); + entry =ring_buffer_event_data (fbuffer.event); entry->nr = syscall_nr; entry->ret =syscall_get_return_value (current, regs); -event_trigger_unlock_commit (trace_file, buffer, event, entry, - trace_ctx); +trace_event_buffer_commit (&fbuffer); } static int reg_event_syscall_enter(struct trace_event_file *file,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 114/247 tracing: Fix sleeping function called from invalid context on RT kernel
In reply to Greg Kroah-HartmanFrom: Jun Miao <[email protected]>
[ Upstream commit 12025abdc8539ed9d5014e2d647a3fd1bd3de5cd ]
When setting bootparams="trace_event=initcall:initcall_start tp_printk=1" in the cmdline, the output_printk() was called, and the spin_lock_irqsave() was called in the atomic and irq disable interrupt context suitation. On the PREEMPT_RT kernel, these locks are replaced with sleepable rt-spinlock, so the stack calltrace will be triggered.
Fix it by raw_spin_lock_irqsave when PREEMPT_RT and "trace_event=initcall:initcall_start tp_printk=1" enabled.
BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:46 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper/0 preempt_count: 2, expected: 0 RCU nest depth: 0, expected: 0 Preemption disabled at: [<ffffffff8992303e>] try_to_wake_up+0x7e/0xba0 CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.17.1-rt17+ #19 34c5812404187a875f32bee7977f7367f9679ea7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x60/0x8c dump_stack+0x10/0x12 __might_resched.cold+0x11d/0x155 rt_spin_lock+0x40/0x70 trace_event_buffer_commit+0x2fa/0x4c0 ? map_vsyscall+0x93/0x93 trace_event_raw_event_initcall_start+0xbe/0x110 ? perf_trace_initcall_finish+0x210/0x210 ? probe_sched_wakeup+0x34/0x40 ? ttwu_do_wakeup+0xda/0x310 ? trace_hardirqs_on+0x35/0x170 ? map_vsyscall+0x93/0x93 do_one_initcall+0x217/0x3c0 ? trace_event_raw_event_initcall_level+0x170/0x170 ? push_cpu_stop+0x400/0x400 ? cblist_init_generic+0x241/0x290 kernel_init_freeable+0x1ac/0x347 ? _raw_spin_unlock_irq+0x65/0x80 ? rest_init+0xf0/0xf0 kernel_init+0x1e/0x150 ret_from_fork+0x22/0x30 </TASK>
--- kernel/trace/trace.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/trace/trace.c +3 -3
@@ -2840,7 +2840,7 @@ trace_event_buffer_lock_reserve(struct trace_buffer **current_rb, }EXPORT_SYMBOL_GPL (trace_event_buffer_lock_reserve); -static DEFINE_SPINLOCK (tracepoint_iter_lock); +static DEFINE_RAW_SPINLOCK (tracepoint_iter_lock);static DEFINE_MUTEX (tracepoint_printk_mutex);static void output_printk (struct trace_event_buffer *fbuffer)
@@ -2868,14 +2868,14 @@ static void output_printk(struct trace_event_buffer *fbuffer) event = &fbuffer->trace_file->event_call->event; -spin_lock_irqsave (&tracepoint_iter_lock, flags); +raw_spin_lock_irqsave (&tracepoint_iter_lock, flags);trace_seq_init (&iter->seq); iter->ent = fbuffer->entry; event_call->event.funcs->trace (iter,0 , event);trace_seq_putc (&iter->seq,0 );printk ("%s" , iter->seq.buffer); -spin_unlock_irqrestore (&tracepoint_iter_lock, flags); +raw_spin_unlock_irqrestore (&tracepoint_iter_lock, flags); } int tracepoint_printk_sysctl(struct ctl_table *table, int write,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 115/247 tracing: Avoid adding tracer option before update_tracer_options
In reply to Greg Kroah-HartmanFrom: Mark-PK Tsai <[email protected]>
[ Upstream commit ef9188bcc6ca1d8a2ad83e826b548e6820721061 ]
To prepare for support asynchronous tracer_init_tracefs initcall, avoid calling create_trace_option_files before __update_tracer_options. Otherwise, create_trace_option_files will show warning because some tracers in trace_types list are already in tr->topts.
For example, hwlat_tracer call register_tracer in late_initcall, and global_trace.dir is already created in tracing_init_dentry, hwlat_tracer will be put into tr->topts.
Then if the __update_tracer_options is executed after hwlat_tracer registered, create_trace_option_files find that hwlat_tracer is already in tr->topts.
--- kernel/trace/trace.c | 7 +++++++ 1 file changed, 7 insertions(+)
kernel/trace/trace.c +7 -0
@@ -6320,12 +6320,18 @@ static void tracing_set_nop(struct trace_array *tr) tr->current_trace = &nop_trace; } +static bool tracer_options_updated; +static void add_tracer_options (struct trace_array *tr,struct tracer *t) {/* Only enable if the directory has been created already. */ if (!tr->dir)return ; +/* Only create trace option files after update_tracer_options finish */ +if (!tracer_options_updated) +return ; +create_trace_option_files (tr, t); }
@@ -9146,6 +9152,7 @@ static void __update_tracer_options(struct trace_array *tr)static void update_tracer_options (struct trace_array *tr) {mutex_lock (&trace_types_lock); + tracer_options_updated = true;__update_tracer_options (tr);mutex_unlock (&trace_types_lock); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 116/247 iommu/arm-smmu: fix possible null-ptr-deref in arm_smmu_device_probe()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit d9ed8af1dee37f181096631fb03729ece98ba816 ]
It will cause null-ptr-deref when using 'res', if platform_get_resource() returns NULL, so move using 'res' after devm_ioremap_resource() that will check it to avoid null-ptr-deref.
And use devm_platform_get_and_ioremap_resource() to simplify code.
--- drivers/iommu/arm/arm-smmu/arm-smmu.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/iommu/arm/arm-smmu/arm-smmu.c +2 -3
@@ -2090,11 +2090,10 @@ static int arm_smmu_device_probe(struct platform_device *pdev)if (err)return err; - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - ioaddr = res->start; - smmu->base =devm_ioremap_resource (dev, res); + smmu->base =devm_platform_get_and_ioremap_resource (pdev,0 , &res);if (IS_ERR (smmu->base))return PTR_ERR (smmu->base); + ioaddr = res->start;/* * The resource size should effectively match the value of SMMU_TOP; * stash that temporarily until we know PAGESIZE to validate it with.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 117/247 iommu/arm-smmu-v3: check return value after calling platform_get_resource()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit b131fa8c1d2afd05d0b7598621114674289c2fbb ]
It will cause null-ptr-deref if platform_get_resource() returns NULL, we need check the return value.
--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +2 -0
@@ -3786,6 +3786,8 @@ static int arm_smmu_device_probe(struct platform_device *pdev)/* Base address */ res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); +if (!res) +return -EINVAL ;if (resource_size (res) <arm_smmu_resource_size (smmu)) {dev_err (dev,"MMIO region too small (%pr)\n" , res);return -EINVAL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 118/247 f2fs: remove WARN_ON in f2fs_is_valid_blkaddr
In reply to Greg Kroah-HartmanFrom: Dongliang Mu <[email protected]>
[ Upstream commit dc2f78e2d4cc844a1458653d57ce1b54d4a29f21 ]
Syzbot triggers two WARNs in f2fs_is_valid_blkaddr and __is_bitmap_valid. For example, in f2fs_is_valid_blkaddr, if type is DATA_GENERIC_ENHANCE or DATA_GENERIC_ENHANCE_READ, it invokes WARN_ON if blkaddr is not in the right range. The call trace is as follows:
f2fs_get_node_info+0x45f/0x1070 read_node_page+0x577/0x1190 __get_node_page.part.0+0x9e/0x10e0 __get_node_page f2fs_get_node_page+0x109/0x180 do_read_inode f2fs_iget+0x2a5/0x58b0 f2fs_fill_super+0x3b39/0x7ca0
Fix these two WARNs by replacing WARN_ON with dump_stack.
--- fs/f2fs/checkpoint.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/f2fs/checkpoint.c +2 -2
@@ -151,7 +151,7 @@ static bool __is_bitmap_valid(struct f2fs_sb_info *sbi, block_t blkaddr,f2fs_err (sbi,"Inconsistent error blkaddr:%u, sit bitmap:%d" , blkaddr, exist);set_sbi_flag (sbi,SBI_NEED_FSCK ); -WARN_ON (1 ); +dump_stack (); }return exist; }
@@ -189,7 +189,7 @@ bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,f2fs_warn (sbi,"access invalid blkaddr:%u" , blkaddr);set_sbi_flag (sbi,SBI_NEED_FSCK ); -WARN_ON (1 ); +dump_stack ();return false; }else {return __is_bitmap_valid (sbi, blkaddr, type);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 119/247 i2c: cadence: Increase timeout per message if necessary
In reply to Greg Kroah-HartmanFrom: Lucas Tanure <[email protected]>
[ Upstream commit 96789dce043f5bff8b7d62aa28d52a7c59403a84 ]
Timeout as 1 second sets an upper limit on the length of the transfer executed, but there is no maximum length of a write or read message set in i2c_adapter_quirks for this controller.
This upper limit affects devices that require sending large firmware blobs over I2C.
To remove that limitation, calculate the minimal time necessary, plus some wiggle room, for every message and use it instead of the default one second, if more than one second.
--- drivers/i2c/busses/i2c-cadence.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-cadence.c +10 -2
@@ -760,7 +760,7 @@ static void cdns_i2c_master_reset(struct i2c_adapter *adap)static int cdns_i2c_process_msg (struct cdns_i2c *id,struct i2c_msg *msg,struct i2c_adapter *adap) { -unsigned long time_left; +unsigned long time_left, msg_timeout;u32 reg; id->p_msg = msg;
@@ -785,8 +785,16 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,else cdns_i2c_msend (id); +/* Minimal time to execute this message */ + msg_timeout =msecs_to_jiffies ((1000 * msg->len *BITS_PER_BYTE ) / id->i2c_clk); +/* Plus some wiggle room */ + msg_timeout +=msecs_to_jiffies (500 ); + +if (msg_timeout < adap->timeout) + msg_timeout = adap->timeout; +/* Wait for the signal of completion */ - time_left =wait_for_completion_timeout (&id->xfer_done, adap->timeout); + time_left =wait_for_completion_timeout (&id->xfer_done, msg_timeout);if (time_left ==0 ) {cdns_i2c_master_reset (adap); dev_err(id->adap.dev.parent,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 120/247 m68knommu: set ZERO_PAGE() to the allocated zeroed page
In reply to Greg Kroah-HartmanFrom: Greg Ungerer <[email protected]>
[ Upstream commit dc068f46217970d9516f16cd37972a01d50dc055 ]
The non-MMU m68k pagetable ZERO_PAGE() macro is being set to the somewhat non-sensical value of "virt_to_page(0)". The zeroth page is not in any way guaranteed to be a page full of "0". So the result is that ZERO_PAGE() will almost certainly contain random values.
We already allocate a real "empty_zero_page" in the mm setup code shared between MMU m68k and non-MMU m68k. It is just not hooked up to the ZERO_PAGE() macro for the non-MMU m68k case.
Fix ZERO_PAGE() to use the allocated "empty_zero_page" pointer.
I am not aware of any specific issues caused by the old code.
--- arch/m68k/include/asm/pgtable_no.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/m68k/include/asm/pgtable_no.h +2 -1
@@ -42,7 +42,8 @@ extern void paging_init(void);* ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ -#define ZERO_PAGE (vaddr) (virt_to_page(0)) +extern void *empty_zero_page; +#define ZERO_PAGE (vaddr) (virt_to_page(empty_zero_page))/* * All 32bit addresses are effectively valid for vmalloc...
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 121/247 m68knommu: fix undefined reference to `_init_sp
In reply to Greg Kroah-HartmanFrom: Greg Ungerer <[email protected]>
[ Upstream commit a71b9e66fee47c59b3ec34e652b5c23bc6550794 ]
When configuring a nommu classic m68k system enabling the uboot parameter passing support (CONFIG_UBOOT) will produce the following compile error:
m68k-linux-ld: arch/m68k/kernel/uboot.o: in function `process_uboot_commandline':
uboot.c:(.init.text+0x32): undefined reference to `_init_sp'
The logic to support this option is only used on ColdFire based platforms (in its head.S startup code). So make the selection of this option depend on building for a ColdFire based platform.
--- arch/m68k/Kconfig.machine | 1 + 1 file changed, 1 insertion(+)
arch/m68k/Kconfig.machine +1 -0
@@ -335,6 +335,7 @@ comment "Machine Options" config UBOOT bool "Support for U-Boot command line parameters" + depends on COLDFIRE help If you say Y here kernel will try to collect command line parameters from the initial u-boot stack.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 122/247 dmaengine: zynqmp_dma: In struct zynqmp_dma_chan fix desc_size data type
In reply to Greg Kroah-HartmanFrom: Radhey Shyam Pandey <[email protected]>
[ Upstream commit f9a9f43a62a04ec3183fb0da9226c7706eed0115 ]
In zynqmp_dma_alloc/free_chan_resources functions there is a potential overflow in the below expressions.
dma_alloc_coherent(chan->dev, (2 * chan->desc_size *
ZYNQMP_DMA_NUM_DESCS), &chan->desc_pool_p, GFP_KERNEL);
dma_free_coherent(chan->dev,(2 * ZYNQMP_DMA_DESC_SIZE(chan) *
ZYNQMP_DMA_NUM_DESCS),
chan->desc_pool_v, chan->desc_pool_p);The arguments desc_size and ZYNQMP_DMA_NUM_DESCS were 32 bit. Though this overflow condition is not observed but it is a potential problem in the case of 32-bit multiplication. Hence fix it by changing the desc_size data type to size_t.
In addition to coverity fix it also reuse ZYNQMP_DMA_DESC_SIZE macro in dma_alloc_coherent API argument.
Addresses-Coverity: Event overflow_before_widen.
--- drivers/dma/xilinx/zynqmp_dma.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/dma/xilinx/zynqmp_dma.c +3 -2
@@ -232,7 +232,7 @@ struct zynqmp_dma_chan {bool is_dmacoherent;struct tasklet_struct tasklet;bool idle; -u32 desc_size; +size_t desc_size;bool err;u32 bus_width;u32 src_burst_len;
@@ -489,7 +489,8 @@ static int zynqmp_dma_alloc_chan_resources(struct dma_chan *dchan) } chan->desc_pool_v =dma_alloc_coherent (chan->dev, - (2 * chan->desc_size *ZYNQMP_DMA_NUM_DESCS ), + (2 *ZYNQMP_DMA_DESC_SIZE (chan) * +ZYNQMP_DMA_NUM_DESCS ), &chan->desc_pool_p,GFP_KERNEL );if (!chan->desc_pool_v)return -ENOMEM ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 123/247 NFSv4: Dont hold the layoutget locks across multiple RPC calls
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
[ Upstream commit 6949493884fe88500de4af182588e071cf1544ee ]
When doing layoutget as part of the open() compound, we have to be careful to release the layout locks before we can call any further RPC calls, such as setattr(). The reason is that those calls could trigger a recall, which could deadlock.
--- fs/nfs/nfs4proc.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/nfs/nfs4proc.c +4 -0
@@ -3108,6 +3108,10 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, } out: +if (opendata->lgp) { +nfs4_lgopen_release (opendata->lgp); + opendata->lgp =NULL ; + }if (!opendata->cancelled)nfs4_sequence_free_slot (&opendata->o_res.seq_res);return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 124/247 video: fbdev: hyperv_fb: Allow resolutions with size > 64 MB for Gen1
In reply to Greg Kroah-HartmanFrom: Saurabh Sengar <[email protected]>
[ Upstream commit c4b4d7047f16a8d138ce76da65faefb7165736f2 ]
This patch fixes a bug where GEN1 VMs doesn't allow resolutions greater than 64 MB size (eg 7680x4320). Unnecessary PCI check limits Gen1 VRAM to legacy PCI BAR size only (ie 64MB). Thus any, resolution requesting greater then 64MB (eg 7680x4320) would fail. MMIO region assigning this memory shouldn't be limited by PCI bar size.
--- drivers/video/fbdev/hyperv_fb.c | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-)
drivers/video/fbdev/hyperv_fb.c +1 -18
@@ -1009,7 +1009,6 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)struct pci_dev *pdev =NULL ;void __iomem *fb_virt;int gen2vm =efi_enabled (EFI_BOOT ); -resource_size_t pot_start, pot_end;phys_addr_t paddr;int ret;
@@ -1060,23 +1059,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info) dio_fb_size = screen_width * screen_height * screen_depth /8 ; -if (gen2vm) { - pot_start =0 ; - pot_end =-1 ; - }else { -if (!(pci_resource_flags (pdev,0 ) &IORESOURCE_MEM ) || -pci_resource_len (pdev,0 ) < screen_fb_size) { -pr_err ("Resource not available or (0x%lx < 0x%lx)\n" , - (unsigned long )pci_resource_len (pdev,0 ), - (unsigned long ) screen_fb_size); - goto err1; - } - - pot_end =pci_resource_end (pdev,0 ); - pot_start = pot_end - screen_fb_size +1 ; - } - - ret =vmbus_allocate_mmio (&par->mem, hdev, pot_start, pot_end, + ret =vmbus_allocate_mmio (&par->mem, hdev,0 ,-1 , screen_fb_size,0x100000 , true);if (ret !=0 ) {pr_err ("Unable to allocate framebuffer memory\n" );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 125/247 video: fbdev: pxa3xx-gcu: release the resources correctly in pxa3xx_gcu_probe/remove()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit d87ad457f7e1b8d2492ca5b1531eb35030a1cc8f ]
In pxa3xx_gcu_probe(), the sequence of error lable is wrong, it will leads some resource leaked, so adjust the sequence to handle the error correctly, and if pxa3xx_gcu_add_buffer() fails, pxa3xx_gcu_free_buffers() need be called.
In pxa3xx_gcu_remove(), add missing clk_disable_unpreprare().
--- drivers/video/fbdev/pxa3xx-gcu.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/video/fbdev/pxa3xx-gcu.c +7 -5
@@ -650,6 +650,7 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev)for (i =0 ; i <8 ; i++) { ret =pxa3xx_gcu_add_buffer (dev, priv);if (ret) { +pxa3xx_gcu_free_buffers (dev, priv);dev_err (dev,"failed to allocate DMA memory\n" ); goto err_disable_clk; }
@@ -666,15 +667,15 @@ static int pxa3xx_gcu_probe(struct platform_device *pdev) SHARED_SIZE, irq);return 0 ; -err_free_dma: -dma_free_coherent (dev,SHARED_SIZE , - priv->shared, priv->shared_phys); +err_disable_clk: +clk_disable_unprepare (priv->clk); err_misc_deregister:misc_deregister (&priv->misc_dev); -err_disable_clk: -clk_disable_unprepare (priv->clk); +err_free_dma: +dma_free_coherent (dev,SHARED_SIZE , + priv->shared, priv->shared_phys);return ret; }
@@ -687,6 +688,7 @@ static int pxa3xx_gcu_remove(struct platform_device *pdev)pxa3xx_gcu_wait_idle (priv);misc_deregister (&priv->misc_dev);dma_free_coherent (dev,SHARED_SIZE , priv->shared, priv->shared_phys); +clk_disable_unprepare (priv->clk);pxa3xx_gcu_free_buffers (dev, priv);return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 126/247 RISC-V: use memcpy for kexec_file mode
In reply to Greg Kroah-HartmanFrom: Liao Chang <[email protected]>
[ Upstream commit b7fb4d78a6ade6026d9e5cf438c2a46ab962e032 ]
The pointer to buffer loading kernel binaries is in kernel space for kexec_fil mode, When copy_from_user copies data from pointer to a block of memory, it checkes that the pointer is in the user space range, on RISCV-V that is:
static inline bool __access_ok(unsigned long addr, unsigned long size)
{
return size <= TASK_SIZE && addr <= TASK_SIZE - size;
}and TASK_SIZE is 0x4000000000 for 64-bits, which now causes copy_from_user to reject the access of the field 'buf' of struct kexec_segment that is in range [CONFIG_PAGE_OFFSET - VMALLOC_SIZE, CONFIG_PAGE_OFFSET), is invalid user space pointer.
This patch fixes this issue by skipping access_ok(), use mempcy() instead.
--- arch/riscv/kernel/machine_kexec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/riscv/kernel/machine_kexec.c +3 -1
@@ -65,7 +65,9 @@ machine_kexec_prepare(struct kimage *image)if (image->segment[i].memsz <=sizeof (fdt))continue ; -if (copy_from_user (&fdt, image->segment[i].buf,sizeof (fdt))) +if (image->file_mode) +memcpy (&fdt, image->segment[i].buf,sizeof (fdt)); +else if (copy_from_user (&fdt, image->segment[i].buf,sizeof (fdt)))continue ;if (fdt_check_header (&fdt))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 127/247 m68knommu: fix undefined reference to `mach_get_rtc_pll
In reply to Greg Kroah-HartmanFrom: Greg Ungerer <[email protected]>
[ Upstream commit 1300eec9e51f23c34c4487d2b06f58ca22e1ad3d ]
Configuring for a nommu classic m68k target and enabling the generic rtc driver (CONFIG_RTC_DRV_GENERIC) will result in the following compile error:
m68k-linux-ld: arch/m68k/kernel/time.o: in function `rtc_ioctl':
time.c:(.text+0x82): undefined reference to `mach_get_rtc_pll'
m68k-linux-ld: time.c:(.text+0xbc): undefined reference to `mach_set_rtc_pll'
m68k-linux-ld: time.c:(.text+0xf4): undefined reference to `mach_set_rtc_pll'
There are no definitions of "mach_set_rtc_pll" and "mach_get_rtc_pll" in the nommu code paths. Move these definitions and the associated "mach_hwclk", so that they are around their use case in time.c. This means they will always be defined on the builds that require them, and not on those that cannot use them - such as ColdFire (both with and without MMU enabled).
--- arch/m68k/kernel/setup_mm.c | 7 ------- arch/m68k/kernel/setup_no.c | 1 - arch/m68k/kernel/time.c | 9 +++++++++ 3 files changed, 9 insertions(+), 8 deletions(-)
arch/m68k/kernel/setup_mm.c +0 -7
@@ -87,15 +87,8 @@ void (*mach_sched_init) (void) __initdata = NULL;void (*mach_init_IRQ) (void )__initdata =NULL ;void (*mach_get_model) (char *model);void (*mach_get_hardware_list) (struct seq_file *m); -/* machine dependent timer functions */ -int (*mach_hwclk) (int ,struct rtc_time *); -EXPORT_SYMBOL (mach_hwclk);unsigned int (*mach_get_ss)(void ); -int (*mach_get_rtc_pll)(struct rtc_pll_info *); -int (*mach_set_rtc_pll)(struct rtc_pll_info *);EXPORT_SYMBOL (mach_get_ss); -EXPORT_SYMBOL (mach_get_rtc_pll); -EXPORT_SYMBOL (mach_set_rtc_pll);void (*mach_reset)(void );void (*mach_halt)(void );void (*mach_power_off)(void );
arch/m68k/kernel/setup_no.c +0 -1
@@ -50,7 +50,6 @@ char __initdata command_line[COMMAND_LINE_SIZE];/* machine dependent timer functions */ void (*mach_sched_init)(void )__initdata =NULL ; -int (*mach_hwclk) (int ,struct rtc_time *);/* machine dependent reboot functions */ void (*mach_reset)(void );
arch/m68k/kernel/time.c +9 -0
@@ -63,6 +63,15 @@ void timer_heartbeat(void)#endif /* CONFIG_HEARTBEAT */ #ifdef CONFIG_M68KCLASSIC +/* machine dependent timer functions */ +int (*mach_hwclk) (int, struct rtc_time*); +EXPORT_SYMBOL(mach_hwclk); + +int (*mach_get_rtc_pll)(struct rtc_pll_info *); +int (*mach_set_rtc_pll)(struct rtc_pll_info *); +EXPORT_SYMBOL(mach_get_rtc_pll); +EXPORT_SYMBOL(mach_set_rtc_pll); + #if !IS_BUILTIN(CONFIG_RTC_DRV_GENERIC) void read_persistent_clock64(struct timespec64 *ts) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 128/247 f2fs: fix to tag gcing flag on page during file defragment
In reply to Greg Kroah-HartmanFrom: Chao Yu <[email protected]>
[ Upstream commit 2d1fe8a86bf5e0663866fd0da83c2af1e1b0e362 ]
In order to garantee migrated data be persisted during checkpoint, otherwise out-of-order persistency between data and node may cause data corruption after SPOR.
--- fs/f2fs/file.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/file.c +1 -0
@@ -2673,6 +2673,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi, }set_page_dirty (page); +set_page_private_gcing (page);f2fs_put_page (page,1 ); idx++;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 129/247 xprtrdma: treat all calls not a bcall when bc_serv is NULL
In reply to Greg Kroah-HartmanFrom: Kinglong Mee <[email protected]>
[ Upstream commit 11270e7ca268e8d61b5d9e5c3a54bd1550642c9c ]
When a rdma server returns a fault format reply, nfs v3 client may treats it as a bcall when bc service is not exist.
The debug message at rpcrdma_bc_receive_call are,
[56579.837169] RPC: rpcrdma_bc_receive_call: callback XID 00000001, length=20 [56579.837174] RPC: rpcrdma_bc_receive_call: 00 00 00 01 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 04
After that, rpcrdma_bc_receive_call will meets NULL pointer as,
[ 226.057890] BUG: unable to handle kernel NULL pointer dereference at 00000000000000c8 ... [ 226.058704] RIP: 0010:_raw_spin_lock+0xc/0x20 ... [ 226.059732] Call Trace: [ 226.059878] rpcrdma_bc_receive_call+0x138/0x327 [rpcrdma] [ 226.060011] __ib_process_cq+0x89/0x170 [ib_core] [ 226.060092] ib_cq_poll_work+0x26/0x80 [ib_core] [ 226.060257] process_one_work+0x1a7/0x360 [ 226.060367] ? create_worker+0x1a0/0x1a0 [ 226.060440] worker_thread+0x30/0x390 [ 226.060500] ? create_worker+0x1a0/0x1a0 [ 226.060574] kthread+0x116/0x130 [ 226.060661] ? kthread_flush_work_fn+0x10/0x10 [ 226.060724] ret_from_fork+0x35/0x40
...
--- net/sunrpc/xprtrdma/rpc_rdma.c | 5 +++++ 1 file changed, 5 insertions(+)
net/sunrpc/xprtrdma/rpc_rdma.c +5 -0
@@ -1120,6 +1120,7 @@ static bool rpcrdma_is_bcall(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep) #if defined(CONFIG_SUNRPC_BACKCHANNEL) { + struct rpc_xprt *xprt = &r_xprt->rx_xprt;struct xdr_stream *xdr = &rep->rr_stream;__be32 *p;
@@ -1143,6 +1144,10 @@ rpcrdma_is_bcall(struct rpcrdma_xprt *r_xprt, struct rpcrdma_rep *rep)if (*p !=cpu_to_be32 (RPC_CALL ))return false; +/* No bc service. */ +if (xprt->bc_serv ==NULL ) +return false; +/* Now that we are sure this is a backchannel call, * advance to the RPC header. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 130/247 drm/bridge: sn65dsi83: Fix an error handling path in sn65dsi83_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 6edf615618b8259f16eeb1df98f0ba0d2312c22e ]
sn65dsi83_parse_dt() takes a reference on 'ctx->host_node' that must be released in the error handling path of this function and of the probe. This is only done in the remove function up to now.
--- drivers/gpu/drm/bridge/ti-sn65dsi83.c | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-)
drivers/gpu/drm/bridge/ti-sn65dsi83.c +25 -9
@@ -608,10 +608,14 @@ static int sn65dsi83_parse_dt(struct sn65dsi83 *ctx, enum sn65dsi83_model model) ctx->host_node =of_graph_get_remote_port_parent (endpoint);of_node_put (endpoint); -if (ctx->dsi_lanes <0 || ctx->dsi_lanes >4 ) -return -EINVAL ; -if (!ctx->host_node) -return -ENODEV ; +if (ctx->dsi_lanes <0 || ctx->dsi_lanes >4 ) { + ret = -EINVAL ; + goto err_put_node; + } +if (!ctx->host_node) { + ret = -ENODEV ; + goto err_put_node; + } ctx->lvds_dual_link = false; ctx->lvds_dual_link_even_odd_swap = false;
@@ -638,16 +642,22 @@ static int sn65dsi83_parse_dt(struct sn65dsi83 *ctx, enum sn65dsi83_model model) ret =drm_of_find_panel_or_bridge (dev->of_node,2 ,0 , &panel, &panel_bridge);if (ret <0 ) -return ret; + goto err_put_node;if (panel) { panel_bridge =devm_drm_panel_bridge_add (dev, panel); -if (IS_ERR (panel_bridge)) -return PTR_ERR (panel_bridge); +if (IS_ERR (panel_bridge)) { + ret =PTR_ERR (panel_bridge); + goto err_put_node; + } } ctx->panel_bridge = panel_bridge;return 0 ; + +err_put_node: +of_node_put (ctx->host_node); +return ret; } static int sn65dsi83_probe(struct i2c_client *client,
@@ -680,8 +690,10 @@ static int sn65dsi83_probe(struct i2c_client *client,return ret; ctx->regmap =devm_regmap_init_i2c (client, &sn65dsi83_regmap_config); -if (IS_ERR (ctx->regmap)) -return PTR_ERR (ctx->regmap); +if (IS_ERR (ctx->regmap)) { + ret =PTR_ERR (ctx->regmap); + goto err_put_node; + }dev_set_drvdata (dev, ctx);i2c_set_clientdata (client, ctx);
@@ -691,6 +703,10 @@ static int sn65dsi83_probe(struct i2c_client *client,drm_bridge_add (&ctx->bridge);return 0 ; + +err_put_node: +of_node_put (ctx->host_node); +return ret; }static int sn65dsi83_remove (struct i2c_client *client)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 131/247 drm/bridge: ti-sn65dsi83: Handle dsi_lanes == 0 as invalid
In reply to Greg Kroah-HartmanFrom: Marek Vasut <[email protected]>
[ Upstream commit edbc7960bef7fd71ef1e44d0df15b864784b14c8 ]
Handle empty data-lanes = < >; property, which translates to dsi_lanes = 0 as invalid.
--- drivers/gpu/drm/bridge/ti-sn65dsi83.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/bridge/ti-sn65dsi83.c +1 -1
@@ -608,7 +608,7 @@ static int sn65dsi83_parse_dt(struct sn65dsi83 *ctx, enum sn65dsi83_model model) ctx->host_node =of_graph_get_remote_port_parent (endpoint);of_node_put (endpoint); -if (ctx->dsi_lanes <0 || ctx->dsi_lanes >4 ) { +if (ctx->dsi_lanes <=0 || ctx->dsi_lanes >4 ) { ret = -EINVAL ; goto err_put_node; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 132/247 netfilter: nat: really support inet nat without l3 address
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 282e5f8fe907dc3f2fbf9f2103b0e62ffc3a68a5 ]
When no l3 address is given, priv->family is set to NFPROTO_INET and the evaluation function isn't called.
Call it too so l4-only rewrite can work.
Also add a test case for this.
--- net/netfilter/nft_nat.c | 3 +- tools/testing/selftests/netfilter/nft_nat.sh | 43 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-)
net/netfilter/nft_nat.c +2 -1
@@ -334,7 +334,8 @@ static void nft_nat_inet_eval(const struct nft_expr *expr, {const struct nft_nat *priv =nft_expr_priv (expr); -if (priv->family ==nft_pf (pkt)) +if (priv->family ==nft_pf (pkt) || + priv->family ==NFPROTO_INET )nft_nat_eval (expr, regs, pkt); }
tools/testing/selftests/netfilter/nft_nat.sh +43 -0
55 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 133/247 netfilter: nf_tables: use kfree_rcu(ptr, rcu) to release hooks in clean_net path
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit ab5e5c062f67c5ae8cd07f0632ffa62dc0e7d169 ]
Use kfree_rcu(ptr, rcu) variant instead as described by ae089831ff28 ("netfilter: nf_tables: prefer kfree_rcu(ptr, rcu) variant").
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -7231,7 +7231,7 @@ static void __nft_unregister_flowtable_net_hooks(struct net *net,nf_unregister_net_hook (net, &hook->ops);if (release_netdev) {list_del (&hook->list); -kfree_rcu (hook); +kfree_rcu (hook, rcu); } } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 134/247 netfilter: nf_tables: delete flowtable hooks via transaction list
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit b6d9014a3335194590abdd2a2471ef5147a67645 ]
Remove inactive bool field in nft_hook object that was introduced in abadb2f865d7 ("netfilter: nf_tables: delete devices from flowtable"). Move stale flowtable hooks to transaction list instead.
Deleting twice the same device does not result in ENOENT.
--- include/net/netfilter/nf_tables.h | 1 - net/netfilter/nf_tables_api.c | 31 ++++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-)
include/net/netfilter/nf_tables.h +0 -1
@@ -1053,7 +1053,6 @@ struct nft_stats {struct nft_hook {struct list_head list; -bool inactive;struct nf_hook_ops ops;struct rcu_head rcu; };
net/netfilter/nf_tables_api.c +6 -25
@@ -1835,7 +1835,6 @@ static struct nft_hook *nft_netdev_hook_alloc(struct net *net, goto err_hook_dev; } hook->ops.dev = dev; - hook->inactive = false;return hook;
@@ -7517,6 +7516,7 @@ static int nft_delflowtable_hook(struct nft_ctx *ctx, {const struct nlattr *const *nla = ctx->nla;struct nft_flowtable_hook flowtable_hook; +LIST_HEAD (flowtable_del_list);struct nft_hook *this, *hook;struct nft_trans *trans;int err;
@@ -7532,7 +7532,7 @@ static int nft_delflowtable_hook(struct nft_ctx *ctx, err = -ENOENT ; goto err_flowtable_del_hook; } - hook->inactive = true; +list_move (&hook->list, &flowtable_del_list); } trans = nft_trans_alloc(ctx, NFT_MSG_DELFLOWTABLE,
@@ -7545,6 +7545,7 @@ static int nft_delflowtable_hook(struct nft_ctx *ctx,nft_trans_flowtable (trans) = flowtable;nft_trans_flowtable_update (trans) = true;INIT_LIST_HEAD (&nft_trans_flowtable_hooks (trans)); +list_splice (&flowtable_del_list, &nft_trans_flowtable_hooks (trans));nft_flowtable_hook_release (&flowtable_hook);nft_trans_commit_list_add_tail (ctx->net, trans);
@@ -7552,13 +7553,7 @@ static int nft_delflowtable_hook(struct nft_ctx *ctx,return 0 ; err_flowtable_del_hook: -list_for_each_entry (this, &flowtable_hook.list, list) { - hook =nft_hook_list_find (&flowtable->hook_list, this); -if (!hook) -break ; - - hook->inactive = false; - } +list_splice (&flowtable_del_list, &flowtable->hook_list);nft_flowtable_hook_release (&flowtable_hook);return err;
@@ -8413,17 +8408,6 @@ void nft_chain_del(struct nft_chain *chain)list_del_rcu (&chain->list); } -static void nft_flowtable_hooks_del (struct nft_flowtable *flowtable, -struct list_head *hook_list) -{ -struct nft_hook *hook, *next; - -list_for_each_entry_safe (hook, next, &flowtable->hook_list, list) { -if (hook->inactive) -list_move (&hook->list, hook_list); - } -} -static void nf_tables_module_autoload_cleanup (struct net *net) {struct nftables_pernet *nft_net =nft_pernet (net);
@@ -8768,8 +8752,6 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)break ;case NFT_MSG_DELFLOWTABLE :if (nft_trans_flowtable_update (trans)) { -nft_flowtable_hooks_del (nft_trans_flowtable (trans), - &nft_trans_flowtable_hooks (trans)); nf_tables_flowtable_notify(&trans->ctx, nft_trans_flowtable(trans), &nft_trans_flowtable_hooks(trans),
@@ -8850,7 +8832,6 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)struct nftables_pernet *nft_net =nft_pernet (net);struct nft_trans *trans, *next;struct nft_trans_elem *te; -struct nft_hook *hook;if (action ==NFNL_ABORT_VALIDATE &&nf_tables_validate (net) <0 )
@@ -8981,8 +8962,8 @@ static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)break ;case NFT_MSG_DELFLOWTABLE :if (nft_trans_flowtable_update (trans)) { -list_for_each_entry (hook, &nft_trans_flowtable (trans)->hook_list, list) - hook->inactive = false; +list_splice (&nft_trans_flowtable_hooks (trans), + &nft_trans_flowtable (trans)->hook_list); }else { trans->ctx.table->use++;nft_clear (trans->ctx.net,nft_trans_flowtable (trans));
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 135/247 powerpc/kasan: Force thread size increase with KASAN
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 3e8635fb2e072672cbc650989ffedf8300ad67fb ]
KASAN causes increased stack usage, which can lead to stack overflows.
The logic in Kconfig to suggest a larger default doesn't work if a user has CONFIG_EXPERT enabled and has an existing .config with a smaller value.
Follow the lead of x86 and arm64, and force the thread size to be increased when KASAN is enabled.
That also has the effect of enlarging the stack for 64-bit KASAN builds, which is also desirable.
--- arch/powerpc/Kconfig | 1 - arch/powerpc/include/asm/thread_info.h | 10 ++++++++-- 2 files changed, 8 insertions(+), 3 deletions(-)
arch/powerpc/Kconfig +0 -1
@@ -768,7 +768,6 @@ config THREAD_SHIFT range 13 15 default "15" if PPC_256K_PAGES default "14" if PPC64 - default "14" if KASAN default "13" help Used to define the stack size. The default is almost always what you
arch/powerpc/include/asm/thread_info.h +8 -2
@@ -14,10 +14,16 @@#ifdef __KERNEL__ -#if defined(CONFIG_VMAP_STACK ) &&CONFIG_THREAD_SHIFT <PAGE_SHIFT +#ifdef CONFIG_KASAN +#define MIN_THREAD_SHIFT (CONFIG_THREAD_SHIFT + 1) +#else +#define MIN_THREAD_SHIFT CONFIG_THREAD_SHIFT +#endif + +#if defined(CONFIG_VMAP_STACK ) &&MIN_THREAD_SHIFT <PAGE_SHIFT #define THREAD_SHIFT PAGE_SHIFT#else -#define THREAD_SHIFT CONFIG_THREAD_SHIFT +#define THREAD_SHIFT MIN_THREAD_SHIFT#endif #define THREAD_SIZE (1 << THREAD_SHIFT)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 136/247 SUNRPC: Trap RDMA segment overflows
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit f012e95b377c73c0283f009823c633104dedb337 ]
Prevent svc_rdma_build_writes() from walking off the end of a Write chunk's segment array. Caught with KASAN.
The test that this fix replaces is invalid, and might have been left over from an earlier prototype of the PCL work.
--- net/sunrpc/xprtrdma/svc_rdma_rw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/sunrpc/xprtrdma/svc_rdma_rw.c +2 -2
@@ -456,10 +456,10 @@ svc_rdma_build_writes(struct svc_rdma_write_info *info,unsigned int write_len;u64 offset; - seg = &info->wi_chunk->ch_segments[info->wi_seg_no]; -if (!seg) +if (info->wi_seg_no >= info->wi_chunk->ch_segcount) goto out_overflow; + seg = &info->wi_chunk->ch_segments[info->wi_seg_no]; write_len =min (remaining, seg->rs_length - info->wi_seg_off);if (!write_len) goto out_overflow;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 137/247 netfilter: nf_tables: always initialize flowtable hook list in transaction
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 2c9e4559773c261900c674a86b8e455911675d71 ]
The hook list is used if nft_trans_flowtable_update(trans) == true. However, initialize this list for other cases for safety reasons.
--- net/netfilter/nf_tables_api.c | 1 + 1 file changed, 1 insertion(+)
net/netfilter/nf_tables_api.c +1 -0
@@ -544,6 +544,7 @@ static int nft_trans_flowtable_add(struct nft_ctx *ctx, int msg_type,if (msg_type ==NFT_MSG_NEWFLOWTABLE )nft_activate_next (ctx->net, flowtable); +INIT_LIST_HEAD (&nft_trans_flowtable_hooks (trans));nft_trans_flowtable (trans) = flowtable;nft_trans_commit_list_add_tail (ctx->net, trans);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 138/247 ata: pata_octeon_cf: Fix refcount leak in octeon_cf_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 10d6bdf532902be1d8aa5900b3c03c5671612aa2 ]
of_find_device_by_node() takes reference, we should use put_device() to release it when not need anymore.
Add missing put_device() to avoid refcount leak.
--- drivers/ata/pata_octeon_cf.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/ata/pata_octeon_cf.c +3 -0
@@ -888,12 +888,14 @@ static int octeon_cf_probe(struct platform_device *pdev)int i; res_dma =platform_get_resource (dma_dev,IORESOURCE_MEM ,0 );if (!res_dma) { +put_device (&dma_dev->dev);of_node_put (dma_node);return -EINVAL ; } cf_port->dma_base = (u64 )devm_ioremap (&pdev->dev, res_dma->start,resource_size (res_dma));if (!cf_port->dma_base) { +put_device (&dma_dev->dev);of_node_put (dma_node);return -EINVAL ; }
@@ -903,6 +905,7 @@ static int octeon_cf_probe(struct platform_device *pdev) irq = i; irq_handler = octeon_cf_interrupt; } +put_device (&dma_dev->dev); }of_node_put (dma_node); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 139/247 netfilter: nf_tables: release new hooks on unsupported flowtable flags
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit c271cc9febaaa1bcbc0842d1ee30466aa6148ea8 ]
Release the list of new hooks that are pending to be registered in case that unsupported flowtable flags are provided.
--- net/netfilter/nf_tables_api.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/netfilter/nf_tables_api.c +8 -4
@@ -7332,11 +7332,15 @@ static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh,if (nla[NFTA_FLOWTABLE_FLAGS ]) { flags =ntohl (nla_get_be32 (nla[NFTA_FLOWTABLE_FLAGS ])); -if (flags & ~NFT_FLOWTABLE_MASK ) -return -EOPNOTSUPP ; +if (flags & ~NFT_FLOWTABLE_MASK ) { + err = -EOPNOTSUPP ; + goto err_flowtable_update_hook; + }if ((flowtable->data.flags &NFT_FLOWTABLE_HW_OFFLOAD ) ^ - (flags &NFT_FLOWTABLE_HW_OFFLOAD )) -return -EOPNOTSUPP ; + (flags &NFT_FLOWTABLE_HW_OFFLOAD )) { + err = -EOPNOTSUPP ; + goto err_flowtable_update_hook; + } }else { flags = flowtable->data.flags; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 140/247 netfilter: nf_tables: memleak flow rule from commit path
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 9dd732e0bdf538b1b76dc7c157e2b5e560ff30d3 ]
Abort path release flow rule object, however, commit path does not. Update code to destroy these objects before releasing the transaction.
--- net/netfilter/nf_tables_api.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/netfilter/nf_tables_api.c +6 -0
@@ -8228,6 +8228,9 @@ static void nft_commit_release(struct nft_trans *trans)nf_tables_chain_destroy (&trans->ctx);break ;case NFT_MSG_DELRULE : +if (trans->ctx.chain->flags &NFT_CHAIN_HW_OFFLOAD ) +nft_flow_rule_destroy (nft_trans_flow_rule (trans)); +nf_tables_rule_destroy (&trans->ctx,nft_trans_rule (trans));break ;case NFT_MSG_DELSET :
@@ -8667,6 +8670,9 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)nf_tables_rule_notify (&trans->ctx,nft_trans_rule (trans),NFT_MSG_NEWRULE ); +if (trans->ctx.chain->flags &NFT_CHAIN_HW_OFFLOAD ) +nft_flow_rule_destroy (nft_trans_flow_rule (trans)); +nft_trans_destroy (trans);break ;case NFT_MSG_DELRULE :
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 141/247 netfilter: nf_tables: bail out early if hardware offload is not supported
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 3a41c64d9c1185a2f3a184015e2a9b78bfc99c71 ]
If user requests for NFT_CHAIN_HW_OFFLOAD, then check if either device provides the .ndo_setup_tc interface or there is an indirect flow block that has been registered. Otherwise, bail out early from the preparation phase. Moreover, validate that family == NFPROTO_NETDEV and hook is NF_NETDEV_INGRESS.
--- include/net/flow_offload.h | 1 + include/net/netfilter/nf_tables_offload.h | 2 +- net/core/flow_offload.c | 6 ++++++ net/netfilter/nf_tables_api.c | 2 +- net/netfilter/nf_tables_offload.c | 23 ++++++++++++++++++++++- 5 files changed, 31 insertions(+), 3 deletions(-)
include/net/flow_offload.h +1 -0
@@ -575,5 +575,6 @@ int flow_indr_dev_setup_offload(struct net_device *dev, struct Qdisc *sch, enum tc_setup_type type, void *data, struct flow_block_offload *bo, void (*cleanup)(struct flow_block_cb *block_cb)); +bool flow_indr_dev_exists (void );#endif /* _NET_FLOW_OFFLOAD_H */
include/net/netfilter/nf_tables_offload.h +1 -1
@@ -92,7 +92,7 @@ int nft_flow_rule_offload_commit(struct net *net); NFT_OFFLOAD_MATCH(__key, __base, __field, __len, __reg) \memset (&(__reg)->mask,0xff , (__reg)->len); -int nft_chain_offload_priority (struct nft_base_chain *basechain); +bool nft_chain_offload_support (const struct nft_base_chain *basechain);int nft_offload_init (void );void nft_offload_exit (void );
net/core/flow_offload.c +6 -0
@@ -565,3 +565,9 @@ int flow_indr_dev_setup_offload(struct net_device *dev, struct Qdisc *sch,return list_empty (&bo->cb_list) ? -EOPNOTSUPP :0 ; }EXPORT_SYMBOL (flow_indr_dev_setup_offload); + +bool flow_indr_dev_exists (void ) +{ +return !list_empty (&flow_block_indr_dev_list); +} +EXPORT_SYMBOL (flow_indr_dev_exists);
net/netfilter/nf_tables_api.c +1 -1
@@ -2072,7 +2072,7 @@ static int nft_basechain_init(struct nft_base_chain *basechain, u8 family, chain->flags |=NFT_CHAIN_BASE | flags; basechain->policy =NF_ACCEPT ;if (chain->flags &NFT_CHAIN_HW_OFFLOAD && -nft_chain_offload_priority (basechain) <0 ) + !nft_chain_offload_support (basechain))return -EOPNOTSUPP ;flow_block_init (&basechain->flow_block);
net/netfilter/nf_tables_offload.c +22 -1
@@ -208,7 +208,7 @@ static int nft_setup_cb_call(enum tc_setup_type type, void *type_data,return 0 ; } -int nft_chain_offload_priority (struct nft_base_chain *basechain) +static int nft_chain_offload_priority (const struct nft_base_chain *basechain) {if (basechain->ops.priority <=0 || basechain->ops.priority >USHRT_MAX )
@@ -217,6 +217,27 @@ int nft_chain_offload_priority(struct nft_base_chain *basechain)return 0 ; } +bool nft_chain_offload_support (const struct nft_base_chain *basechain) +{ +struct net_device *dev; +struct nft_hook *hook; + +if (nft_chain_offload_priority (basechain) <0 ) +return false; + +list_for_each_entry (hook, &basechain->hook_list, list) { +if (hook->ops.pf !=NFPROTO_NETDEV || + hook->ops.hooknum !=NF_NETDEV_INGRESS ) +return false; + + dev = hook->ops.dev; +if (!dev->netdev_ops->ndo_setup_tc && !flow_indr_dev_exists ()) +return false; + } + +return true; +} + static void nft_flow_cls_offload_setup(struct flow_cls_offload *cls_flow, const struct nft_base_chain *basechain, const struct nft_rule *rule,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 142/247 xen: unexport __init-annotated xen_xlate_map_ballooned_pages()
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit dbac14a5a05ff8e1ce7c0da0e1f520ce39ec62ea ]
EXPORT_SYMBOL and __init is a bad combination because the .init.text section is freed up after the initialization. Hence, modules cannot use symbols annotated __init. The access to a freed symbol may end up with kernel panic.
modpost used to detect it, but it has been broken for a decade.
Recently, I fixed modpost so it started to warn it again, then this showed up in linux-next builds.
There are two ways to fix it:
- Remove __init
- Remove EXPORT_SYMBOL
I chose the latter for this case because none of the in-tree call-sites (arch/arm/xen/enlighten.c, arch/x86/xen/grant-table.c) is compiled as modular.
--- drivers/xen/xlate_mmu.c | 1 - 1 file changed, 1 deletion(-)
drivers/xen/xlate_mmu.c +0 -1
@@ -261,7 +261,6 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,return 0 ; } -EXPORT_SYMBOL_GPL (xen_xlate_map_ballooned_pages);struct remap_pfn {struct mm_struct *mm;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 143/247 stmmac: intel: Fix an error handling path in intel_eth_pci_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 5e74a4b3ec1816e3bbfd715d46ae29d2508079cb ]
When the managed API is used, there is no need to explicitly call pci_free_irq_vectors().
This looks to be a left-over from the commit in the Fixes tag. Only the .remove() function had been updated.
So remove this unused function call and update goto label accordingly.
--- drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c +1 -3
@@ -1073,13 +1073,11 @@ static int intel_eth_pci_probe(struct pci_dev *pdev, ret =stmmac_dvr_probe (&pdev->dev, plat, &res);if (ret) { - goto err_dvr_probe; + goto err_alloc_irq; }return 0 ; -err_dvr_probe: -pci_free_irq_vectors (pdev); err_alloc_irq:clk_disable_unprepare (plat->stmmac_clk);clk_unregister_fixed_rate (plat->stmmac_clk);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 144/247 af_unix: Fix a data-race in unix_dgram_peer_wake_me().
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 662a80946ce13633ae90a55379f1346c10f0c432 ]
unix_dgram_poll() calls unix_dgram_peer_wake_me() without other's lock held and check if its receive queue is full. Here we need to use unix_recvq_full_lockless() instead of unix_recvq_full(), otherwise KCSAN will report a data-race.
--- net/unix/af_unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/unix/af_unix.c +1 -1
@@ -446,7 +446,7 @@ static int unix_dgram_peer_wake_me(struct sock *sk, struct sock *other)* -ECONNREFUSED. Otherwise, if we haven't queued any skbs * to other and its full, we will hang waiting for POLLOUT. */ -if (unix_recvq_full (other) && !sock_flag (other,SOCK_DEAD )) +if (unix_recvq_full_lockless (other) && !sock_flag (other,SOCK_DEAD ))return 1 ;if (connected)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 145/247 bpf, arm64: Clear prog->jited_len along prog->jited
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 10f3b29c65bb2fe0d47c2945cd0b4087be1c5218 ]
syzbot reported an illegal copy_to_user() attempt
from bpf_prog_get_info_by_fd() [1]
There was no repro yet on this bug, but I think
that commit 0aef499f3172 ("mm/usercopy: Detect vmalloc overruns") is exposing a prior bug in bpf arm64.
bpf_prog_get_info_by_fd() looks at prog->jited_len to determine if the JIT image can be copied out to user space.
My theory is that syzbot managed to get a prog where prog->jited_len has been set to 43, while prog->bpf_func has ben cleared.
It is not clear why copy_to_user(uinsns, NULL, ulen) is triggering this particular warning.
I thought find_vma_area(NULL) would not find a vm_struct. As we do not hold vmap_area_lock spinlock, it might be possible that the found vm_struct was garbage.
[1]
usercopy: Kernel memory exposure attempt detected from vmalloc (offset 792633534417210172, size 43)! kernel BUG at mm/usercopy.c:101!
Internal error: Oops - BUG: 0 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 25002 Comm: syz-executor.1 Not tainted 5.18.0-syzkaller-10139-g8291eaafed36 #0 Hardware name: linux,dummy-virt (DT) pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : usercopy_abort+0x90/0x94 mm/usercopy.c:101 lr : usercopy_abort+0x90/0x94 mm/usercopy.c:89
sp : ffff80000b773a20
x29: ffff80000b773a30 x28: faff80000b745000 x27: ffff80000b773b48
x26: 0000000000000000 x25: 000000000000002b x24: 0000000000000000
x23: 00000000000000e0 x22: ffff80000b75db67 x21: 0000000000000001
x20: 000000000000002b x19: ffff80000b75db3c x18: 00000000fffffffd
x17: 2820636f6c6c616d x16: 76206d6f72662064 x15: 6574636574656420
x14: 74706d6574746120 x13: 2129333420657a69 x12: 73202c3237313031
x11: 3237313434333533 x10: 3336323937207465 x9 : 657275736f707865 x8 : ffff80000a30c550 x7 : ffff80000b773830 x6 : ffff80000b773830 x5 : 0000000000000000 x4 : ffff00007fbbaa10 x3 : 0000000000000000 x2 : 0000000000000000 x1 : f7ff000028fc0000 x0 : 0000000000000064
Call trace: usercopy_abort+0x90/0x94 mm/usercopy.c:89 check_heap_object mm/usercopy.c:186 [inline] __check_object_size mm/usercopy.c:252 [inline] __check_object_size+0x198/0x36c mm/usercopy.c:214 check_object_size include/linux/thread_info.h:199 [inline] check_copy_size include/linux/thread_info.h:235 [inline] copy_to_user include/linux/uaccess.h:159 [inline] bpf_prog_get_info_by_fd.isra.0+0xf14/0xfdc kernel/bpf/syscall.c:3993 bpf_obj_get_info_by_fd+0x12c/0x510 kernel/bpf/syscall.c:4253 __sys_bpf+0x900/0x2150 kernel/bpf/syscall.c:4956 __do_sys_bpf kernel/bpf/syscall.c:5021 [inline] __se_sys_bpf kernel/bpf/syscall.c:5019 [inline] __arm64_sys_bpf+0x28/0x40 kernel/bpf/syscall.c:5019 __invoke_syscall arch/arm64/kernel/syscall.c:38 [inline] invoke_syscall+0x48/0x114 arch/arm64/kernel/syscall.c:52 el0_svc_common.constprop.0+0x44/0xec arch/arm64/kernel/syscall.c:142 do_el0_svc+0xa0/0xc0 arch/arm64/kernel/syscall.c:206 el0_svc+0x44/0xb0 arch/arm64/kernel/entry-common.c:624 el0t_64_sync_handler+0x1ac/0x1b0 arch/arm64/kernel/entry-common.c:642 el0t_64_sync+0x198/0x19c arch/arm64/kernel/entry.S:581 Code: aa0003e3 d00038c0 91248000 97fff65f (d4210000)
--- arch/arm64/net/bpf_jit_comp.c | 1 + 1 file changed, 1 insertion(+)
arch/arm64/net/bpf_jit_comp.c +1 -0
@@ -1113,6 +1113,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)bpf_jit_binary_free (header); prog->bpf_func =NULL ; prog->jited =0 ; + prog->jited_len =0 ; goto out_off; }bpf_jit_binary_lock_ro (header);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 146/247 net: dsa: lantiq_gswip: Fix refcount leak in gswip_gphy_fw_list
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 0737e018a05e2aa352828c52bdeed3b02cff2930 ]
Every iteration of for_each_available_child_of_node() decrements the reference count of the previous node.
when breaking early from a for_each_available_child_of_node() loop, we need to explicitly call of_node_put() on the gphy_fw_np. Add missing of_node_put() to avoid refcount leak.
--- drivers/net/dsa/lantiq_gswip.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/dsa/lantiq_gswip.c +3 -1
@@ -2047,8 +2047,10 @@ static int gswip_gphy_fw_list(struct gswip_priv *priv,for_each_available_child_of_node (gphy_fw_list_np, gphy_fw_np) { err =gswip_gphy_fw_probe (priv, &priv->gphy_fw[i], gphy_fw_np, i); -if (err) +if (err) { +of_node_put (gphy_fw_np); goto remove_gphy; + } i++; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 147/247 net/mlx4_en: Fix wrong return value on ioctl EEPROM query failure
In reply to Greg Kroah-HartmanFrom: Gal Pressman <[email protected]>
[ Upstream commit f5826c8c9d57210a17031af5527056eefdc2b7eb ]
The ioctl EEPROM query wrongly returns success on read failures, fix that by returning the appropriate error code.
--- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +1 -1
@@ -2103,7 +2103,7 @@ static int mlx4_en_get_module_eeprom(struct net_device *dev,en_err (priv,"mlx4_get_module_info i(%d) offset(%d) bytes_to_read(%d) - FAILED (0x%x)\n" , i, offset, ee->len - i, ret); -return 0 ; +return ret; } i += ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 148/247 i40e: xsk: Move tmp desc array from driver to pool
In reply to Greg Kroah-HartmanFrom: Magnus Karlsson <[email protected]>
[ Upstream commit d1bc532e99becf104635ed4da6fefa306f452321 ]
Move desc_array from the driver to the pool. The reason behind this is that we can then reuse this array as a temporary storage for descriptors in all zero-copy drivers that use the batched interface. This will make it easier to add batching to more drivers.
i40e is the only driver that has a batched Tx zero-copy implementation, so no need to touch any other driver.
--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 11 ----------- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 - drivers/net/ethernet/intel/i40e/i40e_xsk.c | 4 ++-- include/net/xdp_sock_drv.h | 5 ++--- include/net/xsk_buff_pool.h | 1 + net/xdp/xsk.c | 13 ++++++------- net/xdp/xsk_buff_pool.c | 7 +++++++ net/xdp/xsk_queue.h | 12 ++++++------ 8 files changed, 24 insertions(+), 30 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +0 -11
@@ -830,8 +830,6 @@ void i40e_free_tx_resources(struct i40e_ring *tx_ring)i40e_clean_tx_ring (tx_ring);kfree (tx_ring->tx_bi); tx_ring->tx_bi =NULL ; -kfree (tx_ring->xsk_descs); - tx_ring->xsk_descs =NULL ;if (tx_ring->desc) { dma_free_coherent(tx_ring->dev, tx_ring->size,
@@ -1433,13 +1431,6 @@ int i40e_setup_tx_descriptors(struct i40e_ring *tx_ring)if (!tx_ring->tx_bi) goto err; -if (ring_is_xdp (tx_ring)) { - tx_ring->xsk_descs =kcalloc (I40E_MAX_NUM_DESCRIPTORS ,sizeof (*tx_ring->xsk_descs), -GFP_KERNEL ); -if (!tx_ring->xsk_descs) - goto err; - } -u64_stats_init (&tx_ring->syncp);/* round up to nearest 4K */
@@ -1463,8 +1454,6 @@ int i40e_setup_tx_descriptors(struct i40e_ring *tx_ring)return 0 ; err: -kfree (tx_ring->xsk_descs); - tx_ring->xsk_descs =NULL ;kfree (tx_ring->tx_bi); tx_ring->tx_bi =NULL ;return -ENOMEM ;
drivers/net/ethernet/intel/i40e/i40e_txrx.h +0 -1
@@ -390,7 +390,6 @@ struct i40e_ring {u16 rx_offset;struct xdp_rxq_info xdp_rxq;struct xsk_buff_pool *xsk_pool; -struct xdp_desc *xsk_descs;/* For storing descriptors in the AF_XDP ZC path */ }____cacheline_internodealigned_in_smp ;static inline bool ring_uses_build_skb (struct i40e_ring *ring)
drivers/net/ethernet/intel/i40e/i40e_xsk.c +2 -2
@@ -473,11 +473,11 @@ static void i40e_set_rs_bit(struct i40e_ring *xdp_ring)**/ static bool i40e_xmit_zc (struct i40e_ring *xdp_ring,unsigned int budget) { -struct xdp_desc *descs = xdp_ring->xsk_descs; +struct xdp_desc *descs = xdp_ring->xsk_pool->tx_descs;u32 nb_pkts, nb_processed =0 ;unsigned int total_bytes =0 ; - nb_pkts =xsk_tx_peek_release_desc_batch (xdp_ring->xsk_pool, descs, budget); + nb_pkts =xsk_tx_peek_release_desc_batch (xdp_ring->xsk_pool, budget);if (!nb_pkts)return true;
include/net/xdp_sock_drv.h +2 -3
@@ -13,7 +13,7 @@void xsk_tx_completed (struct xsk_buff_pool *pool,u32 nb_entries);bool xsk_tx_peek_desc (struct xsk_buff_pool *pool,struct xdp_desc *desc); -u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,struct xdp_desc *desc,u32 max); +u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,u32 max);void xsk_tx_release (struct xsk_buff_pool *pool);struct xsk_buff_pool *xsk_get_pool_from_qid (struct net_device *dev,u16 queue_id);
@@ -129,8 +129,7 @@ static inline bool xsk_tx_peek_desc(struct xsk_buff_pool *pool,return false; } -static inline u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,struct xdp_desc *desc, -u32 max) +static inline u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,u32 max) {return 0 ; }
include/net/xsk_buff_pool.h +1 -0
@@ -60,6 +60,7 @@ struct xsk_buff_pool {*/ dma_addr_t *dma_pages;struct xdp_buff_xsk *heads; +struct xdp_desc *tx_descs;u64 chunk_mask;u64 addrs_cnt;u32 free_list_cnt;
net/xdp/xsk.c +6 -7
@@ -358,9 +358,9 @@ bool xsk_tx_peek_desc(struct xsk_buff_pool *pool, struct xdp_desc *desc) }EXPORT_SYMBOL (xsk_tx_peek_desc); -static u32 xsk_tx_peek_release_fallback (struct xsk_buff_pool *pool,struct xdp_desc *descs, -u32 max_entries) +static u32 xsk_tx_peek_release_fallback (struct xsk_buff_pool *pool,u32 max_entries) { +struct xdp_desc *descs = pool->tx_descs;u32 nb_pkts =0 ;while (nb_pkts < max_entries &&xsk_tx_peek_desc (pool, &descs[nb_pkts]))
@@ -370,8 +370,7 @@ static u32 xsk_tx_peek_release_fallback(struct xsk_buff_pool *pool, struct xdp_dreturn nb_pkts; } -u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,struct xdp_desc *descs, -u32 max_entries) +u32 xsk_tx_peek_release_desc_batch (struct xsk_buff_pool *pool,u32 max_entries) {struct xdp_sock *xs;u32 nb_pkts;
@@ -380,7 +379,7 @@ u32 xsk_tx_peek_release_desc_batch(struct xsk_buff_pool *pool, struct xdp_desc *if (!list_is_singular (&pool->xsk_tx_list)) {/* Fallback to the non-batched version */ rcu_read_unlock (); -return xsk_tx_peek_release_fallback (pool, descs, max_entries); +return xsk_tx_peek_release_fallback (pool, max_entries); } xs = list_first_or_null_rcu(&pool->xsk_tx_list, struct xdp_sock, tx_list);
@@ -389,7 +388,7 @@ u32 xsk_tx_peek_release_desc_batch(struct xsk_buff_pool *pool, struct xdp_desc * goto out; } - nb_pkts =xskq_cons_peek_desc_batch (xs->tx, descs, pool, max_entries); + nb_pkts =xskq_cons_peek_desc_batch (xs->tx, pool, max_entries);if (!nb_pkts) { xs->tx->queue_empty_descs++; goto out;
@@ -401,7 +400,7 @@ u32 xsk_tx_peek_release_desc_batch(struct xsk_buff_pool *pool, struct xdp_desc ** packets. This avoids having to implement any buffering in * the Tx path. */ - nb_pkts =xskq_prod_reserve_addr_batch (pool->cq, descs, nb_pkts); + nb_pkts =xskq_prod_reserve_addr_batch (pool->cq, pool->tx_descs, nb_pkts);if (!nb_pkts) goto out;
net/xdp/xsk_buff_pool.c +7 -0
@@ -37,6 +37,7 @@ void xp_destroy(struct xsk_buff_pool *pool)if (!pool)return ; +kvfree (pool->tx_descs);kvfree (pool->heads);kvfree (pool); }
@@ -57,6 +58,12 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,if (!pool->heads) goto out; +if (xs->tx) { + pool->tx_descs =kcalloc (xs->tx->nentries,sizeof (*pool->tx_descs),GFP_KERNEL ); +if (!pool->tx_descs) + goto out; + } + pool->chunk_mask = ~((u64 )umem->chunk_size -1 ); pool->addrs_cnt = umem->size; pool->heads_cnt = umem->chunks;
net/xdp/xsk_queue.h +6 -6
@@ -201,11 +201,11 @@ static inline bool xskq_cons_read_desc(struct xsk_queue *q,return false; } -static inline u32 xskq_cons_read_desc_batch (struct xsk_queue *q, -struct xdp_desc *descs, -struct xsk_buff_pool *pool,u32 max) +static inline u32 xskq_cons_read_desc_batch (struct xsk_queue *q,struct xsk_buff_pool *pool, +u32 max) {u32 cached_cons = q->cached_cons, nb_entries =0 ; +struct xdp_desc *descs = pool->tx_descs;while (cached_cons != q->cached_prod && nb_entries < max) {struct xdp_rxtx_ring *ring = (struct xdp_rxtx_ring *)q->ring;
@@ -278,12 +278,12 @@ static inline bool xskq_cons_peek_desc(struct xsk_queue *q,return xskq_cons_read_desc (q, desc, pool); } -static inline u32 xskq_cons_peek_desc_batch (struct xsk_queue *q,struct xdp_desc *descs, -struct xsk_buff_pool *pool,u32 max) +static inline u32 xskq_cons_peek_desc_batch (struct xsk_queue *q,struct xsk_buff_pool *pool, +u32 max) {u32 entries =xskq_cons_nb_entries (q, max); -return xskq_cons_read_desc_batch (q, descs, pool, entries); +return xskq_cons_read_desc_batch (q, pool, entries); }/* To improve performance in the xskq_cons_release functions, only update local state here.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 149/247 xsk: Fix handling of invalid descriptors in XSK TX batching API
In reply to Greg Kroah-HartmanFrom: Maciej Fijalkowski <[email protected]>
[ Upstream commit d678cbd2f867a564a3c5b276c454e873f43f02f8 ]
xdpxceiver run on a AF_XDP ZC enabled driver revealed a problem with XSK Tx batching API. There is a test that checks how invalid Tx descriptors are handled by AF_XDP. Each valid descriptor is followed by invalid one on Tx side whereas the Rx side expects only to receive a set of valid descriptors.
In current xsk_tx_peek_release_desc_batch() function, the amount of available descriptors is hidden inside xskq_cons_peek_desc_batch(). This can be problematic in cases where invalid descriptors are present due to the fact that xskq_cons_peek_desc_batch() returns only a count of valid descriptors. This means that it is impossible to properly update XSK ring state when calling xskq_cons_release_n().
To address this issue, pull out the contents of xskq_cons_peek_desc_batch() so that callers (currently only xsk_tx_peek_release_desc_batch()) will always be able to update the state of ring properly, as total count of entries is now available and use this value as an argument in xskq_cons_release_n(). By doing so, xskq_cons_peek_desc_batch() can be dropped altogether.
--- net/xdp/xsk.c | 5 +++-- net/xdp/xsk_queue.h | 8 -------- 2 files changed, 3 insertions(+), 10 deletions(-)
net/xdp/xsk.c +3 -2
@@ -388,7 +388,8 @@ u32 xsk_tx_peek_release_desc_batch(struct xsk_buff_pool *pool, u32 max_entries) goto out; } - nb_pkts =xskq_cons_peek_desc_batch (xs->tx, pool, max_entries); + max_entries =xskq_cons_nb_entries (xs->tx, max_entries); + nb_pkts =xskq_cons_read_desc_batch (xs->tx, pool, max_entries);if (!nb_pkts) { xs->tx->queue_empty_descs++; goto out;
@@ -404,7 +405,7 @@ u32 xsk_tx_peek_release_desc_batch(struct xsk_buff_pool *pool, u32 max_entries)if (!nb_pkts) goto out; -xskq_cons_release_n (xs->tx, nb_pkts); +xskq_cons_release_n (xs->tx, max_entries);__xskq_cons_release (xs->tx); xs->sk.sk_write_space (&xs->sk);
net/xdp/xsk_queue.h +0 -8
@@ -278,14 +278,6 @@ static inline bool xskq_cons_peek_desc(struct xsk_queue *q,return xskq_cons_read_desc (q, desc, pool); } -static inline u32 xskq_cons_peek_desc_batch (struct xsk_queue *q,struct xsk_buff_pool *pool, -u32 max) -{ -u32 entries =xskq_cons_nb_entries (q, max); - -return xskq_cons_read_desc_batch (q, pool, entries); -} -/* To improve performance in the xskq_cons_release functions, only update local state here. * Reflect this to global state when we get new entries from the ring in * xskq_cons_get_entries() and whenever Rx or Tx processing are completed in the NAPI loop.
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 150/247 SUNRPC: Fix the calculation of xdr->end in xdr_get_next_encode_buffer()
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 6c254bf3b637dd4ef4f78eb78c7447419c0161d7 ]
I found that NFSD's new NFSv3 READDIRPLUS XDR encoder was screwing up right at the end of the page array. xdr_get_next_encode_buffer() does not compute the value of xdr->end correctly:
* The check to see if we're on the final available page in xdr->buf needs to account for the space consumed by @nbytes.
* The new xdr->end value needs to account for the portion of @nbytes that is to be encoded into the previous buffer.
--- net/sunrpc/xdr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/sunrpc/xdr.c +5 -1
@@ -979,7 +979,11 @@ static __be32 *xdr_get_next_encode_buffer(struct xdr_stream *xdr,*/ xdr->p = (void *)p + frag2bytes; space_left = xdr->buf->buflen - xdr->buf->len; - xdr->end = (void *)p +min_t (int, space_left,PAGE_SIZE ); +if (space_left - nbytes >=PAGE_SIZE ) + xdr->end = (void *)p +PAGE_SIZE ; +else + xdr->end = (void *)p + space_left - frag1bytes; + xdr->buf->page_len += frag2bytes; xdr->buf->len += nbytes;return p;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 151/247 net: mdio: unexport __init-annotated mdio_bus_init()
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 35b42dce619701f1300fb8498dae82c9bb1f0263 ]
EXPORT_SYMBOL and __init is a bad combination because the .init.text section is freed up after the initialization. Hence, modules cannot use symbols annotated __init. The access to a freed symbol may end up with kernel panic.
modpost used to detect it, but it has been broken for a decade.
Recently, I fixed modpost so it started to warn it again, then this showed up in linux-next builds.
There are two ways to fix it:
- Remove __init
- Remove EXPORT_SYMBOL
I chose the latter for this case because the only in-tree call-site, drivers/net/phy/phy_device.c is never compiled as modular. (CONFIG_PHYLIB is boolean)
--- drivers/net/phy/mdio_bus.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/phy/mdio_bus.c +0 -1
@@ -1011,7 +1011,6 @@ int __init mdio_bus_init(void)return ret; } -EXPORT_SYMBOL_GPL (mdio_bus_init);#if IS_ENABLED (CONFIG_PHYLIB )void mdio_bus_exit (void )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 152/247 net: xfrm: unexport __init-annotated xfrm4_protocol_init()
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 4a388f08d8784af48f352193d2b72aaf167a57a1 ]
EXPORT_SYMBOL and __init is a bad combination because the .init.text section is freed up after the initialization. Hence, modules cannot use symbols annotated __init. The access to a freed symbol may end up with kernel panic.
modpost used to detect it, but it has been broken for a decade.
Recently, I fixed modpost so it started to warn it again, then this showed up in linux-next builds.
There are two ways to fix it:
- Remove __init
- Remove EXPORT_SYMBOL
I chose the latter for this case because the only in-tree call-site, net/ipv4/xfrm4_policy.c is never compiled as modular. (CONFIG_XFRM is boolean)
--- net/ipv4/xfrm4_protocol.c | 1 - 1 file changed, 1 deletion(-)
net/ipv4/xfrm4_protocol.c +0 -1
@@ -304,4 +304,3 @@ void __init xfrm4_protocol_init(void) {xfrm_input_register_afinfo (&xfrm4_input_afinfo); } -EXPORT_SYMBOL (xfrm4_protocol_init);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 153/247 net: ipv6: unexport __init-annotated seg6_hmac_init()
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 5801f064e35181c71857a80ff18af4dbec3c5f5c ]
EXPORT_SYMBOL and __init is a bad combination because the .init.text section is freed up after the initialization. Hence, modules cannot use symbols annotated __init. The access to a freed symbol may end up with kernel panic.
modpost used to detect it, but it has been broken for a decade.
Recently, I fixed modpost so it started to warn it again, then this showed up in linux-next builds.
There are two ways to fix it:
- Remove __init
- Remove EXPORT_SYMBOL
I chose the latter for this case because the caller (net/ipv6/seg6.c) and the callee (net/ipv6/seg6_hmac.c) belong to the same module. It seems an internal function call in ipv6.ko.
--- net/ipv6/seg6_hmac.c | 1 - 1 file changed, 1 deletion(-)
net/ipv6/seg6_hmac.c +0 -1
@@ -399,7 +399,6 @@ int __init seg6_hmac_init(void) {return seg6_hmac_init_algo (); } -EXPORT_SYMBOL (seg6_hmac_init);int __net_init seg6_hmac_net_init (struct net *net) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 154/247 net/mlx5: Lag, filter non compatible devices
In reply to Greg Kroah-HartmanFrom: Mark Bloch <[email protected]>
[ Upstream commit bc4c2f2e017949646b43fdcad005a03462d437c6 ]
When search for a peer lag device we can filter based on that device's capabilities.
Downstream patch will be less strict when filtering compatible devices and remove the limitation where we require exact MLX5_MAX_PORTS and change it to a range.
--- drivers/net/ethernet/mellanox/mlx5/core/dev.c | 48 +++++++++++++++---- drivers/net/ethernet/mellanox/mlx5/core/lag.c | 12 ++--- .../ethernet/mellanox/mlx5/core/mlx5_core.h | 1 + 3 files changed, 47 insertions(+), 14 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/dev.c +40 -8
@@ -544,12 +544,9 @@ static u32 mlx5_gen_pci_id(const struct mlx5_core_dev *dev) PCI_SLOT(dev->pdev->devfn)); } -static int next_phys_dev (struct device *dev,const void *data) +static int _next_phys_dev (struct mlx5_core_dev *mdev, +const struct mlx5_core_dev *curr) { - struct mlx5_adev *madev = container_of(dev, struct mlx5_adev, adev.dev); -struct mlx5_core_dev *mdev = madev->mdev; -const struct mlx5_core_dev *curr = data; -if (!mlx5_core_is_pf (mdev))return 0 ;
@@ -562,8 +559,29 @@ static int next_phys_dev(struct device *dev, const void *data)return 1 ; } -/* Must be called with intf_mutex held */ -struct mlx5_core_dev *mlx5_get_next_phys_dev (struct mlx5_core_dev *dev) +static int next_phys_dev (struct device *dev,const void *data) +{ + struct mlx5_adev *madev = container_of(dev, struct mlx5_adev, adev.dev); +struct mlx5_core_dev *mdev = madev->mdev; + +return _next_phys_dev (mdev, data); +} + +static int next_phys_dev_lag (struct device *dev,const void *data) +{ + struct mlx5_adev *madev = container_of(dev, struct mlx5_adev, adev.dev); +struct mlx5_core_dev *mdev = madev->mdev; + +if (!MLX5_CAP_GEN (mdev, vport_group_manager) || + !MLX5_CAP_GEN (mdev, lag_master) || +MLX5_CAP_GEN (mdev, num_lag_ports) !=MLX5_MAX_PORTS ) +return 0 ; + +return _next_phys_dev (mdev, data); +} + +static struct mlx5_core_dev *mlx5_get_next_dev (struct mlx5_core_dev *dev, +int (*match)(struct device *dev,const void *data)) {struct auxiliary_device *adev;struct mlx5_adev *madev;
@@ -571,7 +589,7 @@ struct mlx5_core_dev *mlx5_get_next_phys_dev(struct mlx5_core_dev *dev)if (!mlx5_core_is_pf (dev))return NULL ; - adev =auxiliary_find_device (NULL , dev, &next_phys_dev); + adev =auxiliary_find_device (NULL , dev, match);if (!adev)return NULL ;
@@ -580,6 +598,20 @@ struct mlx5_core_dev *mlx5_get_next_phys_dev(struct mlx5_core_dev *dev)return madev->mdev; } +/* Must be called with intf_mutex held */ +struct mlx5_core_dev *mlx5_get_next_phys_dev (struct mlx5_core_dev *dev) +{ +lockdep_assert_held (&mlx5_intf_mutex); +return mlx5_get_next_dev (dev, &next_phys_dev); +} + +/* Must be called with intf_mutex held */ +struct mlx5_core_dev *mlx5_get_next_phys_dev_lag (struct mlx5_core_dev *dev) +{ +lockdep_assert_held (&mlx5_intf_mutex); +return mlx5_get_next_dev (dev, &next_phys_dev_lag); +} +void mlx5_dev_list_lock (void ) {mutex_lock (&mlx5_intf_mutex);
drivers/net/ethernet/mellanox/mlx5/core/lag.c +6 -6
@@ -752,12 +752,7 @@ static int __mlx5_lag_dev_add_mdev(struct mlx5_core_dev *dev)struct mlx5_lag *ldev =NULL ;struct mlx5_core_dev *tmp_dev; -if (!MLX5_CAP_GEN (dev, vport_group_manager) || - !MLX5_CAP_GEN (dev, lag_master) || -MLX5_CAP_GEN (dev, num_lag_ports) !=MLX5_MAX_PORTS ) -return 0 ; - - tmp_dev =mlx5_get_next_phys_dev (dev); + tmp_dev =mlx5_get_next_phys_dev_lag (dev);if (tmp_dev) ldev = tmp_dev->priv.lag;
@@ -802,6 +797,11 @@ void mlx5_lag_add_mdev(struct mlx5_core_dev *dev) {int err; +if (!MLX5_CAP_GEN (dev, vport_group_manager) || + !MLX5_CAP_GEN (dev, lag_master) || +MLX5_CAP_GEN (dev, num_lag_ports) !=MLX5_MAX_PORTS ) +return ; + recheck:mlx5_dev_list_lock (); err =__mlx5_lag_dev_add_mdev (dev);
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +1 -0
@@ -186,6 +186,7 @@ void mlx5_detach_device(struct mlx5_core_dev *dev);int mlx5_register_device (struct mlx5_core_dev *dev);void mlx5_unregister_device (struct mlx5_core_dev *dev);struct mlx5_core_dev *mlx5_get_next_phys_dev (struct mlx5_core_dev *dev); +struct mlx5_core_dev *mlx5_get_next_phys_dev_lag (struct mlx5_core_dev *dev);void mlx5_dev_list_lock (void );void mlx5_dev_list_unlock (void );int mlx5_dev_list_trylock (void );
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 155/247 net/mlx5: Fix mlx5_get_next_dev() peer device matching
In reply to Greg Kroah-HartmanFrom: Saeed Mahameed <[email protected]>
[ Upstream commit 1c5de097bea31760c3f0467ac0c84ba0dc3525d5 ]
In some use-cases, mlx5 instances will need to search for their peer device (the other port on the same HCA). For that, mlx5 device matching mechanism relied on auxiliary_find_device() to search, and used a bad matching callback function.
This approach has two issues:
1) next_phys_dev() the matching function, assumed all devices are of the type mlx5_adev (mlx5 auxiliary device) which is wrong and could lead to crashes, this worked for a while, since only lately other drivers started registering auxiliary devices.
2) using the auxiliary class bus (auxiliary_find_device) to search for mlx5_core_dev devices, who are actually PCIe device instances, is wrong. This works since mlx5_core always has at least one mlx5_adev instance hanging around in the aux bus.
As suggested by others we can fix 1. by comparing device names prefixes if they have the string "mlx5_core" in them, which is not a best practice ! but even with that fixed, still 2. needs fixing, we are trying to match pcie device peers so we should look in the right bus (pci bus), hence this fix.
The fix:
1) search the pci bus for mlx5 peer devices, instead of the aux bus
2) to validated devices are the same type "mlx5_core_dev" compare if they have the same driver, which is bulletproof.
This wouldn't have worked with the aux bus since the various mlx5 aux device types don't share the same driver, even if they share the same device wrapper struct (mlx5_adev) "which helped to find the parent device"
--- drivers/net/ethernet/mellanox/mlx5/core/dev.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/dev.c +23 -11
@@ -559,18 +559,32 @@ static int _next_phys_dev(struct mlx5_core_dev *mdev,return 1 ; } +static void *pci_get_other_drvdata (struct device *this,struct device *other) +{ +if (this->driver != other->driver) +return NULL ; + +return pci_get_drvdata (to_pci_dev (other)); +} +static int next_phys_dev (struct device *dev,const void *data) { - struct mlx5_adev *madev = container_of(dev, struct mlx5_adev, adev.dev); -struct mlx5_core_dev *mdev = madev->mdev; +struct mlx5_core_dev *mdev, *this = (struct mlx5_core_dev *)data; + + mdev =pci_get_other_drvdata (this->device, dev); +if (!mdev) +return 0 ;return _next_phys_dev (mdev, data); }static int next_phys_dev_lag (struct device *dev,const void *data) { - struct mlx5_adev *madev = container_of(dev, struct mlx5_adev, adev.dev); -struct mlx5_core_dev *mdev = madev->mdev; +struct mlx5_core_dev *mdev, *this = (struct mlx5_core_dev *)data; + + mdev =pci_get_other_drvdata (this->device, dev); +if (!mdev) +return 0 ; if (!MLX5_CAP_GEN(mdev, vport_group_manager) || !MLX5_CAP_GEN(mdev, lag_master) ||
@@ -583,19 +597,17 @@ static int next_phys_dev_lag(struct device *dev, const void *data)static struct mlx5_core_dev *mlx5_get_next_dev (struct mlx5_core_dev *dev,int (*match)(struct device *dev,const void *data)) { -struct auxiliary_device *adev; -struct mlx5_adev *madev; +struct device *next;if (!mlx5_core_is_pf (dev))return NULL ; - adev =auxiliary_find_device (NULL , dev, match); -if (!adev) + next =bus_find_device (&pci_bus_type,NULL , dev, match); +if (!next)return NULL ; - madev = container_of(adev, struct mlx5_adev, adev); -put_device (&adev->dev); -return madev->mdev; +put_device (next); +return pci_get_drvdata (to_pci_dev (next)); }/* Must be called with intf_mutex held */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 156/247 net/mlx5: Rearm the FW tracer after each tracer event
In reply to Greg Kroah-HartmanFrom: Feras Daoud <[email protected]>
[ Upstream commit 8bf94e6414c9481bfa28269022688ab445d0081d ]
The current design does not arm the tracer if traces are available before the tracer string database is fully loaded, leading to an unfunctional tracer. This fix will rearm the tracer every time the FW triggers tracer event regardless of the tracer strings database status.
--- drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c +5 -2
@@ -675,6 +675,9 @@ static void mlx5_fw_tracer_handle_traces(struct work_struct *work)if (!tracer->owner)return ; +if (unlikely (!tracer->str_db.loaded)) + goto arm; + block_count = tracer->buff.size /TRACER_BLOCK_SIZE_BYTE ; start_offset = tracer->buff.consumer_index *TRACER_BLOCK_SIZE_BYTE ;
@@ -732,6 +735,7 @@ static void mlx5_fw_tracer_handle_traces(struct work_struct *work) &tmp_trace_block[TRACES_PER_BLOCK - 1]); } +arm:mlx5_fw_tracer_arm (dev); }
@@ -1137,8 +1141,7 @@ static int fw_tracer_event(struct notifier_block *nb, unsigned long action, voidqueue_work (tracer->work_queue, &tracer->ownership_change_work);break ;case MLX5_TRACER_SUBTYPE_TRACES_AVAILABLE : -if (likely (tracer->str_db.loaded)) -queue_work (tracer->work_queue, &tracer->handle_traces_work); +queue_work (tracer->work_queue, &tracer->handle_traces_work);break ;default : mlx5_core_dbg(dev, "FWTracer: Event with unrecognized subtype: sub_type %d\n",
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 157/247 net/mlx5: fs, fail conflicting actions
In reply to Greg Kroah-HartmanFrom: Mark Bloch <[email protected]>
[ Upstream commit 8fa5e7b20e01042b14f8cd684d2da9b638460c74 ]
When combining two steering rules into one check not only do they share the same actions but those actions are also the same. This resolves an issue where when creating two different rules with the same match the actions are overwritten and one of the rules is deleted a FW syndrome can be seen in dmesg.
mlx5_core 0000:03:00.0: mlx5_cmd_check:819:(pid 2105): DEALLOC_MODIFY_HEADER_CONTEXT(0x941) op_mod(0x0) failed, status bad resource state(0x9), syndrome (0x1ab444)
--- .../net/ethernet/mellanox/mlx5/core/fs_core.c | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +32 -3
@@ -1527,9 +1527,22 @@ static struct mlx5_flow_rule *find_flow_rule(struct fs_fte *fte,return NULL ; } -static bool check_conflicting_actions (u32 action1,u32 action2) +static bool check_conflicting_actions_vlan (const struct mlx5_fs_vlan *vlan0, +const struct mlx5_fs_vlan *vlan1) { -u32 xored_actions = action1 ^ action2; +return vlan0->ethtype != vlan1->ethtype || + vlan0->vid != vlan1->vid || + vlan0->prio != vlan1->prio; +} + +static bool check_conflicting_actions (const struct mlx5_flow_act *act1, +const struct mlx5_flow_act *act2) +{ +u32 action1 = act1->action; +u32 action2 = act2->action; +u32 xored_actions; + + xored_actions = action1 ^ action2;/* if one rule only wants to count, it's ok */ if (action1 == MLX5_FLOW_CONTEXT_ACTION_COUNT ||
@@ -1546,6 +1559,22 @@ static bool check_conflicting_actions(u32 action1, u32 action2) MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2))return true; +if (action1 &MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT && + act1->pkt_reformat != act2->pkt_reformat) +return true; + +if (action1 &MLX5_FLOW_CONTEXT_ACTION_MOD_HDR && + act1->modify_hdr != act2->modify_hdr) +return true; + +if (action1 &MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH && +check_conflicting_actions_vlan (&act1->vlan[0 ], &act2->vlan[0 ])) +return true; + +if (action1 &MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2 && +check_conflicting_actions_vlan (&act1->vlan[1 ], &act2->vlan[1 ])) +return true; +return false; }
@@ -1553,7 +1582,7 @@ static int check_conflicting_ftes(struct fs_fte *fte, const struct mlx5_flow_context *flow_context, const struct mlx5_flow_act *flow_act) { - if (check_conflicting_actions(flow_act->action, fte->action.action)) { + if (check_conflicting_actions(flow_act, &fte->action)) { mlx5_core_warn(get_dev(&fte->node), "Found two FTEs with conflicting actions\n");return -EEXIST ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 158/247 ip_gre: test csum_start instead of transport header
In reply to Greg Kroah-HartmanFrom: Willem de Bruijn <[email protected]>
[ Upstream commit 8d21e9963bec1aad2280cdd034c8993033ef2948 ]
GRE with TUNNEL_CSUM will apply local checksum offload on CHECKSUM_PARTIAL packets.
ipgre_xmit must validate csum_start after an optional skb_pull, else lco_csum may trigger an overflow. The original check was
if (csum && skb_checksum_start(skb) < skb->data) return -EINVAL;
This had false positives when skb_checksum_start is undefined:
when ip_summed is not CHECKSUM_PARTIAL. A discussed refinement was straightforward
if (csum && skb->ip_summed == CHECKSUM_PARTIAL && skb_checksum_start(skb) < skb->data) return -EINVAL;
But was eventually revised more thoroughly:
- restrict the check to the only branch where needed, in an uncommon GRE path that uses header_ops and calls skb_pull.
- test skb_transport_header, which is set along with csum_start in skb_partial_csum_set in the normal header_ops datapath.
Turns out skbs can arrive in this branch without the transport header set, e.g., through BPF redirection.
Revise the check back to check csum_start directly, and only if CHECKSUM_PARTIAL. Do leave the check in the updated location. Check field regardless of whether TUNNEL_CSUM is configured.
--- net/ipv4/ip_gre.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
net/ipv4/ip_gre.c +5 -6
@@ -629,21 +629,20 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, }if (dev->header_ops) { -const int pull_len = tunnel->hlen +sizeof (struct iphdr ); -if (skb_cow_head (skb,0 )) goto free_skb; tnl_params = (const struct iphdr *)skb->data; -if (pull_len >skb_transport_offset (skb)) - goto free_skb; -/* Pull skb since ip_tunnel_xmit() needs skb->data pointing * to gre header. */ -skb_pull (skb, pull_len); +skb_pull (skb, tunnel->hlen +sizeof (struct iphdr ));skb_reset_mac_header (skb); + +if (skb->ip_summed ==CHECKSUM_PARTIAL && +skb_checksum_start (skb) < skb->data) + goto free_skb; }else {if (skb_cow_head (skb, dev->needed_headroom)) goto free_skb;
Signature · 1 line
2.35.1