6.1.43-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 6.1.43-rc1 review
This is the start of the stable review cycle for the 6.1.43 release. There are 228 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 Thu, 03 Aug 2023 09:18:38 +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/v6.x/stable-review/patch-6.1.43-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-6.1.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.1.43-rc1
Dan Carpenter <[email protected]>
dma-buf: fix an error pointer vs NULL bug
Christian König <[email protected]>
dma-buf: keep the signaling time of merged fences v3
Mirsad Goran Todorovac <[email protected]>
test_firmware: return ENOMEM instead of ENOSPC on failed memory allocation
Matthieu Baerts <[email protected]>
selftests: mptcp: sockopt: use 'iptables-legacy' if available
Paolo Abeni <[email protected]>
mptcp: ensure subflow is unhashed before cleaning the backlog
Rafael J. Wysocki <[email protected]>
cpufreq: intel_pstate: Drop ACPI _PSS states table patching
Rafael J. Wysocki <[email protected]>
ACPI: processor: perflib: Avoid updating frequency QoS unnecessarily
Rafael J. Wysocki <[email protected]>
ACPI: processor: perflib: Use the "no limit" frequency QoS
Benjamin Cheng <[email protected]>
drm/amd/display: Write to correct dirty_rect
Hamza Mahfooz <[email protected]>
drm/amd/display: perform a bounds check before filling dirty rectangles
Steven Rostedt (Google) <[email protected]>
tracing: Fix trace_event_raw_event_synth() if else statement
Dmytro Laktyushkin <[email protected]>
drm/amd/display: set per pipe dppclk to 0 when dpp is off
Ilya Dryomov <[email protected]>
rbd: retrieve and check lock owner twice before blocklisting
Ilya Dryomov <[email protected]>
rbd: harden get_lock_owner_info() a bit
Ilya Dryomov <[email protected]>
rbd: make get_lock_owner_info() return a single locker or NULL
Joe Thornber <[email protected]>
dm cache policy smq: ensure IO doesn't prevent cleaner policy progress
Radhakrishna Sripada <[email protected]>
drm/i915/dpt: Use shmem for dpt objects
Xiubo Li <[email protected]>
ceph: never send metrics if disable_send_metrics is set
Johan Hovold <[email protected]>
PM: sleep: wakeirq: fix wake irq arming
Mark Brown <[email protected]>
arm64/sme: Set new vector length before reallocating
Mark Brown <[email protected]>
ASoC: wm8904: Fill the cache for WM8904_ADC_TEST_0 register
Stefan Haberland <[email protected]>
s390/dasd: print copy pair message only for the correct error
Stefan Haberland <[email protected]>
s390/dasd: fix hanging device after quiesce/resume
Chenguang Zhao <[email protected]>
LoongArch: BPF: Enable bpf_probe_read{, str}() on LoongArch
Tiezhu Yang <[email protected]>
LoongArch: BPF: Fix check condition to call lu32id in move_imm()
Andy Shevchenko <[email protected]>
Revert "um: Use swap() to make code cleaner"
Johan Hovold <[email protected]>
soundwire: fix enumeration completion
Matthieu Baerts <[email protected]>
selftests: mptcp: join: only check for ip6tables if needed
Sean Christopherson <[email protected]>
selftests/rseq: Play nice with binaries statically linked against glibc 2.35+
Christian Marangi <[email protected]>
net: dsa: qca8k: fix mdb add/del case with 0 VID
Christian Marangi <[email protected]>
net: dsa: qca8k: fix broken search_and_del
Christian Marangi <[email protected]>
net: dsa: qca8k: fix search_and_insert wrong handling of new rule
Jason Wang <[email protected]>
virtio-net: fix race between set queues and probe
Demi Marie Obenour <[email protected]>
xen: speed up grant-table reclaim
Dan Carpenter <[email protected]>
proc/vmcore: fix signedness bug in read_from_oldmem()
Peter Zijlstra <[email protected]>
locking/rtmutex: Fix task->pi_waiters integrity
Marc Zyngier <[email protected]>
irqchip/gic-v4.1: Properly lock VPEs when doing a directLPI invalidation
Jonas Gorski <[email protected]>
irq-bcm6345-l1: Do not assume a fixed block to cpu mapping
Alexander Steffen <[email protected]>
tpm_tis: Explicitly check for error code
Guanghui Feng <[email protected]>
ACPI/IORT: Remove erroneous id_count check in iort_node_get_rmr_info()
Trond Myklebust <[email protected]>
nfsd: Remove incorrect check in nfsd4_validate_stateid
Christian Brauner <[email protected]>
file: always lock position for FMODE_ATOMIC_POS
Yazen Ghannam <[email protected]>
x86/MCE/AMD: Decrement threshold_bank refcount when removing threshold blocks
Filipe Manana <[email protected]>
btrfs: check for commit error at btrfs_attach_transaction_barrier()
Filipe Manana <[email protected]>
btrfs: check if the transaction was aborted at btrfs_wait_for_commit()
Filipe Manana <[email protected]>
btrfs: account block group tree when calculating global reserve size
Gilles Buloz <[email protected]>
hwmon: (nct7802) Fix for temp6 (PECI1) processed even if PECI1 disabled
Baskaran Kannan <[email protected]>
hwmon: (k10temp) Enable AMD3255 Proc to show negative temperature
Luka Guzenko <[email protected]>
ALSA: hda/relatek: Enable Mute LED on HP 250 G8
Pavel Asyutchenko <[email protected]>
ALSA: hda/realtek: Support ASUS G713PV laptop
Oliver Neukum <[email protected]>
Revert "xhci: add quirk for host controllers that don't update endpoint DCS"
Chaoyuan Peng <[email protected]>
tty: n_gsm: fix UAF in gsm_cleanup_mux
Zhang Shurong <[email protected]>
staging: ks7010: potential buffer overflow in ks_wlan_set_encode_ext()
Larry Finger <[email protected]>
staging: r8712: Fix memory leak in _r8712_init_xmit_priv()
Greg Kroah-Hartman <[email protected]>
Documentation: security-bugs.rst: clarify CVE handling
Greg Kroah-Hartman <[email protected]>
Documentation: security-bugs.rst: update preferences when dealing with the linux-distros group
Dan Carpenter <[email protected]>
Revert "usb: xhci: tegra: Fix error check"
Ricardo Ribalda <[email protected]>
usb: xhci-mtk: set the dma max_seg_size
Frank Li <[email protected]>
usb: cdns3: fix incorrect calculation of ep_buf_size when more than one config
Łukasz Bartosik <[email protected]>
USB: quirks: add quirk for Focusrite Scarlett
Guiting Shen <[email protected]>
usb: ohci-at91: Fix the unhandle interrupt when resume
Xu Yang <[email protected]>
usb: misc: ehset: fix wrong if condition
Jisheng Zhang <[email protected]>
usb: dwc3: don't reset device side if dwc3 was configured as host-only
Gratian Crisan <[email protected]>
usb: dwc3: pci: skip BYT GPIO lookup table for hardwired phy
Jakub Vanek <[email protected]>
Revert "usb: dwc3: core: Enable AutoRetry feature in the controller"
Kyle Tso <[email protected]>
usb: typec: Use sysfs_emit_at when concatenating the string
Kyle Tso <[email protected]>
usb: typec: Iterate pds array when showing the pd list
Kyle Tso <[email protected]>
usb: typec: Set port->pd before adding device for typec_port
Marc Kleine-Budde <[email protected]>
can: gs_usb: gs_can_close(): add missing set of CAN state to CAN_STATE_STOPPED
Johan Hovold <[email protected]>
USB: serial: simple: sort driver entries
Oliver Neukum <[email protected]>
USB: serial: simple: add Kaufmann RKS+CAN VCP
Mohsen Tahmasebi <[email protected]>
USB: serial: option: add Quectel EC200A module support
Jerry Meng <[email protected]>
USB: serial: option: support Quectel EM060K_128
Samuel Holland <[email protected]>
serial: sifive: Fix sifive_serial_console_setup() section
Ruihong Luo <[email protected]>
serial: 8250_dw: Preserve original value of DLF register
Johan Hovold <[email protected]>
serial: qcom-geni: drop bogus runtime pm state update
Sean Christopherson <[email protected]>
KVM: x86: Disallow KVM_SET_SREGS{2} if incoming CR0 is invalid
Sean Christopherson <[email protected]>
KVM: VMX: Don't fudge CR0 and CR4 for restricted L2 guest
Sean Christopherson <[email protected]>
KVM: Grab a reference to KVM for VM and vCPU stats file descriptors
Michael Grzeschik <[email protected]>
usb: gadget: core: remove unbalanced mutex_unlock in usb_gadget_activate
Zqiang <[email protected]>
USB: gadget: Fix the memory leak in raw_gadget driver
Frank Li <[email protected]>
usb: gadget: call usb_gadget_check_config() to verify UDC capability
Dan Carpenter <[email protected]>
Revert "usb: gadget: tegra-xudc: Fix error check in tegra_xudc_powerdomain_init()"
Zheng Yejian <[email protected]>
tracing: Fix warning in trace_buffered_event_disable()
Zheng Yejian <[email protected]>
ring-buffer: Fix wrong stat of cpu_buffer->read
Arnd Bergmann <[email protected]>
ata: pata_ns87415: mark ns87560_tf_read static
Ming Lei <[email protected]>
ublk: fail to recover device if queue setup is interrupted
Ming Lei <[email protected]>
ublk: fail to start device if queue setup is interrupted
Ming Lei <[email protected]>
ublk_drv: move ublk_get_device_from_id into ublk_ctrl_uring_cmd
Rob Clark <[email protected]>
drm/msm: Disallow submit with fence id 0
Rob Clark <[email protected]>
drm/msm: Switch idr_lock to spinlock
Sindhu Devale <[email protected]>
RDMA/irdma: Report correct WC error
Sindhu Devale <[email protected]>
RDMA/irdma: Fix op_type reporting in CQEs
Dan Carpenter <[email protected]>
drm/amd/display: Unlock on error path in dm_handle_mst_sideband_msg_ready_event()
Mario Limonciello <[email protected]>
drm/amd: Fix an error handling mistake in psp_sw_init()
Yu Kuai <[email protected]>
dm raid: protect md_stop() with 'reconfig_mutex'
Yu Kuai <[email protected]>
dm raid: clean up four equivalent goto tags in raid_ctr()
Yu Kuai <[email protected]>
dm raid: fix missing reconfig_mutex unlock in raid_ctr() error paths
Stefano Stabellini <[email protected]>
xenbus: check xen_domain in xenbus_probe_initcall
Christophe JAILLET <[email protected]>
drm/i915: Fix an error handling path in igt_write_huge()
Steve French <[email protected]>
smb3: do not set NTLMSSP_VERSION flag for negotiate not auth request
Bart Van Assche <[email protected]>
block: Fix a source code comment in include/uapi/linux/blkzoned.h
Matus Gajdos <[email protected]>
ASoC: fsl_spdif: Silence output on stop
Breno Leitao <[email protected]>
cxl/acpi: Return 'rc' instead of '0' in cxl_parse_cfmws()
Breno Leitao <[email protected]>
cxl/acpi: Fix a use-after-free in cxl_parse_cfmws()
Gaosheng Cui <[email protected]>
drm/msm: Fix IS_ERR_OR_NULL() vs NULL check in a5xx_submit_in_rb()
Kashyap Desai <[email protected]>
RDMA/bnxt_re: Prevent handling any completions after qp destroy
Thomas Bogendoerfer <[email protected]>
RDMA/mthca: Fix crash when polling CQ for shared QPs
Shiraz Saleem <[email protected]>
RDMA/irdma: Fix data race on CQP request done
Shiraz Saleem <[email protected]>
RDMA/irdma: Fix data race on CQP completion stats
Shiraz Saleem <[email protected]>
RDMA/irdma: Add missing read barriers
Rob Clark <[email protected]>
drm/msm/adreno: Fix snapshot BINDLESS_DATA size
Dmitry Baryshkov <[email protected]>
drm/msm/dpu: drop enum dpu_core_perf_data_bus_id
Dan Carpenter <[email protected]>
RDMA/mlx4: Make check for invalid flags stricter
Fedor Pchelkin <[email protected]>
tipc: stop tipc crypto on failure in tipc_node_create
Yuanjun Gong <[email protected]>
tipc: check return value of pskb_trim()
Yuanjun Gong <[email protected]>
benet: fix return value check in be_lancer_xmit_workarounds()
Lin Ma <[email protected]>
net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64
Vladimir Oltean <[email protected]>
net/sched: mqprio: add extack to mqprio_parse_nlattr()
Vladimir Oltean <[email protected]>
net/sched: mqprio: refactor nlattr parsing to a separate function
Linus Torvalds <[email protected]>
mm: suppress mm fault logging if fatal signal already pending
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: disallow rule addition to bound chain via NFTA_RULE_CHAIN_ID
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: skip immediate deactivate in _PREPARE_ERROR
Florian Westphal <[email protected]>
netfilter: nft_set_rbtree: fix overlap expiration walk
Muhammad Husaini Zulkifli <[email protected]>
igc: Fix Kernel Panic during ndo_tx_timeout callback
Kirill A. Shutemov <[email protected]>
x86/traps: Fix load_unaligned_zeropad() handling for shared TDX memory
Maxim Mikityanskiy <[email protected]>
platform/x86: msi-laptop: Fix rfkill out-of-sync on MSI Wind U100
Vincent Whitchurch <[email protected]>
net: stmmac: Apply redundant write work around on 4.xx too
Suman Ghosh <[email protected]>
octeontx2-af: Fix hash extraction enable configuration
Sunil Goutham <[email protected]>
octeontx2-af: Removed unnecessary debug messages.
Hangbin Liu <[email protected]>
team: reset team's flags when down link is P2P device
Hangbin Liu <[email protected]>
bonding: reset bond's flags when down link is P2P device
Jedrzej Jagielski <[email protected]>
ice: Fix memory management in ice_ethtool_fdir.c
Stewart Smith <[email protected]>
tcp: Reduce chance of collisions in inet6_hashfn().
Maciej Żenczykowski <[email protected]>
ipv6 addrconf: fix bug where deleting a mngtmpaddr can create a new temporary address
Yuanjun Gong <[email protected]>
ethernet: atheros: fix return value check in atl1e_tso_csum()
Yuanjun Gong <[email protected]>
atheros: fix return value check in atl1_tso()
Harshit Mogalapalli <[email protected]>
phy: hisilicon: Fix an out of bounds check in hisi_inno_phy_probe()
Jiri Benc <[email protected]>
vxlan: fix GRO with VXLAN-GPE
Jiri Benc <[email protected]>
vxlan: generalize vxlan_parse_gpe_hdr and remove unused args
Jiri Benc <[email protected]>
vxlan: calculate correct header length for GPE
Jijie Shao <[email protected]>
net: hns3: fix wrong bw weight of disabled tc issue
Jijie Shao <[email protected]>
net: hns3: fix wrong tc bandwidth weight data issue
Hao Lan <[email protected]>
net: hns3: fix the imp capability bit cannot exceed 32 bits issue
Jiawen Wu <[email protected]>
net: phy: marvell10g: fix 88x3310 power up
Jacob Keller <[email protected]>
iavf: check for removal state before IAVF_FLAG_PF_COMMS_FAILED
Jacob Keller <[email protected]>
iavf: fix potential deadlock on allocation failure
Wang Ming <[email protected]>
i40e: Fix an NULL vs IS_ERR() bug for debugfs_create_dir()
Nicolas Dufresne <[email protected]>
media: amphion: Fix firmware path to match linux-firmware
Sakari Ailus <[email protected]>
media: staging: atomisp: select V4L2_FWNODE
Srinivas Kandagatla <[email protected]>
soundwire: qcom: update status correctly with mask
Adrien Thierry <[email protected]>
phy: qcom-snps-femto-v2: properly enable ref clock
Adrien Thierry <[email protected]>
phy: qcom-snps-femto-v2: keep cfg_ahb_clk enabled during runtime suspend
Krzysztof Kozlowski <[email protected]>
phy: qcom-snps: correct struct qcom_snps_hsphy kerneldoc
Dan Carpenter <[email protected]>
phy: phy-mtk-dp: Fix an error code in probe()
Zhang Yi <[email protected]>
jbd2: fix a race when checking checkpoint buffer busy
Zhang Yi <[email protected]>
jbd2: remove journal_clean_one_cp_list()
Zhang Yi <[email protected]>
jbd2: remove t_checkpoint_io_list
Daniel Miess <[email protected]>
drm/amd/display: Prevent vtotal from being set to 0
Daniel Miess <[email protected]>
drm/amd/display: Fix possible underflow for displays with large vblank
Gabe Teeger <[email protected]>
drm/amd/display: update extended blank for dcn314 onwards
Rodrigo Siqueira <[email protected]>
drm/amd/display: Add FAMS validation before trying to use it
Randy Dunlap <[email protected]>
drm/amd/display: fix dc/core/dc.c kernel-doc
Rodrigo Siqueira <[email protected]>
drm/amd/display: Rework comments on dc file
Liam R. Howlett <[email protected]>
maple_tree: fix 32 bit mas_next testing
Liam R. Howlett <[email protected]>
maple_tree: add __init and __exit to test module
Liam R. Howlett <[email protected]>
test_maple_tree: test modifications while iterating
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails
Masami Hiramatsu (Google) <[email protected]>
Revert "tracing: Add "(fault)" name injection to kernel probes"
Steven Rostedt (Google) <[email protected]>
tracing: Allow synthetic events to pass around stacktraces
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Fix to avoid double count of the string length on the array
Masami Hiramatsu (Google) <[email protected]>
tracing/probes: Add symstr type for dynamic events
Paolo Abeni <[email protected]>
mptcp: do not rely on implicit state check in mptcp_listen()
Menglong Dong <[email protected]>
mptcp: introduce 'sk' to replace 'sock->sk' in mptcp_listen()
Oliver Upton <[email protected]>
arm64: errata: Mitigate Ampere1 erratum AC03_CPU_38 at stage-2
Oliver Upton <[email protected]>
KVM: arm64: Condition HW AF updates on config option
Christian König <[email protected]>
drm/ttm: never consider pinned BOs for eviction&swap
Hui Li <[email protected]>
tty: fix hang on tty device with no_room set
Ilpo Järvinen <[email protected]>
n_tty: Rename tail to old_tail in n_tty_read()
Thomas Hellström <[email protected]>
drm/ttm: Don't leak a resource on eviction error
Thomas Hellström <[email protected]>
drm/ttm: Don't print error message if eviction was interrupted
Mario Limonciello <[email protected]>
drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix
Mario Limonciello <[email protected]>
drm/amd/display: Set minimum requirement for using PSR-SU on Rembrandt
Cruise Hung <[email protected]>
drm/amd/display: Update correct DCN314 register header
Dmytro Laktyushkin <[email protected]>
drm/amd/display: fix dcn315 single stream crb allocation
Dmytro Laktyushkin <[email protected]>
drm/amd/display: add pixel rate based CRB allocation support
Dmytro Laktyushkin <[email protected]>
drm/amd/display: fix unbounded requesting for high pixel rate modes on dcn315
Dmytro Laktyushkin <[email protected]>
drm/amd/display: use low clocks for no plane configs
Samson Tam <[email protected]>
drm/amd/display: add ODM case when looking for first split pipe
Alvin Lee <[email protected]>
drm/amd/display: Use min transition for all SubVP plane add/remove
Rodrigo Siqueira <[email protected]>
drm/amd/display: Include surface of unaffected streams
Rodrigo Siqueira <[email protected]>
drm/amd/display: Copy DC context in the commit streams
Rodrigo Siqueira <[email protected]>
drm/amd/display: Enable new commit sequence only for DCN32x
Rodrigo Siqueira <[email protected]>
drm/amd/display: Rework context change check
Rodrigo Siqueira <[email protected]>
drm/amd/display: Check if link state is valid
Hamza Mahfooz <[email protected]>
drm/amd/display: add FB_DAMAGE_CLIPS support
Rick Wertenbroek <[email protected]>
PCI: rockchip: Don't advertise MSI-X in PCIe capabilities
Rick Wertenbroek <[email protected]>
PCI: rockchip: Fix window mapping and address translation for endpoint
Rick Wertenbroek <[email protected]>
PCI: rockchip: Remove writes to unused registers
Ilpo Järvinen <[email protected]>
PCI/ASPM: Avoid link retraining race
Ilpo Järvinen <[email protected]>
PCI/ASPM: Factor out pcie_wait_for_retrain()
Bjorn Helgaas <[email protected]>
PCI/ASPM: Return 0 or -ETIMEDOUT from pcie_retrain_link()
Huacai Chen <[email protected]>
MIPS: Loongson: Fix build error when make modules_install
Jiaxun Yang <[email protected]>
MIPS: Loongson: Move arch cflags to MIPS top level Makefile
Christophe JAILLET <[email protected]>
i2c: nomadik: Remove a useless call in the remove function
Andi Shyti <[email protected]>
i2c: nomadik: Use devm_clk_get_enabled()
Andi Shyti <[email protected]>
i2c: nomadik: Remove unnecessary goto label
Markus Elfring <[email protected]>
i2c: Improve size determinations
Markus Elfring <[email protected]>
i2c: Delete error messages for failed memory allocations
Chao Yu <[email protected]>
f2fs: don't reset unchangable mount option in f2fs_remount()
Yangtao Li <[email protected]>
f2fs: fix to set flush_merge opt and show noflush_merge
Filipe Manana <[email protected]>
btrfs: fix race between quota disable and relocation
Bartosz Golaszewski <[email protected]>
gpio: mvebu: fix irq domain leak
Uwe Kleine-König <[email protected]>
gpio: mvebu: Make use of devm_pwmchip_add
Hans de Goede <[email protected]>
gpio: tps68470: Make tps68470_gpio_output() always set the initial value
Ondrej Mosnacek <[email protected]>
io_uring: don't audit the capability check in io_uring_create()
Claudio Imbrenda <[email protected]>
KVM: s390: pv: fix index value of replaced ASCE
Haren Myneni <[email protected]>
powerpc/pseries/vas: Hold mmap_mutex after mmap lock during window close
Ross Lagerwall <[email protected]>
blk-mq: Fix stall due to recursive flush plug
Zhihao Cheng <[email protected]>
jbd2: Fix wrongly judgement for buffer head removing while doing checkpoint
Mario Limonciello <[email protected]>
drm/amd: Align SMU11 SMU_MSG_OverridePcieParameters implementation with SMU13
Mario Limonciello <[email protected]>
drm/amd: Move helper for dynamic speed switch check out of smu13
Zhihao Cheng <[email protected]>
ovl: fix null pointer dereference in ovl_permission()
Agustin Gutierrez <[email protected]>
drm/amd/display: Keep PHY active for dp config
Shyam Sundar S K <[email protected]>
platform/x86/amd/pmf: reduce verbosity of apmf_get_system_params
Shyam Sundar S K <[email protected]>
platform/x86/amd/pmf: Notify OS power slider update
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: fix underflow in chain reference counter
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: fix underflow in object reference counter
-------------
Diffstat:
Documentation/ABI/testing/sysfs-module | 11 + Documentation/admin-guide/security-bugs.rst | 37 +-- Documentation/arm64/silicon-errata.rst | 3 + Documentation/trace/kprobetrace.rst | 8 +- Makefile | 4 +- arch/arm64/Kconfig | 19 ++ arch/arm64/kernel/cpu_errata.c | 7 + arch/arm64/kernel/fpsimd.c | 4 +- arch/arm64/kvm/hyp/pgtable.c | 16 +- arch/arm64/tools/cpucaps | 1 + arch/loongarch/Kconfig | 1 + arch/loongarch/net/bpf_jit.h | 2 +- arch/mips/Makefile | 34 ++ arch/mips/loongson2ef/Platform | 35 --- arch/mips/loongson64/Platform | 16 - arch/powerpc/platforms/pseries/vas.c | 9 +- arch/s390/mm/gmap.c | 1 + arch/um/os-Linux/sigio.c | 7 +- arch/x86/include/asm/kvm-x86-ops.h | 1 + arch/x86/include/asm/kvm_host.h | 3 +- arch/x86/kernel/cpu/mce/amd.c | 4 +- arch/x86/kernel/traps.c | 18 +- arch/x86/kvm/svm/svm.c | 6 + arch/x86/kvm/vmx/vmx.c | 41 ++- arch/x86/kvm/x86.c | 34 +- block/blk-core.c | 3 +- block/blk-mq.c | 9 +- drivers/acpi/arm64/iort.c | 3 - drivers/acpi/processor_perflib.c | 42 ++- drivers/ata/pata_ns87415.c | 2 +- drivers/base/power/power.h | 1 + drivers/base/power/wakeirq.c | 12 +- drivers/block/rbd.c | 124 +++++--- drivers/block/ublk_drv.c | 145 ++++----- drivers/char/tpm/tpm_tis_core.c | 9 +- drivers/cpufreq/intel_pstate.c | 14 - drivers/cxl/acpi.c | 5 +- drivers/dma-buf/dma-fence-unwrap.c | 26 +- drivers/dma-buf/dma-fence.c | 7 +- drivers/gpio/gpio-mvebu.c | 26 +- drivers/gpio/gpio-tps68470.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 19 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 6 +- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 121 ++++--- .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 +- .../drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c | 4 + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c | 3 +- .../amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c | 5 + drivers/gpu/drm/amd/display/dc/core/dc.c | 348 +++++++++++++-------- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 20 ++ drivers/gpu/drm/amd/display/dc/dc.h | 64 ++-- drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 7 + drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h | 1 + drivers/gpu/drm/amd/display/dc/dc_stream.h | 5 + drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 4 +- drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c | 7 +- .../gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c | 1 + .../drm/amd/display/dc/dcn315/dcn315_resource.c | 110 ++++++- .../gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 23 +- .../gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 49 ++- .../gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h | 4 + .../amd/display/dc/dml/dcn31/display_mode_vba_31.c | 39 ++- .../display/dc/dml/dcn31/display_rq_dlg_calc_31.c | 3 +- .../gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c | 15 +- .../dc/dml/dcn314/display_rq_dlg_calc_314.c | 16 +- .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 19 +- .../drm/amd/display/dc/dml/display_mode_structs.h | 3 +- .../gpu/drm/amd/display/dc/dml/display_mode_vba.c | 6 + drivers/gpu/drm/amd/display/dmub/dmub_srv.h | 2 + drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 2 +- drivers/gpu/drm/amd/display/dmub/src/Makefile | 2 +- drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c | 5 + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h | 2 + drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c | 67 ++++ drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h | 35 +++ drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 12 +- .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 89 ++---- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 21 +- drivers/gpu/drm/drm_syncobj.c | 6 +- drivers/gpu/drm/i915/display/intel_dpt.c | 4 +- drivers/gpu/drm/i915/gem/selftests/huge_pages.c | 6 +- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.h | 2 +- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 13 - drivers/gpu/drm/msm/msm_drv.c | 6 +- drivers/gpu/drm/msm/msm_gem_submit.c | 12 +- drivers/gpu/drm/msm/msm_gpu.h | 2 +- drivers/gpu/drm/msm/msm_submitqueue.c | 2 +- drivers/gpu/drm/ttm/ttm_bo.c | 25 +- drivers/hwmon/k10temp.c | 17 +- drivers/hwmon/nct7802.c | 2 +- drivers/i2c/busses/i2c-ibm_iic.c | 4 +- drivers/i2c/busses/i2c-nomadik.c | 42 +-- drivers/i2c/busses/i2c-sh7760.c | 3 +- drivers/i2c/busses/i2c-tiny-usb.c | 4 +- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 12 + drivers/infiniband/hw/bnxt_re/qplib_fp.c | 18 ++ drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 + drivers/infiniband/hw/irdma/ctrl.c | 31 +- drivers/infiniband/hw/irdma/defs.h | 46 ++- drivers/infiniband/hw/irdma/hw.c | 3 +- drivers/infiniband/hw/irdma/main.h | 2 +- drivers/infiniband/hw/irdma/puda.c | 6 + drivers/infiniband/hw/irdma/type.h | 2 + drivers/infiniband/hw/irdma/uk.c | 5 +- drivers/infiniband/hw/irdma/utils.c | 8 +- drivers/infiniband/hw/mlx4/qp.c | 18 +- drivers/infiniband/hw/mthca/mthca_qp.c | 2 +- drivers/irqchip/irq-bcm6345-l1.c | 14 +- drivers/irqchip/irq-gic-v3-its.c | 75 +++-- drivers/md/dm-cache-policy-smq.c | 28 +- drivers/md/dm-raid.c | 20 +- drivers/md/md.c | 2 + drivers/media/platform/amphion/vpu_core.c | 4 +- drivers/net/bonding/bond_main.c | 5 + drivers/net/can/usb/gs_usb.c | 2 + drivers/net/dsa/qca/qca8k-common.c | 19 +- drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 7 +- drivers/net/ethernet/atheros/atlx/atl1.c | 7 +- drivers/net/ethernet/emulex/benet/be_main.c | 3 +- drivers/net/ethernet/hisilicon/hns3/hnae3.h | 3 +- .../hisilicon/hns3/hns3_common/hclge_comm_cmd.c | 21 +- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | 17 +- .../ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c | 3 +- .../net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 3 +- drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +- drivers/net/ethernet/intel/iavf/iavf_main.c | 11 +- drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c | 26 +- drivers/net/ethernet/intel/igc/igc_main.c | 40 ++- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- .../ethernet/marvell/octeontx2/af/rvu_npc_hash.c | 59 +++- .../ethernet/marvell/octeontx2/af/rvu_npc_hash.h | 8 +- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 4 +- drivers/net/phy/marvell10g.c | 7 + drivers/net/team/team.c | 9 + drivers/net/virtio_net.c | 4 +- drivers/net/vxlan/vxlan_core.c | 165 ++++++---- drivers/pci/controller/pcie-rockchip-ep.c | 156 +++++---- drivers/pci/controller/pcie-rockchip.h | 40 ++- drivers/pci/pcie/aspm.c | 55 ++-- drivers/phy/hisilicon/phy-hisi-inno-usb2.c | 2 +- drivers/phy/mediatek/phy-mtk-dp.c | 2 +- drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c | 74 +++-- drivers/platform/x86/amd/pmf/acpi.c | 23 +- drivers/platform/x86/amd/pmf/core.c | 9 +- drivers/platform/x86/amd/pmf/pmf.h | 16 + drivers/platform/x86/amd/pmf/sps.c | 74 ++++- drivers/platform/x86/msi-laptop.c | 8 +- drivers/s390/block/dasd_3990_erp.c | 2 +- drivers/s390/block/dasd_ioctl.c | 1 + drivers/soundwire/bus.c | 8 +- drivers/soundwire/qcom.c | 2 +- drivers/staging/ks7010/ks_wlan_net.c | 6 +- drivers/staging/media/atomisp/Kconfig | 1 + drivers/staging/rtl8712/rtl871x_xmit.c | 43 ++- drivers/staging/rtl8712/xmit_linux.c | 6 + drivers/tty/n_gsm.c | 4 +- drivers/tty/n_tty.c | 29 +- drivers/tty/serial/8250/8250_dwlib.c | 6 +- drivers/tty/serial/qcom_geni_serial.c | 7 - drivers/tty/serial/sifive.c | 2 +- drivers/usb/cdns3/cdns3-gadget.c | 4 +- drivers/usb/core/quirks.c | 4 + drivers/usb/dwc3/core.c | 20 +- drivers/usb/dwc3/core.h | 3 - drivers/usb/dwc3/dwc3-pci.c | 6 +- drivers/usb/gadget/composite.c | 4 + drivers/usb/gadget/legacy/raw_gadget.c | 12 +- drivers/usb/gadget/udc/core.c | 1 - drivers/usb/gadget/udc/tegra-xudc.c | 8 +- drivers/usb/host/ohci-at91.c | 8 +- drivers/usb/host/xhci-mtk.c | 1 + drivers/usb/host/xhci-pci.c | 4 +- drivers/usb/host/xhci-ring.c | 25 +- drivers/usb/host/xhci-tegra.c | 8 +- drivers/usb/misc/ehset.c | 8 +- drivers/usb/serial/option.c | 6 + drivers/usb/serial/usb-serial-simple.c | 73 +++-- drivers/usb/typec/class.c | 15 +- drivers/xen/grant-table.c | 40 ++- drivers/xen/xenbus/xenbus_probe.c | 3 + fs/btrfs/block-rsv.c | 5 + fs/btrfs/qgroup.c | 18 +- fs/btrfs/transaction.c | 10 +- fs/ceph/metric.c | 2 +- fs/f2fs/super.c | 43 ++- fs/file.c | 6 +- fs/jbd2/checkpoint.c | 197 +++++------- fs/jbd2/commit.c | 3 +- fs/jbd2/transaction.c | 17 +- fs/nfsd/nfs4state.c | 2 - fs/overlayfs/inode.c | 5 +- fs/proc/vmcore.c | 2 +- fs/smb/client/sess.c | 4 +- include/linux/dma-fence.h | 2 +- include/linux/jbd2.h | 7 +- include/net/ipv6.h | 8 +- include/net/vxlan.h | 13 +- include/trace/events/jbd2.h | 12 +- include/uapi/linux/blkzoned.h | 10 +- io_uring/io_uring.c | 2 +- kernel/locking/rtmutex.c | 172 ++++++---- kernel/locking/rtmutex_api.c | 2 +- kernel/locking/rtmutex_common.h | 47 ++- kernel/locking/ww_mutex.h | 12 +- kernel/signal.c | 4 + kernel/trace/ring_buffer.c | 22 +- kernel/trace/trace.c | 2 +- kernel/trace/trace.h | 6 + kernel/trace/trace_events.c | 14 +- kernel/trace/trace_events_hist.c | 7 +- kernel/trace/trace_events_synth.c | 80 ++++- kernel/trace/trace_probe.c | 46 ++- kernel/trace/trace_probe.h | 16 +- kernel/trace/trace_probe_kernel.h | 30 +- kernel/trace/trace_probe_tmpl.h | 59 +++- kernel/trace/trace_synth.h | 1 + kernel/trace/trace_uprobe.c | 3 +- lib/test_firmware.c | 12 +- lib/test_maple_tree.c | 233 +++++++++----- net/ceph/messenger.c | 1 + net/ipv6/addrconf.c | 14 +- net/mptcp/protocol.c | 20 +- net/netfilter/nf_tables_api.c | 18 +- net/netfilter/nft_immediate.c | 27 +- net/netfilter/nft_set_rbtree.c | 20 +- net/sched/sch_mqprio.c | 144 ++++++--- net/tipc/crypto.c | 3 +- net/tipc/node.c | 2 +- sound/pci/hda/patch_realtek.c | 2 + sound/soc/codecs/wm8904.c | 3 + sound/soc/fsl/fsl_spdif.c | 2 + tools/testing/radix-tree/linux/init.h | 1 + tools/testing/radix-tree/maple.c | 143 ++++----- tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 +- tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 24 +- tools/testing/selftests/rseq/rseq.c | 28 +- virt/kvm/kvm_main.c | 24 ++ 239 files changed, 3289 insertions(+), 1930 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/228 netfilter: nf_tables: fix underflow in object reference counter
From: Pablo Neira Ayuso <[email protected]>
commit d6b478666ffa6d2c25386d78bf1c4640d4da305e upstream.
Since ("netfilter: nf_tables: drop map element references from preparation phase"), integration with commit protocol is better, therefore drop the workaround that b91d90368837 ("netfilter: nf_tables:
fix leaking object reference count") provides.
--- net/netfilter/nf_tables_api.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
net/netfilter/nf_tables_api.c +5 -8
@@ -6504,19 +6504,19 @@ static int nft_add_set_elem(struct nft_cif (flags) *nft_set_ext_flags (ext) = flags; +if (obj) { + *nft_set_ext_obj (ext) = obj; + obj->use++; + }if (ulen >0 ) {if (nft_set_ext_check (&tmpl,NFT_SET_EXT_USERDATA , ulen) <0 ) { err = -EINVAL ; - goto err_elem_userdata; + goto err_elem_free; } udata =nft_set_ext_userdata (ext); udata->len = ulen -1 ;nla_memcpy (&udata->data, nla[NFTA_SET_ELEM_USERDATA ], ulen); } -if (obj) { - *nft_set_ext_obj (ext) = obj; - obj->use++; - } err =nft_set_elem_expr_setup (ctx, &tmpl, ext, expr_array, num_exprs);if (err <0 ) goto err_elem_free;
@@ -6571,9 +6571,6 @@ err_set_full: err_element_clash:kfree (trans); err_elem_free: -if (obj) - obj->use--; -err_elem_userdata:nft_set_elem_destroy (set, elem.priv, true); err_parse_data:if (nla[NFTA_SET_ELEM_DATA ] !=NULL )
Greg Kroah-Hartman
maintainerPATCH 2/228 netfilter: nf_tables: fix underflow in chain reference counter
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
commit b389139f12f287b8ed2e2628b72df89a081f0b59 upstream.
Set element addition error path decrements reference counter on chains
twice: once on element release and again via nft_data_release().
Then, d6b478666ffa ("netfilter: nf_tables: fix underflow in object reference counter") incorrectly fixed this by removing the stateful object reference count decrement.
Restore the stateful object decrement as in b91d90368837 ("netfilter:nf_tables: fix leaking object reference count") and let nft_data_release() decrement the chain reference counter, so this is done only once.
--- net/netfilter/nf_tables_api.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +3 -1
@@ -6571,7 +6571,9 @@ err_set_full: err_element_clash:kfree (trans); err_elem_free: -nft_set_elem_destroy (set, elem.priv, true); +nf_tables_set_elem_destroy (ctx, set, elem.priv); +if (obj) + obj->use--; err_parse_data:if (nla[NFTA_SET_ELEM_DATA ] !=NULL )nft_data_release (&elem.data.val, desc.type);
Greg Kroah-Hartman
maintainerPATCH 3/228 platform/x86/amd/pmf: Notify OS power slider update
In reply to Greg Kroah-HartmanFrom: Shyam Sundar S K <[email protected]>
commit 33c9ab5b493a0e922b06c12fed4fdcb862212cda upstream.
APMF fn8 can notify EC about the OS slider position change. Add this capability to the PMF driver so that it can call the APMF fn8 based on the changes in the Platform profile events.
--- drivers/platform/x86/amd/pmf/acpi.c | 21 ++++++++++ drivers/platform/x86/amd/pmf/core.c | 9 +++- drivers/platform/x86/amd/pmf/pmf.h | 16 +++++++ drivers/platform/x86/amd/pmf/sps.c | 74 ++++++++++++++++++++++++++++++++++-- 4 files changed, 114 insertions(+), 6 deletions(-)
drivers/platform/x86/amd/pmf/acpi.c +21 -0
@@ -106,6 +106,27 @@ int apmf_get_static_slider_granular(stru data, sizeof(*data)); } +int apmf_os_power_slider_update (struct amd_pmf_dev *pdev,u8 event) +{ +struct os_power_slider args; +struct acpi_buffer params; +union acpi_object *info; +int err =0 ; + + args.size =sizeof (args); + args.slider_event = event; + + params.length =sizeof (args); + params.pointer = (void *)&args; + + info =apmf_if_call (pdev,APMF_FUNC_OS_POWER_SLIDER_UPDATE , ¶ms); +if (!info) + err = -EIO ; + +kfree (info); +return err; +} +static void apmf_sbios_heartbeat_notify (struct work_struct *work) { struct amd_pmf_dev *dev = container_of(work, struct amd_pmf_dev, heart_beat.work);
drivers/platform/x86/amd/pmf/core.c +7 -2
@@ -71,7 +71,11 @@ static int amd_pmf_pwr_src_notify_call(sreturn NOTIFY_DONE ; } -amd_pmf_set_sps_power_limits (pmf); +if (is_apmf_func_supported (pmf,APMF_FUNC_STATIC_SLIDER_GRANULAR )) +amd_pmf_set_sps_power_limits (pmf); + +if (is_apmf_func_supported (pmf,APMF_FUNC_OS_POWER_SLIDER_UPDATE )) +amd_pmf_power_slider_update_event (pmf);return NOTIFY_OK ; }
@@ -295,7 +299,8 @@ static void amd_pmf_init_features(structint ret;/* Enable Static Slider */ -if (is_apmf_func_supported (dev,APMF_FUNC_STATIC_SLIDER_GRANULAR )) { +if (is_apmf_func_supported (dev,APMF_FUNC_STATIC_SLIDER_GRANULAR ) || +is_apmf_func_supported (dev,APMF_FUNC_OS_POWER_SLIDER_UPDATE )) {amd_pmf_init_sps (dev); dev->pwr_src_notifier.notifier_call = amd_pmf_pwr_src_notify_call;power_supply_reg_notifier (&dev->pwr_src_notifier);
drivers/platform/x86/amd/pmf/pmf.h +16 -0
@@ -21,6 +21,7 @@#define APMF_FUNC_SBIOS_HEARTBEAT 4#define APMF_FUNC_AUTO_MODE 5#define APMF_FUNC_SET_FAN_IDX 7 +#define APMF_FUNC_OS_POWER_SLIDER_UPDATE 8#define APMF_FUNC_STATIC_SLIDER_GRANULAR 9#define APMF_FUNC_DYN_SLIDER_AC 11#define APMF_FUNC_DYN_SLIDER_DC 12
@@ -44,6 +45,14 @@#define GET_STT_LIMIT_APU 0x20#define GET_STT_LIMIT_HS2 0x21 +/* OS slider update notification */ +#define DC_BEST_PERF 0 +#define DC_BETTER_PERF 1 +#define DC_BATTERY_SAVER 3 +#define AC_BEST_PERF 4 +#define AC_BETTER_PERF 5 +#define AC_BETTER_BATTERY 6 +/* Fan Index for Auto Mode */ #define FAN_INDEX_AUTO 0xFFFFFFFF
@@ -193,6 +202,11 @@ struct amd_pmf_static_slider_granular {struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX ][POWER_MODE_MAX ]; }; +struct os_power_slider { +u16 size; +u8 slider_event; +} __packed; +struct fan_table_control {bool manual;unsigned long fan_id;
@@ -383,6 +397,7 @@ int amd_pmf_send_cmd(struct amd_pmf_devint amd_pmf_init_metrics_table (struct amd_pmf_dev *dev);int amd_pmf_get_power_source (void );int apmf_install_handler (struct amd_pmf_dev *pmf_dev); +int apmf_os_power_slider_update (struct amd_pmf_dev *dev,u8 flag);/* SPS Layer */ int amd_pmf_get_pprof_modes (struct amd_pmf_dev *pmf);
@@ -393,6 +408,7 @@ void amd_pmf_deinit_sps(struct amd_pmf_dint apmf_get_static_slider_granular (struct amd_pmf_dev *pdev,struct apmf_static_slider_granular_output *output);bool is_pprof_balanced (struct amd_pmf_dev *pmf); +int amd_pmf_power_slider_update_event (struct amd_pmf_dev *dev);int apmf_update_fan_idx (struct amd_pmf_dev *pdev,bool manual,u32 idx);
drivers/platform/x86/amd/pmf/sps.c +70 -4
94 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 4/228 platform/x86/amd/pmf: reduce verbosity of apmf_get_system_params
In reply to Greg Kroah-HartmanFrom: Shyam Sundar S K <[email protected]>
commit 839e90e75e695b3d9ee17f5a2811e7ee5aea8d4a upstream.
apmf_get_system_params() failure is not a critical event, reduce its verbosity from dev_err to dev_dbg.
--- drivers/platform/x86/amd/pmf/acpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/amd/pmf/acpi.c +1 -1
@@ -310,7 +310,7 @@ int apmf_acpi_init(struct amd_pmf_dev *p ret =apmf_get_system_params (pmf_dev);if (ret) { -dev_err (pmf_dev->dev,"APMF apmf_get_system_params failed :%d\n" , ret); +dev_dbg (pmf_dev->dev,"APMF apmf_get_system_params failed :%d\n" , ret); goto out; }
Greg Kroah-Hartman
maintainerPATCH 5/228 drm/amd/display: Keep PHY active for dp config
In reply to Greg Kroah-HartmanFrom: Agustin Gutierrez <[email protected]>
commit 2b02d746c1818baf741f4eeeff9b97ab4b81e1cf upstream.
[Why]
Current hotplug sequence causes temporary hang at the re-entry of the optimized power state.
[How]
Keep a PHY active when detecting DP signal + DPMS active
--- drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c +5 -0
@@ -108,6 +108,11 @@ static int dcn314_get_active_display_cnt stream->signal == SIGNAL_TYPE_DVI_SINGLE_LINK || stream->signal == SIGNAL_TYPE_DVI_DUAL_LINK) tmds_present = true; + +/* Checking stream / link detection ensuring that PHY is active*/ +if (dc_is_dp_signal (stream->signal) && !stream->dpms_off) + display_count++; + }for (i =0 ; i < dc->link_count; i++) {
Greg Kroah-Hartman
maintainerPATCH 6/228 ovl: fix null pointer dereference in ovl_permission()
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
commit 1a73f5b8f079fd42a544c1600beface50c63af7c upstream.
Following process:
P1 P2
path_lookupat
link_path_walk
inode_permission
ovl_permission
ovl_i_path_real(inode, &realpath)
path->dentry = ovl_i_dentry_upper(inode)
drop_cache
__dentry_kill(ovl_dentry)
iput(ovl_inode)
ovl_destroy_inode(ovl_inode)
dput(oi->__upperdentry)
dentry_kill(upperdentry)
dentry_unlink_inode
upperdentry->d_inode = NULL
realinode = d_inode(realpath.dentry) // return NULL
inode_permission(realinode)
inode->i_sb // NULL pointer dereference
, will trigger an null pointer dereference at realinode:
[ 335.664979] BUG: kernel NULL pointer dereference,
address: 0000000000000002
[ 335.668032] CPU: 0 PID: 2592 Comm: ls Not tainted 6.3.0
[ 335.669956] RIP: 0010:inode_permission+0x33/0x2c0
[ 335.678939] Call Trace:
[ 335.679165] <TASK>
[ 335.679371] ovl_permission+0xde/0x320
[ 335.679723] inode_permission+0x15e/0x2c0
[ 335.680090] link_path_walk+0x115/0x550
[ 335.680771] path_lookupat.isra.0+0xb2/0x200
[ 335.681170] filename_lookup+0xda/0x240
[ 335.681922] vfs_statx+0xa6/0x1f0
[ 335.682233] vfs_fstatat+0x7b/0xb0Fetch a reproducer in [Link].
Use the helper ovl_i_path_realinode() to get realinode and then do non-nullptr checking.
--- fs/overlayfs/inode.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
fs/overlayfs/inode.c +2 -3
@@ -286,8 +286,8 @@ int ovl_permission(struct user_namespaceint err;/* Careful in RCU walk mode */ -ovl_i_path_real (inode, &realpath); -if (!realpath.dentry) { + realinode =ovl_i_path_real (inode, &realpath); +if (!realinode) {WARN_ON (!(mask &MAY_NOT_BLOCK ));return -ECHILD ; }
@@ -300,7 +300,6 @@ int ovl_permission(struct user_namespaceif (err)return err; - realinode =d_inode (realpath.dentry); old_cred =ovl_override_creds (inode->i_sb);if (!upperinode && !special_file (realinode->i_mode) && mask &MAY_WRITE ) {
Greg Kroah-Hartman
maintainerPATCH 7/228 drm/amd: Move helper for dynamic speed switch check out of smu13
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit 188623076d0f1a500583d392b6187056bf7cc71a upstream.
This helper is used for checking if the connected host supports the feature, it can be moved into generic code to be used by other smu implementations as well.
--- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 19 +++++++++++++++++++ drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 21 +-------------------- 3 files changed, 21 insertions(+), 20 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu.h +1 -0
@@ -1262,6 +1262,7 @@ int amdgpu_device_gpu_recover(struct amdvoid amdgpu_device_pci_config_reset (struct amdgpu_device *adev);int amdgpu_device_pci_reset (struct amdgpu_device *adev);bool amdgpu_device_need_post (struct amdgpu_device *adev); +bool amdgpu_device_pcie_dynamic_switching_supported (void );bool amdgpu_device_should_use_aspm (struct amdgpu_device *adev);bool amdgpu_device_aspm_support_quirk (void );
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +19 -0
@@ -1333,6 +1333,25 @@ bool amdgpu_device_need_post(struct amdgreturn true; } +/* +* Intel hosts such as Raptor Lake and Sapphire Rapids don't support dynamic +* speed switching. Until we have confirmation from Intel that a specific host +* supports it, it's safer that we keep it disabled for all. +* +* https://edc.intel.com/content/www/us/en/design/products/platforms/details/raptor-lake-s/13th-generation-core-processors-datasheet-volume-1-of-2/005/pci-express-support/ +* https://gitlab.freedesktop.org/drm/amd/-/issues/2663 +*/ +bool amdgpu_device_pcie_dynamic_switching_supported (void ) +{ +#if IS_ENABLED (CONFIG_X86 ) +struct cpuinfo_x86 *c = &cpu_data (0 ); + +if (c->x86_vendor ==X86_VENDOR_INTEL ) +return false; +#endif +return true; +} +/** * amdgpu_device_should_use_aspm - check if the device should program ASPM *
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c +1 -20
@@ -2490,25 +2490,6 @@ int smu_v13_0_mode1_reset(struct smu_conreturn ret; } -/* -* Intel hosts such as Raptor Lake and Sapphire Rapids don't support dynamic -* speed switching. Until we have confirmation from Intel that a specific host -* supports it, it's safer that we keep it disabled for all. -* -* https://edc.intel.com/content/www/us/en/design/products/platforms/details/raptor-lake-s/13th-generation-core-processors-datasheet-volume-1-of-2/005/pci-express-support/ -* https://gitlab.freedesktop.org/drm/amd/-/issues/2663 -*/ -static bool smu_v13_0_is_pcie_dynamic_switching_supported (void ) -{ -#if IS_ENABLED (CONFIG_X86 ) -struct cpuinfo_x86 *c = &cpu_data (0 ); - -if (c->x86_vendor ==X86_VENDOR_INTEL ) -return false; -#endif -return true; -} -int smu_v13_0_update_pcie_parameters (struct smu_context *smu,uint32_t pcie_gen_cap,uint32_t pcie_width_cap)
@@ -2520,7 +2501,7 @@ int smu_v13_0_update_pcie_parameters(struint32_t smu_pcie_arg;int ret, i; -if (!smu_v13_0_is_pcie_dynamic_switching_supported ()) { +if (!amdgpu_device_pcie_dynamic_switching_supported ()) {if (pcie_table->pcie_gen[num_of_levels -1 ] < pcie_gen_cap) pcie_gen_cap = pcie_table->pcie_gen[num_of_levels -1 ];
Greg Kroah-Hartman
maintainerPATCH 8/228 drm/amd: Align SMU11 SMU_MSG_OverridePcieParameters implementation with SMU13
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
commit e701156ccc6c7a5f104a968dda74cd6434178712 upstream.
SMU13 overrides dynamic PCIe lane width and dynamic speed by when on certain hosts. commit 38e4ced80479 ("drm/amd/pm: conditionally disable pcie lane switching for some sienna_cichlid SKUs") worked around this issue by setting up certain SKUs to set up certain limits, but the same fundamental problem with those hosts affects all SMU11 implmentations as well, so align the SMU11 and SMU13 driver handling.
--- drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 93 +++------------- 1 file changed, 20 insertions(+), 73 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c +20 -73
@@ -2081,89 +2081,36 @@ static int sienna_cichlid_display_disablreturn ret; } -static void sienna_cichlid_get_override_pcie_settings (struct smu_context *smu, -uint32_t *gen_speed_override, -uint32_t *lane_width_override) -{ -struct amdgpu_device *adev = smu->adev; - - *gen_speed_override =0xff ; - *lane_width_override =0xff ; - -switch (adev->pdev->device) { -case 0x73A0 : -case 0x73A1 : -case 0x73A2 : -case 0x73A3 : -case 0x73AB : -case 0x73AE : -/* Bit 7:0: PCIE lane width, 1 to 7 corresponds is x1 to x32 */ - *lane_width_override =6 ; -break ; -case 0x73E0 : -case 0x73E1 : -case 0x73E3 : - *lane_width_override =4 ; -break ; -case 0x7420 : -case 0x7421 : -case 0x7422 : -case 0x7423 : -case 0x7424 : - *lane_width_override =3 ; -break ; -default : -break ; - } -} - -#define MAX (a, b) ((a) > (b) ? (a) : (b)) -static int sienna_cichlid_update_pcie_parameters (struct smu_context *smu,uint32_t pcie_gen_cap,uint32_t pcie_width_cap) {struct smu_11_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;struct smu_11_0_pcie_table *pcie_table = &dpm_context->dpm_tables.pcie_table; -uint32_t gen_speed_override, lane_width_override; -uint8_t *table_member1, *table_member2; -uint32_t min_gen_speed, max_gen_speed; -uint32_t min_lane_width, max_lane_width; -uint32_t smu_pcie_arg; +u32 smu_pcie_arg;int ret, i; -GET_PPTABLE_MEMBER (PcieGenSpeed, &table_member1); -GET_PPTABLE_MEMBER (PcieLaneCount, &table_member2); - -sienna_cichlid_get_override_pcie_settings (smu, - &gen_speed_override, - &lane_width_override); - -/* PCIE gen speed override */ -if (gen_speed_override !=0xff ) { - min_gen_speed =MIN (pcie_gen_cap, gen_speed_override); - max_gen_speed =MIN (pcie_gen_cap, gen_speed_override); - }else { - min_gen_speed =MAX (0 , table_member1[0 ]); - max_gen_speed =MIN (pcie_gen_cap, table_member1[1 ]); - min_gen_speed = min_gen_speed > max_gen_speed ? - max_gen_speed : min_gen_speed; - } - pcie_table->pcie_gen[0 ] = min_gen_speed; - pcie_table->pcie_gen[1 ] = max_gen_speed; - -/* PCIE lane width override */ -if (lane_width_override !=0xff ) { - min_lane_width =MIN (pcie_width_cap, lane_width_override); - max_lane_width =MIN (pcie_width_cap, lane_width_override); +/* PCIE gen speed and lane width override */ +if (!amdgpu_device_pcie_dynamic_switching_supported ()) { +if (pcie_table->pcie_gen[NUM_LINK_LEVELS -1 ] < pcie_gen_cap) + pcie_gen_cap = pcie_table->pcie_gen[NUM_LINK_LEVELS -1 ]; + +if (pcie_table->pcie_lane[NUM_LINK_LEVELS -1 ] < pcie_width_cap) + pcie_width_cap = pcie_table->pcie_lane[NUM_LINK_LEVELS -1 ]; + +/* Force all levels to use the same settings */ +for (i =0 ; i <NUM_LINK_LEVELS ; i++) { + pcie_table->pcie_gen[i] = pcie_gen_cap; + pcie_table->pcie_lane[i] = pcie_width_cap; + } }else { - min_lane_width =MAX (1 , table_member2[0 ]); - max_lane_width =MIN (pcie_width_cap, table_member2[1 ]); - min_lane_width = min_lane_width > max_lane_width ? - max_lane_width : min_lane_width; +for (i =0 ; i <NUM_LINK_LEVELS ; i++) { +if (pcie_table->pcie_gen[i] > pcie_gen_cap) + pcie_table->pcie_gen[i] = pcie_gen_cap; +if (pcie_table->pcie_lane[i] > pcie_width_cap) + pcie_table->pcie_lane[i] = pcie_width_cap; + } } - pcie_table->pcie_lane[0 ] = min_lane_width; - pcie_table->pcie_lane[1 ] = max_lane_width;for (i =0 ; i <NUM_LINK_LEVELS ; i++) { smu_pcie_arg = (i << 16 |
Greg Kroah-Hartman
maintainerPATCH 9/228 jbd2: Fix wrongly judgement for buffer head removing while doing checkpoint
In reply to Greg Kroah-HartmanFrom: Zhihao Cheng <[email protected]>
[ Upstream commit e34c8dd238d0c9368b746480f313055f5bab5040 ]
Following process,
jbd2_journal_commit_transaction
// there are several dirty buffer heads in transaction->t_checkpoint_list
P1 wb_workfnjbd2_log_do_checkpoint
if (buffer_locked(bh)) // false
__block_write_full_page
trylock_buffer(bh) test_clear_buffer_dirty(bh)
if (!buffer_dirty(bh))
__jbd2_journal_remove_checkpoint(jh)
if (buffer_write_io_error(bh)) // false
>> bh IO error occurs <<
jbd2_cleanup_journal_tail
__jbd2_update_log_tail
jbd2_write_superblock
// The bh won't be replayed in next mount.
, which could corrupt the ext4 image, fetch a reproducer in [Link].
Since writeback process clears buffer dirty after locking buffer head, we can fix it by try locking buffer and check dirtiness while buffer is locked, the buffer head can be removed if it is neither dirty nor locked.
--- fs/jbd2/checkpoint.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-)
fs/jbd2/checkpoint.c +17 -15
@@ -221,20 +221,6 @@ int jbd2_log_do_checkpoint(journal_t *journal) jh = transaction->t_checkpoint_list; bh =jh2bh (jh); -/* -* The buffer may be writing back, or flushing out in the -* last couple of cycles, or re-adding into a new transaction, -* need to check it again until it's unlocked. -*/ -if (buffer_locked (bh)) { -get_bh (bh); -spin_unlock (&journal->j_list_lock); -wait_on_buffer (bh); -/* the journal_head may have gone by now */ -BUFFER_TRACE (bh,"brelse" ); -__brelse (bh); - goto retry; - }if (jh->b_transaction !=NULL ) {transaction_t *t = jh->b_transaction;tid_t tid = t->t_tid;
@@ -269,7 +255,22 @@ int jbd2_log_do_checkpoint(journal_t *journal)spin_lock (&journal->j_list_lock); goto restart; } -if (!buffer_dirty (bh)) { +if (!trylock_buffer (bh)) { +/* +* The buffer is locked, it may be writing back, or +* flushing out in the last couple of cycles, or +* re-adding into a new transaction, need to check +* it again until it's unlocked. +*/ +get_bh (bh); +spin_unlock (&journal->j_list_lock); +wait_on_buffer (bh); +/* the journal_head may have gone by now */ +BUFFER_TRACE (bh,"brelse" ); +__brelse (bh); + goto retry; + }else if (!buffer_dirty (bh)) { +unlock_buffer (bh);BUFFER_TRACE (bh,"remove from checkpoint" );/* * If the transaction was released or the checkpoint
@@ -279,6 +280,7 @@ int jbd2_log_do_checkpoint(journal_t *journal) !transaction->t_checkpoint_list) goto out; }else { +unlock_buffer (bh);/* * We are about to write the buffer, it could be * raced by some other transaction shrink or buffer
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 10/228 blk-mq: Fix stall due to recursive flush plug
In reply to Greg Kroah-HartmanFrom: Ross Lagerwall <[email protected]>
[ Upstream commit 70904263512a74a3b8941dd9e6e515ca6fc57821 ]
We have seen rare IO stalls as follows:
* blk_mq_plug_issue_direct() is entered with an mq_list containing two requests.
* For the first request, it sets last == false and enters the driver's queue_rq callback.
* The driver queue_rq callback indirectly calls schedule() which calls blk_flush_plug(). This may happen if the driver has the BLK_MQ_F_BLOCKING flag set and is allowed to sleep in ->queue_rq.
* blk_flush_plug() handles the remaining request in the mq_list. mq_list is now empty.
* The original call to queue_rq resumes (with last == false).
* The loop in blk_mq_plug_issue_direct() terminates because there are no remaining requests in mq_list.
The IO is now stalled because the last request submitted to the driver had last == false and there was no subsequent call to commit_rqs().
Fix this by returning early in blk_mq_flush_plug_list() if rq_count is 0 which it will be in the recursive case, rather than checking if the mq_list is empty. At the same time, adjust one of the callers to skip the mq_list empty check as it is not necessary.
--- block/blk-core.c | 3 +-- block/blk-mq.c | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-)
block/blk-core.c +1 -2
@@ -1140,8 +1140,7 @@ void __blk_flush_plug(struct blk_plug *plug, bool from_schedule) {if (!list_empty (&plug->cb_list))flush_plug_callbacks (plug, from_schedule); -if (!rq_list_empty (plug->mq_list)) -blk_mq_flush_plug_list (plug, from_schedule); +blk_mq_flush_plug_list (plug, from_schedule);/* * Unconditionally flush out cached requests, even if the unplug * event came from schedule. Since we know hold references to the
block/blk-mq.c +8 -1
@@ -2749,7 +2749,14 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) {struct request *rq; -if (rq_list_empty (plug->mq_list)) +/* +* We may have been called recursively midway through handling +* plug->mq_list via a schedule() in the driver's queue_rq() callback. +* To avoid mq_list changing under our feet, clear rq_count early and +* bail out specifically if rq_count is 0 rather than checking +* whether the mq_list is empty. +*/ +if (plug->rq_count ==0 )return ; plug->rq_count =0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 11/228 powerpc/pseries/vas: Hold mmap_mutex after mmap lock during window close
In reply to Greg Kroah-HartmanFrom: Haren Myneni <[email protected]>
[ Upstream commit b59c9dc4d9d47b3c4572d826603fde507055b656 ]
Commit 8ef7b9e1765a ("powerpc/pseries/vas: Close windows with DLPAR core removal") unmaps the window paste address and issues HCALL to close window in the hypervisor for migration or DLPAR core removal events. So holds mmap_mutex and then mmap lock before unmap the paste address. But if the user space issue mmap paste address at the same time with the migration event, coproc_mmap() is called after holding the mmap lock which can trigger deadlock when trying to acquire mmap_mutex in coproc_mmap().
t1: mmap() call to mmap t2: Migration event
window paste address
do_mmap2() migration_store()
ksys_mmap_pgoff() pseries_migrate_partition()
vm_mmap_pgoff() vas_migration_handler()
Acquire mmap lock reconfig_close_windows()
do_mmap() lock mmap_mutex
mmap_region() Acquire mmap lock
call_mmap() //Wait for mmap lock
coproc_mmap() unmap vma
lock mmap_mutex update window status
//wait for mmap_mutex Release mmap lock
mmap vma unlock mmap_mutex
update window status
unlock mmap_mutex
...
Release mmap lock
Fix this deadlock issue by holding mmap lock first before mmap_mutex in reconfig_close_windows().
--- arch/powerpc/platforms/pseries/vas.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
arch/powerpc/platforms/pseries/vas.c +7 -2
@@ -744,6 +744,12 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds, } task_ref = &win->vas_win.task_ref; +/* +* VAS mmap (coproc_mmap()) and its fault handler +* (vas_mmap_fault()) are called after holding mmap lock. +* So hold mmap mutex after mmap_lock to avoid deadlock. +*/ +mmap_write_lock (task_ref->mm);mutex_lock (&task_ref->mmap_mutex); vma = task_ref->vma;/*
@@ -752,7 +758,6 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,*/ win->vas_win.status |= flag; -mmap_write_lock (task_ref->mm);/* * vma is set in the original mapping. But this mapping * is done with mmap() after the window is opened with ioctl.
@@ -763,8 +768,8 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,zap_page_range (vma, vma->vm_start, vma->vm_end - vma->vm_start); -mmap_write_unlock (task_ref->mm);mutex_unlock (&task_ref->mmap_mutex); +mmap_write_unlock (task_ref->mm);/* * Close VAS window in the hypervisor, but do not * free vas_window struct since it may be reused
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 12/228 KVM: s390: pv: fix index value of replaced ASCE
In reply to Greg Kroah-HartmanFrom: Claudio Imbrenda <[email protected]>
[ Upstream commit c2fceb59bbda16468bda82b002383bff59de89ab ]
The index field of the struct page corresponding to a guest ASCE should be 0. When replacing the ASCE in s390_replace_asce(), the index of the new ASCE should also be set to 0.
Having the wrong index might lead to the wrong addresses being passed around when notifying pte invalidations, and eventually to validity intercepts (VM crash) if the prefix gets unmapped and the notifier gets called with the wrong address.
Message-ID: <[email protected]>
--- arch/s390/mm/gmap.c | 1 + 1 file changed, 1 insertion(+)
arch/s390/mm/gmap.c +1 -0
@@ -2843,6 +2843,7 @@ int s390_replace_asce(struct gmap *gmap) page =alloc_pages (GFP_KERNEL_ACCOUNT ,CRST_ALLOC_ORDER );if (!page)return -ENOMEM ; + page->index =0 ; table =page_to_virt (page);memcpy (table, gmap->table,1UL << (CRST_ALLOC_ORDER +PAGE_SHIFT ));
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 13/228 io_uring: dont audit the capability check in io_uring_create()
In reply to Greg Kroah-HartmanFrom: Ondrej Mosnacek <[email protected]>
[ Upstream commit 6adc2272aaaf84f34b652cf77f770c6fcc4b8336 ]
The check being unconditional may lead to unwanted denials reported by LSMs when a process has the capability granted by DAC, but denied by an LSM. In the case of SELinux such denials are a problem, since they can't be effectively filtered out via the policy and when not silenced, they produce noise that may hide a true problem or an attack.
Since not having the capability merely means that the created io_uring context will be accounted against the current user's RLIMIT_MEMLOCK limit, we can disable auditing of denials for this check by using ns_capable_noaudit() instead of capable().
--- io_uring/io_uring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
io_uring/io_uring.c +1 -1
@@ -3477,7 +3477,7 @@ static __cold int io_uring_create(unsigned entries, struct io_uring_params *p, ctx->syscall_iopoll =1 ; ctx->compat =in_compat_syscall (); -if (!capable (CAP_IPC_LOCK )) +if (!ns_capable_noaudit (&init_user_ns,CAP_IPC_LOCK )) ctx->user =get_uid (current_user ());/*
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 14/228 gpio: tps68470: Make tps68470_gpio_output() always set the initial value
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 5a7adc6c1069ce31ef4f606ae9c05592c80a6ab5 ]
Make tps68470_gpio_output() call tps68470_gpio_set() for output-only pins too, so that the initial value passed to gpiod_direction_output() is honored for these pins too.
--- drivers/gpio/gpio-tps68470.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpio/gpio-tps68470.c +3 -3
@@ -91,13 +91,13 @@ static int tps68470_gpio_output(struct gpio_chip *gc, unsigned int offset,struct tps68470_gpio_data *tps68470_gpio =gpiochip_get_data (gc);struct regmap *regmap = tps68470_gpio->tps68470_regmap; +/* Set the initial value */ +tps68470_gpio_set (gc, offset, value); +/* rest are always outputs */ if (offset >=TPS68470_N_REGULAR_GPIO )return 0 ; -/* Set the initial value */ -tps68470_gpio_set (gc, offset, value); -return regmap_update_bits (regmap,TPS68470_GPIO_CTL_REG_A (offset),TPS68470_GPIO_MODE_MASK ,TPS68470_GPIO_MODE_OUT_CMOS );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 15/228 gpio: mvebu: Make use of devm_pwmchip_add
In reply to Greg Kroah-HartmanFrom: Uwe Kleine-König <[email protected]>
[ Upstream commit 1945063eb59e64d2919cb14d54d081476d9e53bb ]
This allows to get rid of a call to pwmchip_remove() in the error path. There is no .remove function for this driver, so this change fixes a resource leak when a gpio-mvebu device is unbound.
--- drivers/gpio/gpio-mvebu.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/gpio/gpio-mvebu.c +2 -6
@@ -874,7 +874,7 @@ static int mvebu_pwm_probe(struct platform_device *pdev,spin_lock_init (&mvpwm->lock); -return pwmchip_add (&mvpwm->chip); +return devm_pwmchip_add (dev, &mvpwm->chip); }#ifdef CONFIG_DEBUG_FS
@@ -1243,8 +1243,7 @@ static int mvebu_gpio_probe(struct platform_device *pdev)if (!mvchip->domain) {dev_err (&pdev->dev,"couldn't allocate irq domain %s (DT).\n" , mvchip->chip.label); - err = -ENODEV ; - goto err_pwm; +return -ENODEV ; } err = irq_alloc_domain_generic_chips(
@@ -1296,9 +1295,6 @@ static int mvebu_gpio_probe(struct platform_device *pdev) err_domain:irq_domain_remove (mvchip->domain); -err_pwm: -pwmchip_remove (&mvchip->mvpwm->chip); -return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 16/228 gpio: mvebu: fix irq domain leak
In reply to Greg Kroah-HartmanFrom: Bartosz Golaszewski <[email protected]>
[ Upstream commit 644ee70267a934be27370f9aa618b29af7290544 ]
Uwe Kleine-König pointed out we still have one resource leak in the mvebu driver triggered on driver detach. Let's address it with a custom devm action.
--- drivers/gpio/gpio-mvebu.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/gpio/gpio-mvebu.c +13 -5
@@ -1112,6 +1112,13 @@ static int mvebu_gpio_probe_syscon(struct platform_device *pdev,return 0 ; } +static void mvebu_gpio_remove_irq_domain (void *data) +{ +struct irq_domain *domain = data; + +irq_domain_remove (domain); +} +static int mvebu_gpio_probe (struct platform_device *pdev) {struct mvebu_gpio_chip *mvchip;
@@ -1246,13 +1253,18 @@ static int mvebu_gpio_probe(struct platform_device *pdev)return -ENODEV ; } + err =devm_add_action_or_reset (&pdev->dev, mvebu_gpio_remove_irq_domain, + mvchip->domain); +if (err) +return err; + err =irq_alloc_domain_generic_chips ( mvchip->domain, ngpios,2 , np->name, handle_level_irq,IRQ_NOREQUEST |IRQ_NOPROBE |IRQ_LEVEL ,0 ,0 );if (err) {dev_err (&pdev->dev,"couldn't allocate irq chips %s (DT).\n" , mvchip->chip.label); - goto err_domain; +return err; }/*
@@ -1292,10 +1304,6 @@ static int mvebu_gpio_probe(struct platform_device *pdev) }return 0 ; - -err_domain: -irq_domain_remove (mvchip->domain); -return err; }static struct platform_driver mvebu_gpio_driver = {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 17/228 btrfs: fix race between quota disable and relocation
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 8a4a0b2a3eaf75ca8854f856ef29690c12b2f531 ]
If we disable quotas while we have a relocation of a metadata block group that has extents belonging to the quota root, we can cause the relocation to fail with -ENOENT. This is because relocation builds backref nodes for extents of the quota root and later needs to walk the backrefs and access the quota root - however if in between a task disables quotas, it results in deleting the quota root from the root tree (with btrfs_del_root(), called from btrfs_quota_disable().
This can be sporadically triggered by test case btrfs/255 from fstests:
$ ./check btrfs/255 FSTYP -- btrfs PLATFORM -- Linux/x86_64 debian0 6.4.0-rc6-btrfs-next-134+ #1 SMP PREEMPT_DYNAMIC Thu Jun 15 11:59:28 WEST 2023 MKFS_OPTIONS -- /dev/sdc MOUNT_OPTIONS -- /dev/sdc /home/fdmanana/btrfs-tests/scratch_1
btrfs/255 6s ... _check_dmesg: something found in dmesg (see /home/fdmanana/git/hub/xfstests/results//btrfs/255.dmesg)
- output mismatch (see /home/fdmanana/git/hub/xfstests/results//btrfs/255.out.bad)
# --- tests/btrfs/255.out 2023-03-02 21:47:53.876609426 +0000 # +++ /home/fdmanana/git/hub/xfstests/results//btrfs/255.out.bad 2023-06-16 10:20:39.267563212 +0100 # @@ -1,2 +1,4 @@
# QA output created by 255
# +ERROR: error during balancing '/home/fdmanana/btrfs-tests/scratch_1': No such file or directory
# +There may be more info in syslog - try dmesg | tail
# Silence is golden
# ...
(Run 'diff -u /home/fdmanana/git/hub/xfstests/tests/btrfs/255.out /home/fdmanana/git/hub/xfstests/results//btrfs/255.out.bad' to see the entire diff)
Ran: btrfs/255
Failures: btrfs/255
Failed 1 of 1 tests
To fix this make the quota disable operation take the cleaner mutex, as relocation of a block group also takes this mutex. This is also what we do when deleting a subvolume/snapshot, we take the cleaner mutex in the cleaner kthread (at cleaner_kthread()) and then we call btrfs_del_root() at btrfs_drop_snapshot() while under the protection of the cleaner mutex.
--- fs/btrfs/qgroup.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
fs/btrfs/qgroup.c +15 -3
@@ -1227,12 +1227,23 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)int ret =0 ;/* -* We need to have subvol_sem write locked, to prevent races between -* concurrent tasks trying to disable quotas, because we will unlock -* and relock qgroup_ioctl_lock across BTRFS_FS_QUOTA_ENABLED changes. +* We need to have subvol_sem write locked to prevent races with +* snapshot creation. */ lockdep_assert_held_write (&fs_info->subvol_sem); +/* +* Lock the cleaner mutex to prevent races with concurrent relocation, +* because relocation may be building backrefs for blocks of the quota +* root while we are deleting the root. This is like dropping fs roots +* of deleted snapshots/subvolumes, we need the same protection. +* +* This also prevents races between concurrent tasks trying to disable +* quotas, because we will unlock and relock qgroup_ioctl_lock across +* BTRFS_FS_QUOTA_ENABLED changes. +*/ +mutex_lock (&fs_info->cleaner_mutex); +mutex_lock (&fs_info->qgroup_ioctl_lock);if (!fs_info->quota_root) goto out;
@@ -1314,6 +1325,7 @@ int btrfs_quota_disable(struct btrfs_fs_info *fs_info)btrfs_end_transaction (trans); else if (trans) ret =btrfs_end_transaction (trans); +mutex_unlock (&fs_info->cleaner_mutex);return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 18/228 f2fs: fix to set flush_merge opt and show noflush_merge
In reply to Greg Kroah-HartmanFrom: Yangtao Li <[email protected]>
[ Upstream commit 967eaad1fed5f6335ea97a47d45214744dc57925 ]
Some minor modifications to flush_merge and related parameters:
1.The FLUSH_MERGE opt is set by default only in non-ro mode. 2.When ro and merge are set at the same time, an error is reported. 3.Display noflush_merge mount opt.
Stable-dep-of: 458c15dfbce6 ("f2fs: don't reset unchangable mount option in f2fs_remount()")
--- fs/f2fs/super.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
fs/f2fs/super.c +11 -2
@@ -1347,6 +1347,12 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount)return -EINVAL ; } +if ((f2fs_sb_has_readonly (sbi) ||f2fs_readonly (sbi->sb)) && +test_opt (sbi,FLUSH_MERGE )) { +f2fs_err (sbi,"FLUSH_MERGE not compatible with readonly mode" ); +return -EINVAL ; + } +if (f2fs_sb_has_readonly (sbi) && !f2fs_readonly (sbi->sb)) {f2fs_err (sbi,"Allow to mount readonly mode only" );return -EROFS ;
@@ -1933,8 +1939,10 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)seq_puts (seq,",inline_dentry" ); else seq_puts(seq, ",noinline_dentry"); -if (!f2fs_readonly (sbi->sb) &&test_opt (sbi,FLUSH_MERGE )) + if (test_opt(sbi, FLUSH_MERGE)) seq_puts(seq, ",flush_merge"); + else + seq_puts(seq, ",noflush_merge"); if (test_opt(sbi, NOBARRIER)) seq_puts(seq, ",nobarrier"); if (test_opt(sbi, FASTBOOT))
@@ -2063,7 +2071,8 @@ static void default_options(struct f2fs_sb_info *sbi)set_opt (sbi,MERGE_CHECKPOINT );F2FS_OPTION (sbi).unusable_cap =0 ; sbi->sb->s_flags |=SB_LAZYTIME ; -set_opt (sbi,FLUSH_MERGE ); +if (!f2fs_sb_has_readonly (sbi) && !f2fs_readonly (sbi->sb)) +set_opt (sbi,FLUSH_MERGE );if (f2fs_hw_support_discard (sbi) ||f2fs_hw_should_discard (sbi))set_opt (sbi,DISCARD );if (f2fs_sb_has_blkzoned (sbi)) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 19/228 f2fs: dont reset unchangable mount option in f2fs_remount()
In reply to Greg Kroah-HartmanFrom: Chao Yu <[email protected]>
[ Upstream commit 458c15dfbce62c35fefd9ca637b20a051309c9f1 ]
syzbot reports a bug as below:
general protection fault, probably for non-canonical address 0xdffffc0000000009: 0000 [#1] PREEMPT SMP KASAN RIP: 0010:__lock_acquire+0x69/0x2000 kernel/locking/lockdep.c:4942 Call Trace: lock_acquire+0x1e3/0x520 kernel/locking/lockdep.c:5691 __raw_write_lock include/linux/rwlock_api_smp.h:209 [inline] _raw_write_lock+0x2e/0x40 kernel/locking/spinlock.c:300 __drop_extent_tree+0x3ac/0x660 fs/f2fs/extent_cache.c:1100 f2fs_drop_extent_tree+0x17/0x30 fs/f2fs/extent_cache.c:1116 f2fs_insert_range+0x2d5/0x3c0 fs/f2fs/file.c:1664 f2fs_fallocate+0x4e4/0x6d0 fs/f2fs/file.c:1838 vfs_fallocate+0x54b/0x6b0 fs/open.c:324 ksys_fallocate fs/open.c:347 [inline] __do_sys_fallocate fs/open.c:355 [inline] __se_sys_fallocate fs/open.c:353 [inline] __x64_sys_fallocate+0xbd/0x100 fs/open.c:353 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
The root cause is race condition as below:
- since it tries to remount rw filesystem, so that do_remount won't call sb_prepare_remount_readonly to block fallocate, there may be race condition in between remount and fallocate.
- in f2fs_remount(), default_options() will reset mount option to default one, and then update it based on result of parse_options(), so there is a hole which race condition can happen.
Thread A Thread B
- f2fs_fill_super
- parse_options
- clear_opt(READ_EXTENT_CACHE)
- f2fs_remount
- default_options
- set_opt(READ_EXTENT_CACHE)
- f2fs_fallocate
- f2fs_insert_range
- f2fs_drop_extent_tree
- __drop_extent_tree
- __may_extent_tree
- test_opt(READ_EXTENT_CACHE) return true
- write_lock(&et->lock) access NULL pointer
- parse_options
- clear_opt(READ_EXTENT_CACHE)
--- fs/f2fs/super.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
fs/f2fs/super.c +18 -12
@@ -2040,9 +2040,22 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)return 0 ; } -static void default_options (struct f2fs_sb_info *sbi) +static void default_options (struct f2fs_sb_info *sbi,bool remount) {/* init some FS parameters */ +if (!remount) { +set_opt (sbi,READ_EXTENT_CACHE ); +clear_opt (sbi,DISABLE_CHECKPOINT ); + +if (f2fs_hw_support_discard (sbi) ||f2fs_hw_should_discard (sbi)) +set_opt (sbi,DISCARD ); + +if (f2fs_sb_has_blkzoned (sbi)) +F2FS_OPTION (sbi).discard_unit =DISCARD_UNIT_SECTION ; +else +F2FS_OPTION (sbi).discard_unit =DISCARD_UNIT_BLOCK ; + } +if (f2fs_sb_has_readonly (sbi))F2FS_OPTION (sbi).active_logs =NR_CURSEG_RO_TYPE ;else
@@ -2065,23 +2078,16 @@ static void default_options(struct f2fs_sb_info *sbi)set_opt (sbi,INLINE_XATTR );set_opt (sbi,INLINE_DATA );set_opt (sbi,INLINE_DENTRY ); -set_opt (sbi,READ_EXTENT_CACHE );set_opt (sbi,NOHEAP ); -clear_opt (sbi,DISABLE_CHECKPOINT );set_opt (sbi,MERGE_CHECKPOINT );F2FS_OPTION (sbi).unusable_cap =0 ; sbi->sb->s_flags |=SB_LAZYTIME ;if (!f2fs_sb_has_readonly (sbi) && !f2fs_readonly (sbi->sb))set_opt (sbi,FLUSH_MERGE ); -if (f2fs_hw_support_discard (sbi) ||f2fs_hw_should_discard (sbi)) -set_opt (sbi,DISCARD ); -if (f2fs_sb_has_blkzoned (sbi)) { +if (f2fs_sb_has_blkzoned (sbi))F2FS_OPTION (sbi).fs_mode =FS_MODE_LFS ; -F2FS_OPTION (sbi).discard_unit =DISCARD_UNIT_SECTION ; - }else { +else F2FS_OPTION (sbi).fs_mode =FS_MODE_ADAPTIVE ; -F2FS_OPTION (sbi).discard_unit =DISCARD_UNIT_BLOCK ; - }#ifdef CONFIG_F2FS_FS_XATTR set_opt (sbi,XATTR_USER );
@@ -2253,7 +2259,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)clear_sbi_flag (sbi,SBI_NEED_SB_WRITE ); } -default_options (sbi); +default_options (sbi, true);/* parse mount options */ err =parse_options (sb, data, true);
@@ -4150,7 +4156,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) sbi->s_chksum_seed =f2fs_chksum (sbi, ~0 , raw_super->uuid,sizeof (raw_super->uuid)); -default_options (sbi); +default_options (sbi, false);/* parse mount options */ options =kstrdup ((const char *)data,GFP_KERNEL );if (data && !options) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 20/228 i2c: Delete error messages for failed memory allocations
In reply to Greg Kroah-HartmanFrom: Markus Elfring <[email protected]>
[ Upstream commit 6b3b21a8542fd2fb6ffc61bc13b9419f0c58ebad ]
These issues were detected by using the Coccinelle software.
Stable-dep-of: 05f933d5f731 ("i2c: nomadik: Remove a useless call in the remove function")
--- drivers/i2c/busses/i2c-ibm_iic.c | 4 +--- drivers/i2c/busses/i2c-nomadik.c | 1 - drivers/i2c/busses/i2c-sh7760.c | 1 - drivers/i2c/busses/i2c-tiny-usb.c | 4 +--- 4 files changed, 2 insertions(+), 8 deletions(-)
drivers/i2c/busses/i2c-ibm_iic.c +1 -3
@@ -694,10 +694,8 @@ static int iic_probe(struct platform_device *ofdev)int ret; dev =kzalloc (sizeof (*dev),GFP_KERNEL ); -if (!dev) { -dev_err (&ofdev->dev,"failed to allocate device data\n" ); +if (!dev)return -ENOMEM ; - }platform_set_drvdata (ofdev, dev);
drivers/i2c/busses/i2c-nomadik.c +0 -1
@@ -972,7 +972,6 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) dev =devm_kzalloc (&adev->dev,sizeof (struct nmk_i2c_dev ),GFP_KERNEL );if (!dev) { -dev_err (&adev->dev,"cannot allocate memory\n" ); ret = -ENOMEM ; goto err_no_mem; }
drivers/i2c/busses/i2c-sh7760.c +0 -1
@@ -445,7 +445,6 @@ static int sh7760_i2c_probe(struct platform_device *pdev) id =kzalloc (sizeof (struct cami2c ),GFP_KERNEL );if (!id) { -dev_err (&pdev->dev,"no mem for private data\n" ); ret = -ENOMEM ; goto out0; }
drivers/i2c/busses/i2c-tiny-usb.c +1 -3
@@ -226,10 +226,8 @@ static int i2c_tiny_usb_probe(struct usb_interface *interface,/* allocate memory for our device state and initialize it */ dev =kzalloc (sizeof (*dev),GFP_KERNEL ); -if (dev ==NULL ) { -dev_err (&interface->dev,"Out of memory\n" ); +if (!dev) goto error; - } dev->usb_dev =usb_get_dev (interface_to_usbdev (interface)); dev->interface = interface;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 21/228 i2c: Improve size determinations
In reply to Greg Kroah-HartmanFrom: Markus Elfring <[email protected]>
[ Upstream commit 06e989578232da33a7fe96b04191b862af8b2cec ]
Replace the specification of a data structure by a pointer dereference as the parameter for the operator "sizeof" to make the corresponding size determination a bit safer according to the Linux coding style convention.
This issue was detected by using the Coccinelle software.
Stable-dep-of: 05f933d5f731 ("i2c: nomadik: Remove a useless call in the remove function")
--- drivers/i2c/busses/i2c-nomadik.c | 2 +- drivers/i2c/busses/i2c-sh7760.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-nomadik.c +1 -1
@@ -970,7 +970,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)struct i2c_vendor_data *vendor = id->data;u32 max_fifo_threshold = (vendor->fifodepth /2 ) -1 ; - dev =devm_kzalloc (&adev->dev,sizeof (struct nmk_i2c_dev ),GFP_KERNEL ); + dev =devm_kzalloc (&adev->dev,sizeof (*dev),GFP_KERNEL );if (!dev) { ret = -ENOMEM ; goto err_no_mem;
drivers/i2c/busses/i2c-sh7760.c +1 -1
@@ -443,7 +443,7 @@ static int sh7760_i2c_probe(struct platform_device *pdev) goto out0; } - id =kzalloc (sizeof (struct cami2c ),GFP_KERNEL ); + id =kzalloc (sizeof (*id),GFP_KERNEL );if (!id) { ret = -ENOMEM ; goto out0;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 22/228 i2c: nomadik: Remove unnecessary goto label
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit 1c5d33fff0d375e4ab7c4261dc62a286babbb4c6 ]
The err_no_mem goto label doesn't do anything. Remove it.
Stable-dep-of: 05f933d5f731 ("i2c: nomadik: Remove a useless call in the remove function")
--- drivers/i2c/busses/i2c-nomadik.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-)
drivers/i2c/busses/i2c-nomadik.c +8 -13
@@ -971,10 +971,9 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)u32 max_fifo_threshold = (vendor->fifodepth /2 ) -1 ; dev =devm_kzalloc (&adev->dev,sizeof (*dev),GFP_KERNEL ); -if (!dev) { - ret = -ENOMEM ; - goto err_no_mem; - } +if (!dev) +return -ENOMEM ; + dev->vendor = vendor; dev->adev = adev;nmk_i2c_of_probe (np, dev);
@@ -995,30 +994,27 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) dev->virtbase =devm_ioremap (&adev->dev, adev->res.start,resource_size (&adev->res)); -if (!dev->virtbase) { - ret = -ENOMEM ; - goto err_no_mem; - } +if (!dev->virtbase) +return -ENOMEM ; dev->irq = adev->irq[0 ]; ret =devm_request_irq (&adev->dev, dev->irq, i2c_irq_handler,0 ,DRIVER_NAME , dev);if (ret) {dev_err (&adev->dev,"cannot claim the irq %d\n" , dev->irq); - goto err_no_mem; +return ret; } dev->clk =devm_clk_get (&adev->dev,NULL );if (IS_ERR (dev->clk)) {dev_err (&adev->dev,"could not get i2c clock\n" ); - ret =PTR_ERR (dev->clk); - goto err_no_mem; +return PTR_ERR (dev->clk); } ret =clk_prepare_enable (dev->clk);if (ret) {dev_err (&adev->dev,"can't prepare_enable clock\n" ); - goto err_no_mem; +return ret; }init_hw (dev);
@@ -1049,7 +1045,6 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) err_no_adap:clk_disable_unprepare (dev->clk); - err_no_mem:return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 23/228 i2c: nomadik: Use devm_clk_get_enabled()
In reply to Greg Kroah-HartmanFrom: Andi Shyti <[email protected]>
[ Upstream commit 9c7174db4cdd111e10d19eed5c36fd978a14c8a2 ]
Replace the pair of functions, devm_clk_get() andclk_prepare_enable(), with a single functiondevm_clk_get_enabled().
Stable-dep-of: 05f933d5f731 ("i2c: nomadik: Remove a useless call in the remove function")
--- drivers/i2c/busses/i2c-nomadik.c | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-)
drivers/i2c/busses/i2c-nomadik.c +3 -15
@@ -1005,18 +1005,12 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)return ret; } - dev->clk =devm_clk_get (&adev->dev,NULL ); + dev->clk =devm_clk_get_enabled (&adev->dev,NULL );if (IS_ERR (dev->clk)) { -dev_err (&adev->dev,"could not get i2c clock\n" ); +dev_err (&adev->dev,"could enable i2c clock\n" );return PTR_ERR (dev->clk); } - ret =clk_prepare_enable (dev->clk); -if (ret) { -dev_err (&adev->dev,"can't prepare_enable clock\n" ); -return ret; - } -init_hw (dev); adap = &dev->adap;
@@ -1037,16 +1031,11 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) ret =i2c_add_adapter (adap);if (ret) - goto err_no_adap; +return ret;pm_runtime_put (&adev->dev);return 0 ; - - err_no_adap: -clk_disable_unprepare (dev->clk); - -return ret; }static void nmk_i2c_remove (struct amba_device *adev)
@@ -1060,7 +1049,6 @@ static void nmk_i2c_remove(struct amba_device *adev)clear_all_interrupts (dev);/* disable the controller */ i2c_clr_bit (dev->virtbase +I2C_CR ,I2C_CR_PE ); -clk_disable_unprepare (dev->clk);release_mem_region (res->start,resource_size (res)); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 24/228 i2c: nomadik: Remove a useless call in the remove function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 05f933d5f7318b03ff2028c1704dc867ac16f2c7 ]
Since commit 235602146ec9 ("i2c-nomadik: turn the platform driver to an amba driver"), there is no more request_mem_region() call in this driver.
So remove the release_mem_region() call from the remove function which is likely a left over.
--- drivers/i2c/busses/i2c-nomadik.c | 2 -- 1 file changed, 2 deletions(-)
drivers/i2c/busses/i2c-nomadik.c +0 -2
@@ -1040,7 +1040,6 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)static void nmk_i2c_remove (struct amba_device *adev) { -struct resource *res = &adev->res;struct nmk_i2c_dev *dev =amba_get_drvdata (adev);i2c_del_adapter (&dev->adap);
@@ -1049,7 +1048,6 @@ static void nmk_i2c_remove(struct amba_device *adev)clear_all_interrupts (dev);/* disable the controller */ i2c_clr_bit (dev->virtbase +I2C_CR ,I2C_CR_PE ); -release_mem_region (res->start,resource_size (res)); }static struct i2c_vendor_data vendor_stn8815 = {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 25/228 MIPS: Loongson: Move arch cflags to MIPS top level Makefile
In reply to Greg Kroah-HartmanFrom: Jiaxun Yang <[email protected]>
[ Upstream commit 194a835210521282ad31e8f7047556318611f596 ]
Arch cflags should be independent to Platform.
Stable-dep-of: 531b3d1195d0 ("MIPS: Loongson: Fix build error when make modules_install")
--- arch/mips/Makefile | 38 ++++++++++++++++++++++++++++++++++ arch/mips/loongson2ef/Platform | 35 ------------------------------- arch/mips/loongson64/Platform | 16 -------------- 3 files changed, 38 insertions(+), 51 deletions(-)
arch/mips/Makefile +38 -0
@@ -190,9 +190,47 @@ endif cflags-$(CONFIG_CAVIUM_CN63XXP1) += -Wa,-mfix-cn63xxp1 cflags-$(CONFIG_CPU_BMIPS) += -march=mips32 -Wa,-mips32 -Wa,--trap +cflags-$(CONFIG_CPU_LOONGSON2E) += -march=loongson2e -Wa,--trap +cflags-$(CONFIG_CPU_LOONGSON2F) += -march=loongson2f -Wa,--trap +# Some -march= flags enable MMI instructions, and GCC complains about that +# support being enabled alongside -msoft-float. Thus explicitly disable MMI. +cflags-$(CONFIG_CPU_LOONGSON2EF) += $(call cc-option,-mno-loongson-mmi) +ifdef CONFIG_CPU_LOONGSON64 +cflags-$(CONFIG_CPU_LOONGSON64) += -Wa,--trap +cflags-$(CONFIG_CC_IS_GCC) += -march=loongson3a +cflags-$(CONFIG_CC_IS_CLANG) += -march=mips64r2 +endif +cflags-$(CONFIG_CPU_LOONGSON64) += $(call cc-option,-mno-loongson-mmi) + cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,) cflags-$(CONFIG_CPU_R4400_WORKAROUNDS) += $(call cc-option,-mfix-r4400,) cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) +ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS +cflags-$(CONFIG_CPU_NOP_WORKAROUNDS) += -Wa,-mfix-loongson2f-nop +cflags-$(CONFIG_CPU_JUMP_WORKAROUNDS) += -Wa,-mfix-loongson2f-jump +endif + +# +# Some versions of binutils, not currently mainline as of 2019/02/04, support +# an -mfix-loongson3-llsc flag which emits a sync prior to each ll instruction +# to work around a CPU bug (see __SYNC_loongson3_war in asm/sync.h for a +# description). +# +# We disable this in order to prevent the assembler meddling with the +# instruction that labels refer to, ie. if we label an ll instruction: +# +# 1: ll v0, 0(a0) +# +# ...then with the assembler fix applied the label may actually point at a sync +# instruction inserted by the assembler, and if we were using the label in an +# exception table the table would no longer contain the address of the ll +# instruction. +# +# Avoid this by explicitly disabling that assembler behaviour. If upstream +# binutils does not merge support for the flag then we can revisit & remove +# this later - for now it ensures vendor toolchains don't cause problems. +# +cflags-$(CONFIG_CPU_LOONGSON64) += $(call as-option,-Wa$(comma)-mno-fix-loongson3-llsc,) # For smartmips configurations, there are hundreds of warnings due to ISA overrides # in assembly and header files. smartmips is only supported for MIPS32r1 onwards
arch/mips/loongson2ef/Platform +0 -35
@@ -2,41 +2,6 @@ # Loongson Processors' Support # -cflags-$(CONFIG_CPU_LOONGSON2EF) += -Wa,--trap -cflags-$(CONFIG_CPU_LOONGSON2E) += -march=loongson2e -cflags-$(CONFIG_CPU_LOONGSON2F) += -march=loongson2f -# -# Some versions of binutils, not currently mainline as of 2019/02/04, support -# an -mfix-loongson3-llsc flag which emits a sync prior to each ll instruction -# to work around a CPU bug (see __SYNC_loongson3_war in asm/sync.h for a -# description). -# -# We disable this in order to prevent the assembler meddling with the -# instruction that labels refer to, ie. if we label an ll instruction: -# -# 1: ll v0, 0(a0) -# -# ...then with the assembler fix applied the label may actually point at a sync -# instruction inserted by the assembler, and if we were using the label in an -# exception table the table would no longer contain the address of the ll -# instruction. -# -# Avoid this by explicitly disabling that assembler behaviour. If upstream -# binutils does not merge support for the flag then we can revisit & remove -# this later - for now it ensures vendor toolchains don't cause problems. -# -cflags-$(CONFIG_CPU_LOONGSON2EF) += $(call cc-option,-Wa$(comma)-mno-fix-loongson3-llsc,) - -# Enable the workarounds for Loongson2f -ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS -cflags-$(CONFIG_CPU_NOP_WORKAROUNDS) += -Wa,-mfix-loongson2f-nop -cflags-$(CONFIG_CPU_JUMP_WORKAROUNDS) += -Wa,-mfix-loongson2f-jump -endif - -# Some -march= flags enable MMI instructions, and GCC complains about that -# support being enabled alongside -msoft-float. Thus explicitly disable MMI. -cflags-y += $(call cc-option,-mno-loongson-mmi) - # # Loongson Machines' Support #
arch/mips/loongson64/Platform +0 -16
@@ -1,19 +1,3 @@ -# -# Loongson Processors' Support -# - - -cflags-$(CONFIG_CPU_LOONGSON64) += -Wa,--trap - -ifdef CONFIG_CPU_LOONGSON64 -cflags-$(CONFIG_CC_IS_GCC) += -march=loongson3a -cflags-$(CONFIG_CC_IS_CLANG) += -march=mips64r2 -endif - -# Some -march= flags enable MMI instructions, and GCC complains about that -# support being enabled alongside -msoft-float. Thus explicitly disable MMI. -cflags-y += $(call cc-option,-mno-loongson-mmi) - # # Loongson Machines' Support #
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 26/228 MIPS: Loongson: Fix build error when make modules_install
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
[ Upstream commit 531b3d1195d096f14e030c4b01ec3a53b80276bf ]
After commit 0e96ea5c3eb5904e5dc2f ("MIPS: Loongson64: Clean up use of cc-ifversion") we get a build error when make modules_install:
cc1: error: '-mloongson-mmi' must be used with '-mhard-float'
The reason is when make modules_install, 'call cc-option' doesn't work in $(KBUILD_CFLAGS) of 'CHECKFLAGS'. Then there is no -mno-loongson-mmi applied and -march=loongson3a enable MMI instructions.
To be detail, the error message comes from the CHECKFLAGS invocation of $(CC) but it has no impact on the final result of make modules_install, it is purely a cosmetic issue. The error occurs because cc-option is defined in scripts/Makefile.compiler, which is not included in Makefile when running 'make modules_install', as install targets are not supposed to require the compiler; see commit 805b2e1d427aab4b ("kbuild: include Makefile.compiler only when compiler is needed"). As a result, the call to check for '-mno-loongson-mmi' just never happens.
Fix this by partially reverting to the old logic, use 'call cc-option' to conditionally apply -march=loongson3a and -march=mips64r2.
By the way, Loongson-2E/2F is also broken in commit 13ceb48bc19c563e05f4 ("MIPS: Loongson2ef: Remove unnecessary {as,cc}-option calls") so fix it together.
--- arch/mips/Makefile | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-)
arch/mips/Makefile +3 -7
@@ -190,16 +190,12 @@ endif cflags-$(CONFIG_CAVIUM_CN63XXP1) += -Wa,-mfix-cn63xxp1 cflags-$(CONFIG_CPU_BMIPS) += -march=mips32 -Wa,-mips32 -Wa,--trap -cflags-$(CONFIG_CPU_LOONGSON2E) += -march=loongson2e -Wa,--trap -cflags-$(CONFIG_CPU_LOONGSON2F) += -march=loongson2f -Wa,--trap +cflags-$(CONFIG_CPU_LOONGSON2E) += $(call cc-option,-march=loongson2e) -Wa,--trap +cflags-$(CONFIG_CPU_LOONGSON2F) += $(call cc-option,-march=loongson2f) -Wa,--trap +cflags-$(CONFIG_CPU_LOONGSON64) += $(call cc-option,-march=loongson3a,-march=mips64r2) -Wa,--trap # Some -march= flags enable MMI instructions, and GCC complains about that # support being enabled alongside -msoft-float. Thus explicitly disable MMI. cflags-$(CONFIG_CPU_LOONGSON2EF) += $(call cc-option,-mno-loongson-mmi) -ifdef CONFIG_CPU_LOONGSON64 -cflags-$(CONFIG_CPU_LOONGSON64) += -Wa,--trap -cflags-$(CONFIG_CC_IS_GCC) += -march=loongson3a -cflags-$(CONFIG_CC_IS_CLANG) += -march=mips64r2 -endif cflags-$(CONFIG_CPU_LOONGSON64) += $(call cc-option,-mno-loongson-mmi) cflags-$(CONFIG_CPU_R4000_WORKAROUNDS) += $(call cc-option,-mfix-r4000,)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 27/228 PCI/ASPM: Return 0 or -ETIMEDOUT from pcie_retrain_link()
In reply to Greg Kroah-HartmanFrom: Bjorn Helgaas <[email protected]>
[ Upstream commit f5297a01ee805d7fa569d288ed65fc0f9ac9b03d ]
"pcie_retrain_link" is not a question with a true/false answer, so "bool" isn't quite the right return type. Return 0 for success or -ETIMEDOUT if the retrain failed. No functional change intended.
Stable-dep-of: e7e39756363a ("PCI/ASPM: Avoid link retraining race")
--- drivers/pci/pcie/aspm.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
drivers/pci/pcie/aspm.c +11 -9
@@ -193,7 +193,7 @@ static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist) link->clkpm_disable = blacklist ?1 :0 ; } -static bool pcie_retrain_link (struct pcie_link_state *link) +static int pcie_retrain_link (struct pcie_link_state *link) {struct pci_dev *parent = link->pdev;unsigned long end_jiffies;
@@ -220,7 +220,9 @@ static bool pcie_retrain_link(struct pcie_link_state *link)break ;msleep (1 ); }while (time_before (jiffies, end_jiffies)); -return !(reg16 &PCI_EXP_LNKSTA_LT ); +if (reg16 &PCI_EXP_LNKSTA_LT ) +return -ETIMEDOUT ; +return 0 ; }/*
@@ -289,15 +291,15 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) reg16 &= ~PCI_EXP_LNKCTL_CCC ;pcie_capability_write_word (parent,PCI_EXP_LNKCTL , reg16); -if (pcie_retrain_link (link)) -return ; +if (pcie_retrain_link (link)) { -/* Training failed. Restore common clock configurations */ -pci_err (parent,"ASPM: Could not configure common clock\n" ); -list_for_each_entry (child, &linkbus->devices, bus_list) -pcie_capability_write_word (child,PCI_EXP_LNKCTL , +/* Training failed. Restore common clock configurations */ +pci_err (parent,"ASPM: Could not configure common clock\n" ); +list_for_each_entry (child, &linkbus->devices, bus_list) +pcie_capability_write_word (child,PCI_EXP_LNKCTL , child_reg[PCI_FUNC (child->devfn)]); -pcie_capability_write_word (parent,PCI_EXP_LNKCTL , parent_reg); +pcie_capability_write_word (parent,PCI_EXP_LNKCTL , parent_reg); + } }/* Convert L0s latency encoding to ns */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 28/228 PCI/ASPM: Factor out pcie_wait_for_retrain()
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 9c7f136433d26592cb4d9cd00b4e15c33d9797c6 ]
Factor pcie_wait_for_retrain() out from pcie_retrain_link(). No functional change intended.
[bhelgaas: split out from
https: //lore.kernel.org/r/[email protected]]
Stable-dep-of: e7e39756363a ("PCI/ASPM: Avoid link retraining race")
--- drivers/pci/pcie/aspm.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
drivers/pci/pcie/aspm.c +18 -12
@@ -193,10 +193,26 @@ static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist) link->clkpm_disable = blacklist ?1 :0 ; } +static int pcie_wait_for_retrain (struct pci_dev *pdev) +{ +unsigned long end_jiffies; +u16 reg16; + +/* Wait for Link Training to be cleared by hardware */ + end_jiffies = jiffies +LINK_RETRAIN_TIMEOUT ; +do { +pcie_capability_read_word (pdev,PCI_EXP_LNKSTA , ®16); +if (!(reg16 &PCI_EXP_LNKSTA_LT )) +return 0 ; +msleep (1 ); + }while (time_before (jiffies, end_jiffies)); + +return -ETIMEDOUT ; +} +static int pcie_retrain_link (struct pcie_link_state *link) {struct pci_dev *parent = link->pdev; -unsigned long end_jiffies;u16 reg16;pcie_capability_read_word (parent,PCI_EXP_LNKCTL , ®16);
@@ -212,17 +228,7 @@ static int pcie_retrain_link(struct pcie_link_state *link)pcie_capability_write_word (parent,PCI_EXP_LNKCTL , reg16); } -/* Wait for link training end. Break out after waiting for timeout */ - end_jiffies = jiffies +LINK_RETRAIN_TIMEOUT ; -do { -pcie_capability_read_word (parent,PCI_EXP_LNKSTA , ®16); -if (!(reg16 &PCI_EXP_LNKSTA_LT )) -break ; -msleep (1 ); - }while (time_before (jiffies, end_jiffies)); -if (reg16 &PCI_EXP_LNKSTA_LT ) -return -ETIMEDOUT ; -return 0 ; +return pcie_wait_for_retrain (parent); }/*
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 29/228 PCI/ASPM: Avoid link retraining race
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit e7e39756363ad5bd83ddeae1063193d0f13870fd ]
PCIe r6.0.1, sec 7.5.3.7, recommends setting the link control parameters, then waiting for the Link Training bit to be clear before setting the Retrain Link bit.
This avoids a race where the LTSSM may not use the updated parameters if it is already in the midst of link training because of other normal link activity.
Wait for the Link Training bit to be clear before toggling the Retrain Link bit to ensure that the LTSSM uses the updated link control parameters.
[bhelgaas: commit log, return 0 (success)/-ETIMEDOUT instead of bool for both pcie_wait_for_retrain() and the existing pcie_retrain_link()]
--- drivers/pci/pcie/aspm.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/pci/pcie/aspm.c +11 -0
@@ -213,8 +213,19 @@ static int pcie_wait_for_retrain(struct pci_dev *pdev)static int pcie_retrain_link (struct pcie_link_state *link) {struct pci_dev *parent = link->pdev; +int rc;u16 reg16; +/* +* Ensure the updated LNKCTL parameters are used during link +* training by checking that there is no ongoing link training to +* avoid LTSSM race as recommended in Implementation Note at the +* end of PCIe r6.0.1 sec 7.5.3.7. +*/ + rc =pcie_wait_for_retrain (parent); +if (rc) +return rc; +pcie_capability_read_word (parent,PCI_EXP_LNKCTL , ®16); reg16 |=PCI_EXP_LNKCTL_RL ;pcie_capability_write_word (parent,PCI_EXP_LNKCTL , reg16);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 30/228 PCI: rockchip: Remove writes to unused registers
In reply to Greg Kroah-HartmanFrom: Rick Wertenbroek <[email protected]>
[ Upstream commit 92a9c57c325dd51682d428ba960d961fec3c8a08 ]
Remove write accesses to registers that are marked "unused" (and therefore read-only) in the technical reference manual (TRM) (see RK3399 TRM 17.6.8.1)
Stable-dep-of: dc73ed0f1b8b ("PCI: rockchip: Fix window mapping and address translation for endpoint")
--- drivers/pci/controller/pcie-rockchip-ep.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/pci/controller/pcie-rockchip-ep.c +0 -10
@@ -61,10 +61,6 @@ static void rockchip_pcie_clear_ep_ob_atu(struct rockchip_pcie *rockchip, ROCKCHIP_PCIE_AT_OB_REGION_DESC0(region));rockchip_pcie_write (rockchip,0 ,ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (region)); -rockchip_pcie_write (rockchip,0 , -ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR0 (region)); -rockchip_pcie_write (rockchip,0 , -ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR1 (region)); } static void rockchip_pcie_prog_ep_ob_atu(struct rockchip_pcie *rockchip, u8 fn,
@@ -114,12 +110,6 @@ static void rockchip_pcie_prog_ep_ob_atu(struct rockchip_pcie *rockchip, u8 fn, PCIE_CORE_OB_REGION_ADDR0_LO_ADDR); addr1 =upper_32_bits (cpu_addr); } - -/* CPU bus address region */ -rockchip_pcie_write (rockchip, addr0, -ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR0 (r)); -rockchip_pcie_write (rockchip, addr1, -ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR1 (r)); } static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 31/228 PCI: rockchip: Fix window mapping and address translation for endpoint
In reply to Greg Kroah-HartmanFrom: Rick Wertenbroek <[email protected]>
[ Upstream commit dc73ed0f1b8bddd7f2bf70d123e68ffc99ad71ce ]
The RK3399 PCI endpoint core has 33 windows for PCIe space, now in the driver up to 32 fixed size (1M) windows are used and pages are allocated and mapped accordingly. The driver first used a single window and allocated space inside which caused translation issues (between CPU space and PCI space) because a window can only have a single translation at a given time, which if multiple pages are allocated inside will cause conflicts. Now each window is a single region of 1M which will always guarantee that the translation is not in conflict.
Set the translation register addresses for physical function. As documented in the technical reference manual (TRM) section 17.5.5 "PCIe Address Translation" and section 17.6.8 "Address Translation Registers Description"
--- drivers/pci/controller/pcie-rockchip-ep.c | 128 ++++++++++------------ drivers/pci/controller/pcie-rockchip.h | 35 +++--- 2 files changed, 75 insertions(+), 88 deletions(-)
drivers/pci/controller/pcie-rockchip-ep.c +55 -73
@@ -64,52 +64,29 @@ static void rockchip_pcie_clear_ep_ob_atu(struct rockchip_pcie *rockchip, }static void rockchip_pcie_prog_ep_ob_atu (struct rockchip_pcie *rockchip,u8 fn, -u32 r,u32 type,u64 cpu_addr, -u64 pci_addr,size_t size) +u32 r,u64 cpu_addr,u64 pci_addr, +size_t size) { -u64 sz =1ULL <<fls64 (size -1 ); -int num_pass_bits =ilog2 (sz); -u32 addr0, addr1, desc0, desc1; -bool is_nor_msg = (type ==AXI_WRAPPER_NOR_MSG ); +int num_pass_bits =fls64 (size -1 ); +u32 addr0, addr1, desc0; -/* The minimal region size is 1MB */ if (num_pass_bits <8 ) num_pass_bits =8 ; - cpu_addr -= rockchip->mem_res->start; - addr0 = ((is_nor_msg ?0x10 : (num_pass_bits -1 )) & -PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) | - (lower_32_bits (cpu_addr) &PCIE_CORE_OB_REGION_ADDR0_LO_ADDR ); - addr1 =upper_32_bits (is_nor_msg ? cpu_addr : pci_addr); - desc0 =ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN (fn) | type; - desc1 =0 ; - -if (is_nor_msg) { -rockchip_pcie_write (rockchip,0 , -ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r)); -rockchip_pcie_write (rockchip,0 , -ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r)); -rockchip_pcie_write (rockchip, desc0, -ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r)); -rockchip_pcie_write (rockchip, desc1, -ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r)); - }else { -/* PCI bus address region */ -rockchip_pcie_write (rockchip, addr0, -ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r)); -rockchip_pcie_write (rockchip, addr1, -ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r)); -rockchip_pcie_write (rockchip, desc0, -ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r)); -rockchip_pcie_write (rockchip, desc1, -ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r)); - - addr0 = - ((num_pass_bits -1 ) &PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) | - (lower_32_bits (cpu_addr) & -PCIE_CORE_OB_REGION_ADDR0_LO_ADDR ); - addr1 =upper_32_bits (cpu_addr); - } + addr0 = ((num_pass_bits -1 ) &PCIE_CORE_OB_REGION_ADDR0_NUM_BITS ) | + (lower_32_bits (pci_addr) &PCIE_CORE_OB_REGION_ADDR0_LO_ADDR ); + addr1 =upper_32_bits (pci_addr); + desc0 =ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN (fn) |AXI_WRAPPER_MEM_WRITE ; + +/* PCI bus address region */ +rockchip_pcie_write (rockchip, addr0, +ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r)); +rockchip_pcie_write (rockchip, addr1, +ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r)); +rockchip_pcie_write (rockchip, desc0, +ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r)); +rockchip_pcie_write (rockchip,0 , +ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r)); } static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
@@ -248,26 +225,20 @@ static void rockchip_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn, ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR1(fn, bar)); } +static inline u32 rockchip_ob_region (phys_addr_t addr) +{ +return (addr >>ilog2 (SZ_1M )) &0x1f ; +} +static int rockchip_pcie_ep_map_addr (struct pci_epc *epc,u8 fn,u8 vfn,phys_addr_t addr,u64 pci_addr,size_t size) {struct rockchip_pcie_ep *ep =epc_get_drvdata (epc);struct rockchip_pcie *pcie = &ep->rockchip; -u32 r; +u32 r =rockchip_ob_region (addr); - r =find_first_zero_bit (&ep->ob_region_map,BITS_PER_LONG ); -/* -* Region 0 is reserved for configuration space and shouldn't -* be used elsewhere per TRM, so leave it out. -*/ -if (r >= ep->max_regions -1 ) { -dev_err (&epc->dev,"no free outbound region\n" ); -return -EINVAL ; - } - -rockchip_pcie_prog_ep_ob_atu (pcie, fn, r,AXI_WRAPPER_MEM_WRITE , addr, - pci_addr, size); +rockchip_pcie_prog_ep_ob_atu (pcie, fn, r, addr, pci_addr, size);set_bit (r, &ep->ob_region_map); ep->ob_addr[r] = addr;
@@ -282,15 +253,11 @@ static void rockchip_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,struct rockchip_pcie *rockchip = &ep->rockchip;u32 r; -for (r =0 ; r < ep->max_regions -1 ; r++) +for (r =0 ; r < ep->max_regions; r++)if (ep->ob_addr[r] == addr)break ; -/* -* Region 0 is reserved for configuration space and shouldn't -* be used elsewhere per TRM, so leave it out. -*/ -if (r == ep->max_regions -1 ) +if (r == ep->max_regions)return ;rockchip_pcie_clear_ep_ob_atu (rockchip, r);
@@ -387,7 +354,8 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,struct rockchip_pcie *rockchip = &ep->rockchip;u32 flags, mme, data, data_mask;u8 msi_count; -u64 pci_addr, pci_addr_mask =0xff ; +u64 pci_addr; +u32 r;/* Check MSI enable bit */ flags = rockchip_pcie_read(&ep->rockchip,
@@ -421,21 +389,20 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,ROCKCHIP_PCIE_EP_FUNC_BASE (fn) +ROCKCHIP_PCIE_EP_MSI_CTRL_REG + PCI_MSI_ADDRESS_LO); - pci_addr &=GENMASK_ULL (63 ,2 );/* Set the outbound region if needed. */ -if (unlikely (ep->irq_pci_addr != (pci_addr & ~pci_addr_mask) || +if (unlikely (ep->irq_pci_addr != (pci_addr &PCIE_ADDR_MASK ) || ep->irq_pci_fn != fn)) { -rockchip_pcie_prog_ep_ob_atu (rockchip, fn, ep->max_regions -1 , -AXI_WRAPPER_MEM_WRITE , + r =rockchip_ob_region (ep->irq_phys_addr); +rockchip_pcie_prog_ep_ob_atu (rockchip, fn, r, ep->irq_phys_addr, - pci_addr & ~pci_addr_mask, - pci_addr_mask +1 ); - ep->irq_pci_addr = (pci_addr & ~pci_addr_mask); + pci_addr &PCIE_ADDR_MASK , + ~PCIE_ADDR_MASK +1 ); + ep->irq_pci_addr = (pci_addr &PCIE_ADDR_MASK ); ep->irq_pci_fn = fn; } -writew (data, ep->irq_cpu_addr + (pci_addr & pci_addr_mask)); +writew (data, ep->irq_cpu_addr + (pci_addr & ~PCIE_ADDR_MASK ));return 0 ; }
@@ -517,6 +484,8 @@ static int rockchip_pcie_parse_ep_dt(struct rockchip_pcie *rockchip,if (err <0 || ep->max_regions >MAX_REGION_LIMIT ) ep->max_regions =MAX_REGION_LIMIT ; + ep->ob_region_map =0 ; + err =of_property_read_u8 (dev->of_node,"max-functions" , &ep->epc->max_functions);if (err <0 )
@@ -537,7 +506,8 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)struct rockchip_pcie *rockchip;struct pci_epc *epc;size_t max_regions; -int err; +struct pci_epc_mem_window *windows =NULL ; +int err, i; ep =devm_kzalloc (dev,sizeof (*ep),GFP_KERNEL );if (!ep)
@@ -584,15 +554,27 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)/* Only enable function 0 by default */ rockchip_pcie_write (rockchip,BIT (0 ),PCIE_CORE_PHY_FUNC_CFG ); - err =pci_epc_mem_init (epc, rockchip->mem_res->start, -resource_size (rockchip->mem_res),PAGE_SIZE ); + windows =devm_kcalloc (dev, ep->max_regions, +sizeof (struct pci_epc_mem_window ),GFP_KERNEL ); +if (!windows) { + err = -ENOMEM ; + goto err_uninit_port; + } +for (i =0 ; i < ep->max_regions; i++) { + windows[i].phys_base = rockchip->mem_res->start + (SZ_1M * i); + windows[i].size =SZ_1M ; + windows[i].page_size =SZ_1M ; + } + err =pci_epc_multi_mem_init (epc, windows, ep->max_regions); +devm_kfree (dev, windows); +if (err <0 ) {dev_err (dev,"failed to initialize the memory space\n" ); goto err_uninit_port; } ep->irq_cpu_addr =pci_epc_mem_alloc_addr (epc, &ep->irq_phys_addr, -SZ_128K ); +SZ_1M );if (!ep->irq_cpu_addr) {dev_err (dev,"failed to reserve memory space for MSI\n" ); err = -ENOMEM ;
drivers/pci/controller/pcie-rockchip.h +20 -15
@@ -139,6 +139,7 @@#define PCIE_RC_RP_ATS_BASE 0x400000#define PCIE_RC_CONFIG_NORMAL_BASE 0x800000 +#define PCIE_EP_PF_CONFIG_REGS_BASE 0x800000#define PCIE_RC_CONFIG_BASE 0xa00000#define PCIE_EP_CONFIG_BASE 0xa00000#define PCIE_EP_CONFIG_DID_VID (PCIE_EP_CONFIG_BASE + 0x00)
@@ -157,10 +158,11 @@#define PCIE_RC_CONFIG_THP_CAP (PCIE_RC_CONFIG_BASE + 0x274)#define PCIE_RC_CONFIG_THP_CAP_NEXT_MASK GENMASK(31, 20) +#define PCIE_ADDR_MASK 0xffffff00#define PCIE_CORE_AXI_CONF_BASE 0xc00000#define PCIE_CORE_OB_REGION_ADDR0 (PCIE_CORE_AXI_CONF_BASE + 0x0)#define PCIE_CORE_OB_REGION_ADDR0_NUM_BITS 0x3f -#define PCIE_CORE_OB_REGION_ADDR0_LO_ADDR 0xffffff00 +#define PCIE_CORE_OB_REGION_ADDR0_LO_ADDR PCIE_ADDR_MASK#define PCIE_CORE_OB_REGION_ADDR1 (PCIE_CORE_AXI_CONF_BASE + 0x4)#define PCIE_CORE_OB_REGION_DESC0 (PCIE_CORE_AXI_CONF_BASE + 0x8)#define PCIE_CORE_OB_REGION_DESC1 (PCIE_CORE_AXI_CONF_BASE + 0xc)
@@ -168,7 +170,7 @@#define PCIE_CORE_AXI_INBOUND_BASE 0xc00800#define PCIE_RP_IB_ADDR0 (PCIE_CORE_AXI_INBOUND_BASE + 0x0)#define PCIE_CORE_IB_REGION_ADDR0_NUM_BITS 0x3f -#define PCIE_CORE_IB_REGION_ADDR0_LO_ADDR 0xffffff00 +#define PCIE_CORE_IB_REGION_ADDR0_LO_ADDR PCIE_ADDR_MASK#define PCIE_RP_IB_ADDR1 (PCIE_CORE_AXI_INBOUND_BASE + 0x4)/* Size of one AXI Region (not Region 0) */
@@ -233,13 +235,15 @@#define ROCKCHIP_PCIE_EP_MSI_CTRL_ME BIT(16)#define ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP BIT(24)#define ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR 0x1 -#define ROCKCHIP_PCIE_EP_FUNC_BASE (fn) (((fn) << 12) & GENMASK(19, 12)) +#define ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR 0x3 +#define ROCKCHIP_PCIE_EP_FUNC_BASE (fn) \ + (PCIE_EP_PF_CONFIG_REGS_BASE + (((fn) << 12) & GENMASK(19, 12))) +#define ROCKCHIP_PCIE_EP_VIRT_FUNC_BASE (fn) \ + (PCIE_EP_PF_CONFIG_REGS_BASE + 0x10000 + (((fn) << 12) & GENMASK(19, 12)))#define ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR0 (fn, bar) \ - (PCIE_RC_RP_ATS_BASE + 0x0840 + (fn) * 0x0040 + (bar) * 0x0008) + (PCIE_CORE_AXI_CONF_BASE + 0x0828 + (fn) * 0x0040 + (bar) * 0x0008)#define ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR1 (fn, bar) \ - (PCIE_RC_RP_ATS_BASE + 0x0844 + (fn) * 0x0040 + (bar) * 0x0008) -#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x0000 + ((r) & 0x1f) * 0x0020) + (PCIE_CORE_AXI_CONF_BASE + 0x082c + (fn) * 0x0040 + (bar) * 0x0008)#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0_DEVFN_MASK GENMASK(19, 12)#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0_DEVFN (devfn) \ (((devfn) << 12) & \
@@ -247,20 +251,21 @@#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0_BUS_MASK GENMASK(27, 20)#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0_BUS (bus) \ (((bus) << 20) & ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0_BUS_MASK) +#define PCIE_RC_EP_ATR_OB_REGIONS_1_32 (PCIE_CORE_AXI_CONF_BASE + 0x0020) +#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0 (r) \ + (PCIE_RC_EP_ATR_OB_REGIONS_1_32 + 0x0000 + ((r) & 0x1f) * 0x0020)#define ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x0004 + ((r) & 0x1f) * 0x0020) + (PCIE_RC_EP_ATR_OB_REGIONS_1_32 + 0x0004 + ((r) & 0x1f) * 0x0020)#define ROCKCHIP_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID BIT(23)#define ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN_MASK GENMASK(31, 24)#define ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN (devfn) \ (((devfn) << 24) & ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN_MASK)#define ROCKCHIP_PCIE_AT_OB_REGION_DESC0 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x0008 + ((r) & 0x1f) * 0x0020) -#define ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x000c + ((r) & 0x1f) * 0x0020) -#define ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR0 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x0018 + ((r) & 0x1f) * 0x0020) -#define ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR1 (r) \ - (PCIE_RC_RP_ATS_BASE + 0x001c + ((r) & 0x1f) * 0x0020) + (PCIE_RC_EP_ATR_OB_REGIONS_1_32 + 0x0008 + ((r) & 0x1f) * 0x0020) +#define ROCKCHIP_PCIE_AT_OB_REGION_DESC1 (r) \ + (PCIE_RC_EP_ATR_OB_REGIONS_1_32 + 0x000c + ((r) & 0x1f) * 0x0020) +#define ROCKCHIP_PCIE_AT_OB_REGION_DESC2 (r) \ + (PCIE_RC_EP_ATR_OB_REGIONS_1_32 + 0x0010 + ((r) & 0x1f) * 0x0020)#define ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG0 (fn) \ (PCIE_CORE_CTRL_MGMT_BASE + 0x0240 + (fn) * 0x0008)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 32/228 PCI: rockchip: Dont advertise MSI-X in PCIe capabilities
In reply to Greg Kroah-HartmanFrom: Rick Wertenbroek <[email protected]>
[ Upstream commit a52587e0bee14cbeeadf48a24013828cb04b8df8 ]
The RK3399 PCIe endpoint controller cannot generate MSI-X IRQs. This is documented in the RK3399 technical reference manual (TRM) section 17.5.9 "Interrupt Support".
MSI-X capability should therefore not be advertised. Remove the MSI-X capability by editing the capability linked-list. The previous entry is the MSI capability, therefore get the next entry from the MSI-X capability entry and set it as next entry for the MSI capability. This in effect removes MSI-X from the list.
Linked list before : MSI cap -> MSI-X cap -> PCIe Device cap -> ... Linked list now : MSI cap -> PCIe Device cap -> ...
--- drivers/pci/controller/pcie-rockchip-ep.c | 24 +++++++++++++++++++++++ drivers/pci/controller/pcie-rockchip.h | 5 +++++ 2 files changed, 29 insertions(+)
drivers/pci/controller/pcie-rockchip-ep.c +24 -0
@@ -508,6 +508,7 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev)size_t max_regions;struct pci_epc_mem_window *windows =NULL ;int err, i; +u32 cfg_msi, cfg_msix_cp; ep =devm_kzalloc (dev,sizeof (*ep),GFP_KERNEL );if (!ep)
@@ -583,6 +584,29 @@ static int rockchip_pcie_ep_probe(struct platform_device *pdev) ep->irq_pci_addr =ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR ; +/* +* MSI-X is not supported but the controller still advertises the MSI-X +* capability by default, which can lead to the Root Complex side +* allocating MSI-X vectors which cannot be used. Avoid this by skipping +* the MSI-X capability entry in the PCIe capabilities linked-list: get +* the next pointer from the MSI-X entry and set that in the MSI +* capability entry (which is the previous entry). This way the MSI-X +* entry is skipped (left out of the linked-list) and not advertised. +*/ + cfg_msi =rockchip_pcie_read (rockchip,PCIE_EP_CONFIG_BASE + +ROCKCHIP_PCIE_EP_MSI_CTRL_REG ); + + cfg_msi &= ~ROCKCHIP_PCIE_EP_MSI_CP1_MASK ; + + cfg_msix_cp =rockchip_pcie_read (rockchip,PCIE_EP_CONFIG_BASE + +ROCKCHIP_PCIE_EP_MSIX_CAP_REG ) & +ROCKCHIP_PCIE_EP_MSIX_CAP_CP_MASK ; + + cfg_msi |= cfg_msix_cp; + +rockchip_pcie_write (rockchip, cfg_msi, +PCIE_EP_CONFIG_BASE +ROCKCHIP_PCIE_EP_MSI_CTRL_REG ); +rockchip_pcie_write (rockchip,PCIE_CLIENT_CONF_ENABLE ,PCIE_CLIENT_CONFIG );
drivers/pci/controller/pcie-rockchip.h +5 -0
@@ -227,6 +227,8 @@#define ROCKCHIP_PCIE_EP_CMD_STATUS 0x4#define ROCKCHIP_PCIE_EP_CMD_STATUS_IS BIT(19)#define ROCKCHIP_PCIE_EP_MSI_CTRL_REG 0x90 +#define ROCKCHIP_PCIE_EP_MSI_CP1_OFFSET 8 +#define ROCKCHIP_PCIE_EP_MSI_CP1_MASK GENMASK(15, 8)#define ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET 16#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET 17#define ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK GENMASK(19, 17)
@@ -234,6 +236,9 @@#define ROCKCHIP_PCIE_EP_MSI_CTRL_MME_MASK GENMASK(22, 20)#define ROCKCHIP_PCIE_EP_MSI_CTRL_ME BIT(16)#define ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP BIT(24) +#define ROCKCHIP_PCIE_EP_MSIX_CAP_REG 0xb0 +#define ROCKCHIP_PCIE_EP_MSIX_CAP_CP_OFFSET 8 +#define ROCKCHIP_PCIE_EP_MSIX_CAP_CP_MASK GENMASK(15, 8)#define ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR 0x1#define ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR 0x3#define ROCKCHIP_PCIE_EP_FUNC_BASE (fn) \
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 33/228 drm/amd/display: add FB_DAMAGE_CLIPS support
In reply to Greg Kroah-HartmanFrom: Hamza Mahfooz <[email protected]>
[ Upstream commit 30ebe41582d1ea5a7de990319f9e593dad4886f7 ]
Currently, userspace doesn't have a way to communicate selective updates to displays. So, enable support for FB_DAMAGE_CLIPS for DCN ASICs newer than DCN301, convert DRM damage clips to dc dirty rectangles and fill them into dirty_rects in fill_dc_dirty_rects().
Stable-dep-of: 72f1de49ffb9 ("drm/dp_mst: Clear MSG_RDY flag before sending new message")
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 130 +++++++++++------- .../amd/display/amdgpu_dm/amdgpu_dm_plane.c | 4 + 2 files changed, 88 insertions(+), 46 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +84 -46
@@ -4948,6 +4948,35 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev,return 0 ; } +static inline void fill_dc_dirty_rect (struct drm_plane *plane, +struct rect *dirty_rect,int32_t x, +int32_t y,int32_t width,int32_t height, +int *i,bool ffu) +{ +if (*i >DC_MAX_DIRTY_RECTS ) +return ; + +if (*i ==DC_MAX_DIRTY_RECTS ) + goto out; + + dirty_rect->x = x; + dirty_rect->y = y; + dirty_rect->width = width; + dirty_rect->height = height; + +if (ffu) +drm_dbg (plane->dev, +"[PLANE:%d] PSR FFU dirty rect size (%d, %d)\n" , + plane->base.id, width, height); +else +drm_dbg (plane->dev, +"[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)" , + plane->base.id, x, y, width, height); + +out: + (*i)++; +} +/** * fill_dc_dirty_rects() - Fill DC dirty regions for PSR selective updates *
@@ -4968,10 +4997,6 @@ static int fill_dc_plane_attributes(struct amdgpu_device *adev,* addition, certain use cases - such as cursor and multi-plane overlay (MPO) - * implicitly provide damage clips without any client support via the plane * bounds. -* -* Today, amdgpu_dm only supports the MPO and cursor usecase. -* -* TODO: Also enable for FB_DAMAGE_CLIPS */ static void fill_dc_dirty_rects(struct drm_plane *plane, struct drm_plane_state *old_plane_state,
@@ -4982,12 +5007,11 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,struct dm_crtc_state *dm_crtc_state =to_dm_crtc_state (crtc_state);struct rect *dirty_rects = flip_addrs->dirty_rects;uint32_t num_clips; +struct drm_mode_rect *clips;bool bb_changed;bool fb_changed;u32 i =0 ; - flip_addrs->dirty_rect_count =0 ; -/* * Cursor plane has it's own dirty rect update interface. See * dcn10_dmub_update_cursor_data and dmub_cmd_update_cursor_info_data
@@ -4995,20 +5019,20 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,if (plane->type ==DRM_PLANE_TYPE_CURSOR )return ; -/* -* Today, we only consider MPO use-case for PSR SU. If MPO not -* requested, and there is a plane update, do FFU. -*/ + num_clips =drm_plane_get_damage_clips_count (new_plane_state); + clips =drm_plane_get_damage_clips (new_plane_state); +if (!dm_crtc_state->mpo_requested) { - dirty_rects[0 ].x =0 ; - dirty_rects[0 ].y =0 ; - dirty_rects[0 ].width = dm_crtc_state->base.mode.crtc_hdisplay; - dirty_rects[0 ].height = dm_crtc_state->base.mode.crtc_vdisplay; - flip_addrs->dirty_rect_count =1 ; -DRM_DEBUG_DRIVER ("[PLANE:%d] PSR FFU dirty rect size (%d, %d)\n" , - new_plane_state->plane->base.id, - dm_crtc_state->base.mode.crtc_hdisplay, - dm_crtc_state->base.mode.crtc_vdisplay); +if (!num_clips || num_clips >DC_MAX_DIRTY_RECTS ) + goto ffu; + +for (; flip_addrs->dirty_rect_count < num_clips; clips++) +fill_dc_dirty_rect (new_plane_state->plane, + &dirty_rects[i], clips->x1, + clips->y1, clips->x2 - clips->x1, + clips->y2 - clips->y1, + &flip_addrs->dirty_rect_count, + false);return ; }
@@ -5019,7 +5043,6 @@ static void fill_dc_dirty_rects(struct drm_plane *plane,* If plane is moved or resized, also add old bounding box to dirty * rects. */ - num_clips =drm_plane_get_damage_clips_count (new_plane_state); fb_changed = old_plane_state->fb->base.id != new_plane_state->fb->base.id; bb_changed = (old_plane_state->crtc_x != new_plane_state->crtc_x ||
@@ -5027,36 +5050,51 @@ static void fill_dc_dirty_rects(struct drm_plane *plane, old_plane_state->crtc_w != new_plane_state->crtc_w || old_plane_state->crtc_h != new_plane_state->crtc_h); -DRM_DEBUG_DRIVER ("[PLANE:%d] PSR bb_changed:%d fb_changed:%d num_clips:%d\n" , - new_plane_state->plane->base.id, - bb_changed, fb_changed, num_clips); - -if (num_clips || fb_changed || bb_changed) { - dirty_rects[i].x = new_plane_state->crtc_x; - dirty_rects[i].y = new_plane_state->crtc_y; - dirty_rects[i].width = new_plane_state->crtc_w; - dirty_rects[i].height = new_plane_state->crtc_h; -DRM_DEBUG_DRIVER ("[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)\n" , - new_plane_state->plane->base.id, - dirty_rects[i].x, dirty_rects[i].y, - dirty_rects[i].width, dirty_rects[i].height); - i +=1 ; - } +drm_dbg (plane->dev, +"[PLANE:%d] PSR bb_changed:%d fb_changed:%d num_clips:%d\n" , + new_plane_state->plane->base.id, + bb_changed, fb_changed, num_clips); -/* Add old plane bounding-box if plane is moved or resized */ if (bb_changed) { - dirty_rects[i].x = old_plane_state->crtc_x; - dirty_rects[i].y = old_plane_state->crtc_y; - dirty_rects[i].width = old_plane_state->crtc_w; - dirty_rects[i].height = old_plane_state->crtc_h; -DRM_DEBUG_DRIVER ("[PLANE:%d] PSR SU dirty rect at (%d, %d) size (%d, %d)\n" , - old_plane_state->plane->base.id, - dirty_rects[i].x, dirty_rects[i].y, - dirty_rects[i].width, dirty_rects[i].height); - i +=1 ; - } +fill_dc_dirty_rect (new_plane_state->plane, &dirty_rects[i], + new_plane_state->crtc_x, + new_plane_state->crtc_y, + new_plane_state->crtc_w, + new_plane_state->crtc_h, &i, false); + +/* Add old plane bounding-box if plane is moved or resized */ +fill_dc_dirty_rect (new_plane_state->plane, &dirty_rects[i], + old_plane_state->crtc_x, + old_plane_state->crtc_y, + old_plane_state->crtc_w, + old_plane_state->crtc_h, &i, false); + } + +if (num_clips) { +for (; i < num_clips; clips++) +fill_dc_dirty_rect (new_plane_state->plane, + &dirty_rects[i], clips->x1, + clips->y1, clips->x2 - clips->x1, + clips->y2 - clips->y1, &i, false); + }else if (fb_changed && !bb_changed) { +fill_dc_dirty_rect (new_plane_state->plane, &dirty_rects[i], + new_plane_state->crtc_x, + new_plane_state->crtc_y, + new_plane_state->crtc_w, + new_plane_state->crtc_h, &i, false); + } + +if (i >DC_MAX_DIRTY_RECTS ) + goto ffu; flip_addrs->dirty_rect_count = i; +return ; + +ffu: +fill_dc_dirty_rect (new_plane_state->plane, &dirty_rects[0 ],0 ,0 , + dm_crtc_state->base.mode.crtc_hdisplay, + dm_crtc_state->base.mode.crtc_vdisplay, + &flip_addrs->dirty_rect_count, true); } static void update_stream_scaling_settings(const struct drm_display_mode *mode,
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_plane.c +4 -0
@@ -1600,6 +1600,10 @@ int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,drm_plane_create_rotation_property (plane,DRM_MODE_ROTATE_0 , supported_rotations); +if (dm->adev->ip_versions[DCE_HWIP ][0 ] >IP_VERSION (3 ,0 ,1 ) && + plane->type !=DRM_PLANE_TYPE_CURSOR ) +drm_plane_enable_fb_damage_clips (plane); +drm_plane_helper_add (plane, &dm_plane_helper_funcs);#ifdef CONFIG_DRM_AMD_DC_HDR
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 34/228 drm/amd/display: Check if link state is valid
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit 03ce7b387e8b0f4a1dc97a878545bdf7c7f23251 ]
The link state is set to false if there is no link and local sink. Even though the stream state may not change, it is desirable to commit the new stream when HPD goes low to high.
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc.c +2 -0
@@ -1517,6 +1517,8 @@ static bool context_changed(for (i =0 ; i < dc->current_state->stream_count; i++) {if (dc->current_state->streams[i] != context->streams[i])return true; +if (!context->streams[i]->link->link_state_valid) +return true; }return false;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 35/228 drm/amd/display: Rework context change check
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit 10fdb0a11c555e0d6f7698d2874581d06e99ee71 ]
Context change is all about streams; for this reason, this commit renames context_changed to streams_changed. Additionally, to make this function more flexible, this commit changes the function signature to receive the stream array and the stream count as a parameter.
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +7 -7
@@ -1505,19 +1505,19 @@ static void program_timing_sync( } } -static bool context_changed ( -struct dc *dc, -struct dc_state *context) +static bool streams_changed (struct dc *dc, +struct dc_stream_state *streams[], +uint8_t stream_count) {uint8_t i; -if (context->stream_count != dc->current_state->stream_count) +if (stream_count != dc->current_state->stream_count)return true;for (i =0 ; i < dc->current_state->stream_count; i++) { -if (dc->current_state->streams[i] != context->streams[i]) +if (dc->current_state->streams[i] != streams[i])return true; -if (!context->streams[i]->link->link_state_valid) +if (!streams[i]->link->link_state_valid)return true; }
@@ -1918,7 +1918,7 @@ bool dc_commit_state(struct dc *dc, struct dc_state *context)enum dc_status result =DC_ERROR_UNEXPECTED ;int i; -if (!context_changed (dc, context)) +if (!streams_changed (dc, context->streams, context->stream_count))return DC_OK ; DC_LOG_DC("%s: %d streams\n",
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 36/228 drm/amd/display: Enable new commit sequence only for DCN32x
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit 7b36f4d18e3e4941d12fe027ad6ad6123c257027 ]
Change commit sequence will impact all ASICs. It is prudent to run this update in small steps to keep issues under control and avoid any potential regression. With this idea in mind, this commit is preparation work for the complete transition to the new commit sequence. To maintain this change manageable across multiple ASICs, this commit adds a new function named dc_commit_streams which is a copy of the dc_commit_state with some minor changes. Finally, inside the dc_commit_state, we check if we are using DCN32x or above and enable the new sequence only for those devices.
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 46 ++++++++++++++++++++++++ drivers/gpu/drm/amd/display/dc/dc.h | 13 +++---- 2 files changed, 50 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +46 -0
@@ -1913,11 +1913,57 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *creturn result; } +enum dc_status dc_commit_streams (struct dc *dc,struct dc_state *context) +{ +enum dc_status res =DC_OK ; +int i; + +if (!streams_changed (dc, context->streams, context->stream_count)) +return res; + +DC_LOG_DC ("%s: %d streams\n" , + __func__, context->stream_count); + +for (i =0 ; i < context->stream_count; i++) { +struct dc_stream_state *stream = context->streams[i]; + +dc_stream_log (dc, stream); + } + +/* +* Previous validation was perfomred with fast_validation = true and +* the full DML state required for hardware programming was skipped. +* +* Re-validate here to calculate these parameters / watermarks. +*/ + res =dc_validate_global_state (dc, context, false); +if (res !=DC_OK ) { +DC_LOG_ERROR ("DC commit global validation failure: %s (%d)" , +dc_status_to_str (res), res); +return res; + } + + res =dc_commit_state_no_check (dc, context); + +return (res ==DC_OK ); +} + +/* TODO: When the transition to the new commit sequence is done, remove this +* function in favor of dc_commit_streams. */ bool dc_commit_state (struct dc *dc,struct dc_state *context) {enum dc_status result =DC_ERROR_UNEXPECTED ;int i; +/* TODO: Since change commit sequence can have a huge impact, +* we decided to only enable it for DCN3x. However, as soon as +* we get more confident about this change we'll need to enable +* the new sequence for all ASICs. */ +if (dc->ctx->dce_version >=DCN_VERSION_3_2 ) { + result =dc_commit_streams (dc, context); +return result ==DC_OK ; + } +if (!streams_changed (dc, context->streams, context->stream_count))return DC_OK ;
drivers/gpu/drm/amd/display/dc/dc.h +4 -9
@@ -1326,15 +1326,10 @@ void dc_resource_state_destruct(struct dc_state *context);bool dc_resource_is_dsc_encoding_supported (const struct dc *dc); -/* -* TODO update to make it about validation sets -* Set up streams and links associated to drive sinks -* The streams parameter is an absolute set of all active streams. -* -* After this call: -* Phy, Encoder, Timing Generator are programmed and enabled. -* New streams are enabled with blank stream; no memory read. -*/ +enum dc_status dc_commit_streams (struct dc *dc,struct dc_state *context); + +/* TODO: When the transition to the new commit sequence is done, remove this +* function in favor of dc_commit_streams. */ bool dc_commit_state (struct dc *dc,struct dc_state *context);struct dc_state *dc_create_state (struct dc *dc);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 37/228 drm/amd/display: Copy DC context in the commit streams
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit 0e986cea0347902b2c72b09c8fe9c0f30d7decb4 ]
DC adds an instance of DML (which contains VBA) to each context, and multiple threads might write back to the global VBA resulting in data overwriting. To keep the consistency with other parts of the DC code, this commit changes dc_commit_streams to copy the current DC state, and as a result, it also changes the function signature to expect streams instead of a context.
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 41 +++++++++++++++++++----- drivers/gpu/drm/amd/display/dc/dc.h | 4 ++- 2 files changed, 36 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +33 -8
@@ -1913,23 +1913,44 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *creturn result; } -enum dc_status dc_commit_streams (struct dc *dc,struct dc_state *context) +/** +* dc_commit_streams - Commit current stream state +* +* @dc: DC object with the commit state to be configured in the hardware +* @streams: Array with a list of stream state +* @stream_count: Total of streams +* +* Function responsible for commit streams change to the hardware. +* +* Return: +* Return DC_OK if everything work as expected, otherwise, return a dc_status +* code. +*/ +enum dc_status dc_commit_streams (struct dc *dc, +struct dc_stream_state *streams[], +uint8_t stream_count) { -enum dc_status res =DC_OK ;int i; +struct dc_state *context; +enum dc_status res =DC_OK ; -if (!streams_changed (dc, context->streams, context->stream_count)) +if (!streams_changed (dc, streams, stream_count))return res; -DC_LOG_DC ("%s: %d streams\n" , - __func__, context->stream_count); +DC_LOG_DC ("%s: %d streams\n" , __func__, stream_count); -for (i =0 ; i < context->stream_count; i++) { -struct dc_stream_state *stream = context->streams[i]; +for (i =0 ; i < stream_count; i++) { +struct dc_stream_state *stream = streams[i];dc_stream_log (dc, stream); } + context =dc_create_state (dc); +if (!context) + goto context_alloc_fail; + +dc_resource_state_copy_construct_current (dc, context); +/* * Previous validation was perfomred with fast_validation = true and * the full DML state required for hardware programming was skipped.
@@ -1945,6 +1966,10 @@ enum dc_status dc_commit_streams(struct dc *dc, struct dc_state *context) res =dc_commit_state_no_check (dc, context); +context_alloc_fail: + +DC_LOG_DC ("%s Finished.\n" , __func__); +return (res ==DC_OK ); }
@@ -1960,7 +1985,7 @@ bool dc_commit_state(struct dc *dc, struct dc_state *context)* we get more confident about this change we'll need to enable * the new sequence for all ASICs. */ if (dc->ctx->dce_version >=DCN_VERSION_3_2 ) { - result =dc_commit_streams (dc, context); + result =dc_commit_streams (dc, context->streams, context->stream_count);return result ==DC_OK ; }
drivers/gpu/drm/amd/display/dc/dc.h +3 -1
@@ -1326,7 +1326,9 @@ void dc_resource_state_destruct(struct dc_state *context);bool dc_resource_is_dsc_encoding_supported (const struct dc *dc); -enum dc_status dc_commit_streams (struct dc *dc,struct dc_state *context); +enum dc_status dc_commit_streams (struct dc *dc, +struct dc_stream_state *streams[], +uint8_t stream_count);/* TODO: When the transition to the new commit sequence is done, remove this * function in favor of dc_commit_streams. */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 38/228 drm/amd/display: Include surface of unaffected streams
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit f6ae69f49fcf697b6ffa93d58eb3746897f61cf8 ]
The commit stream function does not include surfaces of unaffected streams, which may lead to some blank screens during mode change in some edge cases. This commit adds surfaces of unaffected streams followed by kernel-doc for documenting some of the fields that participate in this change.
v2: squash in kerneldoc warning fix (Alex)
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 12 +++++++++++- drivers/gpu/drm/amd/display/dc/dc.h | 15 +++++++++++++-- drivers/gpu/drm/amd/display/dc/dc_stream.h | 4 ++++ 3 files changed, 28 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +11 -1
@@ -1930,9 +1930,10 @@ enum dc_status dc_commit_streams(struct dc *dc,struct dc_stream_state *streams[], uint8_t stream_count) { - int i; + int i, j;struct dc_state *context;enum dc_status res =DC_OK ; +struct dc_validation_set set[MAX_STREAMS ] = {0 };if (!streams_changed (dc, streams, stream_count))return res;
@@ -1941,8 +1942,17 @@ enum dc_status dc_commit_streams(struct dc *dc,for (i =0 ; i < stream_count; i++) {struct dc_stream_state *stream = streams[i]; +struct dc_stream_status *status =dc_stream_get_status (stream);dc_stream_log (dc, stream); + + set[i].stream = stream; + +if (status) { + set[i].plane_count = status->plane_count; +for (j =0 ; j < status->plane_count; j++) + set[i].plane_states[j] = status->plane_states[j]; + } } context =dc_create_state (dc);
drivers/gpu/drm/amd/display/dc/dc.h +13 -2
@@ -1274,12 +1274,23 @@ void dc_post_update_surfaces_to_stream(#include "dc_stream.h" -/* -* Structure to store surface/stream associations for validation +/** +* struct dc_validation_set - Struct to store surface/stream associations for validation */ struct dc_validation_set { +/** +* @stream: Stream state properties +*/ struct dc_stream_state *stream; + +/** +* @plane_state: Surface state +*/ struct dc_plane_state *plane_states[MAX_SURFACES ]; + +/** +* @plane_count: Total of active planes +*/ uint8_t plane_count; };
drivers/gpu/drm/amd/display/dc/dc_stream.h +4 -0
@@ -41,6 +41,10 @@ struct timing_sync_info {struct dc_stream_status {int primary_otg_inst;int stream_enc_inst; + +/** +* @plane_count: Total of planes attached to a single stream +*/ int plane_count;int audio_inst;struct timing_sync_info timing_sync_info;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 39/228 drm/amd/display: Use min transition for all SubVP plane add/remove
In reply to Greg Kroah-HartmanFrom: Alvin Lee <[email protected]>
[ Upstream commit e4c1b01bc35b04e15782608165aa85b9e1724f7b ]
[Description]
- Whenever disabling a phantom pipe, we must run through the minimal transition sequence
- In the case where SetVisibility = false for the main pipe, we also need to run through the min transtion when disabling the phantom pipes
Stable-dep-of: 59de751e3845 ("drm/amd/display: add ODM case when looking for first split pipe")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 31 +++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +22 -9
@@ -3731,17 +3731,17 @@ static bool could_mpcc_tree_change_for_active_pipes(struct dc *dc, } } -/* For SubVP when adding MPO video we need to add a minimal transition. +/* For SubVP when adding or removing planes we need to add a minimal transition +* (even when disabling all planes). Whenever disabling a phantom pipe, we +* must use the minimal transition path to disable the pipe correctly. */ if (cur_stream_status && stream->mall_stream_config.type ==SUBVP_MAIN ) {/* determine if minimal transition is required due to SubVP*/ -if (surface_count >0 ) { -if (cur_stream_status->plane_count > surface_count) { - force_minimal_pipe_splitting = true; - }else if (cur_stream_status->plane_count < surface_count) { - force_minimal_pipe_splitting = true; - *is_plane_addition = true; - } +if (cur_stream_status->plane_count > surface_count) { + force_minimal_pipe_splitting = true; + }else if (cur_stream_status->plane_count < surface_count) { + force_minimal_pipe_splitting = true; + *is_plane_addition = true; } }
@@ -3758,6 +3758,7 @@ static bool commit_minimal_transition_state(struct dc *dc,enum dc_status ret =DC_ERROR_UNEXPECTED ;unsigned int i, j;unsigned int pipe_in_use =0 ; +bool subvp_in_use = false;if (!transition_context)return false;
@@ -3770,6 +3771,18 @@ static bool commit_minimal_transition_state(struct dc *dc, pipe_in_use++; } +/* If SubVP is enabled and we are adding or removing planes from any main subvp +* pipe, we must use the minimal transition. +*/ +for (i =0 ; i < dc->res_pool->pipe_count; i++) { +struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +if (pipe->stream && pipe->stream->mall_stream_config.type ==SUBVP_PHANTOM ) { + subvp_in_use = true; +break ; + } + } +/* When the OS add a new surface if we have been used all of pipes with odm combine * and mpc split feature, it need use commit_minimal_transition_state to transition safely. * After OS exit MPO, it will back to use odm and mpc split with all of pipes, we need
@@ -3778,7 +3791,7 @@ static bool commit_minimal_transition_state(struct dc *dc,* Reduce the scenarios to use dc_commit_state_no_check in the stage of flip. Especially * enter/exit MPO when DCN still have enough resources. */ -if (pipe_in_use != dc->res_pool->pipe_count) { +if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use) {dc_release_state (transition_context);return true; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 40/228 drm/amd/display: add ODM case when looking for first split pipe
In reply to Greg Kroah-HartmanFrom: Samson Tam <[email protected]>
[ Upstream commit 59de751e3845d699e02dc4da47322b92d83a41e2 ]
[Why]
When going from ODM 2:1 single display case to max displays, second odm pipe needs to be repurposed for one of the new single displays. However, acquire_first_split_pipe() only handles MPC case and not ODM case
[How]
Add ODM conditions in acquire_first_split_pipe()
Add commit_minimal_transition_state() in commit_streams() to handle odm 2:1 exit first, and then process new streams
Handle ODM condition in commit_minimal_transition_state()
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 36 ++++++++++++++++++- .../gpu/drm/amd/display/dc/core/dc_resource.c | 20 +++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +35 -1
@@ -1913,6 +1913,9 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *creturn result; } +static bool commit_minimal_transition_state (struct dc *dc, +struct dc_state *transition_base_context); +/** * dc_commit_streams - Commit current stream state *
@@ -1934,6 +1937,8 @@ enum dc_status dc_commit_streams(struct dc *dc,struct dc_state *context;enum dc_status res =DC_OK ;struct dc_validation_set set[MAX_STREAMS ] = {0 }; +struct pipe_ctx *pipe; +bool handle_exit_odm2to1 = false;if (!streams_changed (dc, streams, stream_count))return res;
@@ -1955,6 +1960,22 @@ enum dc_status dc_commit_streams(struct dc *dc, } } +/* Check for case where we are going from odm 2:1 to max +* pipe scenario. For these cases, we will call +* commit_minimal_transition_state() to exit out of odm 2:1 +* first before processing new streams +*/ +if (stream_count == dc->res_pool->pipe_count) { +for (i =0 ; i < dc->res_pool->pipe_count; i++) { + pipe = &dc->current_state->res_ctx.pipe_ctx[i]; +if (pipe->next_odm_pipe) + handle_exit_odm2to1 = true; + } + } + +if (handle_exit_odm2to1) + res =commit_minimal_transition_state (dc, dc->current_state); + context =dc_create_state (dc);if (!context) goto context_alloc_fail;
@@ -3759,6 +3780,7 @@ static bool commit_minimal_transition_state(struct dc *dc,unsigned int i, j;unsigned int pipe_in_use =0 ;bool subvp_in_use = false; +bool odm_in_use = false;if (!transition_context)return false;
@@ -3783,6 +3805,18 @@ static bool commit_minimal_transition_state(struct dc *dc, } } +/* If ODM is enabled and we are adding or removing planes from any ODM +* pipe, we must use the minimal transition. +*/ +for (i =0 ; i < dc->res_pool->pipe_count; i++) { +struct pipe_ctx *pipe = &dc->current_state->res_ctx.pipe_ctx[i]; + +if (pipe->stream && pipe->next_odm_pipe) { + odm_in_use = true; +break ; + } + } +/* When the OS add a new surface if we have been used all of pipes with odm combine * and mpc split feature, it need use commit_minimal_transition_state to transition safely. * After OS exit MPO, it will back to use odm and mpc split with all of pipes, we need
@@ -3791,7 +3825,7 @@ static bool commit_minimal_transition_state(struct dc *dc,* Reduce the scenarios to use dc_commit_state_no_check in the stage of flip. Especially * enter/exit MPO when DCN still have enough resources. */ -if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use) { +if (pipe_in_use != dc->res_pool->pipe_count && !subvp_in_use && !odm_in_use) {dc_release_state (transition_context);return true; }
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +20 -0
@@ -1444,6 +1444,26 @@ static int acquire_first_split_pipe( split_pipe->plane_res.mpcc_inst = pool->dpps[i]->inst; split_pipe->pipe_idx = i; + split_pipe->stream = stream; +return i; + }else if (split_pipe->prev_odm_pipe && + split_pipe->prev_odm_pipe->plane_state == split_pipe->plane_state) { + split_pipe->prev_odm_pipe->next_odm_pipe = split_pipe->next_odm_pipe; +if (split_pipe->next_odm_pipe) + split_pipe->next_odm_pipe->prev_odm_pipe = split_pipe->prev_odm_pipe; + +if (split_pipe->prev_odm_pipe->plane_state) +resource_build_scaling_params (split_pipe->prev_odm_pipe); + +memset (split_pipe,0 ,sizeof (*split_pipe)); + split_pipe->stream_res.tg = pool->timing_generators[i]; + split_pipe->plane_res.hubp = pool->hubps[i]; + split_pipe->plane_res.ipp = pool->ipps[i]; + split_pipe->plane_res.dpp = pool->dpps[i]; + split_pipe->stream_res.opp = pool->opps[i]; + split_pipe->plane_res.mpcc_inst = pool->dpps[i]->inst; + split_pipe->pipe_idx = i; + split_pipe->stream = stream;return i; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 41/228 drm/amd/display: use low clocks for no plane configs
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit 2641c7b7808191cba25ba28b82bb73ca294924cc ]
Stream only configurations do not require DCFCLK, SOCCLK, DPPCLK or FCLK. They also always allow pstate change.
Stable-dep-of: 49f26218c344 ("drm/amd/display: fix dcn315 single stream crb allocation")
--- .../drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 18 ++++++++++++++---- .../drm/amd/display/dc/dml/dcn32/dcn32_fpu.c | 14 +++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +14 -4
@@ -483,7 +483,7 @@ void dcn31_calculate_wm_and_dlg_fp(int pipe_cnt, int vlevel) { - int i, pipe_idx, active_dpp_count = 0; + int i, pipe_idx, active_hubp_count = 0;double dcfclk = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];dc_assert_fp_enabled ();
@@ -529,7 +529,7 @@ void dcn31_calculate_wm_and_dlg_fp(continue ;if (context->res_ctx.pipe_ctx[i].plane_state) - active_dpp_count++; + active_hubp_count++; pipes[pipe_idx].clks_cfg.dispclk_mhz =get_dispclk_calculated (&context->bw_ctx.dml, pipes, pipe_cnt); pipes[pipe_idx].clks_cfg.dppclk_mhz =get_dppclk_calculated (&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx);
@@ -547,9 +547,19 @@ void dcn31_calculate_wm_and_dlg_fp( }dcn20_calculate_dlg_params (dc, context, pipes, pipe_cnt, vlevel); -/* For 31x apu pstate change is only supported if possible in vactive or if there are no active dpps */ +/* For 31x apu pstate change is only supported if possible in vactive*/ context->bw_ctx.bw.dcn.clk.p_state_change_support = - context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][context->bw_ctx.dml.vba.maxMpcComb] == dm_dram_clock_change_vactive || !active_dpp_count; + context->bw_ctx.dml.vba.DRAMClockChangeSupport[vlevel][context->bw_ctx.dml.vba.maxMpcComb] == dm_dram_clock_change_vactive; +/* If DCN isn't making memory requests we can allow pstate change and lower clocks */ +if (!active_hubp_count) { + context->bw_ctx.bw.dcn.clk.socclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dppclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dcfclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dcfclk_deep_sleep_khz =0 ; + context->bw_ctx.bw.dcn.clk.dramclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.fclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.p_state_change_support = true; + } }void dcn31_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params)
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c +13 -1
@@ -1237,7 +1237,7 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context,display_e2e_pipe_params_st *pipes, int pipe_cnt, int vlevel) { - int i, pipe_idx; + int i, pipe_idx, active_hubp_count = 0;bool usr_retraining_support = false;bool unbounded_req_enabled = false;
@@ -1282,6 +1282,8 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context,for (i =0 , pipe_idx =0 ; i < dc->res_pool->pipe_count; i++) {if (!context->res_ctx.pipe_ctx[i].stream)continue ; +if (context->res_ctx.pipe_ctx[i].plane_state) + active_hubp_count++; pipes[pipe_idx].pipe.dest.vstartup_start =get_vstartup (&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); pipes[pipe_idx].pipe.dest.vupdate_offset = get_vupdate_offset(&context->bw_ctx.dml, pipes, pipe_cnt,
@@ -1307,6 +1309,16 @@ static void dcn32_calculate_dlg_params(struct dc *dc, struct dc_state *context, context->res_ctx.pipe_ctx[i].pipe_dlg_param = pipes[pipe_idx].pipe.dest; pipe_idx++; } +/* If DCN isn't making memory requests we can allow pstate change and lower clocks */ +if (!active_hubp_count) { + context->bw_ctx.bw.dcn.clk.socclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dppclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dcfclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.dcfclk_deep_sleep_khz =0 ; + context->bw_ctx.bw.dcn.clk.dramclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.fclk_khz =0 ; + context->bw_ctx.bw.dcn.clk.p_state_change_support = true; + }/*save a original dppclock copy*/ context->bw_ctx.bw.dcn.clk.bw_dppclk_khz = context->bw_ctx.bw.dcn.clk.dppclk_khz; context->bw_ctx.bw.dcn.clk.bw_dispclk_khz = context->bw_ctx.bw.dcn.clk.dispclk_khz;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 42/228 drm/amd/display: fix unbounded requesting for high pixel rate modes on dcn315
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit 655435df0936ce2fda0d5ced7e50101179a3acfd ]
Unbounded requesting is getting configured for odm mode calculations which is incorrect. This change checks whether mode requires odm ahead of time.
Stable-dep-of: 49f26218c344 ("drm/amd/display: fix dcn315 single stream crb allocation")
--- drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c | 4 +++- drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 5 +++++ drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c +3 -1
@@ -1707,7 +1707,9 @@ static int dcn315_populate_dml_pipes_from_context( dc->config.enable_4to1MPC = true; context->bw_ctx.dml.ip.det_buffer_size_kbytes = (max_usable_det /DCN3_15_CRB_SEGMENT_SIZE_KB /4 ) *DCN3_15_CRB_SEGMENT_SIZE_KB ; - }else if (!is_dual_plane (pipe->plane_state->format) && pipe->plane_state->src_rect.width <=5120 ) { + }else if (!is_dual_plane (pipe->plane_state->format) + && pipe->plane_state->src_rect.width <=5120 + && pipe->stream->timing.pix_clk_100hz <dcn_get_max_non_odm_pix_rate_100hz (&dc->dml.soc)) {/* Limit to 5k max to avoid forced pipe split when there is not enough detile for swath */ context->bw_ctx.dml.ip.det_buffer_size_kbytes =192 ; pipes[0 ].pipe.src.unbounded_req_mode = true;
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +5 -0
@@ -807,3 +807,8 @@ void dcn316_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_paramelse dml_init_instance (&dc->dml, &dcn3_16_soc, &dcn3_16_ip,DML_PROJECT_DCN31_FPGA ); } + +int dcn_get_max_non_odm_pix_rate_100hz (struct _vcs_dpi_soc_bounding_box_st *soc) +{ +return soc->clock_limits[0 ].dispclk_mhz *10000.0 / (1.0 + soc->dcn_downspread_percent /100.0 ); +}
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h +1 -0
@@ -46,5 +46,6 @@ void dcn31_calculate_wm_and_dlg_fp(void dcn31_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params);void dcn315_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params);void dcn316_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params); +int dcn_get_max_non_odm_pix_rate_100hz (struct _vcs_dpi_soc_bounding_box_st *soc);#endif /* __DCN31_FPU_H__*/
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 43/228 drm/amd/display: add pixel rate based CRB allocation support
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit 9ba90d760e9354c124fa9bbea08017d96699a82c ]
This feature is meant to unblock PSTATE for certain high end display configs on dcn315. This is achieved by allocating CRB to detile buffer based on display requirements to meet pstate latency hiding needs.
Stable-dep-of: 49f26218c344 ("drm/amd/display: fix dcn315 single stream crb allocation")
--- .../drm/amd/display/dc/dcn31/dcn31_hubbub.c | 1 + .../amd/display/dc/dcn315/dcn315_resource.c | 97 ++++++++++++++++++- .../drm/amd/display/dc/dml/dcn31/dcn31_fpu.c | 25 ++++- .../drm/amd/display/dc/dml/dcn31/dcn31_fpu.h | 3 + .../dc/dml/dcn31/display_mode_vba_31.c | 39 +++++--- .../drm/amd/display/dc/dml/display_mode_vba.c | 6 ++ 6 files changed, 154 insertions(+), 17 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubbub.c +1 -0
@@ -103,6 +103,7 @@ static void dcn31_program_det_size(struct hubbub *hubbub, int hubp_inst, unsignedefault :break ; } +DC_LOG_DEBUG ("Set DET%d to %d segments\n" , hubp_inst, det_size_segments);/* Should never be hit, if it is we have an erroneous hw config*/ ASSERT (hubbub2->det0_size + hubbub2->det1_size + hubbub2->det2_size + hubbub2->det3_size + hubbub2->compbuf_size_segments <= hubbub2->crb_size_segs);
drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c +93 -4
142 lines not on this page · raw message
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.c +24 -1
@@ -483,7 +483,7 @@ void dcn31_calculate_wm_and_dlg_fp(int pipe_cnt, int vlevel) { - int i, pipe_idx, active_hubp_count = 0; + int i, pipe_idx, total_det = 0, active_hubp_count = 0;double dcfclk = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];dc_assert_fp_enabled ();
@@ -560,6 +560,18 @@ void dcn31_calculate_wm_and_dlg_fp( context->bw_ctx.bw.dcn.clk.fclk_khz =0 ; context->bw_ctx.bw.dcn.clk.p_state_change_support = true; } +for (i =0 , pipe_idx =0 ; i < dc->res_pool->pipe_count; i++) { +if (!context->res_ctx.pipe_ctx[i].stream) +continue ; + + context->res_ctx.pipe_ctx[i].det_buffer_size_kb = +get_det_buffer_size_kbytes (&context->bw_ctx.dml, pipes, pipe_cnt, pipe_idx); +if (context->res_ctx.pipe_ctx[i].det_buffer_size_kb >384 ) + context->res_ctx.pipe_ctx[i].det_buffer_size_kb /=2 ; + total_det += context->res_ctx.pipe_ctx[i].det_buffer_size_kb; + pipe_idx++; + } + context->bw_ctx.bw.dcn.compbuf_size_kb = context->bw_ctx.dml.ip.config_return_buffer_size_in_kbytes - total_det; }void dcn31_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params)
@@ -812,3 +824,14 @@ int dcn_get_max_non_odm_pix_rate_100hz(struct _vcs_dpi_soc_bounding_box_st *soc) {return soc->clock_limits[0 ].dispclk_mhz *10000.0 / (1.0 + soc->dcn_downspread_percent /100.0 ); } + +int dcn_get_approx_det_segs_required_for_pstate ( +struct _vcs_dpi_soc_bounding_box_st *soc, +int pix_clk_100hz,int bpp,int seg_size_kb) +{ +/* Roughly calculate required crb to hide latency. In practice there is slightly +* more buffer available for latency hiding +*/ +return (int )(soc->dram_clock_change_latency_us * pix_clk_100hz * bpp + /10240000 + seg_size_kb -1 ) / seg_size_kb; +}
drivers/gpu/drm/amd/display/dc/dml/dcn31/dcn31_fpu.h +3 -0
@@ -47,5 +47,8 @@ void dcn31_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_paramsvoid dcn315_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params);void dcn316_update_bw_bounding_box (struct dc *dc,struct clk_bw_params *bw_params);int dcn_get_max_non_odm_pix_rate_100hz (struct _vcs_dpi_soc_bounding_box_st *soc); +int dcn_get_approx_det_segs_required_for_pstate ( +struct _vcs_dpi_soc_bounding_box_st *soc, +int pix_clk_100hz,int bpp,int seg_size_kb);#endif /* __DCN31_FPU_H__*/
drivers/gpu/drm/amd/display/dc/dml/dcn31/display_mode_vba_31.c +27 -12
@@ -533,7 +533,8 @@ static void CalculateStutterEfficiency( static void CalculateSwathAndDETConfiguration( bool ForceSingleDPP, int NumberOfActivePlanes, - unsigned int DETBufferSizeInKByte, + bool DETSharedByAllDPP, + unsigned int DETBufferSizeInKByte[], double MaximumSwathWidthLuma[], double MaximumSwathWidthChroma[], enum scan_direction_class SourceScan[],
@@ -3116,7 +3117,7 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman v->SurfaceWidthC[k], v->SurfaceHeightY[k], v->SurfaceHeightC[k], - v->DETBufferSizeInKByte[0 ] *1024 , + v->DETBufferSizeInKByte[k] *1024 , v->BlockHeight256BytesY[k], v->BlockHeight256BytesC[k], v->SurfaceTiling[k],
@@ -3311,7 +3312,8 @@ static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib) CalculateSwathAndDETConfiguration( false, v->NumberOfActivePlanes, - v->DETBufferSizeInKByte[0], + mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], + v->DETBufferSizeInKByte, dummy1, dummy2, v->SourceScan,
@@ -3777,14 +3779,16 @@ static noinline void CalculatePrefetchSchedulePerPlane( &v->VReadyOffsetPix[k]); } -static void PatchDETBufferSizeInKByte (unsigned int NumberOfActivePlanes,int NoOfDPPThisState[],unsigned int config_return_buffer_size_in_kbytes,unsigned int *DETBufferSizeInKByte) +static void PatchDETBufferSizeInKByte (unsigned int NumberOfActivePlanes,int NoOfDPPThisState[],unsigned int config_return_buffer_size_in_kbytes,unsigned int DETBufferSizeInKByte[]) {int i, total_pipes =0 ;for (i =0 ; i < NumberOfActivePlanes; i++) total_pipes += NoOfDPPThisState[i]; - *DETBufferSizeInKByte = ((config_return_buffer_size_in_kbytes -DCN3_15_MIN_COMPBUF_SIZE_KB ) /64 / total_pipes) *64 ; -if (*DETBufferSizeInKByte >DCN3_15_MAX_DET_SIZE ) - *DETBufferSizeInKByte =DCN3_15_MAX_DET_SIZE ; + DETBufferSizeInKByte[0 ] = ((config_return_buffer_size_in_kbytes -DCN3_15_MIN_COMPBUF_SIZE_KB ) /64 / total_pipes) *64 ; +if (DETBufferSizeInKByte[0 ] >DCN3_15_MAX_DET_SIZE ) + DETBufferSizeInKByte[0 ] =DCN3_15_MAX_DET_SIZE ; +for (i =1 ; i < NumberOfActivePlanes; i++) + DETBufferSizeInKByte[i] = DETBufferSizeInKByte[0 ]; }
@@ -4024,7 +4028,8 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l CalculateSwathAndDETConfiguration( true, v->NumberOfActivePlanes, - v->DETBufferSizeInKByte[0], + mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], + v->DETBufferSizeInKByte, v->MaximumSwathWidthLuma, v->MaximumSwathWidthChroma, v->SourceScan,
@@ -4164,6 +4169,10 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l || (v->PlaneRequiredDISPCLK > v->MaxDispclkRoundedDownToDFSGranularity)) { v->DISPCLK_DPPCLK_Support[i][j] = false; } +if (mode_lib->project ==DML_PROJECT_DCN315 && v->DETSizeOverride[k] >DCN3_15_MAX_DET_SIZE && v->NoOfDPP[i][j][k] <2 ) { + v->MPCCombine[i][j][k] = true; + v->NoOfDPP[i][j][k] =2 ; + } } v->TotalNumberOfActiveDPP[i][j] =0 ; v->TotalNumberOfSingleDPPPlanes[i][j] =0 ;
@@ -4640,12 +4649,13 @@ void dml31_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l v->ODMCombineEnableThisState[k] = v->ODMCombineEnablePerState[i][k]; } -if (v->NumberOfActivePlanes >1 && mode_lib->project ==DML_PROJECT_DCN315 ) -PatchDETBufferSizeInKByte (v->NumberOfActivePlanes, v->NoOfDPPThisState, v->ip.config_return_buffer_size_in_kbytes, &v->DETBufferSizeInKByte[0 ]); +if (v->NumberOfActivePlanes >1 && mode_lib->project ==DML_PROJECT_DCN315 && !v->DETSizeOverride[0 ]) +PatchDETBufferSizeInKByte (v->NumberOfActivePlanes, v->NoOfDPPThisState, v->ip.config_return_buffer_size_in_kbytes, v->DETBufferSizeInKByte); CalculateSwathAndDETConfiguration( false, v->NumberOfActivePlanes, - v->DETBufferSizeInKByte[0], + mode_lib->project == DML_PROJECT_DCN315 && v->DETSizeOverride[0], + v->DETBufferSizeInKByte, v->MaximumSwathWidthLuma, v->MaximumSwathWidthChroma, v->SourceScan,
@@ -6557,7 +6567,8 @@ static void CalculateStutterEfficiency( static void CalculateSwathAndDETConfiguration( bool ForceSingleDPP, int NumberOfActivePlanes, - unsigned int DETBufferSizeInKByte, + bool DETSharedByAllDPP, + unsigned int DETBufferSizeInKByteA[], double MaximumSwathWidthLuma[], double MaximumSwathWidthChroma[], enum scan_direction_class SourceScan[],
@@ -6641,6 +6652,10 @@ static void CalculateSwathAndDETConfiguration( *ViewportSizeSupport = true;for (k =0 ; k < NumberOfActivePlanes; ++k) { +unsigned int DETBufferSizeInKByte = DETBufferSizeInKByteA[k]; + +if (DETSharedByAllDPP && DPPPerPlane[k]) + DETBufferSizeInKByte /= DPPPerPlane[k];if ((SourcePixelFormat[k] == dm_444_64 || SourcePixelFormat[k] == dm_444_32 || SourcePixelFormat[k] == dm_444_16 || SourcePixelFormat[k] == dm_mono_16 || SourcePixelFormat[k] == dm_mono_8 || SourcePixelFormat[k] == dm_rgbe)) { if (SurfaceTiling[k] == dm_sw_linear
drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c +6 -0
@@ -569,6 +569,10 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib) mode_lib->vba.OutputLinkDPRate[mode_lib->vba.NumberOfActivePlanes] = dout->dp_rate; mode_lib->vba.ODMUse[mode_lib->vba.NumberOfActivePlanes] = dst->odm_combine_policy; mode_lib->vba.DETSizeOverride[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override; +if (src->det_size_override) + mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src->det_size_override; +else + mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = ip->det_buffer_size_kbytes;//TODO: Need to assign correct values to dp_multistream vars mode_lib->vba.OutputMultistreamEn[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_en; mode_lib->vba.OutputMultistreamId[mode_lib->vba.NumberOfActiveSurfaces] = dout->dp_multistream_id;
@@ -783,6 +787,8 @@ static void fetch_pipe_params(struct display_mode_lib *mode_lib) mode_lib->vba.pipe_plane[k] = mode_lib->vba.NumberOfActivePlanes; mode_lib->vba.DPPPerPlane[mode_lib->vba.NumberOfActivePlanes]++; +if (src_k->det_size_override) + mode_lib->vba.DETBufferSizeInKByte[mode_lib->vba.NumberOfActivePlanes] = src_k->det_size_override;if (mode_lib->vba.SourceScan[mode_lib->vba.NumberOfActivePlanes] == dm_horz) { mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] +=
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 44/228 drm/amd/display: fix dcn315 single stream crb allocation
In reply to Greg Kroah-HartmanFrom: Dmytro Laktyushkin <[email protected]>
[ Upstream commit 49f26218c344741cb3eaa740b1e44e960551a87f ]
Change to improve avoiding asymetric crb calculations for single stream scenarios.
--- .../drm/amd/display/dc/dcn315/dcn315_resource.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn315/dcn315_resource.c +12 -3
@@ -1662,6 +1662,10 @@ static bool allow_pixel_rate_crb(struct dc *dc, struct dc_state *context)int i;struct resource_context *res_ctx = &context->res_ctx; +/*Don't apply for single stream*/ +if (context->stream_count <2 ) +return false; +for (i =0 ; i < dc->res_pool->pipe_count; i++) {if (!res_ctx->pipe_ctx[i].stream)continue ;
@@ -1749,19 +1753,23 @@ static int dcn315_populate_dml_pipes_from_context( pipe_cnt++; } -/* Spread remaining unreserved crb evenly among all pipes, use default policy if not enough det or single pipe */ +/* Spread remaining unreserved crb evenly among all pipes*/ if (pixel_rate_crb) {for (i =0 , pipe_cnt =0 , crb_idx =0 ; i < dc->res_pool->pipe_count; i++) { pipe = &res_ctx->pipe_ctx[i];if (!pipe->stream)continue ; +/* Do not use asymetric crb if not enough for pstate support */ +if (remaining_det_segs <0 ) { + pipes[pipe_cnt].pipe.src.det_size_override =0 ; +continue ; + } +if (!pipe->top_pipe && !pipe->prev_odm_pipe) {bool split_required = pipe->stream->timing.pix_clk_100hz >=dcn_get_max_non_odm_pix_rate_100hz (&dc->dml.soc) || (pipe->plane_state && pipe->plane_state->src_rect.width >5120 ); -if (remaining_det_segs <0 || crb_pipes ==1 ) - pipes[pipe_cnt].pipe.src.det_size_override =0 ;if (remaining_det_segs >MIN_RESERVED_DET_SEGS ) pipes[pipe_cnt].pipe.src.det_size_override += (remaining_det_segs -MIN_RESERVED_DET_SEGS ) / crb_pipes + (crb_idx < (remaining_det_segs -MIN_RESERVED_DET_SEGS ) % crb_pipes ?1 :0 );
@@ -1777,6 +1785,7 @@ static int dcn315_populate_dml_pipes_from_context( }/* Convert segments into size for DML use */ pipes[pipe_cnt].pipe.src.det_size_override *=DCN3_15_CRB_SEGMENT_SIZE_KB ; + crb_idx++; } pipe_cnt++;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 45/228 drm/amd/display: Update correct DCN314 register header
In reply to Greg Kroah-HartmanFrom: Cruise Hung <[email protected]>
[ Upstream commit 268182606f26434c5d3ebd0e86efcb0418dec487 ]
[Why]
The register header for DCN314 is not correct.
[How]
Update correct DCN314 register header.
Stable-dep-of: cd2e31a9ab93 ("drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix")
--- drivers/gpu/drm/amd/display/dmub/src/Makefile | 2 +- .../drm/amd/display/dmub/src/dmub_dcn314.c | 62 +++++++++++++++++++ .../drm/amd/display/dmub/src/dmub_dcn314.h | 33 ++++++++++ .../gpu/drm/amd/display/dmub/src/dmub_srv.c | 5 +- 4 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c create mode 100644 drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h
drivers/gpu/drm/amd/display/dmub/src/Makefile +1 -1
@@ -22,7 +22,7 @@ DMUB = dmub_srv.o dmub_srv_stat.o dmub_reg.o dmub_dcn20.o dmub_dcn21.o DMUB += dmub_dcn30.o dmub_dcn301.o dmub_dcn302.o dmub_dcn303.o -DMUB += dmub_dcn31.o dmub_dcn315.o dmub_dcn316.o +DMUB += dmub_dcn31.o dmub_dcn314.o dmub_dcn315.o dmub_dcn316.o DMUB += dmub_dcn32.o AMD_DAL_DMUB = $(addprefix $(AMDDALPATH)/dmub/src/,$(DMUB))
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c new file +62 -0
62 lines not on this page · raw message
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h new file +33 -0
@@ -0,0 +1,33 @@ +/* +* Copyright 2021 Advanced Micro Devices, Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR +* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +* OTHER DEALINGS IN THE SOFTWARE. +* +* Authors: AMD +* +*/ + +#ifndef _DMUB_DCN314_H_ +#define _DMUB_DCN314_H_ + +#include "dmub_dcn31.h" + +extern const struct dmub_srv_dcn31_regs dmub_srv_dcn314_regs; + +#endif /* _DMUB_DCN314_H_ */
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +4 -1
@@ -32,6 +32,7 @@#include "dmub_dcn302.h" #include "dmub_dcn303.h" #include "dmub_dcn31.h" +#include "dmub_dcn314.h" #include "dmub_dcn315.h" #include "dmub_dcn316.h" #include "dmub_dcn32.h"
@@ -226,7 +227,9 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)case DMUB_ASIC_DCN314 :case DMUB_ASIC_DCN315 :case DMUB_ASIC_DCN316 : -if (asic ==DMUB_ASIC_DCN315 ) +if (asic ==DMUB_ASIC_DCN314 ) + dmub->regs_dcn31 = &dmub_srv_dcn314_regs; +else if (asic ==DMUB_ASIC_DCN315 ) dmub->regs_dcn31 = &dmub_srv_dcn315_regs;else if (asic ==DMUB_ASIC_DCN316 ) dmub->regs_dcn31 = &dmub_srv_dcn316_regs;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 46/228 drm/amd/display: Set minimum requirement for using PSR-SU on Rembrandt
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
[ Upstream commit c35b6ea8f2ecfa9d775530b70d4e727869099a9c ]
A number of parade TCONs are causing system hangs when utilized with older DMUB firmware and PSR-SU. Some changes have been introduced into DMUB firmware to add resilience against these failures.
Don't allow running PSR-SU unless on the newer firmware.
Stable-dep-of: cd2e31a9ab93 ("drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix")
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c | 3 ++- drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 7 +++++++ drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h | 1 + drivers/gpu/drm/amd/display/dmub/dmub_srv.h | 2 ++ drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c | 5 +++++ drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h | 2 ++ drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 10 ++++++---- 7 files changed, 25 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c +2 -1
@@ -24,6 +24,7 @@*/ #include "amdgpu_dm_psr.h" +#include "dc_dmub_srv.h" #include "dc.h" #include "dm_helpers.h" #include "amdgpu_dm.h"
@@ -50,7 +51,7 @@ static bool link_supports_psrsu(struct dc_link *link) !link->dpcd_caps.psr_info.psr2_su_y_granularity_cap)return false; -return true; +return dc_dmub_check_min_version (dc->ctx->dmub_srv->dmub); }/*
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +7 -0
@@ -1026,3 +1026,10 @@ void dc_send_update_cursor_info_to_dmu(dc_send_cmd_to_dmu (pCtx->stream->ctx->dmub_srv, &cmd); } } + +bool dc_dmub_check_min_version (struct dmub_srv *srv) +{ +if (!srv->hw_funcs.is_psrsu_supported) +return true; +return srv->hw_funcs.is_psrsu_supported (srv); +}
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h +1 -0
@@ -89,4 +89,5 @@ void dc_dmub_setup_subvp_dmub_command(struct dc *dc, struct dc_state *context, bvoid dc_dmub_srv_log_diagnostic_data (struct dc_dmub_srv *dc_dmub_srv);void dc_send_update_cursor_info_to_dmu (struct pipe_ctx *pCtx,uint8_t pipe_idx); +bool dc_dmub_check_min_version (struct dmub_srv *srv);#endif /* _DMUB_DC_SRV_H_ */
drivers/gpu/drm/amd/display/dmub/dmub_srv.h +2 -0
@@ -350,6 +350,8 @@ struct dmub_srv_hw_funcs {bool (*is_supported)(struct dmub_srv *dmub); +bool (*is_psrsu_supported)(struct dmub_srv *dmub); +bool (*is_hw_init)(struct dmub_srv *dmub);bool (*is_phy_init)(struct dmub_srv *dmub);
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c +5 -0
@@ -297,6 +297,11 @@ bool dmub_dcn31_is_supported(struct dmub_srv *dmub)return supported; } +bool dmub_dcn31_is_psrsu_supported (struct dmub_srv *dmub) +{ +return dmub->fw_version >=DMUB_FW_VERSION (4 ,0 ,59 ); +} +void dmub_dcn31_set_gpint (struct dmub_srv *dmub,union dmub_gpint_data_register reg) {
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h +2 -0
@@ -219,6 +219,8 @@ bool dmub_dcn31_is_hw_init(struct dmub_srv *dmub);bool dmub_dcn31_is_supported (struct dmub_srv *dmub); +bool dmub_dcn31_is_psrsu_supported (struct dmub_srv *dmub); +void dmub_dcn31_set_gpint (struct dmub_srv *dmub,union dmub_gpint_data_register reg);
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +6 -4
@@ -227,14 +227,16 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)case DMUB_ASIC_DCN314 :case DMUB_ASIC_DCN315 :case DMUB_ASIC_DCN316 : -if (asic ==DMUB_ASIC_DCN314 ) +if (asic ==DMUB_ASIC_DCN314 ) { dmub->regs_dcn31 = &dmub_srv_dcn314_regs; -else if (asic ==DMUB_ASIC_DCN315 ) + }else if (asic ==DMUB_ASIC_DCN315 ) { dmub->regs_dcn31 = &dmub_srv_dcn315_regs; -else if (asic ==DMUB_ASIC_DCN316 ) + }else if (asic ==DMUB_ASIC_DCN316 ) { dmub->regs_dcn31 = &dmub_srv_dcn316_regs; -else + }else { dmub->regs_dcn31 = &dmub_srv_dcn31_regs; + funcs->is_psrsu_supported = dmub_dcn31_is_psrsu_supported; + } funcs->reset = dmub_dcn31_reset; funcs->reset_release = dmub_dcn31_reset_release; funcs->backdoor_load = dmub_dcn31_backdoor_load;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 47/228 drm/amd/display: Set minimum requirement for using PSR-SU on Phoenix
In reply to Greg Kroah-HartmanFrom: Mario Limonciello <[email protected]>
[ Upstream commit cd2e31a9ab93d13c412a36c6e26811e0f830985b ]
The same parade TCON issue can potentially happen on Phoenix, and the same PSR resilience changes have been ported into the DMUB firmware.
Don't allow running PSR-SU unless on the newer firmware.
--- drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c | 5 +++++ drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h | 2 ++ drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 1 + 3 files changed, 8 insertions(+)
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.c +5 -0
@@ -60,3 +60,8 @@ const struct dmub_srv_dcn31_regs dmub_srv_dcn314_regs = { { DMUB_DCN31_FIELDS() },#undef DMUB_SF }; + +bool dmub_dcn314_is_psrsu_supported (struct dmub_srv *dmub) +{ +return dmub->fw_version >=DMUB_FW_VERSION (8 ,0 ,16 ); +}
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn314.h +2 -0
@@ -30,4 +30,6 @@extern const struct dmub_srv_dcn31_regs dmub_srv_dcn314_regs; +bool dmub_dcn314_is_psrsu_supported (struct dmub_srv *dmub); +#endif /* _DMUB_DCN314_H_ */
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +1 -0
@@ -229,6 +229,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)case DMUB_ASIC_DCN316 :if (asic ==DMUB_ASIC_DCN314 ) { dmub->regs_dcn31 = &dmub_srv_dcn314_regs; + funcs->is_psrsu_supported = dmub_dcn314_is_psrsu_supported; }else if (asic ==DMUB_ASIC_DCN315 ) { dmub->regs_dcn31 = &dmub_srv_dcn315_regs; }else if (asic ==DMUB_ASIC_DCN316 ) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 48/228 drm/ttm: Dont print error message if eviction was interrupted
In reply to Greg Kroah-HartmanFrom: Thomas Hellström <[email protected]>
[ Upstream commit 8ab3b0663e279ab550bc2c0b5d602960e8b94e02 ]
Avoid printing an error message if eviction was interrupted by, for example, the user pressing CTRL-C. That may happen if eviction is waiting for something, like for example a free batch-buffer.
Stable-dep-of: e8188c461ee0 ("drm/ttm: Don't leak a resource on eviction error")
--- drivers/gpu/drm/ttm/ttm_bo.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/ttm/ttm_bo.c +2 -1
@@ -504,7 +504,8 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,if (ret == -EMULTIHOP ) { ret =ttm_bo_bounce_temp_buffer (bo, &evict_mem, ctx, &hop);if (ret) { -pr_err ("Buffer eviction failed\n" ); +if (ret != -ERESTARTSYS && ret != -EINTR ) +pr_err ("Buffer eviction failed\n" );ttm_resource_free (bo, &evict_mem); goto out; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 49/228 drm/ttm: Dont leak a resource on eviction error
In reply to Greg Kroah-HartmanFrom: Thomas Hellström <[email protected]>
[ Upstream commit e8188c461ee015ba0b9ab2fc82dbd5ebca5a5532 ]
On eviction errors other than -EMULTIHOP we were leaking a resource. Fix.
v2:
- Avoid yet another goto (Andi Shyti)
--- drivers/gpu/drm/ttm/ttm_bo.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/gpu/drm/ttm/ttm_bo.c +11 -11
@@ -499,18 +499,18 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, goto out; } -bounce: - ret =ttm_bo_handle_move_mem (bo, evict_mem, true, ctx, &hop); -if (ret == -EMULTIHOP ) { +do { + ret =ttm_bo_handle_move_mem (bo, evict_mem, true, ctx, &hop); +if (ret != -EMULTIHOP ) +break ; + ret =ttm_bo_bounce_temp_buffer (bo, &evict_mem, ctx, &hop); -if (ret) { -if (ret != -ERESTARTSYS && ret != -EINTR ) -pr_err ("Buffer eviction failed\n" ); -ttm_resource_free (bo, &evict_mem); - goto out; - } -/* try and move to final place now. */ - goto bounce; + }while (!ret); + +if (ret) { +ttm_resource_free (bo, &evict_mem); +if (ret != -ERESTARTSYS && ret != -EINTR ) +pr_err ("Buffer eviction failed\n" ); } out:return ret;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 50/228 n_tty: Rename tail to old_tail in n_tty_read()
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
[ Upstream commit 947d66b68f3c4e7cf8f3f3500807b9d2a0de28ce ]
The local tail variable in n_tty_read() is used for one purpose, it keeps the old tail. Thus, rename it appropriately to improve code readability.
Stable-dep-of: 4903fde8047a ("tty: fix hang on tty device with no_room set")
--- drivers/tty/n_tty.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/tty/n_tty.c +3 -3
@@ -2130,7 +2130,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,ssize_t retval =0 ;long timeout;bool packet; -size_t tail; +size_t old_tail;/* * Is this a continuation of a read started earler?
@@ -2193,7 +2193,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, } packet = tty->ctrl.packet; - tail = ldata->read_tail; + old_tail = ldata->read_tail;add_wait_queue (&tty->read_wait, &wait);while (nr) {
@@ -2282,7 +2282,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,if (time) timeout = time; } -if (tail != ldata->read_tail) +if (old_tail != ldata->read_tail)n_tty_kick_worker (tty);up_read (&tty->termios_rwsem);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 51/228 tty: fix hang on tty device with no_room set
In reply to Greg Kroah-HartmanFrom: Hui Li <[email protected]>
[ Upstream commit 4903fde8047a28299d1fc79c1a0dcc255e928f12 ]
It is possible to hang pty devices in this case, the reader was blocking at epoll on master side, the writer was sleeping at wait_woken inside n_tty_write on slave side, and the write buffer on tty_port was full, we found that the reader and writer would never be woken again and blocked forever.
The problem was caused by a race between reader and kworker:n_tty_read(reader): n_tty_receive_buf_common(kworker):
copy_from_read_buf()|
|room = N_TTY_BUF_SIZE - (ldata->read_head - tail)
|room <= 0
n_tty_kick_worker() |
|ldata->no_room = trueAfter writing to slave device, writer wakes up kworker to flush data on tty_port to reader, and the kworker finds that reader has no room to store data so room <= 0 is met. At this moment, reader consumes all the data on reader buffer and calls n_tty_kick_worker to check ldata->no_room which is false and reader quits reading. Then kworker sets ldata->no_room=true and quits too.
If write buffer is not full, writer will wake kworker to flush data again after following writes, but if write buffer is full and writer goes to sleep, kworker will never be woken again and tty device is blocked.
This problem can be solved with a check for read buffer size inside n_tty_receive_buf_common, if read buffer is empty and ldata->no_room is true, a call to n_tty_kick_worker is necessary to keep flushing data to reader.
Message-ID: <[email protected]>
--- drivers/tty/n_tty.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
drivers/tty/n_tty.c +21 -4
@@ -204,8 +204,8 @@ static void n_tty_kick_worker(struct tty_struct *tty)struct n_tty_data *ldata = tty->disc_data;/* Did the input worker stop? Restart it */ -if (unlikely (ldata->no_room)) { - ldata->no_room =0 ; +if (unlikely (READ_ONCE (ldata->no_room))) { +WRITE_ONCE (ldata->no_room,0 );WARN_RATELIMIT (tty->port->itty ==NULL ,"scheduling with invalid itty\n" );
@@ -1698,7 +1698,7 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,if (overflow && room <0 ) ldata->read_head--; room = overflow; - ldata->no_room = flow && !room; +WRITE_ONCE (ldata->no_room, flow && !room); }else overflow =0 ;
@@ -1729,6 +1729,17 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp, }else n_tty_check_throttle (tty); +if (unlikely (ldata->no_room)) { +/* +* Barrier here is to ensure to read the latest read_tail in +* chars_in_buffer() and to make sure that read_tail is not loaded +* before ldata->no_room is set. +*/ +smp_mb (); +if (!chars_in_buffer (tty)) +n_tty_kick_worker (tty); + } +up_read (&tty->termios_rwsem);return rcvd;
@@ -2282,8 +2293,14 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,if (time) timeout = time; } -if (old_tail != ldata->read_tail) +if (old_tail != ldata->read_tail) { +/* +* Make sure no_room is not read in n_tty_kick_worker() +* before setting ldata->read_tail in copy_from_read_buf(). +*/ +smp_mb ();n_tty_kick_worker (tty); + }up_read (&tty->termios_rwsem);remove_wait_queue (&tty->read_wait, &wait);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 52/228 drm/ttm: never consider pinned BOs for eviction&swap
In reply to Greg Kroah-HartmanFrom: Christian König <[email protected]>
[ Upstream commit a2848d08742c8e8494675892c02c0d22acbe3cf8 ]
There is a small window where we have already incremented the pin count but not yet moved the bo from the lru to the pinned list.
--- drivers/gpu/drm/ttm/ttm_bo.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/ttm/ttm_bo.c +6 -0
@@ -550,6 +550,12 @@ static bool ttm_bo_evict_swapout_allowable(struct ttm_buffer_object *bo, {bool ret = false; +if (bo->pin_count) { + *locked = false; + *busy = false; +return false; + } +if (bo->base.resv == ctx->resv) {dma_resv_assert_held (bo->base.resv);if (ctx->allow_res_evict)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 53/228 KVM: arm64: Condition HW AF updates on config option
In reply to Greg Kroah-HartmanFrom: Oliver Upton <[email protected]>
[ Upstream commit 1dfc3e905089a0bcada268fb5691a605655e0319 ]
As it currently stands, KVM makes use of FEAT_HAFDBS unconditionally. Use of the feature in the rest of the kernel is guarded by an associated Kconfig option.
Align KVM with the rest of the kernel and only enable VTCR_HA when ARM64_HW_AFDBM is enabled. This can be helpful for testing changes to the stage-2 access fault path on Armv8.1+ implementations.
Stable-dep-of: 6df696cd9bc1 ("arm64: errata: Mitigate Ampere1 erratum AC03_CPU_38 at stage-2")
--- arch/arm64/kvm/hyp/pgtable.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kvm/hyp/pgtable.c +2 -0
@@ -595,12 +595,14 @@ u64 kvm_get_vtcr(u64 mmfr0, u64 mmfr1, u32 phys_shift) lvls =2 ; vtcr |=VTCR_EL2_LVLS_TO_SL0 (lvls); +#ifdef CONFIG_ARM64_HW_AFDBM /* * Enable the Hardware Access Flag management, unconditionally * on all CPUs. The features is RES0 on CPUs without the support * and must be ignored by the CPUs. */ vtcr |=VTCR_EL2_HA ; +#endif /* CONFIG_ARM64_HW_AFDBM */ /* Set the vmid bits */ vtcr |= (get_vmid_bits(mmfr1) == 16) ?
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 54/228 arm64: errata: Mitigate Ampere1 erratum AC03_CPU_38 at stage-2
In reply to Greg Kroah-HartmanFrom: Oliver Upton <[email protected]>
[ Upstream commit 6df696cd9bc1ceed0e92e36908f88bbd16d18255 ]
AmpereOne has an erratum in its implementation of FEAT_HAFDBS that required disabling the feature on the design. This was done by reporting the feature as not implemented in the ID register, although the corresponding control bits were not actually RES0. This does not align well with the requirements of the architecture, which mandates these bits be RES0 if HAFDBS isn't implemented.
The kernel's use of stage-1 is unaffected, as the HA and HD bits are only set if HAFDBS is detected in the ID register. KVM, on the other hand, relies on the RES0 behavior at stage-2 to use the same value for VTCR_EL2 on any cpu in the system. Mitigate the non-RES0 behavior by leaving VTCR_EL2.HA clear on affected systems.
--- Documentation/arm64/silicon-errata.rst | 3 +++ arch/arm64/Kconfig | 19 +++++++++++++++++++ arch/arm64/kernel/cpu_errata.c | 7 +++++++ arch/arm64/kvm/hyp/pgtable.c | 14 +++++++++++--- arch/arm64/tools/cpucaps | 1 + 5 files changed, 41 insertions(+), 3 deletions(-)
Documentation/arm64/silicon-errata.rst +3 -0
@@ -52,6 +52,9 @@ stable kernels. | Allwinner | A64/R18 | UNKNOWN1 | SUN50I_ERRATUM_UNKNOWN1 | +----------------+-----------------+-----------------+-----------------------------+ +----------------+-----------------+-----------------+-----------------------------+ +| Ampere | AmpereOne | AC03_CPU_38 | AMPERE_ERRATUM_AC03_CPU_38 | ++----------------+-----------------+-----------------+-----------------------------+ ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A510 | #2457168 | ARM64_ERRATUM_2457168 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A510 | #2064142 | ARM64_ERRATUM_2064142 |
arch/arm64/Kconfig +19 -0
@@ -376,6 +376,25 @@ menu "Kernel Features" menu "ARM errata workarounds via the alternatives framework" +config AMPERE_ERRATUM_AC03_CPU_38 + bool "AmpereOne: AC03_CPU_38: Certain bits in the Virtualization Translation Control Register and Translation Control Registers do not follow RES0 semantics" + default y + help + This option adds an alternative code sequence to work around Ampere + erratum AC03_CPU_38 on AmpereOne. + + The affected design reports FEAT_HAFDBS as not implemented in + ID_AA64MMFR1_EL1.HAFDBS, but (V)TCR_ELx.{HA,HD} are not RES0 + as required by the architecture. The unadvertised HAFDBS + implementation suffers from an additional erratum where hardware + A/D updates can occur after a PTE has been marked invalid. + + The workaround forces KVM to explicitly set VTCR_EL2.HA to 0, + which avoids enabling unadvertised hardware Access Flag management + at stage-2. + + If unsure, say Y. + config ARM64_WORKAROUND_CLEAN_CACHE bool
arch/arm64/kernel/cpu_errata.c +7 -0
@@ -722,6 +722,13 @@ const struct arm64_cpu_capabilities arm64_errata[] = { MIDR_FIXED(MIDR_CPU_VAR_REV(1,1), BIT(25)), .cpu_enable = cpu_clear_bf16_from_user_emulation, }, +#endif +#ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38 + { + .desc = "AmpereOne erratum AC03_CPU_38", + .capability = ARM64_WORKAROUND_AMPERE_AC03_CPU_38, + ERRATA_MIDR_ALL_VERSIONS(MIDR_AMPERE1), + }, #endif { }
arch/arm64/kvm/hyp/pgtable.c +11 -3
@@ -598,10 +598,18 @@ u64 kvm_get_vtcr(u64 mmfr0, u64 mmfr1, u32 phys_shift)#ifdef CONFIG_ARM64_HW_AFDBM /* * Enable the Hardware Access Flag management, unconditionally -* on all CPUs. The features is RES0 on CPUs without the support -* and must be ignored by the CPUs. +* on all CPUs. In systems that have asymmetric support for the feature +* this allows KVM to leverage hardware support on the subset of cores +* that implement the feature. +* +* The architecture requires VTCR_EL2.HA to be RES0 (thus ignored by +* hardware) on implementations that do not advertise support for the +* feature. As such, setting HA unconditionally is safe, unless you +* happen to be running on a design that has unadvertised support for +* HAFDBS. Here be dragons. */ - vtcr |=VTCR_EL2_HA ; +if (!cpus_have_final_cap (ARM64_WORKAROUND_AMPERE_AC03_CPU_38 )) + vtcr |=VTCR_EL2_HA ;#endif /* CONFIG_ARM64_HW_AFDBM */ /* Set the vmid bits */
arch/arm64/tools/cpucaps +1 -0
@@ -71,6 +71,7 @@ WORKAROUND_2064142 WORKAROUND_2077057 WORKAROUND_2457168 WORKAROUND_2658417 +WORKAROUND_AMPERE_AC03_CPU_38 WORKAROUND_TRBE_OVERWRITE_FILL_MODE WORKAROUND_TSB_FLUSH_FAILURE WORKAROUND_TRBE_WRITE_OUT_OF_RANGE
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 55/228 mptcp: introduce sk to replace sock->sk in mptcp_listen()
In reply to Greg Kroah-HartmanFrom: Menglong Dong <[email protected]>
[ Upstream commit cfdcfeed6449d702825d249cb85346ecf56236fc ]
'sock->sk' is used frequently in mptcp_listen(). Therefore, we can introduce the 'sk' and replace 'sock->sk' with it.
Stable-dep-of: 0226436acf24 ("mptcp: do not rely on implicit state check in mptcp_listen()")
--- net/mptcp/protocol.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
net/mptcp/protocol.c +7 -6
@@ -3746,12 +3746,13 @@ static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)static int mptcp_listen (struct socket *sock,int backlog) {struct mptcp_sock *msk =mptcp_sk (sock->sk); +struct sock *sk = sock->sk;struct socket *ssock;int err;pr_debug ("msk=%p" , msk); -lock_sock (sock->sk); +lock_sock (sk); ssock =__mptcp_nmpc_socket (msk);if (!ssock) { err = -EINVAL ;
@@ -3759,16 +3760,16 @@ static int mptcp_listen(struct socket *sock, int backlog) }mptcp_token_destroy (msk); -inet_sk_state_store (sock->sk,TCP_LISTEN ); -sock_set_flag (sock->sk,SOCK_RCU_FREE ); +inet_sk_state_store (sk,TCP_LISTEN ); +sock_set_flag (sk,SOCK_RCU_FREE ); err = ssock->ops->listen (ssock, backlog); -inet_sk_state_store (sock->sk,inet_sk_state_load (ssock->sk)); +inet_sk_state_store (sk,inet_sk_state_load (ssock->sk));if (!err) -mptcp_copy_inaddrs (sock->sk, ssock->sk); +mptcp_copy_inaddrs (sk, ssock->sk); unlock: -release_sock (sock->sk); +release_sock (sk);return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 56/228 mptcp: do not rely on implicit state check in mptcp_listen()
In reply to Greg Kroah-HartmanFrom: Paolo Abeni <[email protected]>
[ Upstream commit 0226436acf2495cde4b93e7400e5a87305c26054 ]
Since the blamed commit, closing the first subflow resets the first subflow socket state to SS_UNCONNECTED.
The current mptcp listen implementation relies only on such state to prevent touching not-fully-disconnected sockets.
Incoming mptcp fastclose (or paired endpoint removal) unconditionally closes the first subflow.
All the above allows an incoming fastclose followed by a listen() call to successfully race with a blocking recvmsg(), potentially causing the latter to hit a divide by zero bug in cleanup_rbuf/__tcp_select_window().
Address the issue explicitly checking the msk socket state in mptcp_listen(). An alternative solution would be moving the first subflow socket state update into mptcp_disconnect(), but in the long term the first subflow socket should be removed: better avoid relaying on it for internal consistency check.
--- net/mptcp/protocol.c | 5 +++++ 1 file changed, 5 insertions(+)
net/mptcp/protocol.c +5 -0
@@ -3753,6 +3753,11 @@ static int mptcp_listen(struct socket *sock, int backlog)pr_debug ("msk=%p" , msk);lock_sock (sk); + + err = -EINVAL ; +if (sock->state !=SS_UNCONNECTED || sock->type !=SOCK_STREAM ) + goto unlock; + ssock =__mptcp_nmpc_socket (msk);if (!ssock) { err = -EINVAL ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 57/228 tracing/probes: Add symstr type for dynamic events
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
[ Upstream commit b26a124cbfa80f42bfc4e63e1d5643ca98159d66 ]
Add 'symstr' type for storing the kernel symbol as a string data instead of the symbol address. This allows us to filter the events by wildcard symbol name.
e.g.
# echo 'e:wqfunc workqueue.workqueue_execute_start symname=$function:symstr' >> dynamic_events # cat events/eprobes/wqfunc/format name: wqfunc ID: 2110 format: field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1;
field:__data_loc char[] symname; offset:8; size:4; signed:1;
print fmt: " symname=\"%s\"", __get_str(symname)
Note that there is already 'symbol' type which just change the print format (so it still stores the symbol address in the tracing ring buffer.) On the other hand, 'symstr' type stores the actual "symbol+offset/size" data as a string.
Stable-dep-of: 66bcf65d6cf0 ("tracing/probes: Fix to avoid double count of the string length on the array")
--- Documentation/trace/kprobetrace.rst | 8 +++-- kernel/trace/trace.c | 2 +- kernel/trace/trace_probe.c | 44 ++++++++++++++++++--------- kernel/trace/trace_probe.h | 16 +++++++--- kernel/trace/trace_probe_tmpl.h | 47 +++++++++++++++++++++++++++-- 5 files changed, 91 insertions(+), 26 deletions(-)
Documentation/trace/kprobetrace.rst +6 -2
@@ -58,8 +58,8 @@ Synopsis of kprobe_events NAME=FETCHARG : Set NAME as the argument name of FETCHARG. FETCHARG:TYPE : Set TYPE as the type of FETCHARG. Currently, basic types (u8/u16/u32/u64/s8/s16/s32/s64), hexadecimal types - (x8/x16/x32/x64), "string", "ustring" and bitfield - are supported. + (x8/x16/x32/x64), "string", "ustring", "symbol", "symstr" + and bitfield are supported. (\*1) only for the probe on function entry (offs == 0). (\*2) only for return probe.
@@ -96,6 +96,10 @@ offset, and container-size (usually 32). The syntax is:: Symbol type('symbol') is an alias of u32 or u64 type (depends on BITS_PER_LONG) which shows given pointer in "symbol+offset" style. +On the other hand, symbol-string type ('symstr') converts the given address to +"symbol+offset/symbolsize" style and stores it as a null-terminated string. +With 'symstr' type, you can filter the event with wildcard pattern of the +symbols, and you don't need to solve symbol name by yourself. For $comm, the default type is "string"; any other type is invalid. .. _user_mem_access:
kernel/trace/trace.c +1 -1
@@ -5627,7 +5627,7 @@ static const char readme_msg[] ="\t +|-[u]<offset>(<fetcharg>), \\imm-value, \\\"imm-string\"\n" "\t type: s8/16/32/64, u8/16/32/64, x8/16/32/64, string, symbol,\n" "\t b<bit-width>@<bit-offset>/<container-size>, ustring,\n" -"\t <type>\\[<array-size>\\]\n" +"\t symstr, <type>\\[<array-size>\\]\n" #ifdef CONFIG_HIST_TRIGGERS"\t field: <stype> <name>;\n" "\t stype: u8/u16/u32/u64, s8/s16/s32/s64, pid_t,\n"
kernel/trace/trace_probe.c +29 -15
82 lines not on this page · raw message
kernel/trace/trace_probe.h +11 -5
@@ -98,6 +98,7 @@ enum fetch_op {FETCH_OP_ST_UMEM ,/* Mem: .offset, .size */ FETCH_OP_ST_STRING ,/* String: .offset, .size */ FETCH_OP_ST_USTRING ,/* User String: .offset, .size */ +FETCH_OP_ST_SYMSTR ,/* Kernel Symbol String: .offset, .size */ // Stage 4 (modify) op FETCH_OP_MOD_BF, /* Bitfield: .basesize, .lshift, .rshift */// Stage 5 (loop) op
@@ -133,7 +134,8 @@ struct fetch_insn {struct fetch_type {const char *name;/* Name of type */ size_t size;/* Byte size of type */ -int is_signed;/* Signed flag */ +bool is_signed;/* Signed flag */ +bool is_string;/* String flag */ print_type_func_t print;/* Print functions */ const char *fmt;/* Format string */ const char *fmttype;/* Name in format file */
@@ -177,16 +179,19 @@ DECLARE_BASIC_PRINT_TYPE_FUNC(symbol);#define _ADDR_FETCH_TYPE (t) __ADDR_FETCH_TYPE(t)#define ADDR_FETCH_TYPE _ADDR_FETCH_TYPE(BITS_PER_LONG) -#define __ASSIGN_FETCH_TYPE (_name, ptype, ftype, _size, sign, _fmttype) \ - {.name = _name, \ +#define __ASSIGN_FETCH_TYPE (_name, ptype, ftype, _size, sign, str, _fmttype) \ + {.name = _name, \ .size = _size, \ - .is_signed = sign, \ + .is_signed = (bool)sign, \ + .is_string = (bool)str, \ .print = PRINT_TYPE_FUNC_NAME(ptype), \ .fmt = PRINT_TYPE_FMT_NAME(ptype), \ .fmttype = _fmttype, \ } + +/* Non string types can use these macros */ #define _ASSIGN_FETCH_TYPE (_name, ptype, ftype, _size, sign, _fmttype) \ - __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, #_fmttype) + __ASSIGN_FETCH_TYPE(_name, ptype, ftype, _size, sign, 0, #_fmttype)#define ASSIGN_FETCH_TYPE (ptype, ftype, sign) \ _ASSIGN_FETCH_TYPE(#ptype, ptype, ftype, sizeof(ftype), sign, ptype)
@@ -431,6 +436,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,C (ARRAY_TOO_BIG ,"Array number is too big" ), \C (BAD_TYPE ,"Unknown type is specified" ), \C (BAD_STRING ,"String accepts only memory argument" ), \ +C (BAD_SYMSTRING ,"Symbol String doesn't accept data/userdata" ), \C (BAD_BITFIELD ,"Invalid bitfield" ), \C (ARG_NAME_TOO_LONG ,"Argument name is too long" ), \ C(NO_ARG_NAME, "Argument name is not specified"), \
kernel/trace/trace_probe_tmpl.h +44 -3
72 lines not on this page · raw message
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 58/228 tracing/probes: Fix to avoid double count of the string length on the array
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
[ Upstream commit 66bcf65d6cf0ca6540e2341e88ee7ef02dbdda08 ]
If an array is specified with the ustring or symstr, the length of the strings are accumlated on both of 'ret' and 'total', which means the length is double counted.
Just set the length to the 'ret' value for avoiding double counting.
--- kernel/trace/trace_probe_tmpl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace_probe_tmpl.h +2 -2
@@ -136,11 +136,11 @@ process_fetch_insn_bottom(struct fetch_insn *code, unsigned long val, code++; goto array;case FETCH_OP_ST_USTRING : - ret +=fetch_store_strlen_user (val + code->offset); + ret =fetch_store_strlen_user (val + code->offset); code++; goto array;case FETCH_OP_ST_SYMSTR : - ret +=fetch_store_symstrlen (val + code->offset); + ret =fetch_store_symstrlen (val + code->offset); code++; goto array;default :
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 59/228 tracing: Allow synthetic events to pass around stacktraces
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
[ Upstream commit 00cf3d672a9dd409418647e9f98784c339c3ff63 ]
Allow a stacktrace from one event to be displayed by the end event of a synthetic event. This is very useful when looking for the longest latency of a sleep or something blocked on I/O.
# cd /sys/kernel/tracing/ # echo 's:block_lat pid_t pid; u64 delta; unsigned long[] stack;' > dynamic_events # echo 'hist:keys=next_pid:ts=common_timestamp.usecs,st=stacktrace if prev_state == 1||prev_state == 2' > events/sched/sched_switch/trigger # echo 'hist:keys=prev_pid:delta=common_timestamp.usecs-$ts,s=$st:onmax($delta).trace(block_lat,prev_pid,$delta,$s)' >> events/sched/sched_switch/trigger
The above creates a "block_lat" synthetic event that take the stacktrace of when a task schedules out in either the interruptible or uninterruptible states, and on a new per process max $delta (the time it was scheduled out), will print the process id and the stacktrace.
# echo 1 > events/synthetic/block_lat/enable
# cat trace
# TASK-PID CPU# ||||| TIMESTAMP FUNCTION
# | | | ||||| | |
kworker/u16:0-767 [006] d..4. 560.645045: block_lat: pid=767 delta=66 stack=STACK:
=> __schedule
=> schedule
=> pipe_read
=> vfs_read
=> ksys_read
=> do_syscall_64
=> 0x966000aa<idle>-0 [003] d..4. 561.132117: block_lat: pid=0 delta=413787 stack=STACK:
=> __schedule
=> schedule
=> schedule_hrtimeout_range_clock
=> do_sys_poll
=> __x64_sys_poll
=> do_syscall_64
=> 0x966000aa
<...>-153 [006] d..4. 562.068407: block_lat: pid=153 delta=54 stack=STACK:
=> __schedule
=> schedule
=> io_schedule
=> rq_qos_wait
=> wbt_wait
=> __rq_qos_throttle
=> blk_mq_submit_bio
=> submit_bio_noacct_nocheck
=> ext4_bio_write_page
=> mpage_submit_page
=> mpage_process_page_bufs
=> mpage_prepare_extent_to_map
=> ext4_do_writepages
=> ext4_writepages
=> do_writepages
=> __writeback_single_inode
Stable-dep-of: 797311bce5c2 ("tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails")
--- kernel/trace/trace.h | 4 ++ kernel/trace/trace_events_hist.c | 7 ++- kernel/trace/trace_events_synth.c | 80 ++++++++++++++++++++++++++++++- kernel/trace/trace_synth.h | 1 + 4 files changed, 87 insertions(+), 5 deletions(-)
kernel/trace/trace.h +4 -0
@@ -113,6 +113,10 @@ enum trace_type {#define MEM_FAIL (condition, fmt, ...) \ DO_ONCE_LITE_IF(condition, pr_err, "ERROR: " fmt, ##__VA_ARGS__) +#define HIST_STACKTRACE_DEPTH 16 +#define HIST_STACKTRACE_SIZE (HIST_STACKTRACE_DEPTH * sizeof(unsigned long)) +#define HIST_STACKTRACE_SKIP 5 +/* * syscalls are special, and need special handling, this is why * they are not included in trace_entries.h
kernel/trace/trace_events_hist.c +3 -4
@@ -479,10 +479,6 @@ DEFINE_HIST_FIELD_FN(u8);#define for_each_hist_key_field (i, hist_data) \ for ((i) = (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++) -#define HIST_STACKTRACE_DEPTH 16 -#define HIST_STACKTRACE_SIZE (HIST_STACKTRACE_DEPTH * sizeof(unsigned long)) -#define HIST_STACKTRACE_SKIP 5 -#define HITCOUNT_IDX 0#define HIST_KEY_SIZE_MAX (MAX_FILTER_STR_VAL + HIST_STACKTRACE_SIZE)
@@ -3843,6 +3839,9 @@ static int check_synth_field(struct synth_event *event, && field->is_dynamic)return 0 ; +if (strstr (hist_field->type,"long[" ) && field->is_stack) +return 0 ; +if (strcmp (field->type, hist_field->type) !=0 ) {if (field->size != hist_field->size || (!field->is_string && field->is_signed != hist_field->is_signed))
kernel/trace/trace_events_synth.c +79 -1
134 lines not on this page · raw message
kernel/trace/trace_synth.h +1 -0
@@ -18,6 +18,7 @@ struct synth_field {bool is_signed;bool is_string;bool is_dynamic; +bool is_stack; };struct synth_event {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 60/228 Revert "tracing: Add "(fault)" name injection to kernel probes"
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
[ Upstream commit 4ed8f337dee32df71435689c19d22e4ee846e15a ]
This reverts commit 2e9906f84fc7c99388bb7123ade167250d50f1c0.
It was turned out that commit 2e9906f84fc7 ("tracing: Add "(fault)" name injection to kernel probes") did not work correctly and probe events still show just '(fault)' (instead of '"(fault)"'). Also, current '(fault)' is more explicit that it faulted.
This also moves FAULT_STRING macro to trace.h so that synthetic event can keep using it, and uses it in trace_probe.c too.
Stable-dep-of: 797311bce5c2 ("tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails")
--- kernel/trace/trace.h | 2 ++ kernel/trace/trace_probe.c | 2 +- kernel/trace/trace_probe_kernel.h | 31 ++++++------------------------- 3 files changed, 9 insertions(+), 26 deletions(-)
kernel/trace/trace.h +2 -0
@@ -113,6 +113,8 @@ enum trace_type {#define MEM_FAIL (condition, fmt, ...) \ DO_ONCE_LITE_IF(condition, pr_err, "ERROR: " fmt, ##__VA_ARGS__) +#define FAULT_STRING "(fault)" +#define HIST_STACKTRACE_DEPTH 16#define HIST_STACKTRACE_SIZE (HIST_STACKTRACE_DEPTH * sizeof(unsigned long))#define HIST_STACKTRACE_SKIP 5
kernel/trace/trace_probe.c +1 -1
@@ -64,7 +64,7 @@ int PRINT_TYPE_FUNC_NAME(string)(struct trace_seq *s, void *data, void *ent)int len = *(u32 *)data >>16 ;if (!len) -trace_seq_puts (s,"(fault)" ); +trace_seq_puts (s,FAULT_STRING );else trace_seq_printf (s,"\"%s\"" , (const char *)get_loc_data (data, ent));
kernel/trace/trace_probe_kernel.h +6 -25
@@ -2,8 +2,6 @@#ifndef __TRACE_PROBE_KERNEL_H_#define __TRACE_PROBE_KERNEL_H_ -#define FAULT_STRING "(fault)" -/* * This depends on trace_probe.h, but can not include it due to * the way trace_probe_tmpl.h is used by trace_kprobe.c and trace_eprobe.c.
@@ -15,16 +13,8 @@ static nokprobe_inline int kern_fetch_store_strlen_user(unsigned long addr) {const void __user *uaddr = (__force const void __user *)addr; -int ret; - ret =strnlen_user_nofault (uaddr,MAX_STRING_SIZE ); -/* -* strnlen_user_nofault returns zero on fault, insert the -* FAULT_STRING when that occurs. -*/ -if (ret <=0 ) -return strlen (FAULT_STRING ) +1 ; -return ret; +return strnlen_user_nofault (uaddr,MAX_STRING_SIZE ); }/* Return the length of string -- including null terminal byte */
@@ -44,18 +34,7 @@ kern_fetch_store_strlen(unsigned long addr) len++; }while (c && ret ==0 && len <MAX_STRING_SIZE ); -/* For faults, return enough to hold the FAULT_STRING */ -return (ret <0 ) ?strlen (FAULT_STRING ) +1 : len; -} - -static nokprobe_inline void set_data_loc(int ret, void *dest, void *__dest, void *base, int len) -{ -if (ret >=0 ) { - *(u32 *)dest =make_data_loc (ret, __dest - base); - }else { -strscpy (__dest,FAULT_STRING , len); - ret =strlen (__dest) +1 ; - } +return (ret <0 ) ? ret : len; }/*
@@ -76,7 +55,8 @@ kern_fetch_store_string_user(unsigned long addr, void *dest, void *base) __dest =get_loc_data (dest, base); ret =strncpy_from_user_nofault (__dest, uaddr, maxlen); -set_data_loc (ret, dest, __dest, base, maxlen); +if (ret >=0 ) + *(u32 *)dest =make_data_loc (ret, __dest - base);return ret; }
@@ -107,7 +87,8 @@ kern_fetch_store_string(unsigned long addr, void *dest, void *base)* probing. */ ret =strncpy_from_kernel_nofault (__dest, (void *)addr, maxlen); -set_data_loc (ret, dest, __dest, base, maxlen); +if (ret >=0 ) + *(u32 *)dest =make_data_loc (ret, __dest - base);return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 61/228 tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu (Google) <[email protected]>
[ Upstream commit 797311bce5c2ac90b8d65e357603cfd410d36ebb ]
Fix to record 0-length data to data_loc in fetch_store_string*() if it fails to get the string data.
Currently those expect that the data_loc is updated by store_trace_args() if it returns the error code. However, that does not work correctly if the argument is an array of strings. In that case, store_trace_args() only clears the first entry of the array (which may have no error) and leaves other entries. So it should be cleared by fetch_store_string*() itself. Also, 'dyndata' and 'maxlen' in store_trace_args() should be updated only if it is used (ret > 0 and argument is a dynamic data.)
--- kernel/trace/trace_probe_kernel.h | 13 +++++++++---- kernel/trace/trace_probe_tmpl.h | 10 +++------- kernel/trace/trace_uprobe.c | 3 ++- 3 files changed, 14 insertions(+), 12 deletions(-)
kernel/trace/trace_probe_kernel.h +9 -4
@@ -37,6 +37,13 @@ kern_fetch_store_strlen(unsigned long addr)return (ret <0 ) ? ret : len; } +static nokprobe_inline void set_data_loc(int ret, void *dest, void *__dest, void *base) +{ +if (ret <0 ) + ret =0 ; + *(u32 *)dest =make_data_loc (ret, __dest - base); +} +/* * Fetch a null-terminated string from user. Caller MUST set *(u32 *)buf * with max length and relative data location.
@@ -55,8 +62,7 @@ kern_fetch_store_string_user(unsigned long addr, void *dest, void *base) __dest =get_loc_data (dest, base); ret =strncpy_from_user_nofault (__dest, uaddr, maxlen); -if (ret >=0 ) - *(u32 *)dest =make_data_loc (ret, __dest - base); +set_data_loc (ret, dest, __dest, base);return ret; }
@@ -87,8 +93,7 @@ kern_fetch_store_string(unsigned long addr, void *dest, void *base)* probing. */ ret =strncpy_from_kernel_nofault (__dest, (void *)addr, maxlen); -if (ret >=0 ) - *(u32 *)dest =make_data_loc (ret, __dest - base); +set_data_loc (ret, dest, __dest, base);return ret; }
kernel/trace/trace_probe_tmpl.h +3 -7
@@ -247,13 +247,9 @@ store_trace_args(void *data, struct trace_probe *tp, void *rec,if (unlikely (arg->dynamic)) *dl =make_data_loc (maxlen, dyndata - base); ret =process_fetch_insn (arg->code, rec, dl, base); -if (arg->dynamic) { -if (unlikely (ret <0 )) { - *dl =make_data_loc (0 , dyndata - base); - }else { - dyndata += ret; - maxlen -= ret; - } +if (arg->dynamic &&likely (ret >0 )) { + dyndata += ret; + maxlen -= ret; } } }
kernel/trace/trace_uprobe.c +2 -1
@@ -170,7 +170,8 @@ fetch_store_string(unsigned long addr, void *dest, void *base)*/ ret++; *(u32 *)dest =make_data_loc (ret, (void *)dst - base); - } + }else + *(u32 *)dest =make_data_loc (0 , (void *)dst - base);return ret; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 62/228 test_maple_tree: test modifications while iterating
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
[ Upstream commit 5159d64b335401fa83f18c27e2267f1eafc41bd3 ]
Add a testcase to ensure the iterator detects bad states on modifications and does what the user expects
Stable-dep-of: 7a93c71a6714 ("maple_tree: fix 32 bit mas_next testing")
--- lib/test_maple_tree.c | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+)
lib/test_maple_tree.c +72 -0
@@ -1709,6 +1709,74 @@ static noinline void check_forking(struct maple_tree *mt)mtree_destroy (&newmt); } +static noinline void check_iteration(struct maple_tree *mt) +{ +int i, nr_entries =125 ; +void *val; +MA_STATE (mas, mt,0 ,0 ); + +for (i =0 ; i <= nr_entries; i++) +mtree_store_range (mt, i *10 , i *10 +9 , +xa_mk_value (i),GFP_KERNEL ); + +mt_set_non_kernel (99999 ); + + i =0 ; +mas_lock (&mas); +mas_for_each (&mas, val,925 ) { +MT_BUG_ON (mt, mas.index != i *10 ); +MT_BUG_ON (mt, mas.last != i *10 +9 ); +/* Overwrite end of entry 92 */ +if (i ==92 ) { + mas.index =925 ; + mas.last =929 ; +mas_store (&mas, val); + } + i++; + } +/* Ensure mas_find() gets the next value */ + val =mas_find (&mas,ULONG_MAX ); +MT_BUG_ON (mt, val !=xa_mk_value (i)); + +mas_set (&mas,0 ); + i =0 ; +mas_for_each (&mas, val,785 ) { +MT_BUG_ON (mt, mas.index != i *10 ); +MT_BUG_ON (mt, mas.last != i *10 +9 ); +/* Overwrite start of entry 78 */ +if (i ==78 ) { + mas.index =780 ; + mas.last =785 ; +mas_store (&mas, val); + }else { + i++; + } + } + val =mas_find (&mas,ULONG_MAX ); +MT_BUG_ON (mt, val !=xa_mk_value (i)); + +mas_set (&mas,0 ); + i =0 ; +mas_for_each (&mas, val,765 ) { +MT_BUG_ON (mt, mas.index != i *10 ); +MT_BUG_ON (mt, mas.last != i *10 +9 ); +/* Overwrite end of entry 76 and advance to the end */ +if (i ==76 ) { + mas.index =760 ; + mas.last =765 ; +mas_store (&mas, val); +mas_next (&mas,ULONG_MAX ); + } + i++; + } +/* Make sure the next find returns the one after 765, 766-769 */ + val =mas_find (&mas,ULONG_MAX ); +MT_BUG_ON (mt, val !=xa_mk_value (76 )); +mas_unlock (&mas); +mas_destroy (&mas); +mt_set_non_kernel (0 ); +} + static noinline void check_mas_store_gfp(struct maple_tree *mt) {
@@ -2702,6 +2770,10 @@ static int maple_tree_seed(void) goto skip;#endif +mt_init_flags (&tree,MT_FLAGS_ALLOC_RANGE ); +check_iteration (&tree); +mtree_destroy (&tree); +mt_init_flags (&tree,MT_FLAGS_ALLOC_RANGE );check_forking (&tree);mtree_destroy (&tree);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 63/228 maple_tree: add __init and __exit to test module
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
[ Upstream commit eaf9790d3bc6e157a2134c01c7d707a5a712fab1 ]
The test functions are not needed after the module is removed, so mark them as such. Add __exit to the module removal function. Some other variables have been marked as const static as well.
Stable-dep-of: 7a93c71a6714 ("maple_tree: fix 32 bit mas_next testing")
--- lib/test_maple_tree.c | 158 +++++++++++++------------- tools/testing/radix-tree/linux/init.h | 1 + tools/testing/radix-tree/maple.c | 147 ++++++++++++------------ 3 files changed, 155 insertions(+), 151 deletions(-)
lib/test_maple_tree.c +80 -78
@@ -30,54 +30,54 @@#else #define cond_resched () do {} while (0)#endif -static -int mtree_insert_index (struct maple_tree *mt,unsigned long index,gfp_t gfp) +static int __init mtree_insert_index (struct maple_tree *mt, +unsigned long index,gfp_t gfp) {return mtree_insert (mt, index,xa_mk_value (index &LONG_MAX ), gfp); } -static void mtree_erase_index (struct maple_tree *mt,unsigned long index) +static void __init mtree_erase_index (struct maple_tree *mt,unsigned long index) {MT_BUG_ON (mt,mtree_erase (mt, index) !=xa_mk_value (index &LONG_MAX ));MT_BUG_ON (mt,mtree_load (mt, index) !=NULL ); } -static int mtree_test_insert (struct maple_tree *mt,unsigned long index, +static int __init mtree_test_insert (struct maple_tree *mt,unsigned long index,void *ptr) {return mtree_insert (mt, index, ptr,GFP_KERNEL ); } -static int mtree_test_store_range (struct maple_tree *mt,unsigned long start, -unsigned long end,void *ptr) +static int __init mtree_test_store_range (struct maple_tree *mt, +unsigned long start,unsigned long end,void *ptr) {return mtree_store_range (mt, start, end, ptr,GFP_KERNEL ); } -static int mtree_test_store (struct maple_tree *mt,unsigned long start, +static int __init mtree_test_store (struct maple_tree *mt,unsigned long start,void *ptr) {return mtree_test_store_range (mt, start, start, ptr); } -static int mtree_test_insert_range (struct maple_tree *mt,unsigned long start, -unsigned long end,void *ptr) +static int __init mtree_test_insert_range (struct maple_tree *mt, +unsigned long start,unsigned long end,void *ptr) {return mtree_insert_range (mt, start, end, ptr,GFP_KERNEL ); } -static void *mtree_test_load (struct maple_tree *mt,unsigned long index) +static void __init *mtree_test_load (struct maple_tree *mt,unsigned long index) {return mtree_load (mt, index); } -static void *mtree_test_erase (struct maple_tree *mt,unsigned long index) +static void __init *mtree_test_erase (struct maple_tree *mt,unsigned long index) {return mtree_erase (mt, index); }#if defined(CONFIG_64BIT ) -static noinline void check_mtree_alloc_range(struct maple_tree *mt, +static noinline void __init check_mtree_alloc_range(struct maple_tree *mt,unsigned long start,unsigned long end,unsigned long size,unsigned long expected,int eret,void *ptr) {
@@ -94,7 +94,7 @@ static noinline void check_mtree_alloc_range(struct maple_tree *mt,MT_BUG_ON (mt, result != expected); } -static noinline void check_mtree_alloc_rrange(struct maple_tree *mt, +static noinline void __init check_mtree_alloc_rrange(struct maple_tree *mt,unsigned long start,unsigned long end,unsigned long size,unsigned long expected,int eret,void *ptr) {
@@ -112,8 +112,8 @@ static noinline void check_mtree_alloc_rrange(struct maple_tree *mt, }#endif -static noinline void check_load(struct maple_tree *mt, unsigned long index, -void *ptr) +static noinline void __init check_load(struct maple_tree *mt, +unsigned long index,void *ptr) {void *ret =mtree_test_load (mt, index);
@@ -122,7 +122,7 @@ static noinline void check_load(struct maple_tree *mt, unsigned long index,MT_BUG_ON (mt, ret != ptr); } -static noinline void check_store_range(struct maple_tree *mt, +static noinline void __init check_store_range(struct maple_tree *mt,unsigned long start,unsigned long end,void *ptr,int expected) {int ret = -EINVAL ;
@@ -138,7 +138,7 @@ static noinline void check_store_range(struct maple_tree *mt,check_load (mt, i, ptr); } -static noinline void check_insert_range(struct maple_tree *mt, +static noinline void __init check_insert_range(struct maple_tree *mt,unsigned long start,unsigned long end,void *ptr,int expected) {int ret = -EINVAL ;
@@ -154,8 +154,8 @@ static noinline void check_insert_range(struct maple_tree *mt,check_load (mt, i, ptr); } -static noinline void check_insert(struct maple_tree *mt, unsigned long index, -void *ptr) +static noinline void __init check_insert(struct maple_tree *mt, +unsigned long index,void *ptr) {int ret = -EINVAL ;
@@ -163,7 +163,7 @@ static noinline void check_insert(struct maple_tree *mt, unsigned long index,MT_BUG_ON (mt, ret !=0 ); } -static noinline void check_dup_insert(struct maple_tree *mt, +static noinline void __init check_dup_insert(struct maple_tree *mt,unsigned long index,void *ptr) {int ret = -EINVAL ;
@@ -173,13 +173,13 @@ static noinline void check_dup_insert(struct maple_tree *mt, } -static noinline -void check_index_load(struct maple_tree *mt, unsigned long index) +static noinline void __init check_index_load(struct maple_tree *mt, +unsigned long index) {return check_load (mt, index,xa_mk_value (index &LONG_MAX )); } -static inline int not_empty (struct maple_node *node) +static inline __init int not_empty (struct maple_node *node) {int i;
@@ -194,8 +194,8 @@ static inline int not_empty(struct maple_node *node) } -static noinline void check_rev_seq(struct maple_tree *mt, unsigned long max, -bool verbose) +static noinline void __init check_rev_seq(struct maple_tree *mt, +unsigned long max,bool verbose) {unsigned long i = max, j;
@@ -227,7 +227,7 @@ static noinline void check_rev_seq(struct maple_tree *mt, unsigned long max,#endif } -static noinline void check_seq(struct maple_tree *mt, unsigned long max, +static noinline void __init check_seq(struct maple_tree *mt, unsigned long max,bool verbose) {unsigned long i, j;
@@ -256,7 +256,7 @@ static noinline void check_seq(struct maple_tree *mt, unsigned long max,#endif } -static noinline void check_lb_not_empty(struct maple_tree *mt) +static noinline void __init check_lb_not_empty(struct maple_tree *mt) {unsigned long i, j;unsigned long huge =4000UL *1000 *1000 ;
@@ -275,13 +275,13 @@ static noinline void check_lb_not_empty(struct maple_tree *mt)mtree_destroy (mt); } -static noinline void check_lower_bound_split(struct maple_tree *mt) +static noinline void __init check_lower_bound_split(struct maple_tree *mt) {MT_BUG_ON (mt, !mtree_empty (mt));check_lb_not_empty (mt); } -static noinline void check_upper_bound_split(struct maple_tree *mt) +static noinline void __init check_upper_bound_split(struct maple_tree *mt) {unsigned long i, j;unsigned long huge;
@@ -306,7 +306,7 @@ static noinline void check_upper_bound_split(struct maple_tree *mt)mtree_destroy (mt); } -static noinline void check_mid_split(struct maple_tree *mt) +static noinline void __init check_mid_split(struct maple_tree *mt) {unsigned long huge =8000UL *1000 *1000 ;
@@ -315,7 +315,7 @@ static noinline void check_mid_split(struct maple_tree *mt)check_lb_not_empty (mt); } -static noinline void check_rev_find(struct maple_tree *mt) +static noinline void __init check_rev_find(struct maple_tree *mt) {int i, nr_entries =200 ;void *val;
@@ -354,7 +354,7 @@ static noinline void check_rev_find(struct maple_tree *mt)rcu_read_unlock (); } -static noinline void check_find(struct maple_tree *mt) +static noinline void __init check_find(struct maple_tree *mt) {unsigned long val =0 ;unsigned long count;
@@ -571,7 +571,7 @@ static noinline void check_find(struct maple_tree *mt)mtree_destroy (mt); } -static noinline void check_find_2(struct maple_tree *mt) +static noinline void __init check_find_2(struct maple_tree *mt) {unsigned long i, j;void *entry;
@@ -616,7 +616,7 @@ static noinline void check_find_2(struct maple_tree *mt)#if defined(CONFIG_64BIT ) -static noinline void check_alloc_rev_range(struct maple_tree *mt) +static noinline void __init check_alloc_rev_range(struct maple_tree *mt) {/* * Generated by:
@@ -624,7 +624,7 @@ static noinline void check_alloc_rev_range(struct maple_tree *mt)* awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}' */ -unsigned long range[] = { +static const unsigned long range[] = {/* Inclusive , Exclusive. */ 0x565234af2000 ,0x565234af4000 ,0x565234af4000 ,0x565234af9000 ,
@@ -652,7 +652,7 @@ static noinline void check_alloc_rev_range(struct maple_tree *mt) 0x7fff58791000, 0x7fff58793000, }; -unsigned long holes[] = { +static const unsigned long holes[] = {/* * Note: start of hole is INCLUSIVE * end of hole is EXCLUSIVE
@@ -672,7 +672,7 @@ static noinline void check_alloc_rev_range(struct maple_tree *mt)* 4. number that should be returned. * 5. return value */ -unsigned long req_range[] = { +static const unsigned long req_range[] = {0x565234af9000 ,/* Min */ 0x7fff58791000 ,/* Max */ 0x1000 ,/* Size */
@@ -783,7 +783,7 @@ static noinline void check_alloc_rev_range(struct maple_tree *mt)mtree_destroy (mt); } -static noinline void check_alloc_range(struct maple_tree *mt) +static noinline void __init check_alloc_range(struct maple_tree *mt) {/* * Generated by:
@@ -791,7 +791,7 @@ static noinline void check_alloc_range(struct maple_tree *mt)* awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}' */ -unsigned long range[] = { +static const unsigned long range[] = {/* Inclusive , Exclusive. */ 0x565234af2000 ,0x565234af4000 ,0x565234af4000 ,0x565234af9000 ,
@@ -818,7 +818,7 @@ static noinline void check_alloc_range(struct maple_tree *mt)0x7fff5878e000 ,0x7fff58791000 , 0x7fff58791000, 0x7fff58793000, }; -unsigned long holes[] = { +static const unsigned long holes[] = {/* Start of hole, end of hole, size of hole (+1) */ 0x565234afb000 ,0x565234afc000 ,0x1000 , 0x565234afe000, 0x565235def000, 0x12F1000,
@@ -833,7 +833,7 @@ static noinline void check_alloc_range(struct maple_tree *mt)* 4. number that should be returned. * 5. return value */ -unsigned long req_range[] = { +static const unsigned long req_range[] = {0x565234af9000 ,/* Min */ 0x7fff58791000 ,/* Max */ 0x1000 ,/* Size */
@@ -942,10 +942,10 @@ static noinline void check_alloc_range(struct maple_tree *mt) }#endif -static noinline void check_ranges(struct maple_tree *mt) +static noinline void __init check_ranges(struct maple_tree *mt) {int i, val, val2; -unsigned long r[] = { +static const unsigned long r[] = {10 ,15 ,20 ,25 ,17 ,22 ,/* Overlaps previous range. */
@@ -1210,7 +1210,7 @@ static noinline void check_ranges(struct maple_tree *mt)MT_BUG_ON (mt,mt_height (mt) !=4 ); } -static noinline void check_next_entry(struct maple_tree *mt) +static noinline void __init check_next_entry(struct maple_tree *mt) {void *entry =NULL ;unsigned long limit =30 , i =0 ;
@@ -1234,7 +1234,7 @@ static noinline void check_next_entry(struct maple_tree *mt)mtree_destroy (mt); } -static noinline void check_prev_entry(struct maple_tree *mt) +static noinline void __init check_prev_entry(struct maple_tree *mt) {unsigned long index =16 ;void *value;
@@ -1278,7 +1278,7 @@ static noinline void check_prev_entry(struct maple_tree *mt)mas_unlock (&mas); } -static noinline void check_root_expand(struct maple_tree *mt) +static noinline void __init check_root_expand(struct maple_tree *mt) {MA_STATE (mas, mt,0 ,0 );void *ptr;
@@ -1367,13 +1367,13 @@ static noinline void check_root_expand(struct maple_tree *mt)mas_unlock (&mas); } -static noinline void check_gap_combining(struct maple_tree *mt) +static noinline void __init check_gap_combining(struct maple_tree *mt) {struct maple_enode *mn1, *mn2;void *entry;unsigned long singletons =100 ; -unsigned long *seq100; -unsigned long seq100_64[] = { +static const unsigned long *seq100; +static const unsigned long seq100_64[] = {/* 0-5 */ 74 ,75 ,76 ,50 ,100 ,2 ,
@@ -1387,7 +1387,7 @@ static noinline void check_gap_combining(struct maple_tree *mt) 76, 2, 79, 85, 4, }; -unsigned long seq100_32[] = { +static const unsigned long seq100_32[] = {/* 0-5 */ 61 ,62 ,63 ,50 ,100 ,2 ,
@@ -1401,11 +1401,11 @@ static noinline void check_gap_combining(struct maple_tree *mt) 76, 2, 79, 85, 4, }; -unsigned long seq2000[] = { +static const unsigned long seq2000[] = {1152 ,1151 ,1100 ,1200 ,2 , }; -unsigned long seq400[] = { +static const unsigned long seq400[] = {286 ,318 ,256 ,260 ,266 ,270 ,275 ,280 ,290 ,398 ,286 ,310 ,
@@ -1564,7 +1564,7 @@ static noinline void check_gap_combining(struct maple_tree *mt)mt_set_non_kernel (0 );mtree_destroy (mt); } -static noinline void check_node_overwrite(struct maple_tree *mt) +static noinline void __init check_node_overwrite(struct maple_tree *mt) {int i, max =4000 ;
@@ -1577,7 +1577,7 @@ static noinline void check_node_overwrite(struct maple_tree *mt) }#if defined(BENCH_SLOT_STORE ) -static noinline void bench_slot_store(struct maple_tree *mt) +static noinline void __init bench_slot_store(struct maple_tree *mt) {int i, brk =105 , max =1040 , brk_start =100 , count =20000000 ;
@@ -1593,7 +1593,7 @@ static noinline void bench_slot_store(struct maple_tree *mt)#endif #if defined(BENCH_NODE_STORE ) -static noinline void bench_node_store(struct maple_tree *mt) +static noinline void __init bench_node_store(struct maple_tree *mt) {int i, overwrite =76 , max =240 , count =20000000 ;
@@ -1612,7 +1612,7 @@ static noinline void bench_node_store(struct maple_tree *mt)#endif #if defined(BENCH_AWALK ) -static noinline void bench_awalk(struct maple_tree *mt) +static noinline void __init bench_awalk(struct maple_tree *mt) {int i, max =2500 , count =50000000 ;MA_STATE (mas, mt,1470 ,1470 );
@@ -1629,7 +1629,7 @@ static noinline void bench_awalk(struct maple_tree *mt) }#endif #if defined(BENCH_WALK ) -static noinline void bench_walk(struct maple_tree *mt) +static noinline void __init bench_walk(struct maple_tree *mt) {int i, max =2500 , count =550000000 ;MA_STATE (mas, mt,1470 ,1470 );
@@ -1646,7 +1646,7 @@ static noinline void bench_walk(struct maple_tree *mt)#endif #if defined(BENCH_MT_FOR_EACH ) -static noinline void bench_mt_for_each(struct maple_tree *mt) +static noinline void __init bench_mt_for_each(struct maple_tree *mt) {int i, count =1000000 ;unsigned long max =2500 , index =0 ;
@@ -1670,7 +1670,7 @@ static noinline void bench_mt_for_each(struct maple_tree *mt)#endif /* check_forking - simulate the kernel forking sequence with the tree. */ -static noinline void check_forking(struct maple_tree *mt) +static noinline void __init check_forking(struct maple_tree *mt) {struct maple_tree newmt;
@@ -1709,7 +1709,7 @@ static noinline void check_forking(struct maple_tree *mt)mtree_destroy (&newmt); } -static noinline void check_iteration(struct maple_tree *mt) +static noinline void __init check_iteration(struct maple_tree *mt) {int i, nr_entries =125 ;void *val;
@@ -1777,7 +1777,7 @@ static noinline void check_iteration(struct maple_tree *mt)mt_set_non_kernel (0 ); } -static noinline void check_mas_store_gfp(struct maple_tree *mt) +static noinline void __init check_mas_store_gfp(struct maple_tree *mt) {struct maple_tree newmt;
@@ -1810,7 +1810,7 @@ static noinline void check_mas_store_gfp(struct maple_tree *mt) }#if defined(BENCH_FORK ) -static noinline void bench_forking(struct maple_tree *mt) +static noinline void __init bench_forking(struct maple_tree *mt) {struct maple_tree newmt;
@@ -1852,15 +1852,17 @@ static noinline void bench_forking(struct maple_tree *mt) }#endif -static noinline void next_prev_test(struct maple_tree *mt) +static noinline void __init next_prev_test(struct maple_tree *mt) {int i, nr_entries;void *val;MA_STATE (mas, mt,0 ,0 );struct maple_enode *mn; -unsigned long *level2; -unsigned long level2_64[] = {707 ,1000 ,710 ,715 ,720 ,725 }; -unsigned long level2_32[] = {1747 ,2000 ,1750 ,1755 ,1760 ,1765 }; +static const unsigned long *level2; +static const unsigned long level2_64[] = {707 ,1000 ,710 ,715 ,720 , +725 }; +static const unsigned long level2_32[] = {1747 ,2000 ,1750 ,1755 , +1760 ,1765 };if (MAPLE_32BIT ) { nr_entries =500 ;
@@ -2028,7 +2030,7 @@ static noinline void next_prev_test(struct maple_tree *mt)/* Test spanning writes that require balancing right sibling or right cousin */ -static noinline void check_spanning_relatives(struct maple_tree *mt) +static noinline void __init check_spanning_relatives(struct maple_tree *mt) {unsigned long i, nr_entries =1000 ;
@@ -2041,7 +2043,7 @@ static noinline void check_spanning_relatives(struct maple_tree *mt)mtree_store_range (mt,9365 ,9955 ,NULL ,GFP_KERNEL ); } -static noinline void check_fuzzer(struct maple_tree *mt) +static noinline void __init check_fuzzer(struct maple_tree *mt) {/* * 1. Causes a spanning rebalance of a single root node.
@@ -2438,7 +2440,7 @@ static noinline void check_fuzzer(struct maple_tree *mt) }/* duplicate the tree with a specific gap */ -static noinline void check_dup_gaps(struct maple_tree *mt, +static noinline void __init check_dup_gaps(struct maple_tree *mt,unsigned long nr_entries,bool zero_start,unsigned long gap) {
@@ -2478,7 +2480,7 @@ static noinline void check_dup_gaps(struct maple_tree *mt, }/* Duplicate many sizes of trees. Mainly to test expected entry values */ -static noinline void check_dup(struct maple_tree *mt) +static noinline void __init check_dup(struct maple_tree *mt) {int i;int big_start =100010 ;
@@ -2566,7 +2568,7 @@ static noinline void check_dup(struct maple_tree *mt) } } -static noinline void check_bnode_min_spanning(struct maple_tree *mt) +static noinline void __init check_bnode_min_spanning(struct maple_tree *mt) {int i =50 ;MA_STATE (mas, mt,0 ,0 );
@@ -2585,7 +2587,7 @@ static noinline void check_bnode_min_spanning(struct maple_tree *mt)mt_set_non_kernel (0 ); } -static noinline void check_empty_area_window(struct maple_tree *mt) +static noinline void __init check_empty_area_window(struct maple_tree *mt) {unsigned long i, nr_entries =20 ;MA_STATE (mas, mt,0 ,0 );
@@ -2670,7 +2672,7 @@ static noinline void check_empty_area_window(struct maple_tree *mt)rcu_read_unlock (); } -static noinline void check_empty_area_fill(struct maple_tree *mt) +static noinline void __init check_empty_area_fill(struct maple_tree *mt) {const unsigned long max =0x25D78000 ;unsigned long size;
@@ -2714,11 +2716,11 @@ static noinline void check_empty_area_fill(struct maple_tree *mt) }static DEFINE_MTREE (tree); -static int maple_tree_seed (void ) +static int __init maple_tree_seed (void ) { -unsigned long set[] = {5015 ,5014 ,5017 ,25 ,1000 , -1001 ,1002 ,1003 ,1005 ,0 , -5003 ,5002 }; +unsigned long set[] = {5015 ,5014 ,5017 ,25 ,1000 , +1001 ,1002 ,1003 ,1005 ,0 , +5003 ,5002 };void *ptr = &set;pr_info ("\nTEST STARTING\n\n" );
@@ -2988,7 +2990,7 @@ static int maple_tree_seed(void)return -EINVAL ; } -static void maple_tree_harvest (void ) +static void __exit maple_tree_harvest(void) { }
tools/testing/radix-tree/linux/init.h +1 -0
@@ -1 +1,2 @@#define __init +#define __exit
tools/testing/radix-tree/maple.c +74 -73
487 lines not on this page · raw message
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 64/228 maple_tree: fix 32 bit mas_next testing
In reply to Greg Kroah-HartmanFrom: Liam R. Howlett <[email protected]>
[ Upstream commit 7a93c71a6714ca1a9c03d70432dac104b0cfb815 ]
The test setup of mas_next is dependent on node entry size to create a 2 level tree, but the tests did not account for this in the expected value when shifting beyond the scope of the tree.
Fix this by setting up the test to succeed depending on the node entries which is dependent on the 32/64 bit setup.
--- lib/test_maple_tree.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
lib/test_maple_tree.c +4 -1
@@ -1863,13 +1863,16 @@ static noinline void __init next_prev_test(struct maple_tree *mt) 725};static const unsigned long level2_32[] = {1747 ,2000 ,1750 ,1755 ,1760 ,1765 }; +unsigned long last_index;if (MAPLE_32BIT ) { nr_entries =500 ; level2 = level2_32; + last_index =0x138e ; }else { nr_entries =200 ; level2 = level2_64; + last_index =0x7d6 ; }for (i =0 ; i <= nr_entries; i++)
@@ -1976,7 +1979,7 @@ static noinline void __init next_prev_test(struct maple_tree *mt) val =mas_next (&mas,ULONG_MAX );MT_BUG_ON (mt, val !=NULL ); -MT_BUG_ON (mt, mas.index !=ULONG_MAX ); +MT_BUG_ON (mt, mas.index != last_index);MT_BUG_ON (mt, mas.last !=ULONG_MAX ); val =mas_prev (&mas,0 );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 65/228 drm/amd/display: Rework comments on dc file
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit e366f36958f60c431a7430c8c421c9db0ec6738d ]
The file dc.c has multiple comments that do not follow the kernel-doc or are made in a distracting way. This commit alleviates part of this issue by reorganizing some comments inside the dc file.
Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 161 +++++++++-------------- drivers/gpu/drm/amd/display/dc/dc.h | 32 ++--- 2 files changed, 70 insertions(+), 123 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +62 -99
@@ -135,9 +135,7 @@ static const char DC_BUILD_ID[] = "production-build";* one or two (in the pipe-split case). */ -/******************************************************************************* -* Private functions -******************************************************************************/ +/* Private functions */ static inline void elevate_update_type (enum surface_update_type *original,enum surface_update_type new) {
@@ -429,18 +427,14 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, }/** -***************************************************************************** -* Function: dc_stream_get_last_vrr_vtotal +* dc_stream_get_last_used_drr_vtotal - dc_stream_get_last_vrr_vtotal * -* @brief -* Looks up the pipe context of dc_stream_state and gets the -* last VTOTAL used by DRR (Dynamic Refresh Rate) +* @dc: [in] dc reference +* @stream: [in] Initial dc stream state +* @adjust: [in] Updated parameters for vertical_total_min and * -* @param [in] dc: dc reference -* @param [in] stream: Initial dc stream state -* @param [in] adjust: Updated parameters for vertical_total_min and -* vertical_total_max -***************************************************************************** +* Looks up the pipe context of dc_stream_state and gets the last VTOTAL used +* by DRR (Dynamic Refresh Rate) */ bool dc_stream_get_last_used_drr_vtotal(struct dc *dc, struct dc_stream_state *stream,
@@ -1236,9 +1230,7 @@ static void wait_for_no_pipes_pending(struct dc *dc, struct dc_state *context)PERF_TRACE (); } -/******************************************************************************* -* Public functions -******************************************************************************/ +/* Public functions */ struct dc *dc_create (const struct dc_init_data *init_params) {
@@ -4560,21 +4552,17 @@ void dc_mclk_switch_using_fw_based_vblank_stretch_shut_down(struct dc *dc) dc->current_state->bw_ctx.bw.dcn.clk.fw_based_mclk_switching_shut_down = true; } -/* -***************************************************************************** -* Function: dc_is_dmub_outbox_supported - +/** +* dc_is_dmub_outbox_supported - Check if DMUB firmware support outbox notification * -* @brief -* Checks whether DMUB FW supports outbox notifications, if supported -* DM should register outbox interrupt prior to actually enabling interrupts -* via dc_enable_dmub_outbox +* @dc: [in] dc structure * -* @param -* [in] dc: dc structure +* Checks whether DMUB FW supports outbox notifications, if supported DM +* should register outbox interrupt prior to actually enabling interrupts +* via dc_enable_dmub_outbox * -* @return -* True if DMUB FW supports outbox notifications, False otherwise -***************************************************************************** +* Return: +* True if DMUB FW supports outbox notifications, False otherwise */ bool dc_is_dmub_outbox_supported (struct dc *dc) {
@@ -4592,21 +4580,17 @@ bool dc_is_dmub_outbox_supported(struct dc *dc)return dc->debug.enable_dmub_aux_for_legacy_ddc; } -/* -***************************************************************************** -* Function: dc_enable_dmub_notifications +/** +* dc_enable_dmub_notifications - Check if dmub fw supports outbox * -* @brief -* Calls dc_is_dmub_outbox_supported to check if dmub fw supports outbox -* notifications. All DMs shall switch to dc_is_dmub_outbox_supported. -* This API shall be removed after switching. +* @dc: [in] dc structure * -* @param -* [in] dc: dc structure +* Calls dc_is_dmub_outbox_supported to check if dmub fw supports outbox +* notifications. All DMs shall switch to dc_is_dmub_outbox_supported. This +* API shall be removed after switching. * -* @return -* True if DMUB FW supports outbox notifications, False otherwise -***************************************************************************** +* Return: +* True if DMUB FW supports outbox notifications, False otherwise */ bool dc_enable_dmub_notifications (struct dc *dc) {
@@ -4614,18 +4598,11 @@ bool dc_enable_dmub_notifications(struct dc *dc) }/** -***************************************************************************** -* Function: dc_enable_dmub_outbox +* dc_enable_dmub_outbox - Enables DMUB unsolicited notification * -* @brief -* Enables DMUB unsolicited notifications to x86 via outbox +* dc: [in] dc structure * -* @param -* [in] dc: dc structure -* -* @return -* None -***************************************************************************** +* Enables DMUB unsolicited notifications to x86 via outbox. */ void dc_enable_dmub_outbox (struct dc *dc) {
@@ -4726,21 +4703,17 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc, }/** -***************************************************************************** -* Function: dc_process_dmub_set_config_async +* dc_process_dmub_set_config_async - Submits set_config command * -* @brief -* Submits set_config command to dmub via inbox message +* @dc: [in] dc structure +* @link_index: [in] link_index: link index +* @payload: [in] aux payload +* @notify: [out] set_config immediate reply * -* @param -* [in] dc: dc structure -* [in] link_index: link index -* [in] payload: aux payload -* [out] notify: set_config immediate reply +* Submits set_config command to dmub via inbox message. * -* @return -* True if successful, False if failure -***************************************************************************** +* Return: +* True if successful, False if failure */ bool dc_process_dmub_set_config_async(struct dc *dc, uint32_t link_index,
@@ -4776,21 +4749,17 @@ bool dc_process_dmub_set_config_async(struct dc *dc, }/** -***************************************************************************** -* Function: dc_process_dmub_set_mst_slots +* dc_process_dmub_set_mst_slots - Submits MST solt allocation * -* @brief -* Submits mst slot allocation command to dmub via inbox message +* @dc: [in] dc structure +* @link_index: [in] link index +* @mst_alloc_slots: [in] mst slots to be allotted +* @mst_slots_in_use: [out] mst slots in use returned in failure case * -* @param -* [in] dc: dc structure -* [in] link_index: link index -* [in] mst_alloc_slots: mst slots to be allotted -* [out] mst_slots_in_use: mst slots in use returned in failure case +* Submits mst slot allocation command to dmub via inbox message * -* @return -* DC_OK if successful, DC_ERROR if failure -***************************************************************************** +* Return: +* DC_OK if successful, DC_ERROR if failure */ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc, uint32_t link_index,
@@ -4830,19 +4799,12 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc, }/** -***************************************************************************** -* Function: dc_process_dmub_dpia_hpd_int_enable -* -* @brief -* Submits dpia hpd int enable command to dmub via inbox message +* dc_process_dmub_dpia_hpd_int_enable - Submits DPIA DPD interruption * -* @param -* [in] dc: dc structure -* [in] hpd_int_enable: 1 for hpd int enable, 0 to disable +* @dc [in]: dc structure +* @hpd_int_enable [in]: 1 for hpd int enable, 0 to disable * -* @return -* None -***************************************************************************** +* Submits dpia hpd int enable command to dmub via inbox message */ void dc_process_dmub_dpia_hpd_int_enable (const struct dc *dc,uint32_t hpd_int_enable)
@@ -4871,16 +4833,13 @@ void dc_disable_accelerated_mode(struct dc *dc)/** -***************************************************************************** -* dc_notify_vsync_int_state() - notifies vsync enable/disable state +* dc_notify_vsync_int_state - notifies vsync enable/disable state * @dc: dc structure -* @stream: stream where vsync int state changed -* @enable: whether vsync is enabled or disabled +* @stream: stream where vsync int state changed +* @enable: whether vsync is enabled or disabled * -* Called when vsync is enabled/disabled -* Will notify DMUB to start/stop ABM interrupts after steady state is reached -* -***************************************************************************** +* Called when vsync is enabled/disabled Will notify DMUB to start/stop ABM +* interrupts after steady state is reached. */ void dc_notify_vsync_int_state (struct dc *dc,struct dc_stream_state *stream,bool enable) {
@@ -4922,14 +4881,18 @@ void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, boif (pipe->stream_res.abm && pipe->stream_res.abm->funcs->set_abm_pause) pipe->stream_res.abm->funcs->set_abm_pause (pipe->stream_res.abm, !enable, i, pipe->stream_res.tg->inst); } -/* -* dc_extended_blank_supported: Decide whether extended blank is supported + +/** +* dc_extended_blank_supported 0 Decide whether extended blank is supported * -* Extended blank is a freesync optimization feature to be enabled in the future. -* During the extra vblank period gained from freesync, we have the ability to enter z9/z10. +* @dc: [in] Current DC state * -* @param [in] dc: Current DC state -* @return: Indicate whether extended blank is supported (true or false) +* Extended blank is a freesync optimization feature to be enabled in the +* future. During the extra vblank period gained from freesync, we have the +* ability to enter z9/z10. +* +* Return: +* Indicate whether extended blank is supported (true or false) */ bool dc_extended_blank_supported (struct dc *dc) {
drivers/gpu/drm/amd/display/dc/dc.h +8 -24
@@ -56,9 +56,7 @@ struct dmub_notification;#define MIN_VIEWPORT_SIZE 12#define MAX_NUM_EDP 2 -/******************************************************************************* -* Display Core Interfaces -******************************************************************************/ +/* Display Core Interfaces */ struct dc_versions {const char *dc_ver;struct dmcu_version dmcu_version;
@@ -993,9 +991,7 @@ void dc_init_callbacks(struct dc *dc,void dc_deinit_callbacks (struct dc *dc);void dc_destroy (struct dc **dc); -/******************************************************************************* -* Surface Interfaces -******************************************************************************/ +/* Surface Interfaces */ enum {TRANSFER_FUNC_POINTS =1025
@@ -1350,9 +1346,7 @@ struct dc_state *dc_copy_state(struct dc_state *src_ctx);void dc_retain_state (struct dc_state *context);void dc_release_state (struct dc_state *context); -/******************************************************************************* -* Link Interfaces -******************************************************************************/ +/* Link Interfaces */ struct dpcd_caps {union dpcd_rev dpcd_rev;
@@ -1454,9 +1448,7 @@ struct hdcp_caps {uint32_t dc_get_opp_for_plane (struct dc *dc,struct dc_plane_state *plane); -/******************************************************************************* -* Sink Interfaces - A sink corresponds to a display output device -******************************************************************************/ +/* Sink Interfaces - A sink corresponds to a display output device */ struct dc_container_id {// 128bit GUID in binary form
@@ -1539,9 +1531,7 @@ struct dc_cursor { }; -/******************************************************************************* -* Interrupt interfaces -******************************************************************************/ +/* Interrupt interfaces */ enum dc_irq_source dc_interrupt_to_irq_source( struct dc *dc, uint32_t src_id,
@@ -1553,9 +1543,7 @@ enum dc_irq_source dc_get_hpd_irq_source_at_index(void dc_notify_vsync_int_state (struct dc *dc,struct dc_stream_state *stream,bool enable); -/******************************************************************************* -* Power Interfaces -******************************************************************************/ +/* Power Interfaces */ void dc_set_power_state( struct dc *dc,
@@ -1628,14 +1616,10 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,void dc_process_dmub_dpia_hpd_int_enable (const struct dc *dc,uint32_t hpd_int_enable); -/******************************************************************************* -* DSC Interfaces -******************************************************************************/ +/* DSC Interfaces */ #include "dc_dsc.h" -/******************************************************************************* -* Disable acc mode Interfaces -******************************************************************************/ +/* Disable acc mode Interfaces */ void dc_disable_accelerated_mode (struct dc *dc);#endif /* DC_INTERFACE_H_ */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 66/228 drm/amd/display: fix dc/core/dc.c kernel-doc
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit db4107e92a817502ad19fdd30250f87dcb6f6331 ]
Fix all kernel-doc warnings in dc/core/dc.c:
dc.c:385: warning: missing initial short description on line:
* dc_stream_adjust_vmin_vmax:
dc.c:392: warning: contents before sections
dc.c:399: warning: No description found for return value of 'dc_stream_adjust_vmin_vmax'
dc.c:434: warning: Excess function parameter 'adjust' description in 'dc_stream_get_last_used_drr_vtotal' dc.c:434: warning: No description found for return value of 'dc_stream_get_last_used_drr_vtotal'
dc.c:574: warning: No description found for return value of 'dc_stream_configure_crc'
dc.c:1746: warning: No description found for return value of 'dc_commit_state_no_check'
dc.c:4991: warning: This comment starts with '/**', but isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst
* dc_extended_blank_supported 0 Decide whether extended blank is supported
dc.c:4991: warning: missing initial short description on line:
* dc_extended_blank_supported 0 Decide whether extended blank is supported
dc.c:4723: warning: Function parameter or member 'dc' not described in 'dc_enable_dmub_outbox'
dc.c:4926: warning: Function parameter or member 'dc' not described in 'dc_process_dmub_dpia_hpd_int_enable' dc.c:4926: warning: Function parameter or member 'hpd_int_enable' not described in 'dc_process_dmub_dpia_hpd_int_enable' 12 warnings
Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 40 +++++++++++++++--------- 1 file changed, 25 insertions(+), 15 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +25 -15
@@ -382,16 +382,18 @@ static void dc_perf_trace_destroy(struct dc_perf_trace **perf_trace) }/** -* dc_stream_adjust_vmin_vmax: +* dc_stream_adjust_vmin_vmax - look up pipe context & update parts of DRR +* @dc: dc reference +* @stream: Initial dc stream state +* @adjust: Updated parameters for vertical_total_min and vertical_total_max * * Looks up the pipe context of dc_stream_state and updates the * vertical_total_min and vertical_total_max of the DRR, Dynamic Refresh * Rate, which is a power-saving feature that targets reducing panel * refresh rate while the screen is static * -* @dc: dc reference -* @stream: Initial dc stream state -* @adjust: Updated parameters for vertical_total_min and vertical_total_max +* Return: %true if the pipe context is found and adjusted; +* %false if the pipe context is not found. */ bool dc_stream_adjust_vmin_vmax(struct dc *dc, struct dc_stream_state *stream,
@@ -427,14 +429,17 @@ bool dc_stream_adjust_vmin_vmax(struct dc *dc, }/** -* dc_stream_get_last_used_drr_vtotal - dc_stream_get_last_vrr_vtotal +* dc_stream_get_last_used_drr_vtotal - Looks up the pipe context of +* dc_stream_state and gets the last VTOTAL used by DRR (Dynamic Refresh Rate) * * @dc: [in] dc reference * @stream: [in] Initial dc stream state -* @adjust: [in] Updated parameters for vertical_total_min and +* @refresh_rate: [in] new refresh_rate * -* Looks up the pipe context of dc_stream_state and gets the last VTOTAL used -* by DRR (Dynamic Refresh Rate) +* Return: %true if the pipe context is found and there is an associated +* timing_generator for the DC; +* %false if the pipe context is not found or there is no +* timing_generator for the DC. */ bool dc_stream_get_last_used_drr_vtotal(struct dc *dc, struct dc_stream_state *stream,
@@ -581,7 +586,10 @@ bool dc_stream_stop_dmcu_crc_win_update(struct dc *dc, struct dc_stream_state *s* once. * * By default, only CRC0 is configured, and the entire frame is used to -* calculate the crc. +* calculate the CRC. +* +* Return: %false if the stream is not found or CRC capture is not supported; +* %true if the stream has been configured. */ bool dc_stream_configure_crc (struct dc *dc,struct dc_stream_state *stream,struct crc_params *crc_window,bool enable,bool continuous)
@@ -650,7 +658,7 @@ bool dc_stream_configure_crc(struct dc *dc, struct dc_stream_state *stream,* dc_stream_configure_crc needs to be called beforehand to enable CRCs. * * Return: -* false if stream is not found, or if CRCs are not enabled. +* %false if stream is not found, or if CRCs are not enabled. */ bool dc_stream_get_crc (struct dc *dc,struct dc_stream_state *stream,uint32_t *r_cr,uint32_t *g_y,uint32_t *b_cb)
@@ -1739,6 +1747,8 @@ void dc_z10_save_init(struct dc *dc)/* * Applies given context to HW and copy it into current context. * It's up to the user to release the src context afterwards. +* +* Return: an enum dc_status result code for the operation */ static enum dc_status dc_commit_state_no_check (struct dc *dc,struct dc_state *context) {
@@ -4600,7 +4610,7 @@ bool dc_enable_dmub_notifications(struct dc *dc)/** * dc_enable_dmub_outbox - Enables DMUB unsolicited notification * -* dc: [in] dc structure +* @dc: [in] dc structure * * Enables DMUB unsolicited notifications to x86 via outbox. */
@@ -4801,8 +4811,8 @@ enum dc_status dc_process_dmub_set_mst_slots(const struct dc *dc,/** * dc_process_dmub_dpia_hpd_int_enable - Submits DPIA DPD interruption * -* @dc [in]: dc structure -* @hpd_int_enable [in]: 1 for hpd int enable, 0 to disable +* @dc: [in] dc structure +* @hpd_int_enable: [in] 1 for hpd int enable, 0 to disable * * Submits dpia hpd int enable command to dmub via inbox message */
@@ -4883,7 +4893,7 @@ void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, bo }/** -* dc_extended_blank_supported 0 Decide whether extended blank is supported +* dc_extended_blank_supported - Decide whether extended blank is supported * * @dc: [in] Current DC state *
@@ -4892,7 +4902,7 @@ void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, bo* ability to enter z9/z10. * * Return: -* Indicate whether extended blank is supported (true or false) +* Indicate whether extended blank is supported (%true or %false) */ bool dc_extended_blank_supported (struct dc *dc) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 67/228 drm/amd/display: Add FAMS validation before trying to use it
In reply to Greg Kroah-HartmanFrom: Rodrigo Siqueira <[email protected]>
[ Upstream commit e3416e872f84086667df21daf166506fab97358d ]
To ensure that FAMS can be used, DC must check if there is VRR support.
This commit adds the required configuration to ensure FAMS can be executed in the target system.
Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 6 ++++++ drivers/gpu/drm/amd/display/dc/dc_stream.h | 1 + drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c | 7 ++++++- drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +6 -0
@@ -2588,6 +2588,12 @@ static enum surface_update_type check_update_surfaces_for_stream(if (stream_update->mst_bw_update) su_flags->bits.mst_bw =1 ; + +if (stream_update->stream && stream_update->stream->freesync_on_desktop && + (stream_update->vrr_infopacket || stream_update->allow_freesync || + stream_update->vrr_active_variable)) + su_flags->bits.fams_changed =1 ; +if (stream_update->crtc_timing_adjust &&dc_extended_blank_supported (dc)) su_flags->bits.crtc_timing_adjust =1 ;
drivers/gpu/drm/amd/display/dc/dc_stream.h +1 -0
@@ -131,6 +131,7 @@ union stream_update_flags { uint32_t dsc_changed : 1; uint32_t mst_bw : 1; uint32_t crtc_timing_adjust : 1; + uint32_t fams_changed : 1; } bits;uint32_t raw;
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_optc.c +6 -1
@@ -292,7 +292,12 @@ void optc3_wait_drr_doublebuffer_pending_clear(struct timing_generator *optc)void optc3_set_vtotal_min_max (struct timing_generator *optc,int vtotal_min,int vtotal_max) { -optc1_set_vtotal_min_max (optc, vtotal_min, vtotal_max); +struct dc *dc = optc->ctx->dc; + +if (dc->caps.dmub_caps.mclk_sw && !dc->debug.disable_fams) +dc_dmub_srv_drr_update_cmd (dc, optc->inst, vtotal_min, vtotal_max); +else +optc1_set_vtotal_min_max (optc, vtotal_min, vtotal_max); }void optc3_tg_init (struct timing_generator *optc)
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h +1 -1
@@ -345,7 +345,7 @@ union dmub_fw_boot_status { uint32_t optimized_init_done : 1; /**< 1 if optimized init done */ uint32_t restore_required : 1; /**< 1 if driver should call restore */ uint32_t defer_load : 1; /**< 1 if VBIOS data is deferred programmed */ - uint32_t reserved : 1; + uint32_t fams_enabled : 1; /**< 1 if VBIOS data is deferred programmed */ uint32_t detection_required: 1; /**< if detection need to be triggered by driver */ } bits;/**< status bits */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 68/228 drm/amd/display: update extended blank for dcn314 onwards
In reply to Greg Kroah-HartmanFrom: Gabe Teeger <[email protected]>
[ Upstream commit 469a62938a45ef382c9cb7b9fec6c6c1fcd781c0 ]
[Why]
Flickering and underflow was observed when testing extended blank on dcn314.
[What]
Vstartup is contrainted by vblank_nom, so adjusting it to include non-adjusted vtotal in its calculation during freesync video means that Vstartup is not changed when vtotal changes. This fixed the flickering + underflow.
dc_extended_blank_supported function was removed because extended blank is only relevant to when zstate is supported. The increased vtotal during freesync can be passed to dml regardless of whether extended blank is supported or not, so this function is not needed.
Updates were made recently in dml to the calculation of min_dst_y_next_start. Dml input for dcn314 will now always use the newer calculation for min_dst_y_next_start. Dml input for older dcn versions remains untouched.
The variable optimized_min_dst_y_next_start is replaced everywhere with min_dst_y_next_start, and the updated dml allows min_dst_y_next_start to increase to an optimized value during freesync video, then return to default when freesync is disengaged.
Also removed registry key for controlling
extended blank feature.
Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0")
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 21 ----------------- drivers/gpu/drm/amd/display/dc/dc.h | 2 -- .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 4 ++-- .../drm/amd/display/dc/dml/dcn20/dcn20_fpu.c | 23 +++++++++---------- .../dc/dml/dcn31/display_rq_dlg_calc_31.c | 3 +-- .../amd/display/dc/dml/dcn314/dcn314_fpu.c | 14 +++++++---- .../dc/dml/dcn314/display_rq_dlg_calc_314.c | 16 ++++--------- .../amd/display/dc/dml/display_mode_structs.h | 3 +-- 8 files changed, 29 insertions(+), 57 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +0 -21
@@ -2594,9 +2594,6 @@ static enum surface_update_type check_update_surfaces_for_stream( stream_update->vrr_active_variable)) su_flags->bits.fams_changed =1 ; -if (stream_update->crtc_timing_adjust &&dc_extended_blank_supported (dc)) - su_flags->bits.crtc_timing_adjust =1 ; -if (su_flags->raw !=0 ) overall_type =UPDATE_TYPE_FULL ;
@@ -4897,21 +4894,3 @@ void dc_notify_vsync_int_state(struct dc *dc, struct dc_stream_state *stream, boif (pipe->stream_res.abm && pipe->stream_res.abm->funcs->set_abm_pause) pipe->stream_res.abm->funcs->set_abm_pause (pipe->stream_res.abm, !enable, i, pipe->stream_res.tg->inst); } - -/** -* dc_extended_blank_supported - Decide whether extended blank is supported -* -* @dc: [in] Current DC state -* -* Extended blank is a freesync optimization feature to be enabled in the -* future. During the extra vblank period gained from freesync, we have the -* ability to enter z9/z10. -* -* Return: -* Indicate whether extended blank is supported (%true or %false) -*/ -bool dc_extended_blank_supported (struct dc *dc) -{ -return dc->debug.extended_blank_optimization && !dc->debug.disable_z10 - && dc->caps.zstate_support && dc->caps.is_apu; -}
drivers/gpu/drm/amd/display/dc/dc.h +0 -2
@@ -1520,8 +1520,6 @@ struct dc_sink_init_data {bool converter_disable_audio; }; -bool dc_extended_blank_supported (struct dc *dc); -struct dc_sink *dc_sink_create (const struct dc_sink_init_data *init_params);/* Newer interfaces */
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +2 -2
@@ -2036,7 +2036,7 @@ void dcn20_optimize_bandwidth( dc->clk_mgr, context, true); -if (dc_extended_blank_supported (dc) && context->bw_ctx.bw.dcn.clk.zstate_support ==DCN_ZSTATE_SUPPORT_ALLOW ) { +if (context->bw_ctx.bw.dcn.clk.zstate_support ==DCN_ZSTATE_SUPPORT_ALLOW ) {for (i =0 ; i < dc->res_pool->pipe_count; ++i) {struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
@@ -2044,7 +2044,7 @@ void dcn20_optimize_bandwidth( && pipe_ctx->stream->adjust.v_total_min == pipe_ctx->stream->adjust.v_total_max && pipe_ctx->stream->adjust.v_total_max > pipe_ctx->stream->timing.v_total) pipe_ctx->plane_res.hubp->funcs->program_extended_blank(pipe_ctx->plane_res.hubp, - pipe_ctx->dlg_regs.optimized_min_dst_y_next_start); + pipe_ctx->dlg_regs.min_dst_y_next_start); } } }
drivers/gpu/drm/amd/display/dc/dml/dcn20/dcn20_fpu.c +11 -12
@@ -948,10 +948,10 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, struc {int plane_count;int i; -unsigned int optimized_min_dst_y_next_start_us; +unsigned int min_dst_y_next_start_us; plane_count =0 ; - optimized_min_dst_y_next_start_us =0 ; + min_dst_y_next_start_us =0 ;for (i =0 ; i < dc->res_pool->pipe_count; i++) {if (context->res_ctx.pipe_ctx[i].plane_state) plane_count++;
@@ -973,19 +973,18 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, strucelse if (context->stream_count ==1 && context->streams[0 ]->signal ==SIGNAL_TYPE_EDP ) {struct dc_link *link = context->streams[0 ]->sink->link;struct dc_stream_status *stream_status = &context->stream_status[0 ]; +struct dc_stream_state *current_stream = context->streams[0 ];int minmum_z8_residency = dc->debug.minimum_z8_residency_time >0 ? dc->debug.minimum_z8_residency_time :1000 ;bool allow_z8 = context->bw_ctx.dml.vba.StutterPeriod > (double )minmum_z8_residency;bool is_pwrseq0 = link->link_index ==0 ; +bool isFreesyncVideo; -if (dc_extended_blank_supported (dc)) { -for (i =0 ; i < dc->res_pool->pipe_count; i++) { -if (context->res_ctx.pipe_ctx[i].stream == context->streams[0 ] - && context->res_ctx.pipe_ctx[i].stream->adjust.v_total_min == context->res_ctx.pipe_ctx[i].stream->adjust.v_total_max - && context->res_ctx.pipe_ctx[i].stream->adjust.v_total_min > context->res_ctx.pipe_ctx[i].stream->timing.v_total) { - optimized_min_dst_y_next_start_us = - context->res_ctx.pipe_ctx[i].dlg_regs.optimized_min_dst_y_next_start_us; -break ; - } + isFreesyncVideo = current_stream->adjust.v_total_min == current_stream->adjust.v_total_max; + isFreesyncVideo = isFreesyncVideo && current_stream->timing.v_total < current_stream->adjust.v_total_min; +for (i =0 ; i < dc->res_pool->pipe_count; i++) { +if (context->res_ctx.pipe_ctx[i].stream == current_stream && isFreesyncVideo) { + min_dst_y_next_start_us = context->res_ctx.pipe_ctx[i].dlg_regs.min_dst_y_next_start_us; +break ; } }
@@ -993,7 +992,7 @@ static enum dcn_zstate_support_state decide_zstate_support(struct dc *dc, strucif (stream_status->plane_count >1 )return DCN_ZSTATE_SUPPORT_DISALLOW ; -if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod >5000.0 || optimized_min_dst_y_next_start_us >5000 )) +if (is_pwrseq0 && (context->bw_ctx.dml.vba.StutterPeriod >5000.0 || min_dst_y_next_start_us >5000 ))return DCN_ZSTATE_SUPPORT_ALLOW ;else if (is_pwrseq0 && link->psr_settings.psr_version ==DC_PSR_VERSION_1 && !link->panel_config.psr.disable_psr)return allow_z8 ?DCN_ZSTATE_SUPPORT_ALLOW_Z8_Z10_ONLY :DCN_ZSTATE_SUPPORT_ALLOW_Z10_ONLY ;
drivers/gpu/drm/amd/display/dc/dml/dcn31/display_rq_dlg_calc_31.c +1 -2
@@ -988,8 +988,7 @@ static void dml_rq_dlg_get_dlg_params( dlg_vblank_start = interlaced ? (vblank_start /2 ) : vblank_start; disp_dlg_regs->min_dst_y_next_start = (unsigned int ) (((double ) dlg_vblank_start) *dml_pow (2 ,2 )); - disp_dlg_regs->optimized_min_dst_y_next_start_us =0 ; - disp_dlg_regs->optimized_min_dst_y_next_start = disp_dlg_regs->min_dst_y_next_start; + disp_dlg_regs->min_dst_y_next_start_us =0 ;ASSERT (disp_dlg_regs->min_dst_y_next_start < (unsigned int )dml_pow (2 ,18 ));dml_print ("DML_DLG: %s: min_ttu_vblank (us) = %3.2f\n" , __func__, min_ttu_vblank);
drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c +10 -4
@@ -288,6 +288,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *cstruct resource_context *res_ctx = &context->res_ctx;struct pipe_ctx *pipe;bool upscaled = false; +bool isFreesyncVideo = false;dc_assert_fp_enabled ();
@@ -301,9 +302,16 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c pipe = &res_ctx->pipe_ctx[i]; timing = &pipe->stream->timing; -if (dc_extended_blank_supported (dc) && pipe->stream->adjust.v_total_max == pipe->stream->adjust.v_total_min - && pipe->stream->adjust.v_total_min > timing->v_total) + isFreesyncVideo = pipe->stream->adjust.v_total_max == pipe->stream->adjust.v_total_min; + isFreesyncVideo = isFreesyncVideo && pipe->stream->adjust.v_total_min > timing->v_total; + +if (!isFreesyncVideo) { + pipes[pipe_cnt].pipe.dest.vblank_nom = + dcn3_14_ip.VBlankNomDefaultUS / (timing->h_total / (timing->pix_clk_100hz /10000.0 )); + }else { pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; + pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; + } if (pipe->plane_state && (pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height ||
@@ -327,8 +335,6 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_luma =0 ; pipes[pipe_cnt].pipe.src.dcc_fraction_of_zs_req_chroma =0 ; pipes[pipe_cnt].pipe.dest.vfront_porch = timing->v_front_porch; - pipes[pipe_cnt].pipe.dest.vblank_nom = - dcn3_14_ip.VBlankNomDefaultUS / (timing->h_total / (timing->pix_clk_100hz /10000.0 )); pipes[pipe_cnt].pipe.src.dcc_rate =3 ; pipes[pipe_cnt].dout.dsc_input_bpc =0 ;
drivers/gpu/drm/amd/display/dc/dml/dcn314/display_rq_dlg_calc_314.c +4 -12
@@ -1053,7 +1053,6 @@ static void dml_rq_dlg_get_dlg_params(float vba__refcyc_per_req_delivery_pre_l =get_refcyc_per_req_delivery_pre_l_in_us (mode_lib, e2e_pipe_param, num_pipes, pipe_idx) * refclk_freq_in_mhz;// From VBA float vba__refcyc_per_req_delivery_l =get_refcyc_per_req_delivery_l_in_us (mode_lib, e2e_pipe_param, num_pipes, pipe_idx) * refclk_freq_in_mhz;// From VBA -int blank_lines =0 ;memset (disp_dlg_regs,0 ,sizeof (*disp_dlg_regs));memset (disp_ttu_regs,0 ,sizeof (*disp_ttu_regs));
@@ -1077,17 +1076,10 @@ static void dml_rq_dlg_get_dlg_params( min_ttu_vblank =get_min_ttu_vblank_in_us (mode_lib, e2e_pipe_param, num_pipes, pipe_idx);// From VBA dlg_vblank_start = interlaced ? (vblank_start /2 ) : vblank_start; - disp_dlg_regs->optimized_min_dst_y_next_start = disp_dlg_regs->min_dst_y_next_start; - disp_dlg_regs->optimized_min_dst_y_next_start_us =0 ; - disp_dlg_regs->min_dst_y_next_start = (unsigned int ) (((double ) dlg_vblank_start) *dml_pow (2 ,2 )); - blank_lines = (dst->vblank_end + dst->vtotal_min - dst->vblank_start - dst->vstartup_start -1 ); -if (blank_lines <0 ) - blank_lines =0 ; -if (blank_lines !=0 ) { - disp_dlg_regs->optimized_min_dst_y_next_start = vba__min_dst_y_next_start; - disp_dlg_regs->optimized_min_dst_y_next_start_us = (disp_dlg_regs->optimized_min_dst_y_next_start * dst->hactive) / (unsigned int ) dst->pixel_rate_mhz; - disp_dlg_regs->min_dst_y_next_start = disp_dlg_regs->optimized_min_dst_y_next_start; - } + disp_dlg_regs->min_dst_y_next_start_us = + (vba__min_dst_y_next_start * dst->hactive) / (unsigned int ) dst->pixel_rate_mhz; + disp_dlg_regs->min_dst_y_next_start = vba__min_dst_y_next_start *dml_pow (2 ,2 ); +ASSERT (disp_dlg_regs->min_dst_y_next_start < (unsigned int )dml_pow (2 ,18 ));dml_print ("DML_DLG: %s: min_ttu_vblank (us) = %3.2f\n" , __func__, min_ttu_vblank);
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h +1 -2
@@ -618,8 +618,7 @@ struct _vcs_dpi_display_dlg_regs_st {unsigned int refcyc_h_blank_end;unsigned int dlg_vblank_end;unsigned int min_dst_y_next_start; -unsigned int optimized_min_dst_y_next_start; -unsigned int optimized_min_dst_y_next_start_us; +unsigned int min_dst_y_next_start_us;unsigned int refcyc_per_htotal;unsigned int refcyc_x_after_scaler;unsigned int dst_y_after_scaler;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 69/228 drm/amd/display: Fix possible underflow for displays with large vblank
In reply to Greg Kroah-HartmanFrom: Daniel Miess <[email protected]>
[ Upstream commit 1a4bcdbea4319efeb26cc4b05be859a7867e02dc ]
[Why]
Underflow observed when using a display with a large vblank region and low refresh rate
[How]
Simplify calculation of vblank_nom
Increase value for VBlankNomDefaultUS to 800us
Stable-dep-of: 2a9482e55968 ("drm/amd/display: Prevent vtotal from being set to 0")
--- .../amd/display/dc/dml/dcn314/dcn314_fpu.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)
drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c +7 -12
@@ -32,7 +32,7 @@#include "dml/display_mode_vba.h" struct _vcs_dpi_ip_params_st dcn3_14_ip = { - .VBlankNomDefaultUS =668 , + .VBlankNomDefaultUS =800 , .gpuvm_enable =1 , .gpuvm_max_page_table_levels =1 , .hostvm_enable =1 ,
@@ -288,7 +288,7 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *cstruct resource_context *res_ctx = &context->res_ctx;struct pipe_ctx *pipe;bool upscaled = false; -bool isFreesyncVideo = false; +const unsigned int max_allowed_vblank_nom =1023 ;dc_assert_fp_enabled ();
@@ -302,16 +302,11 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c pipe = &res_ctx->pipe_ctx[i]; timing = &pipe->stream->timing; - isFreesyncVideo = pipe->stream->adjust.v_total_max == pipe->stream->adjust.v_total_min; - isFreesyncVideo = isFreesyncVideo && pipe->stream->adjust.v_total_min > timing->v_total; - -if (!isFreesyncVideo) { - pipes[pipe_cnt].pipe.dest.vblank_nom = - dcn3_14_ip.VBlankNomDefaultUS / (timing->h_total / (timing->pix_clk_100hz /10000.0 )); - }else { - pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; - pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; - } + pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; + pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; + pipes[pipe_cnt].pipe.dest.vblank_nom =min (pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS); + pipes[pipe_cnt].pipe.dest.vblank_nom =max (pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width); + pipes[pipe_cnt].pipe.dest.vblank_nom =min (pipes[pipe_cnt].pipe.dest.vblank_nom, max_allowed_vblank_nom); if (pipe->plane_state && (pipe->plane_state->src_rect.height < pipe->plane_state->dst_rect.height ||
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 70/228 drm/amd/display: Prevent vtotal from being set to 0
In reply to Greg Kroah-HartmanFrom: Daniel Miess <[email protected]>
[ Upstream commit 2a9482e55968ed7368afaa9c2133404069117320 ]
[Why]
In dcn314 DML the destination pipe vtotal was being set to the crtc adjustment vtotal_min value even in cases where that value is 0.
[How]
Only set vtotal to the crtc adjustment vtotal_min value in cases where the value is non-zero.
--- drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dml/dcn314/dcn314_fpu.c +5 -1
@@ -302,7 +302,11 @@ int dcn314_populate_dml_pipes_from_context_fpu(struct dc *dc, struct dc_state *c pipe = &res_ctx->pipe_ctx[i]; timing = &pipe->stream->timing; - pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; +if (pipe->stream->adjust.v_total_min !=0 ) + pipes[pipe_cnt].pipe.dest.vtotal = pipe->stream->adjust.v_total_min; +else + pipes[pipe_cnt].pipe.dest.vtotal = timing->v_total; + pipes[pipe_cnt].pipe.dest.vblank_nom = timing->v_total - pipes[pipe_cnt].pipe.dest.vactive; pipes[pipe_cnt].pipe.dest.vblank_nom =min (pipes[pipe_cnt].pipe.dest.vblank_nom, dcn3_14_ip.VBlankNomDefaultUS); pipes[pipe_cnt].pipe.dest.vblank_nom =max (pipes[pipe_cnt].pipe.dest.vblank_nom, timing->v_sync_width);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 71/228 jbd2: remove t_checkpoint_io_list
In reply to Greg Kroah-HartmanFrom: Zhang Yi <[email protected]>
[ Upstream commit be22255360f80d3af789daad00025171a65424a5 ]
Since t_checkpoint_io_list was stop using in jbd2_log_do_checkpoint() now, it's time to remove the whole t_checkpoint_io_list logic.
Stable-dep-of: 46f881b5b175 ("jbd2: fix a race when checking checkpoint buffer busy")
--- fs/jbd2/checkpoint.c | 42 ++---------------------------------------- fs/jbd2/commit.c | 3 +-- include/linux/jbd2.h | 6 ------ 3 files changed, 3 insertions(+), 48 deletions(-)
fs/jbd2/checkpoint.c +2 -40
@@ -27,7 +27,7 @@* * Called with j_list_lock held. */ -static inline void __buffer_unlink_first (struct journal_head *jh) +static inline void __buffer_unlink (struct journal_head *jh) {transaction_t *transaction = jh->b_cp_transaction;
@@ -40,23 +40,6 @@ static inline void __buffer_unlink_first(struct journal_head *jh) } } -/* -* Unlink a buffer from a transaction checkpoint(io) list. -* -* Called with j_list_lock held. -*/ -static inline void __buffer_unlink (struct journal_head *jh) -{ -transaction_t *transaction = jh->b_cp_transaction; - -__buffer_unlink_first (jh); -if (transaction->t_checkpoint_io_list == jh) { - transaction->t_checkpoint_io_list = jh->b_cpnext; -if (transaction->t_checkpoint_io_list == jh) - transaction->t_checkpoint_io_list =NULL ; - } -} -/* * Check a checkpoint buffer could be release or not. *
@@ -505,15 +488,6 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal,break ;if (need_resched () ||spin_needbreak (&journal->j_list_lock))break ; -if (released) -continue ; - - nr_freed +=journal_shrink_one_cp_list (transaction->t_checkpoint_io_list, - nr_to_scan, &released); -if (*nr_to_scan ==0 ) -break ; -if (need_resched () ||spin_needbreak (&journal->j_list_lock)) -break ; }while (transaction != last_transaction);if (transaction != last_transaction) {
@@ -568,17 +542,6 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy)*/ if (need_resched ())return ; -if (ret) -continue ; -/* -* It is essential that we are as careful as in the case of -* t_checkpoint_list with removing the buffer from the list as -* we can possibly see not yet submitted buffers on io_list -*/ - ret =journal_clean_one_cp_list (transaction-> - t_checkpoint_io_list, destroy); -if (need_resched ()) -return ;/* * Stop scanning if we couldn't free the transaction. This * avoids pointless scanning of transactions which still
@@ -663,7 +626,7 @@ int __jbd2_journal_remove_checkpoint(struct journal_head *jh)jbd2_journal_put_journal_head (jh);/* Is this transaction empty? */ -if (transaction->t_checkpoint_list || transaction->t_checkpoint_io_list) +if (transaction->t_checkpoint_list)return 0 ;/*
@@ -755,7 +718,6 @@ void __jbd2_journal_drop_transaction(journal_t *journal, transaction_t *transactJ_ASSERT (transaction->t_forget ==NULL );J_ASSERT (transaction->t_shadow_list ==NULL );J_ASSERT (transaction->t_checkpoint_list ==NULL ); -J_ASSERT (transaction->t_checkpoint_io_list ==NULL );J_ASSERT (atomic_read (&transaction->t_updates) ==0 );J_ASSERT (journal->j_committing_transaction != transaction);J_ASSERT (journal->j_running_transaction != transaction);
fs/jbd2/commit.c +1 -2
@@ -1171,8 +1171,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)spin_lock (&journal->j_list_lock); commit_transaction->t_state =T_FINISHED ;/* Check if the transaction can be dropped now that we are finished */ -if (commit_transaction->t_checkpoint_list ==NULL && - commit_transaction->t_checkpoint_io_list ==NULL ) { +if (commit_transaction->t_checkpoint_list ==NULL ) {__jbd2_journal_drop_transaction (journal, commit_transaction);jbd2_journal_free_transaction (commit_transaction); }
include/linux/jbd2.h +0 -6
@@ -622,12 +622,6 @@ struct transaction_s*/ struct journal_head *t_checkpoint_list; -/* -* Doubly-linked circular list of all buffers submitted for IO while -* checkpointing. [j_list_lock] -*/ -struct journal_head *t_checkpoint_io_list; -/* * Doubly-linked circular list of metadata buffers being * shadowed by log IO. The IO buffers on the iobuf list and
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 72/228 jbd2: remove journal_clean_one_cp_list()
In reply to Greg Kroah-HartmanFrom: Zhang Yi <[email protected]>
[ Upstream commit b98dba273a0e47dbfade89c9af73c5b012a4eabb ]
journal_clean_one_cp_list() and journal_shrink_one_cp_list() are almost the same, so merge them into journal_shrink_one_cp_list(), remove the nr_to_scan parameter, always scan and try to free the whole checkpoint list.
Stable-dep-of: 46f881b5b175 ("jbd2: fix a race when checking checkpoint buffer busy")
--- fs/jbd2/checkpoint.c | 75 +++++++++---------------------------- include/trace/events/jbd2.h | 12 ++---- 2 files changed, 21 insertions(+), 66 deletions(-)
fs/jbd2/checkpoint.c +17 -58
@@ -349,50 +349,10 @@ int jbd2_cleanup_journal_tail(journal_t *journal)/* Checkpoint list management */ -/* -* journal_clean_one_cp_list -* -* Find all the written-back checkpoint buffers in the given list and -* release them. If 'destroy' is set, clean all buffers unconditionally. -* -* Called with j_list_lock held. -* Returns 1 if we freed the transaction, 0 otherwise. -*/ -static int journal_clean_one_cp_list (struct journal_head *jh,bool destroy) -{ -struct journal_head *last_jh; -struct journal_head *next_jh = jh; - -if (!jh) -return 0 ; - - last_jh = jh->b_cpprev; -do { - jh = next_jh; - next_jh = jh->b_cpnext; - -if (!destroy &&__cp_buffer_busy (jh)) -return 0 ; - -if (__jbd2_journal_remove_checkpoint (jh)) -return 1 ; -/* -* This function only frees up some memory -* if possible so we dont have an obligation -* to finish processing. Bail out if preemption -* requested: -*/ -if (need_resched ()) -return 0 ; - }while (jh != last_jh); - -return 0 ; -} -/* * journal_shrink_one_cp_list * -* Find 'nr_to_scan' written-back checkpoint buffers in the given list +* Find all the written-back checkpoint buffers in the given list * and try to release them. If the whole transaction is released, set * the 'released' parameter. Return the number of released checkpointed * buffers.
@@ -400,15 +360,15 @@ static int journal_clean_one_cp_list(struct journal_head *jh, bool destroy)* Called with j_list_lock held. */ static unsigned long journal_shrink_one_cp_list (struct journal_head *jh, -unsigned long *nr_to_scan, -bool *released) +bool destroy,bool *released) {struct journal_head *last_jh;struct journal_head *next_jh = jh;unsigned long nr_freed =0 ;int ret; -if (!jh || *nr_to_scan ==0 ) + *released = false; +if (!jh)return 0 ; last_jh = jh->b_cpprev;
@@ -416,8 +376,7 @@ static unsigned long journal_shrink_one_cp_list(struct journal_head *jh, jh = next_jh; next_jh = jh->b_cpnext; - (*nr_to_scan)--; -if (__cp_buffer_busy (jh)) +if (!destroy &&__cp_buffer_busy (jh))continue ; nr_freed++;
@@ -429,7 +388,7 @@ static unsigned long journal_shrink_one_cp_list(struct journal_head *jh,if (need_resched ())break ; - }while (jh != last_jh && *nr_to_scan); + }while (jh != last_jh);return nr_freed; }
@@ -447,11 +406,11 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, unsigned long *nr_to_scan) {transaction_t *transaction, *last_transaction, *next_transaction; -bool released; +bool __maybe_unused released;tid_t first_tid =0 , last_tid =0 , next_tid =0 ;tid_t tid =0 ;unsigned long nr_freed =0 ; -unsigned long nr_scanned = *nr_to_scan; +unsigned long freed; again:spin_lock (&journal->j_list_lock);
@@ -480,10 +439,11 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, transaction = next_transaction; next_transaction = transaction->t_cpnext; tid = transaction->t_tid; - released = false; - nr_freed +=journal_shrink_one_cp_list (transaction->t_checkpoint_list, - nr_to_scan, &released); + freed =journal_shrink_one_cp_list (transaction->t_checkpoint_list, + false, &released); + nr_freed += freed; + (*nr_to_scan) -=min (*nr_to_scan, freed);if (*nr_to_scan ==0 )break ;if (need_resched () ||spin_needbreak (&journal->j_list_lock))
@@ -504,9 +464,8 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal,if (*nr_to_scan && next_tid) goto again; out: - nr_scanned -= *nr_to_scan;trace_jbd2_shrink_checkpoint_list (journal, first_tid, tid, last_tid, - nr_freed, nr_scanned, next_tid); + nr_freed, next_tid);return nr_freed; }
@@ -522,7 +481,7 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal,void __jbd2_journal_clean_checkpoint_list (journal_t *journal,bool destroy) {transaction_t *transaction, *last_transaction, *next_transaction; -int ret; +bool released; transaction = journal->j_checkpoint_transactions;if (!transaction)
@@ -533,8 +492,8 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy) do { transaction = next_transaction; next_transaction = transaction->t_cpnext; - ret = journal_clean_one_cp_list(transaction->t_checkpoint_list, - destroy); + journal_shrink_one_cp_list(transaction->t_checkpoint_list, + destroy, &released); /* * This function only frees up some memory if possible so we * dont have an obligation to finish processing. Bail out if
@@ -547,7 +506,7 @@ void __jbd2_journal_clean_checkpoint_list(journal_t *journal, bool destroy)* avoids pointless scanning of transactions which still * weren't checkpointed. */ -if (!ret) +if (!released)return ; }while (transaction != last_transaction); }
include/trace/events/jbd2.h +4 -8
@@ -462,11 +462,9 @@ TRACE_EVENT(jbd2_shrink_scan_exit, TRACE_EVENT(jbd2_shrink_checkpoint_list, TP_PROTO(journal_t *journal, tid_t first_tid, tid_t tid, tid_t last_tid, - unsigned long nr_freed, unsigned long nr_scanned, - tid_t next_tid), + unsigned long nr_freed, tid_t next_tid), - TP_ARGS(journal, first_tid, tid, last_tid, nr_freed, - nr_scanned, next_tid), + TP_ARGS(journal, first_tid, tid, last_tid, nr_freed, next_tid), TP_STRUCT__entry( __field(dev_t, dev)
@@ -474,7 +472,6 @@ TRACE_EVENT(jbd2_shrink_checkpoint_list, __field(tid_t, tid) __field(tid_t, last_tid) __field(unsigned long, nr_freed) - __field(unsigned long, nr_scanned) __field(tid_t, next_tid) ),
@@ -484,15 +481,14 @@ TRACE_EVENT(jbd2_shrink_checkpoint_list, __entry->tid = tid; __entry->last_tid = last_tid; __entry->nr_freed = nr_freed; - __entry->nr_scanned = nr_scanned; __entry->next_tid = next_tid; ),TP_printk ("dev %d,%d shrink transaction %u-%u(%u) freed %lu " -"scanned %lu next transaction %u" , +"next transaction %u" ,MAJOR (__entry->dev),MINOR (__entry->dev), __entry->first_tid, __entry->tid, __entry->last_tid, - __entry->nr_freed, __entry->nr_scanned, __entry->next_tid) + __entry->nr_freed, __entry->next_tid) );#endif /* _TRACE_JBD2_H */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 73/228 jbd2: fix a race when checking checkpoint buffer busy
In reply to Greg Kroah-HartmanFrom: Zhang Yi <[email protected]>
[ Upstream commit 46f881b5b1758dc4a35fba4a643c10717d0cf427 ]
Before removing checkpoint buffer from the t_checkpoint_list, we have to check both BH_Dirty and BH_Lock bits together to distinguish buffers have not been or were being written back. But __cp_buffer_busy() checks them separately, it first check lock state and then check dirty, the window between these two checks could be raced by writing back procedure, which locks buffer and clears buffer dirty before I/O completes. So it cannot guarantee checkpointing buffers been written back to disk if some error happens later. Finally, it may clean checkpoint transactions and lead to inconsistent filesystem.
jbd2_journal_forget() and __journal_try_to_free_buffer() also have the same problem (journal_unmap_buffer() escape from this issue since it's running under the buffer lock), so fix them through introducing a new helper to try holding the buffer lock and remove really clean buffer.
--- fs/jbd2/checkpoint.c | 38 +++++++++++++++++++++++++++++++++++--- fs/jbd2/transaction.c | 17 +++++------------ include/linux/jbd2.h | 1 + 3 files changed, 41 insertions(+), 15 deletions(-)
fs/jbd2/checkpoint.c +35 -3
@@ -376,11 +376,15 @@ static unsigned long journal_shrink_one_cp_list(struct journal_head *jh, jh = next_jh; next_jh = jh->b_cpnext; -if (!destroy &&__cp_buffer_busy (jh)) -continue ; +if (destroy) { + ret =__jbd2_journal_remove_checkpoint (jh); + }else { + ret =jbd2_journal_try_remove_checkpoint (jh); +if (ret <0 ) +continue ; + } nr_freed++; - ret =__jbd2_journal_remove_checkpoint (jh);if (ret) { *released = true;break ;
@@ -616,6 +620,34 @@ int __jbd2_journal_remove_checkpoint(struct journal_head *jh)return 1 ; } +/* +* Check the checkpoint buffer and try to remove it from the checkpoint +* list if it's clean. Returns -EBUSY if it is not clean, returns 1 if +* it frees the transaction, 0 otherwise. +* +* This function is called with j_list_lock held. +*/ +int jbd2_journal_try_remove_checkpoint (struct journal_head *jh) +{ +struct buffer_head *bh =jh2bh (jh); + +if (!trylock_buffer (bh)) +return -EBUSY ; +if (buffer_dirty (bh)) { +unlock_buffer (bh); +return -EBUSY ; + } +unlock_buffer (bh); + +/* +* Buffer is clean and the IO has finished (we held the buffer +* lock) so the checkpoint is done. We can safely remove the +* buffer from this transaction. +*/ +JBUFFER_TRACE (jh,"remove from checkpoint list" ); +return __jbd2_journal_remove_checkpoint (jh); +} +/* * journal_insert_checkpoint: put a committed buffer onto a checkpoint * list so that we know when it is safe to clean the transaction out of
fs/jbd2/transaction.c +5 -12
@@ -1784,8 +1784,7 @@ int jbd2_journal_forget(handle_t *handle, struct buffer_head *bh)* Otherwise, if the buffer has been written to disk, * it is safe to remove the checkpoint and drop it. */ -if (!buffer_dirty (bh)) { -__jbd2_journal_remove_checkpoint (jh); +if (jbd2_journal_try_remove_checkpoint (jh) >=0 ) {spin_unlock (&journal->j_list_lock); goto drop; }
@@ -2112,20 +2111,14 @@ __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh) jh =bh2jh (bh); -if (buffer_locked (bh) ||buffer_dirty (bh)) - goto out; -if (jh->b_next_transaction !=NULL || jh->b_transaction !=NULL ) - goto out; +return ;spin_lock (&journal->j_list_lock); -if (jh->b_cp_transaction !=NULL ) { -/* written-back checkpointed metadata buffer */ -JBUFFER_TRACE (jh,"remove from checkpoint list" ); -__jbd2_journal_remove_checkpoint (jh); - } +/* Remove written-back checkpointed metadata buffer */ +if (jh->b_cp_transaction !=NULL ) +jbd2_journal_try_remove_checkpoint (jh);spin_unlock (&journal->j_list_lock); -out:return ; }
include/linux/jbd2.h +1 -0
@@ -1435,6 +1435,7 @@ extern void jbd2_journal_commit_transaction(journal_t *);void __jbd2_journal_clean_checkpoint_list (journal_t *journal,bool destroy);unsigned long jbd2_journal_shrink_checkpoint_list (journal_t *journal,unsigned long *nr_to_scan);int __jbd2_journal_remove_checkpoint (struct journal_head *); +int jbd2_journal_try_remove_checkpoint (struct journal_head *jh);void jbd2_journal_destroy_checkpoint (journal_t *journal);void __jbd2_journal_insert_checkpoint (struct journal_head *,transaction_t *);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 74/228 phy: phy-mtk-dp: Fix an error code in probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 5782017cc4d0c8f3425d55b893675bb8a20c33e9 ]
Negative -EINVAL was intended instead of positive EINVAL.
--- drivers/phy/mediatek/phy-mtk-dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/mediatek/phy-mtk-dp.c +1 -1
@@ -169,7 +169,7 @@ static int mtk_dp_phy_probe(struct platform_device *pdev) regs = *(struct regmap **)dev->platform_data;if (!regs) -return dev_err_probe (dev,EINVAL , +return dev_err_probe (dev, -EINVAL ,"No data passed, requires struct regmap**\n" ); dp_phy =devm_kzalloc (dev,sizeof (*dp_phy),GFP_KERNEL );
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 75/228 phy: qcom-snps: correct struct qcom_snps_hsphy kerneldoc
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 2a881183dc5ab2474ef602e48fe7af34db460d95 ]
Update kerneldoc of struct qcom_snps_hsphy to fix:
drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c:135: warning: Function parameter or member 'update_seq_cfg' not described in 'qcom_snps_hsphy'
Stable-dep-of: 8a0eb8f9b9a0 ("phy: qcom-snps-femto-v2: properly enable ref clock")
--- drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c +1 -1
@@ -115,11 +115,11 @@ struct phy_override_seq {* * @cfg_ahb_clk: AHB2PHY interface clock * @ref_clk: phy reference clock -* @iface_clk: phy interface clock * @phy_reset: phy reset control * @vregs: regulator supplies bulk data * @phy_initialized: if PHY has been initialized correctly * @mode: contains the current mode the PHY is in +* @update_seq_cfg: tuning parameters for phy init */ struct qcom_snps_hsphy {struct phy *phy;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 76/228 phy: qcom-snps-femto-v2: keep cfg_ahb_clk enabled during runtime suspend
In reply to Greg Kroah-HartmanFrom: Adrien Thierry <[email protected]>
[ Upstream commit 45d89a344eb46db9dce851c28e14f5e3c635c251 ]
In the dwc3 core, both system and runtime suspend end up calling dwc3_suspend_common(). From there, what happens for the PHYs depends on the USB mode and whether the controller is entering system or runtime suspend.
HOST mode:
(1) system suspend on a non-wakeup-capable controller
The [1] if branch is taken. dwc3_core_exit() is called, which ends up calling phy_power_off() and phy_exit(). Those two functions decrease the PM runtime count at some point, so they will trigger the PHY runtime sleep (assuming the count is right).
(2) runtime suspend / system suspend on a wakeup-capable controller
The [1] branch is not taken. dwc3_suspend_common() calls phy_pm_runtime_put_sync(). Assuming the ref count is right, the PHY runtime suspend op is called.
DEVICE mode:
dwc3_core_exit() is called on both runtime and system sleep unless the controller is already runtime suspended.
OTG mode:
(1) system suspend : dwc3_core_exit() is called
(2) runtime suspend : do nothing
In host mode, the code seems to make a distinction between 1) runtime sleep / system sleep for wakeup-capable controller, and 2) system sleep for non-wakeup-capable controller, where phy_power_off() and phy_exit() are only called for the latter. This suggests the PHY is not supposed to be in a fully powered-off state for runtime sleep and system sleep for wakeup-capable controller.
Moreover, downstream, cfg_ahb_clk only gets disabled for system suspend. The clocks are disabled by phy->set_suspend() [2] which is only called in the system sleep path through dwc3_core_exit() [3].
With that in mind, don't disable the clocks during the femto PHY runtime suspend callback. The clocks will only be disabled during system suspend for non-wakeup-capable controllers, through dwc3_core_exit().
[1] https://elixir.bootlin.com/linux/v6.4/source/drivers/usb/dwc3/core.c#L1988
[2] https://git.codelinaro.org/clo/la/kernel/msm-5.4/-/blob/LV.AU.1.2.1.r2-05300-gen3meta.0/drivers/usb/phy/phy-msm-snps-hs.c#L524
[3] https://git.codelinaro.org/clo/la/kernel/msm-5.4/-/blob/LV.AU.1.2.1.r2-05300-gen3meta.0/drivers/usb/dwc3/core.c#L1915
Stable-dep-of: 8a0eb8f9b9a0 ("phy: qcom-snps-femto-v2: properly enable ref clock")
--- drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c | 9 --------- 1 file changed, 9 deletions(-)
drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c +0 -9
@@ -165,22 +165,13 @@ static int qcom_snps_hsphy_suspend(struct qcom_snps_hsphy *hsphy) 0, USB2_AUTO_RESUME); } -clk_disable_unprepare (hsphy->cfg_ahb_clk);return 0 ; }static int qcom_snps_hsphy_resume (struct qcom_snps_hsphy *hsphy) { -int ret; -dev_dbg (&hsphy->phy->dev,"Resume QCOM SNPS PHY, mode\n" ); - ret =clk_prepare_enable (hsphy->cfg_ahb_clk); -if (ret) { -dev_err (&hsphy->phy->dev,"failed to enable cfg ahb clock\n" ); -return ret; - } -return 0 ; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 77/228 phy: qcom-snps-femto-v2: properly enable ref clock
In reply to Greg Kroah-HartmanFrom: Adrien Thierry <[email protected]>
[ Upstream commit 8a0eb8f9b9a002291a3934acfd913660b905249e ]
The driver is not enabling the ref clock, which thus gets disabled by the clk_disable_unused() initcall. This leads to the dwc3 controller failing to initialize if probed after clk_disable_unused() is called, for instance when the driver is built as a module.
To fix this, switch to the clk_bulk API to handle both cfg_ahb and ref clocks at the proper places.
Note that the cfg_ahb clock is currently not used by any device tree instantiation of the PHY. Work needs to be done separately to fix this.
--- drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c | 63 ++++++++++++++----- 1 file changed, 48 insertions(+), 15 deletions(-)
drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c +48 -15
@@ -110,11 +110,13 @@ struct phy_override_seq {/** * struct qcom_snps_hsphy - snps hs phy attributes * +* @dev: device structure +* * @phy: generic phy * @base: iomapped memory space for snps hs phy * -* @cfg_ahb_clk: AHB2PHY interface clock -* @ref_clk: phy reference clock +* @num_clks: number of clocks +* @clks: array of clocks * @phy_reset: phy reset control * @vregs: regulator supplies bulk data * @phy_initialized: if PHY has been initialized correctly
@@ -122,11 +124,13 @@ struct phy_override_seq {* @update_seq_cfg: tuning parameters for phy init */ struct qcom_snps_hsphy { +struct device *dev; +struct phy *phy;void __iomem *base; -struct clk *cfg_ahb_clk; -struct clk *ref_clk; +int num_clks; +struct clk_bulk_data *clks;struct reset_control *phy_reset;struct regulator_bulk_data vregs[SNPS_HS_NUM_VREGS ];
@@ -135,6 +139,34 @@ struct qcom_snps_hsphy {struct phy_override_seq update_seq_cfg[NUM_HSPHY_TUNING_PARAMS ]; }; +static int qcom_snps_hsphy_clk_init (struct qcom_snps_hsphy *hsphy) +{ +struct device *dev = hsphy->dev; + + hsphy->num_clks =2 ; + hsphy->clks =devm_kcalloc (dev, hsphy->num_clks,sizeof (*hsphy->clks),GFP_KERNEL ); +if (!hsphy->clks) +return -ENOMEM ; + +/* +* TODO: Currently no device tree instantiation of the PHY is using the clock. +* This needs to be fixed in order for this code to be able to use devm_clk_bulk_get(). +*/ + hsphy->clks[0 ].id ="cfg_ahb" ; + hsphy->clks[0 ].clk =devm_clk_get_optional (dev,"cfg_ahb" ); +if (IS_ERR (hsphy->clks[0 ].clk)) +return dev_err_probe (dev,PTR_ERR (hsphy->clks[0 ].clk), +"failed to get cfg_ahb clk\n" ); + + hsphy->clks[1 ].id ="ref" ; + hsphy->clks[1 ].clk =devm_clk_get (dev,"ref" ); +if (IS_ERR (hsphy->clks[1 ].clk)) +return dev_err_probe (dev,PTR_ERR (hsphy->clks[1 ].clk), +"failed to get ref clk\n" ); + +return 0 ; +} +static inline void qcom_snps_hsphy_write_mask (void __iomem *base,u32 offset,u32 mask,u32 val) {
@@ -365,16 +397,16 @@ static int qcom_snps_hsphy_init(struct phy *phy)if (ret)return ret; - ret =clk_prepare_enable (hsphy->cfg_ahb_clk); + ret =clk_bulk_prepare_enable (hsphy->num_clks, hsphy->clks);if (ret) { -dev_err (&phy->dev,"failed to enable cfg ahb clock, %d\n" , ret); +dev_err (&phy->dev,"failed to enable clocks, %d\n" , ret); goto poweroff_phy; } ret =reset_control_assert (hsphy->phy_reset);if (ret) {dev_err (&phy->dev,"failed to assert phy_reset, %d\n" , ret); - goto disable_ahb_clk; + goto disable_clks; }usleep_range (100 ,150 );
@@ -382,7 +414,7 @@ static int qcom_snps_hsphy_init(struct phy *phy) ret =reset_control_deassert (hsphy->phy_reset);if (ret) {dev_err (&phy->dev,"failed to de-assert phy_reset, %d\n" , ret); - goto disable_ahb_clk; + goto disable_clks; } qcom_snps_hsphy_write_mask(hsphy->base, USB2_PHY_USB_PHY_CFG0,
@@ -439,8 +471,8 @@ static int qcom_snps_hsphy_init(struct phy *phy)return 0 ; -disable_ahb_clk: -clk_disable_unprepare (hsphy->cfg_ahb_clk); +disable_clks: +clk_bulk_disable_unprepare (hsphy->num_clks, hsphy->clks); poweroff_phy:regulator_bulk_disable (ARRAY_SIZE (hsphy->vregs), hsphy->vregs);
@@ -452,7 +484,7 @@ static int qcom_snps_hsphy_exit(struct phy *phy)struct qcom_snps_hsphy *hsphy =phy_get_drvdata (phy);reset_control_assert (hsphy->phy_reset); -clk_disable_unprepare (hsphy->cfg_ahb_clk); +clk_bulk_disable_unprepare (hsphy->num_clks, hsphy->clks);regulator_bulk_disable (ARRAY_SIZE (hsphy->vregs), hsphy->vregs); hsphy->phy_initialized = false;
@@ -545,14 +577,15 @@ static int qcom_snps_hsphy_probe(struct platform_device *pdev)if (!hsphy)return -ENOMEM ; + hsphy->dev = dev; + hsphy->base =devm_platform_ioremap_resource (pdev,0 );if (IS_ERR (hsphy->base))return PTR_ERR (hsphy->base); - hsphy->ref_clk =devm_clk_get (dev,"ref" ); -if (IS_ERR (hsphy->ref_clk)) -return dev_err_probe (dev,PTR_ERR (hsphy->ref_clk), -"failed to get ref clk\n" ); + ret =qcom_snps_hsphy_clk_init (hsphy); +if (ret) +return dev_err_probe (dev, ret,"failed to initialize clocks\n" ); hsphy->phy_reset =devm_reset_control_get_exclusive (&pdev->dev,NULL );if (IS_ERR (hsphy->phy_reset)) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 78/228 soundwire: qcom: update status correctly with mask
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit f84d41b2a083b990cbdf70f3b24b6b108b9678ad ]
SoundWire device status can be incorrectly updated without proper mask, fix this by adding a mask before updating the status.
--- drivers/soundwire/qcom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soundwire/qcom.c +1 -1
@@ -434,7 +434,7 @@ static int qcom_swrm_get_alert_slave_dev_num(struct qcom_swrm_ctrl *ctrl) status = (val >> (dev_num *SWRM_MCP_SLV_STATUS_SZ ));if ((status &SWRM_MCP_SLV_STATUS_MASK ) ==SDW_SLAVE_ALERT ) { - ctrl->status[dev_num] = status; + ctrl->status[dev_num] = status &SWRM_MCP_SLV_STATUS_MASK ;return dev_num; } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 79/228 media: staging: atomisp: select V4L2_FWNODE
In reply to Greg Kroah-HartmanFrom: Sakari Ailus <[email protected]>
[ Upstream commit bf4c985707d3168ebb7d87d15830de66949d979c ]
Select V4L2_FWNODE as the driver depends on it.
--- drivers/staging/media/atomisp/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/staging/media/atomisp/Kconfig +1 -0
@@ -13,6 +13,7 @@ config VIDEO_ATOMISP tristate "Intel Atom Image Signal Processor Driver" depends on VIDEO_DEV && INTEL_ATOMISP depends on PMIC_OPREGION + select V4L2_FWNODE select IOSF_MBI select VIDEOBUF_VMALLOC select VIDEO_V4L2_SUBDEV_API
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 80/228 media: amphion: Fix firmware path to match linux-firmware
In reply to Greg Kroah-HartmanFrom: Nicolas Dufresne <[email protected]>
[ Upstream commit dcff0b56f661b6b42e828012b464d22cc2068c38 ]
The path did not match the one it was submitted into linux-firmware which prevented generic distribution from having working CODEC.
--- drivers/media/platform/amphion/vpu_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/platform/amphion/vpu_core.c +2 -2
@@ -828,7 +828,7 @@ static const struct dev_pm_ops vpu_core_pm_ops = {static struct vpu_core_resources imx8q_enc = { .type =VPU_CORE_TYPE_ENC , - .fwname ="vpu/vpu_fw_imx8_enc.bin" , + .fwname ="amphion/vpu/vpu_fw_imx8_enc.bin" , .stride =16 , .max_width =1920 , .max_height =1920 ,
@@ -843,7 +843,7 @@ static struct vpu_core_resources imx8q_enc = {static struct vpu_core_resources imx8q_dec = { .type =VPU_CORE_TYPE_DEC , - .fwname ="vpu/vpu_fw_imx8_dec.bin" , + .fwname ="amphion/vpu/vpu_fw_imx8_dec.bin" , .stride =256 , .max_width =8188 , .max_height =8188 ,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 81/228 i40e: Fix an NULL vs IS_ERR() bug for debugfs_create_dir()
In reply to Greg Kroah-HartmanFrom: Wang Ming <[email protected]>
[ Upstream commit 043b1f185fb0f3939b7427f634787706f45411c4 ]
The debugfs_create_dir() function returns error pointers. It never returns NULL. Most incorrect error checks were fixed, but the one in i40e_dbg_init() was forgotten.
Fix the remaining error check.
--- drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +1 -1
@@ -1839,7 +1839,7 @@ void i40e_dbg_pf_exit(struct i40e_pf *pf)void i40e_dbg_init (void ) { i40e_dbg_root =debugfs_create_dir (i40e_driver_name,NULL ); -if (!i40e_dbg_root) +if (IS_ERR (i40e_dbg_root))pr_info ("init of debugfs failed\n" ); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 82/228 iavf: fix potential deadlock on allocation failure
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit a2f054c10bef0b54600ec9cb776508443e941343 ]
In iavf_adminq_task(), if kzalloc() fails to allocate the event.msg_buf, the function will exit without releasing the adapter->crit_lock.
This is unlikely, but if it happens, the next access to that mutex will deadlock.
Fix this by moving the unlock to the end of the function, and adding a new label to allow jumping to the unlock portion of the function exit flow.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +3 -2
@@ -3300,7 +3300,7 @@ static void iavf_adminq_task(struct work_struct *work) event.buf_len =IAVF_MAX_AQ_BUF_SIZE ; event.msg_buf =kzalloc (event.buf_len,GFP_KERNEL );if (!event.msg_buf) - goto out; + goto unlock; do { ret = iavf_clean_arq_element(hw, &event, &pending);
@@ -3315,7 +3315,6 @@ static void iavf_adminq_task(struct work_struct *work)if (pending !=0 )memset (event.msg_buf,0 ,IAVF_MAX_AQ_BUF_SIZE ); }while (pending); -mutex_unlock (&adapter->crit_lock);if (iavf_is_reset_in_progress (adapter)) goto freedom;
@@ -3359,6 +3358,8 @@ static void iavf_adminq_task(struct work_struct *work) freedom:kfree (event.msg_buf); +unlock: +mutex_unlock (&adapter->crit_lock); out:/* re-enable Admin queue interrupt cause */ iavf_misc_irq_enable (adapter);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 83/228 iavf: check for removal state before IAVF_FLAG_PF_COMMS_FAILED
In reply to Greg Kroah-HartmanFrom: Jacob Keller <[email protected]>
[ Upstream commit 91896c8acce23d33ed078cffd46a9534b1f82be5 ]
In iavf_adminq_task(), if the function can't acquire the adapter->crit_lock, it checks if the driver is removing. If so, it simply exits without re-enabling the interrupt. This is done to ensure that the task stops processing as soon as possible once the driver is being removed.
However, if the IAVF_FLAG_PF_COMMS_FAILED is set, the function checks this before attempting to acquire the lock. In this case, the function exits early and re-enables the interrupt. This will happen even if the driver is already removing.
Avoid this, by moving the check to after the adapter->crit_lock is acquired. This way, if the driver is removing, we will not re-enable the interrupt.
--- drivers/net/ethernet/intel/iavf/iavf_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/iavf/iavf_main.c +3 -3
@@ -3286,9 +3286,6 @@ static void iavf_adminq_task(struct work_struct *work)u32 val, oldval;u16 pending; -if (adapter->flags &IAVF_FLAG_PF_COMMS_FAILED ) - goto out; -if (!mutex_trylock (&adapter->crit_lock)) {if (adapter->state == __IAVF_REMOVE)return ;
@@ -3297,6 +3294,9 @@ static void iavf_adminq_task(struct work_struct *work) goto out; } +if (adapter->flags &IAVF_FLAG_PF_COMMS_FAILED ) + goto unlock; + event.buf_len =IAVF_MAX_AQ_BUF_SIZE ; event.msg_buf =kzalloc (event.buf_len,GFP_KERNEL );if (!event.msg_buf)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 84/228 net: phy: marvell10g: fix 88x3310 power up
In reply to Greg Kroah-HartmanFrom: Jiawen Wu <[email protected]>
[ Upstream commit c7b75bea853daeb64fc831dbf39a6bbabcc402ac ]
Clear MV_V2_PORT_CTRL_PWRDOWN bit to set power up for 88x3310 PHY, it sometimes does not take effect immediately. And a read of this register causes the bit not to clear. This will cause mv3310_reset() to time out, which will fail the config initialization. So add a delay before the next access.
--- drivers/net/phy/marvell10g.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/phy/marvell10g.c +7 -0
@@ -328,6 +328,13 @@ static int mv3310_power_up(struct phy_device *phydev) ret =phy_clear_bits_mmd (phydev,MDIO_MMD_VEND2 ,MV_V2_PORT_CTRL ,MV_V2_PORT_CTRL_PWRDOWN ); +/* Sometimes, the power down bit doesn't clear immediately, and +* a read of this register causes the bit not to clear. Delay +* 100us to allow the PHY to come out of power down mode before +* the next access. +*/ +udelay (100 ); +if (phydev->drv->phy_id !=MARVELL_PHY_ID_88X3310 || priv->firmware_ver <0x00030000 )return ret;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 85/228 net: hns3: fix the imp capability bit cannot exceed 32 bits issue
In reply to Greg Kroah-HartmanFrom: Hao Lan <[email protected]>
[ Upstream commit b27d0232e8897f7c896dc8ad80c9907dd57fd3f3 ]
Current only the first 32 bits of the capability flag bit are considered. When the matching capability flag bit is greater than 31 bits, it will get an error bit.This patch use bitmap to solve this issue. It can handle each capability bit whitout bit width limit.
--- drivers/net/ethernet/hisilicon/hns3/hnae3.h | 3 ++- .../hns3/hns3_common/hclge_comm_cmd.c | 21 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hnae3.h +2 -1
@@ -31,6 +31,7 @@#include <linux/pci.h> #include <linux/pkt_sched.h> #include <linux/types.h> +#include <linux/bitmap.h> #include <net/pkt_cls.h> #define HNAE3_MOD_VERSION "1.0"
@@ -402,7 +403,7 @@ struct hnae3_ae_dev {unsigned long hw_err_reset_req;struct hnae3_dev_specs dev_specs;u32 dev_version; -unsigned long caps[BITS_TO_LONGS (HNAE3_DEV_CAPS_MAX_NUM )]; +DECLARE_BITMAP (caps,HNAE3_DEV_CAPS_MAX_NUM );void *priv; };
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c +18 -3
@@ -170,6 +170,20 @@ static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = { {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B}, }; +static void +hclge_comm_capability_to_bitmap (unsigned long *bitmap,__le32 *caps) +{ +const unsigned int words =HCLGE_COMM_QUERY_CAP_LENGTH ; +u32 val[HCLGE_COMM_QUERY_CAP_LENGTH ]; +unsigned int i; + +for (i =0 ; i < words; i++) + val[i] =__le32_to_cpu (caps[i]); + +bitmap_from_arr32 (bitmap, val, +HCLGE_COMM_QUERY_CAP_LENGTH *BITS_PER_TYPE (u32)); +} +static void hclge_comm_parse_capability (struct hnae3_ae_dev *ae_dev,bool is_pf,struct hclge_comm_query_version_cmd *cmd)
@@ -178,11 +192,12 @@ hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf, is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps;u32 size = is_pf ?ARRAY_SIZE (hclge_pf_cmd_caps) :ARRAY_SIZE (hclge_vf_cmd_caps); -u32 caps, i; +DECLARE_BITMAP (caps,HCLGE_COMM_QUERY_CAP_LENGTH *BITS_PER_TYPE (u32)); +u32 i; - caps =__le32_to_cpu (cmd->caps[0 ]); +hclge_comm_capability_to_bitmap (caps, cmd->caps);for (i =0 ; i < size; i++) -if (hnae3_get_bit (caps, caps_map[i].imp_bit)) +if (test_bit (caps_map[i].imp_bit, caps))set_bit (caps_map[i].local_bit, ae_dev->caps); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 86/228 net: hns3: fix wrong tc bandwidth weight data issue
In reply to Greg Kroah-HartmanFrom: Jijie Shao <[email protected]>
[ Upstream commit 116d9f732eef634abbd871f2c6f613a5b4677742 ]
Currently, the weight saved by the driver is used as the query result, which may be different from the actual weight in the register. Therefore, the register value read from the firmware is used as the query result
--- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_debugfs.c +1 -2
@@ -692,8 +692,7 @@ static int hclge_dbg_dump_tc(struct hclge_dev *hdev, char *buf, int len)for (i =0 ; i <HNAE3_MAX_TC ; i++) { sch_mode_str = ets_weight->tc_weight[i] ?"dwrr" :"sp" ; pos +=scnprintf (buf + pos, len - pos,"%u %4s %3u\n" , - i, sch_mode_str, - hdev->tm_info.pg_info[0 ].tc_dwrr[i]); + i, sch_mode_str, ets_weight->tc_weight[i]); }return 0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 87/228 net: hns3: fix wrong bw weight of disabled tc issue
In reply to Greg Kroah-HartmanFrom: Jijie Shao <[email protected]>
[ Upstream commit 882481b1c55fc44861d7e2d54b4e0936b1b39f2c ]
In dwrr mode, the default bandwidth weight of disabled tc is set to 0. If the bandwidth weight is 0, the mode will change to sp. Therefore, disabled tc default bandwidth weight need changed to 1, and 0 is returned when query the bandwidth weight of disabled tc. In addition, driver need stop configure bandwidth weight if tc is disabled.
--- .../ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | 17 ++++++++++++++--- .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 3 ++- 2 files changed, 16 insertions(+), 4 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +14 -3
@@ -52,7 +52,10 @@ static void hclge_tm_info_to_ieee_ets(struct hclge_dev *hdev,for (i =0 ; i <HNAE3_MAX_TC ; i++) { ets->prio_tc[i] = hdev->tm_info.prio_tc[i]; - ets->tc_tx_bw[i] = hdev->tm_info.pg_info[0 ].tc_dwrr[i]; +if (i < hdev->tm_info.num_tc) + ets->tc_tx_bw[i] = hdev->tm_info.pg_info[0 ].tc_dwrr[i]; +else + ets->tc_tx_bw[i] =0 ;if (hdev->tm_info.tc_info[i].tc_sch_mode ==HCLGE_SCH_MODE_SP )
@@ -123,7 +126,8 @@ static u8 hclge_ets_tc_changed(struct hclge_dev *hdev, struct ieee_ets *ets, }static int hclge_ets_sch_mode_validate (struct hclge_dev *hdev, -struct ieee_ets *ets,bool *changed) +struct ieee_ets *ets,bool *changed, +u8 tc_num) {bool has_ets_tc = false;u32 total_ets_bw =0 ;
@@ -137,6 +141,13 @@ static int hclge_ets_sch_mode_validate(struct hclge_dev *hdev, *changed = true;break ;case IEEE_8021QAZ_TSA_ETS : +if (i >= tc_num) { +dev_err (&hdev->pdev->dev, +"tc%u is disabled, cannot set ets bw\n" , + i); +return -EINVAL ; + } +/* The hardware will switch to sp mode if bandwidth is * 0, so limit ets bandwidth must be greater than 0. */
@@ -176,7 +187,7 @@ static int hclge_ets_validate(struct hclge_dev *hdev, struct ieee_ets *ets,if (ret)return ret; - ret =hclge_ets_sch_mode_validate (hdev, ets, changed); + ret =hclge_ets_sch_mode_validate (hdev, ets, changed, tc_num);if (ret)return ret;
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +2 -1
@@ -785,6 +785,7 @@ static void hclge_tm_tc_info_init(struct hclge_dev *hdev)static void hclge_tm_pg_info_init (struct hclge_dev *hdev) {#define BW_PERCENT 100 +#define DEFAULT_BW_WEIGHT 1u8 i;
@@ -806,7 +807,7 @@ static void hclge_tm_pg_info_init(struct hclge_dev *hdev)for (k =0 ; k < hdev->tm_info.num_tc; k++) hdev->tm_info.pg_info[i].tc_dwrr[k] =BW_PERCENT ;for (; k <HNAE3_MAX_TC ; k++) - hdev->tm_info.pg_info[i].tc_dwrr[k] =0 ; + hdev->tm_info.pg_info[i].tc_dwrr[k] =DEFAULT_BW_WEIGHT ; } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 88/228 vxlan: calculate correct header length for GPE
In reply to Greg Kroah-HartmanFrom: Jiri Benc <[email protected]>
[ Upstream commit 94d166c5318c6edd1e079df8552233443e909c33 ]
VXLAN-GPE does not add an extra inner Ethernet header. Take that into account when calculating header length.
This causes problems in skb_tunnel_check_pmtu, where incorrect PMTU is cached.
In the collect_md mode (which is the only mode that VXLAN-GPE supports), there's no magic auto-setting of the tunnel interface MTU. It can't be, since the destination and thus the underlying interface may be different for each packet.
So, the administrator is responsible for setting the correct tunnel interface MTU. Apparently, the administrators are capable enough to calculate that the maximum MTU for VXLAN-GPE is (their_lower_MTU - 36). They set the tunnel interface MTU to 1464. If you run a TCP stream over such interface, it's then segmented according to the MTU 1464, i.e. producing 1514 bytes frames. Which is okay, this still fits the lower MTU.
However, skb_tunnel_check_pmtu (called from vxlan_xmit_one) uses 50 as the header size and thus incorrectly calculates the frame size to be 1528. This leads to ICMP too big message being generated (locally), PMTU of 1450 to be cached and the TCP stream to be resegmented.
The fix is to use the correct actual header size, especially for skb_tunnel_check_pmtu calculation.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- drivers/net/vxlan/vxlan_core.c | 23 ++++++++----------- include/net/vxlan.h | 13 +++++++---- 3 files changed, 20 insertions(+), 18 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +1 -1
@@ -8499,7 +8499,7 @@ static void ixgbe_atr(struct ixgbe_ring *ring,struct ixgbe_adapter *adapter = q_vector->adapter;if (unlikely (skb_tail_pointer (skb) < hdr.network + -VXLAN_HEADROOM )) +vxlan_headroom (0 )))return ;/* verify the port is recognized as VXLAN */
drivers/net/vxlan/vxlan_core.c +10 -13
@@ -2584,7 +2584,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, } ndst = &rt->dst; - err =skb_tunnel_check_pmtu (skb, ndst,VXLAN_HEADROOM , + err =skb_tunnel_check_pmtu (skb, ndst,vxlan_headroom (flags &VXLAN_F_GPE ),netif_is_any_bridge_port (dev));if (err <0 ) { goto tx_error;
@@ -2645,7 +2645,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, goto out_unlock; } - err =skb_tunnel_check_pmtu (skb, ndst,VXLAN6_HEADROOM , + err =skb_tunnel_check_pmtu (skb, ndst, +vxlan_headroom ((flags &VXLAN_F_GPE ) |VXLAN_F_IPV6 ),netif_is_any_bridge_port (dev));if (err <0 ) { goto tx_error;
@@ -3034,14 +3035,12 @@ static int vxlan_change_mtu(struct net_device *dev, int new_mtu)struct vxlan_rdst *dst = &vxlan->default_dst;struct net_device *lowerdev =__dev_get_by_index (vxlan->net, dst->remote_ifindex); -bool use_ipv6 = !!(vxlan->cfg.flags &VXLAN_F_IPV6 );/* This check is different than dev->max_mtu, because it looks at * the lowerdev->mtu, rather than the static dev->max_mtu */ if (lowerdev) { -int max_mtu = lowerdev->mtu - - (use_ipv6 ?VXLAN6_HEADROOM :VXLAN_HEADROOM ); +int max_mtu = lowerdev->mtu -vxlan_headroom (vxlan->cfg.flags);if (new_mtu > max_mtu)return -EINVAL ; }
@@ -3684,11 +3683,11 @@ static void vxlan_config_apply(struct net_device *dev,struct vxlan_dev *vxlan =netdev_priv (dev);struct vxlan_rdst *dst = &vxlan->default_dst;unsigned short needed_headroom =ETH_HLEN ; -bool use_ipv6 = !!(conf->flags &VXLAN_F_IPV6 );int max_mtu =ETH_MAX_MTU ; +u32 flags = conf->flags;if (!changelink) { -if (conf->flags &VXLAN_F_GPE ) +if (flags &VXLAN_F_GPE )vxlan_raw_setup (dev);else vxlan_ether_setup (dev);
@@ -3713,8 +3712,7 @@ static void vxlan_config_apply(struct net_device *dev, dev->needed_tailroom = lowerdev->needed_tailroom; - max_mtu = lowerdev->mtu - (use_ipv6 ?VXLAN6_HEADROOM : -VXLAN_HEADROOM ); + max_mtu = lowerdev->mtu -vxlan_headroom (flags);if (max_mtu <ETH_MIN_MTU ) max_mtu =ETH_MIN_MTU ;
@@ -3725,10 +3723,9 @@ static void vxlan_config_apply(struct net_device *dev,if (dev->mtu > max_mtu) dev->mtu = max_mtu; -if (use_ipv6 || conf->flags &VXLAN_F_COLLECT_METADATA ) - needed_headroom +=VXLAN6_HEADROOM ; -else - needed_headroom +=VXLAN_HEADROOM ; +if (flags &VXLAN_F_COLLECT_METADATA ) + flags |=VXLAN_F_IPV6 ; + needed_headroom +=vxlan_headroom (flags); dev->needed_headroom = needed_headroom;memcpy (&vxlan->cfg, conf,sizeof (*conf));
include/net/vxlan.h +9 -4
@@ -378,10 +378,15 @@ static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,return features; } -/* IP header + UDP + VXLAN + Ethernet header */ -#define VXLAN_HEADROOM (20 + 8 + 8 + 14) -/* IPv6 header + UDP + VXLAN + Ethernet header */ -#define VXLAN6_HEADROOM (40 + 8 + 8 + 14) +static inline int vxlan_headroom (u32 flags) +{ +/* VXLAN: IP4/6 header + UDP + VXLAN + Ethernet header */ +/* VXLAN-GPE: IP4/6 header + UDP + VXLAN */ +return (flags &VXLAN_F_IPV6 ?sizeof (struct ipv6hdr ) : +sizeof (struct iphdr )) + +sizeof (struct udphdr ) +sizeof (struct vxlanhdr ) + + (flags &VXLAN_F_GPE ?0 :ETH_HLEN ); +}static inline struct vxlanhdr *vxlan_hdr (struct sk_buff *skb) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 89/228 vxlan: generalize vxlan_parse_gpe_hdr and remove unused args
In reply to Greg Kroah-HartmanFrom: Jiri Benc <[email protected]>
[ Upstream commit 17a0a64448b568442a101de09575f81ffdc45d15 ]
The vxlan_parse_gpe_hdr function extracts the next protocol value from the GPE header and marks GPE bits as parsed.
In order to be used in the next patch, split the function into protocol extraction and bit marking. The bit marking is meaningful only in vxlan_rcv; move it directly there.
Rename the function to vxlan_parse_gpe_proto to reflect what it now does. Remove unused arguments skb and vxflags. Move the function earlier in the file to allow it to be called from more places in the next patch.
Stable-dep-of: b0b672c4d095 ("vxlan: fix GRO with VXLAN-GPE")
--- drivers/net/vxlan/vxlan_core.c | 58 ++++++++++++++++------------------ 1 file changed, 28 insertions(+), 30 deletions(-)
drivers/net/vxlan/vxlan_core.c +28 -30
@@ -670,6 +670,32 @@ static int vxlan_fdb_append(struct vxlan_fdb *f,return 1 ; } +static bool vxlan_parse_gpe_proto (struct vxlanhdr *hdr,__be16 *protocol) +{ +struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)hdr; + +/* Need to have Next Protocol set for interfaces in GPE mode. */ +if (!gpe->np_applied) +return false; +/* "The initial version is 0. If a receiver does not support the +* version indicated it MUST drop the packet. +*/ +if (gpe->version !=0 ) +return false; +/* "When the O bit is set to 1, the packet is an OAM packet and OAM +* processing MUST occur." However, we don't implement OAM +* processing, thus drop the packet. +*/ +if (gpe->oam_flag) +return false; + + *protocol =tun_p_to_eth_p (gpe->next_protocol); +if (!*protocol) +return false; + +return true; +} + static struct vxlanhdr *vxlan_gro_remcsum(struct sk_buff *skb, unsigned int off, struct vxlanhdr *vh, size_t hdrlen,
@@ -1572,35 +1598,6 @@ static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed, unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS ; } -static bool vxlan_parse_gpe_hdr (struct vxlanhdr *unparsed, -__be16 *protocol, -struct sk_buff *skb,u32 vxflags) -{ -struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)unparsed; - -/* Need to have Next Protocol set for interfaces in GPE mode. */ -if (!gpe->np_applied) -return false; -/* "The initial version is 0. If a receiver does not support the -* version indicated it MUST drop the packet. -*/ -if (gpe->version !=0 ) -return false; -/* "When the O bit is set to 1, the packet is an OAM packet and OAM -* processing MUST occur." However, we don't implement OAM -* processing, thus drop the packet. -*/ -if (gpe->oam_flag) -return false; - - *protocol =tun_p_to_eth_p (gpe->next_protocol); -if (!*protocol) -return false; - - unparsed->vx_flags &= ~VXLAN_GPE_USED_BITS ; -return true; -} -static bool vxlan_set_mac (struct vxlan_dev *vxlan,struct vxlan_sock *vs,struct sk_buff *skb,__be32 vni)
@@ -1702,8 +1699,9 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)* used by VXLAN extensions if explicitly requested. */ if (vs->flags &VXLAN_F_GPE ) { -if (!vxlan_parse_gpe_hdr (&unparsed, &protocol, skb, vs->flags)) +if (!vxlan_parse_gpe_proto (&unparsed, &protocol)) goto drop; + unparsed.vx_flags &= ~VXLAN_GPE_USED_BITS ; raw_proto = true; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 90/228 vxlan: fix GRO with VXLAN-GPE
In reply to Greg Kroah-HartmanFrom: Jiri Benc <[email protected]>
[ Upstream commit b0b672c4d0957e5897685667fc848132b8bd2d71 ]
In VXLAN-GPE, there may not be an Ethernet header following the VXLAN header. But in GRO, the vxlan driver calls eth_gro_receive unconditionally, which means the following header is incorrectly parsed as Ethernet.
Introduce GPE specific GRO handling.
For better performance, do not check for GPE during GRO but rather install a different set of functions at setup time.
--- drivers/net/vxlan/vxlan_core.c | 84 ++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 15 deletions(-)
drivers/net/vxlan/vxlan_core.c +69 -15
@@ -722,26 +722,24 @@ static struct vxlanhdr *vxlan_gro_remcsum(struct sk_buff *skb,return vh; } -static struct sk_buff *vxlan_gro_receive (struct sock *sk, -struct list_head *head, -struct sk_buff *skb) +static struct vxlanhdr *vxlan_gro_prepare_receive (struct sock *sk, +struct list_head *head, +struct sk_buff *skb, +struct gro_remcsum *grc) { -struct sk_buff *pp =NULL ;struct sk_buff *p;struct vxlanhdr *vh, *vh2;unsigned int hlen, off_vx; -int flush =1 ;struct vxlan_sock *vs =rcu_dereference_sk_user_data (sk);__be32 flags; -struct gro_remcsum grc; -skb_gro_remcsum_init (&grc); +skb_gro_remcsum_init (grc); off_vx =skb_gro_offset (skb); hlen = off_vx +sizeof (*vh); vh =skb_gro_header (skb, hlen, off_vx);if (unlikely (!vh)) - goto out; +return NULL ;skb_gro_postpull_rcsum (skb, vh,sizeof (struct vxlanhdr ));
@@ -749,12 +747,12 @@ static struct sk_buff *vxlan_gro_receive(struct sock *sk,if ((flags &VXLAN_HF_RCO ) && (vs->flags &VXLAN_F_REMCSUM_RX )) { vh =vxlan_gro_remcsum (skb, off_vx, vh,sizeof (struct vxlanhdr ), - vh->vx_vni, &grc, + vh->vx_vni, grc, !!(vs->flags &VXLAN_F_REMCSUM_NOPARTIAL ));if (!vh) - goto out; +return NULL ; }skb_gro_pull (skb,sizeof (struct vxlanhdr ));/* pull vxlan header */
@@ -771,12 +769,48 @@ static struct sk_buff *vxlan_gro_receive(struct sock *sk, } } - pp =call_gro_receive (eth_gro_receive, head, skb); - flush =0 ; +return vh; +} + +static struct sk_buff *vxlan_gro_receive (struct sock *sk, +struct list_head *head, +struct sk_buff *skb) +{ +struct sk_buff *pp =NULL ; +struct gro_remcsum grc; +int flush =1 ; -out: +if (vxlan_gro_prepare_receive (sk, head, skb, &grc)) { + pp =call_gro_receive (eth_gro_receive, head, skb); + flush =0 ; + }skb_gro_flush_final_remcsum (skb, pp, flush, &grc); +return pp; +} +static struct sk_buff *vxlan_gpe_gro_receive (struct sock *sk, +struct list_head *head, +struct sk_buff *skb) +{ +const struct packet_offload *ptype; +struct sk_buff *pp =NULL ; +struct gro_remcsum grc; +struct vxlanhdr *vh; +__be16 protocol; +int flush =1 ; + + vh =vxlan_gro_prepare_receive (sk, head, skb, &grc); +if (vh) { +if (!vxlan_parse_gpe_proto (vh, &protocol)) + goto out; + ptype =gro_find_receive_by_type (protocol); +if (!ptype) + goto out; + pp =call_gro_receive (ptype->callbacks.gro_receive, head, skb); + flush =0 ; + } +out: +skb_gro_flush_final_remcsum (skb, pp, flush, &grc);return pp; }
@@ -788,6 +822,21 @@ static int vxlan_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff)return eth_gro_complete (skb, nhoff +sizeof (struct vxlanhdr )); } +static int vxlan_gpe_gro_complete (struct sock *sk,struct sk_buff *skb,int nhoff) +{ +struct vxlanhdr *vh = (struct vxlanhdr *)(skb->data + nhoff); +const struct packet_offload *ptype; +int err = -ENOSYS ; +__be16 protocol; + +if (!vxlan_parse_gpe_proto (vh, &protocol)) +return err; + ptype =gro_find_complete_by_type (protocol); +if (ptype) + err = ptype->callbacks.gro_complete (skb, nhoff +sizeof (struct vxlanhdr )); +return err; +} +static struct vxlan_fdb *vxlan_fdb_alloc (struct vxlan_dev *vxlan,const u8 *mac,__u16 state,__be32 src_vni,__u16 ndm_flags)
@@ -3416,8 +3465,13 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6, tunnel_cfg.encap_rcv = vxlan_rcv; tunnel_cfg.encap_err_lookup = vxlan_err_lookup; tunnel_cfg.encap_destroy =NULL ; - tunnel_cfg.gro_receive = vxlan_gro_receive; - tunnel_cfg.gro_complete = vxlan_gro_complete; +if (vs->flags &VXLAN_F_GPE ) { + tunnel_cfg.gro_receive = vxlan_gpe_gro_receive; + tunnel_cfg.gro_complete = vxlan_gpe_gro_complete; + }else { + tunnel_cfg.gro_receive = vxlan_gro_receive; + tunnel_cfg.gro_complete = vxlan_gro_complete; + }setup_udp_tunnel_sock (net, sock, &tunnel_cfg);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 91/228 phy: hisilicon: Fix an out of bounds check in hisi_inno_phy_probe()
In reply to Greg Kroah-HartmanFrom: Harshit Mogalapalli <[email protected]>
[ Upstream commit 13c088cf3657d70893d75cf116be937f1509cc0f ]
The size of array 'priv->ports[]' is INNO_PHY_PORT_NUM.
In the for loop, 'i' is used as the index for array 'priv->ports[]' with a check (i > INNO_PHY_PORT_NUM) which indicates that INNO_PHY_PORT_NUM is allowed value for 'i' in the same loop.
This > comparison needs to be changed to >=, otherwise it potentially leads to an out of bounds write on the next iteration through the loop
--- drivers/phy/hisilicon/phy-hisi-inno-usb2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/phy/hisilicon/phy-hisi-inno-usb2.c +1 -1
@@ -158,7 +158,7 @@ static int hisi_inno_phy_probe(struct platform_device *pdev)phy_set_drvdata (phy, &priv->ports[i]); i++; -if (i >INNO_PHY_PORT_NUM ) { +if (i >=INNO_PHY_PORT_NUM ) {dev_warn (dev,"Support %d ports in maximum\n" , i);of_node_put (child);break ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 92/228 atheros: fix return value check in atl1_tso()
In reply to Greg Kroah-HartmanFrom: Yuanjun Gong <[email protected]>
[ Upstream commit ed96824b71ed67664390890441b229423a25317f ]
in atl1_tso(), it should check the return value of pskb_trim(), and return an error code if an unexpected value is returned by pskb_trim().
--- drivers/net/ethernet/atheros/atlx/atl1.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/atheros/atlx/atl1.c +5 -2
@@ -2113,8 +2113,11 @@ static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb, real_len = (((unsigned char *)iph - skb->data) +ntohs (iph->tot_len)); -if (real_len < skb->len) -pskb_trim (skb, real_len); +if (real_len < skb->len) { + err =pskb_trim (skb, real_len); +if (err) +return err; + } hdr_len =skb_tcp_all_headers (skb);if (skb->len == hdr_len) { iph->check =0 ;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 93/228 ethernet: atheros: fix return value check in atl1e_tso_csum()
In reply to Greg Kroah-HartmanFrom: Yuanjun Gong <[email protected]>
[ Upstream commit 69a184f7a372aac588babfb0bd681aaed9779f5b ]
in atl1e_tso_csum, it should check the return value of pskb_trim(), and return an error code if an unexpected value is returned by pskb_trim().
--- drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/atheros/atl1e/atl1e_main.c +5 -2
@@ -1641,8 +1641,11 @@ static int atl1e_tso_csum(struct atl1e_adapter *adapter, real_len = (((unsigned char *)ip_hdr (skb) - skb->data) +ntohs (ip_hdr (skb)->tot_len)); -if (real_len < skb->len) -pskb_trim (skb, real_len); +if (real_len < skb->len) { + err =pskb_trim (skb, real_len); +if (err) +return err; + } hdr_len =skb_tcp_all_headers (skb);if (unlikely (skb->len == hdr_len)) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 94/228 ipv6 addrconf: fix bug where deleting a mngtmpaddr can create a new temporary address
In reply to Greg Kroah-HartmanFrom: Maciej Żenczykowski <[email protected]>
[ Upstream commit 69172f0bcb6a09110c5d2a6d792627f5095a9018 ]
currently on 6.4 net/main:
# ip link add dummy1 type dummy # echo 1 > /proc/sys/net/ipv6/conf/dummy1/use_tempaddr # ip link set dummy1 up # ip -6 addr add 2000::1/64 mngtmpaddr dev dummy1 # ip -6 addr show dev dummy1
11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
inet6 2000::44f3:581c:8ca:3983/64 scope global temporary dynamic
valid_lft 604800sec preferred_lft 86172sec
inet6 2000::1/64 scope global mngtmpaddr
valid_lft forever preferred_lft forever
inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link
valid_lft forever preferred_lft forever# ip -6 addr del 2000::44f3:581c:8ca:3983/64 dev dummy1
(can wait a few seconds if you want to, the above delete isn't [directly] the problem)
# ip -6 addr show dev dummy1
11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
inet6 2000::1/64 scope global mngtmpaddr
valid_lft forever preferred_lft forever
inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link
valid_lft forever preferred_lft forever
# ip -6 addr del 2000::1/64 mngtmpaddr dev dummy1 # ip -6 addr show dev dummy1
11: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
inet6 2000::81c9:56b7:f51a:b98f/64 scope global temporary dynamic
valid_lft 604797sec preferred_lft 86169sec
inet6 fe80::e8a8:a6ff:fed5:56d4/64 scope link
valid_lft forever preferred_lft foreverThis patch prevents this new 'global temporary dynamic' address from being created by the deletion of the related (same subnet prefix) 'mngtmpaddr' (which is triggered by there already being no temporary addresses).
--- net/ipv6/addrconf.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
net/ipv6/addrconf.c +10 -4
@@ -2561,12 +2561,18 @@ static void manage_tempaddrs(struct inet6_dev *idev,ipv6_ifa_notify (0 , ift); } -if ((create ||list_empty (&idev->tempaddr_list)) && - idev->cnf.use_tempaddr >0 ) { +/* Also create a temporary address if it's enabled but no temporary +* address currently exists. +* However, we get called with valid_lft == 0, prefered_lft == 0, create == false +* as part of cleanup (ie. deleting the mngtmpaddr). +* We don't want that to result in creating a new temporary ip address. +*/ +if (list_empty (&idev->tempaddr_list) && (valid_lft || prefered_lft)) + create = true; + +if (create && idev->cnf.use_tempaddr >0 ) {/* When a new public address is created as described * in [ADDRCONF], also create a new temporary address. -* Also create a temporary address if it's enabled but -* no temporary address currently exists. */ read_unlock_bh (&idev->lock);ipv6_create_tempaddr (ifp, false);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 95/228 tcp: Reduce chance of collisions in inet6_hashfn().
In reply to Greg Kroah-HartmanFrom: Stewart Smith <[email protected]>
[ Upstream commit d11b0df7ddf1831f3e170972f43186dad520bfcc ]
For both IPv4 and IPv6 incoming TCP connections are tracked in a hash table with a hash over the source & destination addresses and ports. However, the IPv6 hash is insufficient and can lead to a high rate of collisions.
The IPv6 hash used an XOR to fit everything into the 96 bits for the fast jenkins hash, meaning it is possible for an external entity to ensure the hash collides, thus falling back to a linear search in the bucket, which is slow.
We take the approach of hash the full length of IPv6 address in __ipv6_addr_jhash() so that all users can benefit from a more secure version.
While this may look like it adds overhead, the reality of modern CPUs means that this is unmeasurable in real world scenarios.
In simulating with llvm-mca, the increase in cycles for the hashing code was ~16 cycles on Skylake (from a base of ~155), and an extra ~9 on Nehalem (base of ~173).
In commit dd6d2910c5e0 ("netfilter: conntrack: switch to siphash") netfilter switched from a jenkins hash to a siphash, but even the faster hsiphash is a more significant overhead (~20-30%) in some preliminary testing. So, in this patch, we keep to the more conservative approach to ensure we don't add much overhead per SYN.
In testing, this results in a consistently even spread across the connection buckets. In both testing and real-world scenarios, we have not found any measurable performance impact.
--- include/net/ipv6.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
include/net/ipv6.h +2 -6
@@ -718,12 +718,8 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a)/* more secured version of ipv6_addr_hash() */ static inline u32 __ipv6_addr_jhash (const struct in6_addr *a,const u32 initval) { -u32 v = (__force u32 )a->s6_addr32[0 ] ^ (__force u32 )a->s6_addr32[1 ]; - -return jhash_3words (v, - (__force u32 )a->s6_addr32[2 ], - (__force u32 )a->s6_addr32[3 ], - initval); +return jhash2 ((__force const u32 *)a->s6_addr32, +ARRAY_SIZE (a->s6_addr32), initval); }static inline bool ipv6_addr_loopback (const struct in6_addr *a)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 96/228 ice: Fix memory management in ice_ethtool_fdir.c
In reply to Greg Kroah-HartmanFrom: Jedrzej Jagielski <[email protected]>
[ Upstream commit a3336056504d780590ac6d6ac94fbba829994594 ]
Fix ethtool FDIR logic to not use memory after its release. In the ice_ethtool_fdir.c file there are 2 spots where code can refer to pointers which may be missing.
In the ice_cfg_fdir_xtrct_seq() function seg may be freed but even then may be still used by memcpy(&tun_seg[1], seg, sizeof(*seg)).
In the ice_add_fdir_ethtool() function struct ice_fdir_fltr *input may first fail to be added via ice_fdir_update_list_entry() but then may be deleted by ice_fdir_update_list_entry.
Terminate in both cases when the returned value of the previous operation is other than 0, free memory and don't use it anymore.
--- .../net/ethernet/intel/ice/ice_ethtool_fdir.c | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-)
drivers/net/ethernet/intel/ice/ice_ethtool_fdir.c +14 -12
@@ -1281,16 +1281,21 @@ ice_cfg_fdir_xtrct_seq(struct ice_pf *pf, struct ethtool_rx_flow_spec *fsp, ICE_FLOW_FLD_OFF_INVAL); } -/* add filter for outer headers */ fltr_idx =ice_ethtool_flow_to_fltr (fsp->flow_type & ~FLOW_EXT ); + +assign_bit (fltr_idx, hw->fdir_perfect_fltr, perfect_filter); + +/* add filter for outer headers */ ret =ice_fdir_set_hw_fltr_rule (pf, seg, fltr_idx,ICE_FD_HW_SEG_NON_TUN ); -if (ret == -EEXIST ) -/* Rule already exists, free memory and continue */ -devm_kfree (dev, seg); -else if (ret) +if (ret == -EEXIST ) { +/* Rule already exists, free memory and count as success */ + ret =0 ; + goto err_exit; + }else if (ret) {/* could not write filter, free memory */ goto err_exit; + }/* make tunneled filter HW entries if possible */ memcpy (&tun_seg[1 ], seg,sizeof (*seg));
@@ -1305,18 +1310,13 @@ ice_cfg_fdir_xtrct_seq(struct ice_pf *pf, struct ethtool_rx_flow_spec *fsp,devm_kfree (dev, tun_seg); } -if (perfect_filter) -set_bit (fltr_idx, hw->fdir_perfect_fltr); -else -clear_bit (fltr_idx, hw->fdir_perfect_fltr); -return ret; err_exit:devm_kfree (dev, tun_seg);devm_kfree (dev, seg); -return -EOPNOTSUPP ; +return ret; }/**
@@ -1914,7 +1914,9 @@ int ice_add_fdir_ethtool(struct ice_vsi *vsi, struct ethtool_rxnfc *cmd) input->comp_report =ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL ;/* input struct is added to the HW filter list */ -ice_fdir_update_list_entry (pf, input, fsp->location); + ret =ice_fdir_update_list_entry (pf, input, fsp->location); +if (ret) + goto release_lock; ret =ice_fdir_write_all_fltr (pf, input, true);if (ret)
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 97/228 bonding: reset bonds flags when down link is P2P device
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit da19a2b967cf1e2c426f50d28550d1915214a81d ]
When adding a point to point downlink to the bond, we neglected to reset the bond's flags, which were still using flags like BROADCAST and MULTICAST. Consequently, this would initiate ARP/DAD for P2P downlink interfaces, such as when adding a GRE device to the bonding.
To address this issue, let's reset the bond's flags for P2P interfaces.
Before fix:
7: gre0@NONE: <POINTOPOINT,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond0 state UNKNOWN group default qlen 1000
link/gre6 2006:70:10::1 peer 2006:70:10::2 permaddr 167f:18:f188::
8: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/gre6 2006:70:10::1 brd 2006:70:10::2
inet6 fe80::200:ff:fe00:0/64 scope link
valid_lft forever preferred_lft foreverAfter fix:
7: gre0@NONE: <POINTOPOINT,NOARP,SLAVE,UP,LOWER_UP> mtu 1500 qdisc noqueue master bond2 state UNKNOWN group default qlen 1000
link/gre6 2006:70:10::1 peer 2006:70:10::2 permaddr c29e:557a:e9d9::
8: bond0: <POINTOPOINT,NOARP,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/gre6 2006:70:10::1 peer 2006:70:10::2
inet6 fe80::1/64 scope link
valid_lft forever preferred_lft forever--- drivers/net/bonding/bond_main.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/bonding/bond_main.c +5 -0
@@ -1512,6 +1512,11 @@ static void bond_setup_by_slave(struct net_device *bond_dev,memcpy (bond_dev->broadcast, slave_dev->broadcast, slave_dev->addr_len); + +if (slave_dev->flags &IFF_POINTOPOINT ) { + bond_dev->flags &= ~(IFF_BROADCAST |IFF_MULTICAST ); + bond_dev->flags |= (IFF_POINTOPOINT |IFF_NOARP ); + } }/* On bonding slaves other than the currently active slave, suppress
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 98/228 team: reset teams flags when down link is P2P device
In reply to Greg Kroah-HartmanFrom: Hangbin Liu <[email protected]>
[ Upstream commit fa532bee17d15acf8bba4bc8e2062b7a093ba801 ]
When adding a point to point downlink to team device, we neglected to reset the team's flags, which were still using flags like BROADCAST and MULTICAST. Consequently, this would initiate ARP/DAD for P2P downlink interfaces, such as when adding a GRE device to team device. Fix this by remove multicast/broadcast flags and add p2p and noarp flags.
After removing the none ethernet interface and adding an ethernet interface to team, we need to reset team interface flags. Unlike bonding interface, team do not need restore IFF_MASTER, IFF_SLAVE flags.
--- drivers/net/team/team.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/team/team.c +9 -0
@@ -2135,6 +2135,15 @@ static void team_setup_by_port(struct net_device *dev, dev->mtu = port_dev->mtu;memcpy (dev->broadcast, port_dev->broadcast, port_dev->addr_len);eth_hw_addr_inherit (dev, port_dev); + +if (port_dev->flags &IFF_POINTOPOINT ) { + dev->flags &= ~(IFF_BROADCAST |IFF_MULTICAST ); + dev->flags |= (IFF_POINTOPOINT |IFF_NOARP ); + }else if ((port_dev->flags & (IFF_BROADCAST |IFF_MULTICAST )) == + (IFF_BROADCAST |IFF_MULTICAST )) { + dev->flags |= (IFF_BROADCAST |IFF_MULTICAST ); + dev->flags &= ~(IFF_POINTOPOINT |IFF_NOARP ); + } } static int team_dev_type_check_change(struct net_device *dev,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 99/228 octeontx2-af: Removed unnecessary debug messages.
In reply to Greg Kroah-HartmanFrom: Sunil Goutham <[email protected]>
[ Upstream commit 609aa68d60965f70485655def733d533f99b341b ]
NPC exact match feature is supported only on one silicon variant, removed debug messages which print that this feature is not available on all other silicon variants.
Stable-dep-of: 4e62c99d71e5 ("octeontx2-af: Fix hash extraction enable configuration")
--- .../marvell/octeontx2/af/rvu_npc_hash.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c +4 -14
@@ -203,10 +203,8 @@ void npc_config_secret_key(struct rvu *rvu, int blkaddr)struct rvu_hwinfo *hw = rvu->hw;u8 intf; -if (!hwcap->npc_hash_extract) { -dev_info (rvu->dev,"HW does not support secret key configuration\n" ); +if (!hwcap->npc_hash_extract)return ; - }for (intf =0 ; intf < hw->npc_intfs; intf++) { rvu_write64(rvu, blkaddr, NPC_AF_INTFX_SECRET_KEY0(intf),
@@ -224,10 +222,8 @@ void npc_program_mkex_hash(struct rvu *rvu, int blkaddr)struct rvu_hwinfo *hw = rvu->hw;u8 intf; -if (!hwcap->npc_hash_extract) { -dev_dbg (rvu->dev,"Field hash extract feature is not supported\n" ); +if (!hwcap->npc_hash_extract)return ; - }for (intf =0 ; intf < hw->npc_intfs; intf++) {npc_program_mkex_hash_rx (rvu, blkaddr, intf);
@@ -1864,19 +1860,13 @@ int rvu_npc_exact_init(struct rvu *rvu)/* Check exact match feature is supported */ npc_const3 =rvu_read64 (rvu, blkaddr,NPC_AF_CONST3 ); -if (!(npc_const3 &BIT_ULL (62 ))) { -dev_info (rvu->dev,"%s: No support for exact match support\n" , - __func__); +if (!(npc_const3 &BIT_ULL (62 )))return 0 ; - }/* Check if kex profile has enabled EXACT match nibble */ cfg =rvu_read64 (rvu, blkaddr,NPC_AF_INTFX_KEX_CFG (NIX_INTF_RX )); -if (!(cfg &NPC_EXACT_NIBBLE_HIT )) { -dev_info (rvu->dev,"%s: NPC exact match nibble not enabled in KEX profile\n" , - __func__); +if (!(cfg &NPC_EXACT_NIBBLE_HIT ))return 0 ; - }/* Set capability to true */ rvu->hw->cap.npc_exact_match_enabled = true;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 100/228 octeontx2-af: Fix hash extraction enable configuration
In reply to Greg Kroah-HartmanFrom: Suman Ghosh <[email protected]>
[ Upstream commit 4e62c99d71e56817c934caa2a709a775c8cee078 ]
As of today, hash extraction support is enabled for all the silicons. Because of which we are facing initialization issues when the silicon does not support hash extraction. During creation of the hardware parsing table for IPv6 address, we need to consider if hash extraction is enabled then extract only 32 bit, otherwise 128 bit needs to be extracted. This patch fixes the issue and configures the hardware parser based on the availability of the feature.
--- .../marvell/octeontx2/af/rvu_npc_hash.c | 43 ++++++++++++++++++- .../marvell/octeontx2/af/rvu_npc_hash.h | 8 ++-- 2 files changed, 46 insertions(+), 5 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.c +42 -1
@@ -218,13 +218,54 @@ void npc_config_secret_key(struct rvu *rvu, int blkaddr)void npc_program_mkex_hash (struct rvu *rvu,int blkaddr) { +struct npc_mcam_kex_hash *mh = rvu->kpu.mkex_hash;struct hw_cap *hwcap = &rvu->hw->cap; +u8 intf, ld, hdr_offset, byte_len;struct rvu_hwinfo *hw = rvu->hw; -u8 intf; +u64 cfg; +/* Check if hardware supports hash extraction */ if (!hwcap->npc_hash_extract)return ; +/* Check if IPv6 source/destination address +* should be hash enabled. +* Hashing reduces 128bit SIP/DIP fields to 32bit +* so that 224 bit X2 key can be used for IPv6 based filters as well, +* which in turn results in more number of MCAM entries available for +* use. +* +* Hashing of IPV6 SIP/DIP is enabled in below scenarios +* 1. If the silicon variant supports hashing feature +* 2. If the number of bytes of IP addr being extracted is 4 bytes ie +* 32bit. The assumption here is that if user wants 8bytes of LSB of +* IP addr or full 16 bytes then his intention is not to use 32bit +* hash. +*/ +for (intf =0 ; intf < hw->npc_intfs; intf++) { +for (ld =0 ; ld <NPC_MAX_LD ; ld++) { + cfg =rvu_read64 (rvu, blkaddr, +NPC_AF_INTFX_LIDX_LTX_LDX_CFG (intf, +NPC_LID_LC , +NPC_LT_LC_IP6 , + ld)); + hdr_offset =FIELD_GET (NPC_HDR_OFFSET , cfg); + byte_len =FIELD_GET (NPC_BYTESM , cfg); +/* Hashing of IPv6 source/destination address should be +* enabled if, +* hdr_offset == 8 (offset of source IPv6 address) or +* hdr_offset == 24 (offset of destination IPv6) +* address) and the number of byte to be +* extracted is 4. As per hardware configuration +* byte_len should be == actual byte_len - 1. +* Hence byte_len is checked against 3 but nor 4. +*/ +if ((hdr_offset ==8 || hdr_offset ==24 ) && byte_len ==3 ) + mh->lid_lt_ld_hash_en[intf][NPC_LID_LC ][NPC_LT_LC_IP6 ][ld] = true; + } + } + +/* Update hash configuration if the field is hash enabled */ for (intf =0 ; intf < hw->npc_intfs; intf++) {npc_program_mkex_hash_rx (rvu, blkaddr, intf);npc_program_mkex_hash_tx (rvu, blkaddr, intf);
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc_hash.h +4 -4
@@ -70,8 +70,8 @@ static struct npc_mcam_kex_hash npc_mkex_hash_default __maybe_unused = { [NIX_INTF_RX] = { [NPC_LID_LC] = { [NPC_LT_LC_IP6] = { - true, - true, + false, + false, }, }, },
@@ -79,8 +79,8 @@ static struct npc_mcam_kex_hash npc_mkex_hash_default __maybe_unused = { [NIX_INTF_TX] = { [NPC_LID_LC] = { [NPC_LT_LC_IP6] = { - true, - true, + false, + false, }, }, },
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 101/228 net: stmmac: Apply redundant write work around on 4.xx too
In reply to Greg Kroah-HartmanFrom: Vincent Whitchurch <[email protected]>
[ Upstream commit 284779dbf4e98753458708783af8c35630674a21 ]
commit a3a57bf07de23fe1ff779e0fdf710aa581c3ff73 ("net: stmmac: work around sporadic tx issue on link-up") worked around a problem with TX sometimes not working after a link-up by avoiding a redundant write to MAC_CTRL_REG (aka GMAC_CONFIG), since the IP appeared to have problems with handling multiple writes to that register in some cases.
That commit however only added the work around to dwmac_lib.c (apart from the common code in stmmac_main.c), but my systems with version 4.21a of the IP exhibit the same problem, so add the work around to dwmac4_lib.c too.
--- drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +3 -1
@@ -207,13 +207,15 @@ void stmmac_dwmac4_set_mac_addr(void __iomem *ioaddr, const u8 addr[6],void stmmac_dwmac4_set_mac (void __iomem *ioaddr,bool enable) {u32 value =readl (ioaddr +GMAC_CONFIG ); +u32 old_val = value;if (enable) value |=GMAC_CONFIG_RE |GMAC_CONFIG_TE ;else value &= ~(GMAC_CONFIG_TE |GMAC_CONFIG_RE ); -writel (value, ioaddr +GMAC_CONFIG ); +if (value != old_val) +writel (value, ioaddr +GMAC_CONFIG ); } void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 102/228 platform/x86: msi-laptop: Fix rfkill out-of-sync on MSI Wind U100
In reply to Greg Kroah-HartmanFrom: Maxim Mikityanskiy <[email protected]>
[ Upstream commit ad084a6d99bc182bf109c190c808e2ea073ec57b ]
Only the HW rfkill state is toggled on laptops with quirks->ec_read_only (so far only MSI Wind U90/U100). There are, however, a few issues with the implementation:
1. The initial HW state is always unblocked, regardless of the actual state on boot, because msi_init_rfkill only sets the SW state, regardless of ec_read_only.
2. The initial SW state corresponds to the actual state on boot, but it can't be changed afterwards, because set_device_state returns -EOPNOTSUPP. It confuses the userspace, making Wi-Fi and/or Bluetooth unusable if it was blocked on boot, and breaking the airplane mode if the rfkill was unblocked on boot.
Address the above issues by properly initializing the HW state on ec_read_only laptops and by allowing the userspace to toggle the SW state. Don't set the SW state ourselves and let the userspace fully control it. Toggling the SW state is a no-op, however, it allows the userspace to properly toggle the airplane mode. The actual SW radio disablement is handled by the corresponding rtl818x_pci and btusb drivers that have their own rfkills.
Tested on MSI Wind U100 Plus, BIOS ver 1.0G, EC ver 130.
--- drivers/platform/x86/msi-laptop.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/platform/x86/msi-laptop.c +4 -4
@@ -208,7 +208,7 @@ static ssize_t set_device_state(const char *buf, size_t count, u8 mask)return -EINVAL ;if (quirks->ec_read_only) -return -EOPNOTSUPP ; +return 0 ;/* read current device state */ result =ec_read (MSI_STANDARD_EC_COMMAND_ADDRESS , &rdata);
@@ -838,15 +838,15 @@ static bool msi_laptop_i8042_filter(unsigned char data, unsigned char str,static void msi_init_rfkill (struct work_struct *ignored) {if (rfk_wlan) { -rfkill_set_sw_state (rfk_wlan, !wlan_s); +msi_rfkill_set_state (rfk_wlan, !wlan_s);rfkill_wlan_set (NULL , !wlan_s); }if (rfk_bluetooth) { -rfkill_set_sw_state (rfk_bluetooth, !bluetooth_s); +msi_rfkill_set_state (rfk_bluetooth, !bluetooth_s);rfkill_bluetooth_set (NULL , !bluetooth_s); }if (rfk_threeg) { -rfkill_set_sw_state (rfk_threeg, !threeg_s); +msi_rfkill_set_state (rfk_threeg, !threeg_s);rfkill_threeg_set (NULL , !threeg_s); } }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 103/228 x86/traps: Fix load_unaligned_zeropad() handling for shared TDX memory
In reply to Greg Kroah-HartmanFrom: Kirill A. Shutemov <[email protected]>
[ Upstream commit 9f9116406120638b4d8db3831ffbc430dd2e1e95 ]
Commit c4e34dd99f2e ("x86: simplify load_unaligned_zeropad() implementation") changes how exceptions around load_unaligned_zeropad() handled. The kernel now uses the fault_address in fixup_exception() to verify the address calculations for the load_unaligned_zeropad().
It works fine for #PF, but breaks on #VE since no fault address is passed down to fixup_exception().
Propagating ve_info.gla down to fixup_exception() resolves the issue.
See commit 1e7769653b06 ("x86/tdx: Handle load_unaligned_zeropad() page-cross to a shared page") for more context.
--- arch/x86/kernel/traps.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
arch/x86/kernel/traps.c +11 -7
@@ -697,9 +697,10 @@ static bool try_fixup_enqcmd_gp(void) }static bool gp_try_fixup_and_notify (struct pt_regs *regs,int trapnr, -unsigned long error_code,const char *str) +unsigned long error_code,const char *str, +unsigned long address) { -if (fixup_exception (regs, trapnr, error_code,0 )) +if (fixup_exception (regs, trapnr, error_code, address))return true; current->thread.error_code = error_code;
@@ -759,7 +760,7 @@ DEFINE_IDTENTRY_ERRORCODE(exc_general_protection) goto exit; } -if (gp_try_fixup_and_notify (regs,X86_TRAP_GP , error_code, desc)) +if (gp_try_fixup_and_notify (regs,X86_TRAP_GP , error_code, desc,0 )) goto exit;if (error_code)
@@ -1357,17 +1358,20 @@ DEFINE_IDTENTRY(exc_device_not_available)#define VE_FAULT_STR "VE fault" -static void ve_raise_fault (struct pt_regs *regs,long error_code) +static void ve_raise_fault (struct pt_regs *regs,long error_code, +unsigned long address) {if (user_mode (regs)) {gp_user_force_sig_segv (regs,X86_TRAP_VE , error_code,VE_FAULT_STR );return ; } -if (gp_try_fixup_and_notify (regs,X86_TRAP_VE , error_code,VE_FAULT_STR )) +if (gp_try_fixup_and_notify (regs,X86_TRAP_VE , error_code, +VE_FAULT_STR , address)) {return ; + } -die_addr (VE_FAULT_STR , regs, error_code,0 ); +die_addr (VE_FAULT_STR , regs, error_code, address); }/*
@@ -1431,7 +1435,7 @@ DEFINE_IDTENTRY(exc_virtualization_exception)* it successfully, treat it as #GP(0) and handle it. */ if (!tdx_handle_virt_exception (regs, &ve)) -ve_raise_fault (regs,0 ); +ve_raise_fault (regs,0 , ve.gla);cond_local_irq_disable (regs); }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 104/228 igc: Fix Kernel Panic during ndo_tx_timeout callback
In reply to Greg Kroah-HartmanFrom: Muhammad Husaini Zulkifli <[email protected]>
[ Upstream commit d4a7ce642100765119a872d4aba1bf63e3a22c8a ]
The Xeon validation group has been carrying out some loaded tests with various HW configurations, and they have seen some transmit queue time out happening during the test. This will cause the reset adapter function to be called by igc_tx_timeout(). Similar race conditions may arise when the interface is being brought down and up in igc_reinit_locked(), an interrupt being generated, and igc_clean_tx_irq() being called to complete the TX.
When the igc_tx_timeout() function is invoked, this patch will turn off all TX ring HW queues during igc_down() process. TX ring HW queues will be activated again during the igc_configure_tx_ring() process when performing the igc_up() procedure later.
This patch also moved existing igc_disable_tx_ring_hw() to avoid using forward declaration.
Kernel trace:
[ 7678.747813] ------------[ cut here ]------------ [ 7678.757914] NETDEV WATCHDOG: enp1s0 (igc): transmit queue 2 timed out [ 7678.770117] WARNING: CPU: 0 PID: 13 at net/sched/sch_generic.c:525 dev_watchdog+0x1ae/0x1f0 [ 7678.784459] Modules linked in: xt_conntrack nft_chain_nat xt_MASQUERADE xt_addrtype nft_compat
nf_tables nfnetlink br_netfilter bridge stp llc overlay dm_mod emrcha(PO) emriio(PO) rktpm(PO) cegbuf_mod(PO) patch_update(PO) se(PO) sgx_tgts(PO) mktme(PO) keylocker(PO) svtdx(PO) svfs_pci_hotplug(PO) vtd_mod(PO) davemem(PO) svmabort(PO) svindexio(PO) usbx2(PO) ehci_sched(PO) svheartbeat(PO) ioapic(PO) sv8259(PO) svintr(PO) lt(PO) pcierootport(PO) enginefw_mod(PO) ata(PO) smbus(PO) spiflash_cdf(PO) arden(PO) dsa_iax(PO) oobmsm_punit(PO) cpm(PO) svkdb(PO) ebg_pch(PO) pch(PO) sviotargets(PO) svbdf(PO) svmem(PO) svbios(PO) dram(PO) svtsc(PO) targets(PO) superio(PO) svkernel(PO) cswitch(PO) mcf(PO) pentiumIII_mod(PO) fs_svfs(PO) mdevdefdb(PO) svfs_os_services(O) ixgbe mdio mdio_devres libphy emeraldrapids_svdefs(PO) regsupport(O) libnvdimm nls_cp437 snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep x86_pkg_temp_thermal snd_hda_core snd_pcm snd_timer isst_if_mbox_pci
[ 7678.784496] input_leds isst_if_mmio sg snd isst_if_common soundcore wmi button sad9(O) drm fuse backlight
configfs efivarfs ip_tables x_tables vmd sdhci led_class rtl8150 r8152 hid_generic pegasus mmc_block usbhid mmc_core hid megaraid_sas ixgb igb i2c_algo_bit ice i40e hpsa scsi_transport_sas e1000e e1000 e100 ax88179_178a usbnet xhci_pci sd_mod xhci_hcd t10_pi crc32c_intel crc64_rocksoft igc crc64 crc_t10dif usbcore crct10dif_generic ptp crct10dif_common usb_common pps_core
[ 7679.200403] RIP: 0010:dev_watchdog+0x1ae/0x1f0 [ 7679.210201] Code: 28 e9 53 ff ff ff 4c 89 e7 c6 05 06 42 b9 00 01 e8 17 d1 fb ff 44 89 e9 4c 89 e6 48 c7 c7 40 ad fb 81 48 89 c2 e8 52 62 82 ff <0f> 0b e9 72 ff ff ff 65 8b 05 80 7d 7c 7e 89 c0 48 0f a3 05 0a c1 [ 7679.245438] RSP: 0018:ffa00000001f7d90 EFLAGS: 00010282 [ 7679.256021] RAX: 0000000000000000 RBX: ff11000109938440 RCX: 0000000000000000 [ 7679.268710] RDX: ff11000361e26cd8 RSI: ff11000361e1b880 RDI: ff11000361e1b880 [ 7679.281314] RBP: ffa00000001f7da8 R08: ff1100035f8fffe8 R09: 0000000000027ffb [ 7679.293840] R10: 0000000000001f0a R11: ff1100035f840000 R12: ff11000109938000 [ 7679.306276] R13: 0000000000000002 R14: dead000000000122 R15: ffa00000001f7e18 [ 7679.318648] FS: 0000000000000000(0000) GS:ff11000361e00000(0000) knlGS:0000000000000000 [ 7679.332064] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 7679.342757] CR2: 00007ffff7fca168 CR3: 000000013b08a006 CR4: 0000000000471ef8 [ 7679.354984] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 7679.367207] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 [ 7679.379370] PKRU: 55555554 [ 7679.386446] Call Trace: [ 7679.393152] <TASK> [ 7679.399363] ? __pfx_dev_watchdog+0x10/0x10 [ 7679.407870] call_timer_fn+0x31/0x110 [ 7679.415698] expire_timers+0xb2/0x120 [ 7679.423403] run_timer_softirq+0x179/0x1e0 [ 7679.431532] ? __schedule+0x2b1/0x820 [ 7679.439078] __do_softirq+0xd1/0x295 [ 7679.446426] ? __pfx_smpboot_thread_fn+0x10/0x10 [ 7679.454867] run_ksoftirqd+0x22/0x30 [ 7679.462058] smpboot_thread_fn+0xb7/0x160 [ 7679.469670] kthread+0xcd/0xf0 [ 7679.476097] ? __pfx_kthread+0x10/0x10 [ 7679.483211] ret_from_fork+0x29/0x50 [ 7679.490047] </TASK> [ 7679.495204] ---[ end trace 0000000000000000 ]--- [ 7679.503179] igc 0000:01:00.0 enp1s0: Register Dump [ 7679.511230] igc 0000:01:00.0 enp1s0: Register Name Value [ 7679.519892] igc 0000:01:00.0 enp1s0: CTRL 181c0641 [ 7679.528782] igc 0000:01:00.0 enp1s0: STATUS 40280683 [ 7679.537551] igc 0000:01:00.0 enp1s0: CTRL_EXT 10000040 [ 7679.546284] igc 0000:01:00.0 enp1s0: MDIC 180a3800 [ 7679.554942] igc 0000:01:00.0 enp1s0: ICR 00000081 [ 7679.563503] igc 0000:01:00.0 enp1s0: RCTL 04408022 [ 7679.571963] igc 0000:01:00.0 enp1s0: RDLEN[0-3] 00001000 00001000 00001000 00001000 [ 7679.583075] igc 0000:01:00.0 enp1s0: RDH[0-3] 00000068 000000b6 0000000f 00000031 [ 7679.594162] igc 0000:01:00.0 enp1s0: RDT[0-3] 00000066 000000b2 0000000e 00000030 [ 7679.605174] igc 0000:01:00.0 enp1s0: RXDCTL[0-3] 02040808 02040808 02040808 02040808 [ 7679.616196] igc 0000:01:00.0 enp1s0: RDBAL[0-3] 1bb7c000 1bb7f000 1bb82000 0ef33000 [ 7679.627242] igc 0000:01:00.0 enp1s0: RDBAH[0-3] 00000001 00000001 00000001 00000001 [ 7679.638256] igc 0000:01:00.0 enp1s0: TCTL a503f0fa [ 7679.646607] igc 0000:01:00.0 enp1s0: TDBAL[0-3] 2ba4a000 1bb6f000 1bb74000 1bb79000 [ 7679.657609] igc 0000:01:00.0 enp1s0: TDBAH[0-3] 00000001 00000001 00000001 00000001 [ 7679.668551] igc 0000:01:00.0 enp1s0: TDLEN[0-3] 00001000 00001000 00001000 00001000 [ 7679.679470] igc 0000:01:00.0 enp1s0: TDH[0-3] 000000a7 0000002d 000000bf 000000d9 [ 7679.690406] igc 0000:01:00.0 enp1s0: TDT[0-3] 000000a7 0000002d 000000bf 000000d9 [ 7679.701264] igc 0000:01:00.0 enp1s0: TXDCTL[0-3] 02100108 02100108 02100108 02100108 [ 7679.712123] igc 0000:01:00.0 enp1s0: Reset adapter [ 7683.085967] igc 0000:01:00.0 enp1s0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX [ 8086.945561] ------------[ cut here ]------------ Entering kdb (current=0xffffffff8220b200, pid 0) on processor 0 Oops: (null) due to oops @ 0xffffffff81573888 RIP: 0010:dql_completed+0x148/0x160 Code: c9 00 48 89 57 58 e9 46 ff ff ff 45 85 e4 41 0f 95 c4 41 39 db 0f 95 c1 41 84 cc 74 05 45 85 ed 78 0a 44 89 c1 e9 27 ff ff ff <0f> 0b 01 f6 44 89 c1 29 f1 0f 48 ca eb 8c cc cc cc cc cc cc cc cc RSP: 0018:ffa0000000003e00 EFLAGS: 00010287 RAX: 000000000000006c RBX: ffa0000003eb0f78 RCX: ff11000109938000 RDX: 0000000000000003 RSI: 0000000000000160 RDI: ff110001002e9480 RBP: ffa0000000003ed8 R08: ff110001002e93c0 R09: ffa0000000003d28 R10: 0000000000007cc0 R11: 0000000000007c54 R12: 00000000ffffffd9 R13: ff1100037039cb00 R14: 00000000ffffffd9 R15: ff1100037039c048 FS: 0000000000000000(0000) GS:ff11000361e00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007ffff7fca168 CR3: 000000013b08a003 CR4: 0000000000471ef8 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: <IRQ> ? igc_poll+0x1a9/0x14d0 [igc] __napi_poll+0x2e/0x1b0 net_rx_action+0x126/0x250 __do_softirq+0xd1/0x295 irq_exit_rcu+0xc5/0xf0 common_interrupt+0x86/0xa0 </IRQ> <TASK> asm_common_interrupt+0x27/0x40 RIP: 0010:cpuidle_enter_state+0xd3/0x3e0 Code: 73 f1 ff ff 49 89 c6 8b 05 e2 ca a7 00 85 c0 0f 8f b3 02 00 00 31 ff e8 1b
de 75 ff 80 7d d7 00 0f 85 cd 01 00 00 fb 45 85 ff <0f> 88 fd 00 00 00 49 63 cf 4c 2b 75 c8 48 8d 04 49 48 89 ca 48 8d
RSP: 0018:ffffffff82203df0 EFLAGS: 00000202
RAX: ff11000361e2a200 RBX: 0000000000000002 RCX: 000000000000001f
RDX: 0000000000000000 RSI: 000000003cf3cf3d RDI: 0000000000000000
RBP: ffffffff82203e28 R08: 0000075ae38471c8 R09: 0000000000000018
R10: 000000000000031a R11: ffffffff8238dca0 R12: ffd1ffffff200000
R13: ffffffff8238dca0 R14: 0000075ae38471c8 R15: 0000000000000002
cpuidle_enter+0x2e/0x50 call_cpuidle+0x23/0x40 do_idle+0x1be/0x220 cpu_startup_entry+0x20/0x30 rest_init+0xb5/0xc0 arch_call_rest_init+0xe/0x30 start_kernel+0x448/0x760 x86_64_start_kernel+0x109/0x150 secondary_startup_64_no_verify+0xe0/0xeb </TASK>
more>
[0]kdb>
[0]kdb>
[0]kdb> go
Catastrophic error detected
kdb_continue_catastrophic=0, type go a second time if you really want to continue
[0]kdb> go
Catastrophic error detected
kdb_continue_catastrophic=0, attempting to continue
[ 8086.955689] refcount_t: underflow; use-after-free. [ 8086.955697] WARNING: CPU: 0 PID: 0 at lib/refcount.c:28 refcount_warn_saturate+0xc2/0x110 [ 8086.955706] Modules linked in: xt_conntrack nft_chain_nat xt_MASQUERADE xt_addrtype nft_compat
nf_tables nfnetlink br_netfilter bridge stp llc overlay dm_mod emrcha(PO) emriio(PO) rktpm(PO) cegbuf_mod(PO) patch_update(PO) se(PO) sgx_tgts(PO) mktme(PO) keylocker(PO) svtdx(PO) svfs_pci_hotplug(PO) vtd_mod(PO) davemem(PO) svmabort(PO) svindexio(PO) usbx2(PO) ehci_sched(PO) svheartbeat(PO) ioapic(PO) sv8259(PO) svintr(PO) lt(PO) pcierootport(PO) enginefw_mod(PO) ata(PO) smbus(PO) spiflash_cdf(PO) arden(PO) dsa_iax(PO) oobmsm_punit(PO) cpm(PO) svkdb(PO) ebg_pch(PO) pch(PO) sviotargets(PO) svbdf(PO) svmem(PO) svbios(PO) dram(PO) svtsc(PO) targets(PO) superio(PO) svkernel(PO) cswitch(PO) mcf(PO) pentiumIII_mod(PO) fs_svfs(PO) mdevdefdb(PO) svfs_os_services(O) ixgbe mdio mdio_devres libphy emeraldrapids_svdefs(PO) regsupport(O) libnvdimm nls_cp437 snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep x86_pkg_temp_thermal snd_hda_core snd_pcm snd_timer isst_if_mbox_pci
[ 8086.955751] input_leds isst_if_mmio sg snd isst_if_common soundcore wmi button sad9(O) drm
fuse backlight configfs efivarfs ip_tables x_tables vmd sdhci led_class rtl8150 r8152 hid_generic pegasus mmc_block usbhid mmc_core hid megaraid_sas ixgb igb i2c_algo_bit ice i40e hpsa scsi_transport_sas e1000e e1000 e100 ax88179_178a usbnet xhci_pci sd_mod xhci_hcd t10_pi crc32c_intel crc64_rocksoft igc crc64 crc_t10dif usbcore crct10dif_generic ptp crct10dif_common usb_common pps_core
[ 8086.955784] RIP: 0010:refcount_warn_saturate+0xc2/0x110 [ 8086.955788] Code: 01 e8 82 e7 b4 ff 0f 0b 5d c3 cc cc cc cc 80 3d 68 c6 eb 00 00 75 81 48 c7 c7 a0 87 f6 81 c6 05 58 c6 eb 00 01 e8 5e e7 b4 ff <0f> 0b 5d c3 cc cc cc cc 80 3d 42 c6 eb 00 00 0f 85 59 ff ff ff 48 [ 8086.955790] RSP: 0018:ffa0000000003da0 EFLAGS: 00010286 [ 8086.955793] RAX: 0000000000000000 RBX: ff1100011da40ee0 RCX: ff11000361e1b888 [ 8086.955794] RDX: 00000000ffffffd8 RSI: 0000000000000027 RDI: ff11000361e1b880 [ 8086.955795] RBP: ffa0000000003da0 R08: 80000000ffff9f45 R09: ffa0000000003d28 [ 8086.955796] R10: ff1100035f840000 R11: 0000000000000028 R12: ff11000319ff8000 [ 8086.955797] R13: ff1100011bb79d60 R14: 00000000ffffffd6 R15: ff1100037039cb00 [ 8086.955798] FS: 0000000000000000(0000) GS:ff11000361e00000(0000) knlGS:0000000000000000 [ 8086.955800] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 8086.955801] CR2: 00007ffff7fca168 CR3: 000000013b08a003 CR4: 0000000000471ef8 [ 8086.955803] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 8086.955803] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 [ 8086.955804] PKRU: 55555554 [ 8086.955805] Call Trace: [ 8086.955806] <IRQ> [ 8086.955808] tcp_wfree+0x112/0x130 [ 8086.955814] skb_release_head_state+0x24/0xa0 [ 8086.955818] napi_consume_skb+0x9c/0x160 [ 8086.955821] igc_poll+0x5d8/0x14d0 [igc] [ 8086.955835] __napi_poll+0x2e/0x1b0 [ 8086.955839] net_rx_action+0x126/0x250 [ 8086.955843] __do_softirq+0xd1/0x295 [ 8086.955846] irq_exit_rcu+0xc5/0xf0 [ 8086.955851] common_interrupt+0x86/0xa0 [ 8086.955857] </IRQ> [ 8086.955857] <TASK> [ 8086.955858] asm_common_interrupt+0x27/0x40 [ 8086.955862] RIP: 0010:cpuidle_enter_state+0xd3/0x3e0 [ 8086.955866] Code: 73 f1 ff ff 49 89 c6 8b 05 e2 ca a7 00 85 c0 0f 8f b3 02 00 00 31 ff e8 1b de 75 ff 80 7d d7 00 0f 85 cd 01 00 00 fb 45 85 ff <0f> 88 fd 00 00 00 49 63 cf 4c 2b 75 c8 48 8d 04 49 48 89 ca 48 8d [ 8086.955867] RSP: 0018:ffffffff82203df0 EFLAGS: 00000202 [ 8086.955869] RAX: ff11000361e2a200 RBX: 0000000000000002 RCX: 000000000000001f [ 8086.955870] RDX: 0000000000000000 RSI: 000000003cf3cf3d RDI: 0000000000000000 [ 8086.955871] RBP: ffffffff82203e28 R08: 0000075ae38471c8 R09: 0000000000000018 [ 8086.955872] R10: 000000000000031a R11: ffffffff8238dca0 R12: ffd1ffffff200000 [ 8086.955873] R13: ffffffff8238dca0 R14: 0000075ae38471c8 R15: 0000000000000002 [ 8086.955875] cpuidle_enter+0x2e/0x50 [ 8086.955880] call_cpuidle+0x23/0x40 [ 8086.955884] do_idle+0x1be/0x220 [ 8086.955887] cpu_startup_entry+0x20/0x30 [ 8086.955889] rest_init+0xb5/0xc0 [ 8086.955892] arch_call_rest_init+0xe/0x30 [ 8086.955895] start_kernel+0x448/0x760 [ 8086.955898] x86_64_start_kernel+0x109/0x150 [ 8086.955900] secondary_startup_64_no_verify+0xe0/0xeb [ 8086.955904] </TASK> [ 8086.955904] ---[ end trace 0000000000000000 ]--- [ 8086.955912] ------------[ cut here ]------------ [ 8086.955913] kernel BUG at lib/dynamic_queue_limits.c:27! [ 8086.955918] invalid opcode: 0000 [#1] SMP [ 8086.955922] RIP: 0010:dql_completed+0x148/0x160 [ 8086.955925] Code: c9 00 48 89 57 58 e9 46 ff ff ff 45 85 e4 41 0f 95 c4 41 39 db 0f 95 c1 41 84 cc 74 05 45 85 ed 78 0a 44 89 c1 e9 27 ff ff ff <0f> 0b 01 f6 44 89 c1 29 f1 0f 48 ca eb 8c cc cc cc cc cc cc cc cc [ 8086.955927] RSP: 0018:ffa0000000003e00 EFLAGS: 00010287 [ 8086.955928] RAX: 000000000000006c RBX: ffa0000003eb0f78 RCX: ff11000109938000 [ 8086.955929] RDX: 0000000000000003 RSI: 0000000000000160 RDI: ff110001002e9480 [ 8086.955930] RBP: ffa0000000003ed8 R08: ff110001002e93c0 R09: ffa0000000003d28 [ 8086.955931] R10: 0000000000007cc0 R11: 0000000000007c54 R12: 00000000ffffffd9 [ 8086.955932] R13: ff1100037039cb00 R14: 00000000ffffffd9 R15: ff1100037039c048 [ 8086.955933] FS: 0000000000000000(0000) GS:ff11000361e00000(0000) knlGS:0000000000000000 [ 8086.955934] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 8086.955935] CR2: 00007ffff7fca168 CR3: 000000013b08a003 CR4: 0000000000471ef8 [ 8086.955936] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 8086.955937] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 [ 8086.955938] PKRU: 55555554 [ 8086.955939] Call Trace: [ 8086.955939] <IRQ> [ 8086.955940] ? igc_poll+0x1a9/0x14d0 [igc] [ 8086.955949] __napi_poll+0x2e/0x1b0 [ 8086.955952] net_rx_action+0x126/0x250 [ 8086.955956] __do_softirq+0xd1/0x295 [ 8086.955958] irq_exit_rcu+0xc5/0xf0 [ 8086.955961] common_interrupt+0x86/0xa0 [ 8086.955964] </IRQ> [ 8086.955965] <TASK> [ 8086.955965] asm_common_interrupt+0x27/0x40 [ 8086.955968] RIP: 0010:cpuidle_enter_state+0xd3/0x3e0 [ 8086.955971] Code: 73 f1 ff ff 49 89 c6 8b 05 e2 ca a7 00 85 c0 0f 8f b3 02 00 00 31 ff e8 1b de 75 ff 80 7d d7 00 0f 85 cd 01 00 00 fb 45 85 ff <0f> 88 fd 00 00 00 49 63 cf 4c 2b 75 c8 48 8d 04 49 48 89 ca 48 8d [ 8086.955972] RSP: 0018:ffffffff82203df0 EFLAGS: 00000202 [ 8086.955973] RAX: ff11000361e2a200 RBX: 0000000000000002 RCX: 000000000000001f [ 8086.955974] RDX: 0000000000000000 RSI: 000000003cf3cf3d RDI: 0000000000000000 [ 8086.955974] RBP: ffffffff82203e28 R08: 0000075ae38471c8 R09: 0000000000000018 [ 8086.955975] R10: 000000000000031a R11: ffffffff8238dca0 R12: ffd1ffffff200000 [ 8086.955976] R13: ffffffff8238dca0 R14: 0000075ae38471c8 R15: 0000000000000002 [ 8086.955978] cpuidle_enter+0x2e/0x50 [ 8086.955981] call_cpuidle+0x23/0x40 [ 8086.955984] do_idle+0x1be/0x220 [ 8086.955985] cpu_startup_entry+0x20/0x30 [ 8086.955987] rest_init+0xb5/0xc0 [ 8086.955990] arch_call_rest_init+0xe/0x30 [ 8086.955992] start_kernel+0x448/0x760 [ 8086.955994] x86_64_start_kernel+0x109/0x150 [ 8086.955996] secondary_startup_64_no_verify+0xe0/0xeb [ 8086.955998] </TASK> [ 8086.955999] Modules linked in: xt_conntrack nft_chain_nat xt_MASQUERADE xt_addrtype
nft_compat nf_tables nfnetlink br_netfilter bridge stp llc overlay dm_mod emrcha(PO) emriio(PO) rktpm(PO) cegbuf_mod(PO) patch_update(PO) se(PO) sgx_tgts(PO) mktme(PO) keylocker(PO) svtdx(PO) svfs_pci_hotplug(PO) vtd_mod(PO) davemem(PO) svmabort(PO) svindexio(PO) usbx2(PO) ehci_sched(PO) svheartbeat(PO) ioapic(PO) sv8259(PO) svintr(PO) lt(PO) pcierootport(PO) enginefw_mod(PO) ata(PO) smbus(PO) spiflash_cdf(PO) arden(PO) dsa_iax(PO) oobmsm_punit(PO) cpm(PO) svkdb(PO) ebg_pch(PO) pch(PO) sviotargets(PO) svbdf(PO) svmem(PO) svbios(PO) dram(PO) svtsc(PO) targets(PO) superio(PO) svkernel(PO) cswitch(PO) mcf(PO) pentiumIII_mod(PO) fs_svfs(PO) mdevdefdb(PO) svfs_os_services(O) ixgbe mdio mdio_devres libphy emeraldrapids_svdefs(PO) regsupport(O) libnvdimm nls_cp437 snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hwdep x86_pkg_temp_thermal snd_hda_core snd_pcm snd_timer isst_if_mbox_pci
[ 8086.956029] input_leds isst_if_mmio sg snd isst_if_common soundcore wmi button sad9(O) drm
fuse backlight configfs efivarfs ip_tables x_tables vmd sdhci led_class rtl8150 r8152 hid_generic pegasus mmc_block usbhid mmc_core hid megaraid_sas ixgb igb i2c_algo_bit ice i40e hpsa scsi_transport_sas e1000e e1000 e100 ax88179_178a usbnet xhci_pci sd_mod xhci_hcd t10_pi crc32c_intel crc64_rocksoft igc crc64 crc_t10dif usbcore crct10dif_generic ptp crct10dif_common usb_common pps_core
[16762.543675] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.593 msecs [16762.543678] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.595 msecs [16762.543673] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.495 msecs [16762.543679] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.599 msecs [16762.543678] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.598 msecs [16762.543690] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.605 msecs [16762.543684] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.599 msecs [16762.543693] INFO: NMI handler (kgdb_nmi_handler) took too long to run: 8675587.613 msecs [16762.543784] ---[ end trace 0000000000000000 ]--- [16762.849099] RIP: 0010:dql_completed+0x148/0x160
PANIC: Fatal exception in interrupt
--- drivers/net/ethernet/intel/igc/igc_main.c | 40 ++++++++++++++++------- 1 file changed, 28 insertions(+), 12 deletions(-)
drivers/net/ethernet/intel/igc/igc_main.c +28 -12
@@ -317,6 +317,33 @@ static void igc_clean_all_tx_rings(struct igc_adapter *adapter)igc_clean_tx_ring (adapter->tx_ring[i]); } +static void igc_disable_tx_ring_hw (struct igc_ring *ring) +{ +struct igc_hw *hw = &ring->q_vector->adapter->hw; +u8 idx = ring->reg_idx; +u32 txdctl; + + txdctl =rd32 (IGC_TXDCTL (idx)); + txdctl &= ~IGC_TXDCTL_QUEUE_ENABLE ; + txdctl |=IGC_TXDCTL_SWFLUSH ; +wr32 (IGC_TXDCTL (idx), txdctl); +} + +/** +* igc_disable_all_tx_rings_hw - Disable all transmit queue operation +* @adapter: board private structure +*/ +static void igc_disable_all_tx_rings_hw (struct igc_adapter *adapter) +{ +int i; + +for (i =0 ; i < adapter->num_tx_queues; i++) { +struct igc_ring *tx_ring = adapter->tx_ring[i]; + +igc_disable_tx_ring_hw (tx_ring); + } +} +/** * igc_setup_tx_resources - allocate Tx resources (Descriptors) * @tx_ring: tx descriptor ring (for a specific queue) to setup
@@ -5026,6 +5053,7 @@ void igc_down(struct igc_adapter *adapter)/* clear VLAN promisc flag so VFTA will be updated if necessary */ adapter->flags &= ~IGC_FLAG_VLAN_PROMISC ; +igc_disable_all_tx_rings_hw (adapter);igc_clean_all_tx_rings (adapter);igc_clean_all_rx_rings (adapter); }
@@ -7124,18 +7152,6 @@ void igc_enable_rx_ring(struct igc_ring *ring)igc_alloc_rx_buffers (ring,igc_desc_unused (ring)); } -static void igc_disable_tx_ring_hw (struct igc_ring *ring) -{ -struct igc_hw *hw = &ring->q_vector->adapter->hw; -u8 idx = ring->reg_idx; -u32 txdctl; - - txdctl =rd32 (IGC_TXDCTL (idx)); - txdctl &= ~IGC_TXDCTL_QUEUE_ENABLE ; - txdctl |=IGC_TXDCTL_SWFLUSH ; -wr32 (IGC_TXDCTL (idx), txdctl); -} -void igc_disable_tx_ring (struct igc_ring *ring) {igc_disable_tx_ring_hw (ring);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 105/228 netfilter: nft_set_rbtree: fix overlap expiration walk
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit f718863aca469a109895cb855e6b81fff4827d71 ]
The lazy gc on insert that should remove timed-out entries fails to release the other half of the interval, if any.
Can be reproduced with tests/shell/testcases/sets/0044interval_overlap_0 in nftables.git and kmemleak enabled kernel.
Second bug is the use of rbe_prev vs. prev pointer.
If rbe_prev() returns NULL after at least one iteration, rbe_prev points to element that is not an end interval, hence it should not be removed.
Lastly, check the genmask of the end interval if this is active in the current generation.
--- net/netfilter/nft_set_rbtree.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
net/netfilter/nft_set_rbtree.c +14 -6
@@ -217,29 +217,37 @@ static void *nft_rbtree_get(const struct net *net, const struct nft_set *set,static int nft_rbtree_gc_elem (const struct nft_set *__set,struct nft_rbtree *priv, -struct nft_rbtree_elem *rbe) +struct nft_rbtree_elem *rbe, +u8 genmask) {struct nft_set *set = (struct nft_set *)__set;struct rb_node *prev =rb_prev (&rbe->node); -struct nft_rbtree_elem *rbe_prev =NULL ; +struct nft_rbtree_elem *rbe_prev;struct nft_set_gc_batch *gcb; gcb =nft_set_gc_batch_check (set,NULL ,GFP_ATOMIC );if (!gcb)return -ENOMEM ; -/* search for expired end interval coming before this element. */ +/* search for end interval coming before this element. +* end intervals don't carry a timeout extension, they +* are coupled with the interval start element. +*/ while (prev) { rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node); -if (nft_rbtree_interval_end (rbe_prev)) +if (nft_rbtree_interval_end (rbe_prev) && +nft_set_elem_active (&rbe_prev->ext, genmask))break ; prev =rb_prev (prev); } -if (rbe_prev) { +if (prev) { + rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node); +rb_erase (&rbe_prev->node, &priv->root);atomic_dec (&set->nelems); +nft_set_gc_batch_add (gcb, rbe_prev); }rb_erase (&rbe->node, &priv->root);
@@ -321,7 +329,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,/* perform garbage collection to avoid bogus overlap reports. */ if (nft_set_elem_expired (&rbe->ext)) { - err =nft_rbtree_gc_elem (set, priv, rbe); + err =nft_rbtree_gc_elem (set, priv, rbe, genmask);if (err <0 )return err;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 106/228 netfilter: nf_tables: skip immediate deactivate in _PREPARE_ERROR
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 0a771f7b266b02d262900c75f1e175c7fe76fec2 ]
On error when building the rule, the immediate expression unbinds the chain, hence objects can be deactivated by the transaction records.
Otherwise, it is possible to trigger the following warning:
WARNING: CPU: 3 PID: 915 at net/netfilter/nf_tables_api.c:2013 nf_tables_chain_destroy+0x1f7/0x210 [nf_tables] CPU: 3 PID: 915 Comm: chain-bind-err- Not tainted 6.1.39 #1 RIP: 0010:nf_tables_chain_destroy+0x1f7/0x210 [nf_tables]
--- net/netfilter/nft_immediate.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-)
net/netfilter/nft_immediate.c +18 -9
@@ -125,15 +125,27 @@ static void nft_immediate_activate(const struct nft_ctx *ctx,return nft_data_hold (&priv->data,nft_dreg_to_type (priv->dreg)); } +static void nft_immediate_chain_deactivate (const struct nft_ctx *ctx, +struct nft_chain *chain, +enum nft_trans_phase phase) +{ +struct nft_ctx chain_ctx; +struct nft_rule *rule; + + chain_ctx = *ctx; + chain_ctx.chain = chain; + +list_for_each_entry (rule, &chain->rules, list) +nft_rule_expr_deactivate (&chain_ctx, rule, phase); +} +static void nft_immediate_deactivate (const struct nft_ctx *ctx,const struct nft_expr *expr,enum nft_trans_phase phase) {const struct nft_immediate_expr *priv =nft_expr_priv (expr);const struct nft_data *data = &priv->data; -struct nft_ctx chain_ctx;struct nft_chain *chain; -struct nft_rule *rule;if (priv->dreg ==NFT_REG_VERDICT ) {switch (data->verdict.code) {
@@ -143,20 +155,17 @@ static void nft_immediate_deactivate(const struct nft_ctx *ctx,if (!nft_chain_binding (chain))break ; - chain_ctx = *ctx; - chain_ctx.chain = chain; - -list_for_each_entry (rule, &chain->rules, list) -nft_rule_expr_deactivate (&chain_ctx, rule, phase); -switch (phase) {case NFT_TRANS_PREPARE_ERROR :nf_tables_unbind_chain (ctx, chain); - fallthrough; +nft_deactivate_next (ctx->net, chain); +break ;case NFT_TRANS_PREPARE : +nft_immediate_chain_deactivate (ctx, chain, phase);nft_deactivate_next (ctx->net, chain);break ;default : +nft_immediate_chain_deactivate (ctx, chain, phase);nft_chain_del (chain); chain->bound = false; chain->table->use--;
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 107/228 netfilter: nf_tables: disallow rule addition to bound chain via NFTA_RULE_CHAIN_ID
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 0ebc1064e4874d5987722a2ddbc18f94aa53b211 ]
Bail out with EOPNOTSUPP when adding rule to bound chain via NFTA_RULE_CHAIN_ID. The following warning splat is shown when adding a rule to a deleted bound chain:
WARNING: CPU: 2 PID: 13692 at net/netfilter/nf_tables_api.c:2013 nf_tables_chain_destroy+0x1f7/0x210 [nf_tables] CPU: 2 PID: 13692 Comm: chain-bound-rul Not tainted 6.1.39 #1 RIP: 0010:nf_tables_chain_destroy+0x1f7/0x210 [nf_tables]
--- net/netfilter/nf_tables_api.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +3 -2
@@ -3626,8 +3626,6 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,NL_SET_BAD_ATTR (extack, nla[NFTA_RULE_CHAIN ]);return PTR_ERR (chain); } -if (nft_chain_is_bound (chain)) -return -EOPNOTSUPP ; }else if (nla[NFTA_RULE_CHAIN_ID ]) { chain = nft_chain_lookup_byid(net, table, nla[NFTA_RULE_CHAIN_ID],
@@ -3640,6 +3638,9 @@ static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,return -EINVAL ; } +if (nft_chain_is_bound (chain)) +return -EOPNOTSUPP ; +if (nla[NFTA_RULE_HANDLE ]) { handle =be64_to_cpu (nla_get_be64 (nla[NFTA_RULE_HANDLE ])); rule =__nft_rule_lookup (chain, handle);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 108/228 mm: suppress mm fault logging if fatal signal already pending
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit 5f0bc0b042fc77ff70e14c790abdec960cde4ec1 ]
Commit eda0047296a1 ("mm: make the page fault mmap locking killable") intentionally made it much easier to trigger the "page fault fails because a fatal signal is pending" situation, by having the mmap locking fail early in that case.
We have long aborted page faults in other fatal cases when the actual IO for a page is interrupted by SIGKILL - which is particularly useful for the traditional case of NFS hanging due to network issues, but local filesystems could cause it too if you happened to get the SIGKILL while waiting for a page to be faulted in (eg lock_folio_maybe_drop_mmap()).
So aborting the page fault wasn't a new condition - but it now triggers earlier, before we even get to 'handle_mm_fault()'. And as a result the error doesn't go through our 'fault_signal_pending()' logic, and doesn't get filtered away there.
Normally you'd never even notice, because if a fatal signal is pending, the new SIGSEGV we send ends up being ignored anyway.
But it turns out that there is one very noticeable exception: if you enable 'show_unhandled_signals', the aborted page fault will be logged in the kernel messages, and you'll get a scary line looking something like this in your logs:
pverados[2183248]: segfault at 55e5a00f9ae0 ip 000055e5a00f9ae0 sp 00007ffc0720bea8 error 14 in perl[55e5a00d4000+195000] likely on CPU 10 (core 4, socket 0)
which is rather misleading. It's not really a segfault at all, it's just "the thread was killed before the page fault completed, so we aborted the page fault".
Fix this by just making it clear that a pending fatal signal means that any new signal coming in after that is implicitly handled. This will avoid the misleading logging, since now the signal isn't 'unhandled' any more.
--- kernel/signal.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/signal.c +4 -0
@@ -561,6 +561,10 @@ bool unhandled_signal(struct task_struct *tsk, int sig)if (handler !=SIG_IGN && handler !=SIG_DFL )return false; +/* If dying, we handle all new signals by ignoring them */ +if (fatal_signal_pending (tsk)) +return false; +/* if ptraced, let the tracer determine */ return !tsk->ptrace; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 109/228 net/sched: mqprio: refactor nlattr parsing to a separate function
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit feb2cf3dcfb930aec2ca65c66d1365543d5ba943 ]
mqprio_init() is quite large and unwieldy to add more code to. Split the netlink attribute parsing to a dedicated function.
Stable-dep-of: 6c58c8816abb ("net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64")
--- net/sched/sch_mqprio.c | 114 +++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 51 deletions(-)
net/sched/sch_mqprio.c +63 -51
@@ -130,6 +130,67 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla,return 0 ; } +static int mqprio_parse_nlattr (struct Qdisc *sch,struct tc_mqprio_qopt *qopt, +struct nlattr *opt) +{ +struct mqprio_sched *priv =qdisc_priv (sch); +struct nlattr *tb[TCA_MQPRIO_MAX +1 ]; +struct nlattr *attr; +int i, rem, err; + + err =parse_attr (tb,TCA_MQPRIO_MAX , opt, mqprio_policy, +sizeof (*qopt)); +if (err <0 ) +return err; + +if (!qopt->hw) +return -EINVAL ; + +if (tb[TCA_MQPRIO_MODE ]) { + priv->flags |=TC_MQPRIO_F_MODE ; + priv->mode = *(u16 *)nla_data (tb[TCA_MQPRIO_MODE ]); + } + +if (tb[TCA_MQPRIO_SHAPER ]) { + priv->flags |=TC_MQPRIO_F_SHAPER ; + priv->shaper = *(u16 *)nla_data (tb[TCA_MQPRIO_SHAPER ]); + } + +if (tb[TCA_MQPRIO_MIN_RATE64 ]) { +if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) +return -EINVAL ; + i =0 ; +nla_for_each_nested (attr, tb[TCA_MQPRIO_MIN_RATE64 ], + rem) { +if (nla_type (attr) !=TCA_MQPRIO_MIN_RATE64 ) +return -EINVAL ; +if (i >= qopt->num_tc) +break ; + priv->min_rate[i] = *(u64 *)nla_data (attr); + i++; + } + priv->flags |=TC_MQPRIO_F_MIN_RATE ; + } + +if (tb[TCA_MQPRIO_MAX_RATE64 ]) { +if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) +return -EINVAL ; + i =0 ; +nla_for_each_nested (attr, tb[TCA_MQPRIO_MAX_RATE64 ], + rem) { +if (nla_type (attr) !=TCA_MQPRIO_MAX_RATE64 ) +return -EINVAL ; +if (i >= qopt->num_tc) +break ; + priv->max_rate[i] = *(u64 *)nla_data (attr); + i++; + } + priv->flags |=TC_MQPRIO_F_MAX_RATE ; + } + +return 0 ; +} +static int mqprio_init (struct Qdisc *sch,struct nlattr *opt,struct netlink_ext_ack *extack) {
@@ -139,9 +200,6 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt,struct Qdisc *qdisc;int i, err = -EOPNOTSUPP ;struct tc_mqprio_qopt *qopt =NULL ; -struct nlattr *tb[TCA_MQPRIO_MAX +1 ]; -struct nlattr *attr; -int rem;int len;BUILD_BUG_ON (TC_MAX_QUEUE !=TC_QOPT_MAX_QUEUE );
@@ -166,55 +224,9 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt, len =nla_len (opt) -NLA_ALIGN (sizeof (*qopt));if (len >0 ) { - err =parse_attr (tb,TCA_MQPRIO_MAX , opt, mqprio_policy, -sizeof (*qopt)); -if (err <0 ) + err =mqprio_parse_nlattr (sch, qopt, opt); +if (err)return err; - -if (!qopt->hw) -return -EINVAL ; - -if (tb[TCA_MQPRIO_MODE ]) { - priv->flags |=TC_MQPRIO_F_MODE ; - priv->mode = *(u16 *)nla_data (tb[TCA_MQPRIO_MODE ]); - } - -if (tb[TCA_MQPRIO_SHAPER ]) { - priv->flags |=TC_MQPRIO_F_SHAPER ; - priv->shaper = *(u16 *)nla_data (tb[TCA_MQPRIO_SHAPER ]); - } - -if (tb[TCA_MQPRIO_MIN_RATE64 ]) { -if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) -return -EINVAL ; - i =0 ; -nla_for_each_nested (attr, tb[TCA_MQPRIO_MIN_RATE64 ], - rem) { -if (nla_type (attr) !=TCA_MQPRIO_MIN_RATE64 ) -return -EINVAL ; -if (i >= qopt->num_tc) -break ; - priv->min_rate[i] = *(u64 *)nla_data (attr); - i++; - } - priv->flags |=TC_MQPRIO_F_MIN_RATE ; - } - -if (tb[TCA_MQPRIO_MAX_RATE64 ]) { -if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) -return -EINVAL ; - i =0 ; -nla_for_each_nested (attr, tb[TCA_MQPRIO_MAX_RATE64 ], - rem) { -if (nla_type (attr) !=TCA_MQPRIO_MAX_RATE64 ) -return -EINVAL ; -if (i >= qopt->num_tc) -break ; - priv->max_rate[i] = *(u64 *)nla_data (attr); - i++; - } - priv->flags |=TC_MQPRIO_F_MAX_RATE ; - } }/* pre-allocate qdisc, attachment can't fail */
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 110/228 net/sched: mqprio: add extack to mqprio_parse_nlattr()
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 57f21bf85400abadac0cb2a4db5de1d663f8863f ]
Netlink attribute parsing in mqprio is a minesweeper game, with many options having the possibility of being passed incorrectly and the user being none the wiser.
Try to make errors less sour by giving user space some information regarding what went wrong.
Stable-dep-of: 6c58c8816abb ("net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64")
--- net/sched/sch_mqprio.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-)
net/sched/sch_mqprio.c +23 -7
@@ -131,7 +131,8 @@ static int parse_attr(struct nlattr *tb[], int maxtype, struct nlattr *nla, }static int mqprio_parse_nlattr (struct Qdisc *sch,struct tc_mqprio_qopt *qopt, -struct nlattr *opt) +struct nlattr *opt, +struct netlink_ext_ack *extack) {struct mqprio_sched *priv =qdisc_priv (sch);struct nlattr *tb[TCA_MQPRIO_MAX +1 ];
@@ -143,8 +144,11 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt,if (err <0 )return err; -if (!qopt->hw) +if (!qopt->hw) { +NL_SET_ERR_MSG (extack, +"mqprio TCA_OPTIONS can only contain netlink attributes in hardware mode" );return -EINVAL ; + }if (tb[TCA_MQPRIO_MODE ]) { priv->flags |=TC_MQPRIO_F_MODE ;
@@ -157,13 +161,19 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt, }if (tb[TCA_MQPRIO_MIN_RATE64 ]) { -if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) +if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) { +NL_SET_ERR_MSG_ATTR (extack, tb[TCA_MQPRIO_MIN_RATE64 ], +"min_rate accepted only when shaper is in bw_rlimit mode" );return -EINVAL ; + } i =0 ;nla_for_each_nested (attr, tb[TCA_MQPRIO_MIN_RATE64 ], rem) { -if (nla_type (attr) !=TCA_MQPRIO_MIN_RATE64 ) +if (nla_type (attr) !=TCA_MQPRIO_MIN_RATE64 ) { +NL_SET_ERR_MSG_ATTR (extack, attr, +"Attribute type expected to be TCA_MQPRIO_MIN_RATE64" );return -EINVAL ; + }if (i >= qopt->num_tc)break ; priv->min_rate[i] = *(u64 *)nla_data (attr);
@@ -173,13 +183,19 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt, }if (tb[TCA_MQPRIO_MAX_RATE64 ]) { -if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) +if (priv->shaper !=TC_MQPRIO_SHAPER_BW_RATE ) { +NL_SET_ERR_MSG_ATTR (extack, tb[TCA_MQPRIO_MAX_RATE64 ], +"max_rate accepted only when shaper is in bw_rlimit mode" );return -EINVAL ; + } i =0 ;nla_for_each_nested (attr, tb[TCA_MQPRIO_MAX_RATE64 ], rem) { -if (nla_type (attr) !=TCA_MQPRIO_MAX_RATE64 ) +if (nla_type (attr) !=TCA_MQPRIO_MAX_RATE64 ) { +NL_SET_ERR_MSG_ATTR (extack, attr, +"Attribute type expected to be TCA_MQPRIO_MAX_RATE64" );return -EINVAL ; + }if (i >= qopt->num_tc)break ; priv->max_rate[i] = *(u64 *)nla_data (attr);
@@ -224,7 +240,7 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt, len =nla_len (opt) -NLA_ALIGN (sizeof (*qopt));if (len >0 ) { - err =mqprio_parse_nlattr (sch, qopt, opt); + err =mqprio_parse_nlattr (sch, qopt, opt, extack);if (err)return err; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 111/228 net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit 6c58c8816abb7b93b21fa3b1d0c1726402e5e568 ]
The nla_for_each_nested parsing in function mqprio_parse_nlattr() does not check the length of the nested attribute. This can lead to an out-of-attribute read and allow a malformed nlattr (e.g., length 0) to be viewed as 8 byte integer and passed to priv->max_rate/min_rate.
This patch adds the check based on nla_len() when check the nla_type(), which ensures that the length of these two attribute must equals sizeof(u64).
--- net/sched/sch_mqprio.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
net/sched/sch_mqprio.c +14 -0
@@ -174,6 +174,13 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt, "Attribute type expected to be TCA_MQPRIO_MIN_RATE64");return -EINVAL ; } + +if (nla_len (attr) !=sizeof (u64)) { +NL_SET_ERR_MSG_ATTR (extack, attr, +"Attribute TCA_MQPRIO_MIN_RATE64 expected to have 8 bytes length" ); +return -EINVAL ; + } +if (i >= qopt->num_tc)break ; priv->min_rate[i] = *(u64 *)nla_data (attr);
@@ -196,6 +203,13 @@ static int mqprio_parse_nlattr(struct Qdisc *sch, struct tc_mqprio_qopt *qopt, "Attribute type expected to be TCA_MQPRIO_MAX_RATE64");return -EINVAL ; } + +if (nla_len (attr) !=sizeof (u64)) { +NL_SET_ERR_MSG_ATTR (extack, attr, +"Attribute TCA_MQPRIO_MAX_RATE64 expected to have 8 bytes length" ); +return -EINVAL ; + } +if (i >= qopt->num_tc)break ; priv->max_rate[i] = *(u64 *)nla_data (attr);
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 112/228 benet: fix return value check in be_lancer_xmit_workarounds()
In reply to Greg Kroah-HartmanFrom: Yuanjun Gong <[email protected]>
[ Upstream commit 5c85f7065718a949902b238a6abd8fc907c5d3e0 ]
in be_lancer_xmit_workarounds(), it should go to label 'tx_drop' if an unexpected value is returned by pskb_trim().
--- drivers/net/ethernet/emulex/benet/be_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/emulex/benet/be_main.c +2 -1
@@ -1139,7 +1139,8 @@ static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, (lancer_chip(adapter) || BE3_chip(adapter) || skb_vlan_tag_present(skb)) && is_ipv4_pkt(skb)) { ip = (struct iphdr *)ip_hdr (skb); -pskb_trim (skb, eth_hdr_len +ntohs (ip->tot_len)); +if (unlikely (pskb_trim (skb, eth_hdr_len +ntohs (ip->tot_len)))) + goto tx_drop; }/* If vlan tag is already inlined in the packet, skip HW VLAN
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 113/228 tipc: check return value of pskb_trim()
In reply to Greg Kroah-HartmanFrom: Yuanjun Gong <[email protected]>
[ Upstream commit e46e06ffc6d667a89b979701288e2264f45e6a7b ]
goto free_skb if an unexpected result is returned by pskb_tirm() in tipc_crypto_rcv_complete().
--- net/tipc/crypto.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/tipc/crypto.c +2 -1
@@ -1960,7 +1960,8 @@ static void tipc_crypto_rcv_complete(struct net *net, struct tipc_aead *aead,skb_reset_network_header (*skb);skb_pull (*skb,tipc_ehdr_size (ehdr)); -pskb_trim (*skb, (*skb)->len - aead->authsize); +if (pskb_trim (*skb, (*skb)->len - aead->authsize)) + goto free_skb;/* Validate TIPCv2 message */ if (unlikely (!tipc_msg_validate (skb))) {
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 114/228 tipc: stop tipc crypto on failure in tipc_node_create
In reply to Greg Kroah-HartmanFrom: Fedor Pchelkin <[email protected]>
[ Upstream commit de52e17326c3e9a719c9ead4adb03467b8fae0ef ]
If tipc_link_bc_create() fails inside tipc_node_create() for a newly allocated tipc node then we should stop its tipc crypto and free the resources allocated with a call to tipc_crypto_start().
As the node ref is initialized to one to that point, just put the ref on tipc_link_bc_create() error case that would lead to tipc_node_free() be eventually executed and properly clean the node and its crypto resources.
Found by Linux Verification Center (linuxtesting.org).
--- net/tipc/node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/node.c +1 -1
@@ -583,7 +583,7 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id, n->capabilities, &n->bc_entry.inputq1, &n->bc_entry.namedq, snd_l, &n->bc_entry.link)) {pr_warn ("Broadcast rcv link creation failed, no memory\n" ); -kfree (n); +tipc_node_put (n); n =NULL ; goto exit; }
Signature · 1 line
2.39.2
Greg Kroah-Hartman
maintainerPATCH 115/228 RDMA/mlx4: Make check for invalid flags stricter
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit d64b1ee12a168030fbb3e0aebf7bce49e9a07589 ]
This code is trying to ensure that only the flags specified in the list are allowed. The problem is that ucmd->rx_hash_fields_mask is a u64 and the flags are an enum which is treated as a u32 in this context. That means the test doesn't check whether the highest 32 bits are zero.
--- drivers/infiniband/hw/mlx4/qp.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/infiniband/hw/mlx4/qp.c +9 -9
@@ -530,15 +530,15 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,return (-EOPNOTSUPP ); } -if (ucmd->rx_hash_fields_mask & ~(MLX4_IB_RX_HASH_SRC_IPV4 | -MLX4_IB_RX_HASH_DST_IPV4 | -MLX4_IB_RX_HASH_SRC_IPV6 | -MLX4_IB_RX_HASH_DST_IPV6 | -MLX4_IB_RX_HASH_SRC_PORT_TCP | -MLX4_IB_RX_HASH_DST_PORT_TCP | -MLX4_IB_RX_HASH_SRC_PORT_UDP | -MLX4_IB_RX_HASH_DST_PORT_UDP | -MLX4_IB_RX_HASH_INNER )) { +if (ucmd->rx_hash_fields_mask & ~(u64)(MLX4_IB_RX_HASH_SRC_IPV4 | +MLX4_IB_RX_HASH_DST_IPV4 | +MLX4_IB_RX_HASH_SRC_IPV6 | +MLX4_IB_RX_HASH_DST_IPV6 | +MLX4_IB_RX_HASH_SRC_PORT_TCP | +MLX4_IB_RX_HASH_DST_PORT_TCP | +MLX4_IB_RX_HASH_SRC_PORT_UDP | +MLX4_IB_RX_HASH_DST_PORT_UDP | +MLX4_IB_RX_HASH_INNER )) {pr_debug ("RX Hash fields_mask has unsupported mask (0x%llx)\n" , ucmd->rx_hash_fields_mask);return (-EOPNOTSUPP );
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 116/228 drm/msm/dpu: drop enum dpu_core_perf_data_bus_id
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit e8383f5cf1b3573ce140a80bfbfd809278ab16d6 ]
Drop the leftover of bus-client -> interconnect conversion, the enum dpu_core_perf_data_bus_id.
Patchwork: https://patchwork.freedesktop.org/patch/546048/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 13 ------------- 1 file changed, 13 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h +0 -13
@@ -14,19 +14,6 @@#define DPU_PERF_DEFAULT_MAX_CORE_CLK_RATE 412500000 -/** -* enum dpu_core_perf_data_bus_id - data bus identifier -* @DPU_CORE_PERF_DATA_BUS_ID_MNOC: DPU/MNOC data bus -* @DPU_CORE_PERF_DATA_BUS_ID_LLCC: MNOC/LLCC data bus -* @DPU_CORE_PERF_DATA_BUS_ID_EBI: LLCC/EBI data bus -*/ -enum dpu_core_perf_data_bus_id { -DPU_CORE_PERF_DATA_BUS_ID_MNOC , -DPU_CORE_PERF_DATA_BUS_ID_LLCC , -DPU_CORE_PERF_DATA_BUS_ID_EBI , -DPU_CORE_PERF_DATA_BUS_ID_MAX , -}; -/** * struct dpu_core_perf_params - definition of performance parameters * @max_per_pipe_ib: maximum instantaneous bandwidth request
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 117/228 drm/msm/adreno: Fix snapshot BINDLESS_DATA size
In reply to Greg Kroah-HartmanFrom: Rob Clark <[email protected]>
[ Upstream commit bd846ceee9c478d0397428f02696602ba5eb264a ]
The incorrect size was causing "CP | AHB bus error" when snapshotting the GPU state on a6xx gen4 (a660 family).
Patchwork: https://patchwork.freedesktop.org/patch/546763/
--- drivers/gpu/drm/msm/adreno/a6xx_gpu_state.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.h +1 -1
@@ -200,7 +200,7 @@ static const struct a6xx_shader_block {SHADER (A6XX_SP_LB_3_DATA ,0x800 ),SHADER (A6XX_SP_LB_4_DATA ,0x800 ),SHADER (A6XX_SP_LB_5_DATA ,0x200 ), -SHADER (A6XX_SP_CB_BINDLESS_DATA ,0x2000 ), +SHADER (A6XX_SP_CB_BINDLESS_DATA ,0x800 ),SHADER (A6XX_SP_CB_LEGACY_DATA ,0x280 ),SHADER (A6XX_SP_UAV_DATA ,0x80 ), SHADER(A6XX_SP_INST_TAG, 0x80),
Signature · 1 line
2.40.1