5.15.58-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.15.58-rc1 review
This is the start of the stable review cycle for the 5.15.58 release. There are 201 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 29 Jul 2022 16:09:50 +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.58-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.58-rc1
Peter Zijlstra <[email protected]>
x86/entry_32: Fix segment exceptions
Dan Carpenter <[email protected]>
drm/amdgpu: Off by one in dm_dmub_outbox1_low_irq()
Jan Beulich <[email protected]>
x86: drop bogus "cc" clobber from __try_cmpxchg_user_asm()
Maxim Levitsky <[email protected]>
KVM: x86: fix typo in __try_cmpxchg_user causing non-atomicness
Nick Desaulniers <[email protected]>
x86/extable: Prefer local labels in .set directives
José Expósito <[email protected]>
drm/amd/display: invalid parameter check in dmub_hpd_callback
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Don't lock connection_mutex for DMUB HPD
Linus Torvalds <[email protected]>
watch-queue: remove spurious double semicolon
Jose Alonso <[email protected]>
net: usb: ax88179_178a needs FLAG_SEND_ZLP
Jiri Slaby <[email protected]>
tty: use new tty_insert_flip_string_and_push_buffer() in pty_write()
Jiri Slaby <[email protected]>
tty: extract tty_flip_buffer_commit() from tty_flip_buffer_push()
Jiri Slaby <[email protected]>
tty: drop tty_schedule_flip()
Jiri Slaby <[email protected]>
tty: the rest, stop using tty_schedule_flip()
Jiri Slaby <[email protected]>
tty: drivers/tty/, stop using tty_schedule_flip()
Linus Torvalds <[email protected]>
watchqueue: make sure to serialize 'wqueue->defunct' properly
Kees Cook <[email protected]>
x86/alternative: Report missing return thunk details
Peter Zijlstra <[email protected]>
x86/amd: Use IBPB for firmware calls
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Fix surface optimization regression on Carrizo
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Optimize bandwidth on following fast update
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Reset DMCUB before HW init
Sungjong Seo <[email protected]>
exfat: use updated exfat_chain directly during renaming
Luiz Augusto von Dentz <[email protected]>
Bluetooth: Fix bt_skb_sendmmsg not allocating partial chunks
Luiz Augusto von Dentz <[email protected]>
Bluetooth: SCO: Fix sco_send_frame returning skb->len
Luiz Augusto von Dentz <[email protected]>
Bluetooth: Fix passing NULL to PTR_ERR
Luiz Augusto von Dentz <[email protected]>
Bluetooth: RFCOMM: Replace use of memcpy_from_msg with bt_skb_sendmmsg
Luiz Augusto von Dentz <[email protected]>
Bluetooth: SCO: Replace use of memcpy_from_msg with bt_skb_sendmsg
Luiz Augusto von Dentz <[email protected]>
Bluetooth: Add bt_skb_sendmmsg helper
Luiz Augusto von Dentz <[email protected]>
Bluetooth: Add bt_skb_sendmsg helper
Johannes Berg <[email protected]>
um: virtio_uml: Fix broken device handling in time-travel
Vincent Whitchurch <[email protected]>
um: virtio_uml: Allow probing from devicetree
Wonhyuk Yang <[email protected]>
tracing: Fix return value of trace_pid_write()
Steven Rostedt (VMware) <[email protected]>
tracing: Place trace_pid_list logic into abstract functions
Steven Rostedt (Google) <[email protected]>
tracing: Have event format check not flag %p* on __get_dynamic_array()
Yuezhang Mo <[email protected]>
exfat: fix referencing wrong parent directory information after renaming
Giovanni Cabiddu <[email protected]>
crypto: qat - re-enable registration of algorithms
Giovanni Cabiddu <[email protected]>
crypto: qat - add param check for DH
Giovanni Cabiddu <[email protected]>
crypto: qat - add param check for RSA
Giovanni Cabiddu <[email protected]>
crypto: qat - remove dma_free_coherent() for DH
Giovanni Cabiddu <[email protected]>
crypto: qat - remove dma_free_coherent() for RSA
Giovanni Cabiddu <[email protected]>
crypto: qat - fix memory leak in RSA
Giovanni Cabiddu <[email protected]>
crypto: qat - add backlog mechanism
Giovanni Cabiddu <[email protected]>
crypto: qat - refactor submission logic
Giovanni Cabiddu <[email protected]>
crypto: qat - use pre-allocated buffers in datapath
Giovanni Cabiddu <[email protected]>
crypto: qat - set to zero DH parameters before free
Johannes Berg <[email protected]>
iwlwifi: fw: uefi: add missing include guards
Felix Fietkau <[email protected]>
mt76: fix use-after-free by removing a non-RCU wcid pointer
Kishon Vijay Abraham I <[email protected]>
xhci: Set HCD flag to defer primary roothub registration
Mathias Nyman <[email protected]>
xhci: dbc: Rename xhci_dbc_init and xhci_dbc_exit
Mathias Nyman <[email protected]>
xhci: dbc: create and remove dbc structure in dbgtty driver.
Mathias Nyman <[email protected]>
xhci: dbc: refactor xhci_dbc_init()
Sean Christopherson <[email protected]>
KVM: x86: Use __try_cmpxchg_user() to emulate atomic accesses
Peter Zijlstra <[email protected]>
x86/futex: Remove .fixup usage
Peter Zijlstra <[email protected]>
x86/msr: Remove .fixup usage
Peter Zijlstra <[email protected]>
x86/extable: Extend extable functionality
Peter Zijlstra <[email protected]>
x86/entry_32: Remove .fixup usage
Peter Zijlstra <[email protected]>
bitfield.h: Fix "type of reg too small for mask" test
Thomas Gleixner <[email protected]>
x86/extable: Provide EX_TYPE_DEFAULT_MCE_SAFE and EX_TYPE_FAULT_MCE_SAFE
Thomas Gleixner <[email protected]>
x86/extable: Rework the exception table mechanics
Thomas Gleixner <[email protected]>
x86/mce: Deduplicate exception handling
Thomas Gleixner <[email protected]>
x86/extable: Get rid of redundant macros
Thomas Gleixner <[email protected]>
x86/extable: Tidy up redundant handler functions
Peter Zijlstra <[email protected]>
x86/uaccess: Implement macros for CMPXCHG on user addresses
Alexander Aring <[email protected]>
dlm: fix pending remove if msg allocation fails
Pawan Gupta <[email protected]>
x86/bugs: Warn when "ibrs" mitigation is selected on Enhanced IBRS parts
Juri Lelli <[email protected]>
sched/deadline: Fix BUG_ON condition for deboosted tasks
Eric Dumazet <[email protected]>
bpf: Make sure mac_header was set before using it
Wang Cheng <[email protected]>
mm/mempolicy: fix uninit-value in mpol_rebind_policy()
Alexey Kardashevskiy <[email protected]>
KVM: Don't null dereference ops->destroy
Marc Kleine-Budde <[email protected]>
spi: bcm2835: bcm2835_spi_handle_err(): fix NULL pointer deref for non DMA transfers
Gavin Shan <[email protected]>
KVM: selftests: Fix target thread to be migrated in rseq_test
Srinivas Neeli <[email protected]>
gpio: gpio-xilinx: Fix integer overflow
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_max_reordering.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_abort_on_overflow.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_rfc1337.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_stdurg.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_retrans_collapse.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_slow_start_after_idle.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_thin_linear_timeouts.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_recovery.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_early_retrans.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl knobs related to SYN option.
Kuniyuki Iwashima <[email protected]>
udp: Fix a data-race around sysctl_udp_l3mdev_accept.
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_prot_sock.
Kuniyuki Iwashima <[email protected]>
ipv4: Fix data-races around sysctl_fib_multipath_hash_fields.
Kuniyuki Iwashima <[email protected]>
ipv4: Fix data-races around sysctl_fib_multipath_hash_policy.
Kuniyuki Iwashima <[email protected]>
ipv4: Fix a data-race around sysctl_fib_multipath_use_neigh.
Liang He <[email protected]>
drm/imx/dcss: Add missing of_node_put() in fail path
Oleksij Rempel <[email protected]>
net: dsa: vitesse-vsc73xx: silent spi_device_id warnings
Oleksij Rempel <[email protected]>
net: dsa: sja1105: silent spi_device_id warnings
Hristo Venev <[email protected]>
be2net: Fix buffer overflow in be_get_module_eeprom
Haibo Chen <[email protected]>
gpio: pca953x: use the correct register address when regcache sync during init
Haibo Chen <[email protected]>
gpio: pca953x: use the correct range when do regmap sync
Haibo Chen <[email protected]>
gpio: pca953x: only use single read/write for No AI mode
Wong Vee Khee <[email protected]>
net: stmmac: remove redunctant disable xPCS EEE call
Piotr Skajewski <[email protected]>
ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero
Dawid Lukwinski <[email protected]>
i40e: Fix erroneous adapter reinitialization during recovery process
Vladimir Oltean <[email protected]>
pinctrl: armada-37xx: use raw spinlocks for regmap to avoid invalid wait context
Andy Shevchenko <[email protected]>
pinctrl: armada-37xx: Convert to use dev_err_probe()
Andy Shevchenko <[email protected]>
pinctrl: armada-37xx: Make use of the devm_platform_ioremap_resource()
Andy Shevchenko <[email protected]>
pinctrl: armada-37xx: Use temporary variable for struct device
Przemyslaw Patynowski <[email protected]>
iavf: Fix handling of dummy receive descriptors
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_fastopen_blackhole_timeout.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_fastopen.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_max_syn_backlog.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_tw_reuse.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_notsent_lowat.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around some timeout sysctl knobs.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_reordering.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_migrate_req.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_syncookies.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_syn(ack)?_retries.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around keepalive sysctl knobs.
Kuniyuki Iwashima <[email protected]>
igmp: Fix data-races around sysctl_igmp_max_msf.
Kuniyuki Iwashima <[email protected]>
igmp: Fix a data-race around sysctl_igmp_max_memberships.
Kuniyuki Iwashima <[email protected]>
igmp: Fix data-races around sysctl_igmp_llm_reports.
Tariq Toukan <[email protected]>
net/tls: Fix race in TLS device down flow
Junxiao Chang <[email protected]>
net: stmmac: fix dma queue left shift overflow issue
Adrian Hunter <[email protected]>
perf tests: Fix Convert perf time to TSC test for hybrid
Robert Hancock <[email protected]>
i2c: cadence: Change large transfer count reset logic to be unconditional
Vadim Pasternak <[email protected]>
i2c: mlxcpld: Fix register setting for 400KHz frequency
Menglong Dong <[email protected]>
net: ipv4: use kfree_skb_reason() in ip_rcv_finish_core()
Menglong Dong <[email protected]>
net: ipv4: use kfree_skb_reason() in ip_rcv_core()
Menglong Dong <[email protected]>
net: netfilter: use kfree_drop_reason() for NF_DROP
Menglong Dong <[email protected]>
net: skb_drop_reason: add document for drop reasons
Menglong Dong <[email protected]>
net: socket: rename SKB_DROP_REASON_SOCKET_FILTER
Menglong Dong <[email protected]>
net: skb: use kfree_skb_reason() in __udp4_lib_rcv()
Menglong Dong <[email protected]>
net: skb: use kfree_skb_reason() in tcp_v4_rcv()
Menglong Dong <[email protected]>
net: skb: introduce kfree_skb_reason()
Liang He <[email protected]>
net: dsa: microchip: ksz_common: Fix refcount leak bug
Sascha Hauer <[email protected]>
mtd: rawnand: gpmi: Set WAIT_FOR_READY timeout based on program/erase times
Dario Binacchi <[email protected]>
mtd: rawnand: gpmi: validate controller clock rate
Biao Huang <[email protected]>
net: stmmac: fix unbalanced ptp clock issue in suspend/resume flow
Biao Huang <[email protected]>
net: stmmac: fix pm runtime issue in stmmac_dvr_remove()
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_probe_interval.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_probe_threshold.
Kuniyuki Iwashima <[email protected]>
tcp: Fix a data-race around sysctl_tcp_mtu_probe_floor.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_min_snd_mss.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_base_mss.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_mtu_probing.
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_l3mdev_accept.
Eric Dumazet <[email protected]>
tcp: sk->sk_bound_dev_if once in inet_request_bound_dev_if()
Kuniyuki Iwashima <[email protected]>
tcp/dccp: Fix a data-race around sysctl_tcp_fwmark_accept.
Kuniyuki Iwashima <[email protected]>
ip: Fix a data-race around sysctl_fwmark_reflect.
Kuniyuki Iwashima <[email protected]>
ip: Fix a data-race around sysctl_ip_autobind_reuse.
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_nonlocal_bind.
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_fwd_update_priority.
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_fwd_use_pmtu.
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_no_pmtu_disc.
Lennert Buytenhek <[email protected]>
igc: Reinstate IGC_REMOVED logic and implement it properly
Sasha Neftin <[email protected]>
Revert "e1000e: Fix possible HW unit hang after an s0ix exit"
Sasha Neftin <[email protected]>
e1000e: Enable GPT clock before sending message to CSME
Israel Rukshin <[email protected]>
nvme: fix block device naming collision
Christoph Hellwig <[email protected]>
nvme: check for duplicate identifiers earlier
Bjorn Andersson <[email protected]>
scsi: ufs: core: Drop loglevel of WriteBoost message
Ming Lei <[email protected]>
scsi: megaraid: Clear READ queue map's nr_queues
Fangzhi Zuo <[email protected]>
drm/amd/display: Ignore First MST Sideband Message Return Error
Alex Deucher <[email protected]>
drm/amdgpu/display: add quirk handling for stutter mode
Wayne Lin <[email protected]>
drm/amd/display: Fork thread to offload work of hpd_rx_irq
Wayne Lin <[email protected]>
drm/amd/display: Add option to defer works of hpd_rx_irq
Jude Shih <[email protected]>
drm/amd/display: Support for DMUB HPD interrupt handling
Kuniyuki Iwashima <[email protected]>
tcp: Fix data-races around sysctl_tcp_ecn.
Xiaoming Ni <[email protected]>
sysctl: move some boundary constants from sysctl.c to sysctl_vals
Suren Baghdasaryan <[email protected]>
mm/pagealloc: sysctl: change watermark_scale_factor max limit to 30%
Dongli Zhang <[email protected]>
net: tun: split run_ebpf_filter() and pskb_trim() into different "if statement"
Eric Dumazet <[email protected]>
ipv4/tcp: do not use per netns ctl sockets
Peter Zijlstra <[email protected]>
perf/core: Fix data race between perf_event_set_output() and perf_mmap_close()
William Dean <[email protected]>
pinctrl: ralink: Check for null return of devm_kcalloc
Arınç ÜNAL <[email protected]>
pinctrl: ralink: rename pinctrl-rt2880 to pinctrl-ralink
Arınç ÜNAL <[email protected]>
pinctrl: ralink: rename MT7628(an) functions to MT76X8
Mustafa Ismail <[email protected]>
RDMA/irdma: Fix sleep from invalid context BUG
Mustafa Ismail <[email protected]>
RDMA/irdma: Do not advertise 1GB page size for x722
Miaoqian Lin <[email protected]>
power/reset: arm-versatile: Fix refcount leak in versatile_reboot_probe
Hangyu Hua <[email protected]>
xfrm: xfrm_policy: fix a possible double xfrm_pols_put() in xfrm_bundle_lookup()
Kuniyuki Iwashima <[email protected]>
ip: Fix data-races around sysctl_ip_default_ttl.
Hayes Wang <[email protected]>
r8152: fix a WOL issue
Dan Carpenter <[email protected]>
xfs: prevent a WARN_ONCE() in xfs_ioc_attr_list()
Brian Foster <[email protected]>
xfs: fix perag reference leak on iteration race with growfs
Brian Foster <[email protected]>
xfs: terminate perag iteration reliably on agcount
Brian Foster <[email protected]>
xfs: rename the next_agno perag iteration variable
Brian Foster <[email protected]>
xfs: fold perag loop iteration logic into helper function
Darrick J. Wong <[email protected]>
xfs: fix maxlevels comparisons in the btree staging code
Christophe JAILLET <[email protected]>
mt76: mt7921: Fix the error handling path of mt7921_pci_probe()
Sean Wang <[email protected]>
mt76: mt7921e: fix possible probe failure after reboot
Sean Wang <[email protected]>
mt76: mt7921: use physical addr to unify register access
Sean Wang <[email protected]>
Revert "mt76: mt7921e: fix possible probe failure after reboot"
Sean Wang <[email protected]>
Revert "mt76: mt7921: Fix the error handling path of mt7921_pci_probe()"
Sebastian Andrzej Siewior <[email protected]>
batman-adv: Use netif_rx_any_context() any.
Pali Rohár <[email protected]>
serial: mvebu-uart: correctly report configured baudrate value
Jeffrey Hugo <[email protected]>
PCI: hv: Fix interrupt mapping for multi-MSI
Jeffrey Hugo <[email protected]>
PCI: hv: Reuse existing IRTE allocation in compose_msi_msg()
Jeffrey Hugo <[email protected]>
PCI: hv: Fix hv_arch_irq_unmask() for multi-MSI
Jeffrey Hugo <[email protected]>
PCI: hv: Fix multi-MSI to allow more than one MSI vector
Oleksandr Tymoshenko <[email protected]>
Revert "selftest/vm: verify mmap addr in mremap_test"
Oleksandr Tymoshenko <[email protected]>
Revert "selftest/vm: verify remap destination address in mremap_test"
Daniele Palmas <[email protected]>
bus: mhi: host: pci_generic: add Telit FN990
Daniele Palmas <[email protected]>
bus: mhi: host: pci_generic: add Telit FN980 v1 hardware revision
Christian König <[email protected]>
drm/ttm: fix locking in vmap/vunmap TTM GEM helpers
Eric Snowberg <[email protected]>
lockdown: Fix kexec lockdown bypass with ima policy
Ido Schimmel <[email protected]>
mlxsw: spectrum_router: Fix IPv4 nexthop gateway indication
Ben Dooks <[email protected]>
riscv: add as-options for modules with assembly compontents
Fabien Dessenne <[email protected]>
pinctrl: stm32: fix optional IRQ support to gpios
-------------
Diffstat:
Documentation/admin-guide/sysctl/vm.rst | 2 +-
Makefile | 4 +-
arch/alpha/kernel/srmcons.c | 2 +-
arch/riscv/Makefile | 1 +
arch/um/drivers/virtio_uml.c | 81 +++-
arch/x86/entry/entry_32.S | 35 +-
arch/x86/include/asm/asm.h | 85 ++--
arch/x86/include/asm/cpufeatures.h | 1 +
arch/x86/include/asm/extable.h | 44 +-
arch/x86/include/asm/extable_fixup_types.h | 58 +++
arch/x86/include/asm/fpu/internal.h | 4 +-
arch/x86/include/asm/futex.h | 28 +-
arch/x86/include/asm/insn-eval.h | 2 +
arch/x86/include/asm/mshyperv.h | 7 -
arch/x86/include/asm/msr.h | 30 +-
arch/x86/include/asm/nospec-branch.h | 2 +
arch/x86/include/asm/segment.h | 2 +-
arch/x86/include/asm/uaccess.h | 142 +++++++
arch/x86/kernel/alternative.c | 4 +-
arch/x86/kernel/cpu/bugs.c | 14 +-
arch/x86/kernel/cpu/mce/core.c | 40 +-
arch/x86/kernel/cpu/mce/internal.h | 10 -
arch/x86/kernel/cpu/mce/severity.c | 23 +-
arch/x86/kvm/x86.c | 35 +-
arch/x86/lib/insn-eval.c | 71 ++--
arch/x86/mm/extable.c | 193 +++++----
arch/x86/net/bpf_jit_comp.c | 11 +-
drivers/accessibility/speakup/spk_ttyio.c | 4 +-
drivers/bus/mhi/pci_generic.c | 79 ++++
drivers/crypto/qat/qat_4xxx/adf_drv.c | 7 -
drivers/crypto/qat/qat_common/Makefile | 1 +
drivers/crypto/qat/qat_common/adf_transport.c | 11 +
drivers/crypto/qat/qat_common/adf_transport.h | 1 +
.../crypto/qat/qat_common/adf_transport_internal.h | 1 +
drivers/crypto/qat/qat_common/qat_algs.c | 138 ++++---
drivers/crypto/qat/qat_common/qat_algs_send.c | 86 ++++
drivers/crypto/qat/qat_common/qat_algs_send.h | 11 +
drivers/crypto/qat/qat_common/qat_asym_algs.c | 304 +++++++-------
drivers/crypto/qat/qat_common/qat_crypto.c | 10 +-
drivers/crypto/qat/qat_common/qat_crypto.h | 39 ++
drivers/gpio/gpio-pca953x.c | 22 +-
drivers/gpio/gpio-xilinx.c | 2 +-
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 446 +++++++++++++++++++--
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 97 ++++-
.../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 17 +
drivers/gpu/drm/amd/display/dc/core/dc.c | 24 +-
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 89 ++--
drivers/gpu/drm/amd/display/dc/dc_link.h | 9 +-
drivers/gpu/drm/drm_gem_ttm_helper.c | 9 +-
drivers/gpu/drm/imx/dcss/dcss-dev.c | 3 +
drivers/i2c/busses/i2c-cadence.c | 30 +-
drivers/i2c/busses/i2c-mlxcpld.c | 2 +-
drivers/infiniband/hw/irdma/cm.c | 50 ---
drivers/infiniband/hw/irdma/i40iw_hw.c | 1 +
drivers/infiniband/hw/irdma/icrdma_hw.c | 1 +
drivers/infiniband/hw/irdma/irdma.h | 1 +
drivers/infiniband/hw/irdma/verbs.c | 4 +-
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 28 +-
drivers/net/dsa/microchip/ksz_common.c | 5 +-
drivers/net/dsa/sja1105/sja1105_main.c | 16 +
drivers/net/dsa/vitesse-vsc73xx-spi.c | 10 +
.../chelsio/inline_crypto/chtls/chtls_cm.c | 8 +-
drivers/net/ethernet/emulex/benet/be_cmds.c | 10 +-
drivers/net/ethernet/emulex/benet/be_cmds.h | 2 +-
drivers/net/ethernet/emulex/benet/be_ethtool.c | 31 +-
drivers/net/ethernet/intel/e1000e/hw.h | 1 -
drivers/net/ethernet/intel/e1000e/ich8lan.c | 4 -
drivers/net/ethernet/intel/e1000e/ich8lan.h | 1 -
drivers/net/ethernet/intel/e1000e/netdev.c | 30 +-
drivers/net/ethernet/intel/i40e/i40e_main.c | 13 +-
drivers/net/ethernet/intel/iavf/iavf_txrx.c | 5 +-
drivers/net/ethernet/intel/igc/igc_main.c | 3 +
drivers/net/ethernet/intel/igc/igc_regs.h | 5 +-
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 +
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 6 +
.../net/ethernet/mellanox/mlxsw/spectrum_router.c | 9 +-
drivers/net/ethernet/netronome/nfp/flower/action.c | 2 +-
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 3 +
.../net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 8 -
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 22 +-
.../net/ethernet/stmicro/stmmac/stmmac_platform.c | 8 +-
drivers/net/tun.c | 5 +-
drivers/net/usb/ax88179_178a.c | 20 +-
drivers/net/usb/r8152.c | 16 +-
drivers/net/wireless/intel/iwlwifi/fw/uefi.h | 5 +-
drivers/net/wireless/mediatek/mt76/mac80211.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt76.h | 2 +-
drivers/net/wireless/mediatek/mt76/mt7603/main.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt7615/main.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 4 +-
drivers/net/wireless/mediatek/mt76/mt7915/main.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt7921/main.c | 2 +-
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 30 +-
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 1 +
drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 30 +-
drivers/net/wireless/mediatek/mt76/mt7921/regs.h | 22 +-
drivers/net/wireless/mediatek/mt76/tx.c | 9 +-
drivers/nvme/host/core.c | 19 +-
drivers/pci/controller/pci-hyperv.c | 106 ++++-
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 97 +++--
drivers/pinctrl/ralink/Kconfig | 16 +-
drivers/pinctrl/ralink/Makefile | 2 +-
drivers/pinctrl/ralink/pinctrl-mt7620.c | 252 ++++++------
drivers/pinctrl/ralink/pinctrl-mt7621.c | 30 +-
.../ralink/{pinctrl-rt2880.c => pinctrl-ralink.c} | 92 ++---
.../pinctrl/ralink/{pinmux.h => pinctrl-ralink.h} | 16 +-
drivers/pinctrl/ralink/pinctrl-rt288x.c | 20 +-
drivers/pinctrl/ralink/pinctrl-rt305x.c | 44 +-
drivers/pinctrl/ralink/pinctrl-rt3883.c | 28 +-
drivers/pinctrl/stm32/pinctrl-stm32.c | 18 +-
drivers/power/reset/arm-versatile-reboot.c | 1 +
drivers/s390/char/keyboard.h | 4 +-
drivers/scsi/megaraid/megaraid_sas_base.c | 3 +
drivers/scsi/ufs/ufshcd.c | 2 +-
drivers/spi/spi-bcm2835.c | 12 +-
drivers/tty/goldfish.c | 2 +-
drivers/tty/moxa.c | 4 +-
drivers/tty/pty.c | 14 +-
drivers/tty/serial/lpc32xx_hs.c | 2 +-
drivers/tty/serial/mvebu-uart.c | 25 +-
drivers/tty/tty.h | 3 +
drivers/tty/tty_buffer.c | 66 ++-
drivers/tty/vt/keyboard.c | 6 +-
drivers/tty/vt/vt.c | 2 +-
drivers/usb/host/xhci-dbgcap.c | 135 +++----
drivers/usb/host/xhci-dbgcap.h | 13 +-
drivers/usb/host/xhci-dbgtty.c | 22 +-
drivers/usb/host/xhci.c | 6 +-
fs/dlm/lock.c | 3 +-
fs/exfat/namei.c | 31 +-
fs/proc/proc_sysctl.c | 2 +-
fs/xfs/libxfs/xfs_ag.h | 36 +-
fs/xfs/libxfs/xfs_btree_staging.c | 4 +-
fs/xfs/xfs_ioctl.c | 2 +-
fs/xfs/xfs_ioctl.h | 5 +-
include/linux/bitfield.h | 19 +-
include/linux/skbuff.h | 47 ++-
include/linux/sysctl.h | 13 +-
include/linux/tty_flip.h | 1 -
include/net/bluetooth/bluetooth.h | 65 +++
include/net/inet_hashtables.h | 2 +-
include/net/inet_sock.h | 12 +-
include/net/ip.h | 6 +-
include/net/netns/ipv4.h | 1 -
include/net/route.h | 2 +-
include/net/tcp.h | 18 +-
include/net/udp.h | 2 +-
include/trace/events/skb.h | 48 ++-
kernel/bpf/core.c | 8 +-
kernel/events/core.c | 45 ++-
kernel/sched/deadline.c | 5 +-
kernel/sysctl.c | 44 +-
kernel/trace/Makefile | 1 +
kernel/trace/ftrace.c | 6 +-
kernel/trace/pid_list.c | 160 ++++++++
kernel/trace/pid_list.h | 13 +
kernel/trace/trace.c | 84 ++--
kernel/trace/trace.h | 14 +-
kernel/trace/trace_events.c | 13 +-
kernel/watch_queue.c | 53 ++-
mm/mempolicy.c | 2 +-
net/batman-adv/bridge_loop_avoidance.c | 2 +-
net/bluetooth/rfcomm/core.c | 50 ++-
net/bluetooth/rfcomm/sock.c | 46 +--
net/bluetooth/sco.c | 30 +-
net/core/dev.c | 3 +-
net/core/drop_monitor.c | 10 +-
net/core/filter.c | 4 +-
net/core/secure_seq.c | 4 +-
net/core/skbuff.c | 12 +-
net/core/sock_reuseport.c | 4 +-
net/ipv4/af_inet.c | 4 +-
net/ipv4/fib_semantics.c | 2 +-
net/ipv4/icmp.c | 2 +-
net/ipv4/igmp.c | 25 +-
net/ipv4/inet_connection_sock.c | 5 +-
net/ipv4/ip_forward.c | 2 +-
net/ipv4/ip_input.c | 26 +-
net/ipv4/ip_sockglue.c | 8 +-
net/ipv4/netfilter/nf_reject_ipv4.c | 4 +-
net/ipv4/proc.c | 2 +-
net/ipv4/route.c | 10 +-
net/ipv4/syncookies.c | 11 +-
net/ipv4/sysctl_net_ipv4.c | 8 +-
net/ipv4/tcp.c | 13 +-
net/ipv4/tcp_fastopen.c | 9 +-
net/ipv4/tcp_input.c | 53 ++-
net/ipv4/tcp_ipv4.c | 77 ++--
net/ipv4/tcp_metrics.c | 3 +-
net/ipv4/tcp_minisocks.c | 4 +-
net/ipv4/tcp_output.c | 31 +-
net/ipv4/tcp_recovery.c | 6 +-
net/ipv4/tcp_timer.c | 30 +-
net/ipv4/udp.c | 10 +-
net/ipv6/af_inet6.c | 2 +-
net/ipv6/syncookies.c | 3 +-
net/netfilter/core.c | 3 +-
net/netfilter/nf_synproxy_core.c | 2 +-
net/sctp/protocol.c | 2 +-
net/smc/smc_llc.c | 2 +-
net/tls/tls_device.c | 8 +-
net/xfrm/xfrm_policy.c | 5 +-
net/xfrm/xfrm_state.c | 2 +-
scripts/sorttable.c | 4 +-
security/integrity/ima/ima_policy.c | 4 +
tools/perf/tests/perf-time-to-tsc.c | 18 +-
tools/testing/selftests/kvm/rseq_test.c | 8 +-
tools/testing/selftests/vm/mremap_test.c | 53 ---
virt/kvm/kvm_main.c | 5 +-
210 files changed, 3381 insertions(+), 1897 deletions(-)Greg Kroah-Hartman
maintainerPATCH 1/201 pinctrl: stm32: fix optional IRQ support to gpios
From: Fabien Dessenne <[email protected]>
commit a1d4ef1adf8bbd302067534ead671a94759687ed upstream.
To act as an interrupt controller, a gpio bank relies on the "interrupt-parent" of the pin controller.
When this optional "interrupt-parent" misses, do not create any IRQ domain.
This fixes a "NULL pointer in stm32_gpio_domain_alloc()" kernel crash when the interrupt-parent = <exti> property is not declared in the Device Tree.
--- drivers/pinctrl/stm32/pinctrl-stm32.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/pinctrl/stm32/pinctrl-stm32.c +12 -8
@@ -1299,15 +1299,17 @@ static int stm32_gpiolib_register_bank(s bank->bank_ioport_nr = bank_ioport_nr;spin_lock_init (&bank->lock); -/* create irq hierarchical domain */ - bank->fwnode =of_node_to_fwnode (np); +if (pctl->domain) { +/* create irq hierarchical domain */ + bank->fwnode =of_node_to_fwnode (np); + + bank->domain =irq_domain_create_hierarchy (pctl->domain,0 ,STM32_GPIO_IRQ_LINE , + bank->fwnode, &stm32_gpio_domain_ops, + bank); - bank->domain =irq_domain_create_hierarchy (pctl->domain,0 , -STM32_GPIO_IRQ_LINE , bank->fwnode, - &stm32_gpio_domain_ops, bank); - -if (!bank->domain) -return -ENODEV ; +if (!bank->domain) +return -ENODEV ; + } err =gpiochip_add_data (&bank->gpio_chip, bank);if (err) {
@@ -1477,6 +1479,8 @@ int stm32_pctl_probe(struct platform_dev pctl->domain =stm32_pctrl_get_irq_domain (np);if (IS_ERR (pctl->domain))return PTR_ERR (pctl->domain); +if (!pctl->domain) +dev_warn (dev,"pinctrl without interrupt support\n" );/* hwspinlock is optional */ hwlock_id =of_hwspin_lock_get_id (pdev->dev.of_node,0 );
Greg Kroah-Hartman
maintainerPATCH 2/201 riscv: add as-options for modules with assembly compontents
In reply to Greg Kroah-HartmanFrom: Ben Dooks <[email protected]>
commit c1f6eff304e4dfa4558b6a8c6b2d26a91db6c998 upstream.
When trying to load modules built for RISC-V which include assembly files the kernel loader errors with "unexpected relocation type 'R_RISCV_ALIGN'" due to R_RISCV_ALIGN relocations being generated by the assembler.
The R_RISCV_ALIGN relocations can be removed at the expense of code space by adding -mno-relax to gcc and as. In commit 7a8e7da42250138 ("RISC-V: Fixes to module loading") -mno-relax is added to the build variable KBUILD_CFLAGS_MODULE. See [1] for more info.
The issue is that when kbuild builds a .S file, it invokes gcc with the -mno-relax flag, but this is not being passed through to the assembler. Adding -Wa,-mno-relax to KBUILD_AFLAGS_MODULE ensures that the assembler is invoked correctly. This may have now been fixed in gcc[2] and this addition should not stop newer gcc and as from working.
[1] https://github.com/riscv/riscv-elf-psabi-doc/issues/183
[2] https://github.com/gcc-mirror/gcc/commit/3b0a7d624e64eeb81e4d5e8c62c46d86ef521857
--- arch/riscv/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/riscv/Makefile +1 -0
@@ -75,6 +75,7 @@ ifeq ($(CONFIG_PERF_EVENTS),y) endif KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-relax) +KBUILD_AFLAGS_MODULE += $(call as-option,-Wa$(comma)-mno-relax) # GCC versions that support the "-mstrict-align" option default to allowing # unaligned accesses. While unaligned accesses are explicitly allowed in the
Greg Kroah-Hartman
maintainerPATCH 3/201 mlxsw: spectrum_router: Fix IPv4 nexthop gateway indication
In reply to Greg Kroah-HartmanFrom: Ido Schimmel <[email protected]>
commit e5ec6a2513383fe2ecc2ee3b5f51d97acbbcd4d8 upstream.
mlxsw needs to distinguish nexthops with a gateway from connected nexthops in order to write the former to the adjacency table of the device. The check used to rely on the fact that nexthops with a gateway have a 'link' scope whereas connected nexthops have a 'host' scope. This is no longer correct after commit 747c14307214 ("ip: fix dflt addr selection for connected nexthop").
Fix that by instead checking the address family of the gateway IP. This is a more direct way and also consistent with the IPv6 counterpart in mlxsw_sp_rt6_is_gateway().
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +1 -1
@@ -5196,7 +5196,7 @@ static bool mlxsw_sp_fi_is_gateway(const {const struct fib_nh *nh =fib_info_nh (fi,0 ); -return nh->fib_nh_scope ==RT_SCOPE_LINK || +return nh->fib_nh_gw_family ||mlxsw_sp_nexthop4_ipip_type (mlxsw_sp, nh,NULL ); }
Greg Kroah-Hartman
maintainerPATCH 4/201 lockdown: Fix kexec lockdown bypass with ima policy
In reply to Greg Kroah-HartmanFrom: Eric Snowberg <[email protected]>
commit 543ce63b664e2c2f9533d089a4664b559c3e6b5b upstream.
The lockdown LSM is primarily used in conjunction with UEFI Secure Boot. This LSM may also be used on machines without UEFI. It can also be enabled when UEFI Secure Boot is disabled. One of lockdown's features is to prevent kexec from loading untrusted kernels. Lockdown can be enabled through a bootparam or after the kernel has booted through securityfs.
If IMA appraisal is used with the "ima_appraise=log" boot param, lockdown can be defeated with kexec on any machine when Secure Boot is disabled or unavailable. IMA prevents setting "ima_appraise=log" from the boot param when Secure Boot is enabled, but this does not cover cases where lockdown is used without Secure Boot.
To defeat lockdown, boot without Secure Boot and add ima_appraise=log to the kernel command line; then:
$ echo "integrity" > /sys/kernel/security/lockdown
$ echo "appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig" > \
/sys/kernel/security/ima/policy
$ kexec -ls unsigned-kernelAdd a call to verify ima appraisal is set to "enforce" whenever lockdown is enabled. This fixes CVE-2022-21505.
--- security/integrity/ima/ima_policy.c | 4 ++++ 1 file changed, 4 insertions(+)
security/integrity/ima/ima_policy.c +4 -0
@@ -2034,6 +2034,10 @@ bool ima_appraise_signature(enum kernel_if (id >=READING_MAX_ID )return false; +if (id ==READING_KEXEC_IMAGE && !(ima_appraise &IMA_APPRAISE_ENFORCE ) + &&security_locked_down (LOCKDOWN_KEXEC )) +return false; + func = read_idmap[id] ?:FILE_CHECK ;rcu_read_lock ();
Greg Kroah-Hartman
maintainerPATCH 5/201 drm/ttm: fix locking in vmap/vunmap TTM GEM helpers
In reply to Greg Kroah-HartmanFrom: Christian König <[email protected]>
commit dbd0da2453c694f2f74651834d90fb280b57f151 upstream.
I've stumbled over this while reviewing patches for DMA-buf and it looks like we completely messed the locking up here.
In general most TTM function should only be called while holding the appropriate BO resv lock. Without this we could break the internal buffer object state here.
Only compile tested!
--- drivers/gpu/drm/drm_gem_ttm_helper.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_gem_ttm_helper.c +8 -1
@@ -64,8 +64,13 @@ int drm_gem_ttm_vmap(struct drm_gem_obje struct dma_buf_map *map) {struct ttm_buffer_object *bo =drm_gem_ttm_of_gem (gem); +int ret; -return ttm_bo_vmap (bo, map); +dma_resv_lock (gem->resv,NULL ); + ret =ttm_bo_vmap (bo, map); +dma_resv_unlock (gem->resv); + +return ret; }EXPORT_SYMBOL (drm_gem_ttm_vmap);
@@ -82,7 +87,9 @@ void drm_gem_ttm_vunmap(struct drm_gem_o {struct ttm_buffer_object *bo =drm_gem_ttm_of_gem (gem); +dma_resv_lock (gem->resv,NULL );ttm_bo_vunmap (bo, map); +dma_resv_unlock (gem->resv); }EXPORT_SYMBOL (drm_gem_ttm_vunmap);
Greg Kroah-Hartman
maintainerPATCH 6/201 bus: mhi: host: pci_generic: add Telit FN980 v1 hardware revision
In reply to Greg Kroah-HartmanFrom: Daniele Palmas <[email protected]>
commit a96ef8b504efb2ad445dfb6d54f9488c3ddf23d2 upstream.
Add Telit FN980 v1 hardware revision:
01:00.0 Unassigned class [ff00]: Qualcomm Device [17cb:0306]
Subsystem: Device [1c5d:2000]
--- drivers/bus/mhi/pci_generic.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
drivers/bus/mhi/pci_generic.c +38 -0
@@ -406,7 +406,45 @@ static const struct mhi_pci_dev_info mhi .mru_default = 32768, }; +static const struct mhi_channel_config mhi_telit_fn980_hw_v1_channels[] = { +MHI_CHANNEL_CONFIG_UL (14 ,"QMI" ,32 ,0 ), +MHI_CHANNEL_CONFIG_DL (15 ,"QMI" ,32 ,0 ), +MHI_CHANNEL_CONFIG_UL (20 ,"IPCR" ,16 ,0 ), +MHI_CHANNEL_CONFIG_DL_AUTOQUEUE (21 ,"IPCR" ,16 ,0 ), +MHI_CHANNEL_CONFIG_HW_UL (100 ,"IP_HW0" ,128 ,1 ), +MHI_CHANNEL_CONFIG_HW_DL (101 ,"IP_HW0" ,128 ,2 ), +}; + +static struct mhi_event_config mhi_telit_fn980_hw_v1_events[] = { +MHI_EVENT_CONFIG_CTRL (0 ,128 ), +MHI_EVENT_CONFIG_HW_DATA (1 ,1024 ,100 ), +MHI_EVENT_CONFIG_HW_DATA (2 ,2048 ,101 ) +}; + +static struct mhi_controller_config modem_telit_fn980_hw_v1_config = { + .max_channels =128 , + .timeout_ms =20000 , + .num_channels =ARRAY_SIZE (mhi_telit_fn980_hw_v1_channels), + .ch_cfg = mhi_telit_fn980_hw_v1_channels, + .num_events =ARRAY_SIZE (mhi_telit_fn980_hw_v1_events), + .event_cfg = mhi_telit_fn980_hw_v1_events, +}; + +static const struct mhi_pci_dev_info mhi_telit_fn980_hw_v1_info = { + .name ="telit-fn980-hwv1" , + .fw ="qcom/sdx55m/sbl1.mbn" , + .edl ="qcom/sdx55m/edl.mbn" , + .config = &modem_telit_fn980_hw_v1_config, + .bar_num =MHI_PCI_DEFAULT_BAR_NUM , + .dma_data_width =32 , + .mru_default =32768 , + .sideband_wake = false, +}; +static const struct pci_device_id mhi_pci_id_table[] = { +/* Telit FN980 hardware revision v1 */ + {PCI_DEVICE_SUB (PCI_VENDOR_ID_QCOM ,0x0306 ,0x1C5D ,0x2000 ), + .driver_data = (kernel_ulong_t) &mhi_telit_fn980_hw_v1_info }, {PCI_DEVICE (PCI_VENDOR_ID_QCOM ,0x0306 ), .driver_data = (kernel_ulong_t) &mhi_qcom_sdx55_info }, {PCI_DEVICE (PCI_VENDOR_ID_QCOM ,0x0304 ),
Greg Kroah-Hartman
maintainerPATCH 7/201 bus: mhi: host: pci_generic: add Telit FN990
In reply to Greg Kroah-HartmanFrom: Daniele Palmas <[email protected]>
commit 77fc41204734042861210b9d05338c9b8360affb upstream.
Add Telit FN990:
01:00.0 Unassigned class [ff00]: Qualcomm Device 0308
Subsystem: Device 1c5d:2010
--- drivers/bus/mhi/pci_generic.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
drivers/bus/mhi/pci_generic.c +41 -0
@@ -441,6 +441,44 @@ static const struct mhi_pci_dev_info mhi .sideband_wake = false, }; +static const struct mhi_channel_config mhi_telit_fn990_channels[] = { +MHI_CHANNEL_CONFIG_UL_SBL (2 ,"SAHARA" ,32 ,0 ), +MHI_CHANNEL_CONFIG_DL_SBL (3 ,"SAHARA" ,32 ,0 ), +MHI_CHANNEL_CONFIG_UL (4 ,"DIAG" ,64 ,1 ), +MHI_CHANNEL_CONFIG_DL (5 ,"DIAG" ,64 ,1 ), +MHI_CHANNEL_CONFIG_UL (12 ,"MBIM" ,32 ,0 ), +MHI_CHANNEL_CONFIG_DL (13 ,"MBIM" ,32 ,0 ), +MHI_CHANNEL_CONFIG_UL (32 ,"DUN" ,32 ,0 ), +MHI_CHANNEL_CONFIG_DL (33 ,"DUN" ,32 ,0 ), +MHI_CHANNEL_CONFIG_HW_UL (100 ,"IP_HW0_MBIM" ,128 ,2 ), +MHI_CHANNEL_CONFIG_HW_DL (101 ,"IP_HW0_MBIM" ,128 ,3 ), +}; + +static struct mhi_event_config mhi_telit_fn990_events[] = { +MHI_EVENT_CONFIG_CTRL (0 ,128 ), +MHI_EVENT_CONFIG_DATA (1 ,128 ), +MHI_EVENT_CONFIG_HW_DATA (2 ,1024 ,100 ), +MHI_EVENT_CONFIG_HW_DATA (3 ,2048 ,101 ) +}; + +static const struct mhi_controller_config modem_telit_fn990_config = { + .max_channels =128 , + .timeout_ms =20000 , + .num_channels =ARRAY_SIZE (mhi_telit_fn990_channels), + .ch_cfg = mhi_telit_fn990_channels, + .num_events =ARRAY_SIZE (mhi_telit_fn990_events), + .event_cfg = mhi_telit_fn990_events, +}; + +static const struct mhi_pci_dev_info mhi_telit_fn990_info = { + .name ="telit-fn990" , + .config = &modem_telit_fn990_config, + .bar_num =MHI_PCI_DEFAULT_BAR_NUM , + .dma_data_width =32 , + .sideband_wake = false, + .mru_default =32768 , +}; +static const struct pci_device_id mhi_pci_id_table[] = {/* Telit FN980 hardware revision v1 */ {PCI_DEVICE_SUB (PCI_VENDOR_ID_QCOM ,0x0306 ,0x1C5D ,0x2000 ),
@@ -449,6 +487,9 @@ static const struct pci_device_id mhi_pc .driver_data = (kernel_ulong_t) &mhi_qcom_sdx55_info }, { PCI_DEVICE(PCI_VENDOR_ID_QCOM, 0x0304), .driver_data = (kernel_ulong_t) &mhi_qcom_sdx24_info }, +/* Telit FN990 */ + { PCI_DEVICE_SUB(PCI_VENDOR_ID_QCOM, 0x0308, 0x1c5d, 0x2010), + .driver_data = (kernel_ulong_t) &mhi_telit_fn990_info }, { PCI_DEVICE(0x1eac, 0x1001), /* EM120R-GL (sdx24) */ .driver_data = (kernel_ulong_t) &mhi_quectel_em1xx_info }, { PCI_DEVICE(0x1eac, 0x1002), /* EM160R-GL (sdx24) */
Greg Kroah-Hartman
maintainerPATCH 8/201 Revert "selftest/vm: verify remap destination address in mremap_test"
In reply to Greg Kroah-HartmanFrom: Oleksandr Tymoshenko <[email protected]>
This reverts commit 0b4e16093e081a3ab08b0d6cedf79b249f41b248.
The upstream commit 18d609daa546 ("selftest/vm: verify remap destination address in mremap_test") was backported as commit 2688d967ec65 ("selftest/vm: verify remap destination address in mremap_test"). Repeated backport introduced the duplicate of function is_remap_region_valid to the file breakign the vm selftest build.
--- tools/testing/selftests/vm/mremap_test.c | 24 ------------------------ 1 file changed, 24 deletions(-)
tools/testing/selftests/vm/mremap_test.c +0 -24
@@ -66,30 +66,6 @@ enum { .expect_failure = should_fail \ } -/* -* Returns false if the requested remap region overlaps with an -* existing mapping (e.g text, stack) else returns true. -*/ -static bool is_remap_region_valid (void *addr,unsigned long long size) -{ -void *remap_addr =NULL ; -bool ret = true; - -/* Use MAP_FIXED_NOREPLACE flag to ensure region is not mapped */ - remap_addr =mmap (addr, size,PROT_READ |PROT_WRITE , -MAP_FIXED_NOREPLACE |MAP_ANONYMOUS |MAP_SHARED , --1 ,0 ); - -if (remap_addr ==MAP_FAILED ) { -if (errno ==EEXIST ) - ret = false; - }else { -munmap (remap_addr, size); - } - -return ret; -} -/* Returns mmap_min_addr sysctl tunable from procfs */ static unsigned long long get_mmap_min_addr (void ) {
Greg Kroah-Hartman
maintainerPATCH 9/201 Revert "selftest/vm: verify mmap addr in mremap_test"
In reply to Greg Kroah-HartmanFrom: Oleksandr Tymoshenko <[email protected]>
This reverts commit e8b9989597daac896b3400b7005f24bf15233d9a.
The upstream commit 9c85a9bae267 ("selftest/vm: verify mmap addr in mremap_test") was backported as commit a17404fcbfd0 ("selftest/vm:
verify mmap addr in mremap_test"). Repeated backport introduced the duplicate of function get_mmap_min_addr to the file breakign the vm selftest build.
--- tools/testing/selftests/vm/mremap_test.c | 29 ----------------------------- 1 file changed, 29 deletions(-)
tools/testing/selftests/vm/mremap_test.c +0 -29
@@ -66,35 +66,6 @@ enum { .expect_failure = should_fail \ } -/* Returns mmap_min_addr sysctl tunable from procfs */ -static unsigned long long get_mmap_min_addr (void ) -{ -FILE *fp; -int n_matched; -static unsigned long long addr; - -if (addr) -return addr; - - fp =fopen ("/proc/sys/vm/mmap_min_addr" ,"r" ); -if (fp ==NULL ) { -ksft_print_msg ("Failed to open /proc/sys/vm/mmap_min_addr: %s\n" , -strerror (errno)); -exit (KSFT_SKIP ); - } - - n_matched =fscanf (fp,"%llu" , &addr); -if (n_matched !=1 ) { -ksft_print_msg ("Failed to read /proc/sys/vm/mmap_min_addr: %s\n" , -strerror (errno)); -fclose (fp); -exit (KSFT_SKIP ); - } - -fclose (fp); -return addr; -} -/* * Returns false if the requested remap region overlaps with an * existing mapping (e.g text, stack) else returns true.
Greg Kroah-Hartman
maintainerPATCH 10/201 PCI: hv: Fix multi-MSI to allow more than one MSI vector
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
commit 08e61e861a0e47e5e1a3fb78406afd6b0cea6b6d upstream.
If the allocation of multiple MSI vectors for multi-MSI fails in the core PCI framework, the framework will retry the allocation as a single MSI vector, assuming that meets the min_vecs specified by the requesting driver.
Hyper-V advertises that multi-MSI is supported, but reuses the VECTOR domain to implement that for x86. The VECTOR domain does not support multi-MSI, so the alloc will always fail and fallback to a single MSI allocation.
In short, Hyper-V advertises a capability it does not implement.
Hyper-V can support multi-MSI because it coordinates with the hypervisor to map the MSIs in the IOMMU's interrupt remapper, which is something the VECTOR domain does not have. Therefore the fix is simple - copy what the x86 IOMMU drivers (AMD/Intel-IR) do by removing X86_IRQ_ALLOC_CONTIGUOUS_VECTORS after calling the VECTOR domain's pci_msi_prepare().
5.15 backport - adds the hv_msi_prepare wrapper function
--- drivers/pci/controller/pci-hyperv.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
drivers/pci/controller/pci-hyperv.c +16 -1
@@ -1204,6 +1204,21 @@ static void hv_irq_mask(struct irq_datapci_msi_mask_irq (data); } +static int hv_msi_prepare (struct irq_domain *domain,struct device *dev, +int nvec,msi_alloc_info_t *info) +{ +int ret =pci_msi_prepare (domain, dev, nvec, info); + +/* +* By using the interrupt remapper in the hypervisor IOMMU, contiguous +* CPU vectors is not needed for multi-MSI +*/ +if (info->type ==X86_IRQ_ALLOC_TYPE_PCI_MSI ) + info->flags &= ~X86_IRQ_ALLOC_CONTIGUOUS_VECTORS ; + +return ret; +} +/** * hv_irq_unmask() - "Unmask" the IRQ by setting its current * affinity.
@@ -1601,7 +1616,7 @@ static struct irq_chip hv_msi_irq_chip = };static struct msi_domain_ops hv_msi_ops = { - .msi_prepare = pci_msi_prepare, + .msi_prepare = hv_msi_prepare, .msi_free = hv_msi_free, };
Greg Kroah-Hartman
maintainerPATCH 11/201 PCI: hv: Fix hv_arch_irq_unmask() for multi-MSI
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
commit 455880dfe292a2bdd3b4ad6a107299fce610e64b upstream.
In the multi-MSI case, hv_arch_irq_unmask() will only operate on the first MSI of the N allocated. This is because only the first msi_desc is cached and it is shared by all the MSIs of the multi-MSI block. This means that hv_arch_irq_unmask() gets the correct address, but the wrong data (always 0).
This can break MSIs.
Lets assume MSI0 is vector 34 on CPU0, and MSI1 is vector 33 on CPU0.
hv_arch_irq_unmask() is called on MSI0. It uses a hypercall to configure the MSI address and data (0) to vector 34 of CPU0. This is correct. Then hv_arch_irq_unmask is called on MSI1. It uses another hypercall to configure the MSI address and data (0) to vector 33 of CPU0. This is wrong, and results in both MSI0 and MSI1 being routed to vector 33. Linux will observe extra instances of MSI1 and no instances of MSI0 despite the endpoint device behaving correctly.
For the multi-MSI case, we need unique address and data info for each MSI, but the cached msi_desc does not provide that. However, that information can be gotten from the int_desc cached in the chip_data by compose_msi_msg(). Fix the multi-MSI case to use that cached information instead. Since hv_set_msi_entry_from_desc() is no longer applicable, remove it.
5.15 backport - no changes to code, but merge conflict due to refactor.
--- arch/x86/include/asm/mshyperv.h | 7 ------- drivers/pci/controller/pci-hyperv.c | 5 ++++- 2 files changed, 4 insertions(+), 8 deletions(-)
arch/x86/include/asm/mshyperv.h +0 -7
@@ -176,13 +176,6 @@ bool hv_vcpu_is_preempted(int vcpu);static inline void hv_apic_init (void ) {}#endif -static inline void hv_set_msi_entry_from_desc (union hv_msi_entry *msi_entry, -struct msi_desc *msi_desc) -{ - msi_entry->address.as_uint32 = msi_desc->msg.address_lo; - msi_entry->data.as_uint32 = msi_desc->msg.data; -} -struct irq_domain *hv_create_pci_msi_domain (void ); int hv_map_ioapic_interrupt(int ioapic_id, bool level, int vcpu, int vector,
drivers/pci/controller/pci-hyperv.c +4 -1
@@ -1234,6 +1234,7 @@ static void hv_irq_unmask(struct irq_datstruct msi_desc *msi_desc =irq_data_get_msi_desc (data);struct irq_cfg *cfg =irqd_cfg (data);struct hv_retarget_device_interrupt *params; +struct tran_int_desc *int_desc;struct hv_pcibus_device *hbus;struct cpumask *dest;cpumask_var_t tmp;
@@ -1248,6 +1249,7 @@ static void hv_irq_unmask(struct irq_dat pdev =msi_desc_to_pci_dev (msi_desc); pbus = pdev->bus; hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); + int_desc = data->chip_data;spin_lock_irqsave (&hbus->retarget_msi_interrupt_lock, flags);
@@ -1255,7 +1257,8 @@ static void hv_irq_unmask(struct irq_datmemset (params,0 ,sizeof (*params)); params->partition_id =HV_PARTITION_ID_SELF ; params->int_entry.source =HV_INTERRUPT_SOURCE_MSI ; -hv_set_msi_entry_from_desc (¶ms->int_entry.msi_entry, msi_desc); + params->int_entry.msi_entry.address.as_uint32 = int_desc->address &0xffffffff ; + params->int_entry.msi_entry.data.as_uint32 = int_desc->data; params->device_id = (hbus->hdev->dev_instance.b[5 ] <<24 ) | (hbus->hdev->dev_instance.b[4 ] <<16 ) | (hbus->hdev->dev_instance.b[7] << 8) |
Greg Kroah-Hartman
maintainerPATCH 12/201 PCI: hv: Reuse existing IRTE allocation in compose_msi_msg()
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
commit b4b77778ecc5bfbd4e77de1b2fd5c1dd3c655f1f upstream.
Currently if compose_msi_msg() is called multiple times, it will free any previous IRTE allocation, and generate a new allocation. While nothing prevents this from occurring, it is extraneous when Linux could just reuse the existing allocation and avoid a bunch of overhead.
However, when future IRTE allocations operate on blocks of MSIs instead of a single line, freeing the allocation will impact all of the lines. This could cause an issue where an allocation of N MSIs occurs, then some of the lines are retargeted, and finally the allocation is freed/reallocated. The freeing of the allocation removes all of the configuration for the entire block, which requires all the lines to be retargeted, which might not happen since some lines might already be unmasked/active.
--- drivers/pci/controller/pci-hyperv.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/pci/controller/pci-hyperv.c +9 -7
@@ -1458,6 +1458,15 @@ static void hv_compose_msi_msg(struct iru32 size;int ret; +/* Reuse the previous allocation */ +if (data->chip_data) { + int_desc = data->chip_data; + msg->address_hi = int_desc->address >>32 ; + msg->address_lo = int_desc->address &0xffffffff ; + msg->data = int_desc->data; +return ; + } + pdev =msi_desc_to_pci_dev (irq_data_get_msi_desc (data)); dest =irq_data_get_effective_affinity_mask (data); pbus = pdev->bus;
@@ -1467,13 +1476,6 @@ static void hv_compose_msi_msg(struct irif (!hpdev) goto return_null_message; -/* Free any previous message that might have already been composed. */ -if (data->chip_data) { - int_desc = data->chip_data; - data->chip_data =NULL ; -hv_int_desc_free (hpdev, int_desc); - } - int_desc =kzalloc (sizeof (*int_desc),GFP_ATOMIC );if (!int_desc) goto drop_reference;
Greg Kroah-Hartman
maintainerPATCH 13/201 PCI: hv: Fix interrupt mapping for multi-MSI
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
commit a2bad844a67b1c7740bda63e87453baf63c3a7f7 upstream.
According to Dexuan, the hypervisor folks beleive that multi-msi allocations are not correct. compose_msi_msg() will allocate multi-msi one by one. However, multi-msi is a block of related MSIs, with alignment requirements. In order for the hypervisor to allocate properly aligned and consecutive entries in the IOMMU Interrupt Remapping Table, there should be a single mapping request that requests all of the multi-msi vectors in one shot.
Dexuan suggests detecting the multi-msi case and composing a single request related to the first MSI. Then for the other MSIs in the same block, use the cached information. This appears to be viable, so do it.
5.15 backport - add hv_msi_get_int_vector helper function. Fixed merge conflict due to delivery_mode name change (APIC_DELIVERY_MODE_FIXED is the value given to DELIVERY_MODE on x86). Removed unused variable in hv_compose_msi_msg. Fixed reference to msi_desc->pci to point to the same is_msix variable.
--- drivers/pci/controller/pci-hyperv.c | 68 ++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 11 deletions(-)
drivers/pci/controller/pci-hyperv.c +57 -11
@@ -1142,6 +1142,10 @@ static void hv_int_desc_free(struct hv_pu8 buffer[sizeof (struct pci_delete_interrupt )]; } ctxt; +if (!int_desc->vector_count) { +kfree (int_desc); +return ; + }memset (&ctxt,0 ,sizeof (ctxt)); int_pkt = (struct pci_delete_interrupt *)&ctxt.pkt.message; int_pkt->message_type.type =
@@ -1204,6 +1208,13 @@ static void hv_irq_mask(struct irq_datapci_msi_mask_irq (data); } +static unsigned int hv_msi_get_int_vector (struct irq_data *data) +{ +struct irq_cfg *cfg =irqd_cfg (data); + +return cfg->vector; +} +static int hv_msi_prepare (struct irq_domain *domain,struct device *dev,int nvec,msi_alloc_info_t *info) {
@@ -1359,12 +1370,12 @@ static void hv_pci_compose_compl(void *cstatic u32 hv_compose_msi_req_v1 (struct pci_create_interrupt *int_pkt,struct cpumask *affinity, -u32 slot,u8 vector) +u32 slot,u8 vector,u8 vector_count) { int_pkt->message_type.type =PCI_CREATE_INTERRUPT_MESSAGE ; int_pkt->wslot.slot = slot; int_pkt->int_desc.vector = vector; - int_pkt->int_desc.vector_count =1 ; + int_pkt->int_desc.vector_count = vector_count; int_pkt->int_desc.delivery_mode =APIC_DELIVERY_MODE_FIXED ;/*
@@ -1387,14 +1398,14 @@ static int hv_compose_msi_req_get_cpu(ststatic u32 hv_compose_msi_req_v2 (struct pci_create_interrupt2 *int_pkt,struct cpumask *affinity, -u32 slot,u8 vector) +u32 slot,u8 vector,u8 vector_count) {int cpu; int_pkt->message_type.type =PCI_CREATE_INTERRUPT_MESSAGE2 ; int_pkt->wslot.slot = slot; int_pkt->int_desc.vector = vector; - int_pkt->int_desc.vector_count =1 ; + int_pkt->int_desc.vector_count = vector_count; int_pkt->int_desc.delivery_mode =APIC_DELIVERY_MODE_FIXED ; cpu =hv_compose_msi_req_get_cpu (affinity); int_pkt->int_desc.processor_array[0] =
@@ -1406,7 +1417,7 @@ static u32 hv_compose_msi_req_v2(static u32 hv_compose_msi_req_v3 (struct pci_create_interrupt3 *int_pkt,struct cpumask *affinity, -u32 slot,u32 vector) +u32 slot,u32 vector,u8 vector_count) {int cpu;
@@ -1414,7 +1425,7 @@ static u32 hv_compose_msi_req_v3( int_pkt->wslot.slot = slot; int_pkt->int_desc.vector = vector; int_pkt->int_desc.reserved =0 ; - int_pkt->int_desc.vector_count =1 ; + int_pkt->int_desc.vector_count = vector_count; int_pkt->int_desc.delivery_mode =APIC_DELIVERY_MODE_FIXED ; cpu =hv_compose_msi_req_get_cpu (affinity); int_pkt->int_desc.processor_array[0] =
@@ -1437,7 +1448,6 @@ static u32 hv_compose_msi_req_v3(*/ static void hv_compose_msi_msg (struct irq_data *data,struct msi_msg *msg) { -struct irq_cfg *cfg =irqd_cfg (data);struct hv_pcibus_device *hbus;struct vmbus_channel *channel;struct hv_pci_dev *hpdev;
@@ -1446,6 +1456,8 @@ static void hv_compose_msi_msg(struct irstruct cpumask *dest;struct compose_comp_ctxt comp;struct tran_int_desc *int_desc; +struct msi_desc *msi_desc; +u8 vector, vector_count; struct { struct pci_packet pci_pkt; union {
@@ -1467,7 +1479,8 @@ static void hv_compose_msi_msg(struct irreturn ; } - pdev =msi_desc_to_pci_dev (irq_data_get_msi_desc (data)); + msi_desc =irq_data_get_msi_desc (data); + pdev =msi_desc_to_pci_dev (msi_desc); dest =irq_data_get_effective_affinity_mask (data); pbus = pdev->bus; hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata);
@@ -1480,6 +1493,36 @@ static void hv_compose_msi_msg(struct irif (!int_desc) goto drop_reference; +if (!msi_desc->msi_attrib.is_msix && msi_desc->nvec_used >1 ) { +/* +* If this is not the first MSI of Multi MSI, we already have +* a mapping. Can exit early. +*/ +if (msi_desc->irq != data->irq) { + data->chip_data = int_desc; + int_desc->address = msi_desc->msg.address_lo | + (u64 )msi_desc->msg.address_hi <<32 ; + int_desc->data = msi_desc->msg.data + + (data->irq - msi_desc->irq); + msg->address_hi = msi_desc->msg.address_hi; + msg->address_lo = msi_desc->msg.address_lo; + msg->data = int_desc->data; +put_pcichild (hpdev); +return ; + } +/* +* The vector we select here is a dummy value. The correct +* value gets sent to the hypervisor in unmask(). This needs +* to be aligned with the count, and also not zero. Multi-msi +* is powers of 2 up to 32, so 32 will always work here. +*/ + vector =32 ; + vector_count = msi_desc->nvec_used; + }else { + vector =hv_msi_get_int_vector (data); + vector_count =1 ; + } +memset (&ctxt,0 ,sizeof (ctxt));init_completion (&comp.comp_pkt.host_event); ctxt.pci_pkt.completion_func = hv_pci_compose_compl;
@@ -1490,7 +1533,8 @@ static void hv_compose_msi_msg(struct ir size =hv_compose_msi_req_v1 (&ctxt.int_pkts.v1, dest, hpdev->desc.win_slot.slot, - cfg->vector); + vector, + vector_count);break ;case PCI_PROTOCOL_VERSION_1_2 :
@@ -1498,14 +1542,16 @@ static void hv_compose_msi_msg(struct ir size =hv_compose_msi_req_v2 (&ctxt.int_pkts.v2, dest, hpdev->desc.win_slot.slot, - cfg->vector); + vector, + vector_count);break ;case PCI_PROTOCOL_VERSION_1_4 : size =hv_compose_msi_req_v3 (&ctxt.int_pkts.v3, dest, hpdev->desc.win_slot.slot, - cfg->vector); + vector, + vector_count);break ;default :
Greg Kroah-Hartman
maintainerPATCH 14/201 serial: mvebu-uart: correctly report configured baudrate value
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
commit 4f532c1e25319e42996ec18a1f473fd50c8e575d upstream.
Functions tty_termios_encode_baud_rate() and uart_update_timeout() should be called with the baudrate value which was set to hardware. Linux then report exact values via ioctl(TCGETS2) to userspace.
Change mvebu_uart_baud_rate_set() function to return baudrate value which was set to hardware and propagate this value to above mentioned functions.
With this change userspace would see precise value in termios c_ospeed field.
--- drivers/tty/serial/mvebu-uart.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
drivers/tty/serial/mvebu-uart.c +13 -12
@@ -442,13 +442,13 @@ static void mvebu_uart_shutdown(struct u } } -static int mvebu_uart_baud_rate_set (struct uart_port *port,unsigned int baud) +static unsigned int mvebu_uart_baud_rate_set (struct uart_port *port,unsigned int baud) {unsigned int d_divisor, m_divisor;u32 brdv, osamp;if (!port->uartclk) -return -EOPNOTSUPP ; +return 0 ;/* * The baudrate is derived from the UART clock thanks to two divisors:
@@ -472,7 +472,7 @@ static int mvebu_uart_baud_rate_set(stru osamp &= ~OSAMP_DIVISORS_MASK ;writel (osamp, port->membase +UART_OSAMP ); -return 0 ; +return DIV_ROUND_CLOSEST (port->uartclk, d_divisor * m_divisor); } static void mvebu_uart_set_termios(struct uart_port *port,
@@ -509,15 +509,11 @@ static void mvebu_uart_set_termios(struc max_baud =230400 ; baud =uart_get_baud_rate (port, termios, old, min_baud, max_baud); -if (mvebu_uart_baud_rate_set (port, baud)) { -/* No clock available, baudrate cannot be changed */ -if (old) - baud =uart_get_baud_rate (port, old,NULL , - min_baud, max_baud); - }else { -tty_termios_encode_baud_rate (termios, baud, baud); -uart_update_timeout (port, termios->c_cflag, baud); - } + baud =mvebu_uart_baud_rate_set (port, baud); + +/* In case baudrate cannot be changed, report previous old value */ +if (baud ==0 && old) + baud =tty_termios_baud_rate (old);/* Only the following flag changes are supported */ if (old) {
@@ -528,6 +524,11 @@ static void mvebu_uart_set_termios(struc termios->c_cflag |=CS8 ; } +if (baud !=0 ) { +tty_termios_encode_baud_rate (termios, baud, baud); +uart_update_timeout (port, termios->c_cflag, baud); + } +spin_unlock_irqrestore (&port->lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 15/201 batman-adv: Use netif_rx_any_context() any.
In reply to Greg Kroah-HartmanFrom: Sebastian Andrzej Siewior <[email protected]>
This reverts the stable commit
e65d78b12fbc0 ("batman-adv: Use netif_rx().")
The commit message says:
| Since commit
| baebdf48c3600 ("net: dev: Makes sure netif_rx() can be invoked in any context.")
|
| the function netif_rx() can be used in preemptible/thread context as
| well as in interrupt context.This commit (baebdf48c3600) has not been backported to the 5.15 stable series and therefore, the commit which builds upon it, must not be backported either.
Revert the backport and use netif_rx_any_context() again.
--- net/batman-adv/bridge_loop_avoidance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/batman-adv/bridge_loop_avoidance.c +1 -1
@@ -443,7 +443,7 @@ static void batadv_bla_send_claim(structbatadv_add_counter (bat_priv,BATADV_CNT_RX_BYTES , skb->len +ETH_HLEN ); -netif_rx (skb); +netif_rx_any_context (skb); out:batadv_hardif_put (primary_if); }
Greg Kroah-Hartman
maintainerPATCH 16/201 Revert "mt76: mt7921: Fix the error handling path of mt7921_pci_probe()"
In reply to Greg Kroah-HartmanFrom: Sean Wang <[email protected]>
This reverts commit 663457f421d41e9d2fcb1e84baf43d1433f80c08 that is the commit 44c4237cf3436bda2b185ff728123651ad133f69 upstream.
Because there was mistake in
'649178c0493e ("mt76: mt7921e: fix possible probe failure after reboot")' that caused WiFi reset cannot work well as the reported issue "PROBLEM: [Stable v5.15.42+] [mt7921] Wake after suspend locks up system when mt7921-driver is used on a Lenovo ThinkPad E15 G3" described in
http://lists.infradead.org/pipermail/linux-mediatek/2022-June/042668.html
So we need to revert the patch first to avoid the conflict of reverting '649178c0493e ("mt76: mt7921e: fix possible probe failure after reboot")' and will be applied back later after fixing.
--- drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/pci.c +3 -5
@@ -254,10 +254,8 @@ static int mt7921_pci_probe(struct pci_d dev->bus_ops = dev->mt76.bus; bus_ops =devm_kmemdup (dev->mt76.dev, dev->bus_ops,sizeof (*bus_ops),GFP_KERNEL ); -if (!bus_ops) { - ret = -ENOMEM ; - goto err_free_dev; - } +if (!bus_ops) +return -ENOMEM ; bus_ops->rr = mt7921_rr; bus_ops->wr = mt7921_wr;
@@ -266,7 +264,7 @@ static int mt7921_pci_probe(struct pci_d ret =__mt7921_mcu_drv_pmctrl (dev);if (ret) - goto err_free_dev; +return ret; mdev->rev = (mt7921_l1_rr (dev,MT_HW_CHIPID ) <<16 ) | (mt7921_l1_rr (dev,MT_HW_REV ) &0xff );
Greg Kroah-Hartman
maintainerPATCH 17/201 Revert "mt76: mt7921e: fix possible probe failure after reboot"
In reply to Greg Kroah-HartmanFrom: Sean Wang <[email protected]>
This reverts commit 649178c0493e4080b2b226b0ef9fa2d834b1b412 that is the commit 602cc0c9618a819ab00ea3c9400742a0ca318380 upstream.
Because there was mistake in
'649178c0493e ("mt76: mt7921e: fix possible probe failure after reboot")' that caused WiFi reset cannot work well as the reported issue "PROBLEM: [Stable v5.15.42+] [mt7921] Wake after suspend locks up system when mt7921-driver is used on a Lenovo ThinkPad E15 G3" described in
http://lists.infradead.org/pipermail/linux-mediatek/2022-June/042668.html
So, we need to revert it before fixing and landing it again on the stable tree from upstream.
--- drivers/net/wireless/mediatek/mt76/mt7921/dma.c | 115 ++++++++++++++++++++++ drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 20 +-- drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 121 ------------------------ 3 files changed, 125 insertions(+), 131 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/dma.c +115 -0
@@ -118,6 +118,109 @@ static void mt7921_dma_prefetch(struct mmt76_wr (dev,MT_WFDMA0_TX_RING17_EXT_CTRL ,PREFETCH (0x380 ,0x4 )); } +static u32 __mt7921_reg_addr (struct mt7921_dev *dev,u32 addr) +{ +static const struct { +u32 phys; +u32 mapped; +u32 size; + } fixed_map[] = { + {0x00400000 ,0x80000 ,0x10000 },/* WF_MCU_SYSRAM */ + {0x00410000 ,0x90000 ,0x10000 },/* WF_MCU_SYSRAM (configure register) */ + {0x40000000 ,0x70000 ,0x10000 },/* WF_UMAC_SYSRAM */ + {0x54000000 ,0x02000 ,0x1000 },/* WFDMA PCIE0 MCU DMA0 */ + {0x55000000 ,0x03000 ,0x1000 },/* WFDMA PCIE0 MCU DMA1 */ + {0x58000000 ,0x06000 ,0x1000 },/* WFDMA PCIE1 MCU DMA0 (MEM_DMA) */ + {0x59000000 ,0x07000 ,0x1000 },/* WFDMA PCIE1 MCU DMA1 */ + {0x7c000000 ,0xf0000 ,0x10000 },/* CONN_INFRA */ + {0x7c020000 ,0xd0000 ,0x10000 },/* CONN_INFRA, WFDMA */ + {0x7c060000 ,0xe0000 ,0x10000 },/* CONN_INFRA, conn_host_csr_top */ + {0x80020000 ,0xb0000 ,0x10000 },/* WF_TOP_MISC_OFF */ + {0x81020000 ,0xc0000 ,0x10000 },/* WF_TOP_MISC_ON */ + {0x820c0000 ,0x08000 ,0x4000 },/* WF_UMAC_TOP (PLE) */ + {0x820c8000 ,0x0c000 ,0x2000 },/* WF_UMAC_TOP (PSE) */ + {0x820cc000 ,0x0e000 ,0x2000 },/* WF_UMAC_TOP (PP) */ + {0x820ce000 ,0x21c00 ,0x0200 },/* WF_LMAC_TOP (WF_SEC) */ + {0x820cf000 ,0x22000 ,0x1000 },/* WF_LMAC_TOP (WF_PF) */ + {0x820d0000 ,0x30000 ,0x10000 },/* WF_LMAC_TOP (WF_WTBLON) */ + {0x820e0000 ,0x20000 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_CFG) */ + {0x820e1000 ,0x20400 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_TRB) */ + {0x820e2000 ,0x20800 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_AGG) */ + {0x820e3000 ,0x20c00 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_ARB) */ + {0x820e4000 ,0x21000 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_TMAC) */ + {0x820e5000 ,0x21400 ,0x0800 },/* WF_LMAC_TOP BN0 (WF_RMAC) */ + {0x820e7000 ,0x21e00 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_DMA) */ + {0x820e9000 ,0x23400 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_WTBLOFF) */ + {0x820ea000 ,0x24000 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_ETBF) */ + {0x820eb000 ,0x24200 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_LPON) */ + {0x820ec000 ,0x24600 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_INT) */ + {0x820ed000 ,0x24800 ,0x0800 },/* WF_LMAC_TOP BN0 (WF_MIB) */ + {0x820f0000 ,0xa0000 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_CFG) */ + {0x820f1000 ,0xa0600 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_TRB) */ + {0x820f2000 ,0xa0800 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_AGG) */ + {0x820f3000 ,0xa0c00 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_ARB) */ + {0x820f4000 ,0xa1000 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_TMAC) */ + {0x820f5000 ,0xa1400 ,0x0800 },/* WF_LMAC_TOP BN1 (WF_RMAC) */ + {0x820f7000 ,0xa1e00 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_DMA) */ + {0x820f9000 ,0xa3400 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_WTBLOFF) */ + {0x820fa000 ,0xa4000 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_ETBF) */ + {0x820fb000 ,0xa4200 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_LPON) */ + {0x820fc000 ,0xa4600 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_INT) */ + {0x820fd000 ,0xa4800 ,0x0800 },/* WF_LMAC_TOP BN1 (WF_MIB) */ + }; +int i; + +if (addr <0x100000 ) +return addr; + +for (i =0 ; i <ARRAY_SIZE (fixed_map); i++) { +u32 ofs; + +if (addr < fixed_map[i].phys) +continue ; + + ofs = addr - fixed_map[i].phys; +if (ofs > fixed_map[i].size) +continue ; + +return fixed_map[i].mapped + ofs; + } + +if ((addr >=0x18000000 && addr <0x18c00000 ) || + (addr >=0x70000000 && addr <0x78000000 ) || + (addr >=0x7c000000 && addr <0x7c400000 )) +return mt7921_reg_map_l1 (dev, addr); + +dev_err (dev->mt76.dev,"Access currently unsupported address %08x\n" , + addr); + +return 0 ; +} + +static u32 mt7921_rr (struct mt76_dev *mdev,u32 offset) +{ + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); +u32 addr =__mt7921_reg_addr (dev, offset); + +return dev->bus_ops->rr (mdev, addr); +} + +static void mt7921_wr (struct mt76_dev *mdev,u32 offset,u32 val) +{ + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); +u32 addr =__mt7921_reg_addr (dev, offset); + + dev->bus_ops->wr (mdev, addr, val); +} + +static u32 mt7921_rmw (struct mt76_dev *mdev,u32 offset,u32 mask,u32 val) +{ + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); +u32 addr =__mt7921_reg_addr (dev, offset); + +return dev->bus_ops->rmw (mdev, addr, mask, val); +} +static int mt7921_dma_disable (struct mt7921_dev *dev,bool force) {if (force) {
@@ -277,8 +380,20 @@ int mt7921_wpdma_reinit_cond(struct mt79int mt7921_dma_init (struct mt7921_dev *dev) { +struct mt76_bus_ops *bus_ops;int ret; + dev->bus_ops = dev->mt76.bus; + bus_ops =devm_kmemdup (dev->mt76.dev, dev->bus_ops,sizeof (*bus_ops), +GFP_KERNEL ); +if (!bus_ops) +return -ENOMEM ; + + bus_ops->rr = mt7921_rr; + bus_ops->wr = mt7921_wr; + bus_ops->rmw = mt7921_rmw; + dev->mt76.bus = bus_ops; +mt76_dma_attach (&dev->mt76); ret =mt7921_dma_disable (dev, true);
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +10 -10
@@ -1308,6 +1308,8 @@ int mt7921_mcu_sta_update(struct mt7921_int __mt7921_mcu_drv_pmctrl (struct mt7921_dev *dev) { +struct mt76_phy *mphy = &dev->mt76.phy; +struct mt76_connac_pm *pm = &dev->pm;int i, err =0 ;for (i =0 ; i <MT7921_DRV_OWN_RETRY_COUNT ; i++) {
@@ -1320,8 +1322,16 @@ int __mt7921_mcu_drv_pmctrl(struct mt792if (i ==MT7921_DRV_OWN_RETRY_COUNT ) {dev_err (dev->mt76.dev,"driver own failed\n" ); err = -EIO ; + goto out; } +mt7921_wpdma_reinit_cond (dev); +clear_bit (MT76_STATE_PM , &mphy->state); + + pm->stats.last_wake_event = jiffies; + pm->stats.doze_time += pm->stats.last_wake_event - + pm->stats.last_doze_event; +out:return err; }
@@ -1337,16 +1347,6 @@ int mt7921_mcu_drv_pmctrl(struct mt7921_ goto out; err =__mt7921_mcu_drv_pmctrl (dev); -if (err <0 ) - goto out; - -mt7921_wpdma_reinit_cond (dev); -clear_bit (MT76_STATE_PM , &mphy->state); - - pm->stats.last_wake_event = jiffies; - pm->stats.doze_time += pm->stats.last_wake_event - - pm->stats.last_doze_event; - out:mutex_unlock (&pm->mutex);
drivers/net/wireless/mediatek/mt76/mt7921/pci.c +0 -121
139 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 18/201 mt76: mt7921: use physical addr to unify register access
In reply to Greg Kroah-HartmanFrom: Sean Wang <[email protected]>
commit f1e2eef111018a4f0d280656be4351c37e9e554b upstream.
Use physical address to unify the register access and reorder the entries in fixed_map table to accelerate the address lookup for MT7921e. Cosmetics the patch with adding an extra space to make all entries in the array style consistent.
--- drivers/net/wireless/mediatek/mt76/mt7921/dma.c | 27 +++++++++++------------ drivers/net/wireless/mediatek/mt76/mt7921/regs.h | 22 +++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/dma.c +14 -13
@@ -125,36 +125,37 @@ static u32 __mt7921_reg_addr(struct mt79u32 mapped;u32 size; } fixed_map[] = { - { 0x00400000, 0x80000, 0x10000}, /* WF_MCU_SYSRAM */ - { 0x00410000, 0x90000, 0x10000}, /* WF_MCU_SYSRAM (configure register) */ - { 0x40000000, 0x70000, 0x10000}, /* WF_UMAC_SYSRAM */ + { 0x820d0000, 0x30000, 0x10000 }, /* WF_LMAC_TOP (WF_WTBLON) */ + { 0x820ed000, 0x24800, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_MIB) */ + { 0x820e4000, 0x21000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_TMAC) */ + { 0x820e7000, 0x21e00, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_DMA) */ + { 0x820eb000, 0x24200, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_LPON) */ + { 0x820e2000, 0x20800, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_AGG) */ + { 0x820e3000, 0x20c00, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_ARB) */ + { 0x820e5000, 0x21400, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_RMAC) */ + { 0x00400000, 0x80000, 0x10000 }, /* WF_MCU_SYSRAM */ + { 0x00410000, 0x90000, 0x10000 }, /* WF_MCU_SYSRAM (configure register) */ + { 0x40000000, 0x70000, 0x10000 }, /* WF_UMAC_SYSRAM */ { 0x54000000, 0x02000, 0x1000 }, /* WFDMA PCIE0 MCU DMA0 */ { 0x55000000, 0x03000, 0x1000 }, /* WFDMA PCIE0 MCU DMA1 */ { 0x58000000, 0x06000, 0x1000 }, /* WFDMA PCIE1 MCU DMA0 (MEM_DMA) */ { 0x59000000, 0x07000, 0x1000 }, /* WFDMA PCIE1 MCU DMA1 */ { 0x7c000000, 0xf0000, 0x10000 }, /* CONN_INFRA */ { 0x7c020000, 0xd0000, 0x10000 }, /* CONN_INFRA, WFDMA */ - { 0x7c060000, 0xe0000, 0x10000}, /* CONN_INFRA, conn_host_csr_top */ + { 0x7c060000, 0xe0000, 0x10000 }, /* CONN_INFRA, conn_host_csr_top */ { 0x80020000, 0xb0000, 0x10000 }, /* WF_TOP_MISC_OFF */ { 0x81020000, 0xc0000, 0x10000 }, /* WF_TOP_MISC_ON */ { 0x820c0000, 0x08000, 0x4000 }, /* WF_UMAC_TOP (PLE) */ { 0x820c8000, 0x0c000, 0x2000 }, /* WF_UMAC_TOP (PSE) */ - { 0x820cc000, 0x0e000, 0x2000 }, /* WF_UMAC_TOP (PP) */ + { 0x820cc000, 0x0e000, 0x1000 }, /* WF_UMAC_TOP (PP) */ + { 0x820cd000, 0x0f000, 0x1000 }, /* WF_MDP_TOP */ { 0x820ce000, 0x21c00, 0x0200 }, /* WF_LMAC_TOP (WF_SEC) */ { 0x820cf000, 0x22000, 0x1000 }, /* WF_LMAC_TOP (WF_PF) */ - { 0x820d0000, 0x30000, 0x10000 }, /* WF_LMAC_TOP (WF_WTBLON) */ { 0x820e0000, 0x20000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_CFG) */ { 0x820e1000, 0x20400, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_TRB) */ - { 0x820e2000, 0x20800, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_AGG) */ - { 0x820e3000, 0x20c00, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_ARB) */ - { 0x820e4000, 0x21000, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_TMAC) */ - { 0x820e5000, 0x21400, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_RMAC) */ - { 0x820e7000, 0x21e00, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_DMA) */ { 0x820e9000, 0x23400, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_WTBLOFF) */ { 0x820ea000, 0x24000, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_ETBF) */ - { 0x820eb000, 0x24200, 0x0400 }, /* WF_LMAC_TOP BN0 (WF_LPON) */ { 0x820ec000, 0x24600, 0x0200 }, /* WF_LMAC_TOP BN0 (WF_INT) */ - { 0x820ed000, 0x24800, 0x0800 }, /* WF_LMAC_TOP BN0 (WF_MIB) */ { 0x820f0000, 0xa0000, 0x0400 }, /* WF_LMAC_TOP BN1 (WF_CFG) */ { 0x820f1000, 0xa0600, 0x0200 }, /* WF_LMAC_TOP BN1 (WF_TRB) */ { 0x820f2000, 0xa0800, 0x0400 }, /* WF_LMAC_TOP BN1 (WF_AGG) */
drivers/net/wireless/mediatek/mt76/mt7921/regs.h +11 -11
@@ -14,7 +14,7 @@#define MT_MCU_INT_EVENT_SER_TRIGGER BIT(2)#define MT_MCU_INT_EVENT_RESET_DONE BIT(3) -#define MT_PLE_BASE 0x8000 +#define MT_PLE_BASE 0x820c0000#define MT_PLE (ofs) (MT_PLE_BASE + (ofs))#define MT_PLE_FL_Q0_CTRL MT_PLE(0x3e0)
@@ -25,7 +25,7 @@#define MT_PLE_AC_QEMPTY (_n) MT_PLE(0x500 + 0x40 * (_n))#define MT_PLE_AMSDU_PACK_MSDU_CNT (n) MT_PLE(0x10e0 + ((n) << 2)) -#define MT_MDP_BASE 0xf000 +#define MT_MDP_BASE 0x820cd000#define MT_MDP (ofs) (MT_MDP_BASE + (ofs))#define MT_MDP_DCR0 MT_MDP(0x000)
@@ -48,7 +48,7 @@#define MT_MDP_TO_WM 1/* TMAC: band 0(0x21000), band 1(0xa1000) */ -#define MT_WF_TMAC_BASE (_band) ((_band) ? 0xa1000 : 0x21000) +#define MT_WF_TMAC_BASE (_band) ((_band) ? 0x820f4000 : 0x820e4000)#define MT_WF_TMAC (_band, ofs) (MT_WF_TMAC_BASE(_band) + (ofs))#define MT_TMAC_TCR0 (_band) MT_WF_TMAC(_band, 0)
@@ -73,7 +73,7 @@#define MT_TMAC_TRCR0 (_band) MT_WF_TMAC(_band, 0x09c)#define MT_TMAC_TFCR0 (_band) MT_WF_TMAC(_band, 0x1e0) -#define MT_WF_DMA_BASE (_band) ((_band) ? 0xa1e00 : 0x21e00) +#define MT_WF_DMA_BASE (_band) ((_band) ? 0x820f7000 : 0x820e7000)#define MT_WF_DMA (_band, ofs) (MT_WF_DMA_BASE(_band) + (ofs))#define MT_DMA_DCR0 (_band) MT_WF_DMA(_band, 0x000)
@@ -81,7 +81,7 @@#define MT_DMA_DCR0_RXD_G5_EN BIT(23)/* LPON: band 0(0x24200), band 1(0xa4200) */ -#define MT_WF_LPON_BASE (_band) ((_band) ? 0xa4200 : 0x24200) +#define MT_WF_LPON_BASE (_band) ((_band) ? 0x820fb000 : 0x820eb000)#define MT_WF_LPON (_band, ofs) (MT_WF_LPON_BASE(_band) + (ofs))#define MT_LPON_UTTR0 (_band) MT_WF_LPON(_band, 0x080)
@@ -92,7 +92,7 @@#define MT_LPON_TCR_SW_WRITE BIT(0)/* MIB: band 0(0x24800), band 1(0xa4800) */ -#define MT_WF_MIB_BASE (_band) ((_band) ? 0xa4800 : 0x24800) +#define MT_WF_MIB_BASE (_band) ((_band) ? 0x820fd000 : 0x820ed000)#define MT_WF_MIB (_band, ofs) (MT_WF_MIB_BASE(_band) + (ofs))#define MT_MIB_SCR1 (_band) MT_WF_MIB(_band, 0x004)
@@ -141,7 +141,7 @@#define MT_MIB_ARNG (_band, n) MT_WF_MIB(_band, 0x0b0 + ((n) << 2))#define MT_MIB_ARNCR_RANGE (val, n) (((val) >> ((n) << 3)) & GENMASK(7, 0)) -#define MT_WTBLON_TOP_BASE 0x34000 +#define MT_WTBLON_TOP_BASE 0x820d4000#define MT_WTBLON_TOP (ofs) (MT_WTBLON_TOP_BASE + (ofs))#define MT_WTBLON_TOP_WDUCR MT_WTBLON_TOP(0x200)#define MT_WTBLON_TOP_WDUCR_GROUP GENMASK(2, 0)
@@ -151,7 +151,7 @@#define MT_WTBL_UPDATE_ADM_COUNT_CLEAR BIT(12)#define MT_WTBL_UPDATE_BUSY BIT(31) -#define MT_WTBL_BASE 0x38000 +#define MT_WTBL_BASE 0x820d8000#define MT_WTBL_LMAC_ID GENMASK(14, 8)#define MT_WTBL_LMAC_DW GENMASK(7, 2)#define MT_WTBL_LMAC_OFFS (_id, _dw) (MT_WTBL_BASE | \
@@ -159,7 +159,7 @@ FIELD_PREP(MT_WTBL_LMAC_DW, _dw))/* AGG: band 0(0x20800), band 1(0xa0800) */ -#define MT_WF_AGG_BASE (_band) ((_band) ? 0xa0800 : 0x20800) +#define MT_WF_AGG_BASE (_band) ((_band) ? 0x820f2000 : 0x820e2000)#define MT_WF_AGG (_band, ofs) (MT_WF_AGG_BASE(_band) + (ofs))#define MT_AGG_AWSCR0 (_band, _n) MT_WF_AGG(_band, 0x05c + (_n) * 4)
@@ -190,7 +190,7 @@#define MT_AGG_ATCR3 (_band) MT_WF_AGG(_band, 0x0f4)/* ARB: band 0(0x20c00), band 1(0xa0c00) */ -#define MT_WF_ARB_BASE (_band) ((_band) ? 0xa0c00 : 0x20c00) +#define MT_WF_ARB_BASE (_band) ((_band) ? 0x820f3000 : 0x820e3000)#define MT_WF_ARB (_band, ofs) (MT_WF_ARB_BASE(_band) + (ofs))#define MT_ARB_SCR (_band) MT_WF_ARB(_band, 0x080)
@@ -200,7 +200,7 @@#define MT_ARB_DRNGR0 (_band, _n) MT_WF_ARB(_band, 0x194 + (_n) * 4)/* RMAC: band 0(0x21400), band 1(0xa1400) */ -#define MT_WF_RMAC_BASE (_band) ((_band) ? 0xa1400 : 0x21400) +#define MT_WF_RMAC_BASE (_band) ((_band) ? 0x820f5000 : 0x820e5000)#define MT_WF_RMAC (_band, ofs) (MT_WF_RMAC_BASE(_band) + (ofs))#define MT_WF_RFCR (_band) MT_WF_RMAC(_band, 0x000)
Greg Kroah-Hartman
maintainerPATCH 19/201 mt76: mt7921e: fix possible probe failure after reboot
In reply to Greg Kroah-HartmanFrom: Sean Wang <[email protected]>
commit 602cc0c9618a819ab00ea3c9400742a0ca318380 upstream.
It doesn't guarantee the mt7921e gets started with ASPM L0 after each machine reboot on every platform.
If mt7921e gets started with not ASPM L0, it would be possible that the driver encounters time to time failure in mt7921_pci_probe, like a weird chip identifier is read
[ 215.514503] mt7921e 0000:05:00.0: ASIC revision: feed0000 [ 216.604741] mt7921e: probe of 0000:05:00.0 failed with error -110
or failing to init hardware because the driver is not allowed to access the register until the device is in ASPM L0 state. So, we call __mt7921e_mcu_drv_pmctrl in early mt7921_pci_probe to force the device to bring back to the L0 state for we can safely access registers in any case.
In the patch, we move all functions from dma.c to pci.c and register mt76 bus operation earilier, that is the __mt7921e_mcu_drv_pmctrl depends on.
--- drivers/net/wireless/mediatek/mt76/mt7921/dma.c | 116 -------------------- drivers/net/wireless/mediatek/mt76/mt7921/mcu.c | 18 ++- drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 1 drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 121 +++++++++++++++++++++ 4 files changed, 136 insertions(+), 120 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/dma.c +0 -116
@@ -118,110 +118,6 @@ static void mt7921_dma_prefetch(struct mmt76_wr (dev,MT_WFDMA0_TX_RING17_EXT_CTRL ,PREFETCH (0x380 ,0x4 )); } -static u32 __mt7921_reg_addr (struct mt7921_dev *dev,u32 addr) -{ -static const struct { -u32 phys; -u32 mapped; -u32 size; - } fixed_map[] = { - {0x820d0000 ,0x30000 ,0x10000 },/* WF_LMAC_TOP (WF_WTBLON) */ - {0x820ed000 ,0x24800 ,0x0800 },/* WF_LMAC_TOP BN0 (WF_MIB) */ - {0x820e4000 ,0x21000 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_TMAC) */ - {0x820e7000 ,0x21e00 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_DMA) */ - {0x820eb000 ,0x24200 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_LPON) */ - {0x820e2000 ,0x20800 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_AGG) */ - {0x820e3000 ,0x20c00 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_ARB) */ - {0x820e5000 ,0x21400 ,0x0800 },/* WF_LMAC_TOP BN0 (WF_RMAC) */ - {0x00400000 ,0x80000 ,0x10000 },/* WF_MCU_SYSRAM */ - {0x00410000 ,0x90000 ,0x10000 },/* WF_MCU_SYSRAM (configure register) */ - {0x40000000 ,0x70000 ,0x10000 },/* WF_UMAC_SYSRAM */ - {0x54000000 ,0x02000 ,0x1000 },/* WFDMA PCIE0 MCU DMA0 */ - {0x55000000 ,0x03000 ,0x1000 },/* WFDMA PCIE0 MCU DMA1 */ - {0x58000000 ,0x06000 ,0x1000 },/* WFDMA PCIE1 MCU DMA0 (MEM_DMA) */ - {0x59000000 ,0x07000 ,0x1000 },/* WFDMA PCIE1 MCU DMA1 */ - {0x7c000000 ,0xf0000 ,0x10000 },/* CONN_INFRA */ - {0x7c020000 ,0xd0000 ,0x10000 },/* CONN_INFRA, WFDMA */ - {0x7c060000 ,0xe0000 ,0x10000 },/* CONN_INFRA, conn_host_csr_top */ - {0x80020000 ,0xb0000 ,0x10000 },/* WF_TOP_MISC_OFF */ - {0x81020000 ,0xc0000 ,0x10000 },/* WF_TOP_MISC_ON */ - {0x820c0000 ,0x08000 ,0x4000 },/* WF_UMAC_TOP (PLE) */ - {0x820c8000 ,0x0c000 ,0x2000 },/* WF_UMAC_TOP (PSE) */ - {0x820cc000 ,0x0e000 ,0x1000 },/* WF_UMAC_TOP (PP) */ - {0x820cd000 ,0x0f000 ,0x1000 },/* WF_MDP_TOP */ - {0x820ce000 ,0x21c00 ,0x0200 },/* WF_LMAC_TOP (WF_SEC) */ - {0x820cf000 ,0x22000 ,0x1000 },/* WF_LMAC_TOP (WF_PF) */ - {0x820e0000 ,0x20000 ,0x0400 },/* WF_LMAC_TOP BN0 (WF_CFG) */ - {0x820e1000 ,0x20400 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_TRB) */ - {0x820e9000 ,0x23400 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_WTBLOFF) */ - {0x820ea000 ,0x24000 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_ETBF) */ - {0x820ec000 ,0x24600 ,0x0200 },/* WF_LMAC_TOP BN0 (WF_INT) */ - {0x820f0000 ,0xa0000 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_CFG) */ - {0x820f1000 ,0xa0600 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_TRB) */ - {0x820f2000 ,0xa0800 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_AGG) */ - {0x820f3000 ,0xa0c00 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_ARB) */ - {0x820f4000 ,0xa1000 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_TMAC) */ - {0x820f5000 ,0xa1400 ,0x0800 },/* WF_LMAC_TOP BN1 (WF_RMAC) */ - {0x820f7000 ,0xa1e00 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_DMA) */ - {0x820f9000 ,0xa3400 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_WTBLOFF) */ - {0x820fa000 ,0xa4000 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_ETBF) */ - {0x820fb000 ,0xa4200 ,0x0400 },/* WF_LMAC_TOP BN1 (WF_LPON) */ - {0x820fc000 ,0xa4600 ,0x0200 },/* WF_LMAC_TOP BN1 (WF_INT) */ - {0x820fd000 ,0xa4800 ,0x0800 },/* WF_LMAC_TOP BN1 (WF_MIB) */ - }; -int i; - -if (addr <0x100000 ) -return addr; - -for (i =0 ; i <ARRAY_SIZE (fixed_map); i++) { -u32 ofs; - -if (addr < fixed_map[i].phys) -continue ; - - ofs = addr - fixed_map[i].phys; -if (ofs > fixed_map[i].size) -continue ; - -return fixed_map[i].mapped + ofs; - } - -if ((addr >=0x18000000 && addr <0x18c00000 ) || - (addr >=0x70000000 && addr <0x78000000 ) || - (addr >=0x7c000000 && addr <0x7c400000 )) -return mt7921_reg_map_l1 (dev, addr); - -dev_err (dev->mt76.dev,"Access currently unsupported address %08x\n" , - addr); - -return 0 ; -} - -static u32 mt7921_rr (struct mt76_dev *mdev,u32 offset) -{ - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); -u32 addr =__mt7921_reg_addr (dev, offset); - -return dev->bus_ops->rr (mdev, addr); -} - -static void mt7921_wr (struct mt76_dev *mdev,u32 offset,u32 val) -{ - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); -u32 addr =__mt7921_reg_addr (dev, offset); - - dev->bus_ops->wr (mdev, addr, val); -} - -static u32 mt7921_rmw (struct mt76_dev *mdev,u32 offset,u32 mask,u32 val) -{ - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); -u32 addr =__mt7921_reg_addr (dev, offset); - -return dev->bus_ops->rmw (mdev, addr, mask, val); -} -static int mt7921_dma_disable (struct mt7921_dev *dev,bool force) {if (force) {
@@ -381,20 +277,8 @@ int mt7921_wpdma_reinit_cond(struct mt79int mt7921_dma_init (struct mt7921_dev *dev) { -struct mt76_bus_ops *bus_ops;int ret; - dev->bus_ops = dev->mt76.bus; - bus_ops =devm_kmemdup (dev->mt76.dev, dev->bus_ops,sizeof (*bus_ops), -GFP_KERNEL ); -if (!bus_ops) -return -ENOMEM ; - - bus_ops->rr = mt7921_rr; - bus_ops->wr = mt7921_wr; - bus_ops->rmw = mt7921_rmw; - dev->mt76.bus = bus_ops; -mt76_dma_attach (&dev->mt76); ret =mt7921_dma_disable (dev, true);
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c +14 -4
@@ -1306,10 +1306,8 @@ int mt7921_mcu_sta_update(struct mt7921_return mt76_connac_mcu_sta_cmd (&dev->mphy, &info); } -int __mt7921_mcu_drv_pmctrl (struct mt7921_dev *dev) +int __mt7921e_mcu_drv_pmctrl (struct mt7921_dev *dev) { -struct mt76_phy *mphy = &dev->mt76.phy; -struct mt76_connac_pm *pm = &dev->pm;int i, err =0 ;for (i =0 ; i <MT7921_DRV_OWN_RETRY_COUNT ; i++) {
@@ -1322,9 +1320,21 @@ int __mt7921_mcu_drv_pmctrl(struct mt792if (i ==MT7921_DRV_OWN_RETRY_COUNT ) {dev_err (dev->mt76.dev,"driver own failed\n" ); err = -EIO ; - goto out; } +return err; +} + +int __mt7921_mcu_drv_pmctrl (struct mt7921_dev *dev) +{ +struct mt76_phy *mphy = &dev->mt76.phy; +struct mt76_connac_pm *pm = &dev->pm; +int err; + + err =__mt7921e_mcu_drv_pmctrl (dev); +if (err <0 ) + goto out; +mt7921_wpdma_reinit_cond (dev);clear_bit (MT76_STATE_PM , &mphy->state);
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +1 -0
@@ -374,6 +374,7 @@ int mt7921_mcu_uni_rx_ba(struct mt7921_d bool enable);void mt7921_scan_work (struct work_struct *work);int mt7921_mcu_uni_bss_ps (struct mt7921_dev *dev,struct ieee80211_vif *vif); +int __mt7921e_mcu_drv_pmctrl (struct mt7921_dev *dev);int __mt7921_mcu_drv_pmctrl (struct mt7921_dev *dev);int mt7921_mcu_drv_pmctrl (struct mt7921_dev *dev);int mt7921_mcu_fw_pmctrl (struct mt7921_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7921/pci.c +121 -0
139 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 20/201 mt76: mt7921: Fix the error handling path of mt7921_pci_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
commit 4e90db5e21eb3bb272fe47386dc3506755e209e9 upstream.
In case of error, some resources must be freed, as already done above and below the devm_kmemdup() and __mt7921e_mcu_drv_pmctrl() calls added in the commit in Fixes:.
--- drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/pci.c +5 -3
@@ -254,8 +254,10 @@ static int mt7921_pci_probe(struct pci_d dev->bus_ops = dev->mt76.bus; bus_ops =devm_kmemdup (dev->mt76.dev, dev->bus_ops,sizeof (*bus_ops),GFP_KERNEL ); -if (!bus_ops) -return -ENOMEM ; +if (!bus_ops) { + ret = -ENOMEM ; + goto err_free_dev; + } bus_ops->rr = mt7921_rr; bus_ops->wr = mt7921_wr;
@@ -264,7 +266,7 @@ static int mt7921_pci_probe(struct pci_d ret =__mt7921e_mcu_drv_pmctrl (dev);if (ret) -return ret; + goto err_free_dev; mdev->rev = (mt7921_l1_rr (dev,MT_HW_CHIPID ) <<16 ) | (mt7921_l1_rr (dev,MT_HW_REV ) &0xff );
Greg Kroah-Hartman
maintainerPATCH 21/201 xfs: fix maxlevels comparisons in the btree staging code
In reply to Greg Kroah-HartmanFrom: "Darrick J. Wong" <[email protected]>
[ Upstream commit 78e8ec83a404d63dcc86b251f42e4ee8aff27465 ]
The btree geometry computation function has an off-by-one error in that it does not allow maximally tall btrees (nlevels == XFS_BTREE_MAXLEVELS). This can result in repairs failing unnecessarily on very fragmented filesystems. Subsequent patches to remove MAXLEVELS usage in favor of the per-btree type computations will make this a much more likely occurrence.
--- fs/xfs/libxfs/xfs_btree_staging.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/xfs/libxfs/xfs_btree_staging.c +2 -2
@@ -662,7 +662,7 @@ xfs_btree_bload_compute_geometry(xfs_btree_bload_ensure_slack (cur, &bbl->node_slack,1 ); bbl->nr_records = nr_this_level = nr_records; -for (cur->bc_nlevels =1 ; cur->bc_nlevels <XFS_BTREE_MAXLEVELS ;) { +for (cur->bc_nlevels =1 ; cur->bc_nlevels <=XFS_BTREE_MAXLEVELS ;) {uint64_t level_blocks;uint64_t dontcare64;unsigned int level = cur->bc_nlevels -1 ;
@@ -724,7 +724,7 @@ xfs_btree_bload_compute_geometry( nr_this_level = level_blocks; } -if (cur->bc_nlevels ==XFS_BTREE_MAXLEVELS ) +if (cur->bc_nlevels >XFS_BTREE_MAXLEVELS )return -EOVERFLOW ; bbl->btree_height = cur->bc_nlevels;
Greg Kroah-Hartman
maintainerPATCH 22/201 xfs: fold perag loop iteration logic into helper function
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
[ Upstream commit bf2307b195135ed9c95eebb38920d8bd41843092 ]
Fold the loop iteration logic into a helper in preparation for further fixups. No functional change in this patch.
[backport: dependency for f1788b5e5ee25bedf00bb4d25f82b93820d61189]
--- fs/xfs/libxfs/xfs_ag.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
fs/xfs/libxfs/xfs_ag.h +13 -3
@@ -124,12 +124,22 @@ void xfs_perag_put(struct xfs_perag *pag* for_each_perag_from() because they terminate at sb_agcount where there are * no perag structures in tree beyond end_agno. */ +static inline struct xfs_perag * +xfs_perag_next ( +struct xfs_perag *pag, +xfs_agnumber_t *next_agno) +{ +struct xfs_mount *mp = pag->pag_mount; + + *next_agno = pag->pag_agno +1 ; +xfs_perag_put (pag); +return xfs_perag_get (mp, *next_agno); +} +#define for_each_perag_range (mp, next_agno, end_agno, pag) \ for ((pag) = xfs_perag_get((mp), (next_agno)); \ (pag) != NULL && (next_agno) <= (end_agno); \ - (next_agno) = (pag)->pag_agno + 1, \ - xfs_perag_put(pag), \ - (pag) = xfs_perag_get((mp), (next_agno))) + (pag) = xfs_perag_next((pag), &(next_agno)))#define for_each_perag_from (mp, next_agno, pag) \ for_each_perag_range((mp), (next_agno), (mp)->m_sb.sb_agcount, (pag))
Greg Kroah-Hartman
maintainerPATCH 23/201 xfs: rename the next_agno perag iteration variable
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
[ Upstream commit f1788b5e5ee25bedf00bb4d25f82b93820d61189 ]
Rename the next_agno variable to be consistent across the several iteration macros and shorten line length.
[backport: dependency for 8ed004eb9d07a5d6114db3e97a166707c186262d]
--- fs/xfs/libxfs/xfs_ag.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
fs/xfs/libxfs/xfs_ag.h +9 -9
@@ -127,22 +127,22 @@ void xfs_perag_put(struct xfs_perag *pagstatic inline struct xfs_perag *xfs_perag_next (struct xfs_perag *pag, -xfs_agnumber_t *next_agno) +xfs_agnumber_t *agno) {struct xfs_mount *mp = pag->pag_mount; - *next_agno = pag->pag_agno +1 ; + *agno = pag->pag_agno +1 ;xfs_perag_put (pag); -return xfs_perag_get (mp, *next_agno); +return xfs_perag_get (mp, *agno); } -#define for_each_perag_range (mp, next_agno, end_agno, pag) \ - for ((pag) = xfs_perag_get((mp), (next_agno)); \ - (pag) != NULL && (next_agno) <= (end_agno); \ - (pag) = xfs_perag_next((pag), &(next_agno))) +#define for_each_perag_range (mp, agno, end_agno, pag) \ + for ((pag) = xfs_perag_get((mp), (agno)); \ + (pag) != NULL && (agno) <= (end_agno); \ + (pag) = xfs_perag_next((pag), &(agno))) -#define for_each_perag_from (mp, next_agno, pag) \ - for_each_perag_range((mp), (next_agno), (mp)->m_sb.sb_agcount, (pag)) +#define for_each_perag_from (mp, agno, pag) \ + for_each_perag_range((mp), (agno), (mp)->m_sb.sb_agcount, (pag))#define for_each_perag (mp, agno, pag) \
Greg Kroah-Hartman
maintainerPATCH 24/201 xfs: terminate perag iteration reliably on agcount
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
[ Upstream commit 8ed004eb9d07a5d6114db3e97a166707c186262d ]
The for_each_perag_from() iteration macro relies on sb_agcount to process every perag currently within EOFS from a given starting point. It's perfectly valid to have perag structures beyond sb_agcount, however, such as if a growfs is in progress. If a perag loop happens to race with growfs in this manner, it will actually attempt to process the post-EOFS perag where ->pag_agno == sb_agcount. This is reproduced by xfs/104 and manifests as the following assert failure in superblock write verifier context:
XFS: Assertion failed: agno < mp->m_sb.sb_agcount, file: fs/xfs/libxfs/xfs_types.c, line: 22
Update the corresponding macro to only process perags that are within the current sb_agcount.
--- fs/xfs/libxfs/xfs_ag.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/xfs/libxfs/xfs_ag.h +1 -1
@@ -142,7 +142,7 @@ xfs_perag_next( (pag) = xfs_perag_next((pag), &(agno)))#define for_each_perag_from (mp, agno, pag) \ - for_each_perag_range((mp), (agno), (mp)->m_sb.sb_agcount, (pag)) + for_each_perag_range((mp), (agno), (mp)->m_sb.sb_agcount - 1, (pag))#define for_each_perag (mp, agno, pag) \
Greg Kroah-Hartman
maintainerPATCH 25/201 xfs: fix perag reference leak on iteration race with growfs
In reply to Greg Kroah-HartmanFrom: Brian Foster <[email protected]>
[ Upstream commit 892a666fafa19ab04b5e948f6c92f98f1dafb489 ]
The for_each_perag*() set of macros are hacky in that some (i.e. those based on sb_agcount) rely on the assumption that perag iteration terminates naturally with a NULL perag at the specified end_agno. Others allow for the final AG to have a valid perag and require the calling function to clean up any potential leftover xfs_perag reference on termination of the loop.
Aside from providing a subtly inconsistent interface, the former variant is racy with growfs because growfs can create discoverable post-eofs perags before the final superblock update that completes the grow operation and increases sb_agcount. This leads to the following assert failure (reproduced by xfs/104) in the perag free path during unmount:
XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0, file: fs/xfs/libxfs/xfs_ag.c, line: 195
This occurs because one of the many for_each_perag() loops in the code that is expected to terminate with a NULL pag (and thus has no post-loop xfs_perag_put() check) raced with a growfs and found a non-NULL post-EOFS perag, but terminated naturally based on the end_agno check without releasing the post-EOFS perag.
Rework the iteration logic to lift the agno check from the main for loop conditional to the iteration helper function. The for loop now purely terminates on a NULL pag and xfs_perag_next() avoids taking a reference to any perag beyond end_agno in the first place.
--- fs/xfs/libxfs/xfs_ag.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)
fs/xfs/libxfs/xfs_ag.h +6 -10
@@ -116,30 +116,26 @@ void xfs_perag_put(struct xfs_perag *pag/* * Perag iteration APIs -* -* XXX: for_each_perag_range() usage really needs an iterator to clean up when -* we terminate at end_agno because we may have taken a reference to the perag -* beyond end_agno. Right now callers have to be careful to catch and clean that -* up themselves. This is not necessary for the callers of for_each_perag() and -* for_each_perag_from() because they terminate at sb_agcount where there are -* no perag structures in tree beyond end_agno. */ static inline struct xfs_perag *xfs_perag_next (struct xfs_perag *pag, -xfs_agnumber_t *agno) +xfs_agnumber_t *agno, +xfs_agnumber_t end_agno) {struct xfs_mount *mp = pag->pag_mount; *agno = pag->pag_agno +1 ;xfs_perag_put (pag); +if (*agno > end_agno) +return NULL ;return xfs_perag_get (mp, *agno); }#define for_each_perag_range (mp, agno, end_agno, pag) \ for ((pag) = xfs_perag_get((mp), (agno)); \ - (pag) != NULL && (agno) <= (end_agno); \ - (pag) = xfs_perag_next((pag), &(agno))) + (pag) != NULL; \ + (pag) = xfs_perag_next((pag), &(agno), (end_agno)))#define for_each_perag_from (mp, agno, pag) \ for_each_perag_range((mp), (agno), (mp)->m_sb.sb_agcount - 1, (pag))
Greg Kroah-Hartman
maintainerPATCH 26/201 xfs: prevent a WARN_ONCE() in xfs_ioc_attr_list()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 6ed6356b07714e0198be3bc3ecccc8b40a212de4 ]
The "bufsize" comes from the root user. If "bufsize" is negative then, because of type promotion, neither of the validation checks at the start of the function are able to catch it:
if (bufsize < sizeof(struct xfs_attrlist) || bufsize > XFS_XATTR_LIST_MAX) return -EINVAL;
This means "bufsize" will trigger (WARN_ON_ONCE(size > INT_MAX)) in kvmalloc_node(). Fix this by changing the type from int to size_t.
--- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_ioctl.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-)
fs/xfs/xfs_ioctl.c +1 -1
@@ -372,7 +372,7 @@ intxfs_ioc_attr_list ( struct xfs_inode *dp, void __user *ubuf, - int bufsize, + size_t bufsize, int flags, struct xfs_attrlist_cursor __user *ucursor) {
fs/xfs/xfs_ioctl.h +3 -2
@@ -38,8 +38,9 @@ xfs_readlink_by_handle(int xfs_ioc_attrmulti_one (struct file *parfilp,struct inode *inode,uint32_t opcode,void __user *uname,void __user *value,uint32_t *len,uint32_t flags); -int xfs_ioc_attr_list (struct xfs_inode *dp,void __user *ubuf,int bufsize, -int flags,struct xfs_attrlist_cursor __user *ucursor); +int xfs_ioc_attr_list (struct xfs_inode *dp,void __user *ubuf, +size_t bufsize,int flags, +struct xfs_attrlist_cursor __user *ucursor);extern struct dentry * xfs_handle_to_dentry(
Greg Kroah-Hartman
maintainerPATCH 27/201 r8152: fix a WOL issue
In reply to Greg Kroah-HartmanFrom: Hayes Wang <[email protected]>
commit cdf0b86b250fd3c1c3e120c86583ea510c52e4ce upstream.
This fixes that the platform is waked by an unexpected packet. The size and range of FIFO is different when the device enters S3 state, so it is necessary to correct some settings when suspending.
Regardless of jumbo frame, set RMS to 1522 and MTPS to MTPS_DEFAULT. Besides, enable MCU_BORW_EN to update the method of calculating the pointer of data. Then, the hardware could get the correct data.
--- drivers/net/usb/r8152.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/net/usb/r8152.c +14 -2
@@ -32,7 +32,7 @@#define NETNEXT_VERSION "12"/* Information for net */ -#define NET_VERSION "12" +#define NET_VERSION "13"#define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION#define DRIVER_AUTHOR "Realtek linux nic maintainers <[email protected]>"
@@ -5915,7 +5915,8 @@ static void r8153_enter_oob(struct r8152wait_oob_link_list_ready (tp); -ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RMS ,mtu_to_size (tp->netdev->mtu)); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RMS ,1522 ); +ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_MTPS ,MTPS_DEFAULT );switch (tp->version) {case RTL_VER_03 :
@@ -5951,6 +5952,10 @@ static void r8153_enter_oob(struct r8152 ocp_data |=NOW_IS_OOB |DIS_MCU_CLROOB ;ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_OOB_CTRL , ocp_data); + ocp_data =ocp_read_word (tp,MCU_TYPE_PLA ,PLA_SFF_STS_7 ); + ocp_data |=MCU_BORW_EN ; +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_SFF_STS_7 , ocp_data); +rxdy_gated_en (tp, false); ocp_data =ocp_read_dword (tp,MCU_TYPE_PLA ,PLA_RCR );
@@ -6553,6 +6558,9 @@ static void rtl8156_down(struct r8152 *trtl_disable (tp);rtl_reset_bmu (tp); +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_RMS ,1522 ); +ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_MTPS ,MTPS_DEFAULT ); +/* Clear teredo wake event. bit[15:8] is the teredo wakeup * type. Set it to zero. bits[7:0] are the W1C bits about * the events. Set them to all 1 to clear them.
@@ -6563,6 +6571,10 @@ static void rtl8156_down(struct r8152 *t ocp_data |=NOW_IS_OOB ;ocp_write_byte (tp,MCU_TYPE_PLA ,PLA_OOB_CTRL , ocp_data); + ocp_data =ocp_read_word (tp,MCU_TYPE_PLA ,PLA_SFF_STS_7 ); + ocp_data |=MCU_BORW_EN ; +ocp_write_word (tp,MCU_TYPE_PLA ,PLA_SFF_STS_7 , ocp_data); +rtl_rx_vlan_en (tp, true);rxdy_gated_en (tp, false);
Greg Kroah-Hartman
maintainerPATCH 28/201 ip: Fix data-races around sysctl_ip_default_ttl.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
commit 8281b7ec5c56b71cb2cc5a1728b41607be66959c upstream.
While reading sysctl_ip_default_ttl, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- drivers/net/ethernet/netronome/nfp/flower/action.c | 2 +- include/net/route.h | 2 +- net/ipv4/ip_sockglue.c | 2 +- net/ipv4/netfilter/nf_reject_ipv4.c | 4 ++-- net/ipv4/proc.c | 2 +- net/netfilter/nf_synproxy_core.c | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/ethernet/netronome/nfp/flower/action.c +1 -1
@@ -472,7 +472,7 @@ nfp_fl_set_tun(struct nfp_app *app, stru set_tun->ttl =ip4_dst_hoplimit (&rt->dst);ip_rt_put (rt); }else { - set_tun->ttl = net->ipv4.sysctl_ip_default_ttl; + set_tun->ttl =READ_ONCE (net->ipv4.sysctl_ip_default_ttl); } }
include/net/route.h +1 -1
@@ -360,7 +360,7 @@ static inline int ip4_dst_hoplimit(conststruct net *net =dev_net (dst->dev);if (hoplimit ==0 ) - hoplimit = net->ipv4.sysctl_ip_default_ttl; + hoplimit =READ_ONCE (net->ipv4.sysctl_ip_default_ttl);return hoplimit; }
net/ipv4/ip_sockglue.c +1 -1
@@ -1597,7 +1597,7 @@ static int do_ip_getsockopt(struct sock {struct net *net =sock_net (sk); val = (inet->uc_ttl ==-1 ? - net->ipv4.sysctl_ip_default_ttl : +READ_ONCE (net->ipv4.sysctl_ip_default_ttl) : inet->uc_ttl);break ; }
net/ipv4/netfilter/nf_reject_ipv4.c +2 -2
@@ -62,7 +62,7 @@ struct sk_buff *nf_reject_skb_v4_tcp_resskb_reserve (nskb,LL_MAX_HEADER ); niph =nf_reject_iphdr_put (nskb, oldskb,IPPROTO_TCP , - net->ipv4.sysctl_ip_default_ttl); +READ_ONCE (net->ipv4.sysctl_ip_default_ttl));nf_reject_ip_tcphdr_put (nskb, oldskb, oth); niph->tot_len =htons (nskb->len);ip_send_check (niph);
@@ -115,7 +115,7 @@ struct sk_buff *nf_reject_skb_v4_unreachskb_reserve (nskb,LL_MAX_HEADER ); niph =nf_reject_iphdr_put (nskb, oldskb,IPPROTO_ICMP , - net->ipv4.sysctl_ip_default_ttl); +READ_ONCE (net->ipv4.sysctl_ip_default_ttl));skb_reset_transport_header (nskb); icmph =skb_put_zero (nskb,sizeof (struct icmphdr ));
net/ipv4/proc.c +1 -1
@@ -387,7 +387,7 @@ static int snmp_seq_show_ipstats(structseq_printf (seq,"\nIp: %d %d" ,IPV4_DEVCONF_ALL (net,FORWARDING ) ?1 :2 , - net->ipv4.sysctl_ip_default_ttl); +READ_ONCE (net->ipv4.sysctl_ip_default_ttl));BUILD_BUG_ON (offsetof(struct ipstats_mib , mibs) !=0 ); snmp_get_cpu_field64_batch(buff64, snmp4_ipstats_list,
net/netfilter/nf_synproxy_core.c +1 -1
@@ -427,7 +427,7 @@ synproxy_build_ip(struct net *net, struc iph->tos =0 ; iph->id =0 ; iph->frag_off =htons (IP_DF ); - iph->ttl = net->ipv4.sysctl_ip_default_ttl; + iph->ttl =READ_ONCE (net->ipv4.sysctl_ip_default_ttl); iph->protocol =IPPROTO_TCP ; iph->check =0 ; iph->saddr = saddr;
Greg Kroah-Hartman
maintainerPATCH 29/201 xfrm: xfrm_policy: fix a possible double xfrm_pols_put() in xfrm_bundle_lookup()
In reply to Greg Kroah-HartmanFrom: Hangyu Hua <[email protected]>
[ Upstream commit f85daf0e725358be78dfd208dea5fd665d8cb901 ]
xfrm_policy_lookup() will call xfrm_pol_hold_rcu() to get a refcount of pols[0]. This refcount can be dropped in xfrm_expand_policies() when xfrm_expand_policies() return error. pols[0]'s refcount is balanced in here. But xfrm_bundle_lookup() will also call xfrm_pols_put() with num_pols == 1 to drop this refcount when xfrm_expand_policies() return error.
This patch also fix an illegal address access. pols[0] will save a error point when xfrm_policy_lookup fails. This lead to xfrm_pols_put to resolve an illegal address in xfrm_bundle_lookup's error path.
Fix these by setting num_pols = 0 in xfrm_expand_policies()'s error path.
--- net/xfrm/xfrm_policy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/xfrm/xfrm_policy.c +4 -1
@@ -2678,8 +2678,10 @@ static int xfrm_expand_policies(const struct flowi *fl, u16 family, *num_xfrms =0 ;return 0 ; } -if (IS_ERR (pols[0 ])) +if (IS_ERR (pols[0 ])) { + *num_pols =0 ;return PTR_ERR (pols[0 ]); + } *num_xfrms = pols[0 ]->xfrm_nr;
@@ -2694,6 +2696,7 @@ static int xfrm_expand_policies(const struct flowi *fl, u16 family,if (pols[1 ]) {if (IS_ERR (pols[1 ])) {xfrm_pols_put (pols, *num_pols); + *num_pols =0 ;return PTR_ERR (pols[1 ]); } (*num_pols)++;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 30/201 power/reset: arm-versatile: Fix refcount leak in versatile_reboot_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 80192eff64eee9b3bc0594a47381937b94b9d65a ]
of_find_matching_node_and_match() returns a node pointer with refcount incremented, we should use of_node_put() on it when not need anymore. Add missing of_node_put() to avoid refcount leak.
--- drivers/power/reset/arm-versatile-reboot.c | 1 + 1 file changed, 1 insertion(+)
drivers/power/reset/arm-versatile-reboot.c +1 -0
@@ -146,6 +146,7 @@ static int __init versatile_reboot_probe(void) versatile_reboot_type = (enum versatile_reboot )reboot_id->data; syscon_regmap =syscon_node_to_regmap (np); +of_node_put (np);if (IS_ERR (syscon_regmap))return PTR_ERR (syscon_regmap);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 31/201 RDMA/irdma: Do not advertise 1GB page size for x722
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
[ Upstream commit 5e8afb8792f3b6ae7ccf700f8c19225382636401 ]
x722 does not support 1GB page size but the irdma driver incorrectly advertises 1GB page size support for x722 device to ib_core to compute the best page size to use on this MR. This could lead to incorrect start offsets computed by hardware on the MR.
--- drivers/infiniband/hw/irdma/i40iw_hw.c | 1 + drivers/infiniband/hw/irdma/icrdma_hw.c | 1 + drivers/infiniband/hw/irdma/irdma.h | 1 + drivers/infiniband/hw/irdma/verbs.c | 4 ++-- 4 files changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/irdma/i40iw_hw.c +1 -0
@@ -202,6 +202,7 @@ void i40iw_init_hw(struct irdma_sc_dev *dev) dev->hw_attrs.uk_attrs.max_hw_read_sges =I40IW_MAX_SGE_RD ; dev->hw_attrs.max_hw_device_pages =I40IW_MAX_PUSH_PAGE_COUNT ; dev->hw_attrs.uk_attrs.max_hw_inline =I40IW_MAX_INLINE_DATA_SIZE ; + dev->hw_attrs.page_size_cap =SZ_4K |SZ_2M ; dev->hw_attrs.max_hw_ird =I40IW_MAX_IRD_SIZE ; dev->hw_attrs.max_hw_ord =I40IW_MAX_ORD_SIZE ; dev->hw_attrs.max_hw_wqes =I40IW_MAX_WQ_ENTRIES ;
drivers/infiniband/hw/irdma/icrdma_hw.c +1 -0
@@ -139,6 +139,7 @@ void icrdma_init_hw(struct irdma_sc_dev *dev) dev->cqp_db = dev->hw_regs[IRDMA_CQPDB ]; dev->cq_ack_db = dev->hw_regs[IRDMA_CQACK ]; dev->irq_ops = &icrdma_irq_ops; + dev->hw_attrs.page_size_cap =SZ_4K |SZ_2M |SZ_1G ; dev->hw_attrs.max_hw_ird =ICRDMA_MAX_IRD_SIZE ; dev->hw_attrs.max_hw_ord =ICRDMA_MAX_ORD_SIZE ; dev->hw_attrs.max_stat_inst =ICRDMA_MAX_STATS_COUNT ;
drivers/infiniband/hw/irdma/irdma.h +1 -0
@@ -127,6 +127,7 @@ struct irdma_hw_attrs {u64 max_hw_outbound_msg_size;u64 max_hw_inbound_msg_size;u64 max_mr_size; +u64 page_size_cap;u32 min_hw_qp_id;u32 min_hw_aeq_size;u32 max_hw_aeq_size;
drivers/infiniband/hw/irdma/verbs.c +2 -2
@@ -29,7 +29,7 @@ static int irdma_query_device(struct ib_device *ibdev, props->vendor_part_id = pcidev->device; props->hw_ver = rf->pcidev->revision; - props->page_size_cap =SZ_4K |SZ_2M |SZ_1G ; + props->page_size_cap = hw_attrs->page_size_cap; props->max_mr_size = hw_attrs->max_mr_size; props->max_qp = rf->max_qp - rf->used_qps; props->max_qp_wr = hw_attrs->max_qp_wr;
@@ -2776,7 +2776,7 @@ static struct ib_mr *irdma_reg_user_mr(struct ib_pd *pd, u64 start, u64 len,if (req.reg_type ==IRDMA_MEMREG_TYPE_MEM ) { iwmr->page_size =ib_umem_find_best_pgsz (region, -SZ_4K |SZ_2M |SZ_1G , + iwdev->rf->sc_dev.hw_attrs.page_size_cap, virt);if (unlikely (!iwmr->page_size)) {kfree (iwmr);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/201 RDMA/irdma: Fix sleep from invalid context BUG
In reply to Greg Kroah-HartmanFrom: Mustafa Ismail <[email protected]>
[ Upstream commit cc0315564d6eec91c716d314b743321be24c70b3 ]
Taking the qos_mutex to process RoCEv2 QP's on netdev events causes a kernel splat.
Fix this by removing the handling for RoCEv2 in irdma_cm_teardown_connections that uses the mutex. This handling is only needed for iWARP to avoid having connections established while the link is down or having connections remain functional after the IP address is removed.
BUG: sleeping function called from invalid context at kernel/locking/mutex. Call Trace: kernel: dump_stack+0x66/0x90 kernel: ___might_sleep.cold.92+0x8d/0x9a kernel: mutex_lock+0x1c/0x40 kernel: irdma_cm_teardown_connections+0x28e/0x4d0 [irdma] kernel: ? check_preempt_curr+0x7a/0x90 kernel: ? select_idle_sibling+0x22/0x3c0 kernel: ? select_task_rq_fair+0x94c/0xc90 kernel: ? irdma_exec_cqp_cmd+0xc27/0x17c0 [irdma] kernel: ? __wake_up_common+0x7a/0x190 kernel: irdma_if_notify+0x3cc/0x450 [irdma] kernel: ? sched_clock_cpu+0xc/0xb0 kernel: irdma_inet6addr_event+0xc6/0x150 [irdma]
--- drivers/infiniband/hw/irdma/cm.c | 50 -------------------------------- 1 file changed, 50 deletions(-)
drivers/infiniband/hw/irdma/cm.c +0 -50
@@ -4221,10 +4221,6 @@ void irdma_cm_teardown_connections(struct irdma_device *iwdev, u32 *ipaddr,struct irdma_cm_node *cm_node;struct list_head teardown_list;struct ib_qp_attr attr; -struct irdma_sc_vsi *vsi = &iwdev->vsi; -struct irdma_sc_qp *sc_qp; -struct irdma_qp *qp; -int i;INIT_LIST_HEAD (&teardown_list);
@@ -4241,52 +4237,6 @@ void irdma_cm_teardown_connections(struct irdma_device *iwdev, u32 *ipaddr,irdma_cm_disconn (cm_node->iwqp);irdma_rem_ref_cm_node (cm_node); } -if (!iwdev->roce_mode) -return ; - -INIT_LIST_HEAD (&teardown_list); -for (i =0 ; i <IRDMA_MAX_USER_PRIORITY ; i++) { -mutex_lock (&vsi->qos[i].qos_mutex); -list_for_each_safe (list_node, list_core_temp, - &vsi->qos[i].qplist) { -u32 qp_ip[4 ]; - - sc_qp = container_of(list_node, struct irdma_sc_qp, - list); -if (sc_qp->qp_uk.qp_type !=IRDMA_QP_TYPE_ROCE_RC ) -continue ; - - qp = sc_qp->qp_uk.back_qp; -if (!disconnect_all) { -if (nfo->ipv4) - qp_ip[0 ] = qp->udp_info.local_ipaddr[3 ]; -else -memcpy (qp_ip, - &qp->udp_info.local_ipaddr[0 ], -sizeof (qp_ip)); - } - -if (disconnect_all || - (nfo->vlan_id == (qp->udp_info.vlan_tag &VLAN_VID_MASK ) && - !memcmp (qp_ip, ipaddr, nfo->ipv4 ?4 :16 ))) { -spin_lock (&iwdev->rf->qptable_lock); -if (iwdev->rf->qp_table[sc_qp->qp_uk.qp_id]) { -irdma_qp_add_ref (&qp->ibqp); -list_add (&qp->teardown_entry, - &teardown_list); - } -spin_unlock (&iwdev->rf->qptable_lock); - } - } -mutex_unlock (&vsi->qos[i].qos_mutex); - } - - list_for_each_safe (list_node, list_core_temp, &teardown_list) { - qp = container_of(list_node, struct irdma_qp, teardown_entry); - attr.qp_state =IB_QPS_ERR ; -irdma_modify_qp_roce (&qp->ibqp, &attr,IB_QP_STATE ,NULL ); -irdma_qp_rem_ref (&qp->ibqp); - } }/**
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/201 pinctrl: ralink: rename MT7628(an) functions to MT76X8
In reply to Greg Kroah-HartmanFrom: Arınç ÜNAL <[email protected]>
[ Upstream commit 150438c86f55989632005b92c94f4aa2ec562ed6 ]
The functions that include "MT7628(an)" are for MT7628 and MT7688 SoCs. Rename them to MT76X8 to refer to both of the SoCs.
--- drivers/pinctrl/ralink/pinctrl-mt7620.c | 218 ++++++++++++------------ 1 file changed, 109 insertions(+), 109 deletions(-)
drivers/pinctrl/ralink/pinctrl-mt7620.c +109 -109
@@ -112,260 +112,260 @@ static struct rt2880_pmx_group mt7620a_pinmux_data[] = { { 0 } }; -static struct rt2880_pmx_func pwm1_grp_mt7628[] = { +static struct rt2880_pmx_func pwm1_grp_mt76x8[] = {FUNC ("sdxc d6" ,3 ,19 ,1 ),FUNC ("utif" ,2 ,19 ,1 ),FUNC ("gpio" ,1 ,19 ,1 ),FUNC ("pwm1" ,0 ,19 ,1 ), }; -static struct rt2880_pmx_func pwm0_grp_mt7628[] = { +static struct rt2880_pmx_func pwm0_grp_mt76x8[] = {FUNC ("sdxc d7" ,3 ,18 ,1 ),FUNC ("utif" ,2 ,18 ,1 ),FUNC ("gpio" ,1 ,18 ,1 ),FUNC ("pwm0" ,0 ,18 ,1 ), }; -static struct rt2880_pmx_func uart2_grp_mt7628[] = { +static struct rt2880_pmx_func uart2_grp_mt76x8[] = {FUNC ("sdxc d5 d4" ,3 ,20 ,2 ),FUNC ("pwm" ,2 ,20 ,2 ),FUNC ("gpio" ,1 ,20 ,2 ),FUNC ("uart2" ,0 ,20 ,2 ), }; -static struct rt2880_pmx_func uart1_grp_mt7628[] = { +static struct rt2880_pmx_func uart1_grp_mt76x8[] = {FUNC ("sw_r" ,3 ,45 ,2 ),FUNC ("pwm" ,2 ,45 ,2 ),FUNC ("gpio" ,1 ,45 ,2 ),FUNC ("uart1" ,0 ,45 ,2 ), }; -static struct rt2880_pmx_func i2c_grp_mt7628[] = { +static struct rt2880_pmx_func i2c_grp_mt76x8[] = {FUNC ("-" ,3 ,4 ,2 ),FUNC ("debug" ,2 ,4 ,2 ),FUNC ("gpio" ,1 ,4 ,2 ),FUNC ("i2c" ,0 ,4 ,2 ), }; -static struct rt2880_pmx_func refclk_grp_mt7628[] = {FUNC ("refclk" ,0 ,37 ,1 ) }; -static struct rt2880_pmx_func perst_grp_mt7628[] = {FUNC ("perst" ,0 ,36 ,1 ) }; -static struct rt2880_pmx_func wdt_grp_mt7628[] = {FUNC ("wdt" ,0 ,38 ,1 ) }; -static struct rt2880_pmx_func spi_grp_mt7628[] = {FUNC ("spi" ,0 ,7 ,4 ) }; +static struct rt2880_pmx_func refclk_grp_mt76x8[] = {FUNC ("refclk" ,0 ,37 ,1 ) }; +static struct rt2880_pmx_func perst_grp_mt76x8[] = {FUNC ("perst" ,0 ,36 ,1 ) }; +static struct rt2880_pmx_func wdt_grp_mt76x8[] = {FUNC ("wdt" ,0 ,38 ,1 ) }; +static struct rt2880_pmx_func spi_grp_mt76x8[] = {FUNC ("spi" ,0 ,7 ,4 ) }; -static struct rt2880_pmx_func sd_mode_grp_mt7628[] = { +static struct rt2880_pmx_func sd_mode_grp_mt76x8[] = {FUNC ("jtag" ,3 ,22 ,8 ),FUNC ("utif" ,2 ,22 ,8 ),FUNC ("gpio" ,1 ,22 ,8 ),FUNC ("sdxc" ,0 ,22 ,8 ), }; -static struct rt2880_pmx_func uart0_grp_mt7628[] = { +static struct rt2880_pmx_func uart0_grp_mt76x8[] = {FUNC ("-" ,3 ,12 ,2 ),FUNC ("-" ,2 ,12 ,2 ),FUNC ("gpio" ,1 ,12 ,2 ),FUNC ("uart0" ,0 ,12 ,2 ), }; -static struct rt2880_pmx_func i2s_grp_mt7628[] = { +static struct rt2880_pmx_func i2s_grp_mt76x8[] = {FUNC ("antenna" ,3 ,0 ,4 ),FUNC ("pcm" ,2 ,0 ,4 ),FUNC ("gpio" ,1 ,0 ,4 ),FUNC ("i2s" ,0 ,0 ,4 ), }; -static struct rt2880_pmx_func spi_cs1_grp_mt7628[] = { +static struct rt2880_pmx_func spi_cs1_grp_mt76x8[] = {FUNC ("-" ,3 ,6 ,1 ),FUNC ("refclk" ,2 ,6 ,1 ),FUNC ("gpio" ,1 ,6 ,1 ),FUNC ("spi cs1" ,0 ,6 ,1 ), }; -static struct rt2880_pmx_func spis_grp_mt7628[] = { +static struct rt2880_pmx_func spis_grp_mt76x8[] = {FUNC ("pwm_uart2" ,3 ,14 ,4 ),FUNC ("utif" ,2 ,14 ,4 ),FUNC ("gpio" ,1 ,14 ,4 ),FUNC ("spis" ,0 ,14 ,4 ), }; -static struct rt2880_pmx_func gpio_grp_mt7628[] = { +static struct rt2880_pmx_func gpio_grp_mt76x8[] = {FUNC ("pcie" ,3 ,11 ,1 ),FUNC ("refclk" ,2 ,11 ,1 ),FUNC ("gpio" ,1 ,11 ,1 ),FUNC ("gpio" ,0 ,11 ,1 ), }; -static struct rt2880_pmx_func p4led_kn_grp_mt7628[] = { +static struct rt2880_pmx_func p4led_kn_grp_mt76x8[] = {FUNC ("jtag" ,3 ,30 ,1 ),FUNC ("utif" ,2 ,30 ,1 ),FUNC ("gpio" ,1 ,30 ,1 ),FUNC ("p4led_kn" ,0 ,30 ,1 ), }; -static struct rt2880_pmx_func p3led_kn_grp_mt7628[] = { +static struct rt2880_pmx_func p3led_kn_grp_mt76x8[] = {FUNC ("jtag" ,3 ,31 ,1 ),FUNC ("utif" ,2 ,31 ,1 ),FUNC ("gpio" ,1 ,31 ,1 ),FUNC ("p3led_kn" ,0 ,31 ,1 ), }; -static struct rt2880_pmx_func p2led_kn_grp_mt7628[] = { +static struct rt2880_pmx_func p2led_kn_grp_mt76x8[] = {FUNC ("jtag" ,3 ,32 ,1 ),FUNC ("utif" ,2 ,32 ,1 ),FUNC ("gpio" ,1 ,32 ,1 ),FUNC ("p2led_kn" ,0 ,32 ,1 ), }; -static struct rt2880_pmx_func p1led_kn_grp_mt7628[] = { +static struct rt2880_pmx_func p1led_kn_grp_mt76x8[] = {FUNC ("jtag" ,3 ,33 ,1 ),FUNC ("utif" ,2 ,33 ,1 ),FUNC ("gpio" ,1 ,33 ,1 ),FUNC ("p1led_kn" ,0 ,33 ,1 ), }; -static struct rt2880_pmx_func p0led_kn_grp_mt7628[] = { +static struct rt2880_pmx_func p0led_kn_grp_mt76x8[] = {FUNC ("jtag" ,3 ,34 ,1 ),FUNC ("rsvd" ,2 ,34 ,1 ),FUNC ("gpio" ,1 ,34 ,1 ),FUNC ("p0led_kn" ,0 ,34 ,1 ), }; -static struct rt2880_pmx_func wled_kn_grp_mt7628[] = { +static struct rt2880_pmx_func wled_kn_grp_mt76x8[] = {FUNC ("rsvd" ,3 ,35 ,1 ),FUNC ("rsvd" ,2 ,35 ,1 ),FUNC ("gpio" ,1 ,35 ,1 ),FUNC ("wled_kn" ,0 ,35 ,1 ), }; -static struct rt2880_pmx_func p4led_an_grp_mt7628[] = { +static struct rt2880_pmx_func p4led_an_grp_mt76x8[] = {FUNC ("jtag" ,3 ,39 ,1 ),FUNC ("utif" ,2 ,39 ,1 ),FUNC ("gpio" ,1 ,39 ,1 ),FUNC ("p4led_an" ,0 ,39 ,1 ), }; -static struct rt2880_pmx_func p3led_an_grp_mt7628[] = { +static struct rt2880_pmx_func p3led_an_grp_mt76x8[] = {FUNC ("jtag" ,3 ,40 ,1 ),FUNC ("utif" ,2 ,40 ,1 ),FUNC ("gpio" ,1 ,40 ,1 ),FUNC ("p3led_an" ,0 ,40 ,1 ), }; -static struct rt2880_pmx_func p2led_an_grp_mt7628[] = { +static struct rt2880_pmx_func p2led_an_grp_mt76x8[] = {FUNC ("jtag" ,3 ,41 ,1 ),FUNC ("utif" ,2 ,41 ,1 ),FUNC ("gpio" ,1 ,41 ,1 ),FUNC ("p2led_an" ,0 ,41 ,1 ), }; -static struct rt2880_pmx_func p1led_an_grp_mt7628[] = { +static struct rt2880_pmx_func p1led_an_grp_mt76x8[] = {FUNC ("jtag" ,3 ,42 ,1 ),FUNC ("utif" ,2 ,42 ,1 ),FUNC ("gpio" ,1 ,42 ,1 ),FUNC ("p1led_an" ,0 ,42 ,1 ), }; -static struct rt2880_pmx_func p0led_an_grp_mt7628[] = { +static struct rt2880_pmx_func p0led_an_grp_mt76x8[] = {FUNC ("jtag" ,3 ,43 ,1 ),FUNC ("rsvd" ,2 ,43 ,1 ),FUNC ("gpio" ,1 ,43 ,1 ),FUNC ("p0led_an" ,0 ,43 ,1 ), }; -static struct rt2880_pmx_func wled_an_grp_mt7628[] = { +static struct rt2880_pmx_func wled_an_grp_mt76x8[] = {FUNC ("rsvd" ,3 ,44 ,1 ),FUNC ("rsvd" ,2 ,44 ,1 ),FUNC ("gpio" ,1 ,44 ,1 ),FUNC ("wled_an" ,0 ,44 ,1 ), }; -#define MT7628_GPIO_MODE_MASK 0x3 - -#define MT7628_GPIO_MODE_P4LED_KN 58 -#define MT7628_GPIO_MODE_P3LED_KN 56 -#define MT7628_GPIO_MODE_P2LED_KN 54 -#define MT7628_GPIO_MODE_P1LED_KN 52 -#define MT7628_GPIO_MODE_P0LED_KN 50 -#define MT7628_GPIO_MODE_WLED_KN 48 -#define MT7628_GPIO_MODE_P4LED_AN 42 -#define MT7628_GPIO_MODE_P3LED_AN 40 -#define MT7628_GPIO_MODE_P2LED_AN 38 -#define MT7628_GPIO_MODE_P1LED_AN 36 -#define MT7628_GPIO_MODE_P0LED_AN 34 -#define MT7628_GPIO_MODE_WLED_AN 32 -#define MT7628_GPIO_MODE_PWM1 30 -#define MT7628_GPIO_MODE_PWM0 28 -#define MT7628_GPIO_MODE_UART2 26 -#define MT7628_GPIO_MODE_UART1 24 -#define MT7628_GPIO_MODE_I2C 20 -#define MT7628_GPIO_MODE_REFCLK 18 -#define MT7628_GPIO_MODE_PERST 16 -#define MT7628_GPIO_MODE_WDT 14 -#define MT7628_GPIO_MODE_SPI 12 -#define MT7628_GPIO_MODE_SDMODE 10 -#define MT7628_GPIO_MODE_UART0 8 -#define MT7628_GPIO_MODE_I2S 6 -#define MT7628_GPIO_MODE_CS1 4 -#define MT7628_GPIO_MODE_SPIS 2 -#define MT7628_GPIO_MODE_GPIO 0 - -static struct rt2880_pmx_group mt7628an_pinmux_data[] = { -GRP_G ("pwm1" , pwm1_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_PWM1 ), -GRP_G ("pwm0" , pwm0_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_PWM0 ), -GRP_G ("uart2" , uart2_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_UART2 ), -GRP_G ("uart1" , uart1_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_UART1 ), -GRP_G ("i2c" , i2c_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_I2C ), -GRP ("refclk" , refclk_grp_mt7628,1 ,MT7628_GPIO_MODE_REFCLK ), -GRP ("perst" , perst_grp_mt7628,1 ,MT7628_GPIO_MODE_PERST ), -GRP ("wdt" , wdt_grp_mt7628,1 ,MT7628_GPIO_MODE_WDT ), -GRP ("spi" , spi_grp_mt7628,1 ,MT7628_GPIO_MODE_SPI ), -GRP_G ("sdmode" , sd_mode_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_SDMODE ), -GRP_G ("uart0" , uart0_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_UART0 ), -GRP_G ("i2s" , i2s_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_I2S ), -GRP_G ("spi cs1" , spi_cs1_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_CS1 ), -GRP_G ("spis" , spis_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_SPIS ), -GRP_G ("gpio" , gpio_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_GPIO ), -GRP_G ("wled_an" , wled_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_WLED_AN ), -GRP_G ("p0led_an" , p0led_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P0LED_AN ), -GRP_G ("p1led_an" , p1led_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P1LED_AN ), -GRP_G ("p2led_an" , p2led_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P2LED_AN ), -GRP_G ("p3led_an" , p3led_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P3LED_AN ), -GRP_G ("p4led_an" , p4led_an_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P4LED_AN ), -GRP_G ("wled_kn" , wled_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_WLED_KN ), -GRP_G ("p0led_kn" , p0led_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P0LED_KN ), -GRP_G ("p1led_kn" , p1led_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P1LED_KN ), -GRP_G ("p2led_kn" , p2led_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P2LED_KN ), -GRP_G ("p3led_kn" , p3led_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P3LED_KN ), -GRP_G ("p4led_kn" , p4led_kn_grp_mt7628,MT7628_GPIO_MODE_MASK , -1 ,MT7628_GPIO_MODE_P4LED_KN ), +#define MT76X8_GPIO_MODE_MASK 0x3 + +#define MT76X8_GPIO_MODE_P4LED_KN 58 +#define MT76X8_GPIO_MODE_P3LED_KN 56 +#define MT76X8_GPIO_MODE_P2LED_KN 54 +#define MT76X8_GPIO_MODE_P1LED_KN 52 +#define MT76X8_GPIO_MODE_P0LED_KN 50 +#define MT76X8_GPIO_MODE_WLED_KN 48 +#define MT76X8_GPIO_MODE_P4LED_AN 42 +#define MT76X8_GPIO_MODE_P3LED_AN 40 +#define MT76X8_GPIO_MODE_P2LED_AN 38 +#define MT76X8_GPIO_MODE_P1LED_AN 36 +#define MT76X8_GPIO_MODE_P0LED_AN 34 +#define MT76X8_GPIO_MODE_WLED_AN 32 +#define MT76X8_GPIO_MODE_PWM1 30 +#define MT76X8_GPIO_MODE_PWM0 28 +#define MT76X8_GPIO_MODE_UART2 26 +#define MT76X8_GPIO_MODE_UART1 24 +#define MT76X8_GPIO_MODE_I2C 20 +#define MT76X8_GPIO_MODE_REFCLK 18 +#define MT76X8_GPIO_MODE_PERST 16 +#define MT76X8_GPIO_MODE_WDT 14 +#define MT76X8_GPIO_MODE_SPI 12 +#define MT76X8_GPIO_MODE_SDMODE 10 +#define MT76X8_GPIO_MODE_UART0 8 +#define MT76X8_GPIO_MODE_I2S 6 +#define MT76X8_GPIO_MODE_CS1 4 +#define MT76X8_GPIO_MODE_SPIS 2 +#define MT76X8_GPIO_MODE_GPIO 0 + +static struct rt2880_pmx_group mt76x8_pinmux_data[] = { +GRP_G ("pwm1" , pwm1_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_PWM1 ), +GRP_G ("pwm0" , pwm0_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_PWM0 ), +GRP_G ("uart2" , uart2_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_UART2 ), +GRP_G ("uart1" , uart1_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_UART1 ), +GRP_G ("i2c" , i2c_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_I2C ), +GRP ("refclk" , refclk_grp_mt76x8,1 ,MT76X8_GPIO_MODE_REFCLK ), +GRP ("perst" , perst_grp_mt76x8,1 ,MT76X8_GPIO_MODE_PERST ), +GRP ("wdt" , wdt_grp_mt76x8,1 ,MT76X8_GPIO_MODE_WDT ), +GRP ("spi" , spi_grp_mt76x8,1 ,MT76X8_GPIO_MODE_SPI ), +GRP_G ("sdmode" , sd_mode_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_SDMODE ), +GRP_G ("uart0" , uart0_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_UART0 ), +GRP_G ("i2s" , i2s_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_I2S ), +GRP_G ("spi cs1" , spi_cs1_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_CS1 ), +GRP_G ("spis" , spis_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_SPIS ), +GRP_G ("gpio" , gpio_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_GPIO ), +GRP_G ("wled_an" , wled_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_WLED_AN ), +GRP_G ("p0led_an" , p0led_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P0LED_AN ), +GRP_G ("p1led_an" , p1led_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P1LED_AN ), +GRP_G ("p2led_an" , p2led_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P2LED_AN ), +GRP_G ("p3led_an" , p3led_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P3LED_AN ), +GRP_G ("p4led_an" , p4led_an_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P4LED_AN ), +GRP_G ("wled_kn" , wled_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_WLED_KN ), +GRP_G ("p0led_kn" , p0led_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P0LED_KN ), +GRP_G ("p1led_kn" , p1led_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P1LED_KN ), +GRP_G ("p2led_kn" , p2led_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P2LED_KN ), +GRP_G ("p3led_kn" , p3led_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P3LED_KN ), +GRP_G ("p4led_kn" , p4led_kn_grp_mt76x8,MT76X8_GPIO_MODE_MASK , +1 ,MT76X8_GPIO_MODE_P4LED_KN ), {0 } };static int mt7620_pinmux_probe (struct platform_device *pdev) {if (is_mt76x8 ()) -return rt2880_pinmux_init (pdev, mt7628an_pinmux_data); +return rt2880_pinmux_init (pdev, mt76x8_pinmux_data);else return rt2880_pinmux_init (pdev, mt7620a_pinmux_data); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/201 pinctrl: ralink: rename pinctrl-rt2880 to pinctrl-ralink
In reply to Greg Kroah-HartmanFrom: Arınç ÜNAL <[email protected]>
[ Upstream commit 6b3dd85b0bdec1a8308fa5dcbafcd5d55b5f3608 ]
pinctrl-rt2880.c and pinmux.h make up the Ralink pinctrl driver. Rename pinctrl-rt2880.c to pinctrl-ralink.c. Rename pinmux.h to pinctrl-ralink.h. Fix references to it. Rename functions that include "rt2880" to "ralink".
Remove PINCTRL_RT2880 symbol and make the existing PINCTRL_RALINK symbol compile pinctrl-ralink.c. Change the bool to "Ralink pinctrl driver".
---
drivers/pinctrl/ralink/Kconfig | 16 ++--
drivers/pinctrl/ralink/Makefile | 2 +-
drivers/pinctrl/ralink/pinctrl-mt7620.c | 92 +++++++++----------
drivers/pinctrl/ralink/pinctrl-mt7621.c | 30 +++---
.../{pinctrl-rt2880.c => pinctrl-ralink.c} | 90 +++++++++---------
.../ralink/{pinmux.h => pinctrl-ralink.h} | 16 ++--
drivers/pinctrl/ralink/pinctrl-rt288x.c | 20 ++--
drivers/pinctrl/ralink/pinctrl-rt305x.c | 44 ++++-----
drivers/pinctrl/ralink/pinctrl-rt3883.c | 28 +++---
9 files changed, 167 insertions(+), 171 deletions(-)
rename drivers/pinctrl/ralink/{pinctrl-rt2880.c => pinctrl-ralink.c} (73%)
rename drivers/pinctrl/ralink/{pinmux.h => pinctrl-ralink.h} (75%)drivers/pinctrl/ralink/Kconfig +6 -10
@@ -3,37 +3,33 @@ menu "Ralink pinctrl drivers" depends on RALINK config PINCTRL_RALINK - bool "Ralink pin control support" - default y if RALINK - -config PINCTRL_RT2880 - bool "RT2880 pinctrl driver for RALINK/Mediatek SOCs" + bool "Ralink pinctrl driver" select PINMUX select GENERIC_PINCONF config PINCTRL_MT7620 bool "mt7620 pinctrl driver for RALINK/Mediatek SOCs" depends on RALINK && SOC_MT7620 - select PINCTRL_RT2880 + select PINCTRL_RALINK config PINCTRL_MT7621 bool "mt7621 pinctrl driver for RALINK/Mediatek SOCs" depends on RALINK && SOC_MT7621 - select PINCTRL_RT2880 + select PINCTRL_RALINK config PINCTRL_RT288X bool "RT288X pinctrl driver for RALINK/Mediatek SOCs" depends on RALINK && SOC_RT288X - select PINCTRL_RT2880 + select PINCTRL_RALINK config PINCTRL_RT305X bool "RT305X pinctrl driver for RALINK/Mediatek SOCs" depends on RALINK && SOC_RT305X - select PINCTRL_RT2880 + select PINCTRL_RALINK config PINCTRL_RT3883 bool "RT3883 pinctrl driver for RALINK/Mediatek SOCs" depends on RALINK && SOC_RT3883 - select PINCTRL_RT2880 + select PINCTRL_RALINK endmenu
drivers/pinctrl/ralink/Makefile +1 -1
@@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -obj-$(CONFIG_PINCTRL_RT2880) += pinctrl-rt2880.o +obj-$(CONFIG_PINCTRL_RALINK) += pinctrl-ralink.o obj-$(CONFIG_PINCTRL_MT7620) += pinctrl-mt7620.o obj-$(CONFIG_PINCTRL_MT7621) += pinctrl-mt7621.o
drivers/pinctrl/ralink/pinctrl-mt7620.c +46 -46
275 lines not on this page · raw message
drivers/pinctrl/ralink/pinctrl-mt7621.c +15 -15
@@ -3,7 +3,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/of.h> -#include "pinmux.h" +#include "pinctrl-ralink.h" #define MT7621_GPIO_MODE_UART1 1#define MT7621_GPIO_MODE_I2C 2
@@ -34,40 +34,40 @@#define MT7621_GPIO_MODE_SDHCI_SHIFT 18#define MT7621_GPIO_MODE_SDHCI_GPIO 1 -static struct rt2880_pmx_func uart1_grp[] = {FUNC ("uart1" ,0 ,1 ,2 ) }; -static struct rt2880_pmx_func i2c_grp[] = {FUNC ("i2c" ,0 ,3 ,2 ) }; -static struct rt2880_pmx_func uart3_grp[] = { +static struct ralink_pmx_func uart1_grp[] = {FUNC ("uart1" ,0 ,1 ,2 ) }; +static struct ralink_pmx_func i2c_grp[] = {FUNC ("i2c" ,0 ,3 ,2 ) }; +static struct ralink_pmx_func uart3_grp[] = {FUNC ("uart3" ,0 ,5 ,4 ),FUNC ("i2s" ,2 ,5 ,4 ),FUNC ("spdif3" ,3 ,5 ,4 ), }; -static struct rt2880_pmx_func uart2_grp[] = { +static struct ralink_pmx_func uart2_grp[] = {FUNC ("uart2" ,0 ,9 ,4 ),FUNC ("pcm" ,2 ,9 ,4 ),FUNC ("spdif2" ,3 ,9 ,4 ), }; -static struct rt2880_pmx_func jtag_grp[] = {FUNC ("jtag" ,0 ,13 ,5 ) }; -static struct rt2880_pmx_func wdt_grp[] = { +static struct ralink_pmx_func jtag_grp[] = {FUNC ("jtag" ,0 ,13 ,5 ) }; +static struct ralink_pmx_func wdt_grp[] = {FUNC ("wdt rst" ,0 ,18 ,1 ),FUNC ("wdt refclk" ,2 ,18 ,1 ), }; -static struct rt2880_pmx_func pcie_rst_grp[] = { +static struct ralink_pmx_func pcie_rst_grp[] = {FUNC ("pcie rst" ,MT7621_GPIO_MODE_PCIE_RST ,19 ,1 ),FUNC ("pcie refclk" ,MT7621_GPIO_MODE_PCIE_REF ,19 ,1 ) }; -static struct rt2880_pmx_func mdio_grp[] = {FUNC ("mdio" ,0 ,20 ,2 ) }; -static struct rt2880_pmx_func rgmii2_grp[] = {FUNC ("rgmii2" ,0 ,22 ,12 ) }; -static struct rt2880_pmx_func spi_grp[] = { +static struct ralink_pmx_func mdio_grp[] = {FUNC ("mdio" ,0 ,20 ,2 ) }; +static struct ralink_pmx_func rgmii2_grp[] = {FUNC ("rgmii2" ,0 ,22 ,12 ) }; +static struct ralink_pmx_func spi_grp[] = {FUNC ("spi" ,0 ,34 ,7 ),FUNC ("nand1" ,2 ,34 ,7 ), }; -static struct rt2880_pmx_func sdhci_grp[] = { +static struct ralink_pmx_func sdhci_grp[] = {FUNC ("sdhci" ,0 ,41 ,8 ),FUNC ("nand2" ,2 ,41 ,8 ), }; -static struct rt2880_pmx_func rgmii1_grp[] = {FUNC ("rgmii1" ,0 ,49 ,12 ) }; +static struct ralink_pmx_func rgmii1_grp[] = {FUNC ("rgmii1" ,0 ,49 ,12 ) }; -static struct rt2880_pmx_group mt7621_pinmux_data[] = { +static struct ralink_pmx_group mt7621_pinmux_data[] = {GRP ("uart1" , uart1_grp,1 ,MT7621_GPIO_MODE_UART1 ),GRP ("i2c" , i2c_grp,1 ,MT7621_GPIO_MODE_I2C ), GRP_G("uart3", uart3_grp, MT7621_GPIO_MODE_UART3_MASK,
@@ -92,7 +92,7 @@ static struct rt2880_pmx_group mt7621_pinmux_data[] = {static int mt7621_pinmux_probe (struct platform_device *pdev) { -return rt2880_pinmux_init (pdev, mt7621_pinmux_data); +return ralink_pinmux_init (pdev, mt7621_pinmux_data); }static const struct of_device_id mt7621_pinmux_match[] = {
drivers/pinctrl/ralink/pinctrl-ralink.c renamed from drivers/pinctrl/ralink/pinctrl-rt2880.c +45 -45
219 lines not on this page · raw message
drivers/pinctrl/ralink/pinctrl-ralink.h renamed from drivers/pinctrl/ralink/pinmux.h +8 -8
@@ -3,8 +3,8 @@* Copyright (C) 2012 John Crispin <[email protected]> */ -#ifndef _RT288X_PINMUX_H__ -#define _RT288X_PINMUX_H__ +#ifndef _PINCTRL_RALINK_H__ +#define _PINCTRL_RALINK_H__#define FUNC (name, value, pin_first, pin_count) \ { name, value, pin_first, pin_count }
@@ -19,9 +19,9 @@ .func = _func, .gpio = _gpio, \ .func_count = ARRAY_SIZE(_func) } -struct rt2880_pmx_group ; +struct ralink_pmx_group ; -struct rt2880_pmx_func { +struct ralink_pmx_func {const char *name;const char value;
@@ -35,7 +35,7 @@ struct rt2880_pmx_func {int enabled; }; -struct rt2880_pmx_group { +struct ralink_pmx_group {const char *name;int enabled;
@@ -43,11 +43,11 @@ struct rt2880_pmx_group {const char mask;const char gpio; -struct rt2880_pmx_func *func; +struct ralink_pmx_func *func; int func_count; }; -int rt2880_pinmux_init (struct platform_device *pdev, -struct rt2880_pmx_group *data); +int ralink_pinmux_init (struct platform_device *pdev, +struct ralink_pmx_group *data);#endif
drivers/pinctrl/ralink/pinctrl-rt288x.c +10 -10
@@ -4,7 +4,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/of.h> -#include "pinmux.h" +#include "pinctrl-ralink.h" #define RT2880_GPIO_MODE_I2C BIT(0)#define RT2880_GPIO_MODE_UART0 BIT(1)
@@ -15,15 +15,15 @@#define RT2880_GPIO_MODE_SDRAM BIT(6)#define RT2880_GPIO_MODE_PCI BIT(7) -static struct rt2880_pmx_func i2c_func[] = {FUNC ("i2c" ,0 ,1 ,2 ) }; -static struct rt2880_pmx_func spi_func[] = {FUNC ("spi" ,0 ,3 ,4 ) }; -static struct rt2880_pmx_func uartlite_func[] = {FUNC ("uartlite" ,0 ,7 ,8 ) }; -static struct rt2880_pmx_func jtag_func[] = {FUNC ("jtag" ,0 ,17 ,5 ) }; -static struct rt2880_pmx_func mdio_func[] = {FUNC ("mdio" ,0 ,22 ,2 ) }; -static struct rt2880_pmx_func sdram_func[] = {FUNC ("sdram" ,0 ,24 ,16 ) }; -static struct rt2880_pmx_func pci_func[] = {FUNC ("pci" ,0 ,40 ,32 ) }; +static struct ralink_pmx_func i2c_func[] = {FUNC ("i2c" ,0 ,1 ,2 ) }; +static struct ralink_pmx_func spi_func[] = {FUNC ("spi" ,0 ,3 ,4 ) }; +static struct ralink_pmx_func uartlite_func[] = {FUNC ("uartlite" ,0 ,7 ,8 ) }; +static struct ralink_pmx_func jtag_func[] = {FUNC ("jtag" ,0 ,17 ,5 ) }; +static struct ralink_pmx_func mdio_func[] = {FUNC ("mdio" ,0 ,22 ,2 ) }; +static struct ralink_pmx_func sdram_func[] = {FUNC ("sdram" ,0 ,24 ,16 ) }; +static struct ralink_pmx_func pci_func[] = {FUNC ("pci" ,0 ,40 ,32 ) }; -static struct rt2880_pmx_group rt2880_pinmux_data_act[] = { +static struct ralink_pmx_group rt2880_pinmux_data_act[] = {GRP ("i2c" , i2c_func,1 ,RT2880_GPIO_MODE_I2C ),GRP ("spi" , spi_func,1 ,RT2880_GPIO_MODE_SPI ),GRP ("uartlite" , uartlite_func,1 ,RT2880_GPIO_MODE_UART0 ),
@@ -36,7 +36,7 @@ static struct rt2880_pmx_group rt2880_pinmux_data_act[] = {static int rt288x_pinmux_probe (struct platform_device *pdev) { -return rt2880_pinmux_init (pdev, rt2880_pinmux_data_act); +return ralink_pinmux_init (pdev, rt2880_pinmux_data_act); }static const struct of_device_id rt288x_pinmux_match[] = {
drivers/pinctrl/ralink/pinctrl-rt305x.c +22 -22
91 lines not on this page · raw message
drivers/pinctrl/ralink/pinctrl-rt3883.c +14 -14
@@ -3,7 +3,7 @@#include <linux/module.h> #include <linux/platform_device.h> #include <linux/of.h> -#include "pinmux.h" +#include "pinctrl-ralink.h" #define RT3883_GPIO_MODE_UART0_SHIFT 2#define RT3883_GPIO_MODE_UART0_MASK 0x7
@@ -39,9 +39,9 @@#define RT3883_GPIO_MODE_LNA_G_GPIO 0x3#define RT3883_GPIO_MODE_LNA_G _RT3883_GPIO_MODE_LNA_G(RT3883_GPIO_MODE_LNA_G_MASK) -static struct rt2880_pmx_func i2c_func[] = {FUNC ("i2c" ,0 ,1 ,2 ) }; -static struct rt2880_pmx_func spi_func[] = {FUNC ("spi" ,0 ,3 ,4 ) }; -static struct rt2880_pmx_func uartf_func[] = { +static struct ralink_pmx_func i2c_func[] = {FUNC ("i2c" ,0 ,1 ,2 ) }; +static struct ralink_pmx_func spi_func[] = {FUNC ("spi" ,0 ,3 ,4 ) }; +static struct ralink_pmx_func uartf_func[] = {FUNC ("uartf" ,RT3883_GPIO_MODE_UARTF ,7 ,8 ),FUNC ("pcm uartf" ,RT3883_GPIO_MODE_PCM_UARTF ,7 ,8 ),FUNC ("pcm i2s" ,RT3883_GPIO_MODE_PCM_I2S ,7 ,8 ),
@@ -50,21 +50,21 @@ static struct rt2880_pmx_func uartf_func[] = { FUNC("gpio uartf", RT3883_GPIO_MODE_GPIO_UARTF, 7, 4), FUNC("gpio i2s", RT3883_GPIO_MODE_GPIO_I2S, 7, 4), }; -static struct rt2880_pmx_func uartlite_func[] = {FUNC ("uartlite" ,0 ,15 ,2 ) }; -static struct rt2880_pmx_func jtag_func[] = {FUNC ("jtag" ,0 ,17 ,5 ) }; -static struct rt2880_pmx_func mdio_func[] = {FUNC ("mdio" ,0 ,22 ,2 ) }; -static struct rt2880_pmx_func lna_a_func[] = {FUNC ("lna a" ,0 ,32 ,3 ) }; -static struct rt2880_pmx_func lna_g_func[] = {FUNC ("lna g" ,0 ,35 ,3 ) }; -static struct rt2880_pmx_func pci_func[] = { +static struct ralink_pmx_func uartlite_func[] = {FUNC ("uartlite" ,0 ,15 ,2 ) }; +static struct ralink_pmx_func jtag_func[] = {FUNC ("jtag" ,0 ,17 ,5 ) }; +static struct ralink_pmx_func mdio_func[] = {FUNC ("mdio" ,0 ,22 ,2 ) }; +static struct ralink_pmx_func lna_a_func[] = {FUNC ("lna a" ,0 ,32 ,3 ) }; +static struct ralink_pmx_func lna_g_func[] = {FUNC ("lna g" ,0 ,35 ,3 ) }; +static struct ralink_pmx_func pci_func[] = {FUNC ("pci-dev" ,0 ,40 ,32 ),FUNC ("pci-host2" ,1 ,40 ,32 ),FUNC ("pci-host1" ,2 ,40 ,32 ),FUNC ("pci-fnc" ,3 ,40 ,32 ) }; -static struct rt2880_pmx_func ge1_func[] = {FUNC ("ge1" ,0 ,72 ,12 ) }; -static struct rt2880_pmx_func ge2_func[] = {FUNC ("ge2" ,0 ,84 ,12 ) }; +static struct ralink_pmx_func ge1_func[] = {FUNC ("ge1" ,0 ,72 ,12 ) }; +static struct ralink_pmx_func ge2_func[] = {FUNC ("ge2" ,0 ,84 ,12 ) }; -static struct rt2880_pmx_group rt3883_pinmux_data[] = { +static struct ralink_pmx_group rt3883_pinmux_data[] = {GRP ("i2c" , i2c_func,1 ,RT3883_GPIO_MODE_I2C ),GRP ("spi" , spi_func,1 ,RT3883_GPIO_MODE_SPI ), GRP("uartf", uartf_func, RT3883_GPIO_MODE_UART0_MASK,
@@ -83,7 +83,7 @@ static struct rt2880_pmx_group rt3883_pinmux_data[] = {static int rt3883_pinmux_probe (struct platform_device *pdev) { -return rt2880_pinmux_init (pdev, rt3883_pinmux_data); +return ralink_pinmux_init (pdev, rt3883_pinmux_data); }static const struct of_device_id rt3883_pinmux_match[] = {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/201 pinctrl: ralink: Check for null return of devm_kcalloc
In reply to Greg Kroah-HartmanFrom: William Dean <[email protected]>
[ Upstream commit c3b821e8e406d5650e587b7ac624ac24e9b780a8 ]
Because of the possible failure of the allocation, data->domains might be NULL pointer and will cause the dereference of the NULL pointer later.
Therefore, it might be better to check it and directly return -ENOMEM without releasing data manually if fails, because the comment of the devm_kmalloc() says "Memory allocated with this function is automatically freed on driver detach.".
--- drivers/pinctrl/ralink/pinctrl-ralink.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pinctrl/ralink/pinctrl-ralink.c +2 -0
@@ -266,6 +266,8 @@ static int ralink_pinmux_pins(struct ralink_priv *p) p->func[i]->pin_count,sizeof (int ), GFP_KERNEL); +if (!p->func[i]->pins) +return -ENOMEM ;for (j =0 ; j < p->func[i]->pin_count; j++) p->func[i]->pins[j] = p->func[i]->pin_first + j;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/201 perf/core: Fix data race between perf_event_set_output() and perf_mmap_close()
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit 68e3c69803dada336893640110cb87221bb01dcf ]
Yang Jihing reported a race between perf_event_set_output() and perf_mmap_close():
CPU1 CPU2 perf_mmap_close(e2) if (atomic_dec_and_test(&e2->rb->mmap_count)) // 1 - > 0 detach_rest = true ioctl(e1, IOC_SET_OUTPUT, e2) perf_event_set_output(e1, e2) ... list_for_each_entry_rcu(e, &e2->rb->event_list, rb_entry) ring_buffer_attach(e, NULL); // e1 isn't yet added and // therefore not detached ring_buffer_attach(e1, e2->rb) list_add_rcu(&e1->rb_entry, &e2->rb->event_list)
After this; e1 is attached to an unmapped rb and a subsequent perf_mmap() will loop forever more:
again:
mutex_lock(&e->mmap_mutex);
if (event->rb) {
...
if (!atomic_inc_not_zero(&e->rb->mmap_count)) {
...
mutex_unlock(&e->mmap_mutex);
goto again;
}
}The loop in perf_mmap_close() holds e2->mmap_mutex, while the attach in perf_event_set_output() holds e1->mmap_mutex. As such there is no serialization to avoid this race.
Change perf_event_set_output() to take both e1->mmap_mutex and e2->mmap_mutex to alleviate that problem. Additionally, have the loop in perf_mmap() detach the rb directly, this avoids having to wait for the concurrent perf_mmap_close() to get around to doing it to make progress.
--- kernel/events/core.c | 45 ++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-)
kernel/events/core.c +31 -14
@@ -6355,10 +6355,10 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)if (!atomic_inc_not_zero (&event->rb->mmap_count)) {/* -* Raced against perf_mmap_close() through -* perf_event_set_output(). Try again, hope for better -* luck. +* Raced against perf_mmap_close(); remove the +* event and try again. */ +ring_buffer_attach (event,NULL );mutex_unlock (&event->mmap_mutex); goto again; }
@@ -11892,14 +11892,25 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr, goto out; } +static void mutex_lock_double (struct mutex *a,struct mutex *b) +{ +if (b < a) +swap (a, b); + +mutex_lock (a); +mutex_lock_nested (b,SINGLE_DEPTH_NESTING ); +} +static int perf_event_set_output (struct perf_event *event,struct perf_event *output_event) {struct perf_buffer *rb =NULL ;int ret = -EINVAL ; -if (!output_event) +if (!output_event) { +mutex_lock (&event->mmap_mutex); goto set; + }/* don't allow circular references */ if (event == output_event)
@@ -11937,8 +11948,15 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event) event->pmu != output_event->pmu) goto out; +/* +* Hold both mmap_mutex to serialize against perf_mmap_close(). Since +* output_event is already on rb->event_list, and the list iteration +* restarts after every removal, it is guaranteed this new event is +* observed *OR* if output_event is already removed, it's guaranteed we +* observe !rb->mmap_count. +*/ +mutex_lock_double (&event->mmap_mutex, &output_event->mmap_mutex); set: -mutex_lock (&event->mmap_mutex);/* Can't redirect output if we've got an active mmap() */ if (atomic_read (&event->mmap_count)) goto unlock;
@@ -11948,6 +11966,12 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event) rb =ring_buffer_get (output_event);if (!rb) goto unlock; + +/* did we race against perf_mmap_close() */ +if (!atomic_read (&rb->mmap_count)) { +ring_buffer_put (rb); + goto unlock; + } }ring_buffer_attach (event, rb);
@@ -11955,20 +11979,13 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event) ret =0 ; unlock:mutex_unlock (&event->mmap_mutex); +if (output_event) +mutex_unlock (&output_event->mmap_mutex); out:return ret; } -static void mutex_lock_double (struct mutex *a,struct mutex *b) -{ -if (b < a) -swap (a, b); - -mutex_lock (a); -mutex_lock_nested (b,SINGLE_DEPTH_NESTING ); -} -static int perf_event_set_clock (struct perf_event *event,clockid_t clk_id) {bool nmi_safe = false;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 37/201 ipv4/tcp: do not use per netns ctl sockets
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 37ba017dcc3b1123206808979834655ddcf93251 ]
TCP ipv4 uses per-cpu/per-netns ctl sockets in order to send RST and some ACK packets (on behalf of TIMEWAIT sockets).
This adds memory and cpu costs, which do not seem needed. Now typical servers have 256 or more cores, this adds considerable tax to netns users.
tcp sockets are used from BH context, are not receiving packets, and do not store any persistent state but the 'struct net' pointer in order to be able to use IPv4 output functions.
Note that I attempted a related change in the past, that had
to be hot-fixed in commit bdbbb8527b6f ("ipv4: tcp: get rid of ugly unicast_sock")
This patch could very well surface old bugs, on layers not taking care of sk->sk_kern_sock properly.
--- include/net/netns/ipv4.h | 1 - net/ipv4/tcp_ipv4.c | 61 ++++++++++++++++++---------------------- 2 files changed, 27 insertions(+), 35 deletions(-)
include/net/netns/ipv4.h +0 -1
@@ -74,7 +74,6 @@ struct netns_ipv4 {struct sock *mc_autojoin_sk;struct inet_peer_base *peers; -struct sock *__percpu *tcp_sk;struct fqdir *fqdir;u8 sysctl_icmp_echo_ignore_all;
net/ipv4/tcp_ipv4.c +27 -34
116 lines not on this page · raw message
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 38/201 net: tun: split run_ebpf_filter() and pskb_trim() into different "if statement"
In reply to Greg Kroah-HartmanFrom: Dongli Zhang <[email protected]>
[ Upstream commit 45a15d89fbcd280571eba8e5ca309e14ba6afa8f ]
No functional change.
Just to split the if statement into different conditions to use kfree_skb_reason() to trace the reason later.
--- drivers/net/tun.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/tun.c +4 -1
@@ -1097,7 +1097,10 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) goto drop; len =run_ebpf_filter (tun, skb, len); -if (len ==0 ||pskb_trim (skb, len)) +if (len ==0 ) + goto drop; + +if (pskb_trim (skb, len)) goto drop;if (unlikely (skb_orphan_frags_rx (skb,GFP_ATOMIC )))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 39/201 mm/pagealloc: sysctl: change watermark_scale_factor max limit to 30%
In reply to Greg Kroah-HartmanFrom: Suren Baghdasaryan <[email protected]>
[ Upstream commit 39c65a94cd9661532be150e88f8b02f4a6844a35 ]
For embedded systems with low total memory, having to run applications with relatively large memory requirements, 10% max limitation for watermark_scale_factor poses an issue of triggering direct reclaim every time such application is started. This results in slow application startup times and bad end-user experience.
By increasing watermark_scale_factor max limit we allow vendors more flexibility to choose the right level of kswapd aggressiveness for their device and workload requirements.
--- Documentation/admin-guide/sysctl/vm.rst | 2 +- kernel/sysctl.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)
Documentation/admin-guide/sysctl/vm.rst +1 -1
@@ -948,7 +948,7 @@ how much memory needs to be free before kswapd goes back to sleep. The unit is in fractions of 10,000. The default value of 10 means the distances between watermarks are 0.1% of the available memory in the -node/system. The maximum value is 1000, or 10% of memory. +node/system. The maximum value is 3000, or 30% of memory. A high rate of threads entering direct reclaim (allocstall) or kswapd going to sleep prematurely (kswapd_low_wmark_hit_quickly) can indicate
kernel/sysctl.c +2 -1
@@ -122,6 +122,7 @@ static unsigned long long_max = LONG_MAX;static int one_hundred =100 ;static int two_hundred =200 ;static int one_thousand =1000 ; +static int three_thousand =3000 ;#ifdef CONFIG_PRINTK static int ten_thousand =10000 ;#endif
@@ -2971,7 +2972,7 @@ static struct ctl_table vm_table[] = { .mode = 0644, .proc_handler = watermark_scale_factor_sysctl_handler, .extra1 = SYSCTL_ONE, - .extra2 = &one_thousand, + .extra2 = &three_thousand, }, { .procname = "percpu_pagelist_high_fraction",
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 40/201 sysctl: move some boundary constants from sysctl.c to sysctl_vals
In reply to Greg Kroah-HartmanFrom: Xiaoming Ni <[email protected]>
[ Upstream commit 78e36f3b0dae586f623c4a37ec5eb5496f5abbe1 ]
sysctl has helpers which let us specify boundary values for a min or max int value. Since these are used for a boundary check only they don't change, so move these variables to sysctl_vals to avoid adding duplicate variables. This will help with our cleanup of kernel/sysctl.c.
[[email protected]: update it for "mm/pagealloc: sysctl: change watermark_scale_factor max limit to 30%"] [[email protected]: major rebase]
--- fs/proc/proc_sysctl.c | 2 +- include/linux/sysctl.h | 13 +++++++++--- kernel/sysctl.c | 45 ++++++++++++++++++------------------------ 3 files changed, 30 insertions(+), 30 deletions(-)
fs/proc/proc_sysctl.c +1 -1
@@ -25,7 +25,7 @@ static const struct file_operations proc_sys_dir_file_operations;static const struct inode_operations proc_sys_dir_operations;/* shared constants to be used in various sysctls */ -const int sysctl_vals[] = {0 ,1 ,INT_MAX }; +const int sysctl_vals[] = {-1 ,0 ,1 ,2 ,4 ,100 ,200 ,1000 ,3000 ,INT_MAX };EXPORT_SYMBOL (sysctl_vals);/* Support for permanently empty directories */
include/linux/sysctl.h +10 -3
@@ -38,9 +38,16 @@ struct ctl_table_header;struct ctl_dir ;/* Keep the same order as in fs/proc/proc_sysctl.c */ -#define SYSCTL_ZERO ((void *)&sysctl_vals[0]) -#define SYSCTL_ONE ((void *)&sysctl_vals[1]) -#define SYSCTL_INT_MAX ((void *)&sysctl_vals[2]) +#define SYSCTL_NEG_ONE ((void *)&sysctl_vals[0]) +#define SYSCTL_ZERO ((void *)&sysctl_vals[1]) +#define SYSCTL_ONE ((void *)&sysctl_vals[2]) +#define SYSCTL_TWO ((void *)&sysctl_vals[3]) +#define SYSCTL_FOUR ((void *)&sysctl_vals[4]) +#define SYSCTL_ONE_HUNDRED ((void *)&sysctl_vals[5]) +#define SYSCTL_TWO_HUNDRED ((void *)&sysctl_vals[6]) +#define SYSCTL_ONE_THOUSAND ((void *)&sysctl_vals[7]) +#define SYSCTL_THREE_THOUSAND ((void *)&sysctl_vals[8]) +#define SYSCTL_INT_MAX ((void *)&sysctl_vals[9])extern const int sysctl_vals[];
kernel/sysctl.c +19 -26
168 lines not on this page · raw message
Signature · 1 line
2.35.1
Re: [PATCH 5.15 040/201] sysctl: move some boundary constants from sysctl.c to sysctl_vals
Quoted 12 lines · Greg Kroah-Hartman
From: Xiaoming Ni <[email protected]>
[ Upstream commit
78e36f3b0dae586f623c4a37ec5eb5496f5abbe1]sysctl has helpers which let us specify boundary values for a min or max int value. Since these are used for a boundary check only they don't change, so move these variables to
sysctl_valsto avoid adding duplicate variables. This will help with our cleanup ofkernel/sysctl.c.[[email protected]: update it for "mm/pagealloc: sysctl: change
watermark_scale_factormax limit to 30%"] [[email protected]: major rebase]
Quoted 7 lines
Signed-off-by Xiaoming Ni <[email protected]>Signed-off-by Luis Chamberlain <[email protected]>Reviewed-by Kees Cook <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Sasha Levin <[email protected]>
I'm a bit puzzled. How / why is this a stable fix?
Luis
Greg Kroah-Hartman
maintainerRe: [PATCH 5.15 040/201] sysctl: move some boundary constants from sysctl.c to sysctl_vals
Quoted 21 lines · Luis Chamberlain
Quoted 12 lines · Greg Kroah-Hartman
From: Xiaoming Ni <[email protected]>
[ Upstream commit
78e36f3b0dae586f623c4a37ec5eb5496f5abbe1]sysctl has helpers which let us specify boundary values for a min or max int value. Since these are used for a boundary check only they don't change, so move these variables to
sysctl_valsto avoid adding duplicate variables. This will help with our cleanup ofkernel/sysctl.c.[[email protected]: update it for "mm/pagealloc: sysctl: change
watermark_scale_factormax limit to 30%"] [[email protected]: major rebase]Quoted 7 lines
Signed-off-by Xiaoming Ni <[email protected]>Signed-off-by Luis Chamberlain <[email protected]>Reviewed-by Kees Cook <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 1 line
I'm a bit puzzled. How / why is this a stable fix?
I think it's needed by a patch later in the series. Sasha, can you verify?
thanks,
greg k-h
Sasha Levin
maintainerRe: [PATCH 5.15 040/201] sysctl: move some boundary constants from sysctl.c to sysctl_vals
Quoted 22 lines · Greg Kroah-Hartman
Quoted 21 lines · Luis Chamberlain
Quoted 19 lines · Greg Kroah-Hartman
From: Xiaoming Ni <[email protected]>
[ Upstream commit
78e36f3b0dae586f623c4a37ec5eb5496f5abbe1]sysctl has helpers which let us specify boundary values for a min or max int value. Since these are used for a boundary check only they don't change, so move these variables to
sysctl_valsto avoid adding duplicate variables. This will help with our cleanup ofkernel/sysctl.c.[[email protected]: update it for "mm/pagealloc: sysctl: change
watermark_scale_factormax limit to 30%"] [[email protected]: major rebase]Signed-off-by Xiaoming Ni <[email protected]>Signed-off-by Luis Chamberlain <[email protected]>Reviewed-by Kees Cook <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 4 lines
Quoted 1 line
I'm a bit puzzled. How / why is this a stable fix?
I think it's needed by a patch later in the series. Sasha, can you verify?
Yes, about 30 patches in this series need this patch.
Signature · 2 lines
Thanks, Sasha
Greg Kroah-Hartman
maintainerPATCH 41/201 tcp: Fix data-races around sysctl_tcp_ecn.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 4785a66702f086cf2ea84bdbe6ec921f274bd9f2 ]
While reading sysctl_tcp_ecn, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c | 2 +- net/ipv4/syncookies.c | 2 +- net/ipv4/sysctl_net_ipv4.c | 2 ++ net/ipv4/tcp_input.c | 2 +- net/ipv4/tcp_output.c | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +1 -1
@@ -1392,7 +1392,7 @@ static void chtls_pass_accept_request(struct sock *sk, th_ecn = tcph->ece && tcph->cwr;if (th_ecn) { ect = !INET_ECN_is_not_ect (ip_dsfield); - ecn_ok =sock_net (sk)->ipv4.sysctl_tcp_ecn; + ecn_ok =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_ecn);if ((!ect && ecn_ok) ||tcp_ca_needs_ecn (sk))inet_rsk (oreq)->ecn_ok =1 ; }
net/ipv4/syncookies.c +1 -1
@@ -275,7 +275,7 @@ bool cookie_ecn_ok(const struct tcp_options_received *tcp_opt,if (!ecn_ok)return false; -if (net->ipv4.sysctl_tcp_ecn) +if (READ_ONCE (net->ipv4.sysctl_tcp_ecn))return true;return dst_feature (dst,RTAX_FEATURE_ECN );
net/ipv4/sysctl_net_ipv4.c +2 -0
@@ -689,6 +689,8 @@ static struct ctl_table ipv4_net_table[] = { .maxlen = sizeof(u8), .mode = 0644, .proc_handler = proc_dou8vec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_TWO, }, { .procname = "tcp_ecn_fallback",
net/ipv4/tcp_input.c +1 -1
@@ -6669,7 +6669,7 @@ static void tcp_ecn_create_request(struct request_sock *req, ect = !INET_ECN_is_not_ect (TCP_SKB_CB (skb)->ip_dsfield); ecn_ok_dst =dst_feature (dst,DST_FEATURE_ECN_MASK ); - ecn_ok = net->ipv4.sysctl_tcp_ecn || ecn_ok_dst; + ecn_ok =READ_ONCE (net->ipv4.sysctl_tcp_ecn) || ecn_ok_dst; if (((!ect || th->res1) && ecn_ok) || tcp_ca_needs_ecn(listen_sk) || (ecn_ok_dst & DST_FEATURE_ECN_CA) ||
net/ipv4/tcp_output.c +1 -1
@@ -324,7 +324,7 @@ static void tcp_ecn_send_syn(struct sock *sk, struct sk_buff *skb) {struct tcp_sock *tp =tcp_sk (sk);bool bpf_needs_ecn =tcp_bpf_ca_needs_ecn (sk); -bool use_ecn =sock_net (sk)->ipv4.sysctl_tcp_ecn ==1 || +bool use_ecn =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_ecn) ==1 ||tcp_ca_needs_ecn (sk) || bpf_needs_ecn;if (!use_ecn) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 42/201 drm/amd/display: Support for DMUB HPD interrupt handling
In reply to Greg Kroah-HartmanFrom: Jude Shih <[email protected]>
[ Upstream commit e27c41d5b0681c597ac1894f4e02cf626e062250 ]
[WHY]
To add support for HPD interrupt handling from DMUB. HPD interrupt could be triggered from outbox1 from DMUB
[HOW]
1) Use queue_work to handle hpd task from outbox1
2) Add handle_hpd_irq_helper to share interrupt handling code between legacy and DMUB HPD from outbox1
3) Added DMUB HPD handling in dmub_srv_stat_get_notification(). HPD handling callback function and wake up the DMUB thread.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 171 +++++++++++++++++- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 40 ++++ 2 files changed, 203 insertions(+), 8 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +163 -8
@@ -215,6 +215,8 @@ static void handle_cursor_update(struct drm_plane *plane,static const struct drm_format_info *amd_get_format_info (const struct drm_mode_fb_cmd2 *cmd); +static void handle_hpd_irq_helper (struct amdgpu_dm_connector *aconnector); +static bool is_timing_unchanged_for_freesync (struct drm_crtc_state *old_crtc_state,struct drm_crtc_state *new_crtc_state);
@@ -618,6 +620,116 @@ static void dm_dcn_vertical_interrupt0_high_irq(void *interrupt_params) }#endif +/** +* dmub_aux_setconfig_reply_callback - Callback for AUX or SET_CONFIG command. +* @adev: amdgpu_device pointer +* @notify: dmub notification structure +* +* Dmub AUX or SET_CONFIG command completion processing callback +* Copies dmub notification to DM which is to be read by AUX command. +* issuing thread and also signals the event to wake up the thread. +*/ +void dmub_aux_setconfig_callback (struct amdgpu_device *adev,struct dmub_notification *notify) +{ +if (adev->dm.dmub_notify) +memcpy (adev->dm.dmub_notify, notify,sizeof (struct dmub_notification )); +if (notify->type ==DMUB_NOTIFICATION_AUX_REPLY ) +complete (&adev->dm.dmub_aux_transfer_done); +} + +/** +* dmub_hpd_callback - DMUB HPD interrupt processing callback. +* @adev: amdgpu_device pointer +* @notify: dmub notification structure +* +* Dmub Hpd interrupt processing callback. Gets displayindex through the +* ink index and calls helper to do the processing. +*/ +void dmub_hpd_callback (struct amdgpu_device *adev,struct dmub_notification *notify) +{ +struct amdgpu_dm_connector *aconnector; +struct drm_connector *connector; +struct drm_connector_list_iter iter; +struct dc_link *link; +uint8_t link_index =0 ; +struct drm_device *dev = adev->dm.ddev; + +if (adev ==NULL ) +return ; + +if (notify ==NULL ) { +DRM_ERROR ("DMUB HPD callback notification was NULL" ); +return ; + } + +if (notify->link_index > adev->dm.dc->link_count) { +DRM_ERROR ("DMUB HPD index (%u)is abnormal" , notify->link_index); +return ; + } + +drm_modeset_lock (&dev->mode_config.connection_mutex,NULL ); + + link_index = notify->link_index; + + link = adev->dm.dc->links[link_index]; + +drm_connector_list_iter_begin (dev, &iter); +drm_for_each_connector_iter (connector, &iter) { + aconnector =to_amdgpu_dm_connector (connector); +if (link && aconnector->dc_link == link) { +DRM_INFO ("DMUB HPD callback: link_index=%u\n" , link_index); +handle_hpd_irq_helper (aconnector); +break ; + } + } +drm_connector_list_iter_end (&iter); +drm_modeset_unlock (&dev->mode_config.connection_mutex); + +} + +/** +* register_dmub_notify_callback - Sets callback for DMUB notify +* @adev: amdgpu_device pointer +* @type: Type of dmub notification +* @callback: Dmub interrupt callback function +* @dmub_int_thread_offload: offload indicator +* +* API to register a dmub callback handler for a dmub notification +* Also sets indicator whether callback processing to be offloaded. +* to dmub interrupt handling thread +* Return: true if successfully registered, false if there is existing registration +*/ +bool register_dmub_notify_callback (struct amdgpu_device *adev,enum dmub_notification_type type, +dmub_notify_interrupt_callback_t callback,bool dmub_int_thread_offload) +{ +if (callback !=NULL && type <ARRAY_SIZE (adev->dm.dmub_thread_offload)) { + adev->dm.dmub_callback[type] = callback; + adev->dm.dmub_thread_offload[type] = dmub_int_thread_offload; + }else +return false; + +return true; +} + +static void dm_handle_hpd_work (struct work_struct *work) +{ +struct dmub_hpd_work *dmub_hpd_wrk; + + dmub_hpd_wrk = container_of(work, struct dmub_hpd_work, handle_hpd_work); + +if (!dmub_hpd_wrk->dmub_notify) { +DRM_ERROR ("dmub_hpd_wrk dmub_notify is NULL" ); +return ; + } + +if (dmub_hpd_wrk->dmub_notify->type <ARRAY_SIZE (dmub_hpd_wrk->adev->dm.dmub_callback)) { + dmub_hpd_wrk->adev->dm.dmub_callback[dmub_hpd_wrk->dmub_notify->type](dmub_hpd_wrk->adev, + dmub_hpd_wrk->dmub_notify); + } +kfree (dmub_hpd_wrk); + +} +#define DMUB_TRACE_MAX_READ 64/** * dm_dmub_outbox1_low_irq() - Handles Outbox interrupt
@@ -634,18 +746,33 @@ static void dm_dmub_outbox1_low_irq(void *interrupt_params)struct amdgpu_display_manager *dm = &adev->dm;struct dmcub_trace_buf_entry entry = {0 };uint32_t count =0 ; +struct dmub_hpd_work *dmub_hpd_wrk;if (dc_enable_dmub_notifications (adev->dm.dc)) { + dmub_hpd_wrk =kzalloc (sizeof (*dmub_hpd_wrk),GFP_ATOMIC ); +if (!dmub_hpd_wrk) { +DRM_ERROR ("Failed to allocate dmub_hpd_wrk" ); +return ; + } +INIT_WORK (&dmub_hpd_wrk->handle_hpd_work, dm_handle_hpd_work); +if (irq_params->irq_src ==DC_IRQ_SOURCE_DMCUB_OUTBOX ) {do {dc_stat_get_dmub_notification (adev->dm.dc, ¬ify); - }while (notify.pending_notification); +if (notify.type >ARRAY_SIZE (dm->dmub_thread_offload)) { +DRM_ERROR ("DM: notify type %d larger than the array size %ld !" , notify.type, +ARRAY_SIZE (dm->dmub_thread_offload)); +continue ; + } +if (dm->dmub_thread_offload[notify.type] == true) { + dmub_hpd_wrk->dmub_notify = ¬ify; + dmub_hpd_wrk->adev = adev; +queue_work (adev->dm.delayed_hpd_wq, &dmub_hpd_wrk->handle_hpd_work); + }else { + dm->dmub_callback[notify.type](adev, ¬ify); + } -if (adev->dm.dmub_notify) -memcpy (adev->dm.dmub_notify, ¬ify,sizeof (struct dmub_notification )); -if (notify.type ==DMUB_NOTIFICATION_AUX_REPLY ) -complete (&adev->dm.dmub_aux_transfer_done); -// TODO : HPD Implementation + }while (notify.pending_notification); }else {DRM_ERROR ("DM: Failed to receive correct outbox IRQ !" );
@@ -1287,7 +1414,25 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)DRM_INFO ("amdgpu: fail to allocate adev->dm.dmub_notify" ); goto error; } + + adev->dm.delayed_hpd_wq =create_singlethread_workqueue ("amdgpu_dm_hpd_wq" ); +if (!adev->dm.delayed_hpd_wq) { +DRM_ERROR ("amdgpu: failed to create hpd offload workqueue.\n" ); + goto error; + } +amdgpu_dm_outbox_init (adev); +#if defined(CONFIG_DRM_AMD_DC_DCN ) +if (!register_dmub_notify_callback (adev,DMUB_NOTIFICATION_AUX_REPLY , + dmub_aux_setconfig_callback, false)) { +DRM_ERROR ("amdgpu: fail to register dmub aux callback" ); + goto error; + } +if (!register_dmub_notify_callback (adev,DMUB_NOTIFICATION_HPD , dmub_hpd_callback, true)) { +DRM_ERROR ("amdgpu: fail to register dmub hpd callback" ); + goto error; + } +#endif }if (amdgpu_dm_initialize_drm_device (adev)) {
@@ -1369,6 +1514,8 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev)if (dc_enable_dmub_notifications (adev->dm.dc)) {kfree (adev->dm.dmub_notify); adev->dm.dmub_notify =NULL ; +destroy_workqueue (adev->dm.delayed_hpd_wq); + adev->dm.delayed_hpd_wq =NULL ; }if (adev->dm.dmub_bo)
@@ -2654,9 +2801,8 @@ void amdgpu_dm_update_connector_after_detect(dc_sink_release (sink); } -static void handle_hpd_irq (void *param) +static void handle_hpd_irq_helper (struct amdgpu_dm_connector *aconnector) { -struct amdgpu_dm_connector *aconnector = (struct amdgpu_dm_connector *)param;struct drm_connector *connector = &aconnector->base;struct drm_device *dev = connector->dev;enum dc_connection_type new_connection_type = dc_connection_none;
@@ -2715,6 +2861,15 @@ static void handle_hpd_irq(void *param) } +static void handle_hpd_irq (void *param) +{ +struct amdgpu_dm_connector *aconnector = (struct amdgpu_dm_connector *)param; + +handle_hpd_irq_helper (aconnector); + +} + +static void dm_handle_hpd_rx_irq (struct amdgpu_dm_connector *aconnector) {uint8_t esi[DP_PSR_ERROR_STATUS -DP_SINK_COUNT_ESI ] = {0 };
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +40 -0
@@ -47,6 +47,8 @@#define AMDGPU_DM_MAX_CRTC 6#define AMDGPU_DM_MAX_NUM_EDP 2 + +#define AMDGPU_DMUB_NOTIFICATION_MAX 5/* #include "include/amdgpu_dal_power_if.h" #include "amdgpu_dm_irq.h"
@@ -86,6 +88,21 @@ struct dm_compressor_info {uint64_t gpu_addr; }; +typedef void (*dmub_notify_interrupt_callback_t )(struct amdgpu_device *adev,struct dmub_notification *notify); + +/** +* struct dmub_hpd_work - Handle time consuming work in low priority outbox IRQ +* +* @handle_hpd_work: Work to be executed in a separate thread to handle hpd_low_irq +* @dmub_notify: notification for callback function +* @adev: amdgpu_device pointer +*/ +struct dmub_hpd_work { +struct work_struct handle_hpd_work; +struct dmub_notification *dmub_notify; +struct amdgpu_device *adev; +}; +/** * struct vblank_control_work - Work data for vblank control * @work: Kernel work data for the work event
@@ -190,8 +207,30 @@ struct amdgpu_display_manager {*/ struct dmub_srv *dmub_srv; +/** +* @dmub_notify: +* +* Notification from DMUB. +*/ +struct dmub_notification *dmub_notify; +/** +* @dmub_callback: +* +* Callback functions to handle notification from DMUB. +*/ + +dmub_notify_interrupt_callback_t dmub_callback[AMDGPU_DMUB_NOTIFICATION_MAX ]; + +/** +* @dmub_thread_offload: +* +* Flag to indicate if callback is offload. +*/ + +bool dmub_thread_offload[AMDGPU_DMUB_NOTIFICATION_MAX ]; +/** * @dmub_fb_info: *
@@ -439,6 +478,7 @@ struct amdgpu_display_manager {*/ struct list_head da_list;struct completion dmub_aux_transfer_done; +struct workqueue_struct *delayed_hpd_wq;/** * @brightness:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 43/201 drm/amd/display: Add option to defer works of hpd_rx_irq
In reply to Greg Kroah-HartmanFrom: Wayne Lin <[email protected]>
[ Upstream commit 410ad92d7fecd30de7456c19e326e272c2153ff2 ]
[Why & How]
Due to some code flow constraints, we need to defer dc_lock needed works from dc_link_handle_hpd_rx_irq(). Thus, do following changes:
* Change allow_hpd_rx_irq() from static to public
* Change handle_automated_test() from static to public
* Extract link lost handling flow out from dc_link_handle_hpd_rx_irq() and put those into a new function dc_link_dp_handle_link_loss()
* Add one option parameter to decide whether defer works within dc_link_handle_hpd_rx_irq()
--- .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 92 ++++++++++++------- drivers/gpu/drm/amd/display/dc/dc_link.h | 3 + 2 files changed, 63 insertions(+), 32 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +60 -32
@@ -2743,7 +2743,7 @@ void decide_link_settings(struct dc_stream_state *stream, }/*************************Short Pulse IRQ***************************/ -static bool allow_hpd_rx_irq (const struct dc_link *link) +bool dc_link_dp_allow_hpd_rx_irq (const struct dc_link *link) {/* * Don't handle RX IRQ unless one of following is met:
@@ -3177,7 +3177,7 @@ static void dp_test_get_audio_test_data(struct dc_link *link, bool disable_video } } -static void handle_automated_test (struct dc_link *link) +void dc_link_dp_handle_automated_test (struct dc_link *link) {union test_request test_request;union test_response test_response;
@@ -3226,17 +3226,50 @@ static void handle_automated_test(struct dc_link *link) sizeof(test_response)); } -bool dc_link_handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss) +void dc_link_dp_handle_link_loss (struct dc_link *link) +{ +int i; +struct pipe_ctx *pipe_ctx; + +for (i =0 ; i <MAX_PIPES ; i++) { + pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link) +break ; + } + +if (pipe_ctx ==NULL || pipe_ctx->stream ==NULL ) +return ; + +for (i =0 ; i <MAX_PIPES ; i++) { + pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off && + pipe_ctx->stream->link == link && !pipe_ctx->prev_odm_pipe) { +core_link_disable_stream (pipe_ctx); + } + } + +for (i =0 ; i <MAX_PIPES ; i++) { + pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off && + pipe_ctx->stream->link == link && !pipe_ctx->prev_odm_pipe) { +core_link_enable_stream (link->dc->current_state, pipe_ctx); + } + } +} + +static bool handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss, +bool defer_handling,bool *has_left_work) {union hpd_irq_data hpd_irq_dpcd_data = { { { {0 } } } };union device_service_irq device_service_clear = { {0 } };enum dc_status result;bool status = false; -struct pipe_ctx *pipe_ctx; -int i;if (out_link_loss) *out_link_loss = false; + +if (has_left_work) + *has_left_work = false;/* For use cases related to down stream connection status change, * PSR and device auto test, refer to function handle_sst_hpd_irq * in DAL2.1*/
@@ -3268,11 +3301,14 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd &device_service_clear.raw, sizeof(device_service_clear.raw)); device_service_clear.raw =0 ; -handle_automated_test (link); +if (defer_handling && has_left_work) + *has_left_work = true; +else +dc_link_dp_handle_automated_test (link);return false; } -if (!allow_hpd_rx_irq (link)) { +if (!dc_link_dp_allow_hpd_rx_irq (link)) {DC_LOG_HW_HPD_IRQ ("%s: skipping HPD handling on %d\n" , __func__, link->link_index);return false;
@@ -3286,12 +3322,18 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd* so do not handle as a normal sink status change interrupt. */ -if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.UP_REQ_MSG_RDY) +if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.UP_REQ_MSG_RDY) { +if (defer_handling && has_left_work) + *has_left_work = true;return true; + }/* check if we have MST msg and return since we poll for it */ -if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.DOWN_REP_MSG_RDY) +if (hpd_irq_dpcd_data.bytes.device_service_irq.bits.DOWN_REP_MSG_RDY) { +if (defer_handling && has_left_work) + *has_left_work = true;return false; + }/* For now we only handle 'Downstream port status' case. * If we got sink count changed it means
@@ -3308,29 +3350,10 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpdsizeof (hpd_irq_dpcd_data), "Status: "); -for (i =0 ; i <MAX_PIPES ; i++) { - pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; -if (pipe_ctx && pipe_ctx->stream && pipe_ctx->stream->link == link) -break ; - } - -if (pipe_ctx ==NULL || pipe_ctx->stream ==NULL ) -return false; - - -for (i =0 ; i <MAX_PIPES ; i++) { - pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; -if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off && - pipe_ctx->stream->link == link && !pipe_ctx->prev_odm_pipe) -core_link_disable_stream (pipe_ctx); - } - -for (i =0 ; i <MAX_PIPES ; i++) { - pipe_ctx = &link->dc->current_state->res_ctx.pipe_ctx[i]; -if (pipe_ctx && pipe_ctx->stream && !pipe_ctx->stream->dpms_off && - pipe_ctx->stream->link == link && !pipe_ctx->prev_odm_pipe) -core_link_enable_stream (link->dc->current_state, pipe_ctx); - } +if (defer_handling && has_left_work) + *has_left_work = true; +else +dc_link_dp_handle_link_loss (link); status = false;if (out_link_loss)
@@ -3356,6 +3379,11 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpdreturn status; } +bool dc_link_handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss) +{ +return handle_hpd_rx_irq (link, out_hpd_irq_dpcd_data, out_link_loss, false,NULL ); +} +/*query dpcd for version and mst cap addresses*/ bool is_mst_supported (struct dc_link *link) {
drivers/gpu/drm/amd/display/dc/dc_link.h +3 -0
@@ -308,6 +308,9 @@ bool dc_link_wait_for_t12(struct dc_link *link);enum dc_status read_hpd_rx_irq_data (struct dc_link *link,union hpd_irq_data *irq_data); +void dc_link_dp_handle_automated_test (struct dc_link *link); +void dc_link_dp_handle_link_loss (struct dc_link *link); +bool dc_link_dp_allow_hpd_rx_irq (const struct dc_link *link);struct dc_sink_init_data ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/201 drm/amd/display: Fork thread to offload work of hpd_rx_irq
In reply to Greg Kroah-HartmanFrom: Wayne Lin <[email protected]>
[ Upstream commit 8e794421bc981586d0af4e959ec76d668c793a55 ]
[Why]
Currently, we will try to get dm.dc_lock in handle_hpd_rx_irq() when link lost happened, which is risky and could cause deadlock. e.g. If we are under procedure to enable MST streams and then monitor happens to toggle short hpd to notify link lost, then handle_hpd_rx_irq() will get blocked due to stream enabling flow has dc_lock. However, under MST, enabling streams involves communication with remote sinks which need to use handle_hpd_rx_irq() to handle sideband messages. Thus, we have deadlock here.
[How]
Target is to have handle_hpd_rx_irq() finished as soon as possilble. Hence we can react to interrupt quickly. Besides, we should avoid to grabe dm.dc_lock within handle_hpd_rx_irq() to avoid deadlock situation.
Firstly, revert patches which introduced to use dm.dc_lock in handle_hpd_rx_irq():
* commit ("drm/amd/display: NULL pointer error during ")
* commit ("drm/amd/display: Only one display lights up while using MST")
* commit ("drm/amd/display: take dc_lock in short pulse handler only")
Instead, create work to handle irq events which needs dm.dc_lock. Besides:
* Create struct hpd_rx_irq_offload_work_queue for each link to handle its short hpd events
* Avoid to handle link lost/ automated test if the link is disconnected
* Defer dc_lock needed works in dc_link_handle_hpd_rx_irq(). This function should just handle simple stuff for us (e.g. DPCD R/W). However, deferred works should still be handled by the order that dc_link_handle_hpd_rx_irq() used to be.
* Change function name dm_handle_hpd_rx_irq() to dm_handle_mst_sideband_msg() to be more specific
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 203 ++++++++++++++---- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 49 ++++- .../gpu/drm/amd/display/dc/core/dc_link_dp.c | 9 +- drivers/gpu/drm/amd/display/dc/dc_link.h | 6 +- 4 files changed, 219 insertions(+), 48 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +167 -36
@@ -1236,6 +1236,83 @@ static void vblank_control_worker(struct work_struct *work) }#endif + +static void dm_handle_hpd_rx_offload_work (struct work_struct *work) +{ +struct hpd_rx_irq_offload_work *offload_work; +struct amdgpu_dm_connector *aconnector; +struct dc_link *dc_link; +struct amdgpu_device *adev; +enum dc_connection_type new_connection_type = dc_connection_none; +unsigned long flags; + + offload_work = container_of(work, struct hpd_rx_irq_offload_work, work); + aconnector = offload_work->offload_wq->aconnector; + +if (!aconnector) { +DRM_ERROR ("Can't retrieve aconnector in hpd_rx_irq_offload_work" ); + goto skip; + } + + adev =drm_to_adev (aconnector->base.dev); + dc_link = aconnector->dc_link; + +mutex_lock (&aconnector->hpd_lock); +if (!dc_link_detect_sink (dc_link, &new_connection_type)) +DRM_ERROR ("KMS: Failed to detect connector\n" ); +mutex_unlock (&aconnector->hpd_lock); + +if (new_connection_type == dc_connection_none) + goto skip; + +if (amdgpu_in_reset (adev)) + goto skip; + +mutex_lock (&adev->dm.dc_lock); +if (offload_work->data.bytes.device_service_irq.bits.AUTOMATED_TEST) +dc_link_dp_handle_automated_test (dc_link); +else if ((dc_link->connector_signal !=SIGNAL_TYPE_EDP ) && +hpd_rx_irq_check_link_loss_status (dc_link, &offload_work->data) && +dc_link_dp_allow_hpd_rx_irq (dc_link)) { +dc_link_dp_handle_link_loss (dc_link); +spin_lock_irqsave (&offload_work->offload_wq->offload_lock, flags); + offload_work->offload_wq->is_handling_link_loss = false; +spin_unlock_irqrestore (&offload_work->offload_wq->offload_lock, flags); + } +mutex_unlock (&adev->dm.dc_lock); + +skip: +kfree (offload_work); + +} + +static struct hpd_rx_irq_offload_work_queue *hpd_rx_irq_create_workqueue (struct dc *dc) +{ +int max_caps = dc->caps.max_links; +int i =0 ; +struct hpd_rx_irq_offload_work_queue *hpd_rx_offload_wq =NULL ; + + hpd_rx_offload_wq =kcalloc (max_caps,sizeof (*hpd_rx_offload_wq),GFP_KERNEL ); + +if (!hpd_rx_offload_wq) +return NULL ; + + +for (i =0 ; i < max_caps; i++) { + hpd_rx_offload_wq[i].wq = +create_singlethread_workqueue ("amdgpu_dm_hpd_rx_offload_wq" ); + +if (hpd_rx_offload_wq[i].wq ==NULL ) { +DRM_ERROR ("create amdgpu_dm_hpd_rx_offload_wq fail!" ); +return NULL ; + } + +spin_lock_init (&hpd_rx_offload_wq[i].offload_lock); + } + +return hpd_rx_offload_wq; +} +static int amdgpu_dm_init (struct amdgpu_device *adev) {struct dc_init_data init_data;
@@ -1362,6 +1439,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)dc_hardware_init (adev->dm.dc); + adev->dm.hpd_rx_offload_wq =hpd_rx_irq_create_workqueue (adev->dm.dc); +if (!adev->dm.hpd_rx_offload_wq) { +DRM_ERROR ("amdgpu: failed to create hpd rx offload workqueue.\n" ); + goto error; + } +#if defined(CONFIG_DRM_AMD_DC_DCN )if ((adev->flags &AMD_IS_APU ) && (adev->asic_type >=CHIP_CARRIZO )) {struct dc_phy_addr_space_config pa_config;
@@ -1541,6 +1624,18 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev) adev->dm.freesync_module =NULL ; } +if (adev->dm.hpd_rx_offload_wq) { +for (i =0 ; i < adev->dm.dc->caps.max_links; i++) { +if (adev->dm.hpd_rx_offload_wq[i].wq) { +destroy_workqueue (adev->dm.hpd_rx_offload_wq[i].wq); + adev->dm.hpd_rx_offload_wq[i].wq =NULL ; + } + } + +kfree (adev->dm.hpd_rx_offload_wq); + adev->dm.hpd_rx_offload_wq =NULL ; + } +mutex_destroy (&adev->dm.audio_lock);mutex_destroy (&adev->dm.dc_lock);
@@ -2160,6 +2255,16 @@ static enum dc_status amdgpu_dm_commit_zero_streams(struct dc *dc)return res; } +static void hpd_rx_irq_work_suspend (struct amdgpu_display_manager *dm) +{ +int i; + +if (dm->hpd_rx_offload_wq) { +for (i =0 ; i < dm->dc->caps.max_links; i++) +flush_workqueue (dm->hpd_rx_offload_wq[i].wq); + } +} +static int dm_suspend (void *handle) {struct amdgpu_device *adev = handle;
@@ -2181,6 +2286,8 @@ static int dm_suspend(void *handle)amdgpu_dm_irq_suspend (adev); +hpd_rx_irq_work_suspend (dm); +return ret; }
@@ -2191,6 +2298,8 @@ static int dm_suspend(void *handle)amdgpu_dm_irq_suspend (adev); +hpd_rx_irq_work_suspend (dm); +dc_set_power_state (dm->dc,DC_ACPI_CM_POWER_STATE_D3 );return 0 ;
@@ -2869,8 +2978,7 @@ static void handle_hpd_irq(void *param) } - -static void dm_handle_hpd_rx_irq (struct amdgpu_dm_connector *aconnector) +static void dm_handle_mst_sideband_msg (struct amdgpu_dm_connector *aconnector) {uint8_t esi[DP_PSR_ERROR_STATUS -DP_SINK_COUNT_ESI ] = {0 };uint8_t dret;
@@ -2948,6 +3056,25 @@ static void dm_handle_hpd_rx_irq(struct amdgpu_dm_connector *aconnector)DRM_DEBUG_DRIVER ("Loop exceeded max iterations\n" ); } +static void schedule_hpd_rx_offload_work (struct hpd_rx_irq_offload_work_queue *offload_wq, +union hpd_irq_data hpd_irq_data) +{ +struct hpd_rx_irq_offload_work *offload_work = +kzalloc (sizeof (*offload_work),GFP_KERNEL ); + +if (!offload_work) { +DRM_ERROR ("Failed to allocate hpd_rx_irq_offload_work.\n" ); +return ; + } + +INIT_WORK (&offload_work->work, dm_handle_hpd_rx_offload_work); + offload_work->data = hpd_irq_data; + offload_work->offload_wq = offload_wq; + +queue_work (offload_wq->wq, &offload_work->work); +DRM_DEBUG_KMS ("queue work to handle hpd_rx offload work" ); +} +static void handle_hpd_rx_irq (void *param) {struct amdgpu_dm_connector *aconnector = (struct amdgpu_dm_connector *)param;
@@ -2959,14 +3086,16 @@ static void handle_hpd_rx_irq(void *param)enum dc_connection_type new_connection_type = dc_connection_none;struct amdgpu_device *adev =drm_to_adev (dev);union hpd_irq_data hpd_irq_data; -bool lock_flag =0 ; +bool link_loss = false; +bool has_left_work = false; +int idx = aconnector->base.index; +struct hpd_rx_irq_offload_work_queue *offload_wq = &adev->dm.hpd_rx_offload_wq[idx];memset (&hpd_irq_data,0 ,sizeof (hpd_irq_data));if (adev->dm.disable_hpd_irq)return ; -/* * TODO:Temporary add mutex to protect hpd interrupt not have a gpio * conflict, after implement i2c helper, this mutex should be
@@ -2974,43 +3103,41 @@ static void handle_hpd_rx_irq(void *param)*/ mutex_lock (&aconnector->hpd_lock); -read_hpd_rx_irq_data (dc_link, &hpd_irq_data); + result =dc_link_handle_hpd_rx_irq (dc_link, &hpd_irq_data, + &link_loss, true, &has_left_work); -if ((dc_link->cur_link_settings.lane_count !=LANE_COUNT_UNKNOWN ) || - (dc_link->type == dc_connection_mst_branch)) { -if (hpd_irq_data.bytes.device_service_irq.bits.UP_REQ_MSG_RDY) { - result = true; -dm_handle_hpd_rx_irq (aconnector); - goto out; - }else if (hpd_irq_data.bytes.device_service_irq.bits.DOWN_REP_MSG_RDY) { - result = false; -dm_handle_hpd_rx_irq (aconnector); +if (!has_left_work) + goto out; + +if (hpd_irq_data.bytes.device_service_irq.bits.AUTOMATED_TEST) { +schedule_hpd_rx_offload_work (offload_wq, hpd_irq_data); + goto out; + } + +if (dc_link_dp_allow_hpd_rx_irq (dc_link)) { +if (hpd_irq_data.bytes.device_service_irq.bits.UP_REQ_MSG_RDY || + hpd_irq_data.bytes.device_service_irq.bits.DOWN_REP_MSG_RDY) { +dm_handle_mst_sideband_msg (aconnector); goto out; } - } -/* -* TODO: We need the lock to avoid touching DC state while it's being -* modified during automated compliance testing, or when link loss -* happens. While this should be split into subhandlers and proper -* interfaces to avoid having to conditionally lock like this in the -* outer layer, we need this workaround temporarily to allow MST -* lightup in some scenarios to avoid timeout. -*/ -if (!amdgpu_in_reset (adev) && - (hpd_rx_irq_check_link_loss_status (dc_link, &hpd_irq_data) || - hpd_irq_data.bytes.device_service_irq.bits.AUTOMATED_TEST)) { -mutex_lock (&adev->dm.dc_lock); - lock_flag =1 ; - } +if (link_loss) { +bool skip = false; -#ifdef CONFIG_DRM_AMD_DC_HDCP - result =dc_link_handle_hpd_rx_irq (dc_link, &hpd_irq_data,NULL ); -#else - result =dc_link_handle_hpd_rx_irq (dc_link,NULL ,NULL ); -#endif -if (!amdgpu_in_reset (adev) && lock_flag) -mutex_unlock (&adev->dm.dc_lock); +spin_lock (&offload_wq->offload_lock); + skip = offload_wq->is_handling_link_loss; + +if (!skip) + offload_wq->is_handling_link_loss = true; + +spin_unlock (&offload_wq->offload_lock); + +if (!skip) +schedule_hpd_rx_offload_work (offload_wq, hpd_irq_data); + + goto out; + } + } out:if (result && !is_mst_root_connector) {
@@ -3095,6 +3222,10 @@ static void register_hpd_handlers(struct amdgpu_device *adev)amdgpu_dm_irq_register_interrupt (adev, &int_params, handle_hpd_rx_irq, (void *) aconnector); + +if (adev->dm.hpd_rx_offload_wq) + adev->dm.hpd_rx_offload_wq[connector->index].aconnector = + aconnector; } } }
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +48 -1
61 lines not on this page · raw message
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +2 -7
@@ -2075,7 +2075,7 @@ static struct dc_link_settings get_max_link_cap(struct dc_link *link)return max_link_cap; } -enum dc_status read_hpd_rx_irq_data ( +static enum dc_status read_hpd_rx_irq_data (struct dc_link *link,union hpd_irq_data *irq_data) {
@@ -3257,7 +3257,7 @@ void dc_link_dp_handle_link_loss(struct dc_link *link) } } -static bool handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss, +bool dc_link_handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss,bool defer_handling,bool *has_left_work) {union hpd_irq_data hpd_irq_dpcd_data = { { { {0 } } } };
@@ -3379,11 +3379,6 @@ static bool handle_hpd_rx_irq(struct dc_link *link, union hpd_irq_data *out_hpd_return status; } -bool dc_link_handle_hpd_rx_irq (struct dc_link *link,union hpd_irq_data *out_hpd_irq_dpcd_data,bool *out_link_loss) -{ -return handle_hpd_rx_irq (link, out_hpd_irq_dpcd_data, out_link_loss, false,NULL ); -} -/*query dpcd for version and mst cap addresses*/ bool is_mst_supported (struct dc_link *link) {
drivers/gpu/drm/amd/display/dc/dc_link.h +2 -4
@@ -296,7 +296,8 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx);* false - no change in Downstream port status. No further action required * from DM. */ bool dc_link_handle_hpd_rx_irq (struct dc_link *dc_link, -union hpd_irq_data *hpd_irq_dpcd_data,bool *out_link_loss); +union hpd_irq_data *hpd_irq_dpcd_data,bool *out_link_loss, +bool defer_handling,bool *has_left_work);/* * On eDP links this function call will stall until T12 has elapsed.
@@ -305,9 +306,6 @@ bool dc_link_handle_hpd_rx_irq(struct dc_link *dc_link,*/ bool dc_link_wait_for_t12 (struct dc_link *link); -enum dc_status read_hpd_rx_irq_data ( -struct dc_link *link, -union hpd_irq_data *irq_data);void dc_link_dp_handle_automated_test (struct dc_link *link);void dc_link_dp_handle_link_loss (struct dc_link *link);bool dc_link_dp_allow_hpd_rx_irq (const struct dc_link *link);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/201 drm/amdgpu/display: add quirk handling for stutter mode
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
[ Upstream commit 3ce51649cdf23ab463494df2bd6d1e9529ebdc6a ]
Stutter mode is a power saving feature on GPUs, however at least one early raven system exhibits stability issues with it. Add a quirk to disable it for that system.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +33 -0
@@ -1313,6 +1313,37 @@ static struct hpd_rx_irq_offload_work_queue *hpd_rx_irq_create_workqueue(structreturn hpd_rx_offload_wq; } +struct amdgpu_stutter_quirk { +u16 chip_vendor; +u16 chip_device; +u16 subsys_vendor; +u16 subsys_device; +u8 revision; +}; + +static const struct amdgpu_stutter_quirk amdgpu_stutter_quirk_list[] = { +/* https://bugzilla.kernel.org/show_bug.cgi?id=214417 */ + {0x1002 ,0x15dd ,0x1002 ,0x15dd ,0xc8 }, + {0 ,0 ,0 ,0 ,0 }, +}; + +static bool dm_should_disable_stutter (struct pci_dev *pdev) +{ +const struct amdgpu_stutter_quirk *p = amdgpu_stutter_quirk_list; + +while (p && p->chip_device !=0 ) { +if (pdev->vendor == p->chip_vendor && + pdev->device == p->chip_device && + pdev->subsystem_vendor == p->subsys_vendor && + pdev->subsystem_device == p->subsys_device && + pdev->revision == p->revision) { +return true; + } + ++p; + } +return false; +} +static int amdgpu_dm_init (struct amdgpu_device *adev) {struct dc_init_data init_data;
@@ -1421,6 +1452,8 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)if (adev->asic_type !=CHIP_CARRIZO && adev->asic_type !=CHIP_STONEY ) adev->dm.dc->debug.disable_stutter = amdgpu_pp_feature_mask &PP_STUTTER_MODE ? false : true; +if (dm_should_disable_stutter (adev->pdev)) + adev->dm.dc->debug.disable_stutter = true;if (amdgpu_dc_debug_mask &DC_DISABLE_STUTTER ) adev->dm.dc->debug.disable_stutter = true;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/201 drm/amd/display: Ignore First MST Sideband Message Return Error
In reply to Greg Kroah-HartmanFrom: Fangzhi Zuo <[email protected]>
[ Upstream commit acea108fa067d140bd155161a79b1fcd967f4137 ]
[why]
First MST sideband message returns AUX_RET_ERROR_HPD_DISCON on certain intel platform. Aux transaction considered failure if HPD unexpected pulled low. The actual aux transaction success in such case, hence do not return error.
[how]
Not returning error when AUX_RET_ERROR_HPD_DISCON detected on the first sideband message.
v2: squash in additional DMI entries
v3: squash in static fix
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 39 +++++++++++++++++++ .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 8 ++++ .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 17 ++++++++ 3 files changed, 64 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +39 -0
@@ -70,6 +70,7 @@#include <linux/pci.h> #include <linux/firmware.h> #include <linux/component.h> +#include <linux/dmi.h> #include <drm/drm_atomic.h> #include <drm/drm_atomic_uapi.h>
@@ -1344,6 +1345,41 @@ static bool dm_should_disable_stutter(struct pci_dev *pdev)return false; } +static const struct dmi_system_id hpd_disconnect_quirk_table[] = { + { + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Precision 3660" ), + }, + }, + { + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Precision 3260" ), + }, + }, + { + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Precision 3460" ), + }, + }, + {} +}; + +static void retrieve_dmi_info (struct amdgpu_display_manager *dm) +{ +const struct dmi_system_id *dmi_id; + + dm->aux_hpd_discon_quirk = false; + + dmi_id =dmi_first_match (hpd_disconnect_quirk_table); +if (dmi_id) { + dm->aux_hpd_discon_quirk = true; +DRM_INFO ("aux_hpd_discon_quirk attached\n" ); + } +} +static int amdgpu_dm_init (struct amdgpu_device *adev) {struct dc_init_data init_data;
@@ -1435,6 +1471,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev) init_data.flags.power_down_display_on_boot = true;INIT_LIST_HEAD (&adev->dm.da_list); + +retrieve_dmi_info (&adev->dm); +/* Display Core create. */ adev->dm.dc =dc_create (&init_data);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +8 -0
@@ -539,6 +539,14 @@ struct amdgpu_display_manager {* last successfully applied backlight values. */ u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP ]; + +/** +* @aux_hpd_discon_quirk: +* +* quirk for hpd discon while aux is on-going. +* occurred on certain intel platform +*/ +bool aux_hpd_discon_quirk; };enum dsc_clock_force_state {
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +17 -0
@@ -55,6 +55,8 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,ssize_t result =0 ;struct aux_payload payload;enum aux_return_code_type operation_result; +struct amdgpu_device *adev; +struct ddc_service *ddc;if (WARN_ON (msg->size >16 ))return -E2BIG ;
@@ -71,6 +73,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux, result =dc_link_aux_transfer_raw (TO_DM_AUX (aux)->ddc_service, &payload, &operation_result); +/* +* w/a on certain intel platform where hpd is unexpected to pull low during +* 1st sideband message transaction by return AUX_RET_ERROR_HPD_DISCON +* aux transaction is succuess in such case, therefore bypass the error +*/ + ddc =TO_DM_AUX (aux)->ddc_service; + adev = ddc->ctx->driver_context; +if (adev->dm.aux_hpd_discon_quirk) { +if (msg->address ==DP_SIDEBAND_MSG_DOWN_REQ_BASE && + operation_result ==AUX_RET_ERROR_HPD_DISCON ) { + result =0 ; + operation_result =AUX_RET_SUCCESS ; + } + } +if (payload.write && result >=0 ) result = msg->size;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/201 scsi: megaraid: Clear READ queue maps nr_queues
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
[ Upstream commit 8312cd3a7b835ae3033a679e5f0014a40e7891c5 ]
The megaraid SCSI driver sets set->nr_maps as 3 if poll_queues is > 0, and blk-mq actually initializes each map's nr_queues as nr_hw_queues. Consequently the driver has to clear READ queue map's nr_queues, otherwise the queue map becomes broken if poll_queues is set as non-zero.
--- drivers/scsi/megaraid/megaraid_sas_base.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/megaraid/megaraid_sas_base.c +3 -0
@@ -3196,6 +3196,9 @@ static int megasas_map_queues(struct Scsi_Host *shost) qoff += map->nr_queues; offset += map->nr_queues; +/* we never use READ queue, so can't cheat blk-mq */ + shost->tag_set.map[HCTX_TYPE_READ ].nr_queues =0 ; +/* Setup Poll hctx */ map = &shost->tag_set.map[HCTX_TYPE_POLL ]; map->nr_queues = instance->iopoll_q_count;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/201 scsi: ufs: core: Drop loglevel of WriteBoost message
In reply to Greg Kroah-HartmanFrom: Bjorn Andersson <[email protected]>
[ Upstream commit 2ae57c995003a7840cb6b5ec5f0c06193695321b ]
Commit '3b5f3c0d0548 ("scsi: ufs: core: Tidy up WB configuration code")' changed the log level of the write boost enable/disable notification from debug to info. This results in a lot of noise in the kernel log during normal operation.
Drop it back to debug level to avoid this.
--- drivers/scsi/ufs/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +1 -1
@@ -5638,7 +5638,7 @@ int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable) } hba->dev_info.wb_enabled = enable; -dev_info (hba->dev,"%s Write Booster %s\n" , +dev_dbg (hba->dev,"%s Write Booster %s\n" , __func__, enable ?"enabled" :"disabled" );return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/201 nvme: check for duplicate identifiers earlier
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit e2d77d2e11c4f1e70a1a24cc8fe63ff3dc9b53ef ]
Lift the check for duplicate identifiers into nvme_init_ns_head, which avoids pointless error unwinding in case they don't match, and also matches where we check identifier validity for the multipath case.
--- drivers/nvme/host/core.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/nvme/host/core.c +6 -7
@@ -3686,13 +3686,6 @@ static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl, head->ids = *ids;kref_init (&head->ref); - ret =nvme_subsys_check_duplicate_ids (ctrl->subsys, &head->ids); -if (ret) { -dev_err (ctrl->device, -"duplicate IDs for nsid %d\n" , nsid); - goto out_cleanup_srcu; - } -if (head->ids.csi) { ret =nvme_get_effects_log (ctrl, head->ids.csi, &head->effects);if (ret)
@@ -3731,6 +3724,12 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid,mutex_lock (&ctrl->subsys->lock); head =nvme_find_ns_head (ctrl, nsid);if (!head) { + ret =nvme_subsys_check_duplicate_ids (ctrl->subsys, ids); +if (ret) { +dev_err (ctrl->device, +"duplicate IDs for nsid %d\n" , nsid); + goto out_unlock; + } head =nvme_alloc_ns_head (ctrl, nsid, ids);if (IS_ERR (head)) { ret =PTR_ERR (head);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/201 nvme: fix block device naming collision
In reply to Greg Kroah-HartmanFrom: Israel Rukshin <[email protected]>
[ Upstream commit 6961b5e02876b3b47f030a1f1ee8fd3e631ac270 ]
The issue exists when multipath is enabled and the namespace is shared, but all the other controller checks at nvme_is_unique_nsid() are false. The reason for this issue is that nvme_is_unique_nsid() returns false when is called from nvme_mpath_alloc_disk() due to an uninitialized value of head->shared. The patch fixes it by setting head->shared before nvme_mpath_alloc_disk() is called.
--- drivers/nvme/host/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/nvme/host/core.c +3 -3
@@ -3660,7 +3660,7 @@ static int nvme_add_ns_cdev(struct nvme_ns *ns) }static struct nvme_ns_head *nvme_alloc_ns_head (struct nvme_ctrl *ctrl, -unsigned nsid,struct nvme_ns_ids *ids) +unsigned nsid,struct nvme_ns_ids *ids,bool is_shared) {struct nvme_ns_head *head;size_t size =sizeof (*head);
@@ -3684,6 +3684,7 @@ static struct nvme_ns_head *nvme_alloc_ns_head(struct nvme_ctrl *ctrl, head->subsys = ctrl->subsys; head->ns_id = nsid; head->ids = *ids; + head->shared = is_shared;kref_init (&head->ref);if (head->ids.csi) {
@@ -3730,12 +3731,11 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid, "duplicate IDs for nsid %d\n", nsid); goto out_unlock; } - head =nvme_alloc_ns_head (ctrl, nsid, ids); + head =nvme_alloc_ns_head (ctrl, nsid, ids, is_shared);if (IS_ERR (head)) { ret =PTR_ERR (head); goto out_unlock; } - head->shared = is_shared; }else { ret = -EINVAL ;if (!is_shared || !head->shared) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/201 e1000e: Enable GPT clock before sending message to CSME
In reply to Greg Kroah-HartmanFrom: Sasha Neftin <[email protected]>
[ Upstream commit b49feacbeffc7635cc6692cbcc6a1eae2c17da6f ]
On corporate (CSME) ADL systems, the Ethernet Controller may stop working ("HW unit hang") after exiting from the s0ix state. The reason is that CSME misses the message sent by the host. Enabling the dynamic GPT clock solves this problem. This clock is cleared upon HW initialization.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=214821
--- drivers/net/ethernet/intel/e1000e/netdev.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/intel/e1000e/netdev.c +4 -0
@@ -6499,6 +6499,10 @@ static void e1000e_s0ix_exit_flow(struct e1000_adapter *adapter)if (er32 (FWSM ) &E1000_ICH_FWSM_FW_VALID && hw->mac.type >= e1000_pch_adp) { +/* Keep the GPT clock enabled for CSME */ + mac_data =er32 (FEXTNVM ); + mac_data |=BIT (3 ); +ew32 (FEXTNVM , mac_data);/* Request ME unconfigure the device from S0ix */ mac_data =er32 (H2ME ); mac_data &= ~E1000_H2ME_START_DPG ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/201 Revert "e1000e: Fix possible HW unit hang after an s0ix exit"
In reply to Greg Kroah-HartmanFrom: Sasha Neftin <[email protected]>
[ Upstream commit 6cfa45361d3eac31ba67d7d0bbef547151450106 ]
This reverts commit 1866aa0d0d6492bc2f8d22d0df49abaccf50cddd.
Commit 1866aa0d0d64 ("e1000e: Fix possible HW unit hang after an s0ix exit") was a workaround for CSME problem to handle messages comes via H2ME mailbox. This problem has been fixed by patch "e1000e: Enable the GPT clock before sending message to the CSME".
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=214821
--- drivers/net/ethernet/intel/e1000e/hw.h | 1 - drivers/net/ethernet/intel/e1000e/ich8lan.c | 4 ---- drivers/net/ethernet/intel/e1000e/ich8lan.h | 1 - drivers/net/ethernet/intel/e1000e/netdev.c | 26 --------------------- 4 files changed, 32 deletions(-)
drivers/net/ethernet/intel/e1000e/hw.h +0 -1
@@ -630,7 +630,6 @@ struct e1000_phy_info {bool disable_polarity_correction;bool is_mdix;bool polarity_correction; -bool reset_disable;bool speed_downgraded;bool autoneg_wait_to_complete; };
drivers/net/ethernet/intel/e1000e/ich8lan.c +0 -4
@@ -2050,10 +2050,6 @@ static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw)bool blocked = false;int i =0 ; -/* Check the PHY (LCD) reset flag */ -if (hw->phy.reset_disable) -return true; -while ((blocked = !(er32 (FWSM ) &E1000_ICH_FWSM_RSPCIPHY )) && (i++ <30 ))usleep_range (10000 ,11000 );
drivers/net/ethernet/intel/e1000e/ich8lan.h +0 -1
@@ -271,7 +271,6 @@#define I217_CGFREG_ENABLE_MTA_RESET 0x0002#define I217_MEMPWR PHY_REG(772, 26)#define I217_MEMPWR_DISABLE_SMB_RELEASE 0x0010 -#define I217_MEMPWR_MOEM 0x1000/* Receive Address Initial CRC Calculation */ #define E1000_PCH_RAICC (_n) (0x05F50 + ((_n) * 4))
drivers/net/ethernet/intel/e1000e/netdev.c +0 -26
@@ -6996,21 +6996,8 @@ static __maybe_unused int e1000e_pm_suspend(struct device *dev)struct net_device *netdev =pci_get_drvdata (to_pci_dev (dev));struct e1000_adapter *adapter =netdev_priv (netdev);struct pci_dev *pdev =to_pci_dev (dev); -struct e1000_hw *hw = &adapter->hw; -u16 phy_data;int rc; -if (er32 (FWSM ) &E1000_ICH_FWSM_FW_VALID && - hw->mac.type >= e1000_pch_adp) { -/* Mask OEM Bits / Gig Disable / Restart AN (772_26[12] = 1) */ -e1e_rphy (hw,I217_MEMPWR , &phy_data); - phy_data |=I217_MEMPWR_MOEM ; -e1e_wphy (hw,I217_MEMPWR , phy_data); - -/* Disable LCD reset */ - hw->phy.reset_disable = true; - } -e1000e_flush_lpic (pdev);e1000e_pm_freeze (dev);
@@ -7032,8 +7019,6 @@ static __maybe_unused int e1000e_pm_resume(struct device *dev)struct net_device *netdev =pci_get_drvdata (to_pci_dev (dev));struct e1000_adapter *adapter =netdev_priv (netdev);struct pci_dev *pdev =to_pci_dev (dev); -struct e1000_hw *hw = &adapter->hw; -u16 phy_data;int rc;/* Introduce S0ix implementation */
@@ -7044,17 +7029,6 @@ static __maybe_unused int e1000e_pm_resume(struct device *dev)if (rc)return rc; -if (er32 (FWSM ) &E1000_ICH_FWSM_FW_VALID && - hw->mac.type >= e1000_pch_adp) { -/* Unmask OEM Bits / Gig Disable / Restart AN 772_26[12] = 0 */ -e1e_rphy (hw,I217_MEMPWR , &phy_data); - phy_data &= ~I217_MEMPWR_MOEM ; -e1e_wphy (hw,I217_MEMPWR , phy_data); - -/* Enable LCD reset */ - hw->phy.reset_disable = false; - } -return e1000e_pm_thaw (dev); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/201 igc: Reinstate IGC_REMOVED logic and implement it properly
In reply to Greg Kroah-HartmanFrom: Lennert Buytenhek <[email protected]>
[ Upstream commit 7c1ddcee5311f3315096217881d2dbe47cc683f9 ]
The initially merged version of the igc driver code (via commit 146740f9abc4, "igc: Add support for PF") contained the following IGC_REMOVED checks in the igc_rd32/wr32() MMIO accessors:
u32 igc_rd32(struct igc_hw *hw, u32 reg)
{
u8 __iomem *hw_addr = READ_ONCE(hw->hw_addr);
u32 value = 0;
if (IGC_REMOVED(hw_addr))
return ~value;
value = readl(&hw_addr[reg]);
/* reads should not return all F's */
if (!(~value) && (!reg || !(~readl(hw_addr))))
hw->hw_addr = NULL;
return value;
}And:
#define wr32(reg, val) \
do { \
u8 __iomem *hw_addr = READ_ONCE((hw)->hw_addr); \
if (!IGC_REMOVED(hw_addr)) \
writel((val), &hw_addr[(reg)]); \
} while (0)E.g. igb has similar checks in its MMIO accessors, and has a similar macro E1000_REMOVED, which is implemented as follows:
#define E1000_REMOVED(h) unlikely(!(h))
These checks serve to detect and take note of an 0xffffffff MMIO read return from the device, which can be caused by a PCIe link flap or some other kind of PCI bus error, and to avoid performing MMIO reads and writes from that point onwards.
However, the IGC_REMOVED macro was not originally implemented:
#ifndef IGC_REMOVED #define IGC_REMOVED(a) (0) #endif /* IGC_REMOVED */
This led to the IGC_REMOVED logic to be removed entirely in a subsequent commit (commit 3c215fb18e70, "igc: remove IGC_REMOVED function"), with the rationale that such checks matter only for virtualization and that igc does not support virtualization -- but a PCIe device can become detached even without virtualization being in use, and without proper checks, a PCIe bus error affecting an igc adapter will lead to various NULL pointer dereferences, as the first access after the error will set hw->hw_addr to NULL, and subsequent accesses will blindly dereference this now-NULL pointer.
This patch reinstates the IGC_REMOVED checks in igc_rd32/wr32(), and implements IGC_REMOVED the way it is done for igb, by checking for the unlikely() case of hw_addr being NULL. This change prevents the oopses seen when a PCIe link flap occurs on an igc adapter.
--- drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ drivers/net/ethernet/intel/igc/igc_regs.h | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/igc/igc_main.c +3 -0
@@ -6159,6 +6159,9 @@ u32 igc_rd32(struct igc_hw *hw, u32 reg)u8 __iomem *hw_addr =READ_ONCE (hw->hw_addr);u32 value =0 ; +if (IGC_REMOVED (hw_addr)) +return ~value; + value =readl (&hw_addr[reg]);/* reads should not return all F's */
drivers/net/ethernet/intel/igc/igc_regs.h +4 -1
@@ -306,7 +306,8 @@ u32 igc_rd32(struct igc_hw *hw, u32 reg);#define wr32 (reg, val) \ do { \ u8 __iomem *hw_addr = READ_ONCE((hw)->hw_addr); \ - writel((val), &hw_addr[(reg)]); \ + if (!IGC_REMOVED(hw_addr)) \ + writel((val), &hw_addr[(reg)]); \ } while (0)#define rd32 (reg) (igc_rd32(hw, reg))
@@ -318,4 +319,6 @@ do { \#define array_rd32 (reg, offset) (igc_rd32(hw, (reg) + ((offset) << 2))) +#define IGC_REMOVED (h) unlikely(!(h)) +#endif
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/201 ip: Fix data-races around sysctl_ip_no_pmtu_disc.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 0968d2a441bf6afb551fd99e60fa65ed67068963 ]
While reading sysctl_ip_no_pmtu_disc, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/af_inet.c | 2 +- net/ipv4/icmp.c | 2 +- net/ipv6/af_inet6.c | 2 +- net/xfrm/xfrm_state.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-)
net/ipv4/af_inet.c +1 -1
@@ -338,7 +338,7 @@ static int inet_create(struct net *net, struct socket *sock, int protocol, inet->hdrincl =1 ; } -if (net->ipv4.sysctl_ip_no_pmtu_disc) +if (READ_ONCE (net->ipv4.sysctl_ip_no_pmtu_disc)) inet->pmtudisc =IP_PMTUDISC_DONT ;else inet->pmtudisc =IP_PMTUDISC_WANT ;
net/ipv4/icmp.c +1 -1
@@ -887,7 +887,7 @@ static bool icmp_unreach(struct sk_buff *skb)* values please see * Documentation/networking/ip-sysctl.rst */ -switch (net->ipv4.sysctl_ip_no_pmtu_disc) { +switch (READ_ONCE (net->ipv4.sysctl_ip_no_pmtu_disc)) {default :net_dbg_ratelimited ("%pI4: fragmentation needed and DF set\n" , &iph->daddr);
net/ipv6/af_inet6.c +1 -1
@@ -226,7 +226,7 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,RCU_INIT_POINTER (inet->mc_list,NULL ); inet->rcv_tos =0 ; -if (net->ipv4.sysctl_ip_no_pmtu_disc) +if (READ_ONCE (net->ipv4.sysctl_ip_no_pmtu_disc)) inet->pmtudisc =IP_PMTUDISC_DONT ;else inet->pmtudisc =IP_PMTUDISC_WANT ;
net/xfrm/xfrm_state.c +1 -1
@@ -2619,7 +2619,7 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload)int err;if (family ==AF_INET && -xs_net (x)->ipv4.sysctl_ip_no_pmtu_disc) +READ_ONCE (xs_net (x)->ipv4.sysctl_ip_no_pmtu_disc)) x->props.flags |=XFRM_STATE_NOPMTUDISC ; err = -EPROTONOSUPPORT ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/201 ip: Fix data-races around sysctl_ip_fwd_use_pmtu.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 60c158dc7b1f0558f6cadd5b50d0386da0000d50 ]
While reading sysctl_ip_fwd_use_pmtu, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/net/ip.h | 2 +- net/ipv4/route.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/ip.h +1 -1
@@ -441,7 +441,7 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,struct net *net =dev_net (dst->dev);unsigned int mtu; -if (net->ipv4.sysctl_ip_fwd_use_pmtu || +if (READ_ONCE (net->ipv4.sysctl_ip_fwd_use_pmtu) ||ip_mtu_locked (dst) || !forwarding) { mtu = rt->rt_pmtu;
net/ipv4/route.c +1 -1
@@ -1404,7 +1404,7 @@ u32 ip_mtu_from_fib_result(struct fib_result *res, __be32 daddr)struct fib_info *fi = res->fi;u32 mtu =0 ; -if (dev_net (dev)->ipv4.sysctl_ip_fwd_use_pmtu || +if (READ_ONCE (dev_net (dev)->ipv4.sysctl_ip_fwd_use_pmtu) || fi->fib_metrics->metrics[RTAX_LOCK -1 ] & (1 <<RTAX_MTU )) mtu = fi->fib_mtu;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/201 ip: Fix data-races around sysctl_ip_fwd_update_priority.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 7bf9e18d9a5e99e3c83482973557e9f047b051e7 ]
While reading sysctl_ip_fwd_update_priority, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 3 ++- net/ipv4/ip_forward.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +2 -1
@@ -9787,13 +9787,14 @@ static int mlxsw_sp_dscp_init(struct mlxsw_sp *mlxsw_sp)static int __mlxsw_sp_router_init (struct mlxsw_sp *mlxsw_sp) {struct net *net =mlxsw_sp_net (mlxsw_sp); -bool usp = net->ipv4.sysctl_ip_fwd_update_priority;char rgcr_pl[MLXSW_REG_RGCR_LEN ];u64 max_rifs; +bool usp;if (!MLXSW_CORE_RES_VALID (mlxsw_sp->core,MAX_RIFS ))return -EIO ; max_rifs =MLXSW_CORE_RES_GET (mlxsw_sp->core,MAX_RIFS ); + usp =READ_ONCE (net->ipv4.sysctl_ip_fwd_update_priority);mlxsw_reg_rgcr_pack (rgcr_pl, true, true);mlxsw_reg_rgcr_max_router_interfaces_set (rgcr_pl, max_rifs);
net/ipv4/ip_forward.c +1 -1
@@ -151,7 +151,7 @@ int ip_forward(struct sk_buff *skb) !skb_sec_path(skb))ip_rt_send_redirect (skb); -if (net->ipv4.sysctl_ip_fwd_update_priority) +if (READ_ONCE (net->ipv4.sysctl_ip_fwd_update_priority)) skb->priority =rt_tos2priority (iph->tos); return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/201 ip: Fix data-races around sysctl_ip_nonlocal_bind.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 289d3b21fb0bfc94c4e98f10635bba1824e5f83c ]
While reading sysctl_ip_nonlocal_bind, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/net/inet_sock.h | 2 +- net/sctp/protocol.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/net/inet_sock.h +1 -1
@@ -373,7 +373,7 @@ static inline bool inet_get_convert_csum(struct sock *sk)static inline bool inet_can_nonlocal_bind (struct net *net,struct inet_sock *inet) { -return net->ipv4.sysctl_ip_nonlocal_bind || +return READ_ONCE (net->ipv4.sysctl_ip_nonlocal_bind) || inet->freebind || inet->transparent; }
net/sctp/protocol.c +1 -1
@@ -359,7 +359,7 @@ static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)if (addr->v4.sin_addr.s_addr !=htonl (INADDR_ANY ) && ret !=RTN_LOCAL && !sp->inet.freebind && - !net->ipv4.sysctl_ip_nonlocal_bind) + !READ_ONCE (net->ipv4.sysctl_ip_nonlocal_bind))return 0 ;if (ipv6_only_sock (sctp_opt2sk (sp)))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/201 ip: Fix a data-race around sysctl_ip_autobind_reuse.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 0db232765887d9807df8bcb7b6f29b2871539eab ]
While reading sysctl_ip_autobind_reuse, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/inet_connection_sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/inet_connection_sock.c +1 -1
@@ -259,7 +259,7 @@ inet_csk_find_open_port(struct sock *sk, struct inet_bind_bucket **tb_ret, int * goto other_half_scan; } -if (net->ipv4.sysctl_ip_autobind_reuse && !relax) { +if (READ_ONCE (net->ipv4.sysctl_ip_autobind_reuse) && !relax) {/* We still have a chance to connect to different destinations */ relax = true; goto ports_exhausted;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/201 ip: Fix a data-race around sysctl_fwmark_reflect.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 85d0b4dbd74b95cc492b1f4e34497d3f894f5d9a ]
While reading sysctl_fwmark_reflect, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- include/net/ip.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/ip.h +1 -1
@@ -379,7 +379,7 @@ void ipfrag_init(void);void ip_static_sysctl_init (void );#define IP4_REPLY_MARK (net, mark) \ - ((net)->ipv4.sysctl_fwmark_reflect ? (mark) : 0) + (READ_ONCE((net)->ipv4.sysctl_fwmark_reflect) ? (mark) : 0)static inline bool ip_is_fragment (const struct iphdr *iph) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/201 tcp/dccp: Fix a data-race around sysctl_tcp_fwmark_accept.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 1a0008f9df59451d0a17806c1ee1a19857032fa8 ]
While reading sysctl_tcp_fwmark_accept, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- include/net/inet_sock.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/net/inet_sock.h +2 -1
@@ -107,7 +107,8 @@ static inline struct inet_request_sock *inet_rsk(const struct request_sock *sk)static inline u32 inet_request_mark (const struct sock *sk,struct sk_buff *skb) { -if (!sk->sk_mark &&sock_net (sk)->ipv4.sysctl_tcp_fwmark_accept) +if (!sk->sk_mark && +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fwmark_accept))return skb->mark;return sk->sk_mark;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 61/201 tcp: sk->sk_bound_dev_if once in inet_request_bound_dev_if()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit fdb5fd7f736ec7ae9fb36d2842ea6d9ebc4e7269 ]
inet_request_bound_dev_if() reads sk->sk_bound_dev_if twice while listener socket is not locked.
Another cpu could change this field under us.
--- include/net/inet_sock.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
include/net/inet_sock.h +3 -2
@@ -117,14 +117,15 @@ static inline u32 inet_request_mark(const struct sock *sk, struct sk_buff *skb)static inline int inet_request_bound_dev_if (const struct sock *sk,struct sk_buff *skb) { +int bound_dev_if =READ_ONCE (sk->sk_bound_dev_if);#ifdef CONFIG_NET_L3_MASTER_DEV struct net *net =sock_net (sk); -if (!sk->sk_bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) +if (!bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept)return l3mdev_master_ifindex_by_index (net, skb->skb_iif);#endif -return sk->sk_bound_dev_if; +return bound_dev_if; }static inline int inet_sk_bound_l3mdev (const struct sock *sk)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 62/201 tcp: Fix data-races around sysctl_tcp_l3mdev_accept.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 08a75f10679470552a3a443f9aefd1399604d31d ]
While reading sysctl_tcp_l3mdev_accept, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/net/inet_hashtables.h | 2 +- include/net/inet_sock.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
include/net/inet_hashtables.h +1 -1
@@ -207,7 +207,7 @@ static inline bool inet_sk_bound_dev_eq(struct net *net, int bound_dev_if, int dif, int sdif) {#if IS_ENABLED (CONFIG_NET_L3_MASTER_DEV ) -return inet_bound_dev_eq (!!net->ipv4.sysctl_tcp_l3mdev_accept, +return inet_bound_dev_eq (!!READ_ONCE (net->ipv4.sysctl_tcp_l3mdev_accept), bound_dev_if, dif, sdif);#else return inet_bound_dev_eq (true, bound_dev_if, dif, sdif);
include/net/inet_sock.h +2 -2
@@ -121,7 +121,7 @@ static inline int inet_request_bound_dev_if(const struct sock *sk,#ifdef CONFIG_NET_L3_MASTER_DEV struct net *net =sock_net (sk); -if (!bound_dev_if && net->ipv4.sysctl_tcp_l3mdev_accept) +if (!bound_dev_if &&READ_ONCE (net->ipv4.sysctl_tcp_l3mdev_accept))return l3mdev_master_ifindex_by_index (net, skb->skb_iif);#endif
@@ -133,7 +133,7 @@ static inline int inet_sk_bound_l3mdev(const struct sock *sk)#ifdef CONFIG_NET_L3_MASTER_DEV struct net *net =sock_net (sk); -if (!net->ipv4.sysctl_tcp_l3mdev_accept) +if (!READ_ONCE (net->ipv4.sysctl_tcp_l3mdev_accept))return l3mdev_master_ifindex_by_index (net, sk->sk_bound_dev_if);#endif
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 63/201 tcp: Fix data-races around sysctl_tcp_mtu_probing.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit f47d00e077e7d61baf69e46dde3210c886360207 ]
While reading sysctl_tcp_mtu_probing, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_output.c | 2 +- net/ipv4/tcp_timer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_output.c +1 -1
@@ -1765,7 +1765,7 @@ void tcp_mtup_init(struct sock *sk)struct inet_connection_sock *icsk =inet_csk (sk);struct net *net =sock_net (sk); - icsk->icsk_mtup.enabled = net->ipv4.sysctl_tcp_mtu_probing >1 ; + icsk->icsk_mtup.enabled =READ_ONCE (net->ipv4.sysctl_tcp_mtu_probing) >1 ; icsk->icsk_mtup.search_high = tp->rx_opt.mss_clamp +sizeof (struct tcphdr ) + icsk->icsk_af_ops->net_header_len; icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk, net->ipv4.sysctl_tcp_base_mss);
net/ipv4/tcp_timer.c +1 -1
@@ -163,7 +163,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk)int mss;/* Black hole detection */ -if (!net->ipv4.sysctl_tcp_mtu_probing) +if (!READ_ONCE (net->ipv4.sysctl_tcp_mtu_probing))return ;if (!icsk->icsk_mtup.enabled) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 64/201 tcp: Fix data-races around sysctl_tcp_base_mss.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 88d78bc097cd8ebc6541e93316c9d9bf651b13e8 ]
While reading sysctl_tcp_base_mss, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_output.c | 2 +- net/ipv4/tcp_timer.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_output.c +1 -1
@@ -1768,7 +1768,7 @@ void tcp_mtup_init(struct sock *sk) icsk->icsk_mtup.enabled =READ_ONCE (net->ipv4.sysctl_tcp_mtu_probing) >1 ; icsk->icsk_mtup.search_high = tp->rx_opt.mss_clamp +sizeof (struct tcphdr ) + icsk->icsk_af_ops->net_header_len; - icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk, net->ipv4.sysctl_tcp_base_mss); + icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk,READ_ONCE (net->ipv4.sysctl_tcp_base_mss)); icsk->icsk_mtup.probe_size =0 ;if (icsk->icsk_mtup.enabled) icsk->icsk_mtup.probe_timestamp = tcp_jiffies32;
net/ipv4/tcp_timer.c +1 -1
@@ -171,7 +171,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk) icsk->icsk_mtup.probe_timestamp = tcp_jiffies32; }else { mss =tcp_mtu_to_mss (sk, icsk->icsk_mtup.search_low) >>1 ; - mss =min (net->ipv4.sysctl_tcp_base_mss, mss); + mss =min (READ_ONCE (net->ipv4.sysctl_tcp_base_mss), mss); mss =max (mss, net->ipv4.sysctl_tcp_mtu_probe_floor); mss =max (mss, net->ipv4.sysctl_tcp_min_snd_mss); icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk, mss);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 65/201 tcp: Fix data-races around sysctl_tcp_min_snd_mss.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 78eb166cdefcc3221c8c7c1e2d514e91a2eb5014 ]
While reading sysctl_tcp_min_snd_mss, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_output.c | 3 ++- net/ipv4/tcp_timer.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp_output.c +2 -1
@@ -1722,7 +1722,8 @@ static inline int __tcp_mtu_to_mss(struct sock *sk, int pmtu) mss_now -= icsk->icsk_ext_hdr_len;/* Then reserve room for full set of TCP options and 8 bytes of data */ - mss_now =max (mss_now,sock_net (sk)->ipv4.sysctl_tcp_min_snd_mss); + mss_now =max (mss_now, +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_min_snd_mss));return mss_now; }
net/ipv4/tcp_timer.c +1 -1
@@ -173,7 +173,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk) mss =tcp_mtu_to_mss (sk, icsk->icsk_mtup.search_low) >>1 ; mss =min (READ_ONCE (net->ipv4.sysctl_tcp_base_mss), mss); mss =max (mss, net->ipv4.sysctl_tcp_mtu_probe_floor); - mss =max (mss, net->ipv4.sysctl_tcp_min_snd_mss); + mss =max (mss,READ_ONCE (net->ipv4.sysctl_tcp_min_snd_mss)); icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk, mss); }tcp_sync_mss (sk, icsk->icsk_pmtu_cookie);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 66/201 tcp: Fix a data-race around sysctl_tcp_mtu_probe_floor.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 8e92d4423615a5257d0d871fc067aa561f597deb ]
While reading sysctl_tcp_mtu_probe_floor, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_timer.c +1 -1
@@ -172,7 +172,7 @@ static void tcp_mtu_probing(struct inet_connection_sock *icsk, struct sock *sk) }else { mss =tcp_mtu_to_mss (sk, icsk->icsk_mtup.search_low) >>1 ; mss =min (READ_ONCE (net->ipv4.sysctl_tcp_base_mss), mss); - mss =max (mss, net->ipv4.sysctl_tcp_mtu_probe_floor); + mss =max (mss,READ_ONCE (net->ipv4.sysctl_tcp_mtu_probe_floor)); mss =max (mss,READ_ONCE (net->ipv4.sysctl_tcp_min_snd_mss)); icsk->icsk_mtup.search_low =tcp_mss_to_mtu (sk, mss); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 67/201 tcp: Fix a data-race around sysctl_tcp_probe_threshold.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 92c0aa4175474483d6cf373314343d4e624e882a ]
While reading sysctl_tcp_probe_threshold, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_output.c +1 -1
@@ -2363,7 +2363,7 @@ static int tcp_mtu_probe(struct sock *sk)* probing process by not resetting search range to its orignal. */ if (probe_size >tcp_mtu_to_mss (sk, icsk->icsk_mtup.search_high) || - interval < net->ipv4.sysctl_tcp_probe_threshold) { + interval <READ_ONCE (net->ipv4.sysctl_tcp_probe_threshold)) {/* Check whether enough time has elaplased for * another round of probing. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 68/201 tcp: Fix a data-race around sysctl_tcp_probe_interval.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 2a85388f1d94a9f8b5a529118a2c5eaa0520d85c ]
While reading sysctl_tcp_probe_interval, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_output.c +1 -1
@@ -2281,7 +2281,7 @@ static inline void tcp_mtu_check_reprobe(struct sock *sk)u32 interval;s32 delta; - interval = net->ipv4.sysctl_tcp_probe_interval; + interval =READ_ONCE (net->ipv4.sysctl_tcp_probe_interval); delta = tcp_jiffies32 - icsk->icsk_mtup.probe_timestamp;if (unlikely (delta >= interval *HZ )) {int mss =tcp_current_mss (sk);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 69/201 net: stmmac: fix pm runtime issue in stmmac_dvr_remove()
In reply to Greg Kroah-HartmanFrom: Biao Huang <[email protected]>
[ Upstream commit 0d9a15913b871e03fdd3b3d90a2e665fb22f9bcf ]
If netif is running when stmmac_dvr_remove is invoked, the unregister_netdev will call ndo_stop(stmmac_release) and vlan_kill_rx_filter(stmmac_vlan_rx_kill_vid).
Currently, stmmac_dvr_remove() will disable pm runtime before unregister_netdev. When stmmac_vlan_rx_kill_vid is invoked, pm_runtime_resume_and_get in it returns EACCESS error number, and reports:
dwmac-mediatek 11021000.ethernet eth0: stmmac_dvr_remove: removing driver dwmac-mediatek 11021000.ethernet eth0: FPE workqueue stop dwmac-mediatek 11021000.ethernet eth0: failed to kill vid 0081/0
Move the pm_runtime_disable to the end of stmmac_dvr_remove to fix this issue.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -2
@@ -7279,8 +7279,6 @@ int stmmac_dvr_remove(struct device *dev)netdev_info (priv->dev,"%s: removing driver" , __func__);pm_runtime_get_sync (dev); -pm_runtime_disable (dev); -pm_runtime_put_noidle (dev);stmmac_stop_all_dma (priv);stmmac_mac_set (priv, priv->ioaddr, false);
@@ -7307,6 +7305,9 @@ int stmmac_dvr_remove(struct device *dev)mutex_destroy (&priv->lock);bitmap_free (priv->af_xdp_zc_qps); +pm_runtime_disable (dev); +pm_runtime_put_noidle (dev); +return 0 ; }EXPORT_SYMBOL_GPL (stmmac_dvr_remove);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 70/201 net: stmmac: fix unbalanced ptp clock issue in suspend/resume flow
In reply to Greg Kroah-HartmanFrom: Biao Huang <[email protected]>
[ Upstream commit f4c7d8948e866918d61493264dbbd67e45ef2bda ]
Current stmmac driver will prepare/enable ptp_ref clock in stmmac_init_tstamp_counter().
The stmmac_pltfr_noirq_suspend will disable it once in suspend flow.
But in resume flow,
stmmac_pltfr_noirq_resume --> stmmac_init_tstamp_counter stmmac_resume --> stmmac_hw_setup --> stmmac_init_ptp --> stmmac_init_tstamp_counter
ptp_ref clock reference counter increases twice, which leads to unbalance ptp clock when resume back.
Move ptp_ref clock prepare/enable out of stmmac_init_tstamp_counter to fix it.
--- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 17 ++++++++--------- .../ethernet/stmicro/stmmac/stmmac_platform.c | 8 +++++++- 2 files changed, 15 insertions(+), 10 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +8 -9
@@ -844,19 +844,10 @@ int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags)struct timespec64 now;u32 sec_inc =0 ;u64 temp =0 ; -int ret;if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp))return -EOPNOTSUPP ; - ret =clk_prepare_enable (priv->plat->clk_ptp_ref); -if (ret <0 ) { -netdev_warn (priv->dev, -"failed to enable PTP reference clock: %pe\n" , -ERR_PTR (ret)); -return ret; - } -stmmac_config_hw_tstamping (priv, priv->ptpaddr, systime_flags); priv->systime_flags = systime_flags;
@@ -3325,6 +3316,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool ptp_register)stmmac_mmc_setup (priv); +if (ptp_register) { + ret =clk_prepare_enable (priv->plat->clk_ptp_ref); +if (ret <0 ) +netdev_warn (priv->dev, +"failed to enable PTP reference clock: %pe\n" , +ERR_PTR (ret)); + } + ret =stmmac_init_ptp (priv);if (ret == -EOPNOTSUPP )netdev_warn (priv->dev,"PTP not supported by HW\n" );
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +7 -1
@@ -815,7 +815,13 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)if (ret)return ret; -stmmac_init_tstamp_counter (priv, priv->systime_flags); + ret =clk_prepare_enable (priv->plat->clk_ptp_ref); +if (ret <0 ) { +netdev_warn (priv->dev, +"failed to enable PTP reference clock: %pe\n" , +ERR_PTR (ret)); +return ret; + } }return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 71/201 mtd: rawnand: gpmi: validate controller clock rate
In reply to Greg Kroah-HartmanFrom: Dario Binacchi <[email protected]>
[ Upstream commit 15e27d197a7ea69b4643791ca2f8467fdd998359 ]
What to do when the real rate of the gpmi clock is not equal to the required one? The solutions proposed in [1] did not lead to a conclusion on how to validate the clock rate, so, inspired by the document [2], I consider the rate correct only if not lower or equal to the rate of the previous edo mode. In fact, in chapter 4.16.2 (NV-DDR) of the document [2], it is written that "If the host selects timing mode n, then its clock period shall be faster than the clock period of timing mode n-1 and slower than or equal to the clock period of timing mode n.". I thought that it could therefore also be used in this case, without therefore having to define the valid rate ranges empirically.
For example, suppose that gpmi_nfc_compute_timings() is called to set edo mode 5 (100MHz) but the rate returned by clk_round_rate() is 80MHz (edo mode 4). In this case gpmi_nfc_compute_timings() will return error, and will be called again to set edo mode 4, which this time will be successful.
[1] https://lore.kernel.org/r/[email protected]
[2] http://www.onfi.org/-/media/client/onfi/specs/onfi_3_0_gold.pdf?la=en
--- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +18 -4
@@ -644,8 +644,8 @@ static int bch_set_geometry(struct gpmi_nand_data *this)* RDN_DELAY = ----------------------- {3} * RP */ -static void gpmi_nfc_compute_timings (struct gpmi_nand_data *this, -const struct nand_sdr_timings *sdr) +static int gpmi_nfc_compute_timings (struct gpmi_nand_data *this, +const struct nand_sdr_timings *sdr) {struct gpmi_nfc_hardware_timing *hw = &this->hw;struct resources *r = &this->resources;
@@ -657,23 +657,33 @@ static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this,int sample_delay_ps, sample_delay_factor;u16 busy_timeout_cycles;u8 wrn_dly_sel; +unsigned long clk_rate, min_rate;if (sdr->tRC_min >=30000 ) {/* ONFI non-EDO modes [0-3] */ hw->clk_rate =22000000 ; + min_rate =0 ; wrn_dly_sel =BV_GPMI_CTRL1_WRN_DLY_SEL_4_TO_8NS ; }else if (sdr->tRC_min >=25000 ) {/* ONFI EDO mode 4 */ hw->clk_rate =80000000 ; + min_rate =22000000 ; wrn_dly_sel =BV_GPMI_CTRL1_WRN_DLY_SEL_NO_DELAY ; }else {/* ONFI EDO mode 5 */ hw->clk_rate =100000000 ; + min_rate =80000000 ; wrn_dly_sel =BV_GPMI_CTRL1_WRN_DLY_SEL_NO_DELAY ; } - hw->clk_rate =clk_round_rate (r->clock[0 ], hw->clk_rate); + clk_rate =clk_round_rate (r->clock[0 ], hw->clk_rate); +if (clk_rate <= min_rate) { +dev_err (this->dev,"clock setting: expected %ld, got %ld\n" , + hw->clk_rate, clk_rate); +return -ENOTSUPP ; + } + hw->clk_rate = clk_rate;/* SDR core timings are given in picoseconds */ period_ps =div_u64 ((u64 )NSEC_PER_SEC *1000 , hw->clk_rate);
@@ -714,6 +724,7 @@ static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this, hw->ctrl1n |=BF_GPMI_CTRL1_RDN_DELAY (sample_delay_factor) |BM_GPMI_CTRL1_DLL_ENABLE | (use_half_period ?BM_GPMI_CTRL1_HALF_PERIOD :0 ); +return 0 ; }static int gpmi_nfc_apply_timings (struct gpmi_nand_data *this)
@@ -769,6 +780,7 @@ static int gpmi_setup_interface(struct nand_chip *chip, int chipnr, {struct gpmi_nand_data *this =nand_get_controller_data (chip);const struct nand_sdr_timings *sdr; +int ret;/* Retrieve required NAND timings */ sdr =nand_get_sdr_timings (conf);
@@ -784,7 +796,9 @@ static int gpmi_setup_interface(struct nand_chip *chip, int chipnr,return 0 ;/* Do the actual derivation of the controller timings */ -gpmi_nfc_compute_timings (this, sdr); + ret =gpmi_nfc_compute_timings (this, sdr); +if (ret) +return ret; this->hw.must_apply_timings = true;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 72/201 mtd: rawnand: gpmi: Set WAIT_FOR_READY timeout based on program/erase times
In reply to Greg Kroah-HartmanFrom: Sascha Hauer <[email protected]>
[ Upstream commit 0fddf9ad06fd9f439f137139861556671673e31c ]
06781a5026350 Fixes the calculation of the DEVICE_BUSY_TIMEOUT register value from busy_timeout_cycles. busy_timeout_cycles is calculated wrong
though: It is calculated based on the maximum page read time, but the timeout is also used for page write and block erase operations which require orders of magnitude bigger timeouts.
Fix this by calculating busy_timeout_cycles from the maximum of tBERS_max and tPROG_max.
This is for now the easiest and most obvious way to fix the driver. There's room for improvements though: The NAND_OP_WAITRDY_INSTR tells us the desired timeout for the current operation, so we could program the timeout dynamically for each operation instead of setting a fixed timeout. Also we could wire up the interrupt handler to actually detect and forward timeouts occurred when waiting for the chip being ready.
As a sidenote I verified that the change in 06781a5026350 is really correct. I wired up the interrupt handler in my tree and measured the time between starting the operation and the timeout interrupt handler coming in. The time increases 41us with each step in the timeout register which corresponds to 4096 clock cycles with the 99MHz clock that I have.
--- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +4 -2
@@ -655,9 +655,10 @@ static int gpmi_nfc_compute_timings(struct gpmi_nand_data *this,unsigned int tRP_ps;bool use_half_period;int sample_delay_ps, sample_delay_factor; -u16 busy_timeout_cycles; +unsigned int busy_timeout_cycles;u8 wrn_dly_sel;unsigned long clk_rate, min_rate; +u64 busy_timeout_ps;if (sdr->tRC_min >=30000 ) {/* ONFI non-EDO modes [0-3] */
@@ -690,7 +691,8 @@ static int gpmi_nfc_compute_timings(struct gpmi_nand_data *this, addr_setup_cycles =TO_CYCLES (sdr->tALS_min, period_ps); data_setup_cycles =TO_CYCLES (sdr->tDS_min, period_ps); data_hold_cycles =TO_CYCLES (sdr->tDH_min, period_ps); - busy_timeout_cycles =TO_CYCLES (sdr->tWB_max + sdr->tR_max, period_ps); + busy_timeout_ps =max (sdr->tBERS_max, sdr->tPROG_max); + busy_timeout_cycles =TO_CYCLES (busy_timeout_ps, period_ps); hw->timing0 =BF_GPMI_TIMING0_ADDRESS_SETUP (addr_setup_cycles) | BF_GPMI_TIMING0_DATA_HOLD(data_hold_cycles) |
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 73/201 net: dsa: microchip: ksz_common: Fix refcount leak bug
In reply to Greg Kroah-HartmanFrom: Liang He <[email protected]>
[ Upstream commit a14bd7475452c51835dd5a0cee4c8fa48dd0b539 ]
In ksz_switch_register(), we should call of_node_put() for the reference returned by of_get_child_by_name() which has increased the refcount.
--- drivers/net/dsa/microchip/ksz_common.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/dsa/microchip/ksz_common.c +4 -1
@@ -414,18 +414,21 @@ int ksz_switch_register(struct ksz_device *dev, ports =of_get_child_by_name (dev->dev->of_node,"ethernet-ports" );if (!ports) ports =of_get_child_by_name (dev->dev->of_node,"ports" ); -if (ports) +if (ports) {for_each_available_child_of_node (ports, port) {if (of_property_read_u32 (port,"reg" , &port_num))continue ;if (!(dev->port_mask &BIT (port_num))) {of_node_put (port); +of_node_put (ports);return -EINVAL ; }of_get_phy_mode (port, &dev->ports[port_num].interface); } +of_node_put (ports); + } dev->synclko_125 =of_property_read_bool (dev->dev->of_node,"microchip,synclko-125" ); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 74/201 net: skb: introduce kfree_skb_reason()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit c504e5c2f9648a1e5c2be01e8c3f59d394192bd3 ]
Introduce the interface kfree_skb_reason(), which is able to pass the reason why the skb is dropped to 'kfree_skb' tracepoint.
Add the 'reason' field to 'trace_kfree_skb', therefor user can get more detail information about abnormal skb with 'drop_monitor' or eBPF.
All drop reasons are defined in the enum 'skb_drop_reason', and they will be print as string in 'kfree_skb' tracepoint in format of 'reason: XXX'.
( Maybe the reasons should be defined in a uapi header file, so that user space can use them? )
--- include/linux/skbuff.h | 23 ++++++++++++++++++++++- include/trace/events/skb.h | 36 +++++++++++++++++++++++++++++------- net/core/dev.c | 3 ++- net/core/drop_monitor.c | 10 +++++++--- net/core/skbuff.c | 12 +++++++----- 5 files changed, 67 insertions(+), 17 deletions(-)
include/linux/skbuff.h +22 -1
@@ -304,6 +304,17 @@ struct sk_buff_head {struct sk_buff ; +/* The reason of skb drop, which is used in kfree_skb_reason(). +* en...maybe they should be splited by group? +* +* Each item here should also be in 'TRACE_SKB_DROP_REASON', which is +* used to translate the reason to string. +*/ +enum skb_drop_reason { +SKB_DROP_REASON_NOT_SPECIFIED , +SKB_DROP_REASON_MAX , +}; +/* To allow 64K frame to be packed as single skb without frag_list we * require 64K/PAGE_SIZE pages plus 1 additional page to allow for * buffers which do not start on a page boundary.
@@ -1074,8 +1085,18 @@ static inline bool skb_unref(struct sk_buff *skb)return true; } +void kfree_skb_reason (struct sk_buff *skb,enum skb_drop_reason reason); + +/** +* kfree_skb - free an sk_buff with 'NOT_SPECIFIED' reason +* @skb: buffer to free +*/ +static inline void kfree_skb (struct sk_buff *skb) +{ +kfree_skb_reason (skb,SKB_DROP_REASON_NOT_SPECIFIED ); +} +void skb_release_head_state (struct sk_buff *skb); -void kfree_skb (struct sk_buff *skb);void kfree_skb_list (struct sk_buff *segs);void skb_dump (const char *level,const struct sk_buff *skb,bool full_pkt);void skb_tx_error (struct sk_buff *skb);
include/trace/events/skb.h +29 -7
@@ -9,29 +9,51 @@#include <linux/netdevice.h> #include <linux/tracepoint.h> +#define TRACE_SKB_DROP_REASON \ + EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED) \ + EMe(SKB_DROP_REASON_MAX, MAX) + +#undef EM +#undef EMe + +#define EM (a, b) TRACE_DEFINE_ENUM(a); +#define EMe (a, b) TRACE_DEFINE_ENUM(a); + +TRACE_SKB_DROP_REASON + +#undef EM +#undef EMe +#define EM (a, b) { a, #b }, +#define EMe (a, b) { a, #b } +/* * Tracepoint for free an sk_buff: */ TRACE_EVENT (kfree_skb, - TP_PROTO(struct sk_buff *skb, void *location), + TP_PROTO(struct sk_buff *skb, void *location, + enum skb_drop_reason reason), -TP_ARGS (skb, location), +TP_ARGS (skb, location, reason),TP_STRUCT__entry ( - __field( void *, skbaddr ) - __field( void *, location ) - __field( unsigned short, protocol ) + __field(void *, skbaddr) + __field(void *, location) + __field(unsigned short, protocol) + __field(enum skb_drop_reason, reason) ),TP_fast_assign ( __entry->skbaddr = skb; __entry->location = location; __entry->protocol = ntohs(skb->protocol); + __entry->reason = reason; ), -TP_printk ("skbaddr=%p protocol=%u location=%p" , - __entry->skbaddr, __entry->protocol, __entry->location) +TP_printk ("skbaddr=%p protocol=%u location=%p reason: %s" , + __entry->skbaddr, __entry->protocol, __entry->location, +__print_symbolic (__entry->reason, +TRACE_SKB_DROP_REASON )) ); TRACE_EVENT(consume_skb,
net/core/dev.c +2 -1
@@ -5005,7 +5005,8 @@ static __latent_entropy void net_tx_action(struct softirq_action *h)if (likely (get_kfree_skb_cb (skb)->reason ==SKB_REASON_CONSUMED ))trace_consume_skb (skb);else -trace_kfree_skb (skb, net_tx_action); +trace_kfree_skb (skb, net_tx_action, +SKB_DROP_REASON_NOT_SPECIFIED );if (skb->fclone !=SKB_FCLONE_UNAVAILABLE )__kfree_skb (skb);
net/core/drop_monitor.c +7 -3
@@ -110,7 +110,8 @@ static u32 net_dm_queue_len = 1000;struct net_dm_alert_ops {void (*kfree_skb_probe)(void *ignore,struct sk_buff *skb, -void *location); +void *location, +enum skb_drop_reason reason);void (*napi_poll_probe)(void *ignore,struct napi_struct *napi,int work,int budget);void (*work_item_func)(struct work_struct *work);
@@ -262,7 +263,9 @@ static void trace_drop_common(struct sk_buff *skb, void *location)spin_unlock_irqrestore (&data->lock, flags); } -static void trace_kfree_skb_hit (void *ignore,struct sk_buff *skb,void *location) +static void trace_kfree_skb_hit (void *ignore,struct sk_buff *skb, +void *location, +enum skb_drop_reason reason) {trace_drop_common (skb, location); }
@@ -494,7 +497,8 @@ static const struct net_dm_alert_ops net_dm_alert_summary_ops = {static void net_dm_packet_trace_kfree_skb_hit (void *ignore,struct sk_buff *skb, -void *location) +void *location, +enum skb_drop_reason reason) {ktime_t tstamp =ktime_get_real ();struct per_cpu_dm_data *data;
net/core/skbuff.c +7 -5
@@ -759,21 +759,23 @@ void __kfree_skb(struct sk_buff *skb)EXPORT_SYMBOL (__kfree_skb);/** -* kfree_skb - free an sk_buff +* kfree_skb_reason - free an sk_buff with special reason * @skb: buffer to free +* @reason: reason why this skb is dropped * * Drop a reference to the buffer and free it if the usage count has -* hit zero. +* hit zero. Meanwhile, pass the drop reason to 'kfree_skb' +* tracepoint. */ -void kfree_skb (struct sk_buff *skb) +void kfree_skb_reason (struct sk_buff *skb,enum skb_drop_reason reason) {if (!skb_unref (skb))return ; -trace_kfree_skb (skb,__builtin_return_address (0 )); +trace_kfree_skb (skb,__builtin_return_address (0 ), reason);__kfree_skb (skb); } -EXPORT_SYMBOL (kfree_skb); +EXPORT_SYMBOL (kfree_skb_reason);void kfree_skb_list (struct sk_buff *segs) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 75/201 net: skb: use kfree_skb_reason() in tcp_v4_rcv()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 85125597419aec3aa7b8f3b8713e415f997796f2 ]
Replace kfree_skb() with kfree_skb_reason() in tcp_v4_rcv(). Following drop reasons are added:
SKB_DROP_REASON_NO_SOCKETSKB_DROP_REASON_PKT_TOO_SMALLSKB_DROP_REASON_TCP_CSUMSKB_DROP_REASON_TCP_FILTER
After this patch, 'kfree_skb' event will print message like this:
$ TASK-PID CPU# ||||| TIMESTAMP FUNCTION
$ | | | ||||| | |
<idle>-0 [000] ..s1. 36.113438: kfree_skb: skbaddr=(____ptrval____) protocol=2048 location=(____ptrval____) reason: NO_SOCKETThe reason of skb drop is printed too.
--- include/linux/skbuff.h | 4 ++++ include/trace/events/skb.h | 4 ++++ net/ipv4/tcp_ipv4.c | 14 +++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-)
include/linux/skbuff.h +4 -0
@@ -312,6 +312,10 @@ struct sk_buff;*/ enum skb_drop_reason {SKB_DROP_REASON_NOT_SPECIFIED , +SKB_DROP_REASON_NO_SOCKET , +SKB_DROP_REASON_PKT_TOO_SMALL , +SKB_DROP_REASON_TCP_CSUM , +SKB_DROP_REASON_TCP_FILTER ,SKB_DROP_REASON_MAX , };
include/trace/events/skb.h +4 -0
@@ -11,6 +11,10 @@#define TRACE_SKB_DROP_REASON \ EM(SKB_DROP_REASON_NOT_SPECIFIED, NOT_SPECIFIED) \ + EM(SKB_DROP_REASON_NO_SOCKET, NO_SOCKET) \ + EM(SKB_DROP_REASON_PKT_TOO_SMALL, PKT_TOO_SMALL) \ + EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM) \ + EM(SKB_DROP_REASON_TCP_FILTER, TCP_FILTER) \ EMe(SKB_DROP_REASON_MAX, MAX)#undef EM
net/ipv4/tcp_ipv4.c +11 -3
@@ -1976,8 +1976,10 @@ int tcp_v4_rcv(struct sk_buff *skb)const struct tcphdr *th;bool refcounted;struct sock *sk; +int drop_reason;int ret; + drop_reason =SKB_DROP_REASON_NOT_SPECIFIED ;if (skb->pkt_type !=PACKET_HOST ) goto discard_it;
@@ -1989,8 +1991,10 @@ int tcp_v4_rcv(struct sk_buff *skb) th = (const struct tcphdr *)skb->data; -if (unlikely (th->doff <sizeof (struct tcphdr ) /4 )) +if (unlikely (th->doff <sizeof (struct tcphdr ) /4 )) { + drop_reason =SKB_DROP_REASON_PKT_TOO_SMALL ; goto bad_packet; + }if (!pskb_may_pull (skb, th->doff *4 )) goto discard_it;
@@ -2093,8 +2097,10 @@ int tcp_v4_rcv(struct sk_buff *skb)nf_reset_ct (skb); -if (tcp_filter (sk, skb)) +if (tcp_filter (sk, skb)) { + drop_reason =SKB_DROP_REASON_TCP_FILTER ; goto discard_and_relse; + } th = (const struct tcphdr *)skb->data; iph =ip_hdr (skb);tcp_v4_fill_cb (skb, iph, th);
@@ -2131,6 +2137,7 @@ int tcp_v4_rcv(struct sk_buff *skb)return ret; no_tcp_socket: + drop_reason =SKB_DROP_REASON_NO_SOCKET ;if (!xfrm4_policy_check (NULL ,XFRM_POLICY_IN , skb)) goto discard_it;
@@ -2138,6 +2145,7 @@ int tcp_v4_rcv(struct sk_buff *skb)if (tcp_checksum_complete (skb)) { csum_error: + drop_reason =SKB_DROP_REASON_TCP_CSUM ;trace_tcp_bad_csum (skb);__TCP_INC_STATS (net,TCP_MIB_CSUMERRORS ); bad_packet:
@@ -2148,7 +2156,7 @@ int tcp_v4_rcv(struct sk_buff *skb) discard_it:/* Discard frame. */ -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return 0 ; discard_and_relse:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 76/201 net: skb: use kfree_skb_reason() in __udp4_lib_rcv()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 1c7fab70df085d866a3765955f397ca2b4025b15 ]
Replace kfree_skb() with kfree_skb_reason() in __udp4_lib_rcv. New drop reason 'SKB_DROP_REASON_UDP_CSUM' is added for udp csum error.
--- include/linux/skbuff.h | 1 + include/trace/events/skb.h | 1 + net/ipv4/udp.c | 10 ++++++++-- 3 files changed, 10 insertions(+), 2 deletions(-)
include/linux/skbuff.h +1 -0
@@ -316,6 +316,7 @@ enum skb_drop_reason {SKB_DROP_REASON_PKT_TOO_SMALL ,SKB_DROP_REASON_TCP_CSUM ,SKB_DROP_REASON_TCP_FILTER , +SKB_DROP_REASON_UDP_CSUM , SKB_DROP_REASON_MAX, };
include/trace/events/skb.h +1 -0
@@ -15,6 +15,7 @@ EM(SKB_DROP_REASON_PKT_TOO_SMALL, PKT_TOO_SMALL) \ EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM) \ EM(SKB_DROP_REASON_TCP_FILTER, TCP_FILTER) \ + EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \ EMe(SKB_DROP_REASON_MAX, MAX)#undef EM
net/ipv4/udp.c +8 -2
@@ -2411,6 +2411,9 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,__be32 saddr, daddr;struct net *net =dev_net (skb->dev);bool refcounted; +int drop_reason; + + drop_reason =SKB_DROP_REASON_NOT_SPECIFIED ;/* * Validate the packet.
@@ -2466,6 +2469,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,if (udp_lib_checksum_complete (skb)) goto csum_error; + drop_reason =SKB_DROP_REASON_NO_SOCKET ;__UDP_INC_STATS (net,UDP_MIB_NOPORTS , proto ==IPPROTO_UDPLITE );icmp_send (skb,ICMP_DEST_UNREACH ,ICMP_PORT_UNREACH ,0 );
@@ -2473,10 +2477,11 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,* Hmm. We got an UDP packet to a port to which we * don't wanna listen. Ignore it. */ -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return 0 ; short_packet: + drop_reason =SKB_DROP_REASON_PKT_TOO_SMALL ; net_dbg_ratelimited("UDP%s: short packet: From %pI4:%u %d/%d to %pI4:%u\n", proto == IPPROTO_UDPLITE ? "Lite" : "", &saddr, ntohs(uh->source),
@@ -2489,6 +2494,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,* RFC1122: OK. Discards the bad packet silently (as far as * the network is concerned, anyway) as per 4.1.3.4 (MUST). */ + drop_reason =SKB_DROP_REASON_UDP_CSUM ; net_dbg_ratelimited("UDP%s: bad checksum. From %pI4:%u to %pI4:%u ulen %d\n", proto == IPPROTO_UDPLITE ? "Lite" : "", &saddr, ntohs(uh->source), &daddr, ntohs(uh->dest),
@@ -2496,7 +2502,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,__UDP_INC_STATS (net,UDP_MIB_CSUMERRORS , proto ==IPPROTO_UDPLITE ); drop:__UDP_INC_STATS (net,UDP_MIB_INERRORS , proto ==IPPROTO_UDPLITE ); -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 77/201 net: socket: rename SKB_DROP_REASON_SOCKET_FILTER
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 364df53c081d93fcfd6b91085ff2650c7f17b3c7 ]
Rename SKB_DROP_REASON_SOCKET_FILTER, which is used as the reason of skb drop out of socket filter before it's part of a released kernel. It will be used for more protocols than just TCP in future series.
--- include/linux/skbuff.h | 2 +- include/trace/events/skb.h | 2 +- net/ipv4/tcp_ipv4.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
include/linux/skbuff.h +1 -1
@@ -315,7 +315,7 @@ enum skb_drop_reason {SKB_DROP_REASON_NO_SOCKET ,SKB_DROP_REASON_PKT_TOO_SMALL ,SKB_DROP_REASON_TCP_CSUM , -SKB_DROP_REASON_TCP_FILTER , +SKB_DROP_REASON_SOCKET_FILTER ,SKB_DROP_REASON_UDP_CSUM , SKB_DROP_REASON_MAX, };
include/trace/events/skb.h +1 -1
@@ -14,7 +14,7 @@ EM(SKB_DROP_REASON_NO_SOCKET, NO_SOCKET) \ EM(SKB_DROP_REASON_PKT_TOO_SMALL, PKT_TOO_SMALL) \ EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM) \ - EM(SKB_DROP_REASON_TCP_FILTER, TCP_FILTER) \ + EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER) \ EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \EMe (SKB_DROP_REASON_MAX ,MAX )
net/ipv4/tcp_ipv4.c +1 -1
@@ -2098,7 +2098,7 @@ int tcp_v4_rcv(struct sk_buff *skb)nf_reset_ct (skb);if (tcp_filter (sk, skb)) { - drop_reason =SKB_DROP_REASON_TCP_FILTER ; + drop_reason =SKB_DROP_REASON_SOCKET_FILTER ; goto discard_and_relse; } th = (const struct tcphdr *)skb->data;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 78/201 net: skb_drop_reason: add document for drop reasons
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 88590b369354092183bcba04e2368010c462557f ]
Add document for following existing drop reasons:
SKB_DROP_REASON_NOT_SPECIFIEDSKB_DROP_REASON_NO_SOCKETSKB_DROP_REASON_PKT_TOO_SMALLSKB_DROP_REASON_TCP_CSUMSKB_DROP_REASON_SOCKET_FILTERSKB_DROP_REASON_UDP_CSUM
--- include/linux/skbuff.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
include/linux/skbuff.h +6 -6
@@ -311,12 +311,12 @@ struct sk_buff;* used to translate the reason to string. */ enum skb_drop_reason { -SKB_DROP_REASON_NOT_SPECIFIED , -SKB_DROP_REASON_NO_SOCKET , -SKB_DROP_REASON_PKT_TOO_SMALL , -SKB_DROP_REASON_TCP_CSUM , -SKB_DROP_REASON_SOCKET_FILTER , -SKB_DROP_REASON_UDP_CSUM , +SKB_DROP_REASON_NOT_SPECIFIED ,/* drop reason is not specified */ +SKB_DROP_REASON_NO_SOCKET ,/* socket not found */ +SKB_DROP_REASON_PKT_TOO_SMALL ,/* packet size is too small */ +SKB_DROP_REASON_TCP_CSUM ,/* TCP checksum error */ +SKB_DROP_REASON_SOCKET_FILTER ,/* dropped by socket filter */ +SKB_DROP_REASON_UDP_CSUM ,/* UDP checksum error */ SKB_DROP_REASON_MAX , };
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 79/201 net: netfilter: use kfree_drop_reason() for NF_DROP
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 2df3041ba3be950376e8c25a8f6da22f7fcc765c ]
Replace kfree_skb() with kfree_skb_reason() in nf_hook_slow() when skb is dropped by reason of NF_DROP. Following new drop reasons are introduced:
SKB_DROP_REASON_NETFILTER_DROP
--- include/linux/skbuff.h | 1 + include/trace/events/skb.h | 1 + net/netfilter/core.c | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-)
include/linux/skbuff.h +1 -0
@@ -317,6 +317,7 @@ enum skb_drop_reason {SKB_DROP_REASON_TCP_CSUM ,/* TCP checksum error */ SKB_DROP_REASON_SOCKET_FILTER ,/* dropped by socket filter */ SKB_DROP_REASON_UDP_CSUM ,/* UDP checksum error */ +SKB_DROP_REASON_NETFILTER_DROP ,/* dropped by netfilter */ SKB_DROP_REASON_MAX, };
include/trace/events/skb.h +1 -0
@@ -16,6 +16,7 @@ EM(SKB_DROP_REASON_TCP_CSUM, TCP_CSUM) \ EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER) \ EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \ + EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP) \ EMe(SKB_DROP_REASON_MAX, MAX)#undef EM
net/netfilter/core.c +2 -1
@@ -592,7 +592,8 @@ int nf_hook_slow(struct sk_buff *skb, struct nf_hook_state *state,case NF_ACCEPT :break ;case NF_DROP : -kfree_skb (skb); +kfree_skb_reason (skb, +SKB_DROP_REASON_NETFILTER_DROP ); ret =NF_DROP_GETERR (verdict);if (ret ==0 ) ret = -EPERM ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 80/201 net: ipv4: use kfree_skb_reason() in ip_rcv_core()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit 33cba42985c8144eef78d618fc1e51aaa074b169 ]
Replace kfree_skb() with kfree_skb_reason() in ip_rcv_core(). Three new drop reasons are introduced:
SKB_DROP_REASON_OTHERHOSTSKB_DROP_REASON_IP_CSUMSKB_DROP_REASON_IP_INHDR
--- include/linux/skbuff.h | 9 +++++++++ include/trace/events/skb.h | 3 +++ net/ipv4/ip_input.c | 12 ++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-)
include/linux/skbuff.h +9 -0
@@ -318,6 +318,15 @@ enum skb_drop_reason {SKB_DROP_REASON_SOCKET_FILTER ,/* dropped by socket filter */ SKB_DROP_REASON_UDP_CSUM ,/* UDP checksum error */ SKB_DROP_REASON_NETFILTER_DROP ,/* dropped by netfilter */ +SKB_DROP_REASON_OTHERHOST ,/* packet don't belong to current +* host (interface is in promisc +* mode) +*/ +SKB_DROP_REASON_IP_CSUM ,/* IP checksum error */ +SKB_DROP_REASON_IP_INHDR ,/* there is something wrong with +* IP header (see +* IPSTATS_MIB_INHDRERRORS) +*/ SKB_DROP_REASON_MAX, };
include/trace/events/skb.h +3 -0
@@ -17,6 +17,9 @@ EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER) \ EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM) \ EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP) \ + EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST) \ + EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM) \ + EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR) \ EMe(SKB_DROP_REASON_MAX, MAX)#undef EM
net/ipv4/ip_input.c +10 -2
@@ -436,13 +436,16 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)static struct sk_buff *ip_rcv_core (struct sk_buff *skb,struct net *net) {const struct iphdr *iph; +int drop_reason;u32 len;/* When the interface is in promisc. mode, drop all the crap * that it receives, do not try to analyse it. */ -if (skb->pkt_type ==PACKET_OTHERHOST ) +if (skb->pkt_type ==PACKET_OTHERHOST ) { + drop_reason =SKB_DROP_REASON_OTHERHOST ; goto drop; + }__IP_UPD_PO_STATS (net,IPSTATS_MIB_IN , skb->len);
@@ -452,6 +455,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net) goto out; } + drop_reason =SKB_DROP_REASON_NOT_SPECIFIED ;if (!pskb_may_pull (skb,sizeof (struct iphdr ))) goto inhdr_error;
@@ -488,6 +492,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net) len =ntohs (iph->tot_len);if (skb->len < len) { + drop_reason =SKB_DROP_REASON_PKT_TOO_SMALL ;__IP_INC_STATS (net,IPSTATS_MIB_INTRUNCATEDPKTS ); goto drop; }else if (len < (iph->ihl*4 ))
@@ -516,11 +521,14 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)return skb; csum_error: + drop_reason =SKB_DROP_REASON_IP_CSUM ;__IP_INC_STATS (net,IPSTATS_MIB_CSUMERRORS ); inhdr_error: +if (drop_reason ==SKB_DROP_REASON_NOT_SPECIFIED ) + drop_reason =SKB_DROP_REASON_IP_INHDR ;__IP_INC_STATS (net,IPSTATS_MIB_INHDRERRORS ); drop: -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason); out:return NULL ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 81/201 net: ipv4: use kfree_skb_reason() in ip_rcv_finish_core()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit c1f166d1f7eef212096a98b22f5acf92f9af353d ]
Replace kfree_skb() with kfree_skb_reason() in ip_rcv_finish_core(), following drop reasons are introduced:
SKB_DROP_REASON_IP_RPFILTERSKB_DROP_REASON_UNICAST_IN_L2_MULTICAST
--- include/linux/skbuff.h | 9 +++++++++ include/trace/events/skb.h | 3 +++ net/ipv4/ip_input.c | 14 ++++++++++---- 3 files changed, 22 insertions(+), 4 deletions(-)
include/linux/skbuff.h +9 -0
@@ -327,6 +327,15 @@ enum skb_drop_reason {* IP header (see * IPSTATS_MIB_INHDRERRORS) */ +SKB_DROP_REASON_IP_RPFILTER ,/* IP rpfilter validate failed. +* see the document for rp_filter +* in ip-sysctl.rst for more +* information +*/ +SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST ,/* destination address of L2 +* is multicast, but L3 is +* unicast. +*/ SKB_DROP_REASON_MAX, };
include/trace/events/skb.h +3 -0
@@ -20,6 +20,9 @@ EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST) \ EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM) \ EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR) \ + EM(SKB_DROP_REASON_IP_RPFILTER, IP_RPFILTER) \ +EM (SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST , \ + UNICAST_IN_L2_MULTICAST) \ EMe(SKB_DROP_REASON_MAX, MAX)#undef EM
net/ipv4/ip_input.c +10 -4
@@ -318,8 +318,10 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk, {const struct iphdr *iph =ip_hdr (skb);int (*edemux)(struct sk_buff *skb); +int err, drop_reason;struct rtable *rt; -int err; + + drop_reason =SKB_DROP_REASON_NOT_SPECIFIED ;if (ip_can_use_hint (skb, iph, hint)) { err = ip_route_use_hint(skb, iph->daddr, iph->saddr, iph->tos,
@@ -396,19 +398,23 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk,* so-called "hole-196" attack) so do it for both. */ if (in_dev && -IN_DEV_ORCONF (in_dev,DROP_UNICAST_IN_L2_MULTICAST )) +IN_DEV_ORCONF (in_dev,DROP_UNICAST_IN_L2_MULTICAST )) { + drop_reason =SKB_DROP_REASON_UNICAST_IN_L2_MULTICAST ; goto drop; + } }return NET_RX_SUCCESS ; drop: -kfree_skb (skb); +kfree_skb_reason (skb, drop_reason);return NET_RX_DROP ; drop_error: -if (err == -EXDEV ) +if (err == -EXDEV ) { + drop_reason =SKB_DROP_REASON_IP_RPFILTER ;__NET_INC_STATS (net,LINUX_MIB_IPRPFILTER ); + } goto drop; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 82/201 i2c: mlxcpld: Fix register setting for 400KHz frequency
In reply to Greg Kroah-HartmanFrom: Vadim Pasternak <[email protected]>
[ Upstream commit e1f77ecc75aaee6bed04e8fd7830e00032af012e ]
Fix setting of 'Half Cycle' register for 400KHz frequency.
--- drivers/i2c/busses/i2c-mlxcpld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-mlxcpld.c +1 -1
@@ -49,7 +49,7 @@#define MLXCPLD_LPCI2C_NACK_IND 2#define MLXCPLD_I2C_FREQ_1000KHZ_SET 0x04 -#define MLXCPLD_I2C_FREQ_400KHZ_SET 0x0c +#define MLXCPLD_I2C_FREQ_400KHZ_SET 0x0e#define MLXCPLD_I2C_FREQ_100KHZ_SET 0x42enum mlxcpld_i2c_frequency {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 83/201 i2c: cadence: Change large transfer count reset logic to be unconditional
In reply to Greg Kroah-HartmanFrom: Robert Hancock <[email protected]>
[ Upstream commit 4ca8ca873d454635c20d508261bfc0081af75cf8 ]
Problems were observed on the Xilinx ZynqMP platform with large I2C reads. When a read of 277 bytes was performed, the controller NAKed the transfer after only 252 bytes were transferred and returned an ENXIO error on the transfer.
There is some code in cdns_i2c_master_isr to handle this case by resetting the transfer count in the controller before it reaches 0, to allow larger transfers to work, but it was conditional on the CDNS_I2C_BROKEN_HOLD_BIT quirk being set on the controller, and ZynqMP uses the r1p14 version of the core where this quirk is not being set. The requirement to do this to support larger reads seems like an inherently required workaround due to the core only having an 8-bit transfer size register, so it does not appear that this should be conditional on the broken HOLD bit quirk which is used elsewhere in the driver.
Remove the dependency on the CDNS_I2C_BROKEN_HOLD_BIT for this transfer size reset logic to fix this problem.
--- drivers/i2c/busses/i2c-cadence.c | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-)
drivers/i2c/busses/i2c-cadence.c +5 -25
@@ -388,9 +388,9 @@ static irqreturn_t cdns_i2c_slave_isr(void *ptr)*/ static irqreturn_t cdns_i2c_master_isr (void *ptr) { -unsigned int isr_status, avail_bytes, updatetx; +unsigned int isr_status, avail_bytes;unsigned int bytes_to_send; -bool hold_quirk; +bool updatetx;struct cdns_i2c *id = ptr;/* Signal completion only after everything is updated */ int done_flag =0 ;
@@ -410,11 +410,7 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)* Check if transfer size register needs to be updated again for a * large data receive operation. */ - updatetx =0 ; -if (id->recv_count > id->curr_recv_count) - updatetx =1 ; - - hold_quirk = (id->quirks &CDNS_I2C_BROKEN_HOLD_BIT ) && updatetx; + updatetx = id->recv_count > id->curr_recv_count;/* When receiving, handle data interrupt and completion interrupt */ if (id->p_recv_buf &&
@@ -445,7 +441,7 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)break ; } -if (cdns_is_holdquirk (id, hold_quirk)) +if (cdns_is_holdquirk (id, updatetx))break ; }
@@ -456,7 +452,7 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr)* maintain transfer size non-zero while performing a large * receive operation. */ -if (cdns_is_holdquirk (id, hold_quirk)) { +if (cdns_is_holdquirk (id, updatetx)) {/* wait while fifo is full */ while (cdns_i2c_readreg (CDNS_I2C_XFER_SIZE_OFFSET ) != (id->curr_recv_count -CDNS_I2C_FIFO_DEPTH ))
@@ -478,22 +474,6 @@ static irqreturn_t cdns_i2c_master_isr(void *ptr) CDNS_I2C_XFER_SIZE_OFFSET); id->curr_recv_count = id->recv_count; } - }else if (id->recv_count && !hold_quirk && - !id->curr_recv_count) { - -/* Set the slave address in address register*/ -cdns_i2c_writereg (id->p_msg->addr &CDNS_I2C_ADDR_MASK , -CDNS_I2C_ADDR_OFFSET ); - -if (id->recv_count >CDNS_I2C_TRANSFER_SIZE ) { -cdns_i2c_writereg (CDNS_I2C_TRANSFER_SIZE , -CDNS_I2C_XFER_SIZE_OFFSET ); - id->curr_recv_count =CDNS_I2C_TRANSFER_SIZE ; - }else { -cdns_i2c_writereg (id->recv_count, -CDNS_I2C_XFER_SIZE_OFFSET ); - id->curr_recv_count = id->recv_count; - } }/* Clear hold (if not repeated start) and signal completion */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 84/201 perf tests: Fix Convert perf time to TSC test for hybrid
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit deb44a6249f696106645c63c0603eab08a6122af ]
The test does not always correctly determine the number of events for hybrids, nor allow for more than 1 evsel when parsing.
Fix by iterating the events actually created and getting the correct evsel for the events processed.
--- tools/perf/tests/perf-time-to-tsc.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-)
tools/perf/tests/perf-time-to-tsc.c +4 -14
@@ -20,8 +20,6 @@#include "tsc.h" #include "mmap.h" #include "tests.h" -#include "pmu.h" -#include "pmu-hybrid.h" #define CHECK__ (x) { \ while ((x) < 0) { \
@@ -84,18 +82,8 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybeevlist__config (evlist, &opts,NULL ); - evsel =evlist__first (evlist); - - evsel->core.attr.comm =1 ; - evsel->core.attr.disabled =1 ; - evsel->core.attr.enable_on_exec =0 ; - -/* -* For hybrid "cycles:u", it creates two events. -* Init the second evsel here. -*/ -if (perf_pmu__has_hybrid () &&perf_pmu__hybrid_mounted ("cpu_atom" )) { - evsel =evsel__next (evsel); +/* For hybrid "cycles:u", it creates two events */ +evlist__for_each_entry (evlist, evsel) { evsel->core.attr.comm =1 ; evsel->core.attr.disabled =1 ; evsel->core.attr.enable_on_exec =0 ;
@@ -141,10 +129,12 @@ int test__perf_time_to_tsc(struct test *test __maybe_unused, int subtest __maybe goto next_event;if (strcmp (event->comm.comm, comm1) ==0 ) { +CHECK_NOT_NULL__ (evsel =evlist__event2evsel (evlist, event));CHECK__ (evsel__parse_sample (evsel, event, &sample)); comm1_time = sample.time; }if (strcmp (event->comm.comm, comm2) ==0 ) { +CHECK_NOT_NULL__ (evsel =evlist__event2evsel (evlist, event));CHECK__ (evsel__parse_sample (evsel, event, &sample)); comm2_time = sample.time; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 85/201 net: stmmac: fix dma queue left shift overflow issue
In reply to Greg Kroah-HartmanFrom: Junxiao Chang <[email protected]>
[ Upstream commit 613b065ca32e90209024ec4a6bb5ca887ee70980 ]
When queue number is > 4, left shift overflows due to 32 bits integer variable. Mask calculation is wrong for MTL_RXQ_DMA_MAP1.
If CONFIG_UBSAN is enabled, kernel dumps below warning:
[ 10.363842] ================================================================== [ 10.363882] UBSAN: shift-out-of-bounds in /build/linux-intel-iotg-5.15-8e6Tf4/ linux-intel-iotg-5.15-5.15.0/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c:224:12 [ 10.363929] shift exponent 40 is too large for 32-bit type 'unsigned int' [ 10.363953] CPU: 1 PID: 599 Comm: NetworkManager Not tainted 5.15.0-1003-intel-iotg [ 10.363956] Hardware name: ADLINK Technology Inc. LEC-EL/LEC-EL, BIOS 0.15.11 12/22/2021 [ 10.363958] Call Trace: [ 10.363960] <TASK> [ 10.363963] dump_stack_lvl+0x4a/0x5f [ 10.363971] dump_stack+0x10/0x12 [ 10.363974] ubsan_epilogue+0x9/0x45 [ 10.363976] __ubsan_handle_shift_out_of_bounds.cold+0x61/0x10e [ 10.363979] ? wake_up_klogd+0x4a/0x50 [ 10.363983] ? vprintk_emit+0x8f/0x240 [ 10.363986] dwmac4_map_mtl_dma.cold+0x42/0x91 [stmmac] [ 10.364001] stmmac_mtl_configuration+0x1ce/0x7a0 [stmmac] [ 10.364009] ? dwmac410_dma_init_channel+0x70/0x70 [stmmac] [ 10.364020] stmmac_hw_setup.cold+0xf/0xb14 [stmmac] [ 10.364030] ? page_pool_alloc_pages+0x4d/0x70 [ 10.364034] ? stmmac_clear_tx_descriptors+0x6e/0xe0 [stmmac] [ 10.364042] stmmac_open+0x39e/0x920 [stmmac] [ 10.364050] __dev_open+0xf0/0x1a0 [ 10.364054] __dev_change_flags+0x188/0x1f0 [ 10.364057] dev_change_flags+0x26/0x60 [ 10.364059] do_setlink+0x908/0xc40 [ 10.364062] ? do_setlink+0xb10/0xc40 [ 10.364064] ? __nla_validate_parse+0x4c/0x1a0 [ 10.364068] __rtnl_newlink+0x597/0xa10 [ 10.364072] ? __nla_reserve+0x41/0x50 [ 10.364074] ? __kmalloc_node_track_caller+0x1d0/0x4d0 [ 10.364079] ? pskb_expand_head+0x75/0x310 [ 10.364082] ? nla_reserve_64bit+0x21/0x40 [ 10.364086] ? skb_free_head+0x65/0x80 [ 10.364089] ? security_sock_rcv_skb+0x2c/0x50 [ 10.364094] ? __cond_resched+0x19/0x30 [ 10.364097] ? kmem_cache_alloc_trace+0x15a/0x420 [ 10.364100] rtnl_newlink+0x49/0x70
This change fixes MTL_RXQ_DMA_MAP1 mask issue and channel/queue mapping warning.
--- drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +3 -0
@@ -219,6 +219,9 @@ static void dwmac4_map_mtl_dma(struct mac_device_info *hw, u32 queue, u32 chan)if (queue ==0 || queue ==4 ) { value &= ~MTL_RXQ_DMA_Q04MDMACH_MASK ; value |=MTL_RXQ_DMA_Q04MDMACH (chan); + }else if (queue >4 ) { + value &= ~MTL_RXQ_DMA_QXMDMACH_MASK (queue -4 ); + value |=MTL_RXQ_DMA_QXMDMACH (chan, queue -4 ); }else { value &= ~MTL_RXQ_DMA_QXMDMACH_MASK (queue); value |=MTL_RXQ_DMA_QXMDMACH (chan, queue);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 86/201 net/tls: Fix race in TLS device down flow
In reply to Greg Kroah-HartmanFrom: Tariq Toukan <[email protected]>
[ Upstream commit f08d8c1bb97c48f24a82afaa2fd8c140f8d3da8b ]
Socket destruction flow and tls_device_down function sync against each other using tls_device_lock and the context refcount, to guarantee the device resources are freed via tls_dev_del() by the end of tls_device_down.
In the following unfortunate flow, this won't happen:
- refcount is decreased to zero in tls_device_sk_destruct.
- tls_device_down starts, skips the context as refcount is zero, going all the way until it flushes the gc work, and returns without freeing the device resources.
- only then, tls_device_queue_ctx_destruction is called, queues the gc work and frees the context's device resources.
Solve it by decreasing the refcount in the socket's destruction flow under the tls_device_lock, for perfect synchronization. This does not slow down the common likely destructor flow, in which both the refcount is decreased and the spinlock is acquired, anyway.
--- net/tls/tls_device.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/tls/tls_device.c +5 -3
@@ -97,13 +97,16 @@ static void tls_device_queue_ctx_destruction(struct tls_context *ctx)unsigned long flags;spin_lock_irqsave (&tls_device_lock, flags); +if (unlikely (!refcount_dec_and_test (&ctx->refcount))) + goto unlock; +list_move_tail (&ctx->list, &tls_device_gc_list);/* schedule_work inside the spinlock * to make sure tls_device_down waits for that work. */ schedule_work (&tls_device_gc_work); - +unlock:spin_unlock_irqrestore (&tls_device_lock, flags); }
@@ -194,8 +197,7 @@ void tls_device_sk_destruct(struct sock *sk)clean_acked_data_disable (inet_csk (sk)); } -if (refcount_dec_and_test (&tls_ctx->refcount)) -tls_device_queue_ctx_destruction (tls_ctx); +tls_device_queue_ctx_destruction (tls_ctx); }EXPORT_SYMBOL_GPL (tls_device_sk_destruct);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 87/201 igmp: Fix data-races around sysctl_igmp_llm_reports.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit f6da2267e71106474fbc0943dc24928b9cb79119 ]
While reading sysctl_igmp_llm_reports, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
This test can be packed into a helper, so such changes will be in the follow-up series after net is merged into net-next.
if (ipv4_is_local_multicast(pmc->multiaddr) &&
!READ_ONCE(net->ipv4.sysctl_igmp_llm_reports))
--- net/ipv4/igmp.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-)
net/ipv4/igmp.c +13 -8
@@ -467,7 +467,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,if (pmc->multiaddr ==IGMP_ALL_HOSTS )return skb; -if (ipv4_is_local_multicast (pmc->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (pmc->multiaddr) && + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))return skb; mtu =READ_ONCE (dev->mtu);
@@ -593,7 +594,7 @@ static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)if (pmc->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (pmc->multiaddr) && - !net->ipv4.sysctl_igmp_llm_reports) + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))continue ;spin_lock_bh (&pmc->lock);if (pmc->sfcount[MCAST_EXCLUDE ])
@@ -736,7 +737,8 @@ static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,if (type ==IGMPV3_HOST_MEMBERSHIP_REPORT )return igmpv3_send_report (in_dev, pmc); -if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))return 0 ;if (type ==IGMP_HOST_LEAVE_MESSAGE )
@@ -920,7 +922,8 @@ static bool igmp_heard_report(struct in_device *in_dev, __be32 group)if (group ==IGMP_ALL_HOSTS )return false; -if (ipv4_is_local_multicast (group) && !net->ipv4.sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (group) && + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))return false;rcu_read_lock ();
@@ -1045,7 +1048,7 @@ static bool igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !net->ipv4.sysctl_igmp_llm_reports) + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))continue ;spin_lock_bh (&im->lock);if (im->tm_running)
@@ -1296,7 +1299,8 @@ static void __igmp_group_dropped(struct ip_mc_list *im, gfp_t gfp)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))return ; reporter = im->reporter;
@@ -1338,7 +1342,8 @@ static void igmp_group_added(struct ip_mc_list *im)#ifdef CONFIG_IP_MULTICAST if (im->multiaddr ==IGMP_ALL_HOSTS )return ; -if (ipv4_is_local_multicast (im->multiaddr) && !net->ipv4.sysctl_igmp_llm_reports) +if (ipv4_is_local_multicast (im->multiaddr) && + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))return ;if (in_dev->dead)
@@ -1642,7 +1647,7 @@ static void ip_mc_rejoin_groups(struct in_device *in_dev)if (im->multiaddr ==IGMP_ALL_HOSTS )continue ;if (ipv4_is_local_multicast (im->multiaddr) && - !net->ipv4.sysctl_igmp_llm_reports) + !READ_ONCE (net->ipv4.sysctl_igmp_llm_reports))continue ;/* a failover is happening and switches
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 88/201 igmp: Fix a data-race around sysctl_igmp_max_memberships.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 6305d821e3b9b5379d348528e5b5faf316383bc2 ]
While reading sysctl_igmp_max_memberships, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/igmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/igmp.c +1 -1
@@ -2197,7 +2197,7 @@ static int __ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr, count++; } err = -ENOBUFS ; -if (count >= net->ipv4.sysctl_igmp_max_memberships) +if (count >=READ_ONCE (net->ipv4.sysctl_igmp_max_memberships)) goto done; iml =sock_kmalloc (sk,sizeof (*iml),GFP_KERNEL );if (!iml)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 89/201 igmp: Fix data-races around sysctl_igmp_max_msf.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 6ae0f2e553737b8cce49a1372573c81130ffa80e ]
While reading sysctl_igmp_max_msf, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/igmp.c | 2 +- net/ipv4/ip_sockglue.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
net/ipv4/igmp.c +1 -1
@@ -2384,7 +2384,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct }/* else, add a new source to the filter */ -if (psl && psl->sl_count >= net->ipv4.sysctl_igmp_max_msf) { +if (psl && psl->sl_count >=READ_ONCE (net->ipv4.sysctl_igmp_max_msf)) { err = -ENOBUFS ; goto done; }
net/ipv4/ip_sockglue.c +3 -3
@@ -782,7 +782,7 @@ static int ip_set_mcast_msfilter(struct sock *sk, sockptr_t optval, int optlen)/* numsrc >= (4G-140)/128 overflow in 32 bits */ err = -ENOBUFS ;if (gsf->gf_numsrc >=0x1ffffff || - gsf->gf_numsrc >sock_net (sk)->ipv4.sysctl_igmp_max_msf) + gsf->gf_numsrc >READ_ONCE (sock_net (sk)->ipv4.sysctl_igmp_max_msf)) goto out_free_gsf; err = -EINVAL ;
@@ -832,7 +832,7 @@ static int compat_ip_set_mcast_msfilter(struct sock *sk, sockptr_t optval,/* numsrc >= (4G-140)/128 overflow in 32 bits */ err = -ENOBUFS ; -if (n >sock_net (sk)->ipv4.sysctl_igmp_max_msf) +if (n >READ_ONCE (sock_net (sk)->ipv4.sysctl_igmp_max_msf)) goto out_free_gsf; err =set_mcast_msfilter (sk, gf32->gf_interface, n, gf32->gf_fmode, &gf32->gf_group, gf32->gf_slist_flex);
@@ -1242,7 +1242,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, int optname, }/* numsrc >= (1G-4) overflow in 32 bits */ if (msf->imsf_numsrc >=0x3ffffffcU || - msf->imsf_numsrc > net->ipv4.sysctl_igmp_max_msf) { + msf->imsf_numsrc >READ_ONCE (net->ipv4.sysctl_igmp_max_msf)) {kfree (msf); err = -ENOBUFS ;break ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 90/201 tcp: Fix data-races around keepalive sysctl knobs.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit f2f316e287e6c2e3a1c5bab8d9b77ee03daa0463 ]
While reading sysctl_tcp_keepalive_(time|probes|intvl), they can be changed concurrently. Thus, we need to add READ_ONCE() to their readers.
--- include/net/tcp.h | 9 ++++++--- net/smc/smc_llc.c | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-)
include/net/tcp.h +6 -3
@@ -1469,21 +1469,24 @@ static inline int keepalive_intvl_when(const struct tcp_sock *tp) {struct net *net =sock_net ((struct sock *)tp); -return tp->keepalive_intvl ? : net->ipv4.sysctl_tcp_keepalive_intvl; +return tp->keepalive_intvl ? : +READ_ONCE (net->ipv4.sysctl_tcp_keepalive_intvl); }static inline int keepalive_time_when (const struct tcp_sock *tp) {struct net *net =sock_net ((struct sock *)tp); -return tp->keepalive_time ? : net->ipv4.sysctl_tcp_keepalive_time; +return tp->keepalive_time ? : +READ_ONCE (net->ipv4.sysctl_tcp_keepalive_time); }static inline int keepalive_probes (const struct tcp_sock *tp) {struct net *net =sock_net ((struct sock *)tp); -return tp->keepalive_probes ? : net->ipv4.sysctl_tcp_keepalive_probes; +return tp->keepalive_probes ? : +READ_ONCE (net->ipv4.sysctl_tcp_keepalive_probes); }static inline u32 keepalive_time_elapsed (const struct tcp_sock *tp)
net/smc/smc_llc.c +1 -1
@@ -1787,7 +1787,7 @@ void smc_llc_lgr_init(struct smc_link_group *lgr, struct smc_sock *smc)init_waitqueue_head (&lgr->llc_flow_waiter);init_waitqueue_head (&lgr->llc_msg_waiter);mutex_init (&lgr->llc_conf_mutex); - lgr->llc_testlink_time = net->ipv4.sysctl_tcp_keepalive_time; + lgr->llc_testlink_time =READ_ONCE (net->ipv4.sysctl_tcp_keepalive_time); }/* called after lgr was removed from lgr_list */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 91/201 tcp: Fix data-races around sysctl_tcp_syn(ack)?_retries.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 20a3b1c0f603e8c55c3396abd12dfcfb523e4d3c ]
While reading sysctl_tcp_syn(ack)?_retries, they can be changed concurrently. Thus, we need to add READ_ONCE() to their readers.
--- net/ipv4/inet_connection_sock.c | 3 ++- net/ipv4/tcp.c | 3 ++- net/ipv4/tcp_timer.c | 10 +++++++--- 3 files changed, 11 insertions(+), 5 deletions(-)
net/ipv4/inet_connection_sock.c +2 -1
@@ -829,7 +829,8 @@ static void reqsk_timer_handler(struct timer_list *t) icsk =inet_csk (sk_listener); net =sock_net (sk_listener); - max_syn_ack_retries = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_synack_retries; + max_syn_ack_retries = icsk->icsk_syn_retries ? : +READ_ONCE (net->ipv4.sysctl_tcp_synack_retries);/* Normally all the openreqs are young and become mature * (i.e. converted to established socket) for first timeout. * If synack was not acknowledged for 1 second, it means
net/ipv4/tcp.c +2 -1
@@ -3974,7 +3974,8 @@ static int do_tcp_getsockopt(struct sock *sk, int level, val =keepalive_probes (tp);break ;case TCP_SYNCNT : - val = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; + val = icsk->icsk_syn_retries ? : +READ_ONCE (net->ipv4.sysctl_tcp_syn_retries);break ;case TCP_LINGER2 : val = tp->linger2;
net/ipv4/tcp_timer.c +7 -3
@@ -239,7 +239,8 @@ static int tcp_write_timeout(struct sock *sk)if ((1 << sk->sk_state) & (TCPF_SYN_SENT |TCPF_SYN_RECV )) {if (icsk->icsk_retransmits)__dst_negative_advice (sk); - retry_until = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; + retry_until = icsk->icsk_syn_retries ? : +READ_ONCE (net->ipv4.sysctl_tcp_syn_retries); expired = icsk->icsk_retransmits >= retry_until; }else {if (retransmits_timed_out (sk, net->ipv4.sysctl_tcp_retries1,0 )) {
@@ -406,12 +407,15 @@ abort: tcp_write_err(sk);static void tcp_fastopen_synack_timer (struct sock *sk,struct request_sock *req) {struct inet_connection_sock *icsk =inet_csk (sk); -int max_retries = icsk->icsk_syn_retries ? : -sock_net (sk)->ipv4.sysctl_tcp_synack_retries +1 ;/* add one more retry for fastopen */ struct tcp_sock *tp =tcp_sk (sk); +int max_retries; req->rsk_ops->syn_ack_timeout (req); +/* add one more retry for fastopen */ + max_retries = icsk->icsk_syn_retries ? : +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_synack_retries) +1 ; +if (req->num_timeout >= max_retries) {tcp_write_err (sk);return ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 92/201 tcp: Fix data-races around sysctl_tcp_syncookies.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit f2e383b5bb6bbc60a0b94b87b3e49a2b1aefd11e ]
While reading sysctl_tcp_syncookies, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/core/filter.c | 4 ++-- net/ipv4/syncookies.c | 3 ++- net/ipv4/tcp_input.c | 20 ++++++++++++-------- net/ipv6/syncookies.c | 3 ++- 4 files changed, 18 insertions(+), 12 deletions(-)
net/core/filter.c +2 -2
@@ -6734,7 +6734,7 @@ BPF_CALL_5(bpf_tcp_check_syncookie, struct sock *, sk, void *, iph, u32, iph_lenif (sk->sk_protocol !=IPPROTO_TCP || sk->sk_state !=TCP_LISTEN )return -EINVAL ; -if (!sock_net (sk)->ipv4.sysctl_tcp_syncookies) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_syncookies))return -EINVAL ;if (!th->ack || th->rst || th->syn)
@@ -6809,7 +6809,7 @@ BPF_CALL_5(bpf_tcp_gen_syncookie, struct sock *, sk, void *, iph, u32, iph_len,if (sk->sk_protocol !=IPPROTO_TCP || sk->sk_state !=TCP_LISTEN )return -EINVAL ; -if (!sock_net (sk)->ipv4.sysctl_tcp_syncookies) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_syncookies))return -ENOENT ;if (!th->syn || th->ack || th->fin || th->rst)
net/ipv4/syncookies.c +2 -1
@@ -342,7 +342,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb)struct flowi4 fl4;u32 tsoff =0 ; -if (!sock_net (sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_syncookies) || + !th->ack || th->rst) goto out;if (tcp_synq_no_recent_overflow (sk))
net/ipv4/tcp_input.c +12 -8
@@ -6735,11 +6735,14 @@ static bool tcp_syn_flood_action(const struct sock *sk, const char *proto) {struct request_sock_queue *queue = &inet_csk (sk)->icsk_accept_queue;const char *msg ="Dropping request" ; -bool want_cookie = false;struct net *net =sock_net (sk); +bool want_cookie = false; +u8 syncookies; + + syncookies =READ_ONCE (net->ipv4.sysctl_tcp_syncookies);#ifdef CONFIG_SYN_COOKIES -if (net->ipv4.sysctl_tcp_syncookies) { +if (syncookies) { msg ="Sending cookies" ; want_cookie = true;__NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPREQQFULLDOCOOKIES );
@@ -6747,8 +6750,7 @@ static bool tcp_syn_flood_action(const struct sock *sk, const char *proto)#endif __NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPREQQFULLDROP ); -if (!queue->synflood_warned && - net->ipv4.sysctl_tcp_syncookies !=2 && +if (!queue->synflood_warned && syncookies !=2 &&xchg (&queue->synflood_warned,1 ) ==0 )net_info_ratelimited ("%s: Possible SYN flooding on port %d. %s. Check SNMP counters.\n" , proto, sk->sk_num, msg);
@@ -6797,7 +6799,7 @@ u16 tcp_get_syncookie_mss(struct request_sock_ops *rsk_ops,struct tcp_sock *tp =tcp_sk (sk);u16 mss; -if (sock_net (sk)->ipv4.sysctl_tcp_syncookies !=2 && +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_syncookies) !=2 && !inet_csk_reqsk_queue_is_full (sk))return 0 ;
@@ -6831,13 +6833,15 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,bool want_cookie = false;struct dst_entry *dst;struct flowi fl; +u8 syncookies; + + syncookies =READ_ONCE (net->ipv4.sysctl_tcp_syncookies);/* TW buckets are converted to open requests without * limitations, they conserve resources and peer is * evidently real one. */ -if ((net->ipv4.sysctl_tcp_syncookies ==2 || -inet_csk_reqsk_queue_is_full (sk)) && !isn) { +if ((syncookies ==2 ||inet_csk_reqsk_queue_is_full (sk)) && !isn) { want_cookie =tcp_syn_flood_action (sk, rsk_ops->slab_name);if (!want_cookie) goto drop;
@@ -6887,7 +6891,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,if (!want_cookie && !isn) {/* Kill the following clause, if you dislike this way. */ -if (!net->ipv4.sysctl_tcp_syncookies && +if (!syncookies && (net->ipv4.sysctl_max_syn_backlog -inet_csk_reqsk_queue_len (sk) < (net->ipv4.sysctl_max_syn_backlog >>2 )) && !tcp_peer_is_proven (req, dst)) {
net/ipv6/syncookies.c +2 -1
@@ -141,7 +141,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)__u8 rcv_wscale;u32 tsoff =0 ; -if (!sock_net (sk)->ipv4.sysctl_tcp_syncookies || !th->ack || th->rst) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_syncookies) || + !th->ack || th->rst) goto out;if (tcp_synq_no_recent_overflow (sk))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 93/201 tcp: Fix data-races around sysctl_tcp_migrate_req.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 4177f545895b1da08447a80692f30617154efa6e ]
While reading sysctl_tcp_migrate_req, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/core/sock_reuseport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/sock_reuseport.c +2 -2
@@ -387,7 +387,7 @@ void reuseport_stop_listen_sock(struct sock *sk) prog =rcu_dereference_protected (reuse->prog,lockdep_is_held (&reuseport_lock)); -if (sock_net (sk)->ipv4.sysctl_tcp_migrate_req || +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_migrate_req) || (prog && prog->expected_attach_type ==BPF_SK_REUSEPORT_SELECT_OR_MIGRATE )) {/* Migration capable, move sk from the listening section * to the closed section.
@@ -545,7 +545,7 @@ struct sock *reuseport_migrate_sock(struct sock *sk, hash = migrating_sk->sk_hash; prog =rcu_dereference (reuse->prog);if (!prog || prog->expected_attach_type !=BPF_SK_REUSEPORT_SELECT_OR_MIGRATE ) { -if (sock_net (sk)->ipv4.sysctl_tcp_migrate_req) +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_migrate_req)) goto select_by_hash; goto failure; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 94/201 tcp: Fix data-races around sysctl_tcp_reordering.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 46778cd16e6a5ad1b2e3a91f6c057c907379418e ]
While reading sysctl_tcp_reordering, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_input.c | 10 +++++++--- net/ipv4/tcp_metrics.c | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-)
net/ipv4/tcp.c +1 -1
@@ -447,7 +447,7 @@ void tcp_init_sock(struct sock *sk) tp->snd_cwnd_clamp = ~0 ; tp->mss_cache =TCP_MSS_DEFAULT ; - tp->reordering =sock_net (sk)->ipv4.sysctl_tcp_reordering; + tp->reordering =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reordering);tcp_assign_congestion_control (sk); tp->tsoffset =0 ;
net/ipv4/tcp_input.c +7 -3
@@ -2131,6 +2131,7 @@ void tcp_enter_loss(struct sock *sk)struct tcp_sock *tp =tcp_sk (sk);struct net *net =sock_net (sk);bool new_recovery = icsk->icsk_ca_state < TCP_CA_Recovery; +u8 reordering;tcp_timeout_mark_lost (sk);
@@ -2151,10 +2152,12 @@ void tcp_enter_loss(struct sock *sk)/* Timeout in disordered state after receiving substantial DUPACKs * suggests that the degree of reordering is over-estimated. */ + reordering =READ_ONCE (net->ipv4.sysctl_tcp_reordering);if (icsk->icsk_ca_state <= TCP_CA_Disorder && - tp->sacked_out >= net->ipv4.sysctl_tcp_reordering) + tp->sacked_out >= reordering) tp->reordering = min_t(unsigned int, tp->reordering, - net->ipv4.sysctl_tcp_reordering); + reordering); +tcp_set_ca_state (sk, TCP_CA_Loss); tp->high_seq = tp->snd_nxt;tcp_ecn_queue_cwr (tp);
@@ -3457,7 +3460,8 @@ static inline bool tcp_may_raise_cwnd(const struct sock *sk, const int flag)* new SACK or ECE mark may first advance cwnd here and later reduce * cwnd in tcp_fastretrans_alert() based on more states. */ -if (tcp_sk (sk)->reordering >sock_net (sk)->ipv4.sysctl_tcp_reordering) +if (tcp_sk (sk)->reordering > +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_reordering))return flag &FLAG_FORWARD_PROGRESS ;return flag &FLAG_DATA_ACKED ;
net/ipv4/tcp_metrics.c +2 -1
@@ -428,7 +428,8 @@ void tcp_update_metrics(struct sock *sk)if (!tcp_metric_locked (tm,TCP_METRIC_REORDERING )) { val =tcp_metric_get (tm,TCP_METRIC_REORDERING );if (val < tp->reordering && - tp->reordering != net->ipv4.sysctl_tcp_reordering) + tp->reordering != +READ_ONCE (net->ipv4.sysctl_tcp_reordering))tcp_metric_set (tm,TCP_METRIC_REORDERING , tp->reordering); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 95/201 tcp: Fix data-races around some timeout sysctl knobs.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 39e24435a776e9de5c6dd188836cf2523547804b ]
While reading these sysctl knobs, they can be changed concurrently. Thus, we need to add READ_ONCE() to their readers.
- tcp_retries1
- tcp_retries2
- tcp_orphan_retries
- tcp_fin_timeout
--- include/net/tcp.h | 3 ++- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_output.c | 2 +- net/ipv4/tcp_timer.c | 10 +++++----- 4 files changed, 9 insertions(+), 8 deletions(-)
include/net/tcp.h +2 -1
@@ -1499,7 +1499,8 @@ static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp)static inline int tcp_fin_time (const struct sock *sk) { -int fin_timeout =tcp_sk (sk)->linger2 ? :sock_net (sk)->ipv4.sysctl_tcp_fin_timeout; +int fin_timeout =tcp_sk (sk)->linger2 ? : +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fin_timeout);const int rto =inet_csk (sk)->icsk_rto;if (fin_timeout < (rto <<2 ) - (rto >>1 ))
net/ipv4/tcp.c +1 -1
@@ -3980,7 +3980,7 @@ static int do_tcp_getsockopt(struct sock *sk, int level,case TCP_LINGER2 : val = tp->linger2;if (val >=0 ) - val = (val ? : net->ipv4.sysctl_tcp_fin_timeout) /HZ ; + val = (val ? :READ_ONCE (net->ipv4.sysctl_tcp_fin_timeout)) /HZ ;break ;case TCP_DEFER_ACCEPT : val = retrans_to_secs(icsk->icsk_accept_queue.rskq_defer_accept,
net/ipv4/tcp_output.c +1 -1
@@ -4093,7 +4093,7 @@ void tcp_send_probe0(struct sock *sk) icsk->icsk_probes_out++;if (err <=0 ) { -if (icsk->icsk_backoff < net->ipv4.sysctl_tcp_retries2) +if (icsk->icsk_backoff <READ_ONCE (net->ipv4.sysctl_tcp_retries2)) icsk->icsk_backoff++; timeout =tcp_probe0_when (sk,TCP_RTO_MAX ); }else {
net/ipv4/tcp_timer.c +5 -5
@@ -143,7 +143,7 @@ static int tcp_out_of_resources(struct sock *sk, bool do_reset)*/ static int tcp_orphan_retries (struct sock *sk,bool alive) { -int retries =sock_net (sk)->ipv4.sysctl_tcp_orphan_retries;/* May be zero. */ +int retries =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_orphan_retries);/* May be zero. */ /* We know from an ICMP that something is wrong. */ if (sk->sk_err_soft && !alive)
@@ -243,14 +243,14 @@ static int tcp_write_timeout(struct sock *sk)READ_ONCE (net->ipv4.sysctl_tcp_syn_retries); expired = icsk->icsk_retransmits >= retry_until; }else { -if (retransmits_timed_out (sk, net->ipv4.sysctl_tcp_retries1,0 )) { +if (retransmits_timed_out (sk,READ_ONCE (net->ipv4.sysctl_tcp_retries1),0 )) {/* Black hole detection */ tcp_mtu_probing (icsk, sk);__dst_negative_advice (sk); } - retry_until = net->ipv4.sysctl_tcp_retries2; + retry_until =READ_ONCE (net->ipv4.sysctl_tcp_retries2);if (sock_flag (sk,SOCK_DEAD )) {const bool alive = icsk->icsk_rto <TCP_RTO_MAX ;
@@ -381,7 +381,7 @@ static void tcp_probe_timer(struct sock *sk) msecs_to_jiffies(icsk->icsk_user_timeout)) goto abort; - max_probes =sock_net (sk)->ipv4.sysctl_tcp_retries2; + max_probes =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_retries2);if (sock_flag (sk,SOCK_DEAD )) {const bool alive =inet_csk_rto_backoff (icsk,TCP_RTO_MAX ) <TCP_RTO_MAX ;
@@ -589,7 +589,7 @@ void tcp_retransmit_timer(struct sock *sk) }inet_csk_reset_xmit_timer (sk,ICSK_TIME_RETRANS ,tcp_clamp_rto_to_user_timeout (sk),TCP_RTO_MAX ); -if (retransmits_timed_out (sk, net->ipv4.sysctl_tcp_retries1 +1 ,0 )) +if (retransmits_timed_out (sk,READ_ONCE (net->ipv4.sysctl_tcp_retries1) +1 ,0 ))__sk_dst_reset (sk); out:;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 96/201 tcp: Fix a data-race around sysctl_tcp_notsent_lowat.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 55be873695ed8912eb77ff46d1d1cadf028bd0f3 ]
While reading sysctl_tcp_notsent_lowat, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- include/net/tcp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/tcp.h +1 -1
@@ -1994,7 +1994,7 @@ void __tcp_v4_send_check(struct sk_buff *skb, __be32 saddr, __be32 daddr);static inline u32 tcp_notsent_lowat (const struct tcp_sock *tp) {struct net *net =sock_net ((struct sock *)tp); -return tp->notsent_lowat ?: net->ipv4.sysctl_tcp_notsent_lowat; +return tp->notsent_lowat ?:READ_ONCE (net->ipv4.sysctl_tcp_notsent_lowat); }bool tcp_stream_memory_free (const struct sock *sk,int wake);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 97/201 tcp: Fix a data-race around sysctl_tcp_tw_reuse.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit cbfc6495586a3f09f6f07d9fb3c7cafe807e3c55 ]
While reading sysctl_tcp_tw_reuse, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_ipv4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_ipv4.c +1 -1
@@ -108,10 +108,10 @@ static u32 tcp_v4_init_ts_off(const struct net *net, const struct sk_buff *skb)int tcp_twsk_unique (struct sock *sk,struct sock *sktw,void *twp) { +int reuse =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_tw_reuse);const struct inet_timewait_sock *tw =inet_twsk (sktw);const struct tcp_timewait_sock *tcptw =tcp_twsk (sktw);struct tcp_sock *tp =tcp_sk (sk); -int reuse =sock_net (sk)->ipv4.sysctl_tcp_tw_reuse;if (reuse ==2 ) {/* Still does not detect *everything* that goes through
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 98/201 tcp: Fix data-races around sysctl_max_syn_backlog.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 79539f34743d3e14cc1fa6577d326a82cc64d62f ]
While reading sysctl_max_syn_backlog, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_input.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/ipv4/tcp_input.c +4 -2
@@ -6894,10 +6894,12 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,tcp_rsk (req)->ts_off = af_ops->init_ts_off (net, skb);if (!want_cookie && !isn) { +int max_syn_backlog =READ_ONCE (net->ipv4.sysctl_max_syn_backlog); +/* Kill the following clause, if you dislike this way. */ if (!syncookies && - (net->ipv4.sysctl_max_syn_backlog -inet_csk_reqsk_queue_len (sk) < - (net->ipv4.sysctl_max_syn_backlog >>2 )) && + (max_syn_backlog -inet_csk_reqsk_queue_len (sk) < + (max_syn_backlog >>2 )) && !tcp_peer_is_proven (req, dst)) {/* Without syncookies last quarter of * backlog is filled with destinations,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 99/201 tcp: Fix data-races around sysctl_tcp_fastopen.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 5a54213318c43f4009ae158347aa6016e3b9b55a ]
While reading sysctl_tcp_fastopen, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/af_inet.c | 2 +- net/ipv4/tcp.c | 6 ++++-- net/ipv4/tcp_fastopen.c | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-)
net/ipv4/af_inet.c +1 -1
@@ -220,7 +220,7 @@ int inet_listen(struct socket *sock, int backlog)* because the socket was in TCP_LISTEN state previously but * was shutdown() rather than close(). */ - tcp_fastopen =sock_net (sk)->ipv4.sysctl_tcp_fastopen; + tcp_fastopen =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fastopen);if ((tcp_fastopen &TFO_SERVER_WO_SOCKOPT1 ) && (tcp_fastopen &TFO_SERVER_ENABLE ) && !inet_csk (sk)->icsk_accept_queue.fastopenq.max_qlen) {
net/ipv4/tcp.c +4 -2
@@ -1159,7 +1159,8 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg,struct sockaddr *uaddr = msg->msg_name;int err, flags; -if (!(sock_net (sk)->ipv4.sysctl_tcp_fastopen &TFO_CLIENT_ENABLE ) || +if (!(READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fastopen) & +TFO_CLIENT_ENABLE ) || (uaddr && msg->msg_namelen >=sizeof (uaddr->sa_family) && uaddr->sa_family ==AF_UNSPEC ))return -EOPNOTSUPP ;
@@ -3626,7 +3627,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level, int optname,case TCP_FASTOPEN_CONNECT :if (val >1 || val <0 ) { err = -EINVAL ; - }else if (net->ipv4.sysctl_tcp_fastopen &TFO_CLIENT_ENABLE ) { + }else if (READ_ONCE (net->ipv4.sysctl_tcp_fastopen) & +TFO_CLIENT_ENABLE ) {if (sk->sk_state ==TCP_CLOSE ) tp->fastopen_connect = val;else
net/ipv4/tcp_fastopen.c +2 -2
@@ -338,7 +338,7 @@ static bool tcp_fastopen_no_cookie(const struct sock *sk, const struct dst_entry *dst, int flag) { - return (sock_net(sk)->ipv4.sysctl_tcp_fastopen & flag) || + return (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_fastopen) & flag) || tcp_sk(sk)->fastopen_no_cookie || (dst && dst_metric(dst, RTAX_FASTOPEN_NO_COOKIE)); }
@@ -353,7 +353,7 @@ struct sock *tcp_try_fastopen(struct sock *sk, struct sk_buff *skb, const struct dst_entry *dst) {bool syn_data =TCP_SKB_CB (skb)->end_seq !=TCP_SKB_CB (skb)->seq +1 ; -int tcp_fastopen =sock_net (sk)->ipv4.sysctl_tcp_fastopen; +int tcp_fastopen =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fastopen);struct tcp_fastopen_cookie valid_foc = { .len =-1 };struct sock *child;int ret =0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 100/201 tcp: Fix data-races around sysctl_tcp_fastopen_blackhole_timeout.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 021266ec640c7a4527e6cd4b7349a512b351de1d ]
While reading sysctl_tcp_fastopen_blackhole_timeout, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_fastopen.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp_fastopen.c +3 -2
@@ -495,7 +495,7 @@ void tcp_fastopen_active_disable(struct sock *sk) {struct net *net =sock_net (sk); -if (!sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout))return ;/* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */
@@ -516,7 +516,8 @@ void tcp_fastopen_active_disable(struct sock *sk)*/ bool tcp_fastopen_active_should_disable (struct sock *sk) { -unsigned int tfo_bh_timeout =sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout; +unsigned int tfo_bh_timeout = +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_fastopen_blackhole_timeout);unsigned long timeout;int tfo_da_times;int multiplier;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 101/201 iavf: Fix handling of dummy receive descriptors
In reply to Greg Kroah-HartmanFrom: Przemyslaw Patynowski <[email protected]>
[ Upstream commit a9f49e0060301a9bfebeca76739158d0cf91cdf6 ]
Fix memory leak caused by not handling dummy receive descriptor properly. iavf_get_rx_buffer now sets the rx_buffer return value for dummy receive descriptors. Without this patch, when the hardware writes a dummy descriptor, iavf would not free the page allocated for the previous receive buffer. This is an unlikely event but can still happen.
[Jesse: massaged commit message]
--- drivers/net/ethernet/intel/iavf/iavf_txrx.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_txrx.c +2 -3
@@ -1250,11 +1250,10 @@ static struct iavf_rx_buffer *iavf_get_rx_buffer(struct iavf_ring *rx_ring, {struct iavf_rx_buffer *rx_buffer; -if (!size) -return NULL ; - rx_buffer = &rx_ring->rx_bi[rx_ring->next_to_clean];prefetchw (rx_buffer->page); +if (!size) +return rx_buffer;/* we are reusing so sync this buffer for CPU use */ dma_sync_single_range_for_cpu(rx_ring->dev,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 102/201 pinctrl: armada-37xx: Use temporary variable for struct device
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 50cf2ed284e49028a885aa56c3ea50714c635879 ]
Use temporary variable for struct device to make code neater.
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 56 +++++++++------------ 1 file changed, 23 insertions(+), 33 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +23 -33
@@ -341,12 +341,12 @@ static int armada_37xx_pmx_set_by_name(struct pinctrl_dev *pctldev, struct armada_37xx_pin_group *grp) {struct armada_37xx_pinctrl *info =pinctrl_dev_get_drvdata (pctldev); +struct device *dev = info->dev;unsigned int reg =SELECTION ;unsigned int mask = grp->reg_mask;int func, val; -dev_dbg (info->dev,"enable function %s group %s\n" , - name, grp->name); +dev_dbg (dev,"enable function %s group %s\n" , name, grp->name); func =match_string (grp->funcs,NB_FUNCS , name);if (func <0 )
@@ -722,16 +722,16 @@ static unsigned int armada_37xx_irq_startup(struct irq_data *d)static int armada_37xx_irqchip_register (struct platform_device *pdev,struct armada_37xx_pinctrl *info) { -struct device_node *np = info->dev->of_node;struct gpio_chip *gc = &info->gpio_chip;struct irq_chip *irqchip = &info->irq_chip;struct gpio_irq_chip *girq = &gc->irq;struct device *dev = &pdev->dev; +struct device_node *np;struct resource res;int ret = -ENODEV , i, nr_irq_parent;/* Check if we have at least one gpio-controller child node */ -for_each_child_of_node (info->dev->of_node, np) { +for_each_child_of_node (dev->of_node, np) {if (of_property_read_bool (np,"gpio-controller" )) { ret =0 ;break ;
@@ -750,12 +750,12 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,return 0 ; } -if (of_address_to_resource (info->dev->of_node,1 , &res)) { +if (of_address_to_resource (dev->of_node,1 , &res)) {dev_err (dev,"cannot find IO resource\n" );return -ENOENT ; } - info->base =devm_ioremap_resource (info->dev, &res); + info->base =devm_ioremap_resource (dev, &res);if (IS_ERR (info->base))return PTR_ERR (info->base);
@@ -774,8 +774,7 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,* the chained irq with all of them. */ girq->num_parents = nr_irq_parent; - girq->parents =devm_kcalloc (&pdev->dev, nr_irq_parent, -sizeof (*girq->parents),GFP_KERNEL ); + girq->parents =devm_kcalloc (dev, nr_irq_parent,sizeof (*girq->parents),GFP_KERNEL );if (!girq->parents)return -ENOMEM ;for (i =0 ; i < nr_irq_parent; i++) {
@@ -794,11 +793,12 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,static int armada_37xx_gpiochip_register (struct platform_device *pdev,struct armada_37xx_pinctrl *info) { +struct device *dev = &pdev->dev;struct device_node *np;struct gpio_chip *gc;int ret = -ENODEV ; -for_each_child_of_node (info->dev->of_node, np) { +for_each_child_of_node (dev->of_node, np) {if (of_find_property (np,"gpio-controller" ,NULL )) { ret =0 ;break ;
@@ -811,19 +811,16 @@ static int armada_37xx_gpiochip_register(struct platform_device *pdev, gc = &info->gpio_chip; gc->ngpio = info->data->nr_pins; - gc->parent = &pdev->dev; + gc->parent = dev; gc->base =-1 ; gc->of_node = np; gc->label = info->data->name; ret =armada_37xx_irqchip_register (pdev, info); -if (ret) -return ret; - ret =devm_gpiochip_add_data (&pdev->dev, gc, info);if (ret)return ret; -return 0 ; +return devm_gpiochip_add_data (dev, gc, info); }/**
@@ -874,13 +871,13 @@ static int armada_37xx_add_function(struct armada_37xx_pmx_func *funcs,static int armada_37xx_fill_group (struct armada_37xx_pinctrl *info) {int n, num =0 , funcsize = info->data->nr_pins; +struct device *dev = info->dev;for (n =0 ; n < info->ngroups; n++) {struct armada_37xx_pin_group *grp = &info->groups[n];int i, j, f; - grp->pins =devm_kcalloc (info->dev, - grp->npins + grp->extra_npins, + grp->pins =devm_kcalloc (dev, grp->npins + grp->extra_npins,sizeof (*grp->pins),GFP_KERNEL );if (!grp->pins)
@@ -898,8 +895,7 @@ static int armada_37xx_fill_group(struct armada_37xx_pinctrl *info) ret =armada_37xx_add_function (info->funcs, &funcsize, grp->funcs[f]);if (ret == -EOVERFLOW ) -dev_err (info->dev, -"More functions than pins(%d)\n" , +dev_err (dev,"More functions than pins(%d)\n" , info->data->nr_pins);if (ret <0 )continue ;
@@ -925,6 +921,7 @@ static int armada_37xx_fill_group(struct armada_37xx_pinctrl *info)static int armada_37xx_fill_func (struct armada_37xx_pinctrl *info) {struct armada_37xx_pmx_func *funcs = info->funcs; +struct device *dev = info->dev;int n;for (n =0 ; n < info->nfuncs; n++) {
@@ -932,8 +929,7 @@ static int armada_37xx_fill_func(struct armada_37xx_pinctrl *info)const char **groups;int g; - funcs[n].groups =devm_kcalloc (info->dev, - funcs[n].ngroups, + funcs[n].groups =devm_kcalloc (dev, funcs[n].ngroups,sizeof (*(funcs[n].groups)),GFP_KERNEL );if (!funcs[n].groups)
@@ -962,6 +958,7 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,const struct armada_37xx_pin_data *pin_data = info->data;struct pinctrl_desc *ctrldesc = &info->pctl;struct pinctrl_pin_desc *pindesc, *pdesc; +struct device *dev = &pdev->dev;int pin, ret; info->groups = pin_data->groups;
@@ -973,9 +970,7 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev, ctrldesc->pmxops = &armada_37xx_pmx_ops; ctrldesc->confops = &armada_37xx_pinconf_ops; - pindesc =devm_kcalloc (&pdev->dev, - pin_data->nr_pins,sizeof (*pindesc), -GFP_KERNEL ); + pindesc =devm_kcalloc (dev, pin_data->nr_pins,sizeof (*pindesc),GFP_KERNEL );if (!pindesc)return -ENOMEM ;
@@ -994,14 +989,10 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,* we allocate functions for number of pins and hope there are * fewer unique functions than pins available */ - info->funcs =devm_kcalloc (&pdev->dev, - pin_data->nr_pins, -sizeof (struct armada_37xx_pmx_func ), -GFP_KERNEL ); + info->funcs =devm_kcalloc (dev, pin_data->nr_pins,sizeof (*info->funcs),GFP_KERNEL );if (!info->funcs)return -ENOMEM ; - ret =armada_37xx_fill_group (info);if (ret)return ret;
@@ -1010,9 +1001,9 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,if (ret)return ret; - info->pctl_dev =devm_pinctrl_register (&pdev->dev, ctrldesc, info); + info->pctl_dev =devm_pinctrl_register (dev, ctrldesc, info);if (IS_ERR (info->pctl_dev)) { -dev_err (&pdev->dev,"could not register pinctrl driver\n" ); +dev_err (dev,"could not register pinctrl driver\n" );return PTR_ERR (info->pctl_dev); }
@@ -1143,8 +1134,7 @@ static int __init armada_37xx_pinctrl_probe(struct platform_device *pdev)struct regmap *regmap;int ret; - info =devm_kzalloc (dev,sizeof (struct armada_37xx_pinctrl ), -GFP_KERNEL ); + info =devm_kzalloc (dev,sizeof (*info),GFP_KERNEL );if (!info)return -ENOMEM ;
@@ -1152,7 +1142,7 @@ static int __init armada_37xx_pinctrl_probe(struct platform_device *pdev) regmap =syscon_node_to_regmap (np);if (IS_ERR (regmap)) { -dev_err (&pdev->dev,"cannot get regmap\n" ); +dev_err (dev,"cannot get regmap\n" );return PTR_ERR (regmap); } info->regmap = regmap;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 103/201 pinctrl: armada-37xx: Make use of the devm_platform_ioremap_resource()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 49bdef501728acbfadc7eeafafb4f6c3fea415eb ]
Use the devm_platform_ioremap_resource() helper instead of calling of_address_to_resource() and devm_ioremap_resource() separately.
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +1 -7
@@ -727,7 +727,6 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,struct gpio_irq_chip *girq = &gc->irq;struct device *dev = &pdev->dev;struct device_node *np; -struct resource res;int ret = -ENODEV , i, nr_irq_parent;/* Check if we have at least one gpio-controller child node */
@@ -750,12 +749,7 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,return 0 ; } -if (of_address_to_resource (dev->of_node,1 , &res)) { -dev_err (dev,"cannot find IO resource\n" ); -return -ENOENT ; - } - - info->base =devm_ioremap_resource (dev, &res); + info->base =devm_platform_ioremap_resource (pdev,1 );if (IS_ERR (info->base))return PTR_ERR (info->base);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 104/201 pinctrl: armada-37xx: Convert to use dev_err_probe()
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 06cb10ea0cd5c5f4db9627a33ab47fec32cb5960 ]
It's fine to call dev_err_probe() in ->probe() when error code is known. Convert the driver to use dev_err_probe().
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +6 -12
@@ -736,10 +736,8 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,break ; } } -if (ret) { -dev_err (dev,"no gpio-controller child node\n" ); -return ret; - } +if (ret) +return dev_err_probe (dev, ret,"no gpio-controller child node\n" ); nr_irq_parent =of_irq_count (np);spin_lock_init (&info->irq_lock);
@@ -996,10 +994,8 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,return ret; info->pctl_dev =devm_pinctrl_register (dev, ctrldesc, info); -if (IS_ERR (info->pctl_dev)) { -dev_err (dev,"could not register pinctrl driver\n" ); -return PTR_ERR (info->pctl_dev); - } +if (IS_ERR (info->pctl_dev)) +return dev_err_probe (dev,PTR_ERR (info->pctl_dev),"could not register pinctrl driver\n" );return 0 ; }
@@ -1135,10 +1131,8 @@ static int __init armada_37xx_pinctrl_probe(struct platform_device *pdev) info->dev = dev; regmap =syscon_node_to_regmap (np); -if (IS_ERR (regmap)) { -dev_err (dev,"cannot get regmap\n" ); -return PTR_ERR (regmap); - } +if (IS_ERR (regmap)) +return dev_err_probe (dev,PTR_ERR (regmap),"cannot get regmap\n" ); info->regmap = regmap; info->data =of_device_get_match_data (dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 105/201 pinctrl: armada-37xx: use raw spinlocks for regmap to avoid invalid wait context
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 4546760619cfa9b718fe2059ceb07101cf9ff61e ]
The irqchip->irq_set_type method is called by __irq_set_trigger() under the desc->lock raw spinlock.
The armada-37xx implementation, armada_37xx_irq_set_type(), uses an MMIO regmap created by of_syscon_register(), which uses plain spinlocks (the kind that are sleepable on RT).
Therefore, this is an invalid locking scheme for which we get a kernel splat stating just that ("[ BUG: Invalid wait context ]"), because the context in which the plain spinlock may sleep is atomic due to the raw spinlock. We need to go raw spinlocks all the way.
Make this driver create its own MMIO regmap, with use_raw_spinlock=true, and stop relying on syscon to provide it.
This patch depends on commit 67021f25d952 ("regmap: teach regmap to use raw spinlocks if requested in the config").
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 27 ++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +21 -6
@@ -1116,25 +1116,40 @@ static const struct of_device_id armada_37xx_pinctrl_of_match[] = { { }, }; +static const struct regmap_config armada_37xx_pinctrl_regmap_config = { + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , + .use_raw_spinlock = true, +}; +static int __init armada_37xx_pinctrl_probe (struct platform_device *pdev) {struct armada_37xx_pinctrl *info;struct device *dev = &pdev->dev; -struct device_node *np = dev->of_node;struct regmap *regmap; +void __iomem *base;int ret; + base =devm_platform_get_and_ioremap_resource (pdev,0 ,NULL ); +if (IS_ERR (base)) { +dev_err (dev,"failed to ioremap base address: %pe\n" , base); +return PTR_ERR (base); + } + + regmap =devm_regmap_init_mmio (dev, base, + &armada_37xx_pinctrl_regmap_config); +if (IS_ERR (regmap)) { +dev_err (dev,"failed to create regmap: %pe\n" , regmap); +return PTR_ERR (regmap); + } + info =devm_kzalloc (dev,sizeof (*info),GFP_KERNEL );if (!info)return -ENOMEM ; info->dev = dev; - - regmap =syscon_node_to_regmap (np); -if (IS_ERR (regmap)) -return dev_err_probe (dev,PTR_ERR (regmap),"cannot get regmap\n" ); info->regmap = regmap; - info->data =of_device_get_match_data (dev); ret =armada_37xx_pinctrl_register (pdev, info);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 106/201 i40e: Fix erroneous adapter reinitialization during recovery process
In reply to Greg Kroah-HartmanFrom: Dawid Lukwinski <[email protected]>
[ Upstream commit f838a63369818faadec4ad1736cfbd20ab5da00e ]
Fix an issue when driver incorrectly detects state of recovery process and erroneously reinitializes interrupts, which results in a kernel error and call trace message.
The issue was caused by a combination of two factors:
1. Assuming the EMP reset issued after completing firmware recovery means the whole recovery process is complete.
2. Erroneous reinitialization of interrupt vector after detecting the above mentioned EMP reset.
Fixes (1) by changing how recovery state change is detected and (2) by adjusting the conditional expression to ensure using proper interrupt reinitialization method, depending on the situation.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +5 -8
@@ -10631,7 +10631,7 @@ static int i40e_reset(struct i40e_pf *pf)**/ static void i40e_rebuild (struct i40e_pf *pf,bool reinit,bool lock_acquired) { -int old_recovery_mode_bit =test_bit (__I40E_RECOVERY_MODE, pf->state); +const bool is_recovery_mode_reported =i40e_check_recovery_mode (pf);struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];struct i40e_hw *hw = &pf->hw;i40e_status ret;
@@ -10639,13 +10639,11 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)int v;if (test_bit (__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && -i40e_check_recovery_mode (pf)) { + is_recovery_mode_reported)i40e_set_ethtool_ops (pf->vsi[pf->lan_vsi]->netdev); - }if (test_bit (__I40E_DOWN, pf->state) && - !test_bit (__I40E_RECOVERY_MODE, pf->state) && - !old_recovery_mode_bit) + !test_bit (__I40E_RECOVERY_MODE, pf->state)) goto clear_recovery;dev_dbg (&pf->pdev->dev,"Rebuilding internal switch\n" );
@@ -10672,13 +10670,12 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)* accordingly with regard to resources initialization * and deinitialization */ -if (test_bit (__I40E_RECOVERY_MODE, pf->state) || - old_recovery_mode_bit) { +if (test_bit (__I40E_RECOVERY_MODE, pf->state)) {if (i40e_get_capabilities (pf, i40e_aqc_opc_list_func_capabilities)) goto end_unlock; -if (test_bit (__I40E_RECOVERY_MODE, pf->state)) { +if (is_recovery_mode_reported) {/* we're staying in recovery mode so we'll reinitialize * misc vector here */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 107/201 ixgbe: Add locking to prevent panic when setting sriov_numvfs to zero
In reply to Greg Kroah-HartmanFrom: Piotr Skajewski <[email protected]>
[ Upstream commit 1e53834ce541d4fe271cdcca7703e50be0a44f8a ]
It is possible to disable VFs while the PF driver is processing requests from the VF driver. This can result in a panic.
BUG: unable to handle kernel paging request at 000000000000106c PGD 0 P4D 0 Oops: 0000 [#1] SMP NOPTI CPU: 8 PID: 0 Comm: swapper/8 Kdump: loaded Tainted: G I --------- - Hardware name: Dell Inc. PowerEdge R740/06WXJT, BIOS 2.8.2 08/27/2020 RIP: 0010:ixgbe_msg_task+0x4c8/0x1690 [ixgbe] Code: 00 00 48 8d 04 40 48 c1 e0 05 89 7c 24 24 89 fd 48 89 44 24 10 83 ff 01 0f 84 b8 04 00 00 4c 8b 64 24 10 4d 03 a5 48 22 00 00 <41> 80 7c 24 4c 00 0f 84 8a 03 00 00 0f b7 c7 83 f8 08 0f 84 8f 0a RSP: 0018:ffffb337869f8df8 EFLAGS: 00010002 RAX: 0000000000001020 RBX: 0000000000000000 RCX: 000000000000002b RDX: 0000000000000002 RSI: 0000000000000008 RDI: 0000000000000006 RBP: 0000000000000006 R08: 0000000000000002 R09: 0000000000029780 R10: 00006957d8f42832 R11: 0000000000000000 R12: 0000000000001020 R13: ffff8a00e8978ac0 R14: 000000000000002b R15: ffff8a00e8979c80 FS: 0000000000000000(0000) GS:ffff8a07dfd00000(0000) knlGS:00000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000000000106c CR3: 0000000063e10004 CR4: 00000000007726e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <IRQ> ? ttwu_do_wakeup+0x19/0x140 ? try_to_wake_up+0x1cd/0x550 ? ixgbevf_update_xcast_mode+0x71/0xc0 [ixgbevf] ixgbe_msix_other+0x17e/0x310 [ixgbe] __handle_irq_event_percpu+0x40/0x180 handle_irq_event_percpu+0x30/0x80 handle_irq_event+0x36/0x53 handle_edge_irq+0x82/0x190 handle_irq+0x1c/0x30 do_IRQ+0x49/0xd0 common_interrupt+0xf/0xf
This can be eventually be reproduced with the following script:
while :
do
echo 63 > /sys/class/net/<devname>/device/sriov_numvfs sleep 1
echo 0 > /sys/class/net/<devname>/device/sriov_numvfs sleep 1
done
Add lock when disabling SR-IOV to prevent process VF mailbox communication.
--- drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 + drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 +++ drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 6 ++++++ 3 files changed, 10 insertions(+)
drivers/net/ethernet/intel/ixgbe/ixgbe.h +1 -0
@@ -770,6 +770,7 @@ struct ixgbe_adapter {#ifdef CONFIG_IXGBE_IPSEC struct ixgbe_ipsec *ipsec;#endif /* CONFIG_IXGBE_IPSEC */ +spinlock_t vfs_lock; };static inline u8 ixgbe_max_rss_indices (struct ixgbe_adapter *adapter)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +3 -0
@@ -6397,6 +6397,9 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,/* n-tuple support exists, always init our spinlock */ spin_lock_init (&adapter->fdir_perfect_lock); +/* init spinlock to avoid concurrency of VF resources */ +spin_lock_init (&adapter->vfs_lock); +#ifdef CONFIG_IXGBE_DCB ixgbe_init_dcb (adapter);#endif
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +6 -0
@@ -204,10 +204,13 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, unsigned int max_vfs)int ixgbe_disable_sriov (struct ixgbe_adapter *adapter) {unsigned int num_vfs = adapter->num_vfs, vf; +unsigned long flags;int rss; +spin_lock_irqsave (&adapter->vfs_lock, flags);/* set num VFs to 0 to prevent access to vfinfo */ adapter->num_vfs =0 ; +spin_unlock_irqrestore (&adapter->vfs_lock, flags);/* put the reference to all of the vf devices */ for (vf =0 ; vf < num_vfs; ++vf) {
@@ -1305,8 +1308,10 @@ static void ixgbe_rcv_ack_from_vf(struct ixgbe_adapter *adapter, u32 vf)void ixgbe_msg_task (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; +unsigned long flags;u32 vf; +spin_lock_irqsave (&adapter->vfs_lock, flags);for (vf =0 ; vf < adapter->num_vfs; vf++) {/* process any reset requests */ if (!ixgbe_check_for_rst (hw, vf))
@@ -1320,6 +1325,7 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)if (!ixgbe_check_for_ack (hw, vf))ixgbe_rcv_ack_from_vf (adapter, vf); } +spin_unlock_irqrestore (&adapter->vfs_lock, flags); }void ixgbe_disable_tx_rx (struct ixgbe_adapter *adapter)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 108/201 net: stmmac: remove redunctant disable xPCS EEE call
In reply to Greg Kroah-HartmanFrom: Wong Vee Khee <[email protected]>
[ Upstream commit da791bac104a3169b05b54270afe75daacba4641 ]
Disable is done in stmmac_init_eee() on the event of MAC link down. Since setting enable/disable EEE via ethtool will eventually trigger a MAC down, removing this redunctant call in stmmac_ethtool.c to avoid calling xpcs_config_eee() twice.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c | 8 -------- 1 file changed, 8 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c +0 -8
@@ -800,14 +800,6 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,netdev_warn (priv->dev,"Setting EEE tx-lpi is not supported\n" ); -if (priv->hw->xpcs) { - ret =xpcs_config_eee (priv->hw->xpcs, - priv->plat->mult_fact_100ns, - edata->eee_enabled); -if (ret) -return ret; - } -if (!edata->eee_enabled)stmmac_disable_eee_mode (priv);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 109/201 gpio: pca953x: only use single read/write for No AI mode
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit db8edaa09d7461ec08672a92a2eef63d5882bb79 ]
For the device use NO AI mode(not support auto address increment), only use the single read/write when config the regmap.
We meet issue on PCA9557PW on i.MX8QXP/DXL evk board, this device do not support AI mode, but when do the regmap sync, regmap will sync 3 byte data to register 1, logically this means write first data to register 1, write second data to register 2, write third data to register 3. But this device do not support AI mode, finally, these three data write only into register 1 one by one. the reault is the value of register 1 alway equal to the latest data, here is the third data, no operation happened on register 2 and register 3. This is not what we expect.
--- drivers/gpio/gpio-pca953x.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpio/gpio-pca953x.c +3 -0
@@ -351,6 +351,9 @@ static const struct regmap_config pca953x_i2c_regmap = { .reg_bits = 8, .val_bits = 8, + .use_single_read = true, + .use_single_write = true, + .readable_reg = pca953x_readable_register, .writeable_reg = pca953x_writeable_register, .volatile_reg = pca953x_volatile_register,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 110/201 gpio: pca953x: use the correct range when do regmap sync
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit 2abc17a93867dc816f0ed9d32021dda8078e7330 ]
regmap will sync a range of registers, here use the correct range to make sure the sync do not touch other unexpected registers.
Find on pca9557pw on imx8qxp/dxl evk board, this device support 8 pin, so only need one register(8 bits) to cover all the 8 pins's property setting. But when sync the output, we find it actually update two registers, output register and the following register.
--- drivers/gpio/gpio-pca953x.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/gpio/gpio-pca953x.c +6 -6
@@ -900,12 +900,12 @@ static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)int ret; ret =regcache_sync_region (chip->regmap, chip->regs->output, - chip->regs->output +NBANK (chip)); + chip->regs->output +NBANK (chip) -1 );if (ret) goto out; ret =regcache_sync_region (chip->regmap, chip->regs->direction, - chip->regs->direction +NBANK (chip)); + chip->regs->direction +NBANK (chip) -1 );if (ret) goto out;
@@ -1118,14 +1118,14 @@ static int pca953x_regcache_sync(struct device *dev)* sync these registers first and only then sync the rest. */ regaddr =pca953x_recalc_addr (chip, chip->regs->direction,0 ); - ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip)); + ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip) -1 );if (ret) {dev_err (dev,"Failed to sync GPIO dir registers: %d\n" , ret);return ret; } regaddr =pca953x_recalc_addr (chip, chip->regs->output,0 ); - ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip)); + ret =regcache_sync_region (chip->regmap, regaddr, regaddr +NBANK (chip) -1 );if (ret) {dev_err (dev,"Failed to sync GPIO out registers: %d\n" , ret);return ret;
@@ -1135,7 +1135,7 @@ static int pca953x_regcache_sync(struct device *dev)if (chip->driver_data &PCA_PCAL ) { regaddr =pca953x_recalc_addr (chip,PCAL953X_IN_LATCH ,0 ); ret =regcache_sync_region (chip->regmap, regaddr, - regaddr +NBANK (chip)); + regaddr +NBANK (chip) -1 );if (ret) {dev_err (dev,"Failed to sync INT latch registers: %d\n" , ret);
@@ -1144,7 +1144,7 @@ static int pca953x_regcache_sync(struct device *dev) regaddr =pca953x_recalc_addr (chip,PCAL953X_INT_MASK ,0 ); ret =regcache_sync_region (chip->regmap, regaddr, - regaddr +NBANK (chip)); + regaddr +NBANK (chip) -1 );if (ret) {dev_err (dev,"Failed to sync INT mask registers: %d\n" , ret);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 111/201 gpio: pca953x: use the correct register address when regcache sync during init
In reply to Greg Kroah-HartmanFrom: Haibo Chen <[email protected]>
[ Upstream commit b8c768ccdd8338504fb78370747728d5002b1b5a ]
For regcache_sync_region, we need to use pca953x_recalc_addr() to get the real register address.
--- drivers/gpio/gpio-pca953x.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/gpio/gpio-pca953x.c +7 -4
@@ -897,15 +897,18 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,static int device_pca95xx_init (struct pca953x_chip *chip,u32 invert) {DECLARE_BITMAP (val,MAX_LINE ); +u8 regaddr;int ret; - ret =regcache_sync_region (chip->regmap, chip->regs->output, - chip->regs->output +NBANK (chip) -1 ); + regaddr =pca953x_recalc_addr (chip, chip->regs->output,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, + regaddr +NBANK (chip) -1 );if (ret) goto out; - ret =regcache_sync_region (chip->regmap, chip->regs->direction, - chip->regs->direction +NBANK (chip) -1 ); + regaddr =pca953x_recalc_addr (chip, chip->regs->direction,0 ); + ret =regcache_sync_region (chip->regmap, regaddr, + regaddr +NBANK (chip) -1 );if (ret) goto out;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 112/201 be2net: Fix buffer overflow in be_get_module_eeprom
In reply to Greg Kroah-HartmanFrom: Hristo Venev <[email protected]>
[ Upstream commit d7241f679a59cfe27f92cb5c6272cb429fb1f7ec ]
be_cmd_read_port_transceiver_data assumes that it is given a buffer that is at least PAGE_DATA_LEN long, or twice that if the module supports SFF 8472. However, this is not always the case.
Fix this by passing the desired offset and length to be_cmd_read_port_transceiver_data so that we only copy the bytes once.
--- drivers/net/ethernet/emulex/benet/be_cmds.c | 10 +++--- drivers/net/ethernet/emulex/benet/be_cmds.h | 2 +- .../net/ethernet/emulex/benet/be_ethtool.c | 31 ++++++++++++------- 3 files changed, 25 insertions(+), 18 deletions(-)
drivers/net/ethernet/emulex/benet/be_cmds.c +5 -5
@@ -2287,7 +2287,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)/* Uses sync mcc */ int be_cmd_read_port_transceiver_data (struct be_adapter *adapter, -u8 page_num,u8 *data) +u8 page_num,u32 off,u32 len,u8 *data) {struct be_dma_mem cmd;struct be_mcc_wrb *wrb;
@@ -2321,10 +2321,10 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter, req->port =cpu_to_le32 (adapter->hba_port_num); req->page_num =cpu_to_le32 (page_num); status =be_mcc_notify_wait (adapter); -if (!status) { +if (!status && len >0 ) {struct be_cmd_resp_port_type *resp = cmd.va; -memcpy (data, resp->page_data,PAGE_DATA_LEN ); +memcpy (data, resp->page_data + off, len); } err:mutex_unlock (&adapter->mcc_lock);
@@ -2415,7 +2415,7 @@ int be_cmd_query_cable_type(struct be_adapter *adapter)int status; status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A0 , - page_data); +0 ,PAGE_DATA_LEN , page_data);if (!status) {switch (adapter->phy.interface_type) {case PHY_TYPE_QSFP :
@@ -2440,7 +2440,7 @@ int be_cmd_query_sfp_info(struct be_adapter *adapter)int status; status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A0 , - page_data); +0 ,PAGE_DATA_LEN , page_data);if (!status) {strlcpy (adapter->phy.vendor_name, page_data +SFP_VENDOR_NAME_OFFSET ,SFP_VENDOR_NAME_LEN -1 );
drivers/net/ethernet/emulex/benet/be_cmds.h +1 -1
@@ -2427,7 +2427,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num, u8 beacon,int be_cmd_get_beacon_state (struct be_adapter *adapter,u8 port_num,u32 *state);int be_cmd_read_port_transceiver_data (struct be_adapter *adapter, -u8 page_num,u8 *data); +u8 page_num,u32 off,u32 len,u8 *data);int be_cmd_query_cable_type (struct be_adapter *adapter);int be_cmd_query_sfp_info (struct be_adapter *adapter); int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
drivers/net/ethernet/emulex/benet/be_ethtool.c +19 -12
@@ -1342,7 +1342,7 @@ static int be_get_module_info(struct net_device *netdev,return -EOPNOTSUPP ; status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A0 , - page_data); +0 ,PAGE_DATA_LEN , page_data);if (!status) {if (!page_data[SFP_PLUS_SFF_8472_COMP ]) { modinfo->type =ETH_MODULE_SFF_8079 ;
@@ -1360,25 +1360,32 @@ static int be_get_module_eeprom(struct net_device *netdev, {struct be_adapter *adapter =netdev_priv (netdev);int status; +u32 begin, end;if (!check_privilege (adapter,MAX_PRIVILEGES ))return -EOPNOTSUPP ; - status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A0 , - data); -if (status) - goto err; + begin = eeprom->offset; + end = eeprom->offset + eeprom->len; + +if (begin <PAGE_DATA_LEN ) { + status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A0 , begin, +min_t (u32, end,PAGE_DATA_LEN ) - begin, + data); +if (status) + goto err; + + data +=PAGE_DATA_LEN - begin; + begin =PAGE_DATA_LEN ; + } -if (eeprom->offset + eeprom->len >PAGE_DATA_LEN ) { - status =be_cmd_read_port_transceiver_data (adapter, -TR_PAGE_A2 , - data + -PAGE_DATA_LEN ); +if (end >PAGE_DATA_LEN ) { + status =be_cmd_read_port_transceiver_data (adapter,TR_PAGE_A2 , + begin -PAGE_DATA_LEN , + end - begin, data);if (status) goto err; } -if (eeprom->offset) -memcpy (data, data + eeprom->offset, eeprom->len); err:return be_cmd_status (status); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 113/201 net: dsa: sja1105: silent spi_device_id warnings
In reply to Greg Kroah-HartmanFrom: Oleksij Rempel <[email protected]>
[ Upstream commit 855fe49984a8a3899f07ae1d149d46cd8d4acb52 ]
Add spi_device_id entries to silent following warnings:
SPI driver sja1105 has no spi_device_id for nxp,sja1105e SPI driver sja1105 has no spi_device_id for nxp,sja1105t SPI driver sja1105 has no spi_device_id for nxp,sja1105p SPI driver sja1105 has no spi_device_id for nxp,sja1105q SPI driver sja1105 has no spi_device_id for nxp,sja1105r SPI driver sja1105 has no spi_device_id for nxp,sja1105s SPI driver sja1105 has no spi_device_id for nxp,sja1110a SPI driver sja1105 has no spi_device_id for nxp,sja1110b SPI driver sja1105 has no spi_device_id for nxp,sja1110c SPI driver sja1105 has no spi_device_id for nxp,sja1110d
--- drivers/net/dsa/sja1105/sja1105_main.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/net/dsa/sja1105/sja1105_main.c +16 -0
@@ -3372,12 +3372,28 @@ static const struct of_device_id sja1105_dt_ids[] = { };MODULE_DEVICE_TABLE (of, sja1105_dt_ids); +static const struct spi_device_id sja1105_spi_ids[] = { + {"sja1105e" }, + {"sja1105t" }, + {"sja1105p" }, + {"sja1105q" }, + {"sja1105r" }, + {"sja1105s" }, + {"sja1110a" }, + {"sja1110b" }, + {"sja1110c" }, + {"sja1110d" }, + { }, +}; +MODULE_DEVICE_TABLE (spi, sja1105_spi_ids); +static struct spi_driver sja1105_driver = { .driver = { .name ="sja1105" , .owner =THIS_MODULE , .of_match_table =of_match_ptr (sja1105_dt_ids), }, + .id_table = sja1105_spi_ids, .probe = sja1105_probe, .remove = sja1105_remove, .shutdown = sja1105_shutdown,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 114/201 net: dsa: vitesse-vsc73xx: silent spi_device_id warnings
In reply to Greg Kroah-HartmanFrom: Oleksij Rempel <[email protected]>
[ Upstream commit 1774559f07993e1cac33c2406e99049d4bdea6c8 ]
Add spi_device_id entries to silent SPI warnings.
--- drivers/net/dsa/vitesse-vsc73xx-spi.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/dsa/vitesse-vsc73xx-spi.c +10 -0
@@ -207,10 +207,20 @@ static const struct of_device_id vsc73xx_of_match[] = { };MODULE_DEVICE_TABLE (of, vsc73xx_of_match); +static const struct spi_device_id vsc73xx_spi_ids[] = { + {"vsc7385" }, + {"vsc7388" }, + {"vsc7395" }, + {"vsc7398" }, + { }, +}; +MODULE_DEVICE_TABLE (spi, vsc73xx_spi_ids); +static struct spi_driver vsc73xx_spi_driver = { .probe = vsc73xx_spi_probe, .remove = vsc73xx_spi_remove, .shutdown = vsc73xx_spi_shutdown, + .id_table = vsc73xx_spi_ids, .driver = { .name ="vsc73xx-spi" , .of_match_table = vsc73xx_of_match,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 115/201 drm/imx/dcss: Add missing of_node_put() in fail path
In reply to Greg Kroah-HartmanFrom: Liang He <[email protected]>
[ Upstream commit 02c87df2480ac855d88ee308ce3fa857d9bd55a8 ]
In dcss_dev_create() and dcss_dev_destroy(), we should call of_node_put() in fail path or before the dcss's destroy as of_graph_get_port_by_id() has increased the refcount.
--- drivers/gpu/drm/imx/dcss/dcss-dev.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/imx/dcss/dcss-dev.c +3 -0
@@ -207,6 +207,7 @@ struct dcss_dev *dcss_dev_create(struct device *dev, bool hdmi_output) ret =dcss_submodules_init (dcss);if (ret) { +of_node_put (dcss->of_port);dev_err (dev,"submodules initialization failed\n" ); goto clks_err; }
@@ -237,6 +238,8 @@ void dcss_dev_destroy(struct dcss_dev *dcss)dcss_clocks_disable (dcss); } +of_node_put (dcss->of_port); +pm_runtime_disable (dcss->dev);dcss_submodules_stop (dcss);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 116/201 ipv4: Fix a data-race around sysctl_fib_multipath_use_neigh.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 87507bcb4f5de16bb419e9509d874f4db6c0ad0f ]
While reading sysctl_fib_multipath_use_neigh, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/fib_semantics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/fib_semantics.c +1 -1
@@ -2233,7 +2233,7 @@ void fib_select_multipath(struct fib_result *res, int hash) }change_nexthops (fi) { -if (net->ipv4.sysctl_fib_multipath_use_neigh) { +if (READ_ONCE (net->ipv4.sysctl_fib_multipath_use_neigh)) {if (!fib_good_nh (nexthop_nh))continue ;if (!first) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 117/201 ipv4: Fix data-races around sysctl_fib_multipath_hash_policy.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 7998c12a08c97cc26660532c9f90a34bd7d8da5a ]
While reading sysctl_fib_multipath_hash_policy, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- net/ipv4/route.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +1 -1
@@ -9588,7 +9588,7 @@ static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp,unsigned long *fields = config->fields;u32 hash_fields; -switch (net->ipv4.sysctl_fib_multipath_hash_policy) { +switch (READ_ONCE (net->ipv4.sysctl_fib_multipath_hash_policy)) {case 0 :mlxsw_sp_mp4_hash_outer_addr (config);break ;
net/ipv4/route.c +1 -1
@@ -2048,7 +2048,7 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,struct flow_keys hash_keys;u32 mhash =0 ; -switch (net->ipv4.sysctl_fib_multipath_hash_policy) { +switch (READ_ONCE (net->ipv4.sysctl_fib_multipath_hash_policy)) {case 0 :memset (&hash_keys,0 ,sizeof (hash_keys)); hash_keys.control.addr_type =FLOW_DISSECTOR_KEY_IPV4_ADDRS ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 118/201 ipv4: Fix data-races around sysctl_fib_multipath_hash_fields.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 8895a9c2ac76fb9d3922fed4fe092c8ec5e5cccc ]
While reading sysctl_fib_multipath_hash_fields, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 +- net/ipv4/route.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +1 -1
@@ -9606,7 +9606,7 @@ static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp,mlxsw_sp_mp_hash_inner_l3 (config);break ;case 3 : - hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields; + hash_fields =READ_ONCE (net->ipv4.sysctl_fib_multipath_hash_fields);/* Outer */ MLXSW_SP_MP_HASH_HEADER_SET (headers,IPV4_EN_NOT_TCP_NOT_UDP );MLXSW_SP_MP_HASH_HEADER_SET (headers,IPV4_EN_TCP_UDP );
net/ipv4/route.c +3 -3
@@ -1929,7 +1929,7 @@ static u32 fib_multipath_custom_hash_outer(const struct net *net,const struct sk_buff *skb, bool *p_has_inner) { - u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields; + u32 hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);struct flow_keys keys, hash_keys;if (!(hash_fields &FIB_MULTIPATH_HASH_FIELD_OUTER_MASK ))
@@ -1958,7 +1958,7 @@ static u32 fib_multipath_custom_hash_inner(const struct net *net,const struct sk_buff *skb, bool has_inner) { - u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields; + u32 hash_fields = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_fields);struct flow_keys keys, hash_keys;/* We assume the packet carries an encapsulation, but if none was
@@ -2018,7 +2018,7 @@ static u32 fib_multipath_custom_hash_skb(const struct net *net,static u32 fib_multipath_custom_hash_fl4 (const struct net *net,const struct flowi4 *fl4) { -u32 hash_fields = net->ipv4.sysctl_fib_multipath_hash_fields; +u32 hash_fields =READ_ONCE (net->ipv4.sysctl_fib_multipath_hash_fields);struct flow_keys hash_keys;if (!(hash_fields &FIB_MULTIPATH_HASH_FIELD_OUTER_MASK ))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 119/201 ip: Fix data-races around sysctl_ip_prot_sock.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 9b55c20f83369dd54541d9ddbe3a018a8377f451 ]
sysctl_ip_prot_sock is accessed concurrently, and there is always a chance of data-race. So, all readers and writers need some basic protection to avoid load/store-tearing.
--- include/net/ip.h | 2 +- net/ipv4/sysctl_net_ipv4.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
include/net/ip.h +1 -1
@@ -352,7 +352,7 @@ static inline bool sysctl_dev_name_is_allowed(const char *name)static inline bool inet_port_requires_bind_service (struct net *net,unsigned short port) { -return port < net->ipv4.sysctl_ip_prot_sock; +return port <READ_ONCE (net->ipv4.sysctl_ip_prot_sock); }#else
net/ipv4/sysctl_net_ipv4.c +3 -3
@@ -97,7 +97,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write,* port limit. */ if ((range[1 ] < range[0 ]) || - (range[0 ] < net->ipv4.sysctl_ip_prot_sock)) + (range[0 ] <READ_ONCE (net->ipv4.sysctl_ip_prot_sock))) ret = -EINVAL ;else set_local_port_range (net, range);
@@ -123,7 +123,7 @@ static int ipv4_privileged_ports(struct ctl_table *table, int write, .extra2 = &ip_privileged_port_max, }; - pports = net->ipv4.sysctl_ip_prot_sock; + pports =READ_ONCE (net->ipv4.sysctl_ip_prot_sock); ret =proc_dointvec_minmax (&tmp, write, buffer, lenp, ppos);
@@ -135,7 +135,7 @@ static int ipv4_privileged_ports(struct ctl_table *table, int write,if (range[0 ] < pports) ret = -EINVAL ;else - net->ipv4.sysctl_ip_prot_sock = pports; +WRITE_ONCE (net->ipv4.sysctl_ip_prot_sock, pports); }return ret;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 120/201 udp: Fix a data-race around sysctl_udp_l3mdev_accept.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 3d72bb4188c708bb16758c60822fc4dda7a95174 ]
While reading sysctl_udp_l3mdev_accept, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- include/net/udp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/udp.h +1 -1
@@ -262,7 +262,7 @@ static inline bool udp_sk_bound_dev_eq(struct net *net, int bound_dev_if, int dif, int sdif) {#if IS_ENABLED (CONFIG_NET_L3_MASTER_DEV ) -return inet_bound_dev_eq (!!net->ipv4.sysctl_udp_l3mdev_accept, +return inet_bound_dev_eq (!!READ_ONCE (net->ipv4.sysctl_udp_l3mdev_accept), bound_dev_if, dif, sdif);#else return inet_bound_dev_eq (true, bound_dev_if, dif, sdif);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 121/201 tcp: Fix data-races around sysctl knobs related to SYN option.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 3666f666e99600518ab20982af04a078bbdad277 ]
While reading these knobs, they can be changed concurrently. Thus, we need to add READ_ONCE() to their readers.
- tcp_sack
- tcp_window_scaling
- tcp_timestamps
--- .../ethernet/chelsio/inline_crypto/chtls/chtls_cm.c | 6 +++--- net/core/secure_seq.c | 4 ++-- net/ipv4/syncookies.c | 6 +++--- net/ipv4/tcp_input.c | 6 +++--- net/ipv4/tcp_output.c | 10 +++++----- 5 files changed, 16 insertions(+), 16 deletions(-)
drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c +3 -3
@@ -1236,8 +1236,8 @@ static struct sock *chtls_recv_sock(struct sock *lsk, csk->sndbuf = newsk->sk_sndbuf; csk->smac_idx = ((struct port_info *)netdev_priv (ndev))->smt_idx;RCV_WSCALE (tp) =select_rcv_wscale (tcp_full_space (newsk), -sock_net (newsk)-> - ipv4.sysctl_tcp_window_scaling, +READ_ONCE (sock_net (newsk)-> + ipv4.sysctl_tcp_window_scaling), tp->window_clamp);neigh_release (n);inet_inherit_port (&tcp_hashinfo, lsk, newsk);
@@ -1384,7 +1384,7 @@ static void chtls_pass_accept_request(struct sock *sk,#endif }if (req->tcpopt.wsf <=14 && -sock_net (sk)->ipv4.sysctl_tcp_window_scaling) { +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_window_scaling)) {inet_rsk (oreq)->wscale_ok =1 ;inet_rsk (oreq)->snd_wscale = req->tcpopt.wsf; }
net/core/secure_seq.c +2 -2
@@ -64,7 +64,7 @@ u32 secure_tcpv6_ts_off(const struct net *net, .daddr = *(struct in6_addr *)daddr, }; -if (net->ipv4.sysctl_tcp_timestamps !=1 ) +if (READ_ONCE (net->ipv4.sysctl_tcp_timestamps) !=1 )return 0 ;ts_secret_init ();
@@ -120,7 +120,7 @@ EXPORT_SYMBOL(secure_ipv6_port_ephemeral);#ifdef CONFIG_INET u32 secure_tcp_ts_off (const struct net *net,__be32 saddr,__be32 daddr) { -if (net->ipv4.sysctl_tcp_timestamps !=1 ) +if (READ_ONCE (net->ipv4.sysctl_tcp_timestamps) !=1 )return 0 ;ts_secret_init ();
net/ipv4/syncookies.c +3 -3
@@ -249,12 +249,12 @@ bool cookie_timestamp_decode(const struct net *net,return true; } -if (!net->ipv4.sysctl_tcp_timestamps) +if (!READ_ONCE (net->ipv4.sysctl_tcp_timestamps))return false; tcp_opt->sack_ok = (options &TS_OPT_SACK ) ?TCP_SACK_SEEN :0 ; -if (tcp_opt->sack_ok && !net->ipv4.sysctl_tcp_sack) +if (tcp_opt->sack_ok && !READ_ONCE (net->ipv4.sysctl_tcp_sack))return false;if ((options &TS_OPT_WSCALE_MASK ) ==TS_OPT_WSCALE_MASK )
@@ -263,7 +263,7 @@ bool cookie_timestamp_decode(const struct net *net, tcp_opt->wscale_ok =1 ; tcp_opt->snd_wscale = options &TS_OPT_WSCALE_MASK ; -return net->ipv4.sysctl_tcp_window_scaling !=0 ; +return READ_ONCE (net->ipv4.sysctl_tcp_window_scaling) !=0 ; }EXPORT_SYMBOL (cookie_timestamp_decode);
net/ipv4/tcp_input.c +3 -3
@@ -4053,7 +4053,7 @@ void tcp_parse_options(const struct net *net,break ;case TCPOPT_WINDOW :if (opsize ==TCPOLEN_WINDOW && th->syn && - !estab && net->ipv4.sysctl_tcp_window_scaling) { + !estab &&READ_ONCE (net->ipv4.sysctl_tcp_window_scaling)) {__u8 snd_wscale = *(__u8 *)ptr; opt_rx->wscale_ok =1 ;if (snd_wscale >TCP_MAX_WSCALE ) {
@@ -4069,7 +4069,7 @@ void tcp_parse_options(const struct net *net,case TCPOPT_TIMESTAMP :if ((opsize ==TCPOLEN_TIMESTAMP ) && ((estab && opt_rx->tstamp_ok) || - (!estab && net->ipv4.sysctl_tcp_timestamps))) { + (!estab &&READ_ONCE (net->ipv4.sysctl_tcp_timestamps)))) { opt_rx->saw_tstamp =1 ; opt_rx->rcv_tsval =get_unaligned_be32 (ptr); opt_rx->rcv_tsecr =get_unaligned_be32 (ptr +4 );
@@ -4077,7 +4077,7 @@ void tcp_parse_options(const struct net *net,break ;case TCPOPT_SACK_PERM :if (opsize ==TCPOLEN_SACK_PERM && th->syn && - !estab && net->ipv4.sysctl_tcp_sack) { + !estab &&READ_ONCE (net->ipv4.sysctl_tcp_sack)) { opt_rx->sack_ok =TCP_SACK_SEEN ;tcp_sack_reset (opt_rx); }
net/ipv4/tcp_output.c +5 -5
@@ -790,18 +790,18 @@ static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb, opts->mss =tcp_advertise_mss (sk); remaining -=TCPOLEN_MSS_ALIGNED ; -if (likely (sock_net (sk)->ipv4.sysctl_tcp_timestamps && !*md5)) { +if (likely (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_timestamps) && !*md5)) { opts->options |=OPTION_TS ; opts->tsval =tcp_skb_timestamp (skb) + tp->tsoffset; opts->tsecr = tp->rx_opt.ts_recent; remaining -=TCPOLEN_TSTAMP_ALIGNED ; } -if (likely (sock_net (sk)->ipv4.sysctl_tcp_window_scaling)) { +if (likely (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_window_scaling))) { opts->ws = tp->rx_opt.rcv_wscale; opts->options |=OPTION_WSCALE ; remaining -=TCPOLEN_WSCALE_ALIGNED ; } -if (likely (sock_net (sk)->ipv4.sysctl_tcp_sack)) { +if (likely (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_sack))) { opts->options |=OPTION_SACK_ADVERTISE ;if (unlikely (!(OPTION_TS & opts->options))) remaining -=TCPOLEN_SACKPERM_ALIGNED ;
@@ -3649,7 +3649,7 @@ static void tcp_connect_init(struct sock *sk)* See tcp_input.c:tcp_rcv_state_process case TCP_SYN_SENT. */ tp->tcp_header_len =sizeof (struct tcphdr ); -if (sock_net (sk)->ipv4.sysctl_tcp_timestamps) +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_timestamps)) tp->tcp_header_len +=TCPOLEN_TSTAMP_ALIGNED ;#ifdef CONFIG_TCP_MD5SIG
@@ -3685,7 +3685,7 @@ static void tcp_connect_init(struct sock *sk) tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len -sizeof (struct tcphdr ) :0 ), &tp->rcv_wnd, &tp->window_clamp, -sock_net (sk)->ipv4.sysctl_tcp_window_scaling, +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_window_scaling), &rcv_wscale, rcv_wnd);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 122/201 tcp: Fix a data-race around sysctl_tcp_early_retrans.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 52e65865deb6a36718a463030500f16530eaab74 ]
While reading sysctl_tcp_early_retrans, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_output.c +1 -1
@@ -2739,7 +2739,7 @@ bool tcp_schedule_loss_probe(struct sock *sk, bool advancing_rto)if (rcu_access_pointer (tp->fastopen_rsk))return false; - early_retrans =sock_net (sk)->ipv4.sysctl_tcp_early_retrans; + early_retrans =READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_early_retrans);/* Schedule a loss probe in 2*RTT for SACK capable connections * not in loss recovery, that are either limited by cwnd or application. */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 123/201 tcp: Fix data-races around sysctl_tcp_recovery.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit e7d2ef837e14a971a05f60ea08c47f3fed1a36e4 ]
While reading sysctl_tcp_recovery, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_input.c | 3 ++- net/ipv4/tcp_recovery.c | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-)
net/ipv4/tcp_input.c +2 -1
@@ -2087,7 +2087,8 @@ static inline void tcp_init_undo(struct tcp_sock *tp)static bool tcp_is_rack (const struct sock *sk) { -return sock_net (sk)->ipv4.sysctl_tcp_recovery &TCP_RACK_LOSS_DETECTION ; +return READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_recovery) & +TCP_RACK_LOSS_DETECTION ; }/* If we detect SACK reneging, forget all SACK information
net/ipv4/tcp_recovery.c +4 -2
@@ -19,7 +19,8 @@ static u32 tcp_rack_reo_wnd(const struct sock *sk)return 0 ;if (tp->sacked_out >= tp->reordering && - !(sock_net (sk)->ipv4.sysctl_tcp_recovery &TCP_RACK_NO_DUPTHRESH )) + !(READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_recovery) & +TCP_RACK_NO_DUPTHRESH ))return 0 ; }
@@ -192,7 +193,8 @@ void tcp_rack_update_reo_wnd(struct sock *sk, struct rate_sample *rs) {struct tcp_sock *tp =tcp_sk (sk); -if (sock_net (sk)->ipv4.sysctl_tcp_recovery &TCP_RACK_STATIC_REO_WND || +if ((READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_recovery) & +TCP_RACK_STATIC_REO_WND ) || !rs->prior_delivered)return ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 124/201 tcp: Fix a data-race around sysctl_tcp_thin_linear_timeouts.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 7c6f2a86ca590d5187a073d987e9599985fb1c7c ]
While reading sysctl_tcp_thin_linear_timeouts, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_timer.c +1 -1
@@ -578,7 +578,7 @@ void tcp_retransmit_timer(struct sock *sk)* linear-timeout retransmissions into a black hole */ if (sk->sk_state ==TCP_ESTABLISHED && - (tp->thin_lto || net->ipv4.sysctl_tcp_thin_linear_timeouts) && + (tp->thin_lto ||READ_ONCE (net->ipv4.sysctl_tcp_thin_linear_timeouts)) &&tcp_stream_is_thin (tp) && icsk->icsk_retransmits <=TCP_THIN_LINEAR_RETRIES ) { icsk->icsk_backoff =0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 125/201 tcp: Fix data-races around sysctl_tcp_slow_start_after_idle.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 4845b5713ab18a1bb6e31d1fbb4d600240b8b691 ]
While reading sysctl_tcp_slow_start_after_idle, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- include/net/tcp.h | 4 ++-- net/ipv4/tcp_output.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
include/net/tcp.h +2 -2
@@ -1390,8 +1390,8 @@ static inline void tcp_slow_start_after_idle_check(struct sock *sk)struct tcp_sock *tp =tcp_sk (sk);s32 delta; -if (!sock_net (sk)->ipv4.sysctl_tcp_slow_start_after_idle || tp->packets_out || - ca_ops->cong_control) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_slow_start_after_idle) || + tp->packets_out || ca_ops->cong_control)return ; delta = tcp_jiffies32 - tp->lsndtime;if (delta >inet_csk (sk)->icsk_rto)
net/ipv4/tcp_output.c +1 -1
@@ -1901,7 +1901,7 @@ static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited)if (tp->packets_out > tp->snd_cwnd_used) tp->snd_cwnd_used = tp->packets_out; -if (sock_net (sk)->ipv4.sysctl_tcp_slow_start_after_idle && +if (READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_slow_start_after_idle) && (s32)(tcp_jiffies32 - tp->snd_cwnd_stamp) >=inet_csk (sk)->icsk_rto && !ca_ops->cong_control)tcp_cwnd_application_limited (sk);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 126/201 tcp: Fix a data-race around sysctl_tcp_retrans_collapse.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 1a63cb91f0c2fcdeced6d6edee8d1d886583d139 ]
While reading sysctl_tcp_retrans_collapse, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_output.c +1 -1
@@ -3108,7 +3108,7 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to,struct sk_buff *skb = to, *tmp;bool first = true; -if (!sock_net (sk)->ipv4.sysctl_tcp_retrans_collapse) +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_retrans_collapse))return ;if (TCP_SKB_CB (skb)->tcp_flags &TCPHDR_SYN )return ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 127/201 tcp: Fix a data-race around sysctl_tcp_stdurg.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 4e08ed41cb1194009fc1a916a59ce3ed4afd77cd ]
While reading sysctl_tcp_stdurg, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_input.c +1 -1
@@ -5542,7 +5542,7 @@ static void tcp_check_urg(struct sock *sk, const struct tcphdr *th)struct tcp_sock *tp =tcp_sk (sk);u32 ptr =ntohs (th->urg_ptr); -if (ptr && !sock_net (sk)->ipv4.sysctl_tcp_stdurg) +if (ptr && !READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_stdurg)) ptr--; ptr +=ntohl (th->seq);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 128/201 tcp: Fix a data-race around sysctl_tcp_rfc1337.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 0b484c91911e758e53656d570de58c2ed81ec6f2 ]
While reading sysctl_tcp_rfc1337, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_minisocks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_minisocks.c +1 -1
@@ -180,7 +180,7 @@ tcp_timewait_state_process(struct inet_timewait_sock *tw, struct sk_buff *skb,* Oh well... nobody has a sufficient solution to this * protocol bug yet. */ -if (twsk_net (tw)->ipv4.sysctl_tcp_rfc1337 ==0 ) { +if (!READ_ONCE (twsk_net (tw)->ipv4.sysctl_tcp_rfc1337)) { kill:inet_twsk_deschedule_put (tw);return TCP_TW_SUCCESS ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 129/201 tcp: Fix a data-race around sysctl_tcp_abort_on_overflow.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 2d17d9c7382327d00aeaea35af44e9b26d53206e ]
While reading sysctl_tcp_abort_on_overflow, it can be changed concurrently. Thus, we need to add READ_ONCE() to its reader.
--- net/ipv4/tcp_minisocks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_minisocks.c +1 -1
@@ -789,7 +789,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,if (sk != req->rsk_listener)__NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPMIGRATEREQFAILURE ); -if (!sock_net (sk)->ipv4.sysctl_tcp_abort_on_overflow) { +if (!READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_abort_on_overflow)) {inet_rsk (req)->acked =1 ;return NULL ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 130/201 tcp: Fix data-races around sysctl_tcp_max_reordering.
In reply to Greg Kroah-HartmanFrom: Kuniyuki Iwashima <[email protected]>
[ Upstream commit a11e5b3e7a59fde1a90b0eaeaa82320495cf8cae ]
While reading sysctl_tcp_max_reordering, it can be changed concurrently. Thus, we need to add READ_ONCE() to its readers.
--- net/ipv4/tcp_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp_input.c +2 -2
@@ -1043,7 +1043,7 @@ static void tcp_check_sack_reordering(struct sock *sk, const u32 low_seq, tp->undo_marker ? tp->undo_retrans : 0);#endif tp->reordering =min_t (u32, (metric + mss -1 ) / mss, -sock_net (sk)->ipv4.sysctl_tcp_max_reordering); +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_max_reordering)); }/* This exciting event is worth to be remembered. 8) */
@@ -2022,7 +2022,7 @@ static void tcp_check_reno_reordering(struct sock *sk, const int addend)return ; tp->reordering =min_t (u32, tp->packets_out + addend, -sock_net (sk)->ipv4.sysctl_tcp_max_reordering); +READ_ONCE (sock_net (sk)->ipv4.sysctl_tcp_max_reordering)); tp->reord_seen++;NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPRENOREORDER ); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 131/201 gpio: gpio-xilinx: Fix integer overflow
In reply to Greg Kroah-HartmanFrom: Srinivas Neeli <[email protected]>
[ Upstream commit 32c094a09d5829ad9b02cdf667569aefa8de0ea6 ]
Current implementation is not able to configure more than 32 pins due to incorrect data type. So type casting with unsigned long to avoid it.
--- drivers/gpio/gpio-xilinx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-xilinx.c +1 -1
@@ -99,7 +99,7 @@ static inline void xgpio_set_value32(unsigned long *map, int bit, u32 v)const unsigned long offset = (bit %BITS_PER_LONG ) &BIT (5 ); map[index] &= ~(0xFFFFFFFFul << offset); - map[index] |= v << offset; + map[index] |= (unsigned long )v << offset; }static inline int xgpio_regoffset (struct xgpio_instance *chip,int ch)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 132/201 KVM: selftests: Fix target thread to be migrated in rseq_test
In reply to Greg Kroah-HartmanFrom: Gavin Shan <[email protected]>
commit e923b0537d28e15c9d31ce8b38f810b325816903 upstream.
In rseq_test, there are two threads, which are vCPU thread and migration worker separately. Unfortunately, the test has the wrong PID passed to sched_setaffinity() in the migration worker. It forces migration on the migration worker because zeroed PID represents the calling thread, which is the migration worker itself. It means the vCPU thread is never enforced to migration and it can migrate at any time, which eventually leads to failure as the following logs show.
host# uname -r
5.19.0-rc6-gavin+
host# # cat /proc/cpuinfo | grep processor | tail -n 1
processor : 223
host# pwd /home/gavin/sandbox/linux.main/tools/testing/selftests/kvm
host# for i in `seq 1 100`; do \
echo "--------> $i"; ./rseq_test; done
--------> 1
--------> 2
--------> 3
--------> 4
--------> 5
--------> 6
==== Test Assertion Failure ====
rseq_test.c:265: rseq_cpu == cpu
pid=3925 tid=3925 errno=4 - Interrupted system call
1 0x0000000000401963: main at rseq_test.c:265 (discriminator 2)
2 0x0000ffffb044affb: ?? ??:0
3 0x0000ffffb044b0c7: ?? ??:0
4 0x0000000000401a6f: _start at ??:?
rseq CPU = 4, sched CPU = 27Fix the issue by passing correct parameter, TID of the vCPU thread, to sched_setaffinity() in the migration worker.
Message-Id: <[email protected]>
--- tools/testing/selftests/kvm/rseq_test.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
tools/testing/selftests/kvm/rseq_test.c +5 -3
@@ -82,8 +82,9 @@ static int next_cpu(int cpu)return cpu; } -static void *migration_worker (void *ign) +static void *migration_worker (void *__rseq_tid) { +pid_t rseq_tid = (pid_t )(unsigned long )__rseq_tid;cpu_set_t allowed_mask;int r, i, cpu;
@@ -106,7 +107,7 @@ static void *migration_worker(void *ign)* stable, i.e. while changing affinity is in-progress. */ smp_wmb (); - r =sched_setaffinity (0 ,sizeof (allowed_mask), &allowed_mask); + r =sched_setaffinity (rseq_tid,sizeof (allowed_mask), &allowed_mask);TEST_ASSERT (!r,"sched_setaffinity failed, errno = %d (%s)" , errno,strerror (errno));smp_wmb ();
@@ -231,7 +232,8 @@ int main(int argc, char *argv[]) vm =vm_create_default (VCPU_ID ,0 , guest_code);ucall_init (vm,NULL ); -pthread_create (&migration_thread,NULL , migration_worker,0 ); +pthread_create (&migration_thread,NULL , migration_worker, + (void *)(unsigned long )gettid ());for (i =0 ; !done; i++) {vcpu_run (vm,VCPU_ID );
Signature · 1 line
2.37.1
Greg Kroah-Hartman
maintainerPATCH 133/201 spi: bcm2835: bcm2835_spi_handle_err(): fix NULL pointer deref for non DMA transfers
In reply to Greg Kroah-HartmanFrom: Marc Kleine-Budde <[email protected]>
commit 4ceaa684459d414992acbefb4e4c31f2dfc50641 upstream.
In case a IRQ based transfer times out the bcm2835_spi_handle_err() function is called. Since commit 1513ceee70f2 ("spi: bcm2835: Drop dma_pending flag") the TX and RX DMA transfers are unconditionally canceled, leading to NULL pointer derefs if ctlr->dma_tx or ctlr->dma_rx are not set.
Fix the NULL pointer deref by checking that ctlr->dma_tx and ctlr->dma_rx are valid pointers before accessing them.
--- drivers/spi/spi-bcm2835.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/spi/spi-bcm2835.c +8 -4
@@ -1138,10 +1138,14 @@ static void bcm2835_spi_handle_err(strucstruct bcm2835_spi *bs =spi_controller_get_devdata (ctlr);/* if an error occurred and we have an active dma, then terminate */ -dmaengine_terminate_sync (ctlr->dma_tx); - bs->tx_dma_active = false; -dmaengine_terminate_sync (ctlr->dma_rx); - bs->rx_dma_active = false; +if (ctlr->dma_tx) { +dmaengine_terminate_sync (ctlr->dma_tx); + bs->tx_dma_active = false; + } +if (ctlr->dma_rx) { +dmaengine_terminate_sync (ctlr->dma_rx); + bs->rx_dma_active = false; + }bcm2835_spi_undo_prologue (bs);/* and reset */
Greg Kroah-Hartman
maintainerPATCH 134/201 KVM: Dont null dereference ops->destroy
In reply to Greg Kroah-HartmanFrom: Alexey Kardashevskiy <[email protected]>
commit e8bc2427018826e02add7b0ed0fc625a60390ae5 upstream.
A KVM device cleanup happens in either of two callbacks:
1) destroy() which is called when the VM is being destroyed;
2) release() which is called when a device fd is closed.
Most KVM devices use 1) but Book3s's interrupt controller KVM devices (XICS, XIVE, XIVE-native) use 2) as they need to close and reopen during the machine execution. The error handling in kvm_ioctl_create_device() assumes destroy() is always defined which leads to NULL dereference as discovered by Syzkaller.
This adds a checks for destroy!=NULL and adds a missing release().
This is not changing kvm_destroy_devices() as devices with defined release() should have been removed from the KVM devices list by then.
--- virt/kvm/kvm_main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
virt/kvm/kvm_main.c +4 -1
@@ -4172,8 +4172,11 @@ static int kvm_ioctl_create_device(struckvm_put_kvm_no_destroy (kvm);mutex_lock (&kvm->lock);list_del (&dev->vm_node); +if (ops->release) + ops->release (dev);mutex_unlock (&kvm->lock); - ops->destroy (dev); +if (ops->destroy) + ops->destroy (dev);return ret; }